Files
obsidian-vault/personal/plans/balda-remote-agent.md
T

90 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Balda — удалённый агент по SSH
Обновлено: **2026-10-18**.
Отдельный проект доступа к папкам: [[personal/plans/workspace-gateway|Workspace Gateway]], `/Users/admin/Developer/workspace-gateway`, начальный коммит `2bc6743`.
Дополнительная проверка SSH и Seatbelt: [[personal/projects/balda/ssh-seatbelt-2026-10-18]].
Исходная задача: Balda работает с оригинальными Prism/Beads по подключённым проектам и запускает штатного агента в другой среде; подключение нового репозитория требует подтверждения владельца.
Проверка: [[personal/projects/balda/ssh-acp-verification-2026-10-18]].
Рабочая установка: [[personal/projects/balda/setup]].
## Принятая граница
Максимально использовать штатный стек Balda: провайдеры ACP, сессии, управление задачами, MCP, skills и подтверждения.
Prism, Prism Callee, Callee и Beads — оригинальные, с сохранением их собственных контрактов.
```text
Balda → штатный generic_acp → ssh -T → штатный ACP-агент в другой среде
```
Единый способ связи — SSH: контейнер, VM или физический хост отличаются окружением, а не протоколом запуска.
macOS-окружения предоставляет Virfield через его MCP.
Штатный агент выполняет работу в выданном workspace; Balda сохраняет управление беседой и сессией.
## Что проверено
- [x] Штатная фабрика Balda запускает `ssh` через `generic_acp.cmd` и передаёт ACP.
- [x] Реальный OpenCode создаёт и возобновляет сессию после повторного SSH.
- [x] Контрольный ACP-агент получает штатное решение Balda разрешить или отклонить действие.
- [x] Контрольный удалённый агент вызывает настоящий MCP-инструмент.
- [x] Штатные тесты Balda подтверждают Mattermost review, защиту от чужого ответа и timeout.
- [x] Воспроизведены локальная проверка cwd и требования к достижимости MCP.
Для передачи ACP новая реализация `broker-acp` не требуется: базовый путь уже проверен.
Дополнительный код допустим только для конкретного воспроизведённого пробела интеграции; прикладные сценарии и учёт фаз Prism остаются в штатном стеке.
## Следующие конкретные действия
1. Я реализую и приму Workspace Manager (проект `workspace-gateway`) в отдельном проекте: настраиваемые именованные корни (`developer`, `downloads` и другие), листинг и поиск папок по имени без файлов, подключение после подтверждения владельца, отключение и временный лизинг; сетевая файловая система обеспечит одни и те же исходные файлы Balda и агентам без перезапуска Balda при каждой выдаче. Указание корня в конфиге разрешает обнаружение папок, но не выдаёт доступ ко всем его файлам.
2. Я настрою авторизованный SSH из контейнера в реальные среды, проверку host key, ограниченные credentials и штатный `generic_acp` с командой SSH; доступность порта и проверка протокола уже подтверждены, рабочая авторизация ещё не принята.
3. Я настрою запуск агентов и обычных команд на Mac под Seatbelt, начиная со штатных sandbox и готового `anthropics/sandbox-runtime`, и проверю запрет доступа к соседним проектам, секретам и обхода через другой SSH command.
4. Я настрою согласованные пути workspace, достижимые MCP, оригинальные skills/tools и единое состояние Beads для Balda и одновременных агентов, затем включу запросы разрешений у агентов и штатный `ask` Balda.
5. Я проведу реальную приёмку выбранных Codex/Claude/OpenCode и оригинального Prism: статус проекта, подтверждение и отказ, выполнение, отмена, продолжение сессии и прекращение доступа после отзыва или истечения лизинга.
Это оставшаяся работа, а не уже выполненный deployment.
SSH/Seatbelt/ACP и настройка Beads не расширяют четыре функции Workspace Gateway.
## Что подтверждено дополнительно
- Docker работает через Colima, а не Docker Desktop.
- Из основного контейнера получены SSH banners Mac и внешнего GitHub на TCP/22; логин и команды при этом не выполнялись.
- Seatbelt на Mac 26.7.1 реально заблокировал чтение и запись в контрольную папку, в том числе дочерним shell; это не готовый production профиль.
- Документация Beads описывает Dolt server mode для нескольких одновременных записывающих агентов: [первичный источник](https://github.com/gastownhall/beads/blob/main/docs/architecture/index.md).
- Политика файлов и сети для реальных агентов, native approvals и полная работа Prism остаются открытыми.
## Права и репозитории
Подтверждение подключения репозитория, подтверждение действия агента и файловая изоляция — три отдельные проверки.
Агент не получает полномочий самостоятельно выдавать себе доступ к новому проекту.
Весь каталог `Developer` не передаётся Balda или исполнителю.
Исходная БД Beads соответствующего проекта остаётся источником статусов; Git-клон сам по себе не доказывает наличие актуального состояния Beads.
Механизм выдачи доступа к реальным проектам и их БД ещё требует настройки и приёмки.
## Текущее состояние и границы
Основная Balda получила оригинальные Prism/Prism Callee, `bd`, Callee и прямой Virfield MCP; это установка инструментов, а не приёмка удалённого исполнения.
В рабочем конфиге остаётся `permissions.mode: allow_all`; SSH-проверка production-конфиг, историю и авторизацию не меняла.
Полный Prism lifecycle с моделью и реальные удалённые Claude/Codex этой проверкой не приняты.
Новый сервис создаётся в отдельном проекте `workspace-gateway`; его объём ограничен четырьмя функциями доступа к папкам.
Прежняя ветка `broker-rebuild` в `/Users/admin/.codex/worktrees/broker-rebuild/execution-broker` — оставшийся каркас предыдущего обсуждения, а не место реализации Workspace Gateway.
Старые `execution-broker`, `execution-prism` и plugin остаются в действующей Balda; очистка новой ветки не удаляла их из deployment.
Историческая приёмка прежнего брокера: [[personal/plans/balda-callee-prism-plan]].
## Выполнение 2026-10-18 — промежуточный журнал
- Создан отдельный Git-проект `/Users/admin/Developer/ssh-manager`, исходники и README записаны. Учёт настроенных оператором хостов/пользователей/проверенных public host keys, отдельная Ed25519-идентичность, `ssh_config`/`known_hosts`, ProxyJump, подтверждение регистрации/удаления управляемой строки authorized_keys через штатный MCP elicitation. Private key не возвращается инструментами; bootstrap credentials остаются у оператора.
- Relay-ключ ограничен штатными OpenSSH options, `/usr/bin/false` запрещает shell, `permitopen` ограничивает переход заданными адресами. Execution до принятой файловой изоляции отвергается. Это каркас подготовки доступа; **production Mac/VM ещё не авторизованы и удалённые реальные агенты не приняты**.
- Существующие пользовательские SSH-ключи и authorized_keys не менялись. Отдельный sshd на loopback-порту с fixture-файлом подтвердил вход по закреплённому ключу, отказ при подмене host key и отказ нового входа после удаления fixture-ключа. Полный ProxyJump и production SSH/ACP остаются открытыми.
- SSH Manager: `go test -race ./...`, `go vet ./...`, сборка — успешно. Настоящий stdio MCP отдал 6 инструментов; отказ через elicitation остановил регистрацию. Локальная HTTP-авторизация и Host allowlist приняты; Colima получила 401 без токена. HTTP-порт подготовки `17796`; 7796 занят прежним Broker.
- Готовый `@anthropic-ai/sandbox-runtime@0.0.80` установлен только в тестовый каталог. Проверка на Mac прошла: разрешённая папка читается/пишется, соседняя закрыта, открытие SSH private key блокируется без чтения его содержимого, ограничения наследуются дочерним shell, SSH-обход блокируется. **Это тестовый профиль, не приёмка Codex/Claude/OpenCode с реальными авторизациями и сетью.**
- Подготовлена отдельная копия конфига Balda: `permissions.mode: ask`, MCP Workspace/SSH Manager, отдельный профиль `workspace-setup` на штатном Codex, существующий pool не изменён. `balda --profile workspace-setup validate` в новом одноразовом контейнере завершился exit 0; provider runtime/модели/каналы не запускались. Это проверка конфигурации, не preflight или сквозной Prism.
- Копия конфига, приватный env новых manager-токенов, оригинальный backup и отчёты находятся в `/Users/admin/Docker/balda-mm-mac/state/workspace-setup-20261018`. Внешние сообщения не отправлялись. Рабочая Balda не переключалась; перезапуск остаётся отдельным подтверждаемым действием после реальной приёмки.
- При автоматической проверке был отклонён тест с передачей manager-токенов в отдельный Python Docker-образ. Его заменили безопасной проверкой: токены остаются в локальных Mac-процессах; контейнер проверяет только достижимость/401 без авторизации. Аутентифицированный вызов из Balda ещё открыт.
- Ближайшая зависимость: полный fixture-тест штатного NFS (`sudo /opt/homebrew/bin/python3 /private/tmp/workspace-setup-20261018/nfs-admin.py test`). Файловый backend, реальный отзыв открытых дескрипторов, согласованные mounts, общий Beads/Dolt и полный Prism/удалённые агенты не заявляются выполненными.
### Дополнительная приёмка SSH Manager: реальный ProxyJump
`/private/tmp/workspace-setup-20261018/ssh-jump-acceptance.py` запустил два настоящих локальных sshd, получил отдельный public key и клиентский конфиг через настоящий stdio MCP SSH Manager и проверил SSH roundtrip через ProxyJump. Четыре проверки успешны: roundtrip; отказ shell на relay; отказ forwarding к незаданному адресу (подтверждён журналом sshd); отклонение подменённого host key конечного сервера через jump. Менеджер использовал обычный OpenSSH, без нового транспортного launcher. Пользовательский `.ssh` и системный sshd не менялись, тестовые sshd остановлены. Это приёмка транспорта/конфига на локальных fixture-серверах, не production авторизация Mac/VM и не ACP с моделями. Отчёт: `/private/tmp/workspace-setup-20261018/ssh-jump-acceptance.json`.