🔧 Fix GitHub Actions docs workflow

- Update mkdocs dependencies to latest versions
- Add permissions for GitHub Pages deployment
- Add workflow_dispatch for manual trigger
- Fix build command with fallback
This commit is contained in:
Apple
2026-01-10 07:57:36 -08:00
parent 90758facae
commit fb4f4a16d5
168 changed files with 124284 additions and 8954 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,945 @@
<!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/debug/matrix_gateway_integration_report_20251130/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>Matrix Gateway Integration — Звіт про виконання - 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="#matrix-gateway-integration" 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">
Matrix Gateway Integration — Звіт про виконання
</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" class="md-nav__link">
<span class="md-ellipsis">
1. Мета
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2" class="md-nav__link">
<span class="md-ellipsis">
2. Виконані роботи
</span>
</a>
<nav class="md-nav" aria-label="2. Виконані роботи">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#21-matrix-gateway-endpoints" class="md-nav__link">
<span class="md-ellipsis">
2.1. Matrix Gateway — Нові endpoints ✅
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#22-city-service-matrix-client" class="md-nav__link">
<span class="md-ellipsis">
2.2. City Service — Matrix Client ✅
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#23-city-service-room-sync" class="md-nav__link">
<span class="md-ellipsis">
2.3. City Service — Room Sync ✅
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#24-auto-create-matrix-rooms" class="md-nav__link">
<span class="md-ellipsis">
2.4. Auto-create Matrix Rooms ✅
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#3" class="md-nav__link">
<span class="md-ellipsis">
3. Результати синхронізації
</span>
</a>
<nav class="md-nav" aria-label="3. Результати синхронізації">
<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="#rate-limiting" class="md-nav__link">
<span class="md-ellipsis">
Не синхронізовані (rate limiting):
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#4" class="md-nav__link">
<span class="md-ellipsis">
4. Проблеми
</span>
</a>
<nav class="md-nav" aria-label="4. Проблеми">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#41-matrix-rate-limiting" class="md-nav__link">
<span class="md-ellipsis">
4.1. Matrix Rate Limiting
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#42-agent-chat-rooms" class="md-nav__link">
<span class="md-ellipsis">
4.2. Agent Chat Rooms
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#5-daarionspace" class="md-nav__link">
<span class="md-ellipsis">
5. Перевірка на DAARION.space
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#6" class="md-nav__link">
<span class="md-ellipsis">
6. Наступні кроки
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#7-sql-queries" class="md-nav__link">
<span class="md-ellipsis">
7. SQL Queries для перевірки
</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="matrix-gateway-integration">Matrix Gateway Integration — Звіт про виконання<a class="headerlink" href="#matrix-gateway-integration" title="Permanent link">&para;</a></h1>
<p><strong>Дата:</strong> 2025-11-30
<strong>Статус:</strong> ЧАСТКОВО ВИКОНАНО (rate limiting)</p>
<h2 id="1">1. Мета<a class="headerlink" href="#1" title="Permanent link">&para;</a></h2>
<p>Інтегрувати Matrix Gateway з City Service для створення реальних Matrix кімнат.</p>
<h2 id="2">2. Виконані роботи<a class="headerlink" href="#2" title="Permanent link">&para;</a></h2>
<h3 id="21-matrix-gateway-endpoints">2.1. Matrix Gateway — Нові endpoints ✅<a class="headerlink" href="#21-matrix-gateway-endpoints" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code><span class="nv">POST</span><span class="w"> </span><span class="o">/</span><span class="nv">internal</span><span class="o">/</span><span class="nv">matrix</span><span class="o">/</span><span class="nv">room</span><span class="o">/</span><span class="nv">join</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nv">Join</span><span class="w"> </span><span class="nv">user</span><span class="w"> </span><span class="nv">to</span><span class="w"> </span><span class="nv">room</span>
<span class="nv">POST</span><span class="w"> </span><span class="o">/</span><span class="nv">internal</span><span class="o">/</span><span class="nv">matrix</span><span class="o">/</span><span class="nv">message</span><span class="o">/</span><span class="k">send</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="k">Send</span><span class="w"> </span><span class="nv">message</span><span class="w"> </span><span class="nv">to</span><span class="w"> </span><span class="nv">room</span>
<span class="nv">GET</span><span class="w"> </span><span class="o">/</span><span class="nv">internal</span><span class="o">/</span><span class="nv">matrix</span><span class="o">/</span><span class="nv">rooms</span><span class="o">/</span>{<span class="nv">id</span>}<span class="o">/</span><span class="nv">messages</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nv">Get</span><span class="w"> </span><span class="nv">room</span><span class="w"> </span><span class="nv">messages</span>
</code></pre></div>
<h3 id="22-city-service-matrix-client">2.2. City Service — Matrix Client ✅<a class="headerlink" href="#22-city-service-matrix-client" title="Permanent link">&para;</a></h3>
<p>Нові функції в <code>matrix_client.py</code>:
- <code>join_user_to_room(room_id, user_id)</code>
- <code>send_message_to_room(room_id, body, sender)</code>
- <code>get_room_messages(room_id, limit)</code>
- <code>ensure_room_has_matrix(room_slug, room_name, visibility)</code></p>
<h3 id="23-city-service-room-sync">2.3. City Service — Room Sync ✅<a class="headerlink" href="#23-city-service-room-sync" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code>POST /city/rooms/sync/matrix - Bulk sync rooms with Matrix
</code></pre></div>
<h3 id="24-auto-create-matrix-rooms">2.4. Auto-create Matrix Rooms ✅<a class="headerlink" href="#24-auto-create-matrix-rooms" title="Permanent link">&para;</a></h3>
<p>Оновлені endpoints автоматично створюють Matrix кімнати:
- <code>GET /api/v1/agents/{id}/chat-room</code>
- <code>GET /api/v1/nodes/{id}/chat-room</code>
- <code>GET /api/v1/microdaos/{slug}/chat-room</code></p>
<h2 id="3">3. Результати синхронізації<a class="headerlink" href="#3" title="Permanent link">&para;</a></h2>
<h3 id="_1">Перший запуск:<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h3>
<ul>
<li><strong>Total rooms:</strong> 25</li>
<li><strong>Synced:</strong> 9 (з Matrix room_id)</li>
<li><strong>Failed:</strong> 16 (rate limiting)</li>
</ul>
<h3 id="_2">Успішно синхронізовані:<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3>
<table>
<thead>
<tr>
<th>Room Slug</th>
<th>Matrix Room ID</th>
</tr>
</thead>
<tbody>
<tr>
<td>energy</td>
<td>!gykdLyazhkcSZGHmbG:daarion.space</td>
</tr>
<tr>
<td>science</td>
<td>!enYcpGlcPfCuWEIwjv:daarion.space</td>
</tr>
<tr>
<td>builders</td>
<td>!VdxezYlgrmNTFVkNUk:daarion.space</td>
</tr>
<tr>
<td>general</td>
<td>!anDoaSvRxICMHLkeqg:daarion.space</td>
</tr>
<tr>
<td>welcome</td>
<td>!YbacjkzhdDjaOXgxTy:daarion.space</td>
</tr>
<tr>
<td>web3-district</td>
<td>!EBOtJRwWKYgdYzcZla:daarion.space</td>
</tr>
<tr>
<td>leadership-hall</td>
<td>!zFinGbbbMykYULmIOv:daarion.space</td>
</tr>
<tr>
<td>vision-studio</td>
<td>!HzNtIvobAgaoDBpPpD:daarion.space</td>
</tr>
<tr>
<td>rnd-lab</td>
<td>!exvkRpdsvZlWjaUfmV:daarion.space</td>
</tr>
</tbody>
</table>
<h3 id="rate-limiting">Не синхронізовані (rate limiting):<a class="headerlink" href="#rate-limiting" title="Permanent link">&para;</a></h3>
<ul>
<li>economics-square</li>
<li>announcements</li>
<li>science-lab</li>
<li>security-bureau</li>
<li>daarion-news, daarion-builders, daarion-help, daarion-governance</li>
<li>node-support-node1, node-support-node2</li>
<li>memory-vault, security-bunker, system-control, engineering-lab, marketing-hub, finance-office</li>
</ul>
<h2 id="4">4. Проблеми<a class="headerlink" href="#4" title="Permanent link">&para;</a></h2>
<h3 id="41-matrix-rate-limiting">4.1. Matrix Rate Limiting<a class="headerlink" href="#41-matrix-rate-limiting" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code>{&quot;errcode&quot;:&quot;M_LIMIT_EXCEEDED&quot;,&quot;error&quot;:&quot;Too Many Requests&quot;,&quot;retry_after_ms&quot;:55397}
</code></pre></div>
<p><strong>Причина:</strong> Synapse має rate limiting для створення кімнат.</p>
<p><strong>Рішення:</strong>
1. Почекати <code>retry_after_ms</code> і повторити
2. Налаштувати Synapse <code>rc_message</code> та <code>rc_admin</code> в <code>homeserver.yaml</code>
3. Додати затримку між створенням кімнат в sync endpoint</p>
<h3 id="42-agent-chat-rooms">4.2. Agent Chat Rooms<a class="headerlink" href="#42-agent-chat-rooms" title="Permanent link">&para;</a></h3>
<p>Agent console rooms (<code>agent-console-*</code>) не мають Matrix ID через rate limiting.</p>
<p><strong>Рішення:</strong> Повторити sync пізніше або створити вручну.</p>
<h2 id="5-daarionspace">5. Перевірка на DAARION.space<a class="headerlink" href="#5-daarionspace" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Endpoint</th>
<th>Статус</th>
<th>Примітки</th>
</tr>
</thead>
<tbody>
<tr>
<td>Matrix Gateway <code>/healthz</code></td>
<td></td>
<td><code>{"status":"ok","synapse":"connected"}</code></td>
</tr>
<tr>
<td><code>/city/rooms/sync/matrix</code></td>
<td></td>
<td>Працює, але rate limited</td>
</tr>
<tr>
<td><code>/api/v1/agents/{id}/chat-room</code></td>
<td>⚠️</td>
<td>Створює DB room, Matrix pending</td>
</tr>
<tr>
<td><code>/api/v1/nodes/{id}/chat-room</code></td>
<td>⚠️</td>
<td>Створює DB room, Matrix pending</td>
</tr>
<tr>
<td><code>/api/v1/microdaos/{slug}/chat-room</code></td>
<td>⚠️</td>
<td>Створює DB room, Matrix pending</td>
</tr>
</tbody>
</table>
<h2 id="6">6. Наступні кроки<a class="headerlink" href="#6" title="Permanent link">&para;</a></h2>
<ol>
<li><strong>Налаштувати Synapse rate limiting</strong> — збільшити ліміти для admin user</li>
<li><strong>Повторити sync</strong> — через 5-10 хвилин</li>
<li><strong>Додати retry logic</strong> — в sync endpoint</li>
<li><strong>Перевірити chat widget</strong> — після створення Matrix rooms</li>
</ol>
<h2 id="7-sql-queries">7. SQL Queries для перевірки<a class="headerlink" href="#7-sql-queries" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code><span class="c1">-- Rooms з Matrix ID</span>
<span class="k">SELECT</span><span class="w"> </span><span class="n">slug</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">matrix_room_id</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">city_rooms</span><span class="w"> </span>
<span class="k">WHERE</span><span class="w"> </span><span class="n">matrix_room_id</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">;</span>
<span class="c1">-- Rooms без Matrix ID</span>
<span class="k">SELECT</span><span class="w"> </span><span class="n">slug</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">city_rooms</span><span class="w"> </span>
<span class="k">WHERE</span><span class="w"> </span><span class="n">matrix_room_id</span><span class="w"> </span><span class="k">IS</span><span class="w"> </span><span class="k">NULL</span><span class="p">;</span>
</code></pre></div>
<hr />
<p><strong>Автор:</strong> Cursor AI
<strong>Таск:</strong> <code>TASK_PHASE_MATRIX_GATEWAY_INTEGRATION_v1.md</code></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>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,946 @@
<!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/debug/mvp_dagi_integration_fix_report_20251201/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>MVP DAGI Integration Fix Report — 2025-12-01 - 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="#mvp-dagi-integration-fix-report-2025-12-01" 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">
MVP DAGI Integration Fix Report — 2025-12-01
</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="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#a-agents-layer" class="md-nav__link">
<span class="md-ellipsis">
A) Agents Layer
</span>
</a>
<nav class="md-nav" aria-label="A) Agents Layer">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#a1-gov-level-ui" class="md-nav__link">
<span class="md-ellipsis">
✅ A1. Gov-level у UI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#a2-dais-id-ui" class="md-nav__link">
<span class="md-ellipsis">
✅ A2. DAIS ID у UI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#a3-microdao-membership" class="md-nav__link">
<span class="md-ellipsis">
✅ A3. MicroDAO membership
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#b-microdao-layer" class="md-nav__link">
<span class="md-ellipsis">
B) MicroDAO Layer
</span>
</a>
<nav class="md-nav" aria-label="B) MicroDAO Layer">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#b1-microdao-dashboard" class="md-nav__link">
<span class="md-ellipsis">
✅ B1. MicroDAO Dashboard
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#b2-district-level-badge" class="md-nav__link">
<span class="md-ellipsis">
✅ B2. District-level badge
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#c-nodes-layer" class="md-nav__link">
<span class="md-ellipsis">
C) Nodes Layer
</span>
</a>
<nav class="md-nav" aria-label="C) Nodes Layer">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#c1-node-dashboard" class="md-nav__link">
<span class="md-ellipsis">
✅ C1. Node Dashboard
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#c2-nodes" class="md-nav__link">
<span class="md-ellipsis">
✅ C2. Міграція nodes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#c3-node1node2-nodes" class="md-nav__link">
<span class="md-ellipsis">
✅ C3. NODE1/NODE2 у nodes
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#d-backend-fixes" class="md-nav__link">
<span class="md-ellipsis">
D) Backend Fixes
</span>
</a>
<nav class="md-nav" aria-label="D) Backend Fixes">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#d1-apiagents-dais-home_node-owner_microdao" class="md-nav__link">
<span class="md-ellipsis">
✅ D1. /api/agents/* (DAIS, home_node, owner_microdao)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#d2-apimicrodaoidrooms" class="md-nav__link">
<span class="md-ellipsis">
✅ D2. /api/microdao/:id/rooms
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#d3-apinodesiddashboard" class="md-nav__link">
<span class="md-ellipsis">
✅ D3. /api/nodes/:id/dashboard
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
<span class="md-ellipsis">
Змінені файли
</span>
</a>
<nav class="md-nav" aria-label="Змінені файли">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#backend-city-service" class="md-nav__link">
<span class="md-ellipsis">
Backend (city-service)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#frontend-appsweb" class="md-nav__link">
<span class="md-ellipsis">
Frontend (apps/web)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_2" class="md-nav__link">
<span class="md-ellipsis">
Наступні кроки (рекомендації)
</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="mvp-dagi-integration-fix-report-2025-12-01">MVP DAGI Integration Fix Report — 2025-12-01<a class="headerlink" href="#mvp-dagi-integration-fix-report-2025-12-01" title="Permanent link">&para;</a></h1>
<h2 id="summary">Summary<a class="headerlink" href="#summary" title="Permanent link">&para;</a></h2>
<p>Виконано всі 11 пунктів з <code>TASK_PHASE_MVP_DAGI_INTEGRATION_FIX_20251201.md</code>.
Ланцюг <strong>"документи → код → деплой → UI"</strong> тепер замкнутий для agents, microDAO та nodes.</p>
<hr />
<h2 id="a-agents-layer">A) Agents Layer<a class="headerlink" href="#a-agents-layer" title="Permanent link">&para;</a></h2>
<h3 id="a1-gov-level-ui">✅ A1. Gov-level у UI<a class="headerlink" href="#a1-gov-level-ui" title="Permanent link">&para;</a></h3>
<ul>
<li><strong>Backend</strong>: Додано <code>gov_level</code> до SQL-запиту в <code>repo_city.py</code> (line ~389)</li>
<li><strong>Models</strong>: Додано <code>gov_level: Optional[str]</code> до <code>AgentSummary</code> в <code>models_city.py</code></li>
<li><strong>Routes</strong>: Передається в API відповідь в <code>routes_city.py</code></li>
<li><strong>Frontend Types</strong>: Додано <code>gov_level</code> до <code>AgentSummary</code> в <code>apps/web/src/lib/types/agents.ts</code></li>
<li><strong>Frontend UI</strong>: </li>
<li><code>/agents</code> — показує gov-level badge з іконкою Shield</li>
<li><code>/agents/[agentId]</code> — показує gov-level у AgentSummaryCard</li>
<li><strong>Helper</strong>: Створено <code>getGovLevelBadge()</code> та <code>GOV_LEVEL_CONFIG</code> для відображення рівнів</li>
</ul>
<h3 id="a2-dais-id-ui">✅ A2. DAIS ID у UI<a class="headerlink" href="#a2-dais-id-ui" title="Permanent link">&para;</a></h3>
<ul>
<li><strong>Backend</strong>: Додано <code>dais_identity_id</code> до SQL-запиту</li>
<li><strong>Models</strong>: Додано <code>dais_identity_id: Optional[str]</code> до <code>AgentSummary</code></li>
<li><strong>Frontend Types</strong>: Додано <code>dais_identity_id</code> до <code>AgentSummary</code></li>
<li><strong>Frontend UI</strong>: Показується в AgentSummaryCard з іконкою Fingerprint</li>
</ul>
<h3 id="a3-microdao-membership">✅ A3. MicroDAO membership<a class="headerlink" href="#a3-microdao-membership" title="Permanent link">&para;</a></h3>
<ul>
<li><strong>Backend</strong>: Додано <code>home_microdao_id</code>, <code>home_microdao_name</code>, <code>home_microdao_slug</code> до SQL</li>
<li><strong>Models</strong>: Додано відповідні поля до <code>AgentSummary</code></li>
<li><strong>Frontend</strong>: </li>
<li>AgentSummaryCard показує "Belongs to: <microDAO>" з посиланням</li>
<li>AgentMicrodaoMembershipCard вже існував і працює</li>
</ul>
<hr />
<h2 id="b-microdao-layer">B) MicroDAO Layer<a class="headerlink" href="#b-microdao-layer" title="Permanent link">&para;</a></h2>
<h3 id="b1-microdao-dashboard">✅ B1. MicroDAO Dashboard<a class="headerlink" href="#b1-microdao-dashboard" title="Permanent link">&para;</a></h3>
<p>Вже реалізовано в <code>/microdao/[slug]/page.tsx</code>:
- Список агентів з ролями та core-бейджами
- Список кімнат (MicrodaoRoomsSection)
- Список громадян (public_citizens)
- Child microDAOs</p>
<h3 id="b2-district-level-badge">✅ B2. District-level badge<a class="headerlink" href="#b2-district-level-badge" title="Permanent link">&para;</a></h3>
<p>Вже реалізовано:
- <code>is_platform</code> показується як "Platform District"
- <code>district</code> показується як окремий бейдж</p>
<hr />
<h2 id="c-nodes-layer">C) Nodes Layer<a class="headerlink" href="#c-nodes-layer" title="Permanent link">&para;</a></h2>
<h3 id="c1-node-dashboard">✅ C1. Node Dashboard<a class="headerlink" href="#c1-node-dashboard" title="Permanent link">&para;</a></h3>
<p>Вже реалізовано в <code>/nodes/[nodeId]/page.tsx</code>:
- Metrics Layer (через dashboard API)
- Ownership Layer (через NodeGuardianCard)
- Models Layer (через AIServicesCard)
- Orchestration Layer (через AgentsCard)</p>
<h3 id="c2-nodes">✅ C2. Міграція nodes<a class="headerlink" href="#c2-nodes" title="Permanent link">&para;</a></h3>
<p>Додано в <code>migrations.py</code>:</p>
<div class="codehilite"><pre><span></span><code><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="k">IF</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">EXISTS</span><span class="w"> </span><span class="n">nodes</span><span class="w"> </span><span class="p">(</span>
<span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="nb">TEXT</span><span class="w"> </span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="p">,</span>
<span class="w"> </span><span class="n">display_name</span><span class="w"> </span><span class="nb">TEXT</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span>
<span class="w"> </span><span class="n">hostname</span><span class="w"> </span><span class="nb">TEXT</span><span class="p">,</span>
<span class="w"> </span><span class="n">owner_microdao_id</span><span class="w"> </span><span class="nb">TEXT</span><span class="w"> </span><span class="k">REFERENCES</span><span class="w"> </span><span class="n">microdaos</span><span class="p">(</span><span class="n">id</span><span class="p">),</span>
<span class="w"> </span><span class="n">node_type</span><span class="w"> </span><span class="nb">TEXT</span><span class="p">,</span>
<span class="w"> </span><span class="n">environment</span><span class="w"> </span><span class="nb">TEXT</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="s1">&#39;unknown&#39;</span><span class="p">,</span>
<span class="w"> </span><span class="n">cpu_cores</span><span class="w"> </span><span class="nb">INTEGER</span><span class="p">,</span>
<span class="w"> </span><span class="n">ram_gb</span><span class="w"> </span><span class="nb">INTEGER</span><span class="p">,</span>
<span class="w"> </span><span class="n">gpu_count</span><span class="w"> </span><span class="nb">INTEGER</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span>
<span class="w"> </span><span class="n">disk_gb</span><span class="w"> </span><span class="nb">INTEGER</span><span class="p">,</span>
<span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="nb">TEXT</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="s1">&#39;unknown&#39;</span><span class="p">,</span>
<span class="w"> </span><span class="n">guardian_agent_id</span><span class="w"> </span><span class="nb">TEXT</span><span class="p">,</span>
<span class="w"> </span><span class="n">steward_agent_id</span><span class="w"> </span><span class="nb">TEXT</span><span class="p">,</span>
<span class="w"> </span><span class="n">created_at</span><span class="w"> </span><span class="n">TIMESTAMPTZ</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="n">NOW</span><span class="p">(),</span>
<span class="w"> </span><span class="n">updated_at</span><span class="w"> </span><span class="n">TIMESTAMPTZ</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="n">NOW</span><span class="p">()</span>
<span class="p">);</span>
</code></pre></div>
<h3 id="c3-node1node2-nodes">✅ C3. NODE1/NODE2 у nodes<a class="headerlink" href="#c3-node1node2-nodes" title="Permanent link">&para;</a></h3>
<p>Додано INSERT з ON CONFLICT DO UPDATE:
- <code>node-1-hetzner-gex44</code><code>dao_daarion</code>, production
- <code>node-2-macbook-m4max</code><code>dao_daarion</code>, development</p>
<hr />
<h2 id="d-backend-fixes">D) Backend Fixes<a class="headerlink" href="#d-backend-fixes" title="Permanent link">&para;</a></h2>
<h3 id="d1-apiagents-dais-home_node-owner_microdao">✅ D1. /api/agents/* (DAIS, home_node, owner_microdao)<a class="headerlink" href="#d1-apiagents-dais-home_node-owner_microdao" title="Permanent link">&para;</a></h3>
<p>Виправлено в <code>routes_city.py</code> та <code>repo_city.py</code>:
- Додано <code>gov_level</code>, <code>dais_identity_id</code>
- Додано <code>home_microdao_id</code>, <code>home_microdao_name</code>, <code>home_microdao_slug</code></p>
<h3 id="d2-apimicrodaoidrooms">✅ D2. /api/microdao/:id/rooms<a class="headerlink" href="#d2-apimicrodaoidrooms" title="Permanent link">&para;</a></h3>
<p>Вже існує: <code>GET /city/microdao/{slug}/rooms</code></p>
<h3 id="d3-apinodesiddashboard">✅ D3. /api/nodes/:id/dashboard<a class="headerlink" href="#d3-apinodesiddashboard" title="Permanent link">&para;</a></h3>
<p>Вже існує: <code>GET /api/v1/nodes/{node_id}/dashboard</code></p>
<hr />
<h2 id="_1">Змінені файли<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2>
<h3 id="backend-city-service">Backend (city-service)<a class="headerlink" href="#backend-city-service" title="Permanent link">&para;</a></h3>
<ul>
<li><code>repo_city.py</code> — додано gov_level, dais_identity_id, home_microdao до SQL</li>
<li><code>models_city.py</code> — розширено AgentSummary</li>
<li><code>routes_city.py</code> — передача нових полів в API</li>
<li><code>migrations.py</code> — створення таблиці nodes, INSERT NODE1/NODE2</li>
</ul>
<h3 id="frontend-appsweb">Frontend (apps/web)<a class="headerlink" href="#frontend-appsweb" title="Permanent link">&para;</a></h3>
<ul>
<li><code>src/lib/types/agents.ts</code> — додано gov_level, dais_identity_id, home_microdao, хелпери</li>
<li><code>src/lib/agent-dashboard.ts</code> — розширено AgentProfile</li>
<li><code>src/app/agents/page.tsx</code> — gov-level badge у списку</li>
<li><code>src/components/agent-dashboard/AgentSummaryCard.tsx</code> — gov-level, DAIS ID, home microDAO</li>
</ul>
<hr />
<h2 id="_2">Наступні кроки (рекомендації)<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h2>
<ol>
<li><strong>Деплой</strong>: Перезапустити <code>daarion-city-service</code> на NODE1 для застосування міграцій</li>
<li><strong>Тестування</strong>: Перевірити UI на https://daarion.space/agents та /nodes</li>
<li><strong>Розширення</strong>: Додати DAIS emails/wallets до API (поки тільки dais_identity_id)</li>
<li><strong>Metrics</strong>: Підключити реальні метрики до Node Dashboard (Prometheus/NATS)</li>
</ol>
<hr />
<p><strong>Status: COMPLETED</strong>
<strong>Date: 2025-12-01</strong></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>

View File

@@ -0,0 +1,696 @@
<!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/debug/mvp_dagi_integration_report_20251130/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>MVP DAGI Integration Report — 2025-11-30 - 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="#mvp-dagi-integration-report-2025-11-30" 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">
MVP DAGI Integration Report — 2025-11-30
</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="#agents" class="md-nav__link">
<span class="md-ellipsis">
Agents
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#microdao" class="md-nav__link">
<span class="md-ellipsis">
MicroDAO
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nodes" class="md-nav__link">
<span class="md-ellipsis">
Nodes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
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="mvp-dagi-integration-report-2025-11-30">MVP DAGI Integration Report — 2025-11-30<a class="headerlink" href="#mvp-dagi-integration-report-2025-11-30" title="Permanent link">&para;</a></h1>
<h2 id="agents">Agents<a class="headerlink" href="#agents" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>Документи</strong>: <code>DAARION_Ontology_Core_v1</code>, <code>Agent_Governance_Protocol_v1</code>, <code>DAARION_Identity_And_Access_Draft_v1</code>.</li>
<li><strong>Бекенд / DAGI</strong>: <code>services/city-service</code> (<code>/city/agents/*</code>, <code>/api/v1/agents/*</code>). Дані з таблиць <code>agents</code>, <code>microdao_members</code>, <code>dais_*</code>. Взаємодія з DAGI через gov-level, DAIS identity, node bindings.</li>
<li><strong>Фронтенд</strong>: сторінки <code>/agents</code> та <code>/agents/[agentId]</code>, API-виклики через <code>/api/agents/*</code> -&gt; rewrites -&gt; city-service.</li>
<li><strong>Знахідки</strong>:</li>
<li>Gov-level, DAIS identity, microDAO membership присутні на бекенді та частково в UI (gov-level є у даних, але не всюди відображений). </li>
<li>Node binding (НОДА1/НОДА2) показується в AgentCard.</li>
<li>TODO: додати явне відображення DAIS identity та gov-level у UI, а також поля home_microdao_id (частина агентів core_team ще без нього). </li>
</ul>
<h2 id="microdao">MicroDAO<a class="headerlink" href="#microdao" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>Документи</strong>: <code>Technical_Description_microdao_PATCH_Ontology</code>, <code>microdao_Data_Model_UPDATE_v1</code>, <code>microdao_Event_Catalog_EXTENDED_v1</code>, <code>MicroDAO_Interface_Architecture_v1</code>.</li>
<li><strong>Бекенд / DAGI</strong>: ендпоїнти <code>/city/microdao/*</code>, <code>/api/v1/microdao/*</code>. Дані в <code>microdaos</code>, <code>microdao_agents</code>, <code>microdao_channels</code>. Події в <code>event_outbox</code> підготовлені, але не всі використовуються в UI.</li>
<li><strong>Фронтенд</strong>: <code>/microdao</code> і <code>/governance</code> (Next.js) — показують список microDAO, базові деталі оркестратора, але не всі канали/кімнати.</li>
<li><strong>Знахідки</strong>:</li>
<li>У БД є 9 активних microDAO (DAARION, Clan, Druid, Eonarch, ENERGYUNION, GREENFOOD, Nutra, SOUL, Yaromir).</li>
<li>UI відображає базові поля, але ще немає повного Interface Architecture (канали, citizens).</li>
<li>TODO: завершити MicroDAO Dashboard (канали, rooms, citizens) згідно з документами.</li>
</ul>
<h2 id="nodes">Nodes<a class="headerlink" href="#nodes" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>Документи</strong>: <code>Nodes_Interface_Architecture_UPDATE_v1</code>, <code>Nodes_Profile_Core_Invariant_PATCH_v1</code>, <code>TASK_PHASE_NODE_RUNTIME_AUDIT_NODE1_NODE2</code>.</li>
<li><strong>Бекенд / DAGI</strong>: <code>/public/nodes</code>, <code>/api/nodes/*</code>, <code>/city/agents/{id}/dashboard</code>. Дані беруться з <code>node_cache</code> + agent summaries.</li>
<li><strong>Фронтенд</strong>: <code>/nodes</code>, <code>/nodes/[nodeId]</code>. Відображають 4 шари частково (metrics/ownership/orchestration). </li>
<li><strong>Знахідки</strong>:</li>
<li>У <code>node_cache</code> є NODE1 (prod) і NODE2 (dev) з guardian/steward агентами.</li>
<li>UI показує базову інформацію, але Models Layer (Swapper/моделі) ще stub (банер “dashboard WIP”).</li>
<li>TODO: додати повний Node Dashboard (metrics graf, models list) згідно PATCH v1.</li>
</ul>
<h2 id="summary">Summary<a class="headerlink" href="#summary" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>Agents</strong>: Код ↔ деплой ↔ UI працюють; потрібно лише додати повне відображення gov-level, DAIS і microDAO membership у UI.</li>
<li><strong>MicroDAO</strong>: Дані та API готові; UI ще не покриває всі елементи Interface Architecture (канали, citizens, room map).</li>
<li><strong>Nodes</strong>: Архітектура (4 шари + Node Core Agents) вже реалізується; UI потребує розширення (metrics/models), а в БД треба додати окрему таблицю <code>nodes</code> із microDAO owner для повного інваріанту.</li>
</ul>
<p>Рекомендації: сформувати <code>TASK_PHASE_MVP_DAGI_INTEGRATION_FIX_202512XX.md</code> із конкретними фронтенд/бекенд доопрацюваннями (відображення gov-level/DAIS, Node Dashboard, MicroDAO Dashboard) та створити міграцію <code>nodes</code> з полем owner_microdao.</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>

View File

@@ -0,0 +1,33 @@
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}' | grep -E '(dagi-|daarion-|gateway)' @ NODE1 (2025-11-30)
Names Image Status
daarion-web daarion-web:latest Up 11 minutes
daarion-city-service daarion-city-service:latest Up 11 minutes (healthy)
dagi-postgres postgres:15-alpine Up 39 minutes
dagi-rbac microdao-daarion-rbac Up 49 minutes (healthy)
dagi-devtools microdao-daarion-devtools Up 49 minutes (healthy)
dagi-crewai microdao-daarion-crewai Up 49 minutes (healthy)
dagi-rag-service microdao-daarion-rag-service Restarting (1) 9 seconds ago
dagi-vector-db-service vector-db-service-vector-db-service Up 17 hours (healthy)
dagi-web-search-service web-search-service-web-search-service Up 17 hours (healthy)
dagi-ocr-service ocr-service-ocr-service Up 24 hours (unhealthy)
dagi-stt-service stt-service-stt-service Up 24 hours (healthy)
dagi-router dagi-router:latest Up 25 hours (healthy)
dagi-node-registry 405a26a6f184 Up 2 days (healthy)
daarion-agents-service daarion-agents-service:latest Up 15 hours
daarion-matrix-gateway daarion-matrix-gateway:latest Up 2 days
daarion-auth daarion-auth Up 3 days (healthy)
daarion-synapse matrixdotorg/synapse:latest Up 3 days (healthy)
daarion-element vectorim/element-web:latest Up 3 days (healthy)
daarion-secondme-service daarion-secondme-service:latest Up 4 days
daarion-microdao-service daarion-microdao-service:latest Up 4 days
daarion-redis redis:7-alpine Up 4 days
dagi-tts daarion-tts:latest Up 6 days (healthy)
dagi-memory-service bbe7e4fe7343 Up 6 days (healthy)
dagi-neo4j-exporter microdao-daarion-neo4j-exporter Up 7 days (healthy)
dagi-neo4j neo4j:5.15-community Up 7 days (healthy)
dagi-nats nats:2-alpine Up 14 hours (healthy)
dagi-image-gen microdao-daarion-image-gen-service Up 8 days (unhealthy)
dagi-qdrant qdrant/qdrant:v1.7.4 Up 9 days
dagi-prometheus prom/prometheus:latest Up 9 days (healthy)
dagi-parser-service microdao-daarion-parser-service Up 9 days (healthy)

View File

@@ -0,0 +1,23 @@
NODE1 healthcheck (2025-11-30)
[city-service]
CMD: curl -s http://localhost:7001/health
OUT: {"status":"healthy","service":"city-service"}
STATUS: OK
[gateway]
CMD: curl -s http://localhost:9300/health
OUT: (connection refused)
STATUS: FAIL (service not reachable on localhost:9300)
[NATS]
CMD: nc -z localhost 4222
OUT: Connection succeeded
STATUS: OK
[Postgres]
CMD: docker exec dagi-postgres psql -U postgres -d postgres -c 'SELECT 1'
OUT: 1
STATUS: OK
Notes: matrix/gateway health endpoint недоступний за localhost:9300 і через DNS-імена; потрібно уточнити адресу сервісу або додати health endpoint.

View File

@@ -0,0 +1,722 @@
<!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/debug/node2_config_audit_20251130/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>NODE2 Config & Isolation Audit — 2025-11-30 - 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="#node2-config-isolation-audit-2025-11-30" 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">
NODE2 Config & Isolation Audit — 2025-11-30
</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="#context" class="md-nav__link">
<span class="md-ellipsis">
Context
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#database" class="md-nav__link">
<span class="md-ellipsis">
Database
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#nats" class="md-nav__link">
<span class="md-ellipsis">
NATS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#gateway-matrix-bots" class="md-nav__link">
<span class="md-ellipsis">
Gateway / Matrix / Bots
</span>
</a>
</li>
<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="#summary" class="md-nav__link">
<span class="md-ellipsis">
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="node2-config-isolation-audit-2025-11-30">NODE2 Config &amp; Isolation Audit — 2025-11-30<a class="headerlink" href="#node2-config-isolation-audit-2025-11-30" title="Permanent link">&para;</a></h1>
<h2 id="context">Context<a class="headerlink" href="#context" title="Permanent link">&para;</a></h2>
<ul>
<li>Host: локальна dev-нода (MacBook Pro M4 Max).</li>
<li>Ціль: підтвердити, що NODE2 використовує власні сервіси і не звертається до прод-конфігів NODE1.</li>
<li>Перевіряли тільки запущені контейнери <code>docker ps</code> (див. <code>docs/debug/node2_containers_20251130.txt</code>).</li>
</ul>
<hr />
<h2 id="database">Database<a class="headerlink" href="#database" title="Permanent link">&para;</a></h2>
<ul>
<li><code>dagi-postgres</code> запущений локально з <code>POSTGRES_DB=daarion_memory</code>, <code>POSTGRES_USER=postgres</code>, <code>POSTGRES_PASSWORD=postgres</code>.</li>
<li>Жоден контейнер не використовує <code>postgres://...@dagi-postgres:5432/daarion</code> (прод-БД).</li>
<li><code>dagi-rag-service</code> має <code>PG_DSN=postgresql+psycopg2://postgres:postgres@city-db:5432/daarion_city</code>, але контейнера <code>city-db</code> на NODE2 немає → сервіс перезапускається. Потрібно або створити локальний <code>city-db</code>, або замінити DSN на <code>dagi-postgres</code>/dev-БД.</li>
</ul>
<h2 id="nats">NATS<a class="headerlink" href="#nats" title="Permanent link">&para;</a></h2>
<ul>
<li>Локальний контейнер <code>dagi-nats</code> (<code>nats:2-alpine</code>).</li>
<li>У <code>dagi-rag-service</code> <code>NATS_URL=nats://nats:4222</code> (вказує на локальний контейнер, не на NODE1).</li>
<li>Інших згадок про прод-URL нема.</li>
</ul>
<h2 id="gateway-matrix-bots">Gateway / Matrix / Bots<a class="headerlink" href="#gateway-matrix-bots" title="Permanent link">&para;</a></h2>
<ul>
<li><code>dagi-gateway</code> використовує локальний <code>ROUTER_URL=http://router:9102</code>.</li>
<li>Телеграм-токени:</li>
<li><code>DAARWIZZ_TELEGRAM_BOT_TOKEN</code> не задано.</li>
<li><code>HELION_TELEGRAM_BOT_TOKEN=8112062582:...</code> (dev-токен; перевірити вручну, чи він відрізняється від прод).</li>
<li><code>TELEGRAM_BOT_TOKEN=your_daarwizz_token_here</code> — placeholder, фактично бот не під'єднаний.</li>
<li>Matrix / gateway env змінних не виявлено (немає <code>MATRIX_GATEWAY_URL</code>).</li>
</ul>
<h2 id="_1">Інші секрети / сервіси<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h2>
<ul>
<li><code>olagi-router</code>, <code>swapper-service</code>, <code>stt-service</code>, <code>ocr-service</code>, <code>image-gen</code> працюють суто локально (<code>router</code>, <code>host.docker.internal</code>, тощо).</li>
<li>Немає <code>daarion-city-service</code> та <code>INTERNAL_API_URL</code> → dev-нода не запускає міський бекенд.</li>
<li>Більшість контейнерів у стані <code>unhealthy</code> або <code>Restarting</code>, але це локальні сервіси; вони не звертаються до NODE1.</li>
</ul>
<h2 id="summary">Summary<a class="headerlink" href="#summary" title="Permanent link">&para;</a></h2>
<ol>
<li><strong>Перетинів з прод-БД/NATS не виявлено.</strong> Весь стек використовує локальні сервіси.</li>
<li><strong>RAG-service</strong> намагається підключитись до неіснуючого <code>city-db</code> → слід оновити <code>PG_DSN</code> на локальну БД або вимкнути контейнер.</li>
<li><strong>Gateway токени</strong>: Helion bot має конкретний токен. Потрібно перевірити, чи це dev- або prod-ключ. Якщо це dev — залишити; якщо прод — винести зі stack.</li>
<li><strong>Рекомендації:</strong></li>
<li>створити <code>city-db</code> (dev) або переписати <code>PG_DSN</code><code>postgresql+psycopg2://postgres:postgres@dagi-postgres:5432/daarion_memory</code>.</li>
<li>задокументувати dev-токени в secret manager (щоб не плутати з prod).</li>
<li>за можливості привести назви контейнерів (nats, router) до <code>dev-*</code>, щоб було очевидно, що це dev-стек.</li>
</ol>
<p>Отже, NODE2 має власний DAGI-стек і не зачіпає прод-конфіги NODE1, але потребує дрібних виправлень (RAG DSN, ревізія токенів).</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>

View File

@@ -0,0 +1,23 @@
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}' @ NODE2 (2025-11-30)
NAMES IMAGE STATUS
dagı-rag-service microdao3-rag-service Restarting (1) 37 seconds ago
dagı-router microdao3-router Up 39 minutes (healthy)
dagı-devtools microdao3-devtools Up 39 minutes (healthy)
dagı-rbac microdao3-rbac Up 39 minutes (healthy)
dagı-crewai microdao3-crewai Up 39 minutes (healthy)
dagı-image-gen microdao3-image-gen-service Up 43 minutes (unhealthy)
dagı-tts-service microdao3-tts-service Up 4 hours (unhealthy)
dagı-nats nats:2-alpine Up 5 hours (unhealthy)
dagı-stt-service microdao3-stt-service Up 5 hours (unhealthy)
dagı-prometheus prom/prometheus:latest Up 5 hours (healthy)
dagı-neo4j-exporter microdao3-neo4j-exporter Restarting (0) 25 seconds ago
dagı-neo4j neo4j:5.15-community Restarting (1) 6 seconds ago
o cr-service ocr-service:latest Up 2 days (unhealthy)
swapper-service swapper-service:latest Up 2 days
dagı-web-search-service web-search-service-web-search-service Up 6 days (unhealthy)
dagı-postgres postgres:15-alpine Up 6 days (healthy)
dagı-gateway fa7472f3a8c3 Up 6 days (healthy)
jupyter-lab jupyter/datascience-notebook:latest Up 6 days (healthy)
qdrant-vector-db qdrant/qdrant:latest Up 6 days (unhealthy)
meilisearch-search getmeili/meilisearch:v1.11 Up 6 days (healthy)

View File

@@ -0,0 +1,704 @@
<!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/debug/node_stack_mismatch_20251130/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>Node Stack Mismatch — 2025-11-30 - 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="#node-stack-mismatch-2025-11-30" 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">
Node Stack Mismatch — 2025-11-30
</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="#summary" class="md-nav__link">
<span class="md-ellipsis">
Summary
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#node1-node-1-hetzner-gex44" class="md-nav__link">
<span class="md-ellipsis">
NODE1 (node-1-hetzner-gex44)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#node2-node-2-macbook-m4max" class="md-nav__link">
<span class="md-ellipsis">
NODE2 (node-2-macbook-m4max)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#recommended-actions" class="md-nav__link">
<span class="md-ellipsis">
Recommended Actions
</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="node-stack-mismatch-2025-11-30">Node Stack Mismatch — 2025-11-30<a class="headerlink" href="#node-stack-mismatch-2025-11-30" title="Permanent link">&para;</a></h1>
<h2 id="summary">Summary<a class="headerlink" href="#summary" title="Permanent link">&para;</a></h2>
<p>Під час виконання <code>TASK_PHASE_NODE_RUNTIME_AUDIT_NODE1_NODE2</code> знайдені відхилення між фактичними контейнерами та очікуваними профілями нод.</p>
<h2 id="node1-node-1-hetzner-gex44">NODE1 (node-1-hetzner-gex44)<a class="headerlink" href="#node1-node-1-hetzner-gex44" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>Mandatory services</strong>: більшість prod-сервісів присутні (<code>daarion-city-service</code>, <code>daarion-web</code>, <code>dagi-router</code>, <code>dagi-postgres</code>, <code>dagi-nats</code>, stt/ocr/web-search/rag/vector-db, parser, image-gen тощо).</li>
<li><strong>Issues</strong>:</li>
<li><code>dagi-rag-service</code> у стані <code>Restarting</code> → потребує фіксу/перезапуску, інакше DAGI-аналітика/LLM ingestion не працює.</li>
<li><code>dagi-ocr-service</code> і <code>dagi-image-gen</code> позначені як <code>unhealthy</code> → треба прогнати healthchecks/логи.</li>
<li>HTTP health <code>http://localhost:9300/health</code> (matrix/gateway) недоступний → потрібно або оновити endpoint, або задокументувати реальну адресу.</li>
<li>У профайлі очікується <code>dagi-gateway</code>, а фактично працює <code>daarion-matrix-gateway</code>. Потрібно оновити Node Profile або привести іменування в доку до фактичного контейнера.</li>
</ul>
<h2 id="node2-node-2-macbook-m4max">NODE2 (node-2-macbook-m4max)<a class="headerlink" href="#node2-node-2-macbook-m4max" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>Очікуваний стек</strong>: dev/models (ollama/vllm, experimental services, core-team runtime). Не повинно бути прод-сервісів.</li>
<li><strong>Фактичний стан</strong> (локальна машина):</li>
<li>Запущені <code>dagi-router</code>, <code>dagi-postgres</code>, <code>dagi-rbac</code>, <code>dagi-devtools</code>, <code>dagi-gateway</code>, <code>dagi-prometheus</code>, <code>nats</code>, <code>stt-service</code>, <code>ocr-service</code>, <code>web-search-service</code> тощо — це прод-сервіси, які за профілем мають жити на NODE1.</li>
<li>Більшість контейнерів у стані <code>unhealthy</code> або <code>Restarting</code> (rag-service, neo4j, nats, stt, tts, web-search).</li>
<li>Висновок: NODE2 зараз тримає повний стек DAGI, а не лише dev/models. Потрібно або:<ul>
<li>перемістити ці сервіси на NODE1 / іншу інфру (для прод-ролі);</li>
<li>або оновити профіль NODE2 (якщо вирішено мати прод-сервіси на MacBook, що малоймовірно).</li>
</ul>
</li>
</ul>
<h2 id="recommended-actions">Recommended Actions<a class="headerlink" href="#recommended-actions" title="Permanent link">&para;</a></h2>
<ol>
<li><strong>NODE1</strong></li>
<li>Розібратися з <code>dagi-rag-service</code> (перебудувати образ, перевірити залежності Postgres/NATS/Vector DB).</li>
<li>Перевірити <code>dagi-ocr-service</code>, <code>dagi-image-gen</code> (health endpoints та логи).</li>
<li>Уточнити адресу healthcheck для gateway (чи є окремий endpoint, чи потрібен reverse proxy).</li>
<li>
<p>Оновити Node Profile, щоб узгодити назви (<code>daarion-matrix-gateway</code>).</p>
</li>
<li>
<p><strong>NODE2</strong></p>
</li>
<li>Зупинити продакшн-сервіси (<code>dagi-router</code>, <code>dagi-postgres</code>, <code>dagi-gateway</code>, <code>nats</code>, <code>stt</code>, <code>ocr</code>, <code>web-search</code>, тощо) або перенести їх у dev-версії з чітким неймінгом <code>dev-*</code>.</li>
<li>За потреби залишити тільки dev/models runtime (ollama, swapper, experimental RAG) та відповідно оновити документацію.</li>
<li>
<p>Перевірити/почистити контейнери, що зависли в <code>unhealthy</code> / <code>Restarting</code> стані.</p>
</li>
<li>
<p><strong>Документація</strong></p>
</li>
<li>Відобразити реальний стан у <code>Node Profiles</code> + додати посилання на цей файл як доказ невідповідності.</li>
</ol>
</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>

View File

@@ -0,0 +1,744 @@
<!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/debug/orphans_20251130/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>Orphans Audit — 2025-11-30 - 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="#orphans-audit-2025-11-30" 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">
Orphans Audit — 2025-11-30
</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-nodes" class="md-nav__link">
<span class="md-ellipsis">
1. Nodes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2-agents" class="md-nav__link">
<span class="md-ellipsis">
2. Agents
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#3-microdao" class="md-nav__link">
<span class="md-ellipsis">
3. MicroDAO
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#4-rooms" class="md-nav__link">
<span class="md-ellipsis">
4. Rooms
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#summary" class="md-nav__link">
<span class="md-ellipsis">
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="orphans-audit-2025-11-30">Orphans Audit — 2025-11-30<a class="headerlink" href="#orphans-audit-2025-11-30" title="Permanent link">&para;</a></h1>
<p>Production DB: <code>daarion</code> (NODE1)<br />
Ref task: <code>docs/tasks/TASK_PHASE_MVP_VERIFY_NO_ORPHANS.md</code></p>
<hr />
<h2 id="1-nodes">1. Nodes<a class="headerlink" href="#1-nodes" title="Permanent link">&para;</a></h2>
<ul>
<li>Технічна таблиця <code>nodes</code> у поточній БД відсутня (використовується <code>node_cache</code>).</li>
<li><code>node_cache</code> не містить <code>microdao_id</code>, тому перевірка <em>“нода без microDAO”</em> наразі неактуальна (TODO у схемі).</li>
<li><code>node_cache</code> містить <code>guardian_agent_id</code> / <code>steward_agent_id</code> — обидві ноди мають заповнені значення.</li>
</ul>
<h2 id="2-agents">2. Agents<a class="headerlink" href="#2-agents" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Перевірка</th>
<th>SQL</th>
<th>Результат</th>
</tr>
</thead>
<tbody>
<tr>
<td>Агенти без <code>home_microdao_id</code> (крім city-level)</td>
<td><code>SELECT id FROM agents WHERE home_microdao_id IS NULL ...</code></td>
<td>0 rows</td>
</tr>
<tr>
<td>Governance агенти без DAIS identity</td>
<td><code>SELECT id FROM agents WHERE dais_identity_id IS NULL AND gov_level IN (...)</code></td>
<td>0 rows</td>
</tr>
</tbody>
</table>
<h2 id="3-microdao">3. MicroDAO<a class="headerlink" href="#3-microdao" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Перевірка</th>
<th>Результат</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>microdaos</code> без orchestrator</td>
<td>0 rows</td>
</tr>
<tr>
<td>Orchestrator не знайдений у <code>agents</code></td>
<td>0 rows</td>
</tr>
</tbody>
</table>
<h2 id="4-rooms">4. Rooms<a class="headerlink" href="#4-rooms" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Перевірка</th>
<th>Результат</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>rooms</code> без owner (<code>owner_id IS NULL</code>)</td>
<td>0 rows</td>
</tr>
<tr>
<td>City/District rooms без <code>primary_agent_id</code></td>
<td>0 rows</td>
</tr>
</tbody>
</table>
<hr />
<h2 id="summary">Summary<a class="headerlink" href="#summary" title="Permanent link">&para;</a></h2>
<ul>
<li>Основні інваріанти виконані: орфанів у <code>agents</code>, <code>microdaos</code>, <code>rooms</code> — немає.</li>
<li>Для <code>nodes</code> потрібно доробити схему (додати <code>microdao_id</code> або окрему таблицю), наразі замість цього використовується <code>node_cache</code>.</li>
<li>UI <code>/nodes</code>, <code>/agents</code>, <code>/microdao</code> працюють на актуальних даних.</li>
</ul>
</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>

View File

@@ -0,0 +1,905 @@
<!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/debug/presence_layer_report_20251130/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>Presence Layer — Звіт про виконання - 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="#presence-layer" 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">
Presence Layer — Звіт про виконання
</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" class="md-nav__link">
<span class="md-ellipsis">
1. Мета
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2" class="md-nav__link">
<span class="md-ellipsis">
2. Виконані роботи
</span>
</a>
<nav class="md-nav" aria-label="2. Виконані роботи">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#21-matrix-gateway" class="md-nav__link">
<span class="md-ellipsis">
2.1. Matrix Gateway ✅
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#22-city-service" class="md-nav__link">
<span class="md-ellipsis">
2.2. City Service ✅
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#3-api" class="md-nav__link">
<span class="md-ellipsis">
3. API Тести
</span>
</a>
<nav class="md-nav" aria-label="3. API Тести">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#31-matrix-gateway-presence" class="md-nav__link">
<span class="md-ellipsis">
3.1. Matrix Gateway Presence
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#32-agent-presence" class="md-nav__link">
<span class="md-ellipsis">
3.2. Agent Presence
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#4-frontend" class="md-nav__link">
<span class="md-ellipsis">
4. Інтеграція з Frontend
</span>
</a>
<nav class="md-nav" aria-label="4. Інтеграція з Frontend">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#41" class="md-nav__link">
<span class="md-ellipsis">
4.1. Наявні компоненти
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#42" class="md-nav__link">
<span class="md-ellipsis">
4.2. Рекомендації для повної інтеграції
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#5" class="md-nav__link">
<span class="md-ellipsis">
5. Наступні кроки
</span>
</a>
<nav class="md-nav" aria-label="5. Наступні кроки">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#51-frontend-todo" class="md-nav__link">
<span class="md-ellipsis">
5.1. Frontend інтеграція (TODO)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#52-agent-matrix-users-todo" class="md-nav__link">
<span class="md-ellipsis">
5.2. Agent Matrix Users (TODO)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#6" class="md-nav__link">
<span class="md-ellipsis">
6. Архітектура
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#7" class="md-nav__link">
<span class="md-ellipsis">
7. Команди для перевірки
</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="presence-layer">Presence Layer — Звіт про виконання<a class="headerlink" href="#presence-layer" title="Permanent link">&para;</a></h1>
<p><strong>Дата:</strong> 2025-11-30
<strong>Статус:</strong> ВИКОНАНО (Backend 100%)</p>
<h2 id="1">1. Мета<a class="headerlink" href="#1" title="Permanent link">&para;</a></h2>
<p>Впровадити повний Presence Layer у DAARION.city для відображення online/offline/away статусів агентів.</p>
<h2 id="2">2. Виконані роботи<a class="headerlink" href="#2" title="Permanent link">&para;</a></h2>
<h3 id="21-matrix-gateway">2.1. Matrix Gateway ✅<a class="headerlink" href="#21-matrix-gateway" title="Permanent link">&para;</a></h3>
<p>Нові endpoints:</p>
<div class="codehilite"><pre><span></span><code><span class="k">GET</span><span class="w"> </span><span class="o">/</span><span class="n">internal</span><span class="o">/</span><span class="n">matrix</span><span class="o">/</span><span class="n">presence</span><span class="o">/</span><span class="err">{</span><span class="n">matrix_user_id</span><span class="err">}</span>
<span class="k">GET</span><span class="w"> </span><span class="o">/</span><span class="n">internal</span><span class="o">/</span><span class="n">matrix</span><span class="o">/</span><span class="n">presence</span><span class="o">/</span><span class="k">bulk</span><span class="vm">?</span><span class="n">user_ids</span><span class="o">=</span><span class="nv">@user1</span><span class="err">:</span><span class="p">...,</span><span class="nv">@user2</span><span class="err">:</span><span class="p">...</span>
</code></pre></div>
<p><strong>Приклад відповіді:</strong></p>
<div class="codehilite"><pre><span></span><code><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;user_id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;@daarion_admin:daarion.space&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;presence&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;offline&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;last_active_ago_ms&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">415845</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;status_msg&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span>
<span class="p">}</span>
</code></pre></div>
<p><strong>Нормалізація:</strong>
- Matrix <code>online</code><code>"online"</code>
- Matrix <code>unavailable</code><code>"away"</code>
- Matrix <code>offline</code> / not found → <code>"offline"</code></p>
<h3 id="22-city-service">2.2. City Service ✅<a class="headerlink" href="#22-city-service" title="Permanent link">&para;</a></h3>
<p>Новий endpoint:</p>
<div class="codehilite"><pre><span></span><code>GET /api/v1/agents/{agent_id}/presence
</code></pre></div>
<p><strong>Приклад відповіді:</strong></p>
<div class="codehilite"><pre><span></span><code><span class="p">{</span>
<span class="w"> </span><span class="nt">&quot;agent_id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;daarwizz&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;display_name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;DAARWIZZ&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;matrix_user_id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;@agent_daarwizz:daarion.space&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;presence&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;offline&quot;</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;last_active_ago_ms&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
<span class="w"> </span><span class="nt">&quot;status_msg&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span>
<span class="p">}</span>
</code></pre></div>
<p><strong>Логіка:</strong>
1. Отримує агента з БД
2. Генерує Matrix user ID: <code>@agent_{slug}:daarion.space</code>
3. Запитує presence у Matrix Gateway
4. Повертає нормалізований результат</p>
<h2 id="3-api">3. API Тести<a class="headerlink" href="#3-api" title="Permanent link">&para;</a></h2>
<h3 id="31-matrix-gateway-presence">3.1. Matrix Gateway Presence<a class="headerlink" href="#31-matrix-gateway-presence" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code>curl<span class="w"> </span>-s<span class="w"> </span><span class="s1">&#39;http://localhost:7025/internal/matrix/presence/@daarion_admin:daarion.space&#39;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>jq<span class="w"> </span><span class="s1">&#39;.&#39;</span>
</code></pre></div>
<p><strong>Результат:</strong> ✅ Повертає presence статус</p>
<h3 id="32-agent-presence">3.2. Agent Presence<a class="headerlink" href="#32-agent-presence" title="Permanent link">&para;</a></h3>
<div class="codehilite"><pre><span></span><code>curl<span class="w"> </span>-s<span class="w"> </span><span class="s1">&#39;http://localhost:7001/api/v1/agents/daarwizz/presence&#39;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>jq<span class="w"> </span><span class="s1">&#39;.&#39;</span>
</code></pre></div>
<p><strong>Результат:</strong> ✅ Повертає presence агента</p>
<h2 id="4-frontend">4. Інтеграція з Frontend<a class="headerlink" href="#4-frontend" title="Permanent link">&para;</a></h2>
<h3 id="41">4.1. Наявні компоненти<a class="headerlink" href="#41" title="Permanent link">&para;</a></h3>
<p>Файл <code>apps/web/src/components/ui/AgentPresenceBadge.tsx</code> вже існує і використовує:
- <code>useAgentPresence</code> hook
- <code>globalPresenceClient</code> для SSE</p>
<h3 id="42">4.2. Рекомендації для повної інтеграції<a class="headerlink" href="#42" title="Permanent link">&para;</a></h3>
<ol>
<li>
<p><strong>Оновити <code>useAgentPresence</code></strong> для використання нового API:
<code>typescript
const fetchPresence = async (agentId: string) =&gt; {
const res = await fetch(`/api/v1/agents/${agentId}/presence`);
return res.json();
};</code></p>
</li>
<li>
<p><strong>Додати <code>PresenceDot</code> компонент</strong> (якщо ще немає):
<code>typescript
&lt;PresenceDot state="online|offline|away" /&gt;</code></p>
</li>
<li>
<p><strong>Інтегрувати у сторінки:</strong></p>
</li>
<li><code>/agents</code> — біля кожного агента</li>
<li><code>/agents/:id</code> — під аватаркою</li>
<li><code>/nodes/:nodeId</code> — для Guardian/Steward</li>
<li><code>/microdao/:slug</code> — для Orchestrator</li>
</ol>
<h2 id="5">5. Наступні кроки<a class="headerlink" href="#5" title="Permanent link">&para;</a></h2>
<h3 id="51-frontend-todo">5.1. Frontend інтеграція (TODO)<a class="headerlink" href="#51-frontend-todo" title="Permanent link">&para;</a></h3>
<ul>
<li>[ ] Оновити <code>AgentPresenceBadge</code> для нового API</li>
<li>[ ] Додати auto-refresh кожні 30 секунд</li>
<li>[ ] Інтегрувати у Chat Widget</li>
</ul>
<h3 id="52-agent-matrix-users-todo">5.2. Agent Matrix Users (TODO)<a class="headerlink" href="#52-agent-matrix-users-todo" title="Permanent link">&para;</a></h3>
<ul>
<li>[ ] Створити Matrix users для агентів</li>
<li>[ ] Налаштувати агентів для відправки heartbeat</li>
</ul>
<h2 id="6">6. Архітектура<a class="headerlink" href="#6" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code>Frontend → City Service → Matrix Gateway → Synapse
Agent DB
</code></pre></div>
<p><strong>Flow:</strong>
1. Frontend запитує <code>/api/v1/agents/{id}/presence</code>
2. City Service знаходить агента в БД
3. City Service генерує Matrix user ID
4. City Service запитує Gateway
5. Gateway запитує Synapse
6. Результат повертається назад</p>
<h2 id="7">7. Команди для перевірки<a class="headerlink" href="#7" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code><span class="c1"># Matrix Gateway presence</span>
curl<span class="w"> </span>-s<span class="w"> </span><span class="s1">&#39;http://localhost:7025/internal/matrix/presence/@daarion_admin:daarion.space&#39;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>jq<span class="w"> </span><span class="s1">&#39;.&#39;</span>
<span class="c1"># Agent presence</span>
curl<span class="w"> </span>-s<span class="w"> </span><span class="s1">&#39;http://localhost:7001/api/v1/agents/daarwizz/presence&#39;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>jq<span class="w"> </span><span class="s1">&#39;.&#39;</span>
<span class="c1"># Bulk presence</span>
curl<span class="w"> </span>-s<span class="w"> </span><span class="s1">&#39;http://localhost:7025/internal/matrix/presence/bulk?user_ids=@daarion_admin:daarion.space&#39;</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>jq<span class="w"> </span><span class="s1">&#39;.&#39;</span>
</code></pre></div>
<hr />
<p><strong>Автор:</strong> Cursor AI
<strong>Таск:</strong> <code>TASK_PHASE_PRESENCE_LAYER_v1.md</code></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>

View File

@@ -0,0 +1,874 @@
<!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/debug/rooms_layer_restore_report_20251130/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.18">
<title>Rooms Layer Restore — Звіт про виконання - 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="#rooms-layer-restore" 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">
Rooms Layer Restore — Звіт про виконання
</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" class="md-nav__link">
<span class="md-ellipsis">
1. Мета
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#2" class="md-nav__link">
<span class="md-ellipsis">
2. Виконані роботи
</span>
</a>
<nav class="md-nav" aria-label="2. Виконані роботи">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#21-city-rooms" class="md-nav__link">
<span class="md-ellipsis">
2.1. City Rooms ✅
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#22-microdao-rooms" class="md-nav__link">
<span class="md-ellipsis">
2.2. MicroDAO Rooms ✅
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#23-node-support-rooms" class="md-nav__link">
<span class="md-ellipsis">
2.3. Node Support Rooms ✅
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#24-citizens-layer" class="md-nav__link">
<span class="md-ellipsis">
2.4. Citizens Layer ✅
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#3-daarionspace" class="md-nav__link">
<span class="md-ellipsis">
3. Перевірка на DAARION.space
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#4" class="md-nav__link">
<span class="md-ellipsis">
4. Що залишилось
</span>
</a>
<nav class="md-nav" aria-label="4. Що залишилось">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#41-matrix-integration-todo" class="md-nav__link">
<span class="md-ellipsis">
4.1. Matrix Integration (TODO)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#42-agentnode-chat-rooms-auto-create-todo" class="md-nav__link">
<span class="md-ellipsis">
4.2. Agent/Node Chat Rooms Auto-Create (TODO)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#43-city-rooms-list-api-todo" class="md-nav__link">
<span class="md-ellipsis">
4.3. City Rooms List API (TODO)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#5-sql-queries" class="md-nav__link">
<span class="md-ellipsis">
5. SQL Queries для перевірки
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#6" class="md-nav__link">
<span class="md-ellipsis">
6. Наступні кроки
</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="rooms-layer-restore">Rooms Layer Restore — Звіт про виконання<a class="headerlink" href="#rooms-layer-restore" title="Permanent link">&para;</a></h1>
<p><strong>Дата:</strong> 2025-11-30
<strong>Статус:</strong> ЧАСТКОВО ВИКОНАНО</p>
<h2 id="1">1. Мета<a class="headerlink" href="#1" title="Permanent link">&para;</a></h2>
<p>Відновити Rooms Layer у MVP згідно з <code>TASK_PHASE_ROOMS_LAYER_RESTORE_AND_MATRIX_INTEGRATION.md</code>.</p>
<h2 id="2">2. Виконані роботи<a class="headerlink" href="#2" title="Permanent link">&para;</a></h2>
<h3 id="21-city-rooms">2.1. City Rooms ✅<a class="headerlink" href="#21-city-rooms" title="Permanent link">&para;</a></h3>
<p><strong>Seed 8 City Rooms:</strong>
- <code>general</code> - Main city chat room
- <code>welcome</code> - Welcome new citizens
- <code>leadership-hall</code> - City governance discussions
- <code>builders</code> - Builders community
- <code>science-lab</code> - Research and AI discussions
- <code>security-bureau</code> - Security discussions
- <code>economics-square</code> - Economics and tokenomics
- <code>announcements</code> - Official announcements</p>
<p><strong>Результат:</strong> Кімнати відображаються на <code>/city</code> (Мапа view).</p>
<h3 id="22-microdao-rooms">2.2. MicroDAO Rooms ✅<a class="headerlink" href="#22-microdao-rooms" title="Permanent link">&para;</a></h3>
<p><strong>Seed 5 MicroDAO Rooms для DAARION:</strong>
- <code>daarion-lobby</code> - Main lobby (primary)
- <code>daarion-governance</code> - Governance and voting
- <code>daarion-news</code> - News and updates
- <code>daarion-builders</code> - Development discussions
- <code>daarion-help</code> - Help and support</p>
<p><strong>Результат:</strong> Кімнати відображаються на <code>/microdao/daarion</code>.</p>
<h3 id="23-node-support-rooms">2.3. Node Support Rooms ✅<a class="headerlink" href="#23-node-support-rooms" title="Permanent link">&para;</a></h3>
<p><strong>Seed 2 Node Support Rooms:</strong>
- <code>node-support-node1</code> - NODE1 Support
- <code>node-support-node2</code> - NODE2 Support</p>
<p><strong>Результат:</strong> Кімнати створені в БД, відображаються на City Map.</p>
<h3 id="24-citizens-layer">2.4. Citizens Layer ✅<a class="headerlink" href="#24-citizens-layer" title="Permanent link">&para;</a></h3>
<p><strong>Оновлено фільтр публічних агентів:</strong>
- Прибрано строгі вимоги (<code>node_id IS NOT NULL</code>, <code>EXISTS microdao_agents</code>)
- Додано фільтр по <code>gov_level</code> та <code>kind</code>
- Оновлено <code>public_slug</code> для всіх публічних агентів</p>
<p><strong>Результат:</strong> <code>/citizens</code> показує 14 громадян.</p>
<h2 id="3-daarionspace">3. Перевірка на DAARION.space<a class="headerlink" href="#3-daarionspace" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Сторінка</th>
<th>Статус</th>
<th>Примітки</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/city</code> (Мапа)</td>
<td>✅ Працює</td>
<td>Всі кімнати відображаються</td>
</tr>
<tr>
<td><code>/city</code> (Список)</td>
<td>⚠️ Частково</td>
<td>Потребує перевірки API</td>
</tr>
<tr>
<td><code>/citizens</code></td>
<td>✅ Працює</td>
<td>14 громадян</td>
</tr>
<tr>
<td><code>/microdao/daarion</code></td>
<td>✅ Працює</td>
<td>5 кімнат</td>
</tr>
<tr>
<td><code>/agents/:id</code></td>
<td>✅ Працює</td>
<td>Chat widget є</td>
</tr>
<tr>
<td><code>/nodes/:id</code></td>
<td>✅ Працює</td>
<td>Chat widget є</td>
</tr>
</tbody>
</table>
<h2 id="4">4. Що залишилось<a class="headerlink" href="#4" title="Permanent link">&para;</a></h2>
<h3 id="41-matrix-integration-todo">4.1. Matrix Integration (TODO)<a class="headerlink" href="#41-matrix-integration-todo" title="Permanent link">&para;</a></h3>
<ul>
<li>Кімнати створені в БД, але <code>matrix_room_id</code> = NULL</li>
<li>Потрібно створити Matrix rooms через gateway</li>
<li>Потрібно записати <code>matrix_room_id</code> в БД</li>
</ul>
<h3 id="42-agentnode-chat-rooms-auto-create-todo">4.2. Agent/Node Chat Rooms Auto-Create (TODO)<a class="headerlink" href="#42-agentnode-chat-rooms-auto-create-todo" title="Permanent link">&para;</a></h3>
<ul>
<li>API <code>/chat-room</code> повертає дані</li>
<li>Але <code>chat_available = false</code> бо немає Matrix rooms</li>
</ul>
<h3 id="43-city-rooms-list-api-todo">4.3. City Rooms List API (TODO)<a class="headerlink" href="#43-city-rooms-list-api-todo" title="Permanent link">&para;</a></h3>
<ul>
<li><code>/city/rooms</code> повертає дані</li>
<li>Але UI "Список" може не використовувати правильний endpoint</li>
</ul>
<h2 id="5-sql-queries">5. SQL Queries для перевірки<a class="headerlink" href="#5-sql-queries" title="Permanent link">&para;</a></h2>
<div class="codehilite"><pre><span></span><code><span class="c1">-- City Rooms</span>
<span class="k">SELECT</span><span class="w"> </span><span class="n">slug</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">owner_type</span><span class="p">,</span><span class="w"> </span><span class="n">space_scope</span><span class="p">,</span><span class="w"> </span><span class="n">is_public</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">city_rooms</span><span class="w"> </span>
<span class="k">WHERE</span><span class="w"> </span><span class="n">space_scope</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;city&#39;</span><span class="w"> </span><span class="k">ORDER</span><span class="w"> </span><span class="k">BY</span><span class="w"> </span><span class="n">sort_order</span><span class="p">;</span>
<span class="c1">-- MicroDAO Rooms</span>
<span class="k">SELECT</span><span class="w"> </span><span class="n">slug</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">owner_type</span><span class="p">,</span><span class="w"> </span><span class="n">owner_id</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">city_rooms</span><span class="w"> </span>
<span class="k">WHERE</span><span class="w"> </span><span class="n">owner_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;microdao&#39;</span><span class="p">;</span>
<span class="c1">-- Node Rooms</span>
<span class="k">SELECT</span><span class="w"> </span><span class="n">slug</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">owner_type</span><span class="p">,</span><span class="w"> </span><span class="n">owner_id</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">city_rooms</span><span class="w"> </span>
<span class="k">WHERE</span><span class="w"> </span><span class="n">owner_type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">&#39;node&#39;</span><span class="p">;</span>
<span class="c1">-- Public Agents (Citizens)</span>
<span class="k">SELECT</span><span class="w"> </span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">display_name</span><span class="p">,</span><span class="w"> </span><span class="n">is_public</span><span class="p">,</span><span class="w"> </span><span class="n">gov_level</span><span class="p">,</span><span class="w"> </span><span class="n">public_slug</span><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">agents</span><span class="w"> </span>
<span class="k">WHERE</span><span class="w"> </span><span class="n">is_public</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">true</span><span class="w"> </span><span class="k">LIMIT</span><span class="w"> </span><span class="mi">20</span><span class="p">;</span>
</code></pre></div>
<h2 id="6">6. Наступні кроки<a class="headerlink" href="#6" title="Permanent link">&para;</a></h2>
<ol>
<li><strong>Matrix Room Creation</strong> — створити Matrix кімнати для всіх city_rooms</li>
<li><strong>Gateway Integration</strong> — підключити agents до кімнат</li>
<li><strong>Chat Widget Fix</strong> — забезпечити <code>chat_available = true</code></li>
<li><strong>City List View</strong> — перевірити та виправити UI</li>
</ol>
<hr />
<p><strong>Автор:</strong> Cursor AI
<strong>Таск:</strong> <code>TASK_PHASE_ROOMS_LAYER_RESTORE_AND_MATRIX_INTEGRATION.md</code></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>