diff --git a/RESEARCH.md b/RESEARCH.md new file mode 100644 index 0000000..9d59874 --- /dev/null +++ b/RESEARCH.md @@ -0,0 +1,357 @@ +# Team Board — Research: Agent Integration + +Исследование возможностей подключения AI-агентов к Team Board. + +--- + +## Текущие возможности OpenClaw + +### 1. sessions_spawn — спавн изолированных субагентов + +``` +Task → Spawn → Isolated Session → Result → Announce back +``` + +**Параметры:** +- `task` (required) — задача для агента +- `label` — метка для логов +- `agentId` — ID агента (если разрешён в allowlist) +- `model` — переопределение модели +- `runTimeoutSeconds` — таймаут +- `cleanup` — `delete|keep` + +**Поведение:** +- Создаёт новую сессию `agent::subagent:` +- Субагенты имеют полный набор инструментов минус session tools +- Не блокирует: возвращает `{ status: "accepted", runId, childSessionKey }` +- После завершения — announce в исходный чат + +--- + +### 2. sessions_send — отправка между сессиями + +``` +Agent A → sessions_send → Agent B → Response +``` + +**Параметры:** +- `sessionKey` (required) +- `message` (required) +- `timeoutSeconds` — 0 = fire-and-forget + +**Поведение:** +- Поддерживает ping-pong между агентами (до 5 итераций) +- Контекст сохраняется +- Провenance маркируется как `inter_session` + +--- + +### 3. sessions_list / sessions_history + +- Список активных сессий +- История сообщений сессии +- Фильтры по типу, времени, каналу + +--- + +### 4. Multi-Agent Routing + +Несколько агентов в одном gateway: + +```yaml +agents: + list: + - id: main + workspace: ~/.openclaw/workspace + - id: coder + workspace: ~/projects/coder-workspace + - id: reviewer + workspace: ~/projects/reviewer-workspace +``` + +**Каждый агент имеет:** +- Свой workspace (файлы, AGENTS.md, SOUL.md) +- Свой state directory +- Своё хранилище сессий +- Свои auth profiles + +--- + +### 5. ACP (Agent Client Protocol) + +Стандартный протокол для подключения внешних агентов. + +``` +External Agent ↔ ACP ↔ OpenClaw Gateway +``` + +**Реализация в OpenClaw:** +- `src/acp/server.ts` — ACP сервер +- `src/acp/client.ts` — ACP клиент +- Использует `@agentclientprotocol/sdk` + +**Dangerous tools требуют approval:** +- exec, spawn, shell +- sessions_spawn, sessions_send +- gateway +- fs_write, fs_delete, fs_move + +--- + +## Варианты интеграции для Team Board + +### Вариант 1: OpenClaw Multi-Agent (рекомендуется) + +``` +Team Board API + ↓ +OpenClaw Gateway + ↓ +┌─────────────────────────────────┐ +│ Agent: main (Lead) │ +│ Agent: coder (Developer) │ +│ Agent: reviewer (QA) │ +│ Agent: analyst (Research) │ +└─────────────────────────────────┘ +``` + +**Плюсы:** +- Готовая инфраструктура +- Сохранение контекста через сессии +- Единый API +- Безопасность (sandbox, permissions) +- Инструменты (exec, browser, files) + +**Реализация:** +1. Добавить агентов в `openclaw.json` +2. Team Board вызывает `sessions_spawn` / `sessions_send` через Gateway API +3. Результаты через webhook или polling + +**Конфиг:** +```json +{ + "agents": { + "list": [ + { + "id": "main", + "workspace": "~/.openclaw/workspace" + }, + { + "id": "coder", + "workspace": "~/workspaces/coder", + "model": "anthropic/claude-sonnet-4-20250514" + } + ], + "defaults": { + "subagents": { + "allowAgents": ["main", "coder", "reviewer"] + } + } + } +} +``` + +--- + +### Вариант 2: ACP Bridge для CLI агентов + +Для подключения Claude Code CLI без траты API токенов. + +``` +Claude Code CLI (Max subscription) + ↓ +ACP Client Wrapper + ↓ +OpenClaw Gateway + ↓ +Team Board +``` + +**Компоненты:** + +1. **PTY Session Manager** +```python +import pexpect + +class CliSession: + def __init__(self, command="claude"): + self.child = pexpect.spawn(command) + + def send(self, message: str) -> str: + self.child.sendline(message) + self.child.expect(r'\n>') # wait for prompt + return self.child.before.decode() +``` + +2. **ACP Translator** +```python +class AcpCliBridge: + def handle_request(self, request): + response = self.cli_session.send(request.message) + return AcpResponse(content=response) +``` + +**Сложности:** +- CLI интерактивный, не headless +- Нужно парсить вывод +- Контекст внутри CLI сессии + +--- + +### Вариант 3: Direct API + Context Store + +Прямые вызовы API с хранением контекста в БД. + +``` +Team Board + ↓ +Agent Service + ↓ +┌──────────────────────────────────┐ +│ Claude API │ Codex │ Gemini │ +└──────────────────────────────────┘ + ↓ +Context Store (PostgreSQL) +``` + +**Схема контекста:** +```sql +CREATE TABLE agent_contexts ( + id UUID PRIMARY KEY, + agent_id UUID REFERENCES agents(id), + session_id UUID REFERENCES sessions(id), + messages JSONB, -- история сообщений + metadata JSONB, -- system prompt, tools, etc. + created_at TIMESTAMPTZ, + updated_at TIMESTAMPTZ +); +``` + +**При каждом запросе:** +1. Загрузить контекст из БД +2. Добавить новое сообщение +3. Вызвать API с полным контекстом +4. Сохранить ответ в БД + +--- + +## Web Terminal Interface + +### Архитектура + +``` +Browser (xterm.js) + ↓ WebSocket +Team Board Frontend + ↓ WebSocket +Team Board Backend (Session Manager) + ↓ PTY / API +Agent (OpenClaw / CLI / API) +``` + +### Компоненты + +**Frontend:** +- xterm.js — терминальный эмулятор +- WebSocket клиент +- Session selector UI + +**Backend:** +- WebSocket сервер +- Session Manager +- PTY spawner (для CLI агентов) +- OpenClaw Gateway client (для OpenClaw агентов) + +### Пример кода (Backend) + +```python +from fastapi import WebSocket +import asyncio + +class AgentSessionManager: + def __init__(self): + self.sessions = {} + + async def create_session(self, agent_type: str, config: dict): + if agent_type == "openclaw": + return OpenClawSession(config) + elif agent_type == "cli": + return CliSession(config) + elif agent_type == "api": + return ApiSession(config) + + async def handle_websocket(self, ws: WebSocket, session_id: str): + session = self.sessions[session_id] + + async for message in ws.iter_text(): + response = await session.send(message) + await ws.send_text(response) +``` + +--- + +## Сравнение вариантов + +| Критерий | OpenClaw Multi-Agent | ACP CLI Bridge | Direct API | +|----------|---------------------|----------------|------------| +| Сложность | Низкая | Высокая | Средняя | +| Контекст | ✓ Автоматический | ✓ В CLI | Ручной | +| Инструменты | ✓ Полный набор | ✓ CLI tools | ✗ Нет | +| API токены | Нужны | Не нужны (Max) | Нужны | +| Готовность | Сейчас | Требует разработки | Требует разработки | + +--- + +## Рекомендуемый план + +### Фаза 1: OpenClaw Multi-Agent (быстрый старт) + +1. Добавить агентов в конфиг OpenClaw +2. Team Board API вызывает Gateway +3. Использовать `sessions_spawn` для задач +4. Использовать `sessions_send` для коммуникации + +**Результат:** Рабочая система с несколькими агентами + +### Фаза 2: Web Terminal UI + +1. xterm.js на фронте +2. WebSocket сервер +3. Прямое взаимодействие с агентами + +**Результат:** Terminal-like опыт в браузере + +### Фаза 3: ACP CLI Bridge (опционально) + +1. PTY wrapper для Claude Code CLI +2. ACP транслятор +3. Интеграция с Gateway + +**Результат:** CLI агенты без API токенов + +--- + +## Открытые вопросы + +1. **Headless mode в Claude Code CLI?** + - Нужно проверить `claude --help` + - Возможно есть `--message` или `--non-interactive` + +2. **Как шарить файлы между агентами?** + - Общий workspace? + - Git как source of truth? + - Копирование через API? + +3. **Rate limiting для API агентов?** + - Очередь задач + - Приоритеты + - Backoff при ошибках + +4. **Мониторинг агентов?** + - Статус (idle/working/error) + - Использование токенов + - Время выполнения + +--- + +*Документ обновляется по мере исследования.*