@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.
Files changed (598) hide show
  1. package/.parachute/module.json +124 -8
  2. package/LICENSE +2 -16
  3. package/README.md +118 -166
  4. package/package.json +32 -43
  5. package/scripts/spawn-agent.ts +371 -0
  6. package/src/_parked/interactive-spawn.test.ts +324 -0
  7. package/src/_parked/interactive-spawn.ts +701 -0
  8. package/src/agent-defs.test.ts +1504 -0
  9. package/src/agent-defs.ts +1702 -0
  10. package/src/agent-mcp-config.test.ts +115 -0
  11. package/src/agent-mcp-config.ts +115 -0
  12. package/src/agents.test.ts +360 -0
  13. package/src/agents.ts +379 -0
  14. package/src/auth.test.ts +46 -0
  15. package/src/auth.ts +140 -0
  16. package/src/backends/attached-queue.test.ts +376 -0
  17. package/src/backends/attached-queue.ts +372 -0
  18. package/src/backends/programmatic.test.ts +1715 -0
  19. package/src/backends/programmatic.ts +927 -0
  20. package/src/backends/registry.test.ts +1494 -0
  21. package/src/backends/registry.ts +1202 -0
  22. package/src/backends/stream-json.test.ts +570 -0
  23. package/src/backends/stream-json.ts +392 -0
  24. package/src/backends/types.ts +223 -0
  25. package/src/bridge.ts +417 -0
  26. package/src/channel-backend-wiring.test.ts +237 -0
  27. package/src/credentials.test.ts +274 -0
  28. package/src/credentials.ts +380 -0
  29. package/src/cron.test.ts +342 -0
  30. package/src/cron.ts +380 -0
  31. package/src/daemon-agent-def-api.test.ts +166 -0
  32. package/src/daemon-agent-defs-api.test.ts +953 -0
  33. package/src/daemon-agent-env-api.test.ts +338 -0
  34. package/src/daemon-attached-queue-store.test.ts +65 -0
  35. package/src/daemon-config-api.test.ts +962 -0
  36. package/src/daemon-jobs-api.test.ts +271 -0
  37. package/src/daemon-vault-chat.test.ts +250 -0
  38. package/src/daemon.test.ts +746 -0
  39. package/src/daemon.ts +3314 -0
  40. package/src/def-vaults.test.ts +136 -0
  41. package/src/def-vaults.ts +165 -0
  42. package/src/delivery-state.test.ts +110 -0
  43. package/src/delivery-state.ts +154 -0
  44. package/src/effective-env.test.ts +114 -0
  45. package/src/effective-env.ts +184 -0
  46. package/src/env-compat.ts +39 -0
  47. package/src/grants.test.ts +638 -0
  48. package/src/grants.ts +675 -0
  49. package/src/hub-jwt.test.ts +161 -0
  50. package/src/hub-jwt.ts +182 -0
  51. package/src/jobs.test.ts +245 -0
  52. package/src/jobs.ts +266 -0
  53. package/src/mcp-http.test.ts +265 -0
  54. package/src/mcp-http.ts +771 -0
  55. package/src/mint-token.test.ts +152 -0
  56. package/src/mint-token.ts +139 -0
  57. package/src/module-manifest.test.ts +158 -0
  58. package/src/oauth-discovery.ts +134 -0
  59. package/src/programmatic-wiring.test.ts +838 -0
  60. package/src/registry.test.ts +227 -0
  61. package/src/registry.ts +228 -0
  62. package/src/resolve-port.test.ts +64 -0
  63. package/src/routing.test.ts +184 -0
  64. package/src/routing.ts +76 -0
  65. package/src/runner.test.ts +506 -0
  66. package/src/runner.ts +255 -0
  67. package/src/sandbox/config.test.ts +150 -0
  68. package/src/sandbox/config.ts +102 -0
  69. package/src/sandbox/egress.test.ts +113 -0
  70. package/src/sandbox/egress.ts +123 -0
  71. package/src/sandbox/index.ts +180 -0
  72. package/src/sandbox/live-seatbelt.test.ts +277 -0
  73. package/src/sandbox/mounts.test.ts +154 -0
  74. package/src/sandbox/mounts.ts +133 -0
  75. package/src/sandbox/sandbox.test.ts +168 -0
  76. package/src/sandbox/types.ts +382 -0
  77. package/src/services-manifest.test.ts +106 -0
  78. package/src/services-manifest.ts +95 -0
  79. package/src/spa-serve.test.ts +116 -0
  80. package/src/spa-serve.ts +116 -0
  81. package/src/spawn-agent-cli.test.ts +172 -0
  82. package/src/spawn-agent.test.ts +1218 -0
  83. package/src/spawn-agent.ts +569 -0
  84. package/src/spawn-deps.test.ts +54 -0
  85. package/src/spawn-deps.ts +166 -0
  86. package/src/telegram/api.ts +153 -0
  87. package/src/terminal-assets.test.ts +50 -0
  88. package/src/terminal-assets.ts +79 -0
  89. package/src/terminal-ui.ts +305 -0
  90. package/src/terminal.test.ts +530 -0
  91. package/src/terminal.ts +458 -0
  92. package/src/transport.ts +270 -0
  93. package/src/transports/http-ui.test.ts +455 -0
  94. package/src/transports/http-ui.ts +201 -0
  95. package/src/transports/telegram.test.ts +174 -0
  96. package/src/transports/telegram.ts +426 -0
  97. package/src/transports/vault.test.ts +2011 -0
  98. package/src/transports/vault.ts +1790 -0
  99. package/src/ui-kit.test.ts +178 -0
  100. package/src/ui-kit.ts +402 -0
  101. package/tsconfig.json +8 -14
  102. package/web/ui/tsconfig.json +2 -1
  103. package/.claude/scheduled_tasks.lock +0 -1
  104. package/.claude/settings.json +0 -5
  105. package/.claude/skills/add-atomic-chat-tool/SKILL.md +0 -243
  106. package/.claude/skills/add-atomic-chat-tool/atomic-chat-mcp-stdio.ts +0 -229
  107. package/.claude/skills/add-codex/SKILL.md +0 -161
  108. package/.claude/skills/add-dashboard/SKILL.md +0 -138
  109. package/.claude/skills/add-dashboard/resources/dashboard-pusher.ts +0 -495
  110. package/.claude/skills/add-emacs/SKILL.md +0 -296
  111. package/.claude/skills/add-gcal-tool/SKILL.md +0 -210
  112. package/.claude/skills/add-gchat/REMOVE.md +0 -6
  113. package/.claude/skills/add-gchat/SKILL.md +0 -92
  114. package/.claude/skills/add-gchat/VERIFY.md +0 -3
  115. package/.claude/skills/add-github/REMOVE.md +0 -6
  116. package/.claude/skills/add-github/SKILL.md +0 -148
  117. package/.claude/skills/add-github/VERIFY.md +0 -3
  118. package/.claude/skills/add-gmail-tool/SKILL.md +0 -229
  119. package/.claude/skills/add-imessage/REMOVE.md +0 -6
  120. package/.claude/skills/add-imessage/SKILL.md +0 -113
  121. package/.claude/skills/add-imessage/VERIFY.md +0 -3
  122. package/.claude/skills/add-karpathy-llm-wiki/SKILL.md +0 -110
  123. package/.claude/skills/add-karpathy-llm-wiki/llm-wiki.md +0 -75
  124. package/.claude/skills/add-linear/REMOVE.md +0 -6
  125. package/.claude/skills/add-linear/SKILL.md +0 -168
  126. package/.claude/skills/add-linear/VERIFY.md +0 -3
  127. package/.claude/skills/add-macos-statusbar/SKILL.md +0 -133
  128. package/.claude/skills/add-macos-statusbar/add/src/statusbar.swift +0 -147
  129. package/.claude/skills/add-matrix/REMOVE.md +0 -6
  130. package/.claude/skills/add-matrix/SKILL.md +0 -148
  131. package/.claude/skills/add-matrix/VERIFY.md +0 -3
  132. package/.claude/skills/add-ollama-provider/SKILL.md +0 -179
  133. package/.claude/skills/add-ollama-tool/SKILL.md +0 -193
  134. package/.claude/skills/add-opencode/SKILL.md +0 -229
  135. package/.claude/skills/add-parallel/SKILL.md +0 -290
  136. package/.claude/skills/add-resend/REMOVE.md +0 -6
  137. package/.claude/skills/add-resend/SKILL.md +0 -93
  138. package/.claude/skills/add-resend/VERIFY.md +0 -3
  139. package/.claude/skills/add-signal/REMOVE.md +0 -13
  140. package/.claude/skills/add-signal/SKILL.md +0 -318
  141. package/.claude/skills/add-signal/VERIFY.md +0 -5
  142. package/.claude/skills/add-slack/REMOVE.md +0 -6
  143. package/.claude/skills/add-slack/SKILL.md +0 -112
  144. package/.claude/skills/add-slack/VERIFY.md +0 -3
  145. package/.claude/skills/add-teams/REMOVE.md +0 -6
  146. package/.claude/skills/add-teams/SKILL.md +0 -207
  147. package/.claude/skills/add-teams/VERIFY.md +0 -3
  148. package/.claude/skills/add-vercel/SKILL.md +0 -147
  149. package/.claude/skills/add-vercel/container-skills/vercel-cli/SKILL.md +0 -103
  150. package/.claude/skills/add-webex/REMOVE.md +0 -6
  151. package/.claude/skills/add-webex/SKILL.md +0 -88
  152. package/.claude/skills/add-webex/VERIFY.md +0 -3
  153. package/.claude/skills/add-wechat/REMOVE.md +0 -49
  154. package/.claude/skills/add-wechat/SKILL.md +0 -170
  155. package/.claude/skills/add-wechat/scripts/wire-dm.ts +0 -172
  156. package/.claude/skills/add-whatsapp/SKILL.md +0 -264
  157. package/.claude/skills/add-whatsapp-cloud/REMOVE.md +0 -6
  158. package/.claude/skills/add-whatsapp-cloud/SKILL.md +0 -95
  159. package/.claude/skills/add-whatsapp-cloud/VERIFY.md +0 -3
  160. package/.claude/skills/claw/SKILL.md +0 -131
  161. package/.claude/skills/claw/scripts/claw +0 -374
  162. package/.claude/skills/convert-to-apple-container/SKILL.md +0 -212
  163. package/.claude/skills/customize/SKILL.md +0 -110
  164. package/.claude/skills/debug/SKILL.md +0 -349
  165. package/.claude/skills/get-qodo-rules/SKILL.md +0 -122
  166. package/.claude/skills/get-qodo-rules/references/output-format.md +0 -41
  167. package/.claude/skills/get-qodo-rules/references/pagination.md +0 -33
  168. package/.claude/skills/get-qodo-rules/references/repository-scope.md +0 -26
  169. package/.claude/skills/init-first-agent/SKILL.md +0 -120
  170. package/.claude/skills/init-onecli/SKILL.md +0 -270
  171. package/.claude/skills/manage-channels/SKILL.md +0 -87
  172. package/.claude/skills/manage-mounts/SKILL.md +0 -47
  173. package/.claude/skills/migrate-from-openclaw/MIGRATE_CRONS.md +0 -100
  174. package/.claude/skills/migrate-from-openclaw/SKILL.md +0 -447
  175. package/.claude/skills/migrate-from-openclaw/scripts/discover-openclaw.ts +0 -734
  176. package/.claude/skills/migrate-from-openclaw/scripts/extract-channel-credentials.ts +0 -476
  177. package/.claude/skills/migrate-nanoclaw/SKILL.md +0 -484
  178. package/.claude/skills/migrate-nanoclaw/diagnostics.md +0 -51
  179. package/.claude/skills/qodo-pr-resolver/SKILL.md +0 -326
  180. package/.claude/skills/qodo-pr-resolver/resources/providers.md +0 -329
  181. package/.claude/skills/update-nanoclaw/SKILL.md +0 -243
  182. package/.claude/skills/update-nanoclaw/diagnostics.md +0 -48
  183. package/.claude/skills/update-skills/SKILL.md +0 -130
  184. package/.claude/skills/use-native-credential-proxy/SKILL.md +0 -167
  185. package/.claude/skills/x-integration/SKILL.md +0 -417
  186. package/.claude/skills/x-integration/agent.ts +0 -243
  187. package/.claude/skills/x-integration/host.ts +0 -155
  188. package/.claude/skills/x-integration/lib/browser.ts +0 -148
  189. package/.claude/skills/x-integration/lib/config.ts +0 -62
  190. package/.claude/skills/x-integration/scripts/like.ts +0 -56
  191. package/.claude/skills/x-integration/scripts/post.ts +0 -66
  192. package/.claude/skills/x-integration/scripts/quote.ts +0 -80
  193. package/.claude/skills/x-integration/scripts/reply.ts +0 -74
  194. package/.claude/skills/x-integration/scripts/retweet.ts +0 -62
  195. package/.claude/skills/x-integration/scripts/setup.ts +0 -87
  196. package/.github/CODEOWNERS +0 -10
  197. package/.github/PULL_REQUEST_TEMPLATE.md +0 -18
  198. package/.github/workflows/bump-version.yml +0 -35
  199. package/.github/workflows/ci.yml +0 -39
  200. package/.github/workflows/label-pr.yml +0 -40
  201. package/.github/workflows/update-tokens.yml +0 -43
  202. package/.husky/pre-commit +0 -1
  203. package/.mcp.json +0 -3
  204. package/.nvmrc +0 -1
  205. package/.prettierrc +0 -4
  206. package/CHANGELOG.md +0 -221
  207. package/CLAUDE.md +0 -307
  208. package/CODE_OF_CONDUCT.md +0 -128
  209. package/CONTRIBUTING.md +0 -159
  210. package/CONTRIBUTORS.md +0 -26
  211. package/LICENSE-NANOCLAW-MIT +0 -21
  212. package/README_ja.md +0 -194
  213. package/README_zh.md +0 -194
  214. package/assets/nanoclaw-favicon.png +0 -0
  215. package/assets/nanoclaw-icon.png +0 -0
  216. package/assets/nanoclaw-logo-dark.png +0 -0
  217. package/assets/nanoclaw-logo.png +0 -0
  218. package/assets/nanoclaw-profile.jpeg +0 -0
  219. package/assets/nanoclaw-sales.png +0 -0
  220. package/assets/social-preview.jpg +0 -0
  221. package/config-examples/mount-allowlist.json +0 -25
  222. package/container/.dockerignore +0 -2
  223. package/container/CLAUDE.md +0 -21
  224. package/container/Dockerfile +0 -121
  225. package/container/agent-runner/bun.lock +0 -243
  226. package/container/agent-runner/package.json +0 -22
  227. package/container/agent-runner/scripts/sdk-signal-probe.ts +0 -169
  228. package/container/agent-runner/src/config.ts +0 -55
  229. package/container/agent-runner/src/db/connection.ts +0 -267
  230. package/container/agent-runner/src/db/index.ts +0 -20
  231. package/container/agent-runner/src/db/messages-in.ts +0 -138
  232. package/container/agent-runner/src/db/messages-out.ts +0 -143
  233. package/container/agent-runner/src/db/session-routing.ts +0 -30
  234. package/container/agent-runner/src/db/session-state.test.ts +0 -100
  235. package/container/agent-runner/src/db/session-state.ts +0 -79
  236. package/container/agent-runner/src/destinations.ts +0 -135
  237. package/container/agent-runner/src/formatter.test.ts +0 -167
  238. package/container/agent-runner/src/formatter.ts +0 -260
  239. package/container/agent-runner/src/index.ts +0 -110
  240. package/container/agent-runner/src/integration.test.ts +0 -121
  241. package/container/agent-runner/src/mcp-tools/agents.instructions.md +0 -26
  242. package/container/agent-runner/src/mcp-tools/agents.ts +0 -66
  243. package/container/agent-runner/src/mcp-tools/core.instructions.md +0 -27
  244. package/container/agent-runner/src/mcp-tools/core.ts +0 -262
  245. package/container/agent-runner/src/mcp-tools/index.ts +0 -22
  246. package/container/agent-runner/src/mcp-tools/interactive.instructions.md +0 -22
  247. package/container/agent-runner/src/mcp-tools/interactive.ts +0 -169
  248. package/container/agent-runner/src/mcp-tools/scheduling.instructions.md +0 -40
  249. package/container/agent-runner/src/mcp-tools/scheduling.ts +0 -299
  250. package/container/agent-runner/src/mcp-tools/self-mod.instructions.md +0 -25
  251. package/container/agent-runner/src/mcp-tools/self-mod.ts +0 -120
  252. package/container/agent-runner/src/mcp-tools/server.ts +0 -54
  253. package/container/agent-runner/src/mcp-tools/types.ts +0 -6
  254. package/container/agent-runner/src/poll-loop.test.ts +0 -248
  255. package/container/agent-runner/src/poll-loop.ts +0 -437
  256. package/container/agent-runner/src/providers/claude.ts +0 -379
  257. package/container/agent-runner/src/providers/factory.test.ts +0 -19
  258. package/container/agent-runner/src/providers/factory.ts +0 -13
  259. package/container/agent-runner/src/providers/index.ts +0 -6
  260. package/container/agent-runner/src/providers/mock.ts +0 -77
  261. package/container/agent-runner/src/providers/provider-registry.ts +0 -33
  262. package/container/agent-runner/src/providers/types.ts +0 -82
  263. package/container/agent-runner/src/scheduling/task-script.ts +0 -121
  264. package/container/agent-runner/src/timezone.test.ts +0 -93
  265. package/container/agent-runner/src/timezone.ts +0 -107
  266. package/container/agent-runner/tsconfig.json +0 -14
  267. package/container/build.sh +0 -48
  268. package/container/entrypoint.sh +0 -16
  269. package/container/skills/agent-browser/SKILL.md +0 -159
  270. package/container/skills/frontend-engineer/SKILL.md +0 -157
  271. package/container/skills/self-customize/SKILL.md +0 -87
  272. package/container/skills/slack-formatting/SKILL.md +0 -94
  273. package/container/skills/vercel-cli/SKILL.md +0 -111
  274. package/container/skills/welcome/SKILL.md +0 -85
  275. package/docs/APPLE-CONTAINER-NETWORKING.md +0 -90
  276. package/docs/BRANCH-FORK-MAINTENANCE.md +0 -81
  277. package/docs/README.md +0 -25
  278. package/docs/SDK_DEEP_DIVE.md +0 -643
  279. package/docs/SECURITY.md +0 -162
  280. package/docs/agent-runner-details.md +0 -749
  281. package/docs/api-details.md +0 -365
  282. package/docs/architecture-diagram.html +0 -422
  283. package/docs/architecture-diagram.md +0 -215
  284. package/docs/architecture.md +0 -751
  285. package/docs/audit/2026-04-30-channel-endpoint-audit.md +0 -36
  286. package/docs/build-and-runtime.md +0 -80
  287. package/docs/cross-mount-stress/README.md +0 -112
  288. package/docs/cross-mount-stress/container-writer-retry.mjs +0 -55
  289. package/docs/cross-mount-stress/container-writer-slow.mjs +0 -42
  290. package/docs/cross-mount-stress/container-writer.mjs +0 -47
  291. package/docs/cross-mount-stress/host-writer-retry.mjs +0 -55
  292. package/docs/cross-mount-stress/host-writer-slow.mjs +0 -43
  293. package/docs/cross-mount-stress/host-writer.mjs +0 -47
  294. package/docs/db-central.md +0 -316
  295. package/docs/db-session.md +0 -183
  296. package/docs/db.md +0 -119
  297. package/docs/design/2026-04-29-vault-management-ui.md +0 -231
  298. package/docs/design/2026-04-30-channel-wiring-rework.md +0 -234
  299. package/docs/design/2026-05-01-channel-wiring-approvals-deep-dive.md +0 -272
  300. package/docs/design/2026-05-02-channel-policy-and-approval-routing.md +0 -250
  301. package/docs/docker-sandboxes.md +0 -359
  302. package/docs/isolation-model.md +0 -88
  303. package/docs/ollama.md +0 -79
  304. package/docs/parachute-integration.md +0 -109
  305. package/docs/post-night-rebirth-reflections.md +0 -151
  306. package/eslint.config.js +0 -32
  307. package/pnpm-workspace.yaml +0 -8
  308. package/repo-tokens/README.md +0 -113
  309. package/repo-tokens/action.yml +0 -186
  310. package/repo-tokens/badge.svg +0 -23
  311. package/repo-tokens/examples/green.svg +0 -14
  312. package/repo-tokens/examples/red.svg +0 -14
  313. package/repo-tokens/examples/yellow-green.svg +0 -14
  314. package/repo-tokens/examples/yellow.svg +0 -14
  315. package/scripts/chat.ts +0 -101
  316. package/scripts/cleanup-sessions.sh +0 -150
  317. package/scripts/init-cli-agent.ts +0 -171
  318. package/scripts/init-first-agent.ts +0 -377
  319. package/scripts/parachute.ts +0 -158
  320. package/scripts/run-migrations.ts +0 -105
  321. package/scripts/sanity-live-poll.ts +0 -95
  322. package/scripts/seed-discord.ts +0 -79
  323. package/scripts/test-v2-agent.ts +0 -106
  324. package/scripts/test-v2-channel-e2e.ts +0 -265
  325. package/scripts/test-v2-host.ts +0 -184
  326. package/src/channels/adapter.ts +0 -214
  327. package/src/channels/ask-question.ts +0 -46
  328. package/src/channels/channel-registry.test.ts +0 -421
  329. package/src/channels/channel-registry.ts +0 -313
  330. package/src/channels/chat-sdk-bridge.test.ts +0 -84
  331. package/src/channels/chat-sdk-bridge.ts +0 -652
  332. package/src/channels/cli.ts +0 -276
  333. package/src/channels/discord.ts +0 -90
  334. package/src/channels/index.ts +0 -17
  335. package/src/channels/telegram-markdown-sanitize.test.ts +0 -78
  336. package/src/channels/telegram-markdown-sanitize.ts +0 -55
  337. package/src/channels/telegram-pairing.test.ts +0 -254
  338. package/src/channels/telegram-pairing.ts +0 -339
  339. package/src/channels/telegram.ts +0 -279
  340. package/src/channels/trust-hint.test.ts +0 -48
  341. package/src/channels/trust-hint.ts +0 -75
  342. package/src/claude-md-compose.migrate.test.ts +0 -64
  343. package/src/claude-md-compose.ts +0 -205
  344. package/src/command-gate.ts +0 -63
  345. package/src/config.test.ts +0 -93
  346. package/src/config.ts +0 -108
  347. package/src/container-config.ts +0 -167
  348. package/src/container-runner.test.ts +0 -32
  349. package/src/container-runner.ts +0 -576
  350. package/src/container-runtime.test.ts +0 -169
  351. package/src/container-runtime.ts +0 -92
  352. package/src/db/_bun-sqlite-shim.ts +0 -88
  353. package/src/db/agent-activity.test.ts +0 -155
  354. package/src/db/agent-activity.ts +0 -121
  355. package/src/db/agent-groups.ts +0 -77
  356. package/src/db/connection.migrate.test.ts +0 -143
  357. package/src/db/connection.ts +0 -224
  358. package/src/db/db-v2.test.ts +0 -440
  359. package/src/db/dropped-messages.ts +0 -44
  360. package/src/db/index.ts +0 -40
  361. package/src/db/messaging-groups.ts +0 -252
  362. package/src/db/migrations/001-initial.ts +0 -112
  363. package/src/db/migrations/002-chat-sdk-state.ts +0 -36
  364. package/src/db/migrations/008-dropped-messages.ts +0 -27
  365. package/src/db/migrations/009-drop-pending-credentials.ts +0 -13
  366. package/src/db/migrations/010-engage-modes.ts +0 -103
  367. package/src/db/migrations/011-pending-sender-approvals.ts +0 -40
  368. package/src/db/migrations/012-channel-registration.ts +0 -48
  369. package/src/db/migrations/013-approval-render-metadata.ts +0 -27
  370. package/src/db/migrations/014-secrets.ts +0 -44
  371. package/src/db/migrations/015-secrets-drop-host-pattern.ts +0 -18
  372. package/src/db/migrations/016-secret-assignments.ts +0 -30
  373. package/src/db/migrations/017-agent-activity.ts +0 -40
  374. package/src/db/migrations/018-oauth-app-configs.ts +0 -34
  375. package/src/db/migrations/019-oauth-app-connections.ts +0 -48
  376. package/src/db/migrations/020-agent-app-connections.ts +0 -28
  377. package/src/db/migrations/021-pending-oauth-states.ts +0 -35
  378. package/src/db/migrations/022-app-connections-provider.ts +0 -25
  379. package/src/db/migrations/023-agent-group-secret-mode.test.ts +0 -124
  380. package/src/db/migrations/023-agent-group-secret-mode.ts +0 -65
  381. package/src/db/migrations/024-collapse-approvals.test.ts +0 -249
  382. package/src/db/migrations/024-collapse-approvals.ts +0 -182
  383. package/src/db/migrations/025-secret-mode-check.test.ts +0 -155
  384. package/src/db/migrations/025-secret-mode-check.ts +0 -49
  385. package/src/db/migrations/026-user-dms-bot-id.test.ts +0 -116
  386. package/src/db/migrations/026-user-dms-bot-id.ts +0 -54
  387. package/src/db/migrations/027-provider-credentials.ts +0 -41
  388. package/src/db/migrations/_test-helpers.ts +0 -41
  389. package/src/db/migrations/index.ts +0 -127
  390. package/src/db/migrations/module-agent-to-agent-destinations.ts +0 -84
  391. package/src/db/migrations/module-approvals-pending-approvals.ts +0 -42
  392. package/src/db/migrations/module-approvals-title-options.ts +0 -40
  393. package/src/db/schema.ts +0 -258
  394. package/src/db/session-db.test.ts +0 -93
  395. package/src/db/session-db.ts +0 -325
  396. package/src/db/sessions.ts +0 -241
  397. package/src/delivery.test.ts +0 -148
  398. package/src/delivery.ts +0 -445
  399. package/src/env.ts +0 -74
  400. package/src/group-folder.test.ts +0 -35
  401. package/src/group-folder.ts +0 -44
  402. package/src/group-init.ts +0 -92
  403. package/src/host-core.test.ts +0 -456
  404. package/src/host-sweep.test.ts +0 -146
  405. package/src/host-sweep.ts +0 -287
  406. package/src/index.ts +0 -227
  407. package/src/install-slug.ts +0 -33
  408. package/src/log.test.ts +0 -81
  409. package/src/log.ts +0 -117
  410. package/src/mcp/http.ts +0 -72
  411. package/src/mcp/server.ts +0 -92
  412. package/src/mcp/stdio.ts +0 -51
  413. package/src/mcp/tools/activity.ts +0 -88
  414. package/src/mcp/tools/agent-groups.ts +0 -183
  415. package/src/mcp/tools/approvals.ts +0 -122
  416. package/src/mcp/tools/channels.ts +0 -199
  417. package/src/mcp/tools/index.ts +0 -27
  418. package/src/mcp/tools/oauth.ts +0 -48
  419. package/src/mcp/tools/secrets.ts +0 -169
  420. package/src/mcp/tools/sessions.ts +0 -135
  421. package/src/mcp/types.ts +0 -51
  422. package/src/modules/agent-to-agent/agent-route.test.ts +0 -46
  423. package/src/modules/agent-to-agent/agent-route.ts +0 -223
  424. package/src/modules/agent-to-agent/create-agent.ts +0 -127
  425. package/src/modules/agent-to-agent/db/agent-destinations.ts +0 -135
  426. package/src/modules/agent-to-agent/index.ts +0 -22
  427. package/src/modules/agent-to-agent/write-destinations.ts +0 -59
  428. package/src/modules/approvals/agent.md +0 -45
  429. package/src/modules/approvals/index.ts +0 -21
  430. package/src/modules/approvals/picks.test.ts +0 -291
  431. package/src/modules/approvals/primitive.ts +0 -279
  432. package/src/modules/approvals/project.md +0 -27
  433. package/src/modules/approvals/response-handler.ts +0 -87
  434. package/src/modules/index.ts +0 -24
  435. package/src/modules/interactive/agent.md +0 -21
  436. package/src/modules/interactive/index.ts +0 -69
  437. package/src/modules/interactive/project.md +0 -12
  438. package/src/modules/mount-security/index.ts +0 -448
  439. package/src/modules/mount-security/migrate.test.ts +0 -91
  440. package/src/modules/permissions/access.ts +0 -28
  441. package/src/modules/permissions/channel-approval.test.ts +0 -389
  442. package/src/modules/permissions/channel-approval.ts +0 -188
  443. package/src/modules/permissions/db/agent-group-members.ts +0 -44
  444. package/src/modules/permissions/db/pending-channel-approvals.test.ts +0 -86
  445. package/src/modules/permissions/db/pending-channel-approvals.ts +0 -66
  446. package/src/modules/permissions/db/pending-sender-approvals.ts +0 -60
  447. package/src/modules/permissions/db/user-dms.ts +0 -58
  448. package/src/modules/permissions/db/user-roles.ts +0 -85
  449. package/src/modules/permissions/db/users.ts +0 -38
  450. package/src/modules/permissions/index.ts +0 -421
  451. package/src/modules/permissions/permissions.test.ts +0 -358
  452. package/src/modules/permissions/sender-approval.test.ts +0 -470
  453. package/src/modules/permissions/sender-approval.ts +0 -165
  454. package/src/modules/permissions/user-dm.ts +0 -200
  455. package/src/modules/provider-credentials/db.ts +0 -121
  456. package/src/modules/provider-credentials/index.ts +0 -12
  457. package/src/modules/provider-credentials/spawn.test.ts +0 -206
  458. package/src/modules/provider-credentials/spawn.ts +0 -114
  459. package/src/modules/scheduling/actions.ts +0 -113
  460. package/src/modules/scheduling/db.test.ts +0 -282
  461. package/src/modules/scheduling/db.ts +0 -148
  462. package/src/modules/scheduling/index.ts +0 -34
  463. package/src/modules/scheduling/recurrence.test.ts +0 -98
  464. package/src/modules/scheduling/recurrence.ts +0 -54
  465. package/src/modules/self-mod/agent.md +0 -30
  466. package/src/modules/self-mod/apply.ts +0 -85
  467. package/src/modules/self-mod/index.ts +0 -30
  468. package/src/modules/self-mod/project.md +0 -39
  469. package/src/modules/self-mod/request.ts +0 -91
  470. package/src/modules/typing/index.ts +0 -165
  471. package/src/oauth/agent-app-connections.ts +0 -103
  472. package/src/oauth/app-configs.test.ts +0 -64
  473. package/src/oauth/app-configs.ts +0 -114
  474. package/src/oauth/app-connections.test.ts +0 -109
  475. package/src/oauth/app-connections.ts +0 -178
  476. package/src/oauth/crypto.ts +0 -56
  477. package/src/oauth/flow.ts +0 -104
  478. package/src/oauth/providers/google.test.ts +0 -38
  479. package/src/oauth/providers/google.ts +0 -46
  480. package/src/oauth/providers/index.ts +0 -48
  481. package/src/oauth/state-store.test.ts +0 -54
  482. package/src/oauth/state-store.ts +0 -93
  483. package/src/parachute/README.md +0 -27
  484. package/src/parachute/create-agent.test.ts +0 -83
  485. package/src/parachute/create-agent.ts +0 -122
  486. package/src/parachute/group-status.test.ts +0 -165
  487. package/src/parachute/group-status.ts +0 -136
  488. package/src/parachute/types.ts +0 -41
  489. package/src/parachute/vault-mcp.test.ts +0 -251
  490. package/src/parachute/vault-mcp.ts +0 -232
  491. package/src/platform-id.test.ts +0 -104
  492. package/src/platform-id.ts +0 -109
  493. package/src/providers/index.ts +0 -6
  494. package/src/providers/provider-container-registry.ts +0 -58
  495. package/src/response-registry.ts +0 -45
  496. package/src/router.ts +0 -530
  497. package/src/secrets/crypto.test.ts +0 -45
  498. package/src/secrets/crypto.ts +0 -55
  499. package/src/secrets/index.ts +0 -355
  500. package/src/secrets/master-key.ts +0 -70
  501. package/src/secrets/secrets.test.ts +0 -354
  502. package/src/session-manager.migrate.test.ts +0 -59
  503. package/src/session-manager.ts +0 -433
  504. package/src/startup-bootstrap.test.ts +0 -226
  505. package/src/startup-bootstrap.ts +0 -207
  506. package/src/state-sqlite.ts +0 -182
  507. package/src/timezone.test.ts +0 -64
  508. package/src/timezone.ts +0 -37
  509. package/src/types.ts +0 -230
  510. package/src/web/auth.test.ts +0 -335
  511. package/src/web/auth.ts +0 -214
  512. package/src/web/discord-validate.test.ts +0 -77
  513. package/src/web/discord-validate.ts +0 -88
  514. package/src/web/hub-discovery.test.ts +0 -98
  515. package/src/web/hub-discovery.ts +0 -69
  516. package/src/web/routes/activity.ts +0 -106
  517. package/src/web/routes/agent-provider.test.ts +0 -282
  518. package/src/web/routes/agent-provider.ts +0 -309
  519. package/src/web/routes/approvals.ts +0 -185
  520. package/src/web/routes/apps.ts +0 -434
  521. package/src/web/routes/channels-mg-detail.test.ts +0 -324
  522. package/src/web/routes/channels-mga-detail.test.ts +0 -425
  523. package/src/web/routes/channels.ts +0 -489
  524. package/src/web/routes/oauth-providers.ts +0 -42
  525. package/src/web/routes/secrets.test.ts +0 -175
  526. package/src/web/routes/secrets.ts +0 -282
  527. package/src/web/routes/sessions.ts +0 -123
  528. package/src/web/routes/settings.test.ts +0 -106
  529. package/src/web/routes/settings.ts +0 -247
  530. package/src/web/routes/setup-status.ts +0 -205
  531. package/src/web/routes/vaults.test.ts +0 -389
  532. package/src/web/routes/vaults.ts +0 -225
  533. package/src/web/server-version.test.ts +0 -16
  534. package/src/web/server.ts +0 -1003
  535. package/src/web/services-manifest.test.ts +0 -120
  536. package/src/web/services-manifest.ts +0 -61
  537. package/src/web/static-serve.test.ts +0 -255
  538. package/src/web/static-serve.ts +0 -104
  539. package/src/web/telegram-validate.test.ts +0 -116
  540. package/src/web/telegram-validate.ts +0 -107
  541. package/src/web/vault-proxy.test.ts +0 -214
  542. package/src/web/vault-proxy.ts +0 -120
  543. package/src/web/wire-channel.ts +0 -181
  544. package/src/webhook-server.ts +0 -134
  545. package/vitest.config.ts +0 -18
  546. package/web/README.md +0 -63
  547. package/web/ui/index.html +0 -13
  548. package/web/ui/package.json +0 -35
  549. package/web/ui/pnpm-lock.yaml +0 -2164
  550. package/web/ui/scripts/verify-base.mjs +0 -31
  551. package/web/ui/src/App.tsx +0 -88
  552. package/web/ui/src/components/ActivityFeed.tsx +0 -444
  553. package/web/ui/src/components/AgentGroupPicker.tsx +0 -263
  554. package/web/ui/src/components/AgentProviderCards.tsx +0 -220
  555. package/web/ui/src/components/CredentialForm.tsx +0 -214
  556. package/web/ui/src/components/ScopeGrants.tsx +0 -74
  557. package/web/ui/src/components/StatusDot.tsx +0 -43
  558. package/web/ui/src/components/VaultPicker.tsx +0 -127
  559. package/web/ui/src/components/setup/AdapterInstallStep.tsx +0 -178
  560. package/web/ui/src/components/setup/AgentGroupStep.tsx +0 -43
  561. package/web/ui/src/components/setup/ChannelPickStep.tsx +0 -74
  562. package/web/ui/src/components/setup/DoneStep.tsx +0 -49
  563. package/web/ui/src/components/setup/PrereqStep.tsx +0 -129
  564. package/web/ui/src/components/setup/TestConnectionStep.tsx +0 -108
  565. package/web/ui/src/components/setup/TestMessageStep.tsx +0 -104
  566. package/web/ui/src/components/setup/WireChannelStep.tsx +0 -166
  567. package/web/ui/src/components/setup/types.ts +0 -105
  568. package/web/ui/src/lib/api.test.ts +0 -410
  569. package/web/ui/src/lib/api.ts +0 -1210
  570. package/web/ui/src/lib/auth.test.ts +0 -139
  571. package/web/ui/src/lib/auth.ts +0 -348
  572. package/web/ui/src/lib/channel-adapters.ts +0 -136
  573. package/web/ui/src/main.tsx +0 -19
  574. package/web/ui/src/routes/ApprovalsList.tsx +0 -294
  575. package/web/ui/src/routes/Apps.tsx +0 -613
  576. package/web/ui/src/routes/ChannelWireDetail.test.tsx +0 -233
  577. package/web/ui/src/routes/ChannelWireDetail.tsx +0 -403
  578. package/web/ui/src/routes/ChannelsList.tsx +0 -158
  579. package/web/ui/src/routes/GroupDetail.tsx +0 -755
  580. package/web/ui/src/routes/GroupList.tsx +0 -187
  581. package/web/ui/src/routes/MessagingGroupDetail.test.tsx +0 -233
  582. package/web/ui/src/routes/MessagingGroupDetail.tsx +0 -306
  583. package/web/ui/src/routes/NewGroupWizard.tsx +0 -390
  584. package/web/ui/src/routes/OAuthCallback.tsx +0 -56
  585. package/web/ui/src/routes/SecretsList.tsx +0 -921
  586. package/web/ui/src/routes/SessionsList.tsx +0 -220
  587. package/web/ui/src/routes/SettingsAgentProvider.tsx +0 -109
  588. package/web/ui/src/routes/SettingsApprovals.tsx +0 -234
  589. package/web/ui/src/routes/SetupWizard.tsx +0 -219
  590. package/web/ui/src/routes/VaultDetail.test.tsx +0 -361
  591. package/web/ui/src/routes/VaultDetail.tsx +0 -960
  592. package/web/ui/src/routes/VaultsList.tsx +0 -295
  593. package/web/ui/src/routes/WireChannelPage.tsx +0 -413
  594. package/web/ui/src/styles.css +0 -608
  595. package/web/ui/src/test/setup.ts +0 -23
  596. package/web/ui/src/vite-env.d.ts +0 -10
  597. package/web/ui/vite.config.ts +0 -34
  598. package/web/ui/vitest.config.ts +0 -25
@@ -1,14 +1,130 @@
1
1
  {
2
2
  "name": "agent",
3
3
  "manifestName": "parachute-agent",
4
- "displayName": "Parachute Agent",
5
- "tagline": "Manage your Parachute agent groups + vault attachments.",
6
- "kind": "frontend",
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": "/api/health",
10
- "startCmd": ["bun", "src/index.ts"],
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 by
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
- # parachute-agent
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>&nbsp; • &nbsp;
9
- <a href="docs/">docs</a>&nbsp; • &nbsp;
10
- <a href="README_zh.md">中文</a>&nbsp; • &nbsp;
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
- @Andy list all scheduled tasks across groups
71
- @Andy pause the Monday briefing task
72
- @Andy join the Family Chat group
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
- ## Customizing
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
- parachute-agent doesn't use configuration files. To make changes, just tell Claude Code what you want:
51
+ Deeper design + operational detail live in [`CLAUDE.md`](./CLAUDE.md).
78
52
 
79
- - "Change the trigger word to @Bob"
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
- Or run `/customize` for guided changes.
55
+ Agent is `focus: experimental` and pre-1.0. What's solid vs. early:
85
56
 
86
- The codebase is small enough that Claude can safely modify it.
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
- ## Contributing
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
- **Don't add features. Add skills.**
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
- If you want to add a new channel or agent provider, don't add it to trunk. New channel adapters land on the `channels` branch; new agent providers land on `providers`. Users install them in their own fork with `/add-<name>` skills, which copy the relevant module(s) into the standard paths, wire the registration, and pin dependencies.
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
- This keeps trunk as pure registry and infra, and every fork stays lean — users get the channels and providers they asked for and nothing else.
84
+ ## Running it
95
85
 
96
- ### RFS (Request for Skills)
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
- Skills we'd like to see:
99
-
100
- **Communication Channels**
101
- - `/add-signal` — Add Signal as a channel
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
- A single Node host orchestrates per-session agent containers. When a message arrives, the host routes it via the entity model (user → messaging group → agent group → session), writes it to the session's `inbound.db`, and wakes the container. The agent-runner inside the container polls `inbound.db`, runs Claude, and writes responses to `outbound.db`. The host polls `outbound.db` and delivers back through the channel adapter.
117
-
118
- Two SQLite files per session, each with exactly one writer — no cross-mount contention, no IPC, no stdin piping. Channels and alternative providers self-register at startup; trunk ships the registry and the Chat SDK bridge, while the adapters themselves are skill-installed per fork.
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
- **Can I run this on Linux or Windows?**
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
- Yes. Docker is the default runtime and works on macOS, Linux, and Windows (via WSL2). Install via the Parachute hub: `parachute install parachute-agent`.
110
+ ## The web surface
144
111
 
145
- **Is this secure?**
112
+ Reachable at `<hub-origin>/agent/`:
146
113
 
147
- Agents run in containers, not behind application-level permission checks. They can only access explicitly mounted directories. Credentials live in parachute-agent's AES-GCM-encrypted secret store (master key at `~/.parachute/agent/master.key`, ciphertext in the central DB), injected into each container at spawn time and scoped per agent group. You should still review what you're running, but the codebase is small enough that you actually can.
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
- **Why no configuration files?**
122
+ ## Vault-backed channels
150
123
 
151
- We don't want configuration sprawl. Every user should customize parachute-agent so that the code does exactly what they want, rather than configuring a generic system. If you prefer having config files, you can tell Claude to add them.
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
- **Can I use third-party or open-source models?**
134
+ ## Connecting a session
154
135
 
155
- Yes. The supported path is `/add-opencode` (OpenRouter, OpenAI, Google, DeepSeek, and more via OpenCode config) or `/add-ollama-provider` (local open-weight models via Ollama). Both are configurable per agent group, so different agents can run on different backends in the same install.
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
- ANTHROPIC_BASE_URL=https://your-api-endpoint.com
161
- ANTHROPIC_AUTH_TOKEN=your-token-here
140
+ claude mcp add --transport http agent <hub-origin>/agent/mcp/<channel>
162
141
  ```
163
142
 
164
- **How do I debug issues?**
165
-
166
- Ask Claude Code. "Why isn't the scheduler running?" "What's in the recent logs?" "Why did this message not get a response?" That's the AI-native approach that underlies parachute-agent.
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
- parachute-agent is licensed under the GNU Affero General Public License v3.0
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,44 @@
1
1
  {
2
2
  "name": "@openparachute/agent",
3
- "version": "0.1.1",
4
- "description": "Parachute Agent per-session containerized AI agent companion.",
3
+ "version": "0.2.0",
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
- "packageManager": "pnpm@10.33.0",
8
- "main": "src/index.ts",
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
- "build": "tsc",
11
- "start": "bun src/index.ts",
12
- "dev": "bun --hot src/index.ts",
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
- "format": "prettier --write \"src/**/*.ts\"",
15
- "format:fix": "prettier --write \"src/**/*.ts\"",
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
- "@chat-adapter/discord": "4.26.0",
28
- "@chat-adapter/telegram": "4.26.0",
29
- "@clack/core": "^1.2.0",
30
- "@clack/prompts": "^1.2.0",
31
- "@modelcontextprotocol/sdk": "^1.29.0",
32
- "chat": "^4.24.0",
33
- "cron-parser": "5.5.0",
34
- "jose": "^6.2.2",
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"
36
37
  },
37
- "devDependencies": {
38
- "@eslint/js": "^9.35.0",
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"
38
+ "peerDependencies": {
39
+ "typescript": "^5"
51
40
  },
52
- "engines": {
53
- "bun": ">=1.3"
41
+ "devDependencies": {
42
+ "@types/bun": "latest"
54
43
  }
55
44
  }