feat(deploy): platform handoff — agent routing, persistence, docs cleanup
Agent routing: - Remove !agent command and manual agent selection flow - Registry auto-assigns agent from user_agents mapping (fallback: agents[0]) - provision_workspace_chat and !new both write agent_id to room_meta - Reconciliation backfills agent_id from registry on cold start - Fix duplicate agent_id block in auth.py Deployment stability: - Add bot-state named volume to persist lambda_matrix.db and matrix_store - Fix docker-compose.prod.yml duplicate environment: key (was silently losing all Matrix credentials) - Fix MATRIX_AGENT_REGISTRY_PATH to use absolute container path /app/config/... - Add bot-state volume declaration to docker-compose.fullstack.yml Docs and config: - Rewrite README.md for platform handoff (deploy table, working commands only) - Rewrite docs/matrix-prototype.md (remove stale commands and mock descriptions) - Remove !save/!load/!context/!agent from help text and welcome message - Add !clear, !list, !remove, !yes/!no to help text - Clean up .env.example (remove Telegram token, internal vars, real URLs) - Update config/matrix-agents.example.yaml with user_agents section and comments - Add explanatory comment to Dockerfile for --ignore-requires-python - Remove silent uv sync fallbacks in Dockerfile
This commit is contained in:
parent
380961d6e9
commit
b1aaa210a1
21 changed files with 311 additions and 937 deletions
339
README.md
339
README.md
|
|
@ -1,23 +1,10 @@
|
|||
# Lambda Lab 3.0 — Surfaces
|
||||
|
||||
Команда поверхностей. Telegram и Matrix боты для взаимодействия пользователя с AI-агентом Lambda.
|
||||
Matrix-бот для взаимодействия пользователя с AI-агентом Lambda.
|
||||
|
||||
## Статус
|
||||
|
||||
| Поверхность | Статус |
|
||||
|---|---|
|
||||
| Telegram | 🔨 В разработке, отдельный worktree `feat/telegram-adapter` |
|
||||
| Matrix | ✅ MVP runtime: `docker-compose.prod.yml` для bot-only handoff, `docker-compose.fullstack.yml` для internal E2E |
|
||||
|
||||
---
|
||||
|
||||
## Концепция
|
||||
|
||||
Пользователь получает персонального AI-агента через привычный мессенджер.
|
||||
Агент выполняет реальные задачи: разбирает почту, ищет информацию, работает с файлами, управляет календарём.
|
||||
|
||||
**Поверхности** — тонкие клиенты. Вся бизнес-логика на стороне платформы.
|
||||
Задача команды: сделать интерфейс удобным, надёжным и легко расширяемым.
|
||||
Matrix MVP готов к деплою. Telegram — в отдельном worktree, не входит в этот handoff.
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -28,271 +15,173 @@ surfaces-bot/
|
|||
core/ — общее ядро, не зависит от транспорта
|
||||
protocol.py — унифицированные структуры (IncomingMessage, OutgoingUI, ...)
|
||||
handler.py — EventDispatcher: IncomingEvent → OutgoingEvent
|
||||
handlers/ — обработчики по типам событий
|
||||
store.py — StateStore Protocol + InMemoryStore + SQLiteStore
|
||||
chat.py — ChatManager: метаданные чатов C1/C2/C3
|
||||
auth.py — AuthManager: аутентификация
|
||||
settings.py — SettingsManager: коннекторы, скиллы, SOUL, безопасность
|
||||
chat.py — ChatManager
|
||||
auth.py — AuthManager
|
||||
settings.py — SettingsManager
|
||||
|
||||
adapter/
|
||||
telegram/ — aiogram 3.x адаптер
|
||||
matrix/ — matrix-nio адаптер
|
||||
|
||||
sdk/
|
||||
interface.py — PlatformClient Protocol (контракт к SDK)
|
||||
mock.py — MockPlatformClient (заглушка)
|
||||
real.py — RealPlatformClient (через AgentApi)
|
||||
mock.py — MockPlatformClient (заглушка для тестов)
|
||||
|
||||
config/
|
||||
matrix-agents.yaml — реестр агентов
|
||||
|
||||
docs/ — документация
|
||||
.claude/agents/ — агенты для Claude Code
|
||||
```
|
||||
|
||||
**Ключевой принцип:** добавить новую поверхность = написать один адаптер-конвертер.
|
||||
Ядро (`core/`) не трогается. Подробнее: [`docs/surface-protocol.md`](docs/surface-protocol.md)
|
||||
Подробнее: [`docs/surface-protocol.md`](docs/surface-protocol.md)
|
||||
|
||||
---
|
||||
|
||||
## Функционал прототипа
|
||||
## Деплой
|
||||
|
||||
### Telegram ([подробнее](docs/telegram-prototype.md))
|
||||
|
||||
- **Чаты** — основной Telegram UX сейчас развивается в отдельном worktree `feat/telegram-adapter`
|
||||
- **Forum Topics mode** — бот умеет подключать forum-группу через `/forum`; чат может быть привязан к отдельной теме
|
||||
- **DM-режим** — базовый диалог и переключение чатов сохраняются
|
||||
- **Аутентификация** — привязка Telegram аккаунта к аккаунту платформы
|
||||
- **Диалог** — typing indicator, передача файлов, подтверждение опасных действий через inline-кнопки
|
||||
- **Настройки** через `/settings`: коннекторы (Gmail, GitHub, Notion...), скиллы, личность агента (SOUL), безопасность, подписка
|
||||
|
||||
### Matrix ([подробнее](docs/matrix-prototype.md))
|
||||
|
||||
- **Онбординг** — при первом invite бот создаёт private Space `Lambda — {display_name}` и первую комнату `Чат 1`, сразу приглашая туда пользователя
|
||||
- **Чаты** — `!new`, `!chats`, `!rename`, `!archive`, `!help`; новые комнаты регистрируются в локальном `ChatManager`
|
||||
- **Диалог** — сообщения, вложения, подтверждения `!yes` / `!no` и routing через `EventDispatcher`
|
||||
- **Стабильность** — перед `sync_forever()` бот делает bootstrap sync и стартует с `since`, чтобы не переигрывать старую timeline после рестарта
|
||||
- **Текущее ограничение** — encrypted DM официально не поддержан; ручное тестирование Matrix ведётся в незашифрованных комнатах и зависит от локального state-store бота
|
||||
- **Backend selection** — `MATRIX_PLATFORM_BACKEND=mock` остаётся значением по умолчанию; `MATRIX_PLATFORM_BACKEND=real` использует `platform-agent` из compose и upstream `AgentApi` по contract `/v1/agent_ws/{chat_id}/`
|
||||
- **Ограничения real backend** — локальный runtime использует shared `/workspace`, файлы передаются как относительные пути в `attachments`, а transport layer со стороны `surfaces` использует прямой upstream `platform-agent_api.AgentApi` без локального subclass; prod-default lifecycle открывает отдельное соединение на каждый запрос, но после tool/file flow всё ещё остаётся подтверждённый upstream streaming bug, из-за которого начало ответа может пропадать
|
||||
|
||||
---
|
||||
|
||||
## Замена SDK
|
||||
|
||||
Вся работа с платформой идёт через `PlatformClient` Protocol:
|
||||
|
||||
```python
|
||||
class PlatformClient(Protocol):
|
||||
async def get_or_create_user(self, external_id: str, platform: str, ...) -> User: ...
|
||||
async def send_message(self, user_id: str, chat_id: str, text: str, ...) -> MessageResponse: ...
|
||||
async def get_settings(self, user_id: str) -> UserSettings: ...
|
||||
async def update_settings(self, user_id: str, action: Any) -> None: ...
|
||||
```
|
||||
|
||||
Бот не управляет lifecycle контейнеров — это делает Master (платформа).
|
||||
Бот передаёт `user_id` + `chat_id` + сообщение; платформа сама решает нужно ли поднять контейнер.
|
||||
|
||||
Сейчас: `MockPlatformClient` в `sdk/mock.py`, а Matrix real backend собирается через `sdk/real.py` при `MATRIX_PLATFORM_BACKEND=real`.
|
||||
Файловый контракт уже path-based: бот пишет файлы в shared `/agents` и передаёт платформе относительные пути в `attachments`, которые агент читает внутри своего `/workspace`.
|
||||
Когда SDK готов: добавляем `SdkPlatformClient`, меняем одну строку в DI. Адаптеры и ядро не трогаем.
|
||||
|
||||
---
|
||||
|
||||
## Запуск Matrix-поверхности
|
||||
|
||||
### 1. Зависимости и тесты
|
||||
|
||||
```bash
|
||||
uv sync
|
||||
pytest tests/ -v
|
||||
```
|
||||
|
||||
### 2. Переменные окружения
|
||||
### Переменные окружения
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
Обязательные переменные:
|
||||
| Переменная | Обязательна | Описание |
|
||||
|---|---|---|
|
||||
| `MATRIX_HOMESERVER` | ✓ | URL Matrix-сервера |
|
||||
| `MATRIX_USER_ID` | ✓ | `@bot:example.org` |
|
||||
| `MATRIX_PASSWORD` | ✓ | пароль (или `MATRIX_ACCESS_TOKEN`) |
|
||||
| `MATRIX_PLATFORM_BACKEND` | ✓ | `real` для продакшна |
|
||||
| `AGENT_BASE_URL` | ✓ | HTTP-URL агента, например `http://platform-agent:8000` |
|
||||
| `MATRIX_AGENT_REGISTRY_PATH` | ✓ | путь к реестру внутри контейнера: `/app/config/matrix-agents.yaml` |
|
||||
| `SURFACES_WORKSPACE_DIR` | | путь к shared volume в контейнере (по умолчанию `/agents`) |
|
||||
| `SURFACES_SHARED_VOLUME` | | имя Docker volume (по умолчанию `surfaces-agents`) |
|
||||
|
||||
```env
|
||||
# Matrix аккаунт бота
|
||||
MATRIX_HOMESERVER=https://matrix.example.org
|
||||
MATRIX_USER_ID=@lambda-bot:example.org
|
||||
MATRIX_PASSWORD=... # или MATRIX_ACCESS_TOKEN=...
|
||||
### Реестр агентов
|
||||
|
||||
# Выбор backend: mock (по умолчанию) или real (подключение к platform-agent)
|
||||
MATRIX_PLATFORM_BACKEND=real
|
||||
`config/matrix-agents.yaml` — статический маппинг пользователей на агентов:
|
||||
|
||||
# production handoff: bot connects to externally managed agent endpoint
|
||||
AGENT_BASE_URL=https://lambda.coredump.ru/agent_0/
|
||||
SURFACES_WORKSPACE_DIR=/agents
|
||||
SURFACES_SHARED_VOLUME=surfaces-agents
|
||||
```yaml
|
||||
user_agents:
|
||||
"@user0:matrix.lambda.coredump.ru": agent-0
|
||||
"@user1:matrix.lambda.coredump.ru": agent-1
|
||||
|
||||
# internal full-stack compose defaults
|
||||
AGENT_ID=matrix-dev
|
||||
|
||||
# platform-agent provider
|
||||
PROVIDER_MODEL=openai/gpt-4o-mini
|
||||
PROVIDER_URL=https://openrouter.ai/api/v1
|
||||
PROVIDER_API_KEY=...
|
||||
agents:
|
||||
- id: agent-0
|
||||
label: "Agent 0"
|
||||
- id: agent-1
|
||||
label: "Agent 1"
|
||||
```
|
||||
|
||||
### 3. Registry агентов
|
||||
Если `user_agents` не задан или пользователь не найден — используется первый агент из списка.
|
||||
|
||||
1. Скопируй `config/matrix-agents.example.yaml` в `config/matrix-agents.yaml`
|
||||
2. Если готовишься к multi-agent routing, добавь `MATRIX_AGENT_REGISTRY_PATH=config/matrix-agents.yaml` в `.env`
|
||||
3. Этот registry сейчас является конфигурационным артефактом Task 1; текущий Matrix runtime его ещё не читает
|
||||
|
||||
### 4. Compose artifacts
|
||||
|
||||
Production handoff uses `docker-compose.prod.yml`.
|
||||
Этот файл поднимает только `matrix-bot`, монтирует shared volume в `/agents` и ожидает, что `AGENT_BASE_URL`
|
||||
указывает на уже управляемый внешней платформой agent endpoint.
|
||||
### Production (bot-only)
|
||||
|
||||
```bash
|
||||
docker compose --env-file .env -f docker-compose.prod.yml up -d --build
|
||||
```
|
||||
|
||||
Internal full-stack E2E uses `docker-compose.fullstack.yml`.
|
||||
Этот файл поднимает `matrix-bot` вместе с локальным `platform-agent`, использует тот же shared volume
|
||||
(`SURFACES_SHARED_VOLUME`) и ждёт `service_healthy` вместо sleep-based sequencing.
|
||||
Поднимает только `matrix-bot`. Монтирует shared volume в `/agents`. Требует внешний `AGENT_BASE_URL`.
|
||||
|
||||
### Fullstack E2E (bot + agent)
|
||||
|
||||
```bash
|
||||
docker compose --env-file .env -f docker-compose.fullstack.yml up --build
|
||||
```
|
||||
|
||||
`docker-compose.fullstack.yml` собирает `platform-agent` из актуального upstream `external/platform-agent`
|
||||
(`development` target), монтирует live-код из `external/platform-agent/src` и `external/platform-agent_api`,
|
||||
а shared volume виден как `/agents` в bot container и как `/workspace` в `platform-agent`.
|
||||
Старый root compose harness остаётся только как historical local reference и больше не является рекомендуемым runtime path.
|
||||
Поднимает `matrix-bot` вместе с локальным `platform-agent`. `AGENT_BASE_URL` перекрывается на `http://platform-agent:8000`. Shared volume виден как `/agents` в боте и `/workspace` в агенте.
|
||||
|
||||
На `2026-04-21` локальный compose runtime использует vendored upstream-версии платформы без локальных патчей:
|
||||
|
||||
- `platform-agent`: `5e7c2df954cc3cd2f5bf8ae688e10a20038dde61`
|
||||
- `platform-agent_api`: `8a4f4db6d36786fe8af7feefffe506d4a54ac6bd`
|
||||
|
||||
### 4. Staged attachments в Matrix
|
||||
|
||||
Если Matrix-клиент отправляет файлы отдельными media events, бот не вызывает агента сразу.
|
||||
Вместо этого он сохраняет файлы в shared `/agents`, ставит их в очередь для конкретного чата и пользователя, и ждёт следующего обычного сообщения.
|
||||
|
||||
Как отправить файлы агенту:
|
||||
|
||||
1. Отправь один или несколько файлов в рабочую Matrix-комнату.
|
||||
2. При необходимости проверь очередь командой `!list`.
|
||||
3. Напиши обычное текстовое сообщение, например:
|
||||
- `что на изображении?`
|
||||
- `прочитай pdf и сделай summary`
|
||||
- `сравни эти два файла`
|
||||
4. Это сообщение уйдёт агенту вместе со всеми staged файлами из очереди.
|
||||
|
||||
Команды:
|
||||
|
||||
- `!list` — показать staged вложения
|
||||
- `!remove <n>` — удалить вложение по номеру
|
||||
- `!remove all` — очистить все staged вложения
|
||||
|
||||
Следующее обычное сообщение пользователя уходит агенту вместе со всеми staged файлами.
|
||||
|
||||
Пример:
|
||||
|
||||
```text
|
||||
[отправил 2 изображения]
|
||||
!list
|
||||
1. IMG_3183.png
|
||||
2. minion.jpeg
|
||||
|
||||
что изображено на фото
|
||||
```
|
||||
|
||||
В этом сценарии вопрос `что изображено на фото` будет отправлен агенту вместе с обоими файлами.
|
||||
|
||||
Важно:
|
||||
|
||||
- если после файлов отправить `!list` или `!remove`, агент не вызывается
|
||||
- если платформа вернула ошибку на этих вложениях, они остаются в staged-очереди
|
||||
- в таком случае следующее обычное сообщение снова попытается отправить те же файлы
|
||||
- чтобы разорвать этот цикл, используй `!remove <n>` или `!remove all`
|
||||
|
||||
Известное ограничение текущего platform-agent:
|
||||
|
||||
- большие изображения могут не пройти в provider из-за лимита на размер data URI
|
||||
- в таком случае Matrix-бот ответит `Сервис временно недоступен...`, а проблемные файлы останутся в очереди до явного удаления
|
||||
|
||||
### 5. Запуск бота вручную
|
||||
### Сброс состояния (локально)
|
||||
|
||||
```bash
|
||||
# Первый запуск или сброс состояния
|
||||
rm -f lambda_matrix.db && rm -rf matrix_store
|
||||
|
||||
PYTHONPATH=. uv run python -m adapter.matrix.bot
|
||||
```
|
||||
|
||||
### 6. Онбординг пользователя
|
||||
---
|
||||
|
||||
Напиши боту в **личные сообщения (DM)** на Matrix-сервере. Для поддерживаемого dev-сценария используй незашифрованную комнату: E2EE сейчас не считается поддержанным режимом для Matrix-поверхности.
|
||||
## Shared volume: передача файлов
|
||||
|
||||
Бот автоматически:
|
||||
1. Создаст private Space `Lambda — {твоё имя}`
|
||||
2. Создаст рабочую комнату `Чат 1` и пригласит туда
|
||||
```
|
||||
Bot (/agents) Agent (/workspace)
|
||||
└── surfaces/matrix/{user}/{room}/inbox/file ←── одно и то же хранилище
|
||||
```
|
||||
|
||||
Дальнейшее общение ведётся в рабочей комнате, не в DM.
|
||||
Бот пишет входящие файлы в `/agents/surfaces/matrix/{user}/{room}/inbox/{stamp}-{filename}` и передаёт агенту относительный путь. Исходящие файлы агент пишет в `/workspace/...`, бот читает из `/agents/...`.
|
||||
|
||||
---
|
||||
|
||||
## Функционал Matrix MVP
|
||||
## Онбординг пользователя
|
||||
|
||||
### Работает
|
||||
1. Пользователь приглашает бота в личные сообщения (DM) на Matrix-сервере
|
||||
2. Бот создаёт private Space `Lambda — {display_name}` и комнату `Чат 1`
|
||||
3. Дальнейшее общение — в рабочих комнатах, не в DM
|
||||
|
||||
| Функция | Команда | Примечание |
|
||||
|---|---|---|
|
||||
| Онбординг | *(автоматически при invite)* | Создаёт Space + рабочую комнату |
|
||||
| Новый чат | `!new` | Создаёт дополнительную комнату |
|
||||
| Список чатов | `!chats` | Активные чаты пользователя |
|
||||
| Переименование | `!rename <название>` | |
|
||||
| Архивация | `!archive` | |
|
||||
| Диалог с агентом | *(любое сообщение)* | Стриминг ответа через WebSocket |
|
||||
| Изоляция контекста | *(автоматически)* | Каждая комната получает отдельный `platform_chat_id` |
|
||||
| Сохранение контекста | `!save [имя]` | Агент сохраняет краткое резюме разговора |
|
||||
| Список сохранений | `!load` | Выбор по номеру |
|
||||
| Состояние контекста | `!context` | Текущая сессия и список сохранений |
|
||||
| Справка | `!help` | |
|
||||
| Подтверждения | `!yes` / `!no` | Для опасных действий |
|
||||
| Staged вложения | `!list`, `!remove <n>`, `!remove all` | Файлы без текстовой инструкции ставятся в очередь до следующего сообщения |
|
||||
|
||||
### Не работает — блокеры на стороне platform-agent
|
||||
|
||||
| Функция | Почему не работает |
|
||||
|---|---|
|
||||
| `!load` в другом чате | platform-agent использует `StateBackend` — файлы живут в памяти отдельно для каждого `thread_id`. Файл, сохранённый в чате A, не виден в чате B. Фикс: переключить platform-agent на `FilesystemBackend` с общим хранилищем. |
|
||||
| Стриминг после tool/file flow | В текущем upstream `platform-agent` первый `MsgEventTextChunk` иногда рождается уже обрезанным до попадания в websocket-клиент. Наш transport layer после cleanup максимально близок к upstream и больше не пытается локально “лечить” этот поток. Подробности и raw evidence: `docs/reports/2026-04-22-platform-streaming-final-bug-report-ru.md`. |
|
||||
| Счётчик токенов в `!context` | pinned `platform-agent_api.AgentApi` потребляет `MsgEventEnd` внутри клиента и не публикует `tokens_used` наружу. Сейчас `surfaces` честно показывает `0`, пока upstream не добавит поддержанный способ получить это значение. |
|
||||
| `!reset` | platform-agent не имеет endpoint `/reset`. Задокументировано в ТЗ к платформе. |
|
||||
| Персистентность между рестартами | platform-agent использует `MemorySaver` (in-memory). Все разговоры теряются при рестарте процесса. |
|
||||
| E2EE комнаты | `python-olm` не собирается на macOS/ARM. Ограничение инфраструктуры. |
|
||||
|
||||
### Не работает — пока не реализовано нами
|
||||
|
||||
| Функция | Статус |
|
||||
|---|---|
|
||||
| `!settings`, `!skills`, `!soul`, `!safety` | Заглушки MVP. Требуют готового SDK платформы. |
|
||||
| Вложения без текстовой инструкции | Поддержан staged UX только для Matrix. Для других поверхностей ещё не перенесено. |
|
||||
**Требование:** незашифрованные комнаты. E2EE не поддержан.
|
||||
|
||||
---
|
||||
|
||||
## Команды Matrix
|
||||
|
||||
### Работающие
|
||||
|
||||
| Команда | Действие |
|
||||
|---|---|
|
||||
| *(любое сообщение)* | Диалог с агентом, стриминг ответа |
|
||||
| `!new [название]` | Создать новый чат |
|
||||
| `!chats` | Список активных чатов |
|
||||
| `!rename <название>` | Переименовать текущую комнату |
|
||||
| `!archive` | Архивировать чат |
|
||||
| `!clear` | Сбросить контекст текущего чата |
|
||||
| `!yes` / `!no` | Подтвердить / отменить действие агента |
|
||||
| `!list` | Файлы в очереди вложений |
|
||||
| `!remove <n>` / `!remove all` | Удалить вложение из очереди |
|
||||
| `!help` | Справка |
|
||||
|
||||
### Не работают / заглушки
|
||||
|
||||
| Команда | Статус |
|
||||
|---|---|
|
||||
| `!save` / `!load` / `!context` | Нестабильны: зависят от агента, сессии теряются при рестарте |
|
||||
| `!settings` и подкоманды | Заглушки MVP, требуют готового SDK платформы |
|
||||
|
||||
---
|
||||
|
||||
## Отправка файлов агенту
|
||||
|
||||
Matrix-клиент отправляет файлы и текст отдельными событиями. Файл без текстовой инструкции ставится в очередь.
|
||||
|
||||
```
|
||||
[отправил файл]
|
||||
!list
|
||||
1. report.pdf
|
||||
|
||||
прочитай и сделай summary ← файл уйдёт агенту вместе с этим текстом
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Известные ограничения
|
||||
|
||||
| Проблема | Причина |
|
||||
|---|---|
|
||||
| История теряется при рестарте агента | `platform-agent` использует `MemorySaver` (in-memory) |
|
||||
| E2EE | `python-olm` не собирается на macOS/ARM |
|
||||
|
||||
---
|
||||
|
||||
## Разработка
|
||||
|
||||
```bash
|
||||
uv sync
|
||||
pytest tests/ -v
|
||||
pytest tests/adapter/matrix/ -v # только Matrix
|
||||
```
|
||||
|
||||
## Документация
|
||||
|
||||
| Файл | Содержание |
|
||||
|---|---|
|
||||
| [`docs/surface-protocol.md`](docs/surface-protocol.md) | Унификация поверхностей — все структуры, как добавить новую поверхность |
|
||||
| [`docs/telegram-prototype.md`](docs/telegram-prototype.md) | Функционал Telegram прототипа |
|
||||
| [`docs/matrix-prototype.md`](docs/matrix-prototype.md) | Функционал Matrix прототипа |
|
||||
| [`docs/api-contract.md`](docs/api-contract.md) | Контракт к SDK платформы |
|
||||
| [`docs/user-flow.md`](docs/user-flow.md) | FSM и user journey |
|
||||
| [`docs/claude-code-guide.md`](docs/claude-code-guide.md) | Гайд по работе с Claude Code |
|
||||
| [`docs/reports/2026-04-22-platform-streaming-final-bug-report-ru.md`](docs/reports/2026-04-22-platform-streaming-final-bug-report-ru.md) | Финальный аудит platform streaming bug после cleanup transport layer |
|
||||
|
||||
---
|
||||
|
||||
## Команда
|
||||
|
||||
Поверхности и интеграции
|
||||
Lambda Lab 3.0, МАИ
|
||||
| [`docs/deploy-architecture.md`](docs/deploy-architecture.md) | **Читать первым.** Топология деплоя, volume-контракт, AgentApi, конфигурация |
|
||||
| [`docs/matrix-prototype.md`](docs/matrix-prototype.md) | Команды бота, UX, передача файлов |
|
||||
| [`docs/known-limitations.md`](docs/known-limitations.md) | Известные ограничения и обходные пути |
|
||||
| [`docs/surface-protocol.md`](docs/surface-protocol.md) | Внутренний протокол событий (для расширения) |
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue