@openparachute/agent 0.1.2 → 0.2.2
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 +35 -42
- 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/dist/assets/index-C-iWdFFV.css +1 -0
- package/web/ui/dist/assets/index-VFETBk0a.js +60 -0
- package/web/ui/dist/index.html +15 -0
- 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 -263
- 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 -172
- package/scripts/init-first-agent.ts +0 -378
- 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 -80
- 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/api-translator.test.ts +0 -306
- package/src/channels/api-translator.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 -128
- 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 -269
- package/src/container-runtime.ts +0 -167
- 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 -176
- package/src/db/connection.ts +0 -259
- 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 -232
- 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.test.ts +0 -126
- package/src/mcp/tools/channels.ts +0 -134
- 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/expand-path.test.ts +0 -82
- package/src/modules/mount-security/index.ts +0 -459
- 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 -641
- 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 -461
- package/src/secrets/master-key.ts +0 -70
- package/src/secrets/secrets.test.ts +0 -651
- package/src/session-manager.attachments.test.ts +0 -171
- package/src/session-manager.dup-skip.test.ts +0 -173
- package/src/session-manager.migrate.test.ts +0 -59
- package/src/session-manager.ts +0 -451
- 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 -233
- 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 -472
- package/src/web/routes/channels.ts +0 -311
- package/src/web/routes/oauth-providers.ts +0 -42
- package/src/web/routes/secrets.test.ts +0 -220
- package/src/web/routes/secrets.ts +0 -317
- 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 -1024
- package/src/web/services-manifest.test.ts +0 -148
- package/src/web/services-manifest.ts +0 -66
- 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 -1248
- package/web/ui/src/lib/auth.test.ts +0 -352
- package/web/ui/src/lib/auth.ts +0 -405
- 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.test.tsx +0 -206
- package/web/ui/src/routes/GroupDetail.tsx +0 -880
- 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 -942
- 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 -363
- 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/.parachute/module.json
CHANGED
|
@@ -1,14 +1,130 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent",
|
|
3
3
|
"manifestName": "parachute-agent",
|
|
4
|
-
"displayName": "
|
|
5
|
-
"tagline": "
|
|
6
|
-
"
|
|
7
|
-
"port": 1944,
|
|
4
|
+
"displayName": "Agent",
|
|
5
|
+
"tagline": "Chat with your Claude Code sessions — a session per agent.",
|
|
6
|
+
"port": 1941,
|
|
8
7
|
"paths": ["/agent"],
|
|
9
|
-
"health": "/
|
|
10
|
-
"
|
|
8
|
+
"health": "/health",
|
|
9
|
+
"stripPrefix": true,
|
|
10
|
+
"uiUrl": "/agent/app/",
|
|
11
|
+
"configUiUrl": "/agent/app/",
|
|
12
|
+
"websocket": true,
|
|
13
|
+
"focus": "experimental",
|
|
14
|
+
"adminCapabilities": ["config"],
|
|
15
|
+
"startCmd": ["parachute-agent"],
|
|
11
16
|
"scopes": {
|
|
12
|
-
"defines": ["agent:read", "agent:write", "agent:admin"]
|
|
13
|
-
}
|
|
17
|
+
"defines": ["agent:read", "agent:write", "agent:send", "agent:admin"]
|
|
18
|
+
},
|
|
19
|
+
"events": [
|
|
20
|
+
{ "key": "message.received", "title": "A message arrived for an agent" },
|
|
21
|
+
{ "key": "message.sent", "title": "An agent replied" }
|
|
22
|
+
],
|
|
23
|
+
"actions": [
|
|
24
|
+
{
|
|
25
|
+
"key": "message.deliver",
|
|
26
|
+
"title": "Deliver an inbound message (wakes the session)",
|
|
27
|
+
"endpoint": "/api/vault/inbound",
|
|
28
|
+
"scope": "agent:send",
|
|
29
|
+
"provision": {
|
|
30
|
+
"type": "vault-trigger",
|
|
31
|
+
"note": "hub registers a vault runtime trigger that webhooks the agent inbound endpoint with an agent:send bearer"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"key": "definition.reload",
|
|
36
|
+
"title": "Reload a changed agent definition (re-instantiate the agent)",
|
|
37
|
+
"endpoint": "/api/vault/agent-def",
|
|
38
|
+
"scope": "agent:send",
|
|
39
|
+
"provision": {
|
|
40
|
+
"type": "vault-trigger",
|
|
41
|
+
"note": "hub registers a vault runtime trigger that webhooks the agent-def reload endpoint with an agent:send bearer; the daemon re-reads the one changed #agent/definition note and (re)instantiates that agent"
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"connectionTemplates": [
|
|
46
|
+
{
|
|
47
|
+
"key": "link-to-vault",
|
|
48
|
+
"title": "Link an agent to a vault",
|
|
49
|
+
"description": "Back an agent with a Parachute vault: inbound notes wake the agent, replies are written back as notes. The operator picks WHICH vault (the parameter) and names the agent's channel; the agent's config UI creates the connection with the operator's approval (the click is the approval).",
|
|
50
|
+
"requestedBy": "agent",
|
|
51
|
+
"source": {
|
|
52
|
+
"module": "vault",
|
|
53
|
+
"event": "note.created",
|
|
54
|
+
"filter": {
|
|
55
|
+
"tags": ["#agent/message/inbound"],
|
|
56
|
+
"has_metadata": ["channel"],
|
|
57
|
+
"missing_metadata": ["channel_inbound_rendered_at"]
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"sink": {
|
|
61
|
+
"module": "agent",
|
|
62
|
+
"action": "message.deliver"
|
|
63
|
+
},
|
|
64
|
+
"parameters": [
|
|
65
|
+
{
|
|
66
|
+
"key": "vault",
|
|
67
|
+
"target": "source.vault",
|
|
68
|
+
"title": "Vault",
|
|
69
|
+
"description": "Which vault stores this channel's messages — the operator chooses from the hub's installed vaults."
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"key": "channel",
|
|
73
|
+
"target": "sink.params.channel",
|
|
74
|
+
"title": "Channel name",
|
|
75
|
+
"description": "A unique slug naming the channel the session connects to."
|
|
76
|
+
}
|
|
77
|
+
]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"key": "reload-defs-on-create",
|
|
81
|
+
"title": "Reload agent definitions on create",
|
|
82
|
+
"description": "Make a new #agent/definition note instantiate its agent live, instead of converging only via the 60s loadAll poll. The operator picks WHICH def-vault (the parameter); the connection's creation in the hub Connections view is the operator's approval. Pair with reload-defs-on-edit to cover edits too — the hub binds one event per connection, so create and edit are two connections.",
|
|
83
|
+
"requestedBy": "agent",
|
|
84
|
+
"source": {
|
|
85
|
+
"module": "vault",
|
|
86
|
+
"event": "note.created",
|
|
87
|
+
"filter": {
|
|
88
|
+
"tags": ["#agent/definition"]
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
"sink": {
|
|
92
|
+
"module": "agent",
|
|
93
|
+
"action": "definition.reload"
|
|
94
|
+
},
|
|
95
|
+
"parameters": [
|
|
96
|
+
{
|
|
97
|
+
"key": "vault",
|
|
98
|
+
"target": "source.vault",
|
|
99
|
+
"title": "Def-vault",
|
|
100
|
+
"description": "Which vault holds the #agent/definition notes — the operator chooses from the hub's installed vaults."
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"key": "reload-defs-on-edit",
|
|
106
|
+
"title": "Reload agent definitions on edit",
|
|
107
|
+
"description": "Make an edited #agent/definition note re-instantiate its agent live, instead of converging only via the 60s loadAll poll. The operator picks WHICH def-vault (the parameter); the connection's creation in the hub Connections view is the operator's approval. Pair with reload-defs-on-create to cover creates too — the hub binds one event per connection, so create and edit are two connections.",
|
|
108
|
+
"requestedBy": "agent",
|
|
109
|
+
"source": {
|
|
110
|
+
"module": "vault",
|
|
111
|
+
"event": "note.updated",
|
|
112
|
+
"filter": {
|
|
113
|
+
"tags": ["#agent/definition"]
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
"sink": {
|
|
117
|
+
"module": "agent",
|
|
118
|
+
"action": "definition.reload"
|
|
119
|
+
},
|
|
120
|
+
"parameters": [
|
|
121
|
+
{
|
|
122
|
+
"key": "vault",
|
|
123
|
+
"target": "source.vault",
|
|
124
|
+
"title": "Def-vault",
|
|
125
|
+
"description": "Which vault holds the #agent/definition notes — the operator chooses from the hub's installed vaults."
|
|
126
|
+
}
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
]
|
|
14
130
|
}
|
package/LICENSE
CHANGED
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
Copyright (c) 2026 Aaron Gabriel Neyer (and contributors to parachute-agent)
|
|
2
|
-
|
|
3
|
-
parachute-agent is a derivative of NanoClaw
|
|
4
|
-
(https://github.com/qwibitai/nanoclaw), which is MIT-licensed
|
|
5
|
-
(Copyright (c) 2026 Gavriel). The original NanoClaw copyright notice
|
|
6
|
-
and permission text are preserved verbatim in LICENSE-NANOCLAW-MIT.
|
|
7
|
-
|
|
8
|
-
Modifications made by Aaron Gabriel Neyer and the parachute-agent
|
|
9
|
-
contributors, and the combined work, are licensed under the GNU
|
|
10
|
-
Affero General Public License, version 3, the full text of which
|
|
11
|
-
follows.
|
|
12
|
-
|
|
13
|
-
----------------------------------------------------------------------
|
|
14
|
-
|
|
15
1
|
GNU AFFERO GENERAL PUBLIC LICENSE
|
|
16
2
|
Version 3, 19 November 2007
|
|
17
3
|
|
|
@@ -647,8 +633,8 @@ the "copyright" line and a pointer to where the full notice is found.
|
|
|
647
633
|
Copyright (C) <year> <name of author>
|
|
648
634
|
|
|
649
635
|
This program is free software: you can redistribute it and/or modify
|
|
650
|
-
it under the terms of the GNU Affero General Public License as published
|
|
651
|
-
the Free Software Foundation, either version 3 of the License, or
|
|
636
|
+
it under the terms of the GNU Affero General Public License as published
|
|
637
|
+
by the Free Software Foundation, either version 3 of the License, or
|
|
652
638
|
(at your option) any later version.
|
|
653
639
|
|
|
654
640
|
This program is distributed in the hope that it will be useful,
|
package/README.md
CHANGED
|
@@ -1,197 +1,149 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Agent
|
|
2
|
+
|
|
3
|
+
**Chat with your Claude Code sessions — a channel per session.**
|
|
4
|
+
|
|
5
|
+
> ⚠️ **Experimental (v0.1.0).** Agent is a preview, evolving quickly. It runs
|
|
6
|
+
> today on an owner-operated, trusted machine — it is **not yet hardened for
|
|
7
|
+
> untrusted or multi-tenant use**. Read [Status & safety](#status--safety) before
|
|
8
|
+
> you rely on it. (Part of [Parachute](https://parachute.computer); conventions in
|
|
9
|
+
> [`parachute-patterns`](https://github.com/ParachuteComputer/parachute-patterns).)
|
|
10
|
+
|
|
11
|
+
Agent is a **messaging fabric for Claude Code**. One daemon hosts named
|
|
12
|
+
*channels*; a Claude Code session connects to a channel, and you talk to it — from
|
|
13
|
+
Telegram, from a Parachute vault, or from the built-in web chat. The session
|
|
14
|
+
replies on the same channel. It also lets you **spawn and watch sandboxed agent
|
|
15
|
+
sessions from the browser**.
|
|
16
|
+
|
|
17
|
+
## What you get
|
|
18
|
+
|
|
19
|
+
- **Talk to a session over any transport.** A channel is bound to one transport:
|
|
20
|
+
- `vault` — messages are durable [`#agent/message`](#vault-backed-channels)
|
|
21
|
+
notes in a Parachute vault, so the conversation is queryable and renders in any
|
|
22
|
+
vault surface (this is the recommended transport).
|
|
23
|
+
- `telegram` — a Telegram bot, one per channel.
|
|
24
|
+
- `http-ui` — an ephemeral in-memory transport for quick local testing.
|
|
25
|
+
- **A built-in web surface** at `<hub-origin>/agent/` — Home, Chat, Agents,
|
|
26
|
+
Terminal, and Config, on the Parachute brand. Chat over a `vault` channel shows
|
|
27
|
+
the durable transcript and writes your messages back as notes.
|
|
28
|
+
- **Sandboxed agent sessions.** Spawn a Claude Code session in a sandbox (scoped
|
|
29
|
+
filesystem + a network posture you choose), bound to a channel, and watch it in
|
|
30
|
+
an in-page terminal. See [Agents](#agent-sessions).
|
|
31
|
+
|
|
32
|
+
## How it works
|
|
33
|
+
|
|
34
|
+
Two components connected by SSE — a long-running **daemon** and a per-session
|
|
35
|
+
**bridge**:
|
|
2
36
|
|
|
3
|
-
<p align="center">
|
|
4
|
-
An AI assistant that runs agents securely in their own containers. Lightweight, built to be easily understood and completely customized for your needs. A [Parachute](https://parachute.computer) module.
|
|
5
|
-
</p>
|
|
6
|
-
|
|
7
|
-
<p align="center">
|
|
8
|
-
<a href="https://parachute.computer">parachute.computer</a> •
|
|
9
|
-
<a href="docs/">docs</a> •
|
|
10
|
-
<a href="README_zh.md">中文</a> •
|
|
11
|
-
<a href="README_ja.md">日本語</a>
|
|
12
|
-
</p>
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## Why parachute-agent
|
|
17
|
-
|
|
18
|
-
Most AI-assistant frameworks fall into one of two camps: heavyweight platforms with hundreds of thousands of lines of code, dozens of config files, and security at the application layer (allowlists, pairing codes); or DIY scripts with no isolation at all. Both ask you to either trust software you can't read, or hand the agent direct access to your machine.
|
|
19
|
-
|
|
20
|
-
parachute-agent runs each agent group in its own Linux container with filesystem isolation, in a codebase small enough to read in an afternoon — one process and a handful of files. Bash access is safe because commands run inside the container, not on your host. The user's [Parachute Vault](https://github.com/ParachuteComputer/parachute-vault) is the agent's substrate: scoped vault tokens grant exactly the read/write surface you choose, and credentials live in a local AES-GCM-encrypted store, never round-tripped through chat context.
|
|
21
|
-
|
|
22
|
-
## Quick Start
|
|
23
|
-
|
|
24
|
-
parachute-agent is a [Parachute](https://parachute.computer) module — install it through the hub and configure it from the web UI:
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
parachute install parachute-agent
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
The hub builds the agent container, brings the host process up under `bun src/index.ts`, and serves the configuration UI at `http://127.0.0.1:1944/agent/`. From there: drop in your Anthropic API key, pick a channel (Telegram, Discord, or the local CLI), and pair your first agent — no shell scripts required. See [`docs/parachute-integration.md`](docs/parachute-integration.md) for the full Parachute path.
|
|
31
|
-
|
|
32
|
-
## Philosophy
|
|
33
|
-
|
|
34
|
-
**Small enough to understand.** One process, a few source files and no microservices. If you want to understand the full parachute-agent codebase, just ask Claude Code to walk you through it.
|
|
35
|
-
|
|
36
|
-
**Secure by isolation.** Agents run in Linux containers and they can only see what's explicitly mounted. Bash access is safe because commands run inside the container, not on your host.
|
|
37
|
-
|
|
38
|
-
**Built for the individual user.** parachute-agent isn't a monolithic framework; it's software that fits each user's exact needs. Instead of becoming bloatware, parachute-agent is designed to be bespoke. You make your own fork and have Claude Code modify it to match your needs.
|
|
39
|
-
|
|
40
|
-
**Customization = code changes.** No configuration sprawl. Want different behavior? Modify the code. The codebase is small enough that it's safe to make changes.
|
|
41
|
-
|
|
42
|
-
**AI-native, hybrid by design.** The install and onboarding flow is an optimized scripted path, fast and deterministic. When a step needs judgment, whether a failed install, a guided decision, or a customization, control hands off to Claude Code seamlessly. Beyond setup there's no monitoring dashboard or debugging UI either: describe the problem in chat and Claude Code handles it.
|
|
43
|
-
|
|
44
|
-
**Skills over features.** Trunk ships the registry and infrastructure, not specific channel adapters or alternative agent providers. Channels (Discord, Slack, Telegram, WhatsApp, …) live on a long-lived `channels` branch; alternative providers (OpenCode, Ollama) live on `providers`. You run `/add-telegram`, `/add-opencode`, etc. and the skill copies exactly the module(s) you need into your fork. No feature you didn't ask for.
|
|
45
|
-
|
|
46
|
-
**Best harness, best model.** parachute-agent natively uses Claude Code via Anthropic's official Claude Agent SDK, so you get the latest Claude models and Claude Code's full toolset, including the ability to modify and expand your own parachute-agent fork. Other providers are drop-in options: `/add-codex` for OpenAI's Codex (ChatGPT subscription or API key), `/add-opencode` for OpenRouter, Google, DeepSeek and more via OpenCode, and `/add-ollama-provider` for local open-weight models. Provider is configurable per agent group.
|
|
47
|
-
|
|
48
|
-
## What It Supports
|
|
49
|
-
|
|
50
|
-
- **Multi-channel messaging** — WhatsApp, Telegram, Discord, Slack, Microsoft Teams, iMessage, Matrix, Google Chat, Webex, Linear, GitHub, WeChat, and email via Resend. Installed on demand with `/add-<channel>` skills. Run one or many at the same time.
|
|
51
|
-
- **Flexible isolation** — connect each channel to its own agent for full privacy, share one agent across many channels for unified memory with separate conversations, or fold multiple channels into a single shared session so one conversation spans many surfaces. Pick per channel via `/manage-channels`. See [docs/isolation-model.md](docs/isolation-model.md).
|
|
52
|
-
- **Per-agent workspace** — each agent group has its own `CLAUDE.md`, its own memory, its own container, and only the mounts you allow. Nothing crosses the boundary unless you wire it to.
|
|
53
|
-
- **Scheduled tasks** — recurring jobs that run Claude and can message you back
|
|
54
|
-
- **Web access** — search and fetch content from the web
|
|
55
|
-
- **Container isolation** — agents are sandboxed in Docker (macOS/Linux/WSL2), with optional [Docker Sandboxes](docs/docker-sandboxes.md) micro-VM isolation or Apple Container as a macOS-native opt-in
|
|
56
|
-
- **Credential security** — agents never hold raw API keys. parachute-agent stores credentials in a local AES-GCM-encrypted secret store (`~/.parachute/agent/master.key` + the central DB), injects them into the container's environment at spawn time, and never round-trips them through chat context.
|
|
57
|
-
|
|
58
|
-
## Usage
|
|
59
|
-
|
|
60
|
-
Talk to your assistant with the trigger word (default: `@Andy`):
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
@Andy send an overview of the sales pipeline every weekday morning at 9am (has access to my Obsidian vault folder)
|
|
64
|
-
@Andy review the git history for the past week each Friday and update the README if there's drift
|
|
65
|
-
@Andy every Monday at 8am, compile news on AI developments from Hacker News and TechCrunch and message me a briefing
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
From a channel you own or administer, you can manage groups and tasks:
|
|
69
37
|
```
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
38
|
+
your transports (Telegram / vault trigger / web chat)
|
|
39
|
+
↕
|
|
40
|
+
daemon (port 1941, one per machine) ──┐ owns each transport; fans inbound
|
|
41
|
+
↕ SSE (/events) + HTTP (/api/*) │ to subscribers, accepts outbound
|
|
42
|
+
bridge (stdio MCP, per session) │
|
|
43
|
+
↕ MCP notifications + tools │
|
|
44
|
+
Claude Code session ──────────────────┘ wakes on a message, replies with a tool
|
|
73
45
|
```
|
|
74
46
|
|
|
75
|
-
|
|
47
|
+
A session can also connect as a **pure HTTP MCP server** (by URL + OAuth, exactly
|
|
48
|
+
like adding the vault) — no local config file. See
|
|
49
|
+
[Connecting a session](#connecting-a-session).
|
|
76
50
|
|
|
77
|
-
|
|
51
|
+
Deeper design + operational detail live in [`CLAUDE.md`](./CLAUDE.md).
|
|
78
52
|
|
|
79
|
-
|
|
80
|
-
- "Remember in the future to make responses shorter and more direct"
|
|
81
|
-
- "Add a custom greeting when I say good morning"
|
|
82
|
-
- "Store conversation summaries weekly"
|
|
53
|
+
## Status & safety
|
|
83
54
|
|
|
84
|
-
|
|
55
|
+
Agent is `focus: experimental` and pre-1.0. What's solid vs. early:
|
|
85
56
|
|
|
86
|
-
|
|
57
|
+
- **Solid:** the daemon/bridge fabric, the vault + Telegram + http-ui transports,
|
|
58
|
+
hub registration + reverse-proxy, the web surface (Home/Chat/Agents/Terminal/
|
|
59
|
+
Config), and vault-backed durable chat.
|
|
60
|
+
- **Early / changing:** the npm package isn't published yet (run from source —
|
|
61
|
+
tracked in [#16](https://github.com/ParachuteComputer/parachute-agent/issues/16));
|
|
62
|
+
agent-session isolation is real but young; APIs may shift.
|
|
87
63
|
|
|
88
|
-
|
|
64
|
+
**Read this about agent sessions.** A spawned agent runs `claude` with
|
|
65
|
+
`--dangerously-skip-permissions` (it's autonomous — no human at the terminal to
|
|
66
|
+
answer prompts). The containment is the **OS sandbox**
|
|
67
|
+
([`@anthropic-ai/sandbox-runtime`](https://www.npmjs.com/package/@anthropic-ai/sandbox-runtime) —
|
|
68
|
+
Seatbelt on macOS, bubblewrap on Linux), with two independent boundaries you set
|
|
69
|
+
per spawn:
|
|
89
70
|
|
|
90
|
-
**
|
|
71
|
+
- **Filesystem** — `workspace` (default): reads are scoped to the agent's own
|
|
72
|
+
workspace + the claude runtime, so it **can't read your home tree** (SSH keys,
|
|
73
|
+
`~/.parachute/operator.token`, other projects); `full`: broad reads. Writes are
|
|
74
|
+
confined to the workspace in both.
|
|
75
|
+
- **Network** — `open` (default): full internet; `restricted`: only the
|
|
76
|
+
Anthropic API + your hub/vault + hosts you list.
|
|
91
77
|
|
|
92
|
-
|
|
78
|
+
The default (scoped reads + open network) is safe for your *own* agents because
|
|
79
|
+
the filesystem sandbox keeps secrets unreadable — open network can't exfiltrate
|
|
80
|
+
what the agent can't see. For an agent that handles **untrusted input**, use
|
|
81
|
+
`network: restricted`. This is appropriate for an owner-operated, trusted box;
|
|
82
|
+
full multi-tenant isolation is future work.
|
|
93
83
|
|
|
94
|
-
|
|
84
|
+
## Running it
|
|
95
85
|
|
|
96
|
-
|
|
86
|
+
Agent runs alongside the rest of a Parachute install (the
|
|
87
|
+
[hub](https://github.com/ParachuteComputer/parachute-hub) is the portal + OAuth
|
|
88
|
+
issuer). Until the npm package ships, run it from source:
|
|
97
89
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
## Requirements
|
|
104
|
-
|
|
105
|
-
- macOS or Linux (Windows via WSL2)
|
|
106
|
-
- Node.js 20+ and pnpm 10+ (the installer will install both if missing)
|
|
107
|
-
- [Docker Desktop](https://docker.com/products/docker-desktop) (macOS/Windows) or Docker Engine (Linux)
|
|
108
|
-
- [Claude Code](https://claude.ai/download) for `/customize`, `/debug`, error recovery during setup, and all `/add-<channel>` skills
|
|
109
|
-
|
|
110
|
-
## Architecture
|
|
111
|
-
|
|
112
|
-
```
|
|
113
|
-
messaging apps → host process (router) → inbound.db → container (Bun, Claude Agent SDK) → outbound.db → host process (delivery) → messaging apps
|
|
90
|
+
```bash
|
|
91
|
+
git clone https://github.com/ParachuteComputer/parachute-agent
|
|
92
|
+
cd parachute-agent
|
|
93
|
+
bun install
|
|
94
|
+
bun link # so `parachute start agent` follows this checkout
|
|
114
95
|
```
|
|
115
96
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
For the full architecture writeup see [docs/architecture.md](docs/architecture.md); for the three-level isolation model see [docs/isolation-model.md](docs/isolation-model.md).
|
|
121
|
-
|
|
122
|
-
Key files:
|
|
123
|
-
- `src/index.ts` — entry point: DB init, channel adapters, delivery polls, sweep
|
|
124
|
-
- `src/router.ts` — inbound routing: messaging group → agent group → session → `inbound.db`
|
|
125
|
-
- `src/delivery.ts` — polls `outbound.db`, delivers via adapter, handles system actions
|
|
126
|
-
- `src/host-sweep.ts` — 60s sweep: stale detection, due-message wake, recurrence
|
|
127
|
-
- `src/session-manager.ts` — resolves sessions, opens `inbound.db` / `outbound.db`
|
|
128
|
-
- `src/container-runner.ts` — spawns per-agent-group containers, injects encrypted secrets at spawn
|
|
129
|
-
- `src/db/` — central DB (users, roles, agent groups, messaging groups, wiring, migrations)
|
|
130
|
-
- `src/channels/` — channel adapter infra (adapters installed via `/add-<channel>` skills)
|
|
131
|
-
- `src/providers/` — host-side provider config (`claude` baked in; others via skills)
|
|
132
|
-
- `container/agent-runner/` — Bun agent-runner: poll loop, MCP tools, provider abstraction
|
|
133
|
-
- `groups/<folder>/` — per-agent-group filesystem (`CLAUDE.md`, skills, container config)
|
|
134
|
-
|
|
135
|
-
## FAQ
|
|
136
|
-
|
|
137
|
-
**Why Docker?**
|
|
138
|
-
|
|
139
|
-
Docker provides cross-platform support (macOS, Linux and Windows via WSL2) and a mature ecosystem. On macOS, you can optionally switch to Apple Container via `/convert-to-apple-container` for a lighter-weight native runtime. For additional isolation, [Docker Sandboxes](docs/docker-sandboxes.md) run each container inside a micro VM.
|
|
97
|
+
The daemon self-registers into `~/.parachute/services.json` and ships
|
|
98
|
+
`.parachute/module.json`, so the hub lists it in the portal and reverse-proxies
|
|
99
|
+
`<hub-origin>/agent/*` → the loopback daemon. Reach the web surface at
|
|
100
|
+
`<hub-origin>/agent/` (or `http://127.0.0.1:1941/` locally).
|
|
140
101
|
|
|
141
|
-
|
|
102
|
+
| | |
|
|
103
|
+
|---|---|
|
|
104
|
+
| npm | `@openparachute/agent` (publish pending [#16](https://github.com/ParachuteComputer/parachute-agent/issues/16)) |
|
|
105
|
+
| bins | `parachute-agent` (daemon), `parachute-agent-bridge` (session bridge) |
|
|
106
|
+
| port | `1941` · paths `/agent` |
|
|
107
|
+
| scopes | `agent:read` · `agent:write` · `agent:send` · `agent:admin` |
|
|
108
|
+
| state | `~/.parachute/agent/` (`channels.json`, `access.json`, `inbox/`) |
|
|
142
109
|
|
|
143
|
-
|
|
110
|
+
## The web surface
|
|
144
111
|
|
|
145
|
-
|
|
112
|
+
Reachable at `<hub-origin>/agent/`:
|
|
146
113
|
|
|
147
|
-
|
|
114
|
+
- **Home** — your channels + any running agents at a glance.
|
|
115
|
+
- **Chat** — talk to a channel. Over a `vault` channel you see the durable
|
|
116
|
+
transcript (markdown rendered); your messages are written back as notes.
|
|
117
|
+
- **Agents** — set the Claude credential, then spawn a sandboxed agent bound to a
|
|
118
|
+
channel; list + kill running agents.
|
|
119
|
+
- **Terminal** — attach to a running agent's session in an in-page xterm.
|
|
120
|
+
- **Config** — add/remove channels (vault / Telegram / http-ui).
|
|
148
121
|
|
|
149
|
-
|
|
122
|
+
## Vault-backed channels
|
|
150
123
|
|
|
151
|
-
|
|
124
|
+
A `vault` channel stores every message as a note carrying **two tags**: the parent
|
|
125
|
+
`#agent/message` (queryable membership — list a channel's whole transcript with
|
|
126
|
+
one `tag: "#agent/message"` + `metadata.channel` query) and a directional child
|
|
127
|
+
`#agent/message/inbound` (human→session) or `#agent/message/outbound`
|
|
128
|
+
(session→human). Inbound notes wake the session via a vault trigger; replies are
|
|
129
|
+
written as outbound notes. Because the conversation lives in the vault, it's
|
|
130
|
+
durable, queryable, and renders in any vault surface — the built-in chat and a
|
|
131
|
+
custom surface show the same thread. Full note shape + the trigger setup are in
|
|
132
|
+
[`CLAUDE.md`](./CLAUDE.md#vault-integration-stage-2--channels-backed-by-agent-message-notes).
|
|
152
133
|
|
|
153
|
-
|
|
134
|
+
## Connecting a session
|
|
154
135
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
For one-off experiments, any Claude API-compatible endpoint also works via `.env`:
|
|
136
|
+
A Claude Code session connects to a channel as a pure HTTP MCP server — by URL +
|
|
137
|
+
OAuth, like adding the vault:
|
|
158
138
|
|
|
159
139
|
```bash
|
|
160
|
-
|
|
161
|
-
ANTHROPIC_AUTH_TOKEN=your-token-here
|
|
140
|
+
claude mcp add --transport http agent <hub-origin>/agent/mcp/<channel>
|
|
162
141
|
```
|
|
163
142
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
**Why isn't the setup working for me?**
|
|
169
|
-
|
|
170
|
-
If a step fails, run `claude`, then `/debug`. If Claude identifies an issue likely to affect other users, open a PR against the relevant setup step or skill.
|
|
171
|
-
|
|
172
|
-
**What changes will be accepted into the codebase?**
|
|
173
|
-
|
|
174
|
-
Only security fixes, bug fixes, and clear improvements will be accepted to the base configuration. That's all.
|
|
175
|
-
|
|
176
|
-
Everything else (new capabilities, OS compatibility, hardware support, enhancements) should be contributed as skills on the `channels` or `providers` branch.
|
|
177
|
-
|
|
178
|
-
This keeps the base system minimal and lets every user customize their installation without inheriting features they don't want.
|
|
179
|
-
|
|
180
|
-
## Community
|
|
181
|
-
|
|
182
|
-
Questions? Ideas? [Join the Discord](https://discord.gg/VDdww8qS42).
|
|
183
|
-
|
|
184
|
-
## Changelog
|
|
185
|
-
|
|
186
|
-
See [CHANGELOG.md](CHANGELOG.md) for breaking changes.
|
|
143
|
+
It prompts for OAuth the first time. The session wakes on inbound messages and
|
|
144
|
+
replies with the `reply` tool. (A stdio bridge over `/events` + `/api/*` also
|
|
145
|
+
works for local/headless launches — see [`CLAUDE.md`](./CLAUDE.md).)
|
|
187
146
|
|
|
188
147
|
## License
|
|
189
148
|
|
|
190
|
-
|
|
191
|
-
([LICENSE](./LICENSE)).
|
|
192
|
-
|
|
193
|
-
It is a derivative of [NanoClaw](https://github.com/qwibitai/nanoclaw) (MIT —
|
|
194
|
-
see [LICENSE-NANOCLAW-MIT](./LICENSE-NANOCLAW-MIT) for the original copyright
|
|
195
|
-
notice). Substantial modifications and the combined work are AGPL-3.0; the
|
|
196
|
-
original NanoClaw code remains MIT-licensed and can be obtained from the
|
|
197
|
-
upstream project.
|
|
149
|
+
[AGPL-3.0](./LICENSE).
|
package/package.json
CHANGED
|
@@ -1,55 +1,48 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openparachute/agent",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.2",
|
|
4
|
+
"description": "Vault-native agents for Claude Code — a #agent/definition note + an inbound message becomes a sandboxed claude turn; the reply is written back as a note. Messaging gateway on :1941.",
|
|
5
5
|
"license": "AGPL-3.0",
|
|
6
6
|
"type": "module",
|
|
7
|
-
"
|
|
8
|
-
|
|
7
|
+
"bin": {
|
|
8
|
+
"parachute-agent": "src/daemon.ts",
|
|
9
|
+
"parachute-agent-bridge": "src/bridge.ts"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"src",
|
|
13
|
+
".parachute",
|
|
14
|
+
"scripts/spawn-agent.ts",
|
|
15
|
+
"tsconfig.json",
|
|
16
|
+
"web/ui/dist",
|
|
17
|
+
"README.md"
|
|
18
|
+
],
|
|
9
19
|
"scripts": {
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
20
|
+
"daemon": "bun src/daemon.ts",
|
|
21
|
+
"bridge": "bun src/bridge.ts",
|
|
22
|
+
"spawn-agent": "bun scripts/spawn-agent.ts",
|
|
23
|
+
"test": "bun run typecheck && bun test ./src/",
|
|
24
|
+
"test:spa": "cd web/ui && bun run test",
|
|
25
|
+
"test:all": "bun run test && bun run test:spa",
|
|
26
|
+
"test:e2e": "bun e2e/llm/run.ts",
|
|
13
27
|
"typecheck": "tsc --noEmit",
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"format:check": "prettier --check \"src/**/*.ts\"",
|
|
17
|
-
"prepare": "husky",
|
|
18
|
-
"parachute": "bun scripts/parachute.ts",
|
|
19
|
-
"build:spa": "cd web/ui && pnpm install --frozen-lockfile --ignore-workspace && pnpm build",
|
|
20
|
-
"postinstall": "if [ -d web/ui ]; then pnpm run build:spa; fi",
|
|
21
|
-
"lint": "eslint src/",
|
|
22
|
-
"lint:fix": "eslint src/ --fix",
|
|
23
|
-
"test": "vitest run",
|
|
24
|
-
"test:watch": "vitest"
|
|
28
|
+
"build:spa": "cd web/ui && bun install --frozen-lockfile && bun run build",
|
|
29
|
+
"prepack": "bun run build:spa"
|
|
25
30
|
},
|
|
26
31
|
"dependencies": {
|
|
27
|
-
"@
|
|
28
|
-
"@
|
|
29
|
-
"@
|
|
30
|
-
"@
|
|
31
|
-
"@
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"
|
|
35
|
-
"kleur": "^4.1.5"
|
|
32
|
+
"@anthropic-ai/sandbox-runtime": "0.0.54",
|
|
33
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
34
|
+
"@openparachute/scope-guard": "^0.4.0",
|
|
35
|
+
"@xterm/addon-fit": "0.10.0",
|
|
36
|
+
"@xterm/xterm": "5.5.0"
|
|
37
|
+
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"typescript": "^5"
|
|
36
40
|
},
|
|
37
41
|
"devDependencies": {
|
|
38
|
-
"@
|
|
39
|
-
"@types/better-sqlite3": "^7.6.12",
|
|
40
|
-
"@types/node": "^22.10.0",
|
|
41
|
-
"better-sqlite3": "11.10.0",
|
|
42
|
-
"bun-types": "^1.3.13",
|
|
43
|
-
"eslint": "^9.35.0",
|
|
44
|
-
"eslint-plugin-no-catch-all": "^1.1.0",
|
|
45
|
-
"globals": "^15.12.0",
|
|
46
|
-
"husky": "^9.1.7",
|
|
47
|
-
"prettier": "^3.8.1",
|
|
48
|
-
"typescript": "^5.7.0",
|
|
49
|
-
"typescript-eslint": "^8.35.0",
|
|
50
|
-
"vitest": "^4.0.18"
|
|
42
|
+
"@types/bun": "latest"
|
|
51
43
|
},
|
|
52
|
-
"
|
|
53
|
-
"
|
|
44
|
+
"repository": {
|
|
45
|
+
"type": "git",
|
|
46
|
+
"url": "git+https://github.com/ParachuteComputer/parachute-agent.git"
|
|
54
47
|
}
|
|
55
48
|
}
|