Рабочие среды (Workspaces)
Персональный контейнер на воркспейс — файлы, терминал, preview. Как v0 и Claude Code, только под ваших агентов.
v0/Claude Code-flow внутри AGONTS. У каждого воркспейса — свой постоянный контейнер с файловой системой, терминалом и preview-иконкой. Агент пишет код, запускает dev-сервер, показывает результат в iframe.
Что это
Workspace — Docker-контейнер под ваш tenant, созданный по запросу и живущий, пока вы с ним работаете. Внутри:
/workspace— постоянный каталог. Сохраняется на хосте в/srv/agonts-workspaces/{tenantId}/, переживает перезагрузки контейнера.- bash / node / bun / python3 — готовые рантаймы.
- Read-only rootfs + tmpfs — корень контейнера нельзя менять;
/tmp,/home/node,/run— tmpfs (RAM). - Egress firewall — сетевой исход запрещён к IMDS (AWS/GCP метадата), к API-контейнеру напрямую и к 100.64/10. Интернет наружу — открыт.
Workspace — не sandbox для недоверенного кода. Это persistent среда под одного tenant. Не делите воркспейс между проектами, если не хотите, чтобы они видели файлы друг друга.
UI
Чат-страница делится на две панели:
- Слева — тред с агентом.
- Справа — панель воркспейса с тремя вкладками:
- Files — дерево, inline редактор CodeMirror 6 (JS/TS/Python/HTML/CSS/MD/JSON), Cmd/Ctrl-S + автосейв через 1.5s.
- Preview — iframe на ваш dev-сервер через reverse-proxy, Copy URL / Open ↗, auto-reload по Save + Exec.
- Terminal —
bash -lc, ↑/↓ для истории, stdout/stderr в логе.
Ресайзер между панелями — тяните, двойной клик — сброс. Ширина пишется
в cookie agonts-ws-panel-width.
Тарифы и лимиты
Prop
Type
CPU-минуты считаются за календарный месяц: при превышении квоты
/container/ensure вернёт HTTP 402 и UI-бейдж NNm / capm
покраснеет.
Как агент этим пользуется
Агент получает набор инструментов workspace___*. Они внутренние —
модель сама решает, когда их звать.
workspace___write_file({ path, content })— создаёт/перезаписывает файл внутри/workspace.workspace___read_file({ path })— читает файл.workspace___list_dir({ path })— листает каталог (дерево через опциюrecursive).workspace___delete({ path })— удаляет файл или каталог.
Пути — относительные к /workspace. ../ блокируется safeRelPath.
workspace___boot()— стартует контейнер (если его нет). ~3s cold start, ~600ms warm.workspace___run({ command, cwd?, detach? })— выполняетbash -lc "<command>". Сdetach: trueзапускается черезdocker exec -d— процесс переживает конец запроса.
workspace___serve_port({ port, command })— запускает сервис в фоне, проверяет, что порт слушает, возвращает preview-URL.workspace___dev_server({ port?, startCommand? })— one-shot: определяет стек (bun.lock/pnpm/yarn/npm, pyproject/requirements, go.mod), ставит зависимости, поднимает dev-сервер, дожидается порта, отдаёт URL. Используется один раз после скафолдинга.
Preview-прокси
Каждый воркспейс получает уникальный URL вида:
https://ag0nts.xyz/api/_api/workspaces/{workspaceId}/proxy/{port}/...API форвардит запросы в контейнер на указанный порт. Перед форвардом
стрипятся Cookie, X-Workspace-Id, все X-Forwarded-* — чтобы
tenant-процесс не получил ваш auth-токен.
HTTP API
Все эндпоинты — под /workspaces/:id/*, гейтятся assertMember.
Только участники воркспейса могут бить эти маршруты.
Prop
Type
Безопасность
- read-only rootfs + drop ALL capabilities +
no-new-privileges. - tmpfs-овые
/tmp,/home/node,/runмасштабируются по тарифу. - egress firewall на docker bridge (
AGONTS_WSchain вDOCKER-USER). - pid / nproc / nofile ulimits — 128 / 128 / 1024 соответственно.
- Пути в tools через
safeRelPath—../не проходит.
Типичный флоу
# 1. Пустой воркспейс, агент создаёт файлы
workspace___write_file({ path: 'index.html', content: '<h1>hi</h1>' })
# 2. Поднимаем preview
workspace___serve_port({
port: 8080,
command: 'python3 -m http.server 8080'
})
# → returns preview URL, iframe в UI обновляется
# 3. Итерируем
workspace___write_file({ path: 'index.html', content: '<h1>hello</h1>' })
# auto-reload через ?__t=N в iframeFAQ
Q: Что будет с файлами, если контейнер упадёт?
Всё, что записано в /workspace, остаётся на хосте. При следующем
ensure — поднимется со всеми файлами. Остальные пути (tmpfs) — теряются.
Q: Можно ли дать агенту доступ к внешнему API? Да. Egress в интернет открыт. Заблокирован только IMDS и наш API.
Q: Сколько контейнеров живёт одновременно? По одному на воркспейс. Idle-таймер останавливает простаивающие (free: 15 мин, starter: 1 ч, pro: 6 ч).
Q: Как снять snapshot состояния?
Автоматически ночью — per-tenant tar.gz в MinIO
(см. workspaces/{tenantId}/snapshots/). Ручной restore — через UI.