Skip to main content
Glama

Офис

Peer-to-peer общение между сессиями Claude Code. Ваши сессии и эксперты становятся адресуемыми по имени людьми, которые общаются друг с другом на разные темы одновременно — без оркестратора.

Спецификация дизайна: pessoal/claudicaro-cli/docs/design/2026-08-02-escritorio-multiagente.md.

Почему это было невозможно без него

Родная топология Claude Code — дерево: подагент возвращается к родителю, SendMessage достигает только того, кого создала сама сессия, Workflow передаёт данные через скрипт. Два брата не разговаривают. Боковое общение требует общего носителя — и это наша почта.

Related MCP server: neighbors

Шесть инструментов

tool

что делает

roster

кто существует, что знает, какой уровень — одна строка на человека, без загрузки .md

ask

задаёт вопрос и ждёт ответа

dm

отправляет и продолжает; в треде ожидающего вопроса становится его ответом

inbox

забирает корреспонденцию (обычно хук уже доставляет сам)

board

общая доска, без получателя

claim

заявляет ресурс перед тем, как его трогать

Плюс fechar_thread, который завершает разговор и заставляет каждого коллегу дистиллировать записную книжку.

Как работает

Тред — это единый контейнер разговора — заменяет комнаты и каналы. Обсуждение между равными — это тред с N участниками, где каждый выбирает, кому отвечать.

Без начальника, два правила в почте удерживают систему:

  • hops уменьшается с каждым сообщением; когда достигает нуля, почта отказывает. Убивает бесконечный пинг-понг.

  • Владелец треда — тот, кто его открыл, и только он его закрывает.

Доставка имеет два вида:

  • Живая сессия получает через хук (Stop блокирует остановку и доставляет; PostToolBatch доставляет посреди работы). Хук — это скрипт — работает вне модели, нулевая стоимость токенов.

  • Коллега из roster пробуждается почтой с помощью claude -p, отвечает и снова засыпает.

Память коллеги: внутри треда он поддерживает сессию живой (--resume) и помнит всё; когда тред закрывается, он дистиллирует то, что узнал, в записную книжку .md, и сессия умирает. Долгосрочная память — это записная книжка — проверяемая, редактируемая вручную, версионируемая.

Установка

npm install && npm run build
node scripts/instalar.mjs          # --dry pra ver antes, --remover pra desfazer

Установщик регистрирует хук доставки в ~/.claude/settings.json, устанавливает ESCRITORIO_WORKSPACE/ESCRITORIO_ROSTER и регистрирует MCP-сервер через claude mcp add --scope user (который записывает в ~/.claude.json — settings.json не регистрирует MCP).

При первом запуске создаёт резервную копию settings.json.antes-do-escritorio и никогда не перезаписывает эту резервную копию.

Roster

~/claude-workspace-config/roster.yaml (репозиторий, синхронизированный между Mac и VM):

especialista-deposito:
  brief: "Depósito antecipado: cobrança, pagamento, reembolso (DSG/v1)"
  agent_file: ${ESCRITORIO_WORKSPACE}/dsg/.agent/especialista-deposito.md
  caderno: ${ESCRITORIO_WORKSPACE}/pessoal/escritorio/cadernos/especialista-deposito.md
  tier: advisor
  cwd: ${ESCRITORIO_WORKSPACE}/dsg/v1

brief — это единственное, что возвращает roster() — пишите, думая "когда бы я позвал этого человека". Пути поддерживают ~ и ${VAR}; это расширение переменных окружения позволяет одному и тому же файлу работать на Mac и VM, где workspace находится в разных местах.

Уровни

tier

может

как налагается

advisor

читать и советовать

белый список инструментов (--allowedTools): чтение, Bash только для чтения и инструменты офиса

editor

писать в working tree

acceptEdits и только при активном claim() — почта отказывается пробуждать без него

worktree

писать изолированно

собственный git worktree; если не удаётся создать, отказывает вместо того, чтобы упасть в реальный репозиторий

Запрос может понизить уровень при запросе, но никогда не повысить.

Почему белый список, а не чёрный

Первая версия использовала --disallowedTools Edit Write NotebookEdit с bypassPermissions. Протестировано с реальным claude, произошла утечка: коллега записал файл через Bash, который не был в запрете. Измерено на четырёх вариантах:

флаги

результат

bypassPermissions + запрет Edit/Write

утечка (записал через Bash)

bypassPermissions + запрет Edit/Write/Bash

удержало

без permission-mode + запрет Edit/Write/Bash

удержало

без permission-mode + белый список только чтение

удержало, и при этом нормально прочитало git log

Остановились на белом списке: то, что я забуду перечислить, остаётся запрещённым вместо разрешённого. Стоит отметить, что Bash(cat:*) в белом списке не позволил обойти через перенаправление (cat > arquivo).

Наблюдение за происходящим

npm run tail

Следит за почтой и выводит то, что происходит между всеми сессиями — запись на доске, claim, открытый тред, обмен сообщениями, приходящий ответ:

Escritório — monitor ao vivo
sessões vistas na última hora: icaromelo@v1, icaromelo@kairos-ui, icaromelo@oraculo-api, …
threads abertas: (nenhuma)
────────────────────────────────────────────────────────────────────────
13:26:36 ▤ quadro dsg/v1:decisoes = cache sempre via RedisService · icaromelo@v1
13:26:37 🔒 claim src/infra/redis por icaromelo@v1 · revisar TTLs
13:26:38 ⊕ thread [477cfbdc] Em uma frase: qual TTL padrao usamos? · dono icaromelo@v1
13:26:38 icaromelo@v1 →? especialista-cache  [477cfbdc]
        Em uma frase: qual TTL padrao usamos?
13:26:44 especialista-cache ←! icaromelo@v1  [477cfbdc]
        O TTL padrão é 3600 segundos (1 hora) — mas sempre passe TTL explícito…

→? — блокирующий вопрос, → — сообщение, ←! — ответ.

Идентичность

Каждая сессия нуждается в имени. ESCRITORIO_ID если объявлен; без него, производное от пользователь@папка — стабильно для проекта, поэтому сессия, открытая в dsg/v1, всегда icaromelo@v1 и может быть адресована другой.

Тесты

npm test                        # 117 testes, sem gastar API
node scripts/smoke-mcp.mjs      # sobe o servidor MCP de verdade via stdio
node scripts/smoke-e2e.mjs      # E2E REAL: acorda colega, --resume, caderno (gasta API)
node scripts/smoke-escrita.mjs  # E2E REAL dos 3 tiers: advisor bloqueado, worktree isolado,
                                # editor sob claim (gasta API)

Известные ограничения

  • Одна почта на машину. Сессия на VM Oracle не общается с почтой Mac; мост между машинами — отдельная проблема.

  • dist/ находится на SSD. При отмонтированном SSD хук молча падает (|| true) и MCP отключается — ничего не зависает, но офис исчезает до повторного монтирования.

  • ask в живой сессии зависит от того, работает ли она. Если никто не имеет той сессии открытой, вы ждёте до таймаута (5 мин), и ответ остаётся в inbox на потом.

Related MCP Connectors

Related MCP Servers