@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.
Files changed (608) hide show
  1. package/.parachute/module.json +124 -8
  2. package/LICENSE +2 -16
  3. package/README.md +118 -166
  4. package/package.json +35 -42
  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/dist/assets/index-C-iWdFFV.css +1 -0
  103. package/web/ui/dist/assets/index-VFETBk0a.js +60 -0
  104. package/web/ui/dist/index.html +15 -0
  105. package/web/ui/tsconfig.json +2 -1
  106. package/.claude/scheduled_tasks.lock +0 -1
  107. package/.claude/settings.json +0 -5
  108. package/.claude/skills/add-atomic-chat-tool/SKILL.md +0 -243
  109. package/.claude/skills/add-atomic-chat-tool/atomic-chat-mcp-stdio.ts +0 -229
  110. package/.claude/skills/add-codex/SKILL.md +0 -161
  111. package/.claude/skills/add-dashboard/SKILL.md +0 -138
  112. package/.claude/skills/add-dashboard/resources/dashboard-pusher.ts +0 -495
  113. package/.claude/skills/add-emacs/SKILL.md +0 -296
  114. package/.claude/skills/add-gcal-tool/SKILL.md +0 -210
  115. package/.claude/skills/add-gchat/REMOVE.md +0 -6
  116. package/.claude/skills/add-gchat/SKILL.md +0 -92
  117. package/.claude/skills/add-gchat/VERIFY.md +0 -3
  118. package/.claude/skills/add-github/REMOVE.md +0 -6
  119. package/.claude/skills/add-github/SKILL.md +0 -148
  120. package/.claude/skills/add-github/VERIFY.md +0 -3
  121. package/.claude/skills/add-gmail-tool/SKILL.md +0 -229
  122. package/.claude/skills/add-imessage/REMOVE.md +0 -6
  123. package/.claude/skills/add-imessage/SKILL.md +0 -113
  124. package/.claude/skills/add-imessage/VERIFY.md +0 -3
  125. package/.claude/skills/add-karpathy-llm-wiki/SKILL.md +0 -110
  126. package/.claude/skills/add-karpathy-llm-wiki/llm-wiki.md +0 -75
  127. package/.claude/skills/add-linear/REMOVE.md +0 -6
  128. package/.claude/skills/add-linear/SKILL.md +0 -168
  129. package/.claude/skills/add-linear/VERIFY.md +0 -3
  130. package/.claude/skills/add-macos-statusbar/SKILL.md +0 -133
  131. package/.claude/skills/add-macos-statusbar/add/src/statusbar.swift +0 -147
  132. package/.claude/skills/add-matrix/REMOVE.md +0 -6
  133. package/.claude/skills/add-matrix/SKILL.md +0 -148
  134. package/.claude/skills/add-matrix/VERIFY.md +0 -3
  135. package/.claude/skills/add-ollama-provider/SKILL.md +0 -179
  136. package/.claude/skills/add-ollama-tool/SKILL.md +0 -193
  137. package/.claude/skills/add-opencode/SKILL.md +0 -229
  138. package/.claude/skills/add-parallel/SKILL.md +0 -290
  139. package/.claude/skills/add-resend/REMOVE.md +0 -6
  140. package/.claude/skills/add-resend/SKILL.md +0 -93
  141. package/.claude/skills/add-resend/VERIFY.md +0 -3
  142. package/.claude/skills/add-signal/REMOVE.md +0 -13
  143. package/.claude/skills/add-signal/SKILL.md +0 -318
  144. package/.claude/skills/add-signal/VERIFY.md +0 -5
  145. package/.claude/skills/add-slack/REMOVE.md +0 -6
  146. package/.claude/skills/add-slack/SKILL.md +0 -112
  147. package/.claude/skills/add-slack/VERIFY.md +0 -3
  148. package/.claude/skills/add-teams/REMOVE.md +0 -6
  149. package/.claude/skills/add-teams/SKILL.md +0 -207
  150. package/.claude/skills/add-teams/VERIFY.md +0 -3
  151. package/.claude/skills/add-vercel/SKILL.md +0 -147
  152. package/.claude/skills/add-vercel/container-skills/vercel-cli/SKILL.md +0 -103
  153. package/.claude/skills/add-webex/REMOVE.md +0 -6
  154. package/.claude/skills/add-webex/SKILL.md +0 -88
  155. package/.claude/skills/add-webex/VERIFY.md +0 -3
  156. package/.claude/skills/add-wechat/REMOVE.md +0 -49
  157. package/.claude/skills/add-wechat/SKILL.md +0 -170
  158. package/.claude/skills/add-wechat/scripts/wire-dm.ts +0 -172
  159. package/.claude/skills/add-whatsapp/SKILL.md +0 -264
  160. package/.claude/skills/add-whatsapp-cloud/REMOVE.md +0 -6
  161. package/.claude/skills/add-whatsapp-cloud/SKILL.md +0 -95
  162. package/.claude/skills/add-whatsapp-cloud/VERIFY.md +0 -3
  163. package/.claude/skills/claw/SKILL.md +0 -131
  164. package/.claude/skills/claw/scripts/claw +0 -374
  165. package/.claude/skills/convert-to-apple-container/SKILL.md +0 -212
  166. package/.claude/skills/customize/SKILL.md +0 -110
  167. package/.claude/skills/debug/SKILL.md +0 -349
  168. package/.claude/skills/get-qodo-rules/SKILL.md +0 -122
  169. package/.claude/skills/get-qodo-rules/references/output-format.md +0 -41
  170. package/.claude/skills/get-qodo-rules/references/pagination.md +0 -33
  171. package/.claude/skills/get-qodo-rules/references/repository-scope.md +0 -26
  172. package/.claude/skills/init-first-agent/SKILL.md +0 -120
  173. package/.claude/skills/init-onecli/SKILL.md +0 -270
  174. package/.claude/skills/manage-channels/SKILL.md +0 -87
  175. package/.claude/skills/manage-mounts/SKILL.md +0 -47
  176. package/.claude/skills/migrate-from-openclaw/MIGRATE_CRONS.md +0 -100
  177. package/.claude/skills/migrate-from-openclaw/SKILL.md +0 -447
  178. package/.claude/skills/migrate-from-openclaw/scripts/discover-openclaw.ts +0 -734
  179. package/.claude/skills/migrate-from-openclaw/scripts/extract-channel-credentials.ts +0 -476
  180. package/.claude/skills/migrate-nanoclaw/SKILL.md +0 -484
  181. package/.claude/skills/migrate-nanoclaw/diagnostics.md +0 -51
  182. package/.claude/skills/qodo-pr-resolver/SKILL.md +0 -326
  183. package/.claude/skills/qodo-pr-resolver/resources/providers.md +0 -329
  184. package/.claude/skills/update-nanoclaw/SKILL.md +0 -243
  185. package/.claude/skills/update-nanoclaw/diagnostics.md +0 -48
  186. package/.claude/skills/update-skills/SKILL.md +0 -130
  187. package/.claude/skills/use-native-credential-proxy/SKILL.md +0 -167
  188. package/.claude/skills/x-integration/SKILL.md +0 -417
  189. package/.claude/skills/x-integration/agent.ts +0 -243
  190. package/.claude/skills/x-integration/host.ts +0 -155
  191. package/.claude/skills/x-integration/lib/browser.ts +0 -148
  192. package/.claude/skills/x-integration/lib/config.ts +0 -62
  193. package/.claude/skills/x-integration/scripts/like.ts +0 -56
  194. package/.claude/skills/x-integration/scripts/post.ts +0 -66
  195. package/.claude/skills/x-integration/scripts/quote.ts +0 -80
  196. package/.claude/skills/x-integration/scripts/reply.ts +0 -74
  197. package/.claude/skills/x-integration/scripts/retweet.ts +0 -62
  198. package/.claude/skills/x-integration/scripts/setup.ts +0 -87
  199. package/.github/CODEOWNERS +0 -10
  200. package/.github/PULL_REQUEST_TEMPLATE.md +0 -18
  201. package/.github/workflows/bump-version.yml +0 -35
  202. package/.github/workflows/ci.yml +0 -39
  203. package/.github/workflows/label-pr.yml +0 -40
  204. package/.github/workflows/update-tokens.yml +0 -43
  205. package/.husky/pre-commit +0 -1
  206. package/.mcp.json +0 -3
  207. package/.nvmrc +0 -1
  208. package/.prettierrc +0 -4
  209. package/CHANGELOG.md +0 -263
  210. package/CLAUDE.md +0 -307
  211. package/CODE_OF_CONDUCT.md +0 -128
  212. package/CONTRIBUTING.md +0 -159
  213. package/CONTRIBUTORS.md +0 -26
  214. package/LICENSE-NANOCLAW-MIT +0 -21
  215. package/README_ja.md +0 -194
  216. package/README_zh.md +0 -194
  217. package/assets/nanoclaw-favicon.png +0 -0
  218. package/assets/nanoclaw-icon.png +0 -0
  219. package/assets/nanoclaw-logo-dark.png +0 -0
  220. package/assets/nanoclaw-logo.png +0 -0
  221. package/assets/nanoclaw-profile.jpeg +0 -0
  222. package/assets/nanoclaw-sales.png +0 -0
  223. package/assets/social-preview.jpg +0 -0
  224. package/config-examples/mount-allowlist.json +0 -25
  225. package/container/.dockerignore +0 -2
  226. package/container/CLAUDE.md +0 -21
  227. package/container/Dockerfile +0 -121
  228. package/container/agent-runner/bun.lock +0 -243
  229. package/container/agent-runner/package.json +0 -22
  230. package/container/agent-runner/scripts/sdk-signal-probe.ts +0 -169
  231. package/container/agent-runner/src/config.ts +0 -55
  232. package/container/agent-runner/src/db/connection.ts +0 -267
  233. package/container/agent-runner/src/db/index.ts +0 -20
  234. package/container/agent-runner/src/db/messages-in.ts +0 -138
  235. package/container/agent-runner/src/db/messages-out.ts +0 -143
  236. package/container/agent-runner/src/db/session-routing.ts +0 -30
  237. package/container/agent-runner/src/db/session-state.test.ts +0 -100
  238. package/container/agent-runner/src/db/session-state.ts +0 -79
  239. package/container/agent-runner/src/destinations.ts +0 -135
  240. package/container/agent-runner/src/formatter.test.ts +0 -167
  241. package/container/agent-runner/src/formatter.ts +0 -260
  242. package/container/agent-runner/src/index.ts +0 -110
  243. package/container/agent-runner/src/integration.test.ts +0 -121
  244. package/container/agent-runner/src/mcp-tools/agents.instructions.md +0 -26
  245. package/container/agent-runner/src/mcp-tools/agents.ts +0 -66
  246. package/container/agent-runner/src/mcp-tools/core.instructions.md +0 -27
  247. package/container/agent-runner/src/mcp-tools/core.ts +0 -262
  248. package/container/agent-runner/src/mcp-tools/index.ts +0 -22
  249. package/container/agent-runner/src/mcp-tools/interactive.instructions.md +0 -22
  250. package/container/agent-runner/src/mcp-tools/interactive.ts +0 -169
  251. package/container/agent-runner/src/mcp-tools/scheduling.instructions.md +0 -40
  252. package/container/agent-runner/src/mcp-tools/scheduling.ts +0 -299
  253. package/container/agent-runner/src/mcp-tools/self-mod.instructions.md +0 -25
  254. package/container/agent-runner/src/mcp-tools/self-mod.ts +0 -120
  255. package/container/agent-runner/src/mcp-tools/server.ts +0 -54
  256. package/container/agent-runner/src/mcp-tools/types.ts +0 -6
  257. package/container/agent-runner/src/poll-loop.test.ts +0 -248
  258. package/container/agent-runner/src/poll-loop.ts +0 -437
  259. package/container/agent-runner/src/providers/claude.ts +0 -379
  260. package/container/agent-runner/src/providers/factory.test.ts +0 -19
  261. package/container/agent-runner/src/providers/factory.ts +0 -13
  262. package/container/agent-runner/src/providers/index.ts +0 -6
  263. package/container/agent-runner/src/providers/mock.ts +0 -77
  264. package/container/agent-runner/src/providers/provider-registry.ts +0 -33
  265. package/container/agent-runner/src/providers/types.ts +0 -82
  266. package/container/agent-runner/src/scheduling/task-script.ts +0 -121
  267. package/container/agent-runner/src/timezone.test.ts +0 -93
  268. package/container/agent-runner/src/timezone.ts +0 -107
  269. package/container/agent-runner/tsconfig.json +0 -14
  270. package/container/build.sh +0 -48
  271. package/container/entrypoint.sh +0 -16
  272. package/container/skills/agent-browser/SKILL.md +0 -159
  273. package/container/skills/frontend-engineer/SKILL.md +0 -157
  274. package/container/skills/self-customize/SKILL.md +0 -87
  275. package/container/skills/slack-formatting/SKILL.md +0 -94
  276. package/container/skills/vercel-cli/SKILL.md +0 -111
  277. package/container/skills/welcome/SKILL.md +0 -85
  278. package/docs/APPLE-CONTAINER-NETWORKING.md +0 -90
  279. package/docs/BRANCH-FORK-MAINTENANCE.md +0 -81
  280. package/docs/README.md +0 -25
  281. package/docs/SDK_DEEP_DIVE.md +0 -643
  282. package/docs/SECURITY.md +0 -162
  283. package/docs/agent-runner-details.md +0 -749
  284. package/docs/api-details.md +0 -365
  285. package/docs/architecture-diagram.html +0 -422
  286. package/docs/architecture-diagram.md +0 -215
  287. package/docs/architecture.md +0 -751
  288. package/docs/audit/2026-04-30-channel-endpoint-audit.md +0 -36
  289. package/docs/build-and-runtime.md +0 -80
  290. package/docs/cross-mount-stress/README.md +0 -112
  291. package/docs/cross-mount-stress/container-writer-retry.mjs +0 -55
  292. package/docs/cross-mount-stress/container-writer-slow.mjs +0 -42
  293. package/docs/cross-mount-stress/container-writer.mjs +0 -47
  294. package/docs/cross-mount-stress/host-writer-retry.mjs +0 -55
  295. package/docs/cross-mount-stress/host-writer-slow.mjs +0 -43
  296. package/docs/cross-mount-stress/host-writer.mjs +0 -47
  297. package/docs/db-central.md +0 -316
  298. package/docs/db-session.md +0 -183
  299. package/docs/db.md +0 -119
  300. package/docs/design/2026-04-29-vault-management-ui.md +0 -231
  301. package/docs/design/2026-04-30-channel-wiring-rework.md +0 -234
  302. package/docs/design/2026-05-01-channel-wiring-approvals-deep-dive.md +0 -272
  303. package/docs/design/2026-05-02-channel-policy-and-approval-routing.md +0 -250
  304. package/docs/docker-sandboxes.md +0 -359
  305. package/docs/isolation-model.md +0 -88
  306. package/docs/ollama.md +0 -79
  307. package/docs/parachute-integration.md +0 -109
  308. package/docs/post-night-rebirth-reflections.md +0 -151
  309. package/eslint.config.js +0 -32
  310. package/pnpm-workspace.yaml +0 -8
  311. package/repo-tokens/README.md +0 -113
  312. package/repo-tokens/action.yml +0 -186
  313. package/repo-tokens/badge.svg +0 -23
  314. package/repo-tokens/examples/green.svg +0 -14
  315. package/repo-tokens/examples/red.svg +0 -14
  316. package/repo-tokens/examples/yellow-green.svg +0 -14
  317. package/repo-tokens/examples/yellow.svg +0 -14
  318. package/scripts/chat.ts +0 -101
  319. package/scripts/cleanup-sessions.sh +0 -150
  320. package/scripts/init-cli-agent.ts +0 -172
  321. package/scripts/init-first-agent.ts +0 -378
  322. package/scripts/parachute.ts +0 -158
  323. package/scripts/run-migrations.ts +0 -105
  324. package/scripts/sanity-live-poll.ts +0 -95
  325. package/scripts/seed-discord.ts +0 -80
  326. package/scripts/test-v2-agent.ts +0 -106
  327. package/scripts/test-v2-channel-e2e.ts +0 -265
  328. package/scripts/test-v2-host.ts +0 -184
  329. package/src/channels/adapter.ts +0 -214
  330. package/src/channels/api-translator.test.ts +0 -306
  331. package/src/channels/api-translator.ts +0 -214
  332. package/src/channels/ask-question.ts +0 -46
  333. package/src/channels/channel-registry.test.ts +0 -421
  334. package/src/channels/channel-registry.ts +0 -313
  335. package/src/channels/chat-sdk-bridge.test.ts +0 -84
  336. package/src/channels/chat-sdk-bridge.ts +0 -652
  337. package/src/channels/cli.ts +0 -276
  338. package/src/channels/discord.ts +0 -90
  339. package/src/channels/index.ts +0 -17
  340. package/src/channels/telegram-markdown-sanitize.test.ts +0 -78
  341. package/src/channels/telegram-markdown-sanitize.ts +0 -55
  342. package/src/channels/telegram-pairing.test.ts +0 -254
  343. package/src/channels/telegram-pairing.ts +0 -339
  344. package/src/channels/telegram.ts +0 -279
  345. package/src/channels/trust-hint.test.ts +0 -48
  346. package/src/channels/trust-hint.ts +0 -75
  347. package/src/claude-md-compose.migrate.test.ts +0 -64
  348. package/src/claude-md-compose.ts +0 -205
  349. package/src/command-gate.ts +0 -63
  350. package/src/config.test.ts +0 -93
  351. package/src/config.ts +0 -128
  352. package/src/container-config.ts +0 -167
  353. package/src/container-runner.test.ts +0 -32
  354. package/src/container-runner.ts +0 -576
  355. package/src/container-runtime.test.ts +0 -269
  356. package/src/container-runtime.ts +0 -167
  357. package/src/db/_bun-sqlite-shim.ts +0 -88
  358. package/src/db/agent-activity.test.ts +0 -155
  359. package/src/db/agent-activity.ts +0 -121
  360. package/src/db/agent-groups.ts +0 -77
  361. package/src/db/connection.migrate.test.ts +0 -176
  362. package/src/db/connection.ts +0 -259
  363. package/src/db/db-v2.test.ts +0 -440
  364. package/src/db/dropped-messages.ts +0 -44
  365. package/src/db/index.ts +0 -40
  366. package/src/db/messaging-groups.ts +0 -252
  367. package/src/db/migrations/001-initial.ts +0 -112
  368. package/src/db/migrations/002-chat-sdk-state.ts +0 -36
  369. package/src/db/migrations/008-dropped-messages.ts +0 -27
  370. package/src/db/migrations/009-drop-pending-credentials.ts +0 -13
  371. package/src/db/migrations/010-engage-modes.ts +0 -103
  372. package/src/db/migrations/011-pending-sender-approvals.ts +0 -40
  373. package/src/db/migrations/012-channel-registration.ts +0 -48
  374. package/src/db/migrations/013-approval-render-metadata.ts +0 -27
  375. package/src/db/migrations/014-secrets.ts +0 -44
  376. package/src/db/migrations/015-secrets-drop-host-pattern.ts +0 -18
  377. package/src/db/migrations/016-secret-assignments.ts +0 -30
  378. package/src/db/migrations/017-agent-activity.ts +0 -40
  379. package/src/db/migrations/018-oauth-app-configs.ts +0 -34
  380. package/src/db/migrations/019-oauth-app-connections.ts +0 -48
  381. package/src/db/migrations/020-agent-app-connections.ts +0 -28
  382. package/src/db/migrations/021-pending-oauth-states.ts +0 -35
  383. package/src/db/migrations/022-app-connections-provider.ts +0 -25
  384. package/src/db/migrations/023-agent-group-secret-mode.test.ts +0 -124
  385. package/src/db/migrations/023-agent-group-secret-mode.ts +0 -65
  386. package/src/db/migrations/024-collapse-approvals.test.ts +0 -249
  387. package/src/db/migrations/024-collapse-approvals.ts +0 -182
  388. package/src/db/migrations/025-secret-mode-check.test.ts +0 -155
  389. package/src/db/migrations/025-secret-mode-check.ts +0 -49
  390. package/src/db/migrations/026-user-dms-bot-id.test.ts +0 -116
  391. package/src/db/migrations/026-user-dms-bot-id.ts +0 -54
  392. package/src/db/migrations/027-provider-credentials.ts +0 -41
  393. package/src/db/migrations/_test-helpers.ts +0 -41
  394. package/src/db/migrations/index.ts +0 -127
  395. package/src/db/migrations/module-agent-to-agent-destinations.ts +0 -84
  396. package/src/db/migrations/module-approvals-pending-approvals.ts +0 -42
  397. package/src/db/migrations/module-approvals-title-options.ts +0 -40
  398. package/src/db/schema.ts +0 -258
  399. package/src/db/session-db.test.ts +0 -93
  400. package/src/db/session-db.ts +0 -325
  401. package/src/db/sessions.ts +0 -241
  402. package/src/delivery.test.ts +0 -148
  403. package/src/delivery.ts +0 -445
  404. package/src/env.ts +0 -74
  405. package/src/group-folder.test.ts +0 -35
  406. package/src/group-folder.ts +0 -44
  407. package/src/group-init.ts +0 -92
  408. package/src/host-core.test.ts +0 -456
  409. package/src/host-sweep.test.ts +0 -146
  410. package/src/host-sweep.ts +0 -287
  411. package/src/index.ts +0 -232
  412. package/src/install-slug.ts +0 -33
  413. package/src/log.test.ts +0 -81
  414. package/src/log.ts +0 -117
  415. package/src/mcp/http.ts +0 -72
  416. package/src/mcp/server.ts +0 -92
  417. package/src/mcp/stdio.ts +0 -51
  418. package/src/mcp/tools/activity.ts +0 -88
  419. package/src/mcp/tools/agent-groups.ts +0 -183
  420. package/src/mcp/tools/approvals.ts +0 -122
  421. package/src/mcp/tools/channels.test.ts +0 -126
  422. package/src/mcp/tools/channels.ts +0 -134
  423. package/src/mcp/tools/index.ts +0 -27
  424. package/src/mcp/tools/oauth.ts +0 -48
  425. package/src/mcp/tools/secrets.ts +0 -169
  426. package/src/mcp/tools/sessions.ts +0 -135
  427. package/src/mcp/types.ts +0 -51
  428. package/src/modules/agent-to-agent/agent-route.test.ts +0 -46
  429. package/src/modules/agent-to-agent/agent-route.ts +0 -223
  430. package/src/modules/agent-to-agent/create-agent.ts +0 -127
  431. package/src/modules/agent-to-agent/db/agent-destinations.ts +0 -135
  432. package/src/modules/agent-to-agent/index.ts +0 -22
  433. package/src/modules/agent-to-agent/write-destinations.ts +0 -59
  434. package/src/modules/approvals/agent.md +0 -45
  435. package/src/modules/approvals/index.ts +0 -21
  436. package/src/modules/approvals/picks.test.ts +0 -291
  437. package/src/modules/approvals/primitive.ts +0 -279
  438. package/src/modules/approvals/project.md +0 -27
  439. package/src/modules/approvals/response-handler.ts +0 -87
  440. package/src/modules/index.ts +0 -24
  441. package/src/modules/interactive/agent.md +0 -21
  442. package/src/modules/interactive/index.ts +0 -69
  443. package/src/modules/interactive/project.md +0 -12
  444. package/src/modules/mount-security/expand-path.test.ts +0 -82
  445. package/src/modules/mount-security/index.ts +0 -459
  446. package/src/modules/mount-security/migrate.test.ts +0 -91
  447. package/src/modules/permissions/access.ts +0 -28
  448. package/src/modules/permissions/channel-approval.test.ts +0 -389
  449. package/src/modules/permissions/channel-approval.ts +0 -188
  450. package/src/modules/permissions/db/agent-group-members.ts +0 -44
  451. package/src/modules/permissions/db/pending-channel-approvals.test.ts +0 -86
  452. package/src/modules/permissions/db/pending-channel-approvals.ts +0 -66
  453. package/src/modules/permissions/db/pending-sender-approvals.ts +0 -60
  454. package/src/modules/permissions/db/user-dms.ts +0 -58
  455. package/src/modules/permissions/db/user-roles.ts +0 -85
  456. package/src/modules/permissions/db/users.ts +0 -38
  457. package/src/modules/permissions/index.ts +0 -421
  458. package/src/modules/permissions/permissions.test.ts +0 -358
  459. package/src/modules/permissions/sender-approval.test.ts +0 -641
  460. package/src/modules/permissions/sender-approval.ts +0 -165
  461. package/src/modules/permissions/user-dm.ts +0 -200
  462. package/src/modules/provider-credentials/db.ts +0 -121
  463. package/src/modules/provider-credentials/index.ts +0 -12
  464. package/src/modules/provider-credentials/spawn.test.ts +0 -206
  465. package/src/modules/provider-credentials/spawn.ts +0 -114
  466. package/src/modules/scheduling/actions.ts +0 -113
  467. package/src/modules/scheduling/db.test.ts +0 -282
  468. package/src/modules/scheduling/db.ts +0 -148
  469. package/src/modules/scheduling/index.ts +0 -34
  470. package/src/modules/scheduling/recurrence.test.ts +0 -98
  471. package/src/modules/scheduling/recurrence.ts +0 -54
  472. package/src/modules/self-mod/agent.md +0 -30
  473. package/src/modules/self-mod/apply.ts +0 -85
  474. package/src/modules/self-mod/index.ts +0 -30
  475. package/src/modules/self-mod/project.md +0 -39
  476. package/src/modules/self-mod/request.ts +0 -91
  477. package/src/modules/typing/index.ts +0 -165
  478. package/src/oauth/agent-app-connections.ts +0 -103
  479. package/src/oauth/app-configs.test.ts +0 -64
  480. package/src/oauth/app-configs.ts +0 -114
  481. package/src/oauth/app-connections.test.ts +0 -109
  482. package/src/oauth/app-connections.ts +0 -178
  483. package/src/oauth/crypto.ts +0 -56
  484. package/src/oauth/flow.ts +0 -104
  485. package/src/oauth/providers/google.test.ts +0 -38
  486. package/src/oauth/providers/google.ts +0 -46
  487. package/src/oauth/providers/index.ts +0 -48
  488. package/src/oauth/state-store.test.ts +0 -54
  489. package/src/oauth/state-store.ts +0 -93
  490. package/src/parachute/README.md +0 -27
  491. package/src/parachute/create-agent.test.ts +0 -83
  492. package/src/parachute/create-agent.ts +0 -122
  493. package/src/parachute/group-status.test.ts +0 -165
  494. package/src/parachute/group-status.ts +0 -136
  495. package/src/parachute/types.ts +0 -41
  496. package/src/parachute/vault-mcp.test.ts +0 -251
  497. package/src/parachute/vault-mcp.ts +0 -232
  498. package/src/platform-id.test.ts +0 -104
  499. package/src/platform-id.ts +0 -109
  500. package/src/providers/index.ts +0 -6
  501. package/src/providers/provider-container-registry.ts +0 -58
  502. package/src/response-registry.ts +0 -45
  503. package/src/router.ts +0 -530
  504. package/src/secrets/crypto.test.ts +0 -45
  505. package/src/secrets/crypto.ts +0 -55
  506. package/src/secrets/index.ts +0 -461
  507. package/src/secrets/master-key.ts +0 -70
  508. package/src/secrets/secrets.test.ts +0 -651
  509. package/src/session-manager.attachments.test.ts +0 -171
  510. package/src/session-manager.dup-skip.test.ts +0 -173
  511. package/src/session-manager.migrate.test.ts +0 -59
  512. package/src/session-manager.ts +0 -451
  513. package/src/startup-bootstrap.test.ts +0 -226
  514. package/src/startup-bootstrap.ts +0 -207
  515. package/src/state-sqlite.ts +0 -182
  516. package/src/timezone.test.ts +0 -64
  517. package/src/timezone.ts +0 -37
  518. package/src/types.ts +0 -233
  519. package/src/web/auth.test.ts +0 -335
  520. package/src/web/auth.ts +0 -214
  521. package/src/web/discord-validate.test.ts +0 -77
  522. package/src/web/discord-validate.ts +0 -88
  523. package/src/web/hub-discovery.test.ts +0 -98
  524. package/src/web/hub-discovery.ts +0 -69
  525. package/src/web/routes/activity.ts +0 -106
  526. package/src/web/routes/agent-provider.test.ts +0 -282
  527. package/src/web/routes/agent-provider.ts +0 -309
  528. package/src/web/routes/approvals.ts +0 -185
  529. package/src/web/routes/apps.ts +0 -434
  530. package/src/web/routes/channels-mg-detail.test.ts +0 -324
  531. package/src/web/routes/channels-mga-detail.test.ts +0 -472
  532. package/src/web/routes/channels.ts +0 -311
  533. package/src/web/routes/oauth-providers.ts +0 -42
  534. package/src/web/routes/secrets.test.ts +0 -220
  535. package/src/web/routes/secrets.ts +0 -317
  536. package/src/web/routes/sessions.ts +0 -123
  537. package/src/web/routes/settings.test.ts +0 -106
  538. package/src/web/routes/settings.ts +0 -247
  539. package/src/web/routes/setup-status.ts +0 -205
  540. package/src/web/routes/vaults.test.ts +0 -389
  541. package/src/web/routes/vaults.ts +0 -225
  542. package/src/web/server-version.test.ts +0 -16
  543. package/src/web/server.ts +0 -1024
  544. package/src/web/services-manifest.test.ts +0 -148
  545. package/src/web/services-manifest.ts +0 -66
  546. package/src/web/static-serve.test.ts +0 -255
  547. package/src/web/static-serve.ts +0 -104
  548. package/src/web/telegram-validate.test.ts +0 -116
  549. package/src/web/telegram-validate.ts +0 -107
  550. package/src/web/vault-proxy.test.ts +0 -214
  551. package/src/web/vault-proxy.ts +0 -120
  552. package/src/web/wire-channel.ts +0 -181
  553. package/src/webhook-server.ts +0 -134
  554. package/vitest.config.ts +0 -18
  555. package/web/README.md +0 -63
  556. package/web/ui/index.html +0 -13
  557. package/web/ui/package.json +0 -35
  558. package/web/ui/pnpm-lock.yaml +0 -2164
  559. package/web/ui/scripts/verify-base.mjs +0 -31
  560. package/web/ui/src/App.tsx +0 -88
  561. package/web/ui/src/components/ActivityFeed.tsx +0 -444
  562. package/web/ui/src/components/AgentGroupPicker.tsx +0 -263
  563. package/web/ui/src/components/AgentProviderCards.tsx +0 -220
  564. package/web/ui/src/components/CredentialForm.tsx +0 -214
  565. package/web/ui/src/components/ScopeGrants.tsx +0 -74
  566. package/web/ui/src/components/StatusDot.tsx +0 -43
  567. package/web/ui/src/components/VaultPicker.tsx +0 -127
  568. package/web/ui/src/components/setup/AdapterInstallStep.tsx +0 -178
  569. package/web/ui/src/components/setup/AgentGroupStep.tsx +0 -43
  570. package/web/ui/src/components/setup/ChannelPickStep.tsx +0 -74
  571. package/web/ui/src/components/setup/DoneStep.tsx +0 -49
  572. package/web/ui/src/components/setup/PrereqStep.tsx +0 -129
  573. package/web/ui/src/components/setup/TestConnectionStep.tsx +0 -108
  574. package/web/ui/src/components/setup/TestMessageStep.tsx +0 -104
  575. package/web/ui/src/components/setup/WireChannelStep.tsx +0 -166
  576. package/web/ui/src/components/setup/types.ts +0 -105
  577. package/web/ui/src/lib/api.test.ts +0 -410
  578. package/web/ui/src/lib/api.ts +0 -1248
  579. package/web/ui/src/lib/auth.test.ts +0 -352
  580. package/web/ui/src/lib/auth.ts +0 -405
  581. package/web/ui/src/lib/channel-adapters.ts +0 -136
  582. package/web/ui/src/main.tsx +0 -19
  583. package/web/ui/src/routes/ApprovalsList.tsx +0 -294
  584. package/web/ui/src/routes/Apps.tsx +0 -613
  585. package/web/ui/src/routes/ChannelWireDetail.test.tsx +0 -233
  586. package/web/ui/src/routes/ChannelWireDetail.tsx +0 -403
  587. package/web/ui/src/routes/ChannelsList.tsx +0 -158
  588. package/web/ui/src/routes/GroupDetail.test.tsx +0 -206
  589. package/web/ui/src/routes/GroupDetail.tsx +0 -880
  590. package/web/ui/src/routes/GroupList.tsx +0 -187
  591. package/web/ui/src/routes/MessagingGroupDetail.test.tsx +0 -233
  592. package/web/ui/src/routes/MessagingGroupDetail.tsx +0 -306
  593. package/web/ui/src/routes/NewGroupWizard.tsx +0 -390
  594. package/web/ui/src/routes/OAuthCallback.tsx +0 -56
  595. package/web/ui/src/routes/SecretsList.tsx +0 -942
  596. package/web/ui/src/routes/SessionsList.tsx +0 -220
  597. package/web/ui/src/routes/SettingsAgentProvider.tsx +0 -109
  598. package/web/ui/src/routes/SettingsApprovals.tsx +0 -234
  599. package/web/ui/src/routes/SetupWizard.tsx +0 -219
  600. package/web/ui/src/routes/VaultDetail.test.tsx +0 -363
  601. package/web/ui/src/routes/VaultDetail.tsx +0 -960
  602. package/web/ui/src/routes/VaultsList.tsx +0 -295
  603. package/web/ui/src/routes/WireChannelPage.tsx +0 -413
  604. package/web/ui/src/styles.css +0 -608
  605. package/web/ui/src/test/setup.ts +0 -23
  606. package/web/ui/src/vite-env.d.ts +0 -10
  607. package/web/ui/vite.config.ts +0 -34
  608. 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,48 @@
1
1
  {
2
2
  "name": "@openparachute/agent",
3
- "version": "0.1.2",
4
- "description": "Parachute Agent per-session containerized AI agent companion.",
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
- "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"
37
+ },
38
+ "peerDependencies": {
39
+ "typescript": "^5"
36
40
  },
37
41
  "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"
42
+ "@types/bun": "latest"
51
43
  },
52
- "engines": {
53
- "bun": ">=1.3"
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "git+https://github.com/ParachuteComputer/parachute-agent.git"
54
47
  }
55
48
  }