Files
Apple ef3473db21 snapshot: NODE1 production state 2026-02-09
Complete snapshot of /opt/microdao-daarion/ from NODE1 (144.76.224.179).
This represents the actual running production code that has diverged
significantly from the previous main branch.

Key changes from old main:
- Gateway (http_api.py): expanded from ~40KB to 164KB with full agent support
- Router: new /v1/agents/{id}/infer endpoint with vision + DeepSeek routing
- Behavior Policy: SOWA v2.2 (3-level: FULL/ACK/SILENT)
- Agent Registry: config/agent_registry.yml as single source of truth
- 13 agents configured (was 3)
- Memory service integration
- CrewAI teams and roles

Excluded from snapshot: venv/, .env, data/, backups, .tgz archives

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-09 08:46:46 -08:00

2150 lines
59 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="canonical" href="https://IvanTytar.github.io/microdao-daarion/cursor/34_internal_services_architecture/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>34 — Internal Services Architecture (MicroDAO) - DAARION Documentation</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.66ac8b77.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#34-internal-services-architecture-microdao" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="DAARION Documentation" class="md-header__button md-logo" aria-label="DAARION Documentation" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
DAARION Documentation
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
34 — Internal Services Architecture (MicroDAO)
</span>
</div>
</div>
</div>
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="DAARION Documentation" class="md-nav__button md-logo" aria-label="DAARION Documentation" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54Z"/></svg>
</a>
DAARION Documentation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../public/" class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../public/getting-started/" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../public/architecture-overview/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../public/daiS_daos_overview/" class="md-nav__link">
<span class="md-ellipsis">
DAIS & DAOS
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-ellipsis">
Internal
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Internal
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_1" >
<label class="md-nav__link" for="__nav_5_1" id="__nav_5_1_label" tabindex="0">
<span class="md-ellipsis">
Infra
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_1">
<span class="md-nav__icon md-icon"></span>
Infra
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../internal/infra/INFRA_AUTOMATION_PACK_V1/" class="md-nav__link">
<span class="md-ellipsis">
Infra Automation Pack v1
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../internal/infra/monitoring_overview/" class="md-nav__link">
<span class="md-ellipsis">
Monitoring Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../internal/infra/nodes_registry_v0/" class="md-nav__link">
<span class="md-ellipsis">
Nodes Registry v0
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5_2" >
<label class="md-nav__link" for="__nav_5_2" id="__nav_5_2_label" tabindex="0">
<span class="md-ellipsis">
Specs
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_5_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5_2">
<span class="md-nav__icon md-icon"></span>
Specs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../internal/specs/matrix_presence_aggregator/" class="md-nav__link">
<span class="md-ellipsis">
Matrix Presence Aggregator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../internal/specs/city_map_spec/" class="md-nav__link">
<span class="md-ellipsis">
City Map Spec
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../internal/specs/node_join_protocol_draft/" class="md-nav__link">
<span class="md-ellipsis">
Node Join Protocol (Draft)
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#1-purpose-scope" class="md-nav__link">
<span class="md-ellipsis">
1. Purpose &amp; Scope
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-high-level-service-landscape" class="md-nav__link">
<span class="md-ellipsis">
2. High-Level Service Landscape
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3-core-principles" class="md-nav__link">
<span class="md-ellipsis">
3. Core Principles
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#4-internal-services-overview" class="md-nav__link">
<span class="md-ellipsis">
4. Internal Services Overview
</span>
</a>
<nav class="md-nav" aria-label="4. Internal Services Overview">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#41-user-team-service" class="md-nav__link">
<span class="md-ellipsis">
4.1 User &amp; Team Service
</span>
</a>
<nav class="md-nav" aria-label="4.1 User & Team Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
Таблиці:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api-internal" class="md-nav__link">
<span class="md-ellipsis">
API (internal):
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nats" class="md-nav__link">
<span class="md-ellipsis">
Події (NATS):
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#42-messaging-service" class="md-nav__link">
<span class="md-ellipsis">
4.2 Messaging Service
</span>
</a>
<nav class="md-nav" aria-label="4.2 Messaging Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_3" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_4" class="md-nav__link">
<span class="md-ellipsis">
Таблиці:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api" class="md-nav__link">
<span class="md-ellipsis">
API:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_5" class="md-nav__link">
<span class="md-ellipsis">
Події:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#43-projects-tasks-service" class="md-nav__link">
<span class="md-ellipsis">
4.3 Projects &amp; Tasks Service
</span>
</a>
<nav class="md-nav" aria-label="4.3 Projects & Tasks Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_6" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_7" class="md-nav__link">
<span class="md-ellipsis">
Таблиці:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_8" class="md-nav__link">
<span class="md-ellipsis">
Події:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#44-agent-orchestrator" class="md-nav__link">
<span class="md-ellipsis">
4.4 Agent Orchestrator
</span>
</a>
<nav class="md-nav" aria-label="4.4 Agent Orchestrator">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_9" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_10" class="md-nav__link">
<span class="md-ellipsis">
Таблиці:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_11" class="md-nav__link">
<span class="md-ellipsis">
Події:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api_1" class="md-nav__link">
<span class="md-ellipsis">
API:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#45-llm-proxy-service" class="md-nav__link">
<span class="md-ellipsis">
4.5 LLM Proxy Service
</span>
</a>
<nav class="md-nav" aria-label="4.5 LLM Proxy Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_12" class="md-nav__link">
<span class="md-ellipsis">
Завдання:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api_2" class="md-nav__link">
<span class="md-ellipsis">
API:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#event" class="md-nav__link">
<span class="md-ellipsis">
Event:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#46-router-planner-daarwizz" class="md-nav__link">
<span class="md-ellipsis">
4.6 Router / Planner (DAARWIZZ)
</span>
</a>
<nav class="md-nav" aria-label="4.6 Router / Planner (DAARWIZZ)">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_13" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api_3" class="md-nav__link">
<span class="md-ellipsis">
API:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#events" class="md-nav__link">
<span class="md-ellipsis">
Events:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#47-wallet-service" class="md-nav__link">
<span class="md-ellipsis">
4.7 Wallet Service
</span>
</a>
<nav class="md-nav" aria-label="4.7 Wallet Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_14" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_15" class="md-nav__link">
<span class="md-ellipsis">
Таблиці:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api_4" class="md-nav__link">
<span class="md-ellipsis">
API:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#events_1" class="md-nav__link">
<span class="md-ellipsis">
Events:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#48-rwa-inventory-service" class="md-nav__link">
<span class="md-ellipsis">
4.8 RWA Inventory Service
</span>
</a>
<nav class="md-nav" aria-label="4.8 RWA Inventory Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_16" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_17" class="md-nav__link">
<span class="md-ellipsis">
Таблиці:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#events_2" class="md-nav__link">
<span class="md-ellipsis">
Events:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#49-embassy-gateway-service" class="md-nav__link">
<span class="md-ellipsis">
4.9 Embassy Gateway Service
</span>
</a>
<nav class="md-nav" aria-label="4.9 Embassy Gateway Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_18" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_19" class="md-nav__link">
<span class="md-ellipsis">
Таблиці:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#api_5" class="md-nav__link">
<span class="md-ellipsis">
API:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#events_3" class="md-nav__link">
<span class="md-ellipsis">
Events:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#410-oracle-processor" class="md-nav__link">
<span class="md-ellipsis">
4.10 Oracle Processor
</span>
</a>
<nav class="md-nav" aria-label="4.10 Oracle Processor">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_20" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_21" class="md-nav__link">
<span class="md-ellipsis">
Таблиці:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#events_4" class="md-nav__link">
<span class="md-ellipsis">
Events:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#411-governance-service" class="md-nav__link">
<span class="md-ellipsis">
4.11 Governance Service
</span>
</a>
<nav class="md-nav" aria-label="4.11 Governance Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_22" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_23" class="md-nav__link">
<span class="md-ellipsis">
Таблиці:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#events_5" class="md-nav__link">
<span class="md-ellipsis">
Events:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#412-capability-registry-service" class="md-nav__link">
<span class="md-ellipsis">
4.12 Capability Registry Service
</span>
</a>
<nav class="md-nav" aria-label="4.12 Capability Registry Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_24" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_25" class="md-nav__link">
<span class="md-ellipsis">
Таблиці:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#413-usage-service" class="md-nav__link">
<span class="md-ellipsis">
4.13 Usage Service
</span>
</a>
<nav class="md-nav" aria-label="4.13 Usage Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_26" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_27" class="md-nav__link">
<span class="md-ellipsis">
Таблиці:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#414-outbox-worker" class="md-nav__link">
<span class="md-ellipsis">
4.14 Outbox Worker
</span>
</a>
<nav class="md-nav" aria-label="4.14 Outbox Worker">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_28" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_29" class="md-nav__link">
<span class="md-ellipsis">
Таблиця:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#415-telemetry-logs-service" class="md-nav__link">
<span class="md-ellipsis">
4.15 Telemetry / Logs Service
</span>
</a>
<nav class="md-nav" aria-label="4.15 Telemetry / Logs Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_30" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#events_6" class="md-nav__link">
<span class="md-ellipsis">
Events:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#416-auth-session-service" class="md-nav__link">
<span class="md-ellipsis">
4.16 Auth / Session Service
</span>
</a>
<nav class="md-nav" aria-label="4.16 Auth / Session Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_31" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#_32" class="md-nav__link">
<span class="md-ellipsis">
Таблиці:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#417-file-storage-docs-service" class="md-nav__link">
<span class="md-ellipsis">
4.17 File Storage / Docs Service
</span>
</a>
<nav class="md-nav" aria-label="4.17 File Storage / Docs Service">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#_33" class="md-nav__link">
<span class="md-ellipsis">
Відповідальність:
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#5-dependency-graph" class="md-nav__link">
<span class="md-ellipsis">
5. Dependency Graph
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#6-internal-api-standards" class="md-nav__link">
<span class="md-ellipsis">
6. Internal API Standards
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#7-horizontal-scaling-responsibilities" class="md-nav__link">
<span class="md-ellipsis">
7. Horizontal Scaling Responsibilities
</span>
</a>
<nav class="md-nav" aria-label="7. Horizontal Scaling Responsibilities">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#stateless-services" class="md-nav__link">
<span class="md-ellipsis">
Stateless services:
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#stateful-services" class="md-nav__link">
<span class="md-ellipsis">
Stateful services:
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#8-event-streams-nats-topics" class="md-nav__link">
<span class="md-ellipsis">
8. Event Streams (NATS Topics)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#9-outbox-pattern-mandatory" class="md-nav__link">
<span class="md-ellipsis">
9. Outbox Pattern (Mandatory)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#10-cross-service-transaction-rules" class="md-nav__link">
<span class="md-ellipsis">
10. Cross-service Transaction Rules
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#11-security-boundaries" class="md-nav__link">
<span class="md-ellipsis">
11. Security Boundaries
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#12-suggested-deployment-model" class="md-nav__link">
<span class="md-ellipsis">
12. Suggested Deployment Model
</span>
</a>
<nav class="md-nav" aria-label="12. Suggested Deployment Model">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#option-a-modular-monolith-mvp" class="md-nav__link">
<span class="md-ellipsis">
Option A — Modular Monolith (MVP)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#option-b-microservices-prod-scale" class="md-nav__link">
<span class="md-ellipsis">
Option B — Microservices (Prod-Scale)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#13-failure-isolation" class="md-nav__link">
<span class="md-ellipsis">
13. Failure Isolation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#14-minimal-monitoring-set-per-service" class="md-nav__link">
<span class="md-ellipsis">
14. Minimal Monitoring Set per Service
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#15-integration-with-other-docs" class="md-nav__link">
<span class="md-ellipsis">
15. Integration with Other Docs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#16-cursor" class="md-nav__link">
<span class="md-ellipsis">
16. Завдання для Cursor
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#17-summary" class="md-nav__link">
<span class="md-ellipsis">
17. Summary
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="34-internal-services-architecture-microdao">34 — Internal Services Architecture (MicroDAO)<a class="headerlink" href="#34-internal-services-architecture-microdao" title="Permanent link">&para;</a></h1>
<p><em>Архітектура внутрішніх сервісів, їхні ролі, API, дані, залежності, взаємодія з PDP, Gateway, NATS, DB</em></p>
<hr />
<h2 id="1-purpose-scope">1. Purpose &amp; Scope<a class="headerlink" href="#1-purpose-scope" title="Permanent link">&para;</a></h2>
<p>Цей документ описує:</p>
<ul>
<li>які внутрішні сервіси існують,</li>
<li>їхню відповідальність,</li>
<li>текучку даних,</li>
<li>API кожного сервісу,</li>
<li>які таблиці вони контролюють,</li>
<li>які події вони публікують у NATS,</li>
<li>залежності між сервісами,</li>
<li>що можна відокремити у мікросервіси, а що залишити монолітом,</li>
<li>їх роль у масштабуванні та HA.</li>
</ul>
<p>Це <strong>карта всіх backend-компонентів DAARION.city</strong>.</p>
<hr />
<h2 id="2-high-level-service-landscape">2. High-Level Service Landscape<a class="headerlink" href="#2-high-level-service-landscape" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code> ┌──────────────────────────┐
│ API Gateway (PEP) │
└───────────────┬──────────┘
┌──────────────────┴──────────────────┐
│ │
Public API Internal Service Mesh
</code></pre></div>
<p>Внутрішні сервіси:</p>
<ol>
<li><strong>User/Team Service</strong></li>
<li><strong>Messaging Service</strong></li>
<li><strong>Projects/Tasks Service</strong></li>
<li><strong>Agent Orchestrator</strong></li>
<li><strong>LLM Proxy Service</strong></li>
<li><strong>Router/Planner Service (DAARWIZZ)</strong></li>
<li><strong>Wallet Service</strong></li>
<li><strong>RWA Inventory Service</strong></li>
<li><strong>Embassy Gateway Service</strong></li>
<li><strong>Oracle Processor</strong></li>
<li><strong>Governance Service</strong></li>
<li><strong>Capability Registry Service</strong></li>
<li><strong>Quota/Usage Service</strong></li>
<li><strong>Outbox Worker</strong></li>
<li><strong>Telemetry/Logs Service</strong></li>
<li><strong>Auth/Session Service</strong></li>
<li><strong>File Storage/Docs Service</strong></li>
</ol>
<p>Усі сервіси є <strong>modular</strong>, але можуть бути реалізовані або як microservices, або як modular monolith.</p>
<hr />
<h2 id="3-core-principles">3. Core Principles<a class="headerlink" href="#3-core-principles" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>Stateless там, де можливо</strong> → просте масштабування.</li>
<li><strong>Stateful там, де потрібно (wallet, RWA)</strong> → обережні транзакції.</li>
<li><strong>Event-driven</strong> через NATS.</li>
<li><strong>PDP-централізована авторизація</strong>.</li>
<li><strong>Outbox pattern</strong> для гарантій доставки подій.</li>
<li><strong>Strong ACID</strong> тільки на критичних таблицях.</li>
<li><strong>Soft eventual-consistency</strong> на неважливих частинах.</li>
</ul>
<hr />
<h2 id="4-internal-services-overview">4. Internal Services Overview<a class="headerlink" href="#4-internal-services-overview" title="Permanent link">&para;</a></h2>
<h3 id="41-user-team-service">4.1 User &amp; Team Service<a class="headerlink" href="#41-user-team-service" title="Permanent link">&para;</a></h3>
<h4 id="_1">Відповідальність:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h4>
<ul>
<li>Users, teams, memberships.</li>
<li>Roles: Owner, Guardian, Member, Visitor.</li>
<li>Viewer types: reader/commenter/contributor.</li>
<li>Team mode: public/confidential.</li>
</ul>
<h4 id="_2">Таблиці:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h4>
<ul>
<li><code>users</code></li>
<li><code>teams</code></li>
<li><code>team_members</code></li>
</ul>
<h4 id="api-internal">API (internal):<a class="headerlink" href="#api-internal" title="Permanent link">&para;</a></h4>
<ul>
<li><code>GET /internal/team/:id</code></li>
<li><code>POST /internal/team/create</code></li>
<li><code>POST /internal/team/member/add</code></li>
<li><code>POST /internal/team/member/remove</code></li>
</ul>
<h4 id="nats">Події (NATS):<a class="headerlink" href="#nats" title="Permanent link">&para;</a></h4>
<ul>
<li><code>team.member.joined</code></li>
<li><code>team.member.left</code></li>
</ul>
<hr />
<h3 id="42-messaging-service">4.2 Messaging Service<a class="headerlink" href="#42-messaging-service" title="Permanent link">&para;</a></h3>
<h4 id="_3">Відповідальність:<a class="headerlink" href="#_3" title="Permanent link">&para;</a></h4>
<ul>
<li>Channels, messages, followups.</li>
<li>Co-memory embeddings.</li>
<li>Confidential mode enforcement (via Gateway).</li>
</ul>
<h4 id="_4">Таблиці:<a class="headerlink" href="#_4" title="Permanent link">&para;</a></h4>
<ul>
<li><code>channels</code></li>
<li><code>messages</code></li>
<li><code>followups</code></li>
<li><code>comemory_items</code></li>
</ul>
<h4 id="api">API:<a class="headerlink" href="#api" title="Permanent link">&para;</a></h4>
<ul>
<li><code>POST /internal/message/send</code></li>
<li><code>GET /internal/channel/:id/messages</code></li>
<li><code>POST /internal/comemory/index</code></li>
</ul>
<h4 id="_5">Події:<a class="headerlink" href="#_5" title="Permanent link">&para;</a></h4>
<ul>
<li><code>chat.message.created</code></li>
<li><code>comemory.item.created</code></li>
</ul>
<hr />
<h3 id="43-projects-tasks-service">4.3 Projects &amp; Tasks Service<a class="headerlink" href="#43-projects-tasks-service" title="Permanent link">&para;</a></h3>
<h4 id="_6">Відповідальність:<a class="headerlink" href="#_6" title="Permanent link">&para;</a></h4>
<ul>
<li>Projects, tasks, workflow.</li>
</ul>
<h4 id="_7">Таблиці:<a class="headerlink" href="#_7" title="Permanent link">&para;</a></h4>
<ul>
<li><code>projects</code></li>
<li><code>tasks</code></li>
</ul>
<h4 id="_8">Події:<a class="headerlink" href="#_8" title="Permanent link">&para;</a></h4>
<ul>
<li><code>project.created</code></li>
<li><code>task.created</code></li>
<li><code>task.updated</code></li>
</ul>
<hr />
<h3 id="44-agent-orchestrator">4.4 Agent Orchestrator<a class="headerlink" href="#44-agent-orchestrator" title="Permanent link">&para;</a></h3>
<h4 id="_9">Відповідальність:<a class="headerlink" href="#_9" title="Permanent link">&para;</a></h4>
<ul>
<li>запуск приватних агентів;</li>
<li>трекінг <code>agent_runs</code>;</li>
<li>sandbox execution.</li>
</ul>
<h4 id="_10">Таблиці:<a class="headerlink" href="#_10" title="Permanent link">&para;</a></h4>
<ul>
<li><code>agents</code></li>
<li><code>agent_runs</code></li>
</ul>
<h4 id="_11">Події:<a class="headerlink" href="#_11" title="Permanent link">&para;</a></h4>
<ul>
<li><code>agent.run.started</code></li>
<li><code>agent.run.completed</code></li>
</ul>
<h4 id="api_1">API:<a class="headerlink" href="#api_1" title="Permanent link">&para;</a></h4>
<ul>
<li><code>POST /internal/agent/run</code></li>
<li><code>POST /internal/agent/finish</code></li>
<li><code>GET /internal/agent/run/:id/status</code></li>
</ul>
<hr />
<h3 id="45-llm-proxy-service">4.5 LLM Proxy Service<a class="headerlink" href="#45-llm-proxy-service" title="Permanent link">&para;</a></h3>
<h4 id="_12">Завдання:<a class="headerlink" href="#_12" title="Permanent link">&para;</a></h4>
<ul>
<li>централізований доступ до LLM (OpenAI / local models).</li>
<li>облік токенів.</li>
<li>нормалізація моделей.</li>
</ul>
<h4 id="api_2">API:<a class="headerlink" href="#api_2" title="Permanent link">&para;</a></h4>
<ul>
<li><code>POST /internal/llm/chat</code></li>
<li><code>POST /internal/llm/embeddings</code></li>
</ul>
<h4 id="event">Event:<a class="headerlink" href="#event" title="Permanent link">&para;</a></h4>
<ul>
<li><code>llm.tokens.used</code></li>
</ul>
<hr />
<h3 id="46-router-planner-daarwizz">4.6 Router / Planner (DAARWIZZ)<a class="headerlink" href="#46-router-planner-daarwizz" title="Permanent link">&para;</a></h3>
<h4 id="_13">Відповідальність:<a class="headerlink" href="#_13" title="Permanent link">&para;</a></h4>
<ul>
<li>run multi-agent routing pipeline;</li>
<li>orchestration of tools;</li>
<li>intent recognition;</li>
<li>complex "flows".</li>
</ul>
<h4 id="api_3">API:<a class="headerlink" href="#api_3" title="Permanent link">&para;</a></h4>
<ul>
<li><code>POST /internal/router/route</code></li>
<li><code>POST /internal/router/plan</code></li>
</ul>
<h4 id="events">Events:<a class="headerlink" href="#events" title="Permanent link">&para;</a></h4>
<ul>
<li><code>router.invoked</code></li>
<li><code>router.completed</code></li>
</ul>
<hr />
<h3 id="47-wallet-service">4.7 Wallet Service<a class="headerlink" href="#47-wallet-service" title="Permanent link">&para;</a></h3>
<h4 id="_14">Відповідальність:<a class="headerlink" href="#_14" title="Permanent link">&para;</a></h4>
<ul>
<li>стейк RINGK;</li>
<li>генерація payout'ів;</li>
<li>claim payout;</li>
<li>зв'язок з блокчейном.</li>
</ul>
<h4 id="_15">Таблиці:<a class="headerlink" href="#_15" title="Permanent link">&para;</a></h4>
<ul>
<li><code>wallets</code></li>
<li><code>staking_ringk</code></li>
<li><code>payouts</code></li>
</ul>
<h4 id="api_4">API:<a class="headerlink" href="#api_4" title="Permanent link">&para;</a></h4>
<ul>
<li><code>POST /internal/wallet/stake</code></li>
<li><code>POST /internal/wallet/payout/claim</code></li>
<li><code>GET /internal/wallet/balance/:user</code></li>
</ul>
<h4 id="events_1">Events:<a class="headerlink" href="#events_1" title="Permanent link">&para;</a></h4>
<ul>
<li><code>staking.locked</code></li>
<li><code>payout.generated</code></li>
<li><code>payout.claimed</code></li>
</ul>
<hr />
<h3 id="48-rwa-inventory-service">4.8 RWA Inventory Service<a class="headerlink" href="#48-rwa-inventory-service" title="Permanent link">&para;</a></h3>
<h4 id="_16">Відповідальність:<a class="headerlink" href="#_16" title="Permanent link">&para;</a></h4>
<ul>
<li>облік energy/food/water/etc.</li>
<li>інтеграція з Embassy.</li>
<li>оновлення RWA стоків.</li>
</ul>
<h4 id="_17">Таблиці:<a class="headerlink" href="#_17" title="Permanent link">&para;</a></h4>
<ul>
<li><code>rwa_inventory</code></li>
</ul>
<h4 id="events_2">Events:<a class="headerlink" href="#events_2" title="Permanent link">&para;</a></h4>
<ul>
<li><code>rwa.inventory.updated</code></li>
</ul>
<hr />
<h3 id="49-embassy-gateway-service">4.9 Embassy Gateway Service<a class="headerlink" href="#49-embassy-gateway-service" title="Permanent link">&para;</a></h3>
<h4 id="_18">Відповідальність:<a class="headerlink" href="#_18" title="Permanent link">&para;</a></h4>
<ul>
<li>прийом підписаних webhook'ів від платформ (EnergyUnion, GREENFOOD).</li>
<li>HMAC перевірка.</li>
<li>PDP авторизація (embassy keys).</li>
<li>генерація подій для NATS.</li>
</ul>
<h4 id="_19">Таблиці:<a class="headerlink" href="#_19" title="Permanent link">&para;</a></h4>
<ul>
<li><code>embassy_identities</code></li>
<li><code>embassy_webhooks</code></li>
</ul>
<h4 id="api_5">API:<a class="headerlink" href="#api_5" title="Permanent link">&para;</a></h4>
<ul>
<li><code>POST /embassy/energy</code></li>
<li><code>POST /embassy/rwa</code></li>
</ul>
<h4 id="events_3">Events:<a class="headerlink" href="#events_3" title="Permanent link">&para;</a></h4>
<ul>
<li><code>embassy.event.received</code></li>
<li><code>embassy.energy.update</code></li>
<li><code>embassy.rwa.claim</code></li>
</ul>
<hr />
<h3 id="410-oracle-processor">4.10 Oracle Processor<a class="headerlink" href="#410-oracle-processor" title="Permanent link">&para;</a></h3>
<h4 id="_20">Відповідальність:<a class="headerlink" href="#_20" title="Permanent link">&para;</a></h4>
<ul>
<li>обробка потоків енергетичних даних;</li>
<li>нормалізація;</li>
<li>створення <code>oracles</code>.</li>
</ul>
<h4 id="_21">Таблиці:<a class="headerlink" href="#_21" title="Permanent link">&para;</a></h4>
<ul>
<li><code>oracles</code></li>
</ul>
<h4 id="events_4">Events:<a class="headerlink" href="#events_4" title="Permanent link">&para;</a></h4>
<ul>
<li><code>oracle.reading.published</code></li>
</ul>
<hr />
<h3 id="411-governance-service">4.11 Governance Service<a class="headerlink" href="#411-governance-service" title="Permanent link">&para;</a></h3>
<h4 id="_22">Відповідальність:<a class="headerlink" href="#_22" title="Permanent link">&para;</a></h4>
<ul>
<li>пропозиції,</li>
<li>голосування,</li>
<li>застосування політик,</li>
<li>оновлення bundles/caps/quotas.</li>
</ul>
<h4 id="_23">Таблиці:<a class="headerlink" href="#_23" title="Permanent link">&para;</a></h4>
<ul>
<li><code>governance_policies</code></li>
</ul>
<h4 id="events_5">Events:<a class="headerlink" href="#events_5" title="Permanent link">&para;</a></h4>
<ul>
<li><code>governance.policy.updated</code></li>
</ul>
<hr />
<h3 id="412-capability-registry-service">4.12 Capability Registry Service<a class="headerlink" href="#412-capability-registry-service" title="Permanent link">&para;</a></h3>
<h4 id="_24">Відповідальність:<a class="headerlink" href="#_24" title="Permanent link">&para;</a></h4>
<ul>
<li>управління:</li>
<li>capabilities,</li>
<li>bundles,</li>
<li>bundle_caps,</li>
<li>plan entitlements.</li>
</ul>
<h4 id="_25">Таблиці:<a class="headerlink" href="#_25" title="Permanent link">&para;</a></h4>
<ul>
<li><code>capabilities</code></li>
<li><code>bundles</code></li>
<li><code>bundle_caps</code></li>
<li><code>access_keys</code></li>
<li><code>access_key_caps</code></li>
</ul>
<hr />
<h3 id="413-usage-service">4.13 Usage Service<a class="headerlink" href="#413-usage-service" title="Permanent link">&para;</a></h3>
<h4 id="_26">Відповідальність:<a class="headerlink" href="#_26" title="Permanent link">&para;</a></h4>
<ul>
<li>підрахунок usage:</li>
<li>agent runs,</li>
<li>LLM tokens,</li>
<li>embassy events,</li>
<li>router invokes,</li>
<li>wallet transactions.</li>
</ul>
<h4 id="_27">Таблиці:<a class="headerlink" href="#_27" title="Permanent link">&para;</a></h4>
<p>(опціонально)</p>
<ul>
<li><code>usage_agent_runs</code></li>
<li><code>usage_llm</code></li>
<li><code>usage_storage</code></li>
<li><code>usage_router</code></li>
</ul>
<p>Або ж використовує event-driven pipeline.</p>
<hr />
<h3 id="414-outbox-worker">4.14 Outbox Worker<a class="headerlink" href="#414-outbox-worker" title="Permanent link">&para;</a></h3>
<h4 id="_28">Відповідальність:<a class="headerlink" href="#_28" title="Permanent link">&para;</a></h4>
<ul>
<li>читання <code>outbox_events</code> з БД;</li>
<li>публікація у NATS;</li>
<li>маркування <code>processed</code>.</li>
</ul>
<h4 id="_29">Таблиця:<a class="headerlink" href="#_29" title="Permanent link">&para;</a></h4>
<ul>
<li><code>outbox_events</code></li>
</ul>
<hr />
<h3 id="415-telemetry-logs-service">4.15 Telemetry / Logs Service<a class="headerlink" href="#415-telemetry-logs-service" title="Permanent link">&para;</a></h3>
<h4 id="_30">Відповідальність:<a class="headerlink" href="#_30" title="Permanent link">&para;</a></h4>
<ul>
<li>прийом логів з фронтенду,</li>
<li>прийом internal logs,</li>
<li>агрегація в аналітичні стріми.</li>
</ul>
<h4 id="events_6">Events:<a class="headerlink" href="#events_6" title="Permanent link">&para;</a></h4>
<ul>
<li><code>telemetry.client.event</code></li>
<li><code>telemetry.error</code></li>
<li><code>telemetry.screen_view</code></li>
</ul>
<hr />
<h3 id="416-auth-session-service">4.16 Auth / Session Service<a class="headerlink" href="#416-auth-session-service" title="Permanent link">&para;</a></h3>
<h4 id="_31">Відповідальність:<a class="headerlink" href="#_31" title="Permanent link">&para;</a></h4>
<ul>
<li>login,</li>
<li>OTP/Magic-link,</li>
<li>session cookies.</li>
</ul>
<h4 id="_32">Таблиці:<a class="headerlink" href="#_32" title="Permanent link">&para;</a></h4>
<ul>
<li><code>sessions</code> (опціонально)</li>
</ul>
<hr />
<h3 id="417-file-storage-docs-service">4.17 File Storage / Docs Service<a class="headerlink" href="#417-file-storage-docs-service" title="Permanent link">&para;</a></h3>
<h4 id="_33">Відповідальність:<a class="headerlink" href="#_33" title="Permanent link">&para;</a></h4>
<ul>
<li>завантаження файлів у каналах,</li>
<li>документи,</li>
<li>архіви,</li>
<li>прев'ю.</li>
</ul>
<p>Технічно:</p>
<ul>
<li>Minio/S3 + Postgres references.</li>
</ul>
<hr />
<h2 id="5-dependency-graph">5. Dependency Graph<a class="headerlink" href="#5-dependency-graph" title="Permanent link">&para;</a></h2>
<p>Умовний граф залежностей:</p>
<div class="codehilite"><pre><span></span><code>User/Team → Messaging → Projects/Tasks → Agents → Router
↓ ↓ ↓
RWA Wallet Embassy
↓ ↓ ↓
Oracle → Usage → Governance → PDP
</code></pre></div>
<p>Простіший вигляд:</p>
<div class="codehilite"><pre><span></span><code>API Gateway (PEP)
↓ PDP
Internal Services
DB + NATS
</code></pre></div>
<hr />
<h2 id="6-internal-api-standards">6. Internal API Standards<a class="headerlink" href="#6-internal-api-standards" title="Permanent link">&para;</a></h2>
<p>Всі внутрішні сервіси мають:</p>
<ul>
<li>JSON-only API,</li>
<li>версію <code>/internal/v1/...</code>,</li>
<li>заборона на виклик ззовні (тільки з Gateway),</li>
<li>сервісні ключі (internal service key),</li>
<li>PDP перевіряє <strong>internal capabilities</strong>:</li>
<li><code>service.mint.payout</code></li>
<li><code>service.write.oracles</code></li>
<li><code>service.update.capabilities</code></li>
<li><code>service.read.internal_logs</code></li>
</ul>
<hr />
<h2 id="7-horizontal-scaling-responsibilities">7. Horizontal Scaling Responsibilities<a class="headerlink" href="#7-horizontal-scaling-responsibilities" title="Permanent link">&para;</a></h2>
<h3 id="stateless-services">Stateless services:<a class="headerlink" href="#stateless-services" title="Permanent link">&para;</a></h3>
<ul>
<li>Messaging</li>
<li>Projects/Tasks</li>
<li>Embassy Gateway</li>
<li>Telemetry</li>
<li>Router/Planner (частково)</li>
<li>LLM Proxy</li>
</ul>
<h3 id="stateful-services">Stateful services:<a class="headerlink" href="#stateful-services" title="Permanent link">&para;</a></h3>
<ul>
<li>Wallet</li>
<li>RWA</li>
<li>Governance</li>
<li>Capability Registry</li>
<li>Usage Service (підрахунок)</li>
</ul>
<hr />
<h2 id="8-event-streams-nats-topics">8. Event Streams (NATS Topics)<a class="headerlink" href="#8-event-streams-nats-topics" title="Permanent link">&para;</a></h2>
<p><strong>chat.</strong>*</p>
<p><strong>project.</strong>*</p>
<p><strong>task.</strong>*</p>
<p><strong>agent.run.</strong>*</p>
<p><strong>embassy.</strong>*</p>
<p><strong>oracle.</strong>*</p>
<p><strong>rwa.inventory.</strong>*</p>
<p><strong>wallet.</strong>*</p>
<p><strong>governance.</strong>*</p>
<p><strong>usage.</strong>*</p>
<p><strong>telemetry.</strong>*</p>
<hr />
<h2 id="9-outbox-pattern-mandatory">9. Outbox Pattern (Mandatory)<a class="headerlink" href="#9-outbox-pattern-mandatory" title="Permanent link">&para;</a></h2>
<p>Всі сервіси, що створюють події:</p>
<ul>
<li>пишуть у <code>outbox_events (processed=false)</code>,</li>
<li>Outbox Worker публікує у NATS,</li>
<li>записує <code>processed=true</code>.</li>
</ul>
<p>Це гарантує <strong>at-least-once delivery</strong>.</p>
<hr />
<h2 id="10-cross-service-transaction-rules">10. Cross-service Transaction Rules<a class="headerlink" href="#10-cross-service-transaction-rules" title="Permanent link">&para;</a></h2>
<p>Дозволені:</p>
<ul>
<li>DB transaction → outbox insert → commit</li>
<li>Outbox Worker → publish event</li>
</ul>
<p>Заборонені:</p>
<ul>
<li>DB transaction → direct NATS publish → commit</li>
<li>Cross-service DB транзакції</li>
</ul>
<hr />
<h2 id="11-security-boundaries">11. Security Boundaries<a class="headerlink" href="#11-security-boundaries" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Service</th>
<th>Sensitive?</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Wallet</td>
<td>HIGH</td>
<td>Chain operations, payouts</td>
</tr>
<tr>
<td>Embassy</td>
<td>HIGH</td>
<td>RWA, energy events</td>
</tr>
<tr>
<td>Capability Registry</td>
<td>HIGH</td>
<td>controls all access</td>
</tr>
<tr>
<td>Governance</td>
<td>HIGH</td>
<td>updates policies</td>
</tr>
<tr>
<td>Usage</td>
<td>MEDIUM</td>
<td>affects quotas</td>
</tr>
<tr>
<td>Agents</td>
<td>MEDIUM</td>
<td>potential abuse</td>
</tr>
<tr>
<td>Messaging</td>
<td>MEDIUM</td>
<td>privacy</td>
</tr>
<tr>
<td>Router</td>
<td>HIGH</td>
<td>tool access</td>
</tr>
<tr>
<td>LLM Proxy</td>
<td>HIGH</td>
<td>cost centre</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="12-suggested-deployment-model">12. Suggested Deployment Model<a class="headerlink" href="#12-suggested-deployment-model" title="Permanent link">&para;</a></h2>
<h3 id="option-a-modular-monolith-mvp">Option A — Modular Monolith (MVP)<a class="headerlink" href="#option-a-modular-monolith-mvp" title="Permanent link">&para;</a></h3>
<p>Окремі модулі всередині одного репозиторію.</p>
<p>Переваги:</p>
<ul>
<li>мінімальні затрати,</li>
<li>простий деплой,</li>
<li>контроль consistency.</li>
</ul>
<h3 id="option-b-microservices-prod-scale">Option B — Microservices (Prod-Scale)<a class="headerlink" href="#option-b-microservices-prod-scale" title="Permanent link">&para;</a></h3>
<p>Розділяються:</p>
<ul>
<li>Wallet,</li>
<li>Embassy,</li>
<li>Router,</li>
<li>LLM Proxy,</li>
<li>Agent Orchestrator,</li>
<li>Messaging,</li>
<li>Projects,</li>
<li>Governance,</li>
<li>Capability Registry,</li>
<li>Usage.</li>
</ul>
<hr />
<h2 id="13-failure-isolation">13. Failure Isolation<a class="headerlink" href="#13-failure-isolation" title="Permanent link">&para;</a></h2>
<p>Сервіс повинен не ламати інших.</p>
<p>Наприклад:</p>
<ul>
<li>Wallet падає → Messaging працює далі.</li>
<li>Embassy перевантажений → Agent Runs працюють.</li>
<li>Router overloaded → Wallet стабільний.</li>
</ul>
<p>Це досягається:</p>
<ul>
<li>NATS,</li>
<li>independent autoscaling,</li>
<li>clear API boundaries.</li>
</ul>
<hr />
<h2 id="14-minimal-monitoring-set-per-service">14. Minimal Monitoring Set per Service<a class="headerlink" href="#14-minimal-monitoring-set-per-service" title="Permanent link">&para;</a></h2>
<p>Для кожного:</p>
<ul>
<li>CPU/Memory</li>
<li>Requests/sec</li>
<li>Error rate</li>
<li>Latency</li>
<li>DB queries</li>
<li>NATS event lag</li>
<li>Circuit breaker status</li>
<li>Quota usage</li>
</ul>
<hr />
<h2 id="15-integration-with-other-docs">15. Integration with Other Docs<a class="headerlink" href="#15-integration-with-other-docs" title="Permanent link">&para;</a></h2>
<p>Цей документ доповнює:</p>
<ul>
<li><code>33_api_gateway_security_and_pep.md</code></li>
<li><code>32_policy_service_PDP_design.md</code></li>
<li><code>29_scaling_and_high_availability.md</code></li>
<li><code>28_flows_wallet_embassy_energy_union.md</code></li>
<li><code>27_database_schema_migrations.md</code></li>
</ul>
<hr />
<h2 id="16-cursor">16. Завдання для Cursor<a class="headerlink" href="#16-cursor" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code>You are a senior backend architect. Design internal services architecture using:
- 34_internal_services_architecture.md
- 33_api_gateway_security_and_pep.md
- 32_policy_service_PDP_design.md
Tasks:
1) Create service interfaces for all 17 services.
2) Define internal API contracts.
3) Implement Outbox Worker for event publishing.
4) Set up NATS event streams for all services.
5) Create service discovery mechanism (if microservices).
6) Implement cross-service communication patterns.
7) Add monitoring and observability for each service.
Output:
- list of modified files
- diff
- summary
</code></pre></div>
<hr />
<h2 id="17-summary">17. Summary<a class="headerlink" href="#17-summary" title="Permanent link">&para;</a></h2>
<p>Цей документ задає основу:</p>
<ul>
<li>хто за що відповідає,</li>
<li>які дані де живуть,</li>
<li>які події кожен сервіс генерує,</li>
<li>як сервіси взаємодіють,</li>
<li>де потрібна строгість ACID,</li>
<li>як працює event-driven архітектура,</li>
<li>де є stateful точки опори.</li>
</ul>
<p>Це ключова частина всієї backend-карти міста.</p>
<hr />
<p><strong>Версія:</strong> 1.0<br />
<strong>Останнє оновлення:</strong> 2024-11-14</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["navigation.sections", "navigation.instant", "content.code.copy"], "search": "../../assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../../assets/javascripts/bundle.3220b9d7.min.js"></script>
</body>
</html>