@openparachute/agent 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.parachute/module.json +124 -8
- package/LICENSE +2 -16
- package/README.md +118 -166
- package/package.json +32 -43
- package/scripts/spawn-agent.ts +371 -0
- package/src/_parked/interactive-spawn.test.ts +324 -0
- package/src/_parked/interactive-spawn.ts +701 -0
- package/src/agent-defs.test.ts +1504 -0
- package/src/agent-defs.ts +1702 -0
- package/src/agent-mcp-config.test.ts +115 -0
- package/src/agent-mcp-config.ts +115 -0
- package/src/agents.test.ts +360 -0
- package/src/agents.ts +379 -0
- package/src/auth.test.ts +46 -0
- package/src/auth.ts +140 -0
- package/src/backends/attached-queue.test.ts +376 -0
- package/src/backends/attached-queue.ts +372 -0
- package/src/backends/programmatic.test.ts +1715 -0
- package/src/backends/programmatic.ts +927 -0
- package/src/backends/registry.test.ts +1494 -0
- package/src/backends/registry.ts +1202 -0
- package/src/backends/stream-json.test.ts +570 -0
- package/src/backends/stream-json.ts +392 -0
- package/src/backends/types.ts +223 -0
- package/src/bridge.ts +417 -0
- package/src/channel-backend-wiring.test.ts +237 -0
- package/src/credentials.test.ts +274 -0
- package/src/credentials.ts +380 -0
- package/src/cron.test.ts +342 -0
- package/src/cron.ts +380 -0
- package/src/daemon-agent-def-api.test.ts +166 -0
- package/src/daemon-agent-defs-api.test.ts +953 -0
- package/src/daemon-agent-env-api.test.ts +338 -0
- package/src/daemon-attached-queue-store.test.ts +65 -0
- package/src/daemon-config-api.test.ts +962 -0
- package/src/daemon-jobs-api.test.ts +271 -0
- package/src/daemon-vault-chat.test.ts +250 -0
- package/src/daemon.test.ts +746 -0
- package/src/daemon.ts +3314 -0
- package/src/def-vaults.test.ts +136 -0
- package/src/def-vaults.ts +165 -0
- package/src/delivery-state.test.ts +110 -0
- package/src/delivery-state.ts +154 -0
- package/src/effective-env.test.ts +114 -0
- package/src/effective-env.ts +184 -0
- package/src/env-compat.ts +39 -0
- package/src/grants.test.ts +638 -0
- package/src/grants.ts +675 -0
- package/src/hub-jwt.test.ts +161 -0
- package/src/hub-jwt.ts +182 -0
- package/src/jobs.test.ts +245 -0
- package/src/jobs.ts +266 -0
- package/src/mcp-http.test.ts +265 -0
- package/src/mcp-http.ts +771 -0
- package/src/mint-token.test.ts +152 -0
- package/src/mint-token.ts +139 -0
- package/src/module-manifest.test.ts +158 -0
- package/src/oauth-discovery.ts +134 -0
- package/src/programmatic-wiring.test.ts +838 -0
- package/src/registry.test.ts +227 -0
- package/src/registry.ts +228 -0
- package/src/resolve-port.test.ts +64 -0
- package/src/routing.test.ts +184 -0
- package/src/routing.ts +76 -0
- package/src/runner.test.ts +506 -0
- package/src/runner.ts +255 -0
- package/src/sandbox/config.test.ts +150 -0
- package/src/sandbox/config.ts +102 -0
- package/src/sandbox/egress.test.ts +113 -0
- package/src/sandbox/egress.ts +123 -0
- package/src/sandbox/index.ts +180 -0
- package/src/sandbox/live-seatbelt.test.ts +277 -0
- package/src/sandbox/mounts.test.ts +154 -0
- package/src/sandbox/mounts.ts +133 -0
- package/src/sandbox/sandbox.test.ts +168 -0
- package/src/sandbox/types.ts +382 -0
- package/src/services-manifest.test.ts +106 -0
- package/src/services-manifest.ts +95 -0
- package/src/spa-serve.test.ts +116 -0
- package/src/spa-serve.ts +116 -0
- package/src/spawn-agent-cli.test.ts +172 -0
- package/src/spawn-agent.test.ts +1218 -0
- package/src/spawn-agent.ts +569 -0
- package/src/spawn-deps.test.ts +54 -0
- package/src/spawn-deps.ts +166 -0
- package/src/telegram/api.ts +153 -0
- package/src/terminal-assets.test.ts +50 -0
- package/src/terminal-assets.ts +79 -0
- package/src/terminal-ui.ts +305 -0
- package/src/terminal.test.ts +530 -0
- package/src/terminal.ts +458 -0
- package/src/transport.ts +270 -0
- package/src/transports/http-ui.test.ts +455 -0
- package/src/transports/http-ui.ts +201 -0
- package/src/transports/telegram.test.ts +174 -0
- package/src/transports/telegram.ts +426 -0
- package/src/transports/vault.test.ts +2011 -0
- package/src/transports/vault.ts +1790 -0
- package/src/ui-kit.test.ts +178 -0
- package/src/ui-kit.ts +402 -0
- package/tsconfig.json +8 -14
- package/web/ui/tsconfig.json +2 -1
- package/.claude/scheduled_tasks.lock +0 -1
- package/.claude/settings.json +0 -5
- package/.claude/skills/add-atomic-chat-tool/SKILL.md +0 -243
- package/.claude/skills/add-atomic-chat-tool/atomic-chat-mcp-stdio.ts +0 -229
- package/.claude/skills/add-codex/SKILL.md +0 -161
- package/.claude/skills/add-dashboard/SKILL.md +0 -138
- package/.claude/skills/add-dashboard/resources/dashboard-pusher.ts +0 -495
- package/.claude/skills/add-emacs/SKILL.md +0 -296
- package/.claude/skills/add-gcal-tool/SKILL.md +0 -210
- package/.claude/skills/add-gchat/REMOVE.md +0 -6
- package/.claude/skills/add-gchat/SKILL.md +0 -92
- package/.claude/skills/add-gchat/VERIFY.md +0 -3
- package/.claude/skills/add-github/REMOVE.md +0 -6
- package/.claude/skills/add-github/SKILL.md +0 -148
- package/.claude/skills/add-github/VERIFY.md +0 -3
- package/.claude/skills/add-gmail-tool/SKILL.md +0 -229
- package/.claude/skills/add-imessage/REMOVE.md +0 -6
- package/.claude/skills/add-imessage/SKILL.md +0 -113
- package/.claude/skills/add-imessage/VERIFY.md +0 -3
- package/.claude/skills/add-karpathy-llm-wiki/SKILL.md +0 -110
- package/.claude/skills/add-karpathy-llm-wiki/llm-wiki.md +0 -75
- package/.claude/skills/add-linear/REMOVE.md +0 -6
- package/.claude/skills/add-linear/SKILL.md +0 -168
- package/.claude/skills/add-linear/VERIFY.md +0 -3
- package/.claude/skills/add-macos-statusbar/SKILL.md +0 -133
- package/.claude/skills/add-macos-statusbar/add/src/statusbar.swift +0 -147
- package/.claude/skills/add-matrix/REMOVE.md +0 -6
- package/.claude/skills/add-matrix/SKILL.md +0 -148
- package/.claude/skills/add-matrix/VERIFY.md +0 -3
- package/.claude/skills/add-ollama-provider/SKILL.md +0 -179
- package/.claude/skills/add-ollama-tool/SKILL.md +0 -193
- package/.claude/skills/add-opencode/SKILL.md +0 -229
- package/.claude/skills/add-parallel/SKILL.md +0 -290
- package/.claude/skills/add-resend/REMOVE.md +0 -6
- package/.claude/skills/add-resend/SKILL.md +0 -93
- package/.claude/skills/add-resend/VERIFY.md +0 -3
- package/.claude/skills/add-signal/REMOVE.md +0 -13
- package/.claude/skills/add-signal/SKILL.md +0 -318
- package/.claude/skills/add-signal/VERIFY.md +0 -5
- package/.claude/skills/add-slack/REMOVE.md +0 -6
- package/.claude/skills/add-slack/SKILL.md +0 -112
- package/.claude/skills/add-slack/VERIFY.md +0 -3
- package/.claude/skills/add-teams/REMOVE.md +0 -6
- package/.claude/skills/add-teams/SKILL.md +0 -207
- package/.claude/skills/add-teams/VERIFY.md +0 -3
- package/.claude/skills/add-vercel/SKILL.md +0 -147
- package/.claude/skills/add-vercel/container-skills/vercel-cli/SKILL.md +0 -103
- package/.claude/skills/add-webex/REMOVE.md +0 -6
- package/.claude/skills/add-webex/SKILL.md +0 -88
- package/.claude/skills/add-webex/VERIFY.md +0 -3
- package/.claude/skills/add-wechat/REMOVE.md +0 -49
- package/.claude/skills/add-wechat/SKILL.md +0 -170
- package/.claude/skills/add-wechat/scripts/wire-dm.ts +0 -172
- package/.claude/skills/add-whatsapp/SKILL.md +0 -264
- package/.claude/skills/add-whatsapp-cloud/REMOVE.md +0 -6
- package/.claude/skills/add-whatsapp-cloud/SKILL.md +0 -95
- package/.claude/skills/add-whatsapp-cloud/VERIFY.md +0 -3
- package/.claude/skills/claw/SKILL.md +0 -131
- package/.claude/skills/claw/scripts/claw +0 -374
- package/.claude/skills/convert-to-apple-container/SKILL.md +0 -212
- package/.claude/skills/customize/SKILL.md +0 -110
- package/.claude/skills/debug/SKILL.md +0 -349
- package/.claude/skills/get-qodo-rules/SKILL.md +0 -122
- package/.claude/skills/get-qodo-rules/references/output-format.md +0 -41
- package/.claude/skills/get-qodo-rules/references/pagination.md +0 -33
- package/.claude/skills/get-qodo-rules/references/repository-scope.md +0 -26
- package/.claude/skills/init-first-agent/SKILL.md +0 -120
- package/.claude/skills/init-onecli/SKILL.md +0 -270
- package/.claude/skills/manage-channels/SKILL.md +0 -87
- package/.claude/skills/manage-mounts/SKILL.md +0 -47
- package/.claude/skills/migrate-from-openclaw/MIGRATE_CRONS.md +0 -100
- package/.claude/skills/migrate-from-openclaw/SKILL.md +0 -447
- package/.claude/skills/migrate-from-openclaw/scripts/discover-openclaw.ts +0 -734
- package/.claude/skills/migrate-from-openclaw/scripts/extract-channel-credentials.ts +0 -476
- package/.claude/skills/migrate-nanoclaw/SKILL.md +0 -484
- package/.claude/skills/migrate-nanoclaw/diagnostics.md +0 -51
- package/.claude/skills/qodo-pr-resolver/SKILL.md +0 -326
- package/.claude/skills/qodo-pr-resolver/resources/providers.md +0 -329
- package/.claude/skills/update-nanoclaw/SKILL.md +0 -243
- package/.claude/skills/update-nanoclaw/diagnostics.md +0 -48
- package/.claude/skills/update-skills/SKILL.md +0 -130
- package/.claude/skills/use-native-credential-proxy/SKILL.md +0 -167
- package/.claude/skills/x-integration/SKILL.md +0 -417
- package/.claude/skills/x-integration/agent.ts +0 -243
- package/.claude/skills/x-integration/host.ts +0 -155
- package/.claude/skills/x-integration/lib/browser.ts +0 -148
- package/.claude/skills/x-integration/lib/config.ts +0 -62
- package/.claude/skills/x-integration/scripts/like.ts +0 -56
- package/.claude/skills/x-integration/scripts/post.ts +0 -66
- package/.claude/skills/x-integration/scripts/quote.ts +0 -80
- package/.claude/skills/x-integration/scripts/reply.ts +0 -74
- package/.claude/skills/x-integration/scripts/retweet.ts +0 -62
- package/.claude/skills/x-integration/scripts/setup.ts +0 -87
- package/.github/CODEOWNERS +0 -10
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -18
- package/.github/workflows/bump-version.yml +0 -35
- package/.github/workflows/ci.yml +0 -39
- package/.github/workflows/label-pr.yml +0 -40
- package/.github/workflows/update-tokens.yml +0 -43
- package/.husky/pre-commit +0 -1
- package/.mcp.json +0 -3
- package/.nvmrc +0 -1
- package/.prettierrc +0 -4
- package/CHANGELOG.md +0 -221
- package/CLAUDE.md +0 -307
- package/CODE_OF_CONDUCT.md +0 -128
- package/CONTRIBUTING.md +0 -159
- package/CONTRIBUTORS.md +0 -26
- package/LICENSE-NANOCLAW-MIT +0 -21
- package/README_ja.md +0 -194
- package/README_zh.md +0 -194
- package/assets/nanoclaw-favicon.png +0 -0
- package/assets/nanoclaw-icon.png +0 -0
- package/assets/nanoclaw-logo-dark.png +0 -0
- package/assets/nanoclaw-logo.png +0 -0
- package/assets/nanoclaw-profile.jpeg +0 -0
- package/assets/nanoclaw-sales.png +0 -0
- package/assets/social-preview.jpg +0 -0
- package/config-examples/mount-allowlist.json +0 -25
- package/container/.dockerignore +0 -2
- package/container/CLAUDE.md +0 -21
- package/container/Dockerfile +0 -121
- package/container/agent-runner/bun.lock +0 -243
- package/container/agent-runner/package.json +0 -22
- package/container/agent-runner/scripts/sdk-signal-probe.ts +0 -169
- package/container/agent-runner/src/config.ts +0 -55
- package/container/agent-runner/src/db/connection.ts +0 -267
- package/container/agent-runner/src/db/index.ts +0 -20
- package/container/agent-runner/src/db/messages-in.ts +0 -138
- package/container/agent-runner/src/db/messages-out.ts +0 -143
- package/container/agent-runner/src/db/session-routing.ts +0 -30
- package/container/agent-runner/src/db/session-state.test.ts +0 -100
- package/container/agent-runner/src/db/session-state.ts +0 -79
- package/container/agent-runner/src/destinations.ts +0 -135
- package/container/agent-runner/src/formatter.test.ts +0 -167
- package/container/agent-runner/src/formatter.ts +0 -260
- package/container/agent-runner/src/index.ts +0 -110
- package/container/agent-runner/src/integration.test.ts +0 -121
- package/container/agent-runner/src/mcp-tools/agents.instructions.md +0 -26
- package/container/agent-runner/src/mcp-tools/agents.ts +0 -66
- package/container/agent-runner/src/mcp-tools/core.instructions.md +0 -27
- package/container/agent-runner/src/mcp-tools/core.ts +0 -262
- package/container/agent-runner/src/mcp-tools/index.ts +0 -22
- package/container/agent-runner/src/mcp-tools/interactive.instructions.md +0 -22
- package/container/agent-runner/src/mcp-tools/interactive.ts +0 -169
- package/container/agent-runner/src/mcp-tools/scheduling.instructions.md +0 -40
- package/container/agent-runner/src/mcp-tools/scheduling.ts +0 -299
- package/container/agent-runner/src/mcp-tools/self-mod.instructions.md +0 -25
- package/container/agent-runner/src/mcp-tools/self-mod.ts +0 -120
- package/container/agent-runner/src/mcp-tools/server.ts +0 -54
- package/container/agent-runner/src/mcp-tools/types.ts +0 -6
- package/container/agent-runner/src/poll-loop.test.ts +0 -248
- package/container/agent-runner/src/poll-loop.ts +0 -437
- package/container/agent-runner/src/providers/claude.ts +0 -379
- package/container/agent-runner/src/providers/factory.test.ts +0 -19
- package/container/agent-runner/src/providers/factory.ts +0 -13
- package/container/agent-runner/src/providers/index.ts +0 -6
- package/container/agent-runner/src/providers/mock.ts +0 -77
- package/container/agent-runner/src/providers/provider-registry.ts +0 -33
- package/container/agent-runner/src/providers/types.ts +0 -82
- package/container/agent-runner/src/scheduling/task-script.ts +0 -121
- package/container/agent-runner/src/timezone.test.ts +0 -93
- package/container/agent-runner/src/timezone.ts +0 -107
- package/container/agent-runner/tsconfig.json +0 -14
- package/container/build.sh +0 -48
- package/container/entrypoint.sh +0 -16
- package/container/skills/agent-browser/SKILL.md +0 -159
- package/container/skills/frontend-engineer/SKILL.md +0 -157
- package/container/skills/self-customize/SKILL.md +0 -87
- package/container/skills/slack-formatting/SKILL.md +0 -94
- package/container/skills/vercel-cli/SKILL.md +0 -111
- package/container/skills/welcome/SKILL.md +0 -85
- package/docs/APPLE-CONTAINER-NETWORKING.md +0 -90
- package/docs/BRANCH-FORK-MAINTENANCE.md +0 -81
- package/docs/README.md +0 -25
- package/docs/SDK_DEEP_DIVE.md +0 -643
- package/docs/SECURITY.md +0 -162
- package/docs/agent-runner-details.md +0 -749
- package/docs/api-details.md +0 -365
- package/docs/architecture-diagram.html +0 -422
- package/docs/architecture-diagram.md +0 -215
- package/docs/architecture.md +0 -751
- package/docs/audit/2026-04-30-channel-endpoint-audit.md +0 -36
- package/docs/build-and-runtime.md +0 -80
- package/docs/cross-mount-stress/README.md +0 -112
- package/docs/cross-mount-stress/container-writer-retry.mjs +0 -55
- package/docs/cross-mount-stress/container-writer-slow.mjs +0 -42
- package/docs/cross-mount-stress/container-writer.mjs +0 -47
- package/docs/cross-mount-stress/host-writer-retry.mjs +0 -55
- package/docs/cross-mount-stress/host-writer-slow.mjs +0 -43
- package/docs/cross-mount-stress/host-writer.mjs +0 -47
- package/docs/db-central.md +0 -316
- package/docs/db-session.md +0 -183
- package/docs/db.md +0 -119
- package/docs/design/2026-04-29-vault-management-ui.md +0 -231
- package/docs/design/2026-04-30-channel-wiring-rework.md +0 -234
- package/docs/design/2026-05-01-channel-wiring-approvals-deep-dive.md +0 -272
- package/docs/design/2026-05-02-channel-policy-and-approval-routing.md +0 -250
- package/docs/docker-sandboxes.md +0 -359
- package/docs/isolation-model.md +0 -88
- package/docs/ollama.md +0 -79
- package/docs/parachute-integration.md +0 -109
- package/docs/post-night-rebirth-reflections.md +0 -151
- package/eslint.config.js +0 -32
- package/pnpm-workspace.yaml +0 -8
- package/repo-tokens/README.md +0 -113
- package/repo-tokens/action.yml +0 -186
- package/repo-tokens/badge.svg +0 -23
- package/repo-tokens/examples/green.svg +0 -14
- package/repo-tokens/examples/red.svg +0 -14
- package/repo-tokens/examples/yellow-green.svg +0 -14
- package/repo-tokens/examples/yellow.svg +0 -14
- package/scripts/chat.ts +0 -101
- package/scripts/cleanup-sessions.sh +0 -150
- package/scripts/init-cli-agent.ts +0 -171
- package/scripts/init-first-agent.ts +0 -377
- package/scripts/parachute.ts +0 -158
- package/scripts/run-migrations.ts +0 -105
- package/scripts/sanity-live-poll.ts +0 -95
- package/scripts/seed-discord.ts +0 -79
- package/scripts/test-v2-agent.ts +0 -106
- package/scripts/test-v2-channel-e2e.ts +0 -265
- package/scripts/test-v2-host.ts +0 -184
- package/src/channels/adapter.ts +0 -214
- package/src/channels/ask-question.ts +0 -46
- package/src/channels/channel-registry.test.ts +0 -421
- package/src/channels/channel-registry.ts +0 -313
- package/src/channels/chat-sdk-bridge.test.ts +0 -84
- package/src/channels/chat-sdk-bridge.ts +0 -652
- package/src/channels/cli.ts +0 -276
- package/src/channels/discord.ts +0 -90
- package/src/channels/index.ts +0 -17
- package/src/channels/telegram-markdown-sanitize.test.ts +0 -78
- package/src/channels/telegram-markdown-sanitize.ts +0 -55
- package/src/channels/telegram-pairing.test.ts +0 -254
- package/src/channels/telegram-pairing.ts +0 -339
- package/src/channels/telegram.ts +0 -279
- package/src/channels/trust-hint.test.ts +0 -48
- package/src/channels/trust-hint.ts +0 -75
- package/src/claude-md-compose.migrate.test.ts +0 -64
- package/src/claude-md-compose.ts +0 -205
- package/src/command-gate.ts +0 -63
- package/src/config.test.ts +0 -93
- package/src/config.ts +0 -108
- package/src/container-config.ts +0 -167
- package/src/container-runner.test.ts +0 -32
- package/src/container-runner.ts +0 -576
- package/src/container-runtime.test.ts +0 -169
- package/src/container-runtime.ts +0 -92
- package/src/db/_bun-sqlite-shim.ts +0 -88
- package/src/db/agent-activity.test.ts +0 -155
- package/src/db/agent-activity.ts +0 -121
- package/src/db/agent-groups.ts +0 -77
- package/src/db/connection.migrate.test.ts +0 -143
- package/src/db/connection.ts +0 -224
- package/src/db/db-v2.test.ts +0 -440
- package/src/db/dropped-messages.ts +0 -44
- package/src/db/index.ts +0 -40
- package/src/db/messaging-groups.ts +0 -252
- package/src/db/migrations/001-initial.ts +0 -112
- package/src/db/migrations/002-chat-sdk-state.ts +0 -36
- package/src/db/migrations/008-dropped-messages.ts +0 -27
- package/src/db/migrations/009-drop-pending-credentials.ts +0 -13
- package/src/db/migrations/010-engage-modes.ts +0 -103
- package/src/db/migrations/011-pending-sender-approvals.ts +0 -40
- package/src/db/migrations/012-channel-registration.ts +0 -48
- package/src/db/migrations/013-approval-render-metadata.ts +0 -27
- package/src/db/migrations/014-secrets.ts +0 -44
- package/src/db/migrations/015-secrets-drop-host-pattern.ts +0 -18
- package/src/db/migrations/016-secret-assignments.ts +0 -30
- package/src/db/migrations/017-agent-activity.ts +0 -40
- package/src/db/migrations/018-oauth-app-configs.ts +0 -34
- package/src/db/migrations/019-oauth-app-connections.ts +0 -48
- package/src/db/migrations/020-agent-app-connections.ts +0 -28
- package/src/db/migrations/021-pending-oauth-states.ts +0 -35
- package/src/db/migrations/022-app-connections-provider.ts +0 -25
- package/src/db/migrations/023-agent-group-secret-mode.test.ts +0 -124
- package/src/db/migrations/023-agent-group-secret-mode.ts +0 -65
- package/src/db/migrations/024-collapse-approvals.test.ts +0 -249
- package/src/db/migrations/024-collapse-approvals.ts +0 -182
- package/src/db/migrations/025-secret-mode-check.test.ts +0 -155
- package/src/db/migrations/025-secret-mode-check.ts +0 -49
- package/src/db/migrations/026-user-dms-bot-id.test.ts +0 -116
- package/src/db/migrations/026-user-dms-bot-id.ts +0 -54
- package/src/db/migrations/027-provider-credentials.ts +0 -41
- package/src/db/migrations/_test-helpers.ts +0 -41
- package/src/db/migrations/index.ts +0 -127
- package/src/db/migrations/module-agent-to-agent-destinations.ts +0 -84
- package/src/db/migrations/module-approvals-pending-approvals.ts +0 -42
- package/src/db/migrations/module-approvals-title-options.ts +0 -40
- package/src/db/schema.ts +0 -258
- package/src/db/session-db.test.ts +0 -93
- package/src/db/session-db.ts +0 -325
- package/src/db/sessions.ts +0 -241
- package/src/delivery.test.ts +0 -148
- package/src/delivery.ts +0 -445
- package/src/env.ts +0 -74
- package/src/group-folder.test.ts +0 -35
- package/src/group-folder.ts +0 -44
- package/src/group-init.ts +0 -92
- package/src/host-core.test.ts +0 -456
- package/src/host-sweep.test.ts +0 -146
- package/src/host-sweep.ts +0 -287
- package/src/index.ts +0 -227
- package/src/install-slug.ts +0 -33
- package/src/log.test.ts +0 -81
- package/src/log.ts +0 -117
- package/src/mcp/http.ts +0 -72
- package/src/mcp/server.ts +0 -92
- package/src/mcp/stdio.ts +0 -51
- package/src/mcp/tools/activity.ts +0 -88
- package/src/mcp/tools/agent-groups.ts +0 -183
- package/src/mcp/tools/approvals.ts +0 -122
- package/src/mcp/tools/channels.ts +0 -199
- package/src/mcp/tools/index.ts +0 -27
- package/src/mcp/tools/oauth.ts +0 -48
- package/src/mcp/tools/secrets.ts +0 -169
- package/src/mcp/tools/sessions.ts +0 -135
- package/src/mcp/types.ts +0 -51
- package/src/modules/agent-to-agent/agent-route.test.ts +0 -46
- package/src/modules/agent-to-agent/agent-route.ts +0 -223
- package/src/modules/agent-to-agent/create-agent.ts +0 -127
- package/src/modules/agent-to-agent/db/agent-destinations.ts +0 -135
- package/src/modules/agent-to-agent/index.ts +0 -22
- package/src/modules/agent-to-agent/write-destinations.ts +0 -59
- package/src/modules/approvals/agent.md +0 -45
- package/src/modules/approvals/index.ts +0 -21
- package/src/modules/approvals/picks.test.ts +0 -291
- package/src/modules/approvals/primitive.ts +0 -279
- package/src/modules/approvals/project.md +0 -27
- package/src/modules/approvals/response-handler.ts +0 -87
- package/src/modules/index.ts +0 -24
- package/src/modules/interactive/agent.md +0 -21
- package/src/modules/interactive/index.ts +0 -69
- package/src/modules/interactive/project.md +0 -12
- package/src/modules/mount-security/index.ts +0 -448
- package/src/modules/mount-security/migrate.test.ts +0 -91
- package/src/modules/permissions/access.ts +0 -28
- package/src/modules/permissions/channel-approval.test.ts +0 -389
- package/src/modules/permissions/channel-approval.ts +0 -188
- package/src/modules/permissions/db/agent-group-members.ts +0 -44
- package/src/modules/permissions/db/pending-channel-approvals.test.ts +0 -86
- package/src/modules/permissions/db/pending-channel-approvals.ts +0 -66
- package/src/modules/permissions/db/pending-sender-approvals.ts +0 -60
- package/src/modules/permissions/db/user-dms.ts +0 -58
- package/src/modules/permissions/db/user-roles.ts +0 -85
- package/src/modules/permissions/db/users.ts +0 -38
- package/src/modules/permissions/index.ts +0 -421
- package/src/modules/permissions/permissions.test.ts +0 -358
- package/src/modules/permissions/sender-approval.test.ts +0 -470
- package/src/modules/permissions/sender-approval.ts +0 -165
- package/src/modules/permissions/user-dm.ts +0 -200
- package/src/modules/provider-credentials/db.ts +0 -121
- package/src/modules/provider-credentials/index.ts +0 -12
- package/src/modules/provider-credentials/spawn.test.ts +0 -206
- package/src/modules/provider-credentials/spawn.ts +0 -114
- package/src/modules/scheduling/actions.ts +0 -113
- package/src/modules/scheduling/db.test.ts +0 -282
- package/src/modules/scheduling/db.ts +0 -148
- package/src/modules/scheduling/index.ts +0 -34
- package/src/modules/scheduling/recurrence.test.ts +0 -98
- package/src/modules/scheduling/recurrence.ts +0 -54
- package/src/modules/self-mod/agent.md +0 -30
- package/src/modules/self-mod/apply.ts +0 -85
- package/src/modules/self-mod/index.ts +0 -30
- package/src/modules/self-mod/project.md +0 -39
- package/src/modules/self-mod/request.ts +0 -91
- package/src/modules/typing/index.ts +0 -165
- package/src/oauth/agent-app-connections.ts +0 -103
- package/src/oauth/app-configs.test.ts +0 -64
- package/src/oauth/app-configs.ts +0 -114
- package/src/oauth/app-connections.test.ts +0 -109
- package/src/oauth/app-connections.ts +0 -178
- package/src/oauth/crypto.ts +0 -56
- package/src/oauth/flow.ts +0 -104
- package/src/oauth/providers/google.test.ts +0 -38
- package/src/oauth/providers/google.ts +0 -46
- package/src/oauth/providers/index.ts +0 -48
- package/src/oauth/state-store.test.ts +0 -54
- package/src/oauth/state-store.ts +0 -93
- package/src/parachute/README.md +0 -27
- package/src/parachute/create-agent.test.ts +0 -83
- package/src/parachute/create-agent.ts +0 -122
- package/src/parachute/group-status.test.ts +0 -165
- package/src/parachute/group-status.ts +0 -136
- package/src/parachute/types.ts +0 -41
- package/src/parachute/vault-mcp.test.ts +0 -251
- package/src/parachute/vault-mcp.ts +0 -232
- package/src/platform-id.test.ts +0 -104
- package/src/platform-id.ts +0 -109
- package/src/providers/index.ts +0 -6
- package/src/providers/provider-container-registry.ts +0 -58
- package/src/response-registry.ts +0 -45
- package/src/router.ts +0 -530
- package/src/secrets/crypto.test.ts +0 -45
- package/src/secrets/crypto.ts +0 -55
- package/src/secrets/index.ts +0 -355
- package/src/secrets/master-key.ts +0 -70
- package/src/secrets/secrets.test.ts +0 -354
- package/src/session-manager.migrate.test.ts +0 -59
- package/src/session-manager.ts +0 -433
- package/src/startup-bootstrap.test.ts +0 -226
- package/src/startup-bootstrap.ts +0 -207
- package/src/state-sqlite.ts +0 -182
- package/src/timezone.test.ts +0 -64
- package/src/timezone.ts +0 -37
- package/src/types.ts +0 -230
- package/src/web/auth.test.ts +0 -335
- package/src/web/auth.ts +0 -214
- package/src/web/discord-validate.test.ts +0 -77
- package/src/web/discord-validate.ts +0 -88
- package/src/web/hub-discovery.test.ts +0 -98
- package/src/web/hub-discovery.ts +0 -69
- package/src/web/routes/activity.ts +0 -106
- package/src/web/routes/agent-provider.test.ts +0 -282
- package/src/web/routes/agent-provider.ts +0 -309
- package/src/web/routes/approvals.ts +0 -185
- package/src/web/routes/apps.ts +0 -434
- package/src/web/routes/channels-mg-detail.test.ts +0 -324
- package/src/web/routes/channels-mga-detail.test.ts +0 -425
- package/src/web/routes/channels.ts +0 -489
- package/src/web/routes/oauth-providers.ts +0 -42
- package/src/web/routes/secrets.test.ts +0 -175
- package/src/web/routes/secrets.ts +0 -282
- package/src/web/routes/sessions.ts +0 -123
- package/src/web/routes/settings.test.ts +0 -106
- package/src/web/routes/settings.ts +0 -247
- package/src/web/routes/setup-status.ts +0 -205
- package/src/web/routes/vaults.test.ts +0 -389
- package/src/web/routes/vaults.ts +0 -225
- package/src/web/server-version.test.ts +0 -16
- package/src/web/server.ts +0 -1003
- package/src/web/services-manifest.test.ts +0 -120
- package/src/web/services-manifest.ts +0 -61
- package/src/web/static-serve.test.ts +0 -255
- package/src/web/static-serve.ts +0 -104
- package/src/web/telegram-validate.test.ts +0 -116
- package/src/web/telegram-validate.ts +0 -107
- package/src/web/vault-proxy.test.ts +0 -214
- package/src/web/vault-proxy.ts +0 -120
- package/src/web/wire-channel.ts +0 -181
- package/src/webhook-server.ts +0 -134
- package/vitest.config.ts +0 -18
- package/web/README.md +0 -63
- package/web/ui/index.html +0 -13
- package/web/ui/package.json +0 -35
- package/web/ui/pnpm-lock.yaml +0 -2164
- package/web/ui/scripts/verify-base.mjs +0 -31
- package/web/ui/src/App.tsx +0 -88
- package/web/ui/src/components/ActivityFeed.tsx +0 -444
- package/web/ui/src/components/AgentGroupPicker.tsx +0 -263
- package/web/ui/src/components/AgentProviderCards.tsx +0 -220
- package/web/ui/src/components/CredentialForm.tsx +0 -214
- package/web/ui/src/components/ScopeGrants.tsx +0 -74
- package/web/ui/src/components/StatusDot.tsx +0 -43
- package/web/ui/src/components/VaultPicker.tsx +0 -127
- package/web/ui/src/components/setup/AdapterInstallStep.tsx +0 -178
- package/web/ui/src/components/setup/AgentGroupStep.tsx +0 -43
- package/web/ui/src/components/setup/ChannelPickStep.tsx +0 -74
- package/web/ui/src/components/setup/DoneStep.tsx +0 -49
- package/web/ui/src/components/setup/PrereqStep.tsx +0 -129
- package/web/ui/src/components/setup/TestConnectionStep.tsx +0 -108
- package/web/ui/src/components/setup/TestMessageStep.tsx +0 -104
- package/web/ui/src/components/setup/WireChannelStep.tsx +0 -166
- package/web/ui/src/components/setup/types.ts +0 -105
- package/web/ui/src/lib/api.test.ts +0 -410
- package/web/ui/src/lib/api.ts +0 -1210
- package/web/ui/src/lib/auth.test.ts +0 -139
- package/web/ui/src/lib/auth.ts +0 -348
- package/web/ui/src/lib/channel-adapters.ts +0 -136
- package/web/ui/src/main.tsx +0 -19
- package/web/ui/src/routes/ApprovalsList.tsx +0 -294
- package/web/ui/src/routes/Apps.tsx +0 -613
- package/web/ui/src/routes/ChannelWireDetail.test.tsx +0 -233
- package/web/ui/src/routes/ChannelWireDetail.tsx +0 -403
- package/web/ui/src/routes/ChannelsList.tsx +0 -158
- package/web/ui/src/routes/GroupDetail.tsx +0 -755
- package/web/ui/src/routes/GroupList.tsx +0 -187
- package/web/ui/src/routes/MessagingGroupDetail.test.tsx +0 -233
- package/web/ui/src/routes/MessagingGroupDetail.tsx +0 -306
- package/web/ui/src/routes/NewGroupWizard.tsx +0 -390
- package/web/ui/src/routes/OAuthCallback.tsx +0 -56
- package/web/ui/src/routes/SecretsList.tsx +0 -921
- package/web/ui/src/routes/SessionsList.tsx +0 -220
- package/web/ui/src/routes/SettingsAgentProvider.tsx +0 -109
- package/web/ui/src/routes/SettingsApprovals.tsx +0 -234
- package/web/ui/src/routes/SetupWizard.tsx +0 -219
- package/web/ui/src/routes/VaultDetail.test.tsx +0 -361
- package/web/ui/src/routes/VaultDetail.tsx +0 -960
- package/web/ui/src/routes/VaultsList.tsx +0 -295
- package/web/ui/src/routes/WireChannelPage.tsx +0 -413
- package/web/ui/src/styles.css +0 -608
- package/web/ui/src/test/setup.ts +0 -23
- package/web/ui/src/vite-env.d.ts +0 -10
- package/web/ui/vite.config.ts +0 -34
- package/web/ui/vitest.config.ts +0 -25
package/docs/docker-sandboxes.md
DELETED
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
# Running Paraclaw in Docker Sandboxes (Manual Setup)
|
|
2
|
-
|
|
3
|
-
This guide walks through setting up Paraclaw inside a [Docker Sandbox](https://docs.docker.com/ai/sandboxes/) from scratch — no install script, no pre-built fork. You'll clone the upstream repo, apply the necessary patches, and have agents running in full hypervisor-level isolation.
|
|
4
|
-
|
|
5
|
-
## Architecture
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
Host (macOS / Windows WSL)
|
|
9
|
-
└── Docker Sandbox (micro VM with isolated kernel)
|
|
10
|
-
├── Paraclaw process (Node.js)
|
|
11
|
-
│ ├── Channel adapters (WhatsApp, Telegram, etc.)
|
|
12
|
-
│ └── Container spawner → nested Docker daemon
|
|
13
|
-
└── Docker-in-Docker
|
|
14
|
-
└── paraclaw-agent containers
|
|
15
|
-
└── Claude Agent SDK
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
Each agent runs in its own container, inside a micro VM that is fully isolated from your host. Two layers of isolation: per-agent containers + the VM boundary.
|
|
19
|
-
|
|
20
|
-
The sandbox provides a MITM proxy at `host.docker.internal:3128` that handles network access and injects your Anthropic API key automatically.
|
|
21
|
-
|
|
22
|
-
> **Note:** This guide is based on a validated setup running on macOS (Apple Silicon) with WhatsApp. Other channels (Telegram, Slack, etc.) and environments (Windows WSL) may require additional proxy patches for their specific HTTP/WebSocket clients. The core patches (container runner, credential proxy, Dockerfile) apply universally — channel-specific proxy configuration varies.
|
|
23
|
-
|
|
24
|
-
## Prerequisites
|
|
25
|
-
|
|
26
|
-
- **Docker Desktop v4.40+** with Sandbox support
|
|
27
|
-
- **Anthropic API key** (the sandbox proxy manages injection)
|
|
28
|
-
- For **Telegram**: a bot token from [@BotFather](https://t.me/BotFather) and your chat ID
|
|
29
|
-
- For **WhatsApp**: a phone with WhatsApp installed
|
|
30
|
-
|
|
31
|
-
Verify sandbox support:
|
|
32
|
-
```bash
|
|
33
|
-
docker sandbox version
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Step 1: Create the Sandbox
|
|
37
|
-
|
|
38
|
-
On your host machine:
|
|
39
|
-
|
|
40
|
-
```bash
|
|
41
|
-
# Create a workspace directory
|
|
42
|
-
mkdir -p ~/paraclaw-workspace
|
|
43
|
-
|
|
44
|
-
# Create a shell sandbox with the workspace mounted
|
|
45
|
-
docker sandbox create shell ~/paraclaw-workspace
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
If you're using WhatsApp, configure proxy bypass so WhatsApp's Noise protocol isn't MITM-inspected:
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
docker sandbox network proxy shell-paraclaw-workspace \
|
|
52
|
-
--bypass-host web.whatsapp.com \
|
|
53
|
-
--bypass-host "*.whatsapp.com" \
|
|
54
|
-
--bypass-host "*.whatsapp.net"
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
Telegram does not need proxy bypass.
|
|
58
|
-
|
|
59
|
-
Enter the sandbox:
|
|
60
|
-
```bash
|
|
61
|
-
docker sandbox run shell-paraclaw-workspace
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Step 2: Install Prerequisites
|
|
65
|
-
|
|
66
|
-
Inside the sandbox:
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
sudo apt-get update && sudo apt-get install -y build-essential python3
|
|
70
|
-
npm config set strict-ssl false
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
## Step 3: Clone and Install Paraclaw
|
|
74
|
-
|
|
75
|
-
Paraclaw must live inside the workspace directory — Docker-in-Docker can only bind-mount from the shared workspace path.
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
# Clone to home first (virtiofs can corrupt git pack files during clone)
|
|
79
|
-
cd ~
|
|
80
|
-
git clone https://github.com/ParachuteComputer/paraclaw.git
|
|
81
|
-
|
|
82
|
-
# Replace with YOUR workspace path (the host path you passed to `docker sandbox create`)
|
|
83
|
-
WORKSPACE=/Users/you/paraclaw-workspace
|
|
84
|
-
|
|
85
|
-
# Move into workspace so DinD mounts work
|
|
86
|
-
mv paraclaw "$WORKSPACE/paraclaw"
|
|
87
|
-
cd "$WORKSPACE/paraclaw"
|
|
88
|
-
|
|
89
|
-
# Install dependencies
|
|
90
|
-
pnpm install
|
|
91
|
-
pnpm install https-proxy-agent
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Step 4: Apply Proxy and Sandbox Patches
|
|
95
|
-
|
|
96
|
-
Paraclaw needs several patches to work inside a Docker Sandbox. These handle proxy routing, CA certificates, and Docker-in-Docker mount restrictions.
|
|
97
|
-
|
|
98
|
-
### 4a. Dockerfile — proxy args for container image build
|
|
99
|
-
|
|
100
|
-
`pnpm install` inside `docker build` fails with `SELF_SIGNED_CERT_IN_CHAIN` because the sandbox's MITM proxy presents its own certificate. Add proxy build args to `container/Dockerfile`:
|
|
101
|
-
|
|
102
|
-
Add these lines after the `FROM` line:
|
|
103
|
-
|
|
104
|
-
```dockerfile
|
|
105
|
-
# Accept proxy build args
|
|
106
|
-
ARG http_proxy
|
|
107
|
-
ARG https_proxy
|
|
108
|
-
ARG no_proxy
|
|
109
|
-
ARG NODE_EXTRA_CA_CERTS
|
|
110
|
-
ARG npm_config_strict_ssl=true
|
|
111
|
-
RUN npm config set strict-ssl ${npm_config_strict_ssl}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
And after the `RUN pnpm install` line:
|
|
115
|
-
|
|
116
|
-
```dockerfile
|
|
117
|
-
RUN npm config set strict-ssl true
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### 4b. Build script — forward proxy args
|
|
121
|
-
|
|
122
|
-
Patch `container/build.sh` to pass proxy env vars to `docker build`:
|
|
123
|
-
|
|
124
|
-
Add these `--build-arg` flags to the `docker build` command:
|
|
125
|
-
|
|
126
|
-
```bash
|
|
127
|
-
--build-arg http_proxy="${http_proxy:-$HTTP_PROXY}" \
|
|
128
|
-
--build-arg https_proxy="${https_proxy:-$HTTPS_PROXY}" \
|
|
129
|
-
--build-arg no_proxy="${no_proxy:-$NO_PROXY}" \
|
|
130
|
-
--build-arg npm_config_strict_ssl=false \
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### 4c. Container runner — proxy forwarding, CA cert mount, /dev/null fix
|
|
134
|
-
|
|
135
|
-
Three changes to `src/container-runner.ts`:
|
|
136
|
-
|
|
137
|
-
**Replace `/dev/null` shadow mount.** The sandbox rejects `/dev/null` bind mounts. Find where `.env` is shadow-mounted to `/dev/null` and replace it with an empty file:
|
|
138
|
-
|
|
139
|
-
```typescript
|
|
140
|
-
// Create an empty file to shadow .env (Docker Sandbox rejects /dev/null mounts)
|
|
141
|
-
const emptyEnvPath = path.join(DATA_DIR, 'empty-env');
|
|
142
|
-
if (!fs.existsSync(emptyEnvPath)) fs.writeFileSync(emptyEnvPath, '');
|
|
143
|
-
// Use emptyEnvPath instead of '/dev/null' in the mount
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
**Forward proxy env vars** to spawned agent containers. Add `-e` flags for `HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY` and their lowercase variants.
|
|
147
|
-
|
|
148
|
-
**Mount CA certificate.** If `NODE_EXTRA_CA_CERTS` or `SSL_CERT_FILE` is set, copy the cert into the project directory and mount it into agent containers:
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
const caCertSrc = process.env.NODE_EXTRA_CA_CERTS || process.env.SSL_CERT_FILE;
|
|
152
|
-
if (caCertSrc) {
|
|
153
|
-
const certDir = path.join(DATA_DIR, 'ca-cert');
|
|
154
|
-
fs.mkdirSync(certDir, { recursive: true });
|
|
155
|
-
fs.copyFileSync(caCertSrc, path.join(certDir, 'proxy-ca.crt'));
|
|
156
|
-
// Mount: certDir -> /workspace/ca-cert (read-only)
|
|
157
|
-
// Set NODE_EXTRA_CA_CERTS=/workspace/ca-cert/proxy-ca.crt in the container
|
|
158
|
-
}
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
### 4d. Container runtime — prevent self-termination
|
|
162
|
-
|
|
163
|
-
In `src/container-runtime.ts`, the `cleanupOrphans()` function matches containers by the `paraclaw-install=<slug>` label. Inside a sandbox, the sandbox container itself may match. Filter out the current hostname:
|
|
164
|
-
|
|
165
|
-
```typescript
|
|
166
|
-
// In cleanupOrphans(), filter out os.hostname() from the list of containers to stop
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
### 4e. Credential proxy — route through MITM proxy
|
|
170
|
-
|
|
171
|
-
In `src/credential-proxy.ts`, upstream API requests need to go through the sandbox proxy. Add `HttpsProxyAgent` to outbound requests:
|
|
172
|
-
|
|
173
|
-
```typescript
|
|
174
|
-
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
175
|
-
|
|
176
|
-
const proxyUrl = process.env.HTTPS_PROXY || process.env.https_proxy;
|
|
177
|
-
const upstreamAgent = proxyUrl ? new HttpsProxyAgent(proxyUrl) : undefined;
|
|
178
|
-
// Pass upstreamAgent to https.request() options
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
### 4f. Setup script — proxy build args
|
|
182
|
-
|
|
183
|
-
Patch `setup/container.ts` to pass the same proxy `--build-arg` flags as `build.sh` (Step 4b).
|
|
184
|
-
|
|
185
|
-
## Step 5: Build
|
|
186
|
-
|
|
187
|
-
```bash
|
|
188
|
-
pnpm run build
|
|
189
|
-
bash container/build.sh
|
|
190
|
-
```
|
|
191
|
-
|
|
192
|
-
## Step 6: Add a Channel
|
|
193
|
-
|
|
194
|
-
### Telegram
|
|
195
|
-
|
|
196
|
-
```bash
|
|
197
|
-
# Apply the Telegram skill
|
|
198
|
-
pnpm exec tsx scripts/apply-skill.ts .claude/skills/add-telegram
|
|
199
|
-
|
|
200
|
-
# Rebuild after applying the skill
|
|
201
|
-
pnpm run build
|
|
202
|
-
|
|
203
|
-
# Configure .env
|
|
204
|
-
cat > .env << EOF
|
|
205
|
-
TELEGRAM_BOT_TOKEN=<your-token-from-botfather>
|
|
206
|
-
ASSISTANT_NAME=paraclaw
|
|
207
|
-
ANTHROPIC_API_KEY=proxy-managed
|
|
208
|
-
EOF
|
|
209
|
-
mkdir -p data/env && cp .env data/env/env
|
|
210
|
-
|
|
211
|
-
# Register your chat
|
|
212
|
-
pnpm exec tsx setup/index.ts --step register \
|
|
213
|
-
--jid "tg:<your-chat-id>" \
|
|
214
|
-
--name "My Chat" \
|
|
215
|
-
--trigger "@paraclaw" \
|
|
216
|
-
--folder "telegram_main" \
|
|
217
|
-
--channel telegram \
|
|
218
|
-
--assistant-name "paraclaw" \
|
|
219
|
-
--is-main \
|
|
220
|
-
--no-trigger-required
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
**To find your chat ID:** Send any message to your bot, then:
|
|
224
|
-
```bash
|
|
225
|
-
curl -s --proxy $HTTPS_PROXY "https://api.telegram.org/bot<TOKEN>/getUpdates" | python3 -m json.tool
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
**Telegram in groups:** Disable Group Privacy in @BotFather (`/mybots` > Bot Settings > Group Privacy > Turn off), then remove and re-add the bot.
|
|
229
|
-
|
|
230
|
-
**Important:** If the Telegram skill creates `src/channels/telegram.ts`, you'll need to patch it for proxy support. Add an `HttpsProxyAgent` and pass it to grammy's `Bot` constructor via `baseFetchConfig.agent`. Then rebuild.
|
|
231
|
-
|
|
232
|
-
### WhatsApp
|
|
233
|
-
|
|
234
|
-
Make sure you configured proxy bypass in [Step 1](#step-1-create-the-sandbox) first.
|
|
235
|
-
|
|
236
|
-
```bash
|
|
237
|
-
# Apply the WhatsApp skill
|
|
238
|
-
pnpm exec tsx scripts/apply-skill.ts .claude/skills/add-whatsapp
|
|
239
|
-
|
|
240
|
-
# Rebuild
|
|
241
|
-
pnpm run build
|
|
242
|
-
|
|
243
|
-
# Configure .env
|
|
244
|
-
cat > .env << EOF
|
|
245
|
-
ASSISTANT_NAME=paraclaw
|
|
246
|
-
ANTHROPIC_API_KEY=proxy-managed
|
|
247
|
-
EOF
|
|
248
|
-
mkdir -p data/env && cp .env data/env/env
|
|
249
|
-
|
|
250
|
-
# Authenticate (choose one):
|
|
251
|
-
|
|
252
|
-
# QR code — scan with WhatsApp camera:
|
|
253
|
-
pnpm exec tsx src/whatsapp-auth.ts
|
|
254
|
-
|
|
255
|
-
# OR pairing code — enter code in WhatsApp > Linked Devices > Link with phone number:
|
|
256
|
-
pnpm exec tsx src/whatsapp-auth.ts --pairing-code --phone <phone-number-no-plus>
|
|
257
|
-
|
|
258
|
-
# Register your chat (JID = your phone number + @s.whatsapp.net)
|
|
259
|
-
pnpm exec tsx setup/index.ts --step register \
|
|
260
|
-
--jid "<phone>@s.whatsapp.net" \
|
|
261
|
-
--name "My Chat" \
|
|
262
|
-
--trigger "@paraclaw" \
|
|
263
|
-
--folder "whatsapp_main" \
|
|
264
|
-
--channel whatsapp \
|
|
265
|
-
--assistant-name "paraclaw" \
|
|
266
|
-
--is-main \
|
|
267
|
-
--no-trigger-required
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
**Important:** The WhatsApp skill files (`src/channels/whatsapp.ts` and `src/whatsapp-auth.ts`) also need proxy patches — add `HttpsProxyAgent` for WebSocket connections and a proxy-aware version fetch. Then rebuild.
|
|
271
|
-
|
|
272
|
-
### Both Channels
|
|
273
|
-
|
|
274
|
-
Apply both skills, patch both for proxy support, combine the `.env` variables, and register each chat separately.
|
|
275
|
-
|
|
276
|
-
## Step 7: Run
|
|
277
|
-
|
|
278
|
-
```bash
|
|
279
|
-
pnpm start
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
You don't need to set `ANTHROPIC_API_KEY` manually. The sandbox proxy intercepts requests and replaces `proxy-managed` with your real key automatically.
|
|
283
|
-
|
|
284
|
-
## Networking Details
|
|
285
|
-
|
|
286
|
-
### How the proxy works
|
|
287
|
-
|
|
288
|
-
All traffic from the sandbox routes through the host proxy at `host.docker.internal:3128`:
|
|
289
|
-
|
|
290
|
-
```
|
|
291
|
-
Agent container → DinD bridge → Sandbox VM → host.docker.internal:3128 → Host proxy → api.anthropic.com
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
**"Bypass" does not mean traffic skips the proxy.** It means the proxy passes traffic through without MITM inspection. Node.js doesn't automatically use `HTTP_PROXY` env vars — you need explicit `HttpsProxyAgent` configuration in every HTTP/WebSocket client.
|
|
295
|
-
|
|
296
|
-
### Shared paths for DinD mounts
|
|
297
|
-
|
|
298
|
-
Only the workspace directory is available for Docker-in-Docker bind mounts. Paths outside the workspace fail with "path not shared":
|
|
299
|
-
- `/dev/null` → replace with an empty file in the project dir
|
|
300
|
-
- `/usr/local/share/ca-certificates/` → copy cert to project dir
|
|
301
|
-
- `/home/agent/` → clone to workspace instead
|
|
302
|
-
|
|
303
|
-
### Git clone and virtiofs
|
|
304
|
-
|
|
305
|
-
The workspace is mounted via virtiofs. Git's pack file handling can corrupt over virtiofs during clone. Workaround: clone to `/home/agent` first, then `mv` into the workspace.
|
|
306
|
-
|
|
307
|
-
## Troubleshooting
|
|
308
|
-
|
|
309
|
-
### pnpm install fails with SELF_SIGNED_CERT_IN_CHAIN
|
|
310
|
-
```bash
|
|
311
|
-
npm config set strict-ssl false
|
|
312
|
-
```
|
|
313
|
-
|
|
314
|
-
### Container build fails with proxy errors
|
|
315
|
-
```bash
|
|
316
|
-
docker build \
|
|
317
|
-
--build-arg http_proxy=$http_proxy \
|
|
318
|
-
--build-arg https_proxy=$https_proxy \
|
|
319
|
-
-t paraclaw-agent:latest container/
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
### Agent containers fail with "path not shared"
|
|
323
|
-
All bind-mounted paths must be under the workspace directory. Check:
|
|
324
|
-
- Is Paraclaw cloned into the workspace? (not `/home/agent/`)
|
|
325
|
-
- Is the CA cert copied to the project root?
|
|
326
|
-
- Has the empty `.env` shadow file been created?
|
|
327
|
-
|
|
328
|
-
### Agent containers can't reach Anthropic API
|
|
329
|
-
Verify proxy env vars are forwarded to agent containers. Check container logs for `HTTP_PROXY=http://host.docker.internal:3128`.
|
|
330
|
-
|
|
331
|
-
### WhatsApp error 405
|
|
332
|
-
The version fetch is returning a stale version. Make sure the proxy-aware `fetchWaVersionViaProxy` patch is applied — it fetches `sw.js` through `HttpsProxyAgent` and parses `client_revision`.
|
|
333
|
-
|
|
334
|
-
### WhatsApp "Connection failed" immediately
|
|
335
|
-
Proxy bypass not configured. From the **host**, run:
|
|
336
|
-
```bash
|
|
337
|
-
docker sandbox network proxy <sandbox-name> \
|
|
338
|
-
--bypass-host web.whatsapp.com \
|
|
339
|
-
--bypass-host "*.whatsapp.com" \
|
|
340
|
-
--bypass-host "*.whatsapp.net"
|
|
341
|
-
```
|
|
342
|
-
|
|
343
|
-
### Telegram bot doesn't receive messages
|
|
344
|
-
1. Check the grammy proxy patch is applied (look for `HttpsProxyAgent` in `src/channels/telegram.ts`)
|
|
345
|
-
2. Check Group Privacy is disabled in @BotFather if using in groups
|
|
346
|
-
|
|
347
|
-
### Git clone fails with "inflate: data stream error"
|
|
348
|
-
Clone to a non-workspace path first, then move:
|
|
349
|
-
```bash
|
|
350
|
-
cd ~ && git clone https://github.com/ParachuteComputer/paraclaw.git && mv paraclaw /path/to/workspace/paraclaw
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
### WhatsApp QR code doesn't display
|
|
354
|
-
Run the auth command interactively inside the sandbox (not piped through `docker sandbox exec`):
|
|
355
|
-
```bash
|
|
356
|
-
docker sandbox run shell-paraclaw-workspace
|
|
357
|
-
# Then inside:
|
|
358
|
-
pnpm exec tsx src/whatsapp-auth.ts
|
|
359
|
-
```
|
package/docs/isolation-model.md
DELETED
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
# Channel Isolation Model
|
|
2
|
-
|
|
3
|
-
Paraclaw decouples messaging channels from agent groups. When you connect a channel (Discord, Telegram, Slack, GitHub, etc.), you decide how it relates to your existing agents. There are three isolation levels.
|
|
4
|
-
|
|
5
|
-
## The Three Levels
|
|
6
|
-
|
|
7
|
-
### 1. Shared Session
|
|
8
|
-
|
|
9
|
-
Multiple channels feed into the same conversation. The agent sees all messages from all channels in one thread.
|
|
10
|
-
|
|
11
|
-
**What's shared:** Everything — workspace, memory, CLAUDE.md, and the conversation itself. A GitHub PR comment and a Slack message appear side by side in the agent's context.
|
|
12
|
-
|
|
13
|
-
**Example:** A Slack channel paired with GitHub webhooks. The agent receives PR review requests via GitHub and discusses them in Slack — all in one session. When someone comments on a PR, the agent can reference the earlier Slack discussion about that feature.
|
|
14
|
-
|
|
15
|
-
**When to use:** When one channel feeds context into another. Webhook/notification channels (GitHub, Linear) paired with a chat channel (Slack, Discord) are the classic case.
|
|
16
|
-
|
|
17
|
-
**Technical:** Both messaging groups are wired to the same agent group with `session_mode: 'agent-shared'`. Session resolution looks up by agent group ID only, ignoring the messaging group — so all channels converge on one session.
|
|
18
|
-
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
### 2. Same Agent, Separate Sessions
|
|
22
|
-
|
|
23
|
-
Multiple channels share the same agent (same workspace, memory, personality) but have independent conversations.
|
|
24
|
-
|
|
25
|
-
**What's shared:** Workspace, memory, CLAUDE.md, and all persistent state. If you tell the agent something in one session, it can save that to memory and recall it in another. The agent's personality, knowledge, and tools are identical across sessions.
|
|
26
|
-
|
|
27
|
-
**What's separate:** The conversation thread. Messages from one channel don't appear in the other channel's session. Each channel has its own context window and conversation history.
|
|
28
|
-
|
|
29
|
-
**Example:** You have three Telegram chats with your agent — one for a side project, one for personal tasks, one for work. All three share the same agent workspace. If you ask it to remember your API key naming convention in the project chat, it may recall that convention in the work chat too. But the conversations themselves are independent.
|
|
30
|
-
|
|
31
|
-
**When to use:** When you're the primary (or sole) participant across channels and you want a unified agent identity. This is the most common setup for personal use across multiple platforms or multiple groups within one platform.
|
|
32
|
-
|
|
33
|
-
**Technical:** Multiple messaging groups are wired to the same agent group with `session_mode: 'shared'` (or `'per-thread'`). Each messaging group gets its own session, but they all run in the same agent group folder.
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
### 3. Separate Agent Groups
|
|
38
|
-
|
|
39
|
-
Each channel gets its own agent with its own workspace, memory, and personality. Nothing is shared.
|
|
40
|
-
|
|
41
|
-
**What's shared:** Nothing. The agents don't know about each other. Different CLAUDE.md, different memory, different workspace, different conversation history.
|
|
42
|
-
|
|
43
|
-
**Example:** You have a Telegram group with a friend and a Discord server for a team project. The friend shouldn't know what you discuss with your team, and vice versa. Each gets its own agent with its own memory and personality.
|
|
44
|
-
|
|
45
|
-
**When to use:** When different people are involved, or when the information in one channel should never leak to another. This is the right choice whenever there's a privacy or confidentiality boundary between channels.
|
|
46
|
-
|
|
47
|
-
**Technical:** Each channel is wired to a different agent group, each with its own folder under `groups/`. Separate containers, separate session databases, separate everything.
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## How to Decide
|
|
52
|
-
|
|
53
|
-
The key question: **Are you okay with any and every piece of information from one channel being available in the other?**
|
|
54
|
-
|
|
55
|
-
- **No** → Separate agent groups (level 3)
|
|
56
|
-
- **Yes, and the channels should see each other's messages** → Shared session (level 1)
|
|
57
|
-
- **Yes, but the conversations should be independent** → Same agent, separate sessions (level 2)
|
|
58
|
-
|
|
59
|
-
### Rules of Thumb
|
|
60
|
-
|
|
61
|
-
| Scenario | Recommended Level |
|
|
62
|
-
|----------|------------------|
|
|
63
|
-
| Just you, multiple platforms (Telegram + Discord + Slack) | Same agent, separate sessions |
|
|
64
|
-
| Just you, multiple groups on one platform (3 Telegram chats) | Same agent, separate sessions |
|
|
65
|
-
| Webhook channel + chat channel (GitHub + Slack) | Shared session |
|
|
66
|
-
| Channel with friend A and channel with friend B | Separate agent groups |
|
|
67
|
-
| Personal channel and work channel | Separate agent groups |
|
|
68
|
-
| Team channel with different access levels | Separate agent groups |
|
|
69
|
-
|
|
70
|
-
### When in Doubt
|
|
71
|
-
|
|
72
|
-
If the participants are the same across channels → same agent group is usually fine.
|
|
73
|
-
|
|
74
|
-
If different people are involved → separate agent groups. Information will cross-pollinate through agent memory if you don't.
|
|
75
|
-
|
|
76
|
-
## Entity Model
|
|
77
|
-
|
|
78
|
-
```
|
|
79
|
-
agent_groups (workspace, memory, CLAUDE.md, personality)
|
|
80
|
-
↕ many-to-many
|
|
81
|
-
messaging_groups (a specific channel/chat/group on a platform)
|
|
82
|
-
via
|
|
83
|
-
messaging_group_agents (session_mode, trigger_rules, priority)
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
- **Shared session:** multiple messaging_groups → same agent_group, `session_mode = 'agent-shared'`
|
|
87
|
-
- **Same agent, separate sessions:** multiple messaging_groups → same agent_group, `session_mode = 'shared'`
|
|
88
|
-
- **Separate agents:** each messaging_group → different agent_group
|
package/docs/ollama.md
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
# Running Agents on Local Ollama
|
|
2
|
-
|
|
3
|
-
Paraclaw agents can be routed to a local [Ollama](https://ollama.com) instance instead of the Anthropic API. This cuts API costs to zero and keeps all inference on your hardware.
|
|
4
|
-
|
|
5
|
-
## How It Works
|
|
6
|
-
|
|
7
|
-
Ollama exposes an Anthropic-compatible `/v1/messages` endpoint. The Claude Code CLI (which runs inside agent containers) uses the Anthropic SDK, which reads `ANTHROPIC_BASE_URL` to find the API host. Pointing that variable at Ollama is all that's needed — no new provider code, no changes to the agent runtime.
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
┌─────────────────────────────┐
|
|
11
|
-
│ Agent container │
|
|
12
|
-
│ │
|
|
13
|
-
│ Claude Code CLI │
|
|
14
|
-
│ ↓ ANTHROPIC_BASE_URL │
|
|
15
|
-
│ http://host.docker. │ ┌──────────────────┐
|
|
16
|
-
│ internal:11434 ───────┼─────▶│ Ollama :11434 │
|
|
17
|
-
│ │ │ gemma4:latest │
|
|
18
|
-
└─────────────────────────────┘ └──────────────────┘
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
`host.docker.internal` is Docker's magic hostname that resolves to the host machine from inside a container — so Ollama running on your Mac or Linux box is reachable at that address.
|
|
22
|
-
|
|
23
|
-
## Network Isolation
|
|
24
|
-
|
|
25
|
-
Setting `ANTHROPIC_BASE_URL` redirects requests but doesn't prevent a misconfigured agent from accidentally reaching `api.anthropic.com` directly. The `blockedHosts` field in `container.json` adds a Docker `--add-host` flag that resolves the domain to `0.0.0.0`, making it physically unreachable from inside the container:
|
|
26
|
-
|
|
27
|
-
```json
|
|
28
|
-
"blockedHosts": ["api.anthropic.com"]
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
With this in place, even if the model setting drifts back to a Claude model name, the API call will fail immediately rather than silently billing your account.
|
|
32
|
-
|
|
33
|
-
## Model Selection
|
|
34
|
-
|
|
35
|
-
The Claude Code CLI reads its model from `~/.claude/settings.json` inside the container, which paraclaw bind-mounts from `data/sessions/<agent-group-id>/.claude-shared/settings.json`. Set `"model": "gemma4:latest"` (or whatever Ollama model you've pulled) there. Use the exact name from `ollama list`.
|
|
36
|
-
|
|
37
|
-
Model selection considerations for Apple Silicon:
|
|
38
|
-
|
|
39
|
-
| Model | Size | Quality | Speed (M4 Pro) |
|
|
40
|
-
|-------|------|---------|----------------|
|
|
41
|
-
| `gemma4:latest` | 12B | Good general-purpose | Fast |
|
|
42
|
-
| `qwen3-coder:latest` | 32B | Excellent for coding tasks | Moderate |
|
|
43
|
-
| `llama3.2:latest` | 3B | Basic | Very fast |
|
|
44
|
-
|
|
45
|
-
The agent uses tool calls extensively (read/write files, shell commands). Models that support tool use reliably work best. Gemma 4 and Qwen 3 Coder both handle structured tool calls well.
|
|
46
|
-
|
|
47
|
-
## What Changes at the Code Level
|
|
48
|
-
|
|
49
|
-
Three files need to support this feature. See `/add-ollama-provider` for the exact changes.
|
|
50
|
-
|
|
51
|
-
**`src/container-config.ts`** — `ContainerConfig` interface needs `env` and `blockedHosts` fields so the per-group JSON can carry them.
|
|
52
|
-
|
|
53
|
-
**`src/container-runner.ts`** — At container spawn time, `env` entries become `-e KEY=VAL` Docker flags (applied after paraclaw's injected secret env vars so the per-group config wins), and `blockedHosts` entries become `--add-host HOST:0.0.0.0` flags.
|
|
54
|
-
|
|
55
|
-
**`container/Dockerfile`** — The container runs as the host user's uid (e.g. 501 on macOS), not as the `node` user (uid 1000). The home directory must be `chmod 777` so any uid can write `~/.claude.json` and `~/.claude/settings.json`.
|
|
56
|
-
|
|
57
|
-
## Tradeoffs
|
|
58
|
-
|
|
59
|
-
| | Ollama (local) | Anthropic API |
|
|
60
|
-
|---|---|---|
|
|
61
|
-
| Cost | Free | Pay-per-token |
|
|
62
|
-
| Privacy | Fully local | Data sent to Anthropic |
|
|
63
|
-
| Model quality | Good (open-weight) | Excellent (Claude) |
|
|
64
|
-
| Cold start | 5–30s (model load) | ~1s |
|
|
65
|
-
| Context window | Varies by model | 200k tokens (Sonnet) |
|
|
66
|
-
| Tool use reliability | Good (large models) | Excellent |
|
|
67
|
-
| Hardware req. | 16GB+ RAM | None |
|
|
68
|
-
|
|
69
|
-
For personal automation on capable hardware, the tradeoff favors local. For complex multi-step tasks requiring large context or high reliability, Claude is still ahead.
|
|
70
|
-
|
|
71
|
-
## Reverting to Claude
|
|
72
|
-
|
|
73
|
-
Remove the `env` and `blockedHosts` keys from `groups/<folder>/container.json`, remove `"model"` from the shared settings file, and restart the service. No rebuild needed.
|
|
74
|
-
|
|
75
|
-
## See Also
|
|
76
|
-
|
|
77
|
-
- `/add-ollama-provider` — step-by-step skill to configure any agent group for Ollama
|
|
78
|
-
- [Ollama Anthropic compatibility docs](https://ollama.com/blog/openai-compatibility) — upstream docs on the API bridge
|
|
79
|
-
- `docs/architecture.md` — how the container spawn and env injection pipeline works
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
# Parachute integration
|
|
2
|
-
|
|
3
|
-
parachute-agent is a Parachute module: it ships with a `.parachute/module.json` manifest, registers in the hub's services catalog at install, and accepts hub-issued JWTs on every `/api/*` route. This doc covers what gets wired up when you `parachute install parachute-agent`, plus how vault attachments work inside an agent group.
|
|
4
|
-
|
|
5
|
-
## Module shape
|
|
6
|
-
|
|
7
|
-
`.parachute/module.json` declares the slot:
|
|
8
|
-
|
|
9
|
-
```json
|
|
10
|
-
{
|
|
11
|
-
"name": "agent",
|
|
12
|
-
"manifestName": "parachute-agent",
|
|
13
|
-
"displayName": "Parachute Agent",
|
|
14
|
-
"kind": "frontend",
|
|
15
|
-
"port": 1944,
|
|
16
|
-
"paths": ["/agent"],
|
|
17
|
-
"health": "/api/health",
|
|
18
|
-
"startCmd": ["bun", "src/index.ts"],
|
|
19
|
-
"scopes": { "defines": ["agent:read", "agent:write", "agent:admin"] }
|
|
20
|
-
}
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
The hub uses this to:
|
|
24
|
-
- Reserve port 1944 on the operator's tailnet.
|
|
25
|
-
- Mount the SPA at `/agent/`.
|
|
26
|
-
- Add `agent:read|write|admin` to its OAuth scope catalog.
|
|
27
|
-
- Record parachute-agent in `~/.parachute/services.json` so peer modules can discover it.
|
|
28
|
-
|
|
29
|
-
parachute-agent also publishes its own capability card at `/.well-known/parachute.json` (sourced from the manifest) for runtime discovery without hardcoding.
|
|
30
|
-
|
|
31
|
-
## Auth
|
|
32
|
-
|
|
33
|
-
Every `/api/*` route requires a hub-issued JWT — operator token (CLI/scripts) or user OAuth (browser). Validation is via JWKS against the hub origin (`PARACHUTE_HUB_ORIGIN`, stamped on every spawned module by the hub lifecycle). Two routes stay unauthenticated: `/api/health` (operational probe) and `/api/discovery` (returns hub origin so the SPA can bootstrap OAuth without a baked-in URL).
|
|
34
|
-
|
|
35
|
-
## Vault attachments
|
|
36
|
-
|
|
37
|
-
An agent group can attach to one or more Parachute vaults. Each attachment grants the in-container Claude Agent SDK a Parachute Vault MCP tool surface (query-notes, create-note, update-note, delete-note, list-tags, update-tag, delete-tag, find-path, vault-info).
|
|
38
|
-
|
|
39
|
-
### Storage
|
|
40
|
-
|
|
41
|
-
Attachments are filesystem-scoped, not database-scoped. Two files per group:
|
|
42
|
-
|
|
43
|
-
- `groups/<folder>/container.json` — the container's MCP config. The vault attachment lands here as an entry under `mcpServers`:
|
|
44
|
-
|
|
45
|
-
```json
|
|
46
|
-
{
|
|
47
|
-
"mcpServers": {
|
|
48
|
-
"parachute-vault": {
|
|
49
|
-
"type": "http",
|
|
50
|
-
"url": "http://127.0.0.1:1940/vault/default/mcp",
|
|
51
|
-
"headers": { "Authorization": "Bearer pvt_..." },
|
|
52
|
-
"instructions": "You have access to a Parachute Vault at ..."
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
- `groups/<folder>/parachute.json` — a sibling record holding metadata for the host:
|
|
59
|
-
|
|
60
|
-
```json
|
|
61
|
-
{
|
|
62
|
-
"vault": {
|
|
63
|
-
"parachute-vault": {
|
|
64
|
-
"vaultBaseUrl": "http://127.0.0.1:1940/vault/default",
|
|
65
|
-
"scope": "vault:read",
|
|
66
|
-
"tokenLabel": "claw-research-bot",
|
|
67
|
-
"attachedAt": "2026-04-28T..."
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
```
|
|
72
|
-
|
|
73
|
-
The agent-runner reads `container.json` at spawn and passes `mcpServers` straight through to Claude Agent SDK's `query()`, which supports HTTP-transport MCPs natively.
|
|
74
|
-
|
|
75
|
-
### Workflow
|
|
76
|
-
|
|
77
|
-
```sh
|
|
78
|
-
# Mint a scoped token via the hub's vault module.
|
|
79
|
-
parachute vault tokens create --scope vault:read --label claw-research-bot
|
|
80
|
-
# → pvt_...
|
|
81
|
-
|
|
82
|
-
# Attach via parachute-agent's web UI (preferred) or CLI.
|
|
83
|
-
pnpm run parachute attach-vault research-bot --token pvt_... --scope vault:read
|
|
84
|
-
|
|
85
|
-
# Inspect.
|
|
86
|
-
pnpm run parachute status # all groups
|
|
87
|
-
pnpm run parachute status research-bot # one group
|
|
88
|
-
|
|
89
|
-
# Detach (does NOT revoke).
|
|
90
|
-
pnpm run parachute detach-vault research-bot
|
|
91
|
-
parachute vault tokens revoke claw-research-bot
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### What this deliberately does NOT impose
|
|
95
|
-
|
|
96
|
-
- **No prescribed note layout.** The agent group has vault access; how it organizes notes is the agent's business.
|
|
97
|
-
- **No conflation with parachute-agent secrets.** Outbound third-party API keys (Telegram, OpenAI, etc.) live in parachute-agent's local AES-GCM secret store and get injected as container env vars. Vault is for the user's knowledge graph; the secret store is for outbound credentials. Different concerns, different layers.
|
|
98
|
-
|
|
99
|
-
### Threat model
|
|
100
|
-
|
|
101
|
-
- **Token scope is the boundary.** A `vault:read` agent physically cannot create or delete vault notes. A `vault:write` agent cannot revoke other tokens. A `vault:admin` agent is fully trusted; use sparingly.
|
|
102
|
-
- **Token is plaintext on disk and inside the container.** The bearer lives in `container.json` (host) and at `/workspace/agent/container.json` (container, read-only mount). Anyone with shell access on either side can read it. Same posture as any MCP credential — once inside the container they're plaintext env vars, same as any standard process environment.
|
|
103
|
-
- **Revocation is per-token.** `parachute vault tokens revoke <label>` invalidates the agent's access immediately; the next request will get 401.
|
|
104
|
-
|
|
105
|
-
## Lifecycle hooks
|
|
106
|
-
|
|
107
|
-
`parachute install`, `parachute start`, `parachute restart`, `parachute stop` — the hub drives lifecycle via the manifest. Install runs migrations, generates the master key if absent, and registers parachute-agent in the services catalog. Start runs `bun src/index.ts`.
|
|
108
|
-
|
|
109
|
-
For the full design of hub-as-issuer OAuth and the services catalog, see `parachute.computer/design/2026-04-20-hub-as-portal-oauth-and-service-catalog.md`.
|