@openparachute/agent 0.1.2 → 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 (605) 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 -263
  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 -172
  318. package/scripts/init-first-agent.ts +0 -378
  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 -80
  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/api-translator.test.ts +0 -306
  328. package/src/channels/api-translator.ts +0 -214
  329. package/src/channels/ask-question.ts +0 -46
  330. package/src/channels/channel-registry.test.ts +0 -421
  331. package/src/channels/channel-registry.ts +0 -313
  332. package/src/channels/chat-sdk-bridge.test.ts +0 -84
  333. package/src/channels/chat-sdk-bridge.ts +0 -652
  334. package/src/channels/cli.ts +0 -276
  335. package/src/channels/discord.ts +0 -90
  336. package/src/channels/index.ts +0 -17
  337. package/src/channels/telegram-markdown-sanitize.test.ts +0 -78
  338. package/src/channels/telegram-markdown-sanitize.ts +0 -55
  339. package/src/channels/telegram-pairing.test.ts +0 -254
  340. package/src/channels/telegram-pairing.ts +0 -339
  341. package/src/channels/telegram.ts +0 -279
  342. package/src/channels/trust-hint.test.ts +0 -48
  343. package/src/channels/trust-hint.ts +0 -75
  344. package/src/claude-md-compose.migrate.test.ts +0 -64
  345. package/src/claude-md-compose.ts +0 -205
  346. package/src/command-gate.ts +0 -63
  347. package/src/config.test.ts +0 -93
  348. package/src/config.ts +0 -128
  349. package/src/container-config.ts +0 -167
  350. package/src/container-runner.test.ts +0 -32
  351. package/src/container-runner.ts +0 -576
  352. package/src/container-runtime.test.ts +0 -269
  353. package/src/container-runtime.ts +0 -167
  354. package/src/db/_bun-sqlite-shim.ts +0 -88
  355. package/src/db/agent-activity.test.ts +0 -155
  356. package/src/db/agent-activity.ts +0 -121
  357. package/src/db/agent-groups.ts +0 -77
  358. package/src/db/connection.migrate.test.ts +0 -176
  359. package/src/db/connection.ts +0 -259
  360. package/src/db/db-v2.test.ts +0 -440
  361. package/src/db/dropped-messages.ts +0 -44
  362. package/src/db/index.ts +0 -40
  363. package/src/db/messaging-groups.ts +0 -252
  364. package/src/db/migrations/001-initial.ts +0 -112
  365. package/src/db/migrations/002-chat-sdk-state.ts +0 -36
  366. package/src/db/migrations/008-dropped-messages.ts +0 -27
  367. package/src/db/migrations/009-drop-pending-credentials.ts +0 -13
  368. package/src/db/migrations/010-engage-modes.ts +0 -103
  369. package/src/db/migrations/011-pending-sender-approvals.ts +0 -40
  370. package/src/db/migrations/012-channel-registration.ts +0 -48
  371. package/src/db/migrations/013-approval-render-metadata.ts +0 -27
  372. package/src/db/migrations/014-secrets.ts +0 -44
  373. package/src/db/migrations/015-secrets-drop-host-pattern.ts +0 -18
  374. package/src/db/migrations/016-secret-assignments.ts +0 -30
  375. package/src/db/migrations/017-agent-activity.ts +0 -40
  376. package/src/db/migrations/018-oauth-app-configs.ts +0 -34
  377. package/src/db/migrations/019-oauth-app-connections.ts +0 -48
  378. package/src/db/migrations/020-agent-app-connections.ts +0 -28
  379. package/src/db/migrations/021-pending-oauth-states.ts +0 -35
  380. package/src/db/migrations/022-app-connections-provider.ts +0 -25
  381. package/src/db/migrations/023-agent-group-secret-mode.test.ts +0 -124
  382. package/src/db/migrations/023-agent-group-secret-mode.ts +0 -65
  383. package/src/db/migrations/024-collapse-approvals.test.ts +0 -249
  384. package/src/db/migrations/024-collapse-approvals.ts +0 -182
  385. package/src/db/migrations/025-secret-mode-check.test.ts +0 -155
  386. package/src/db/migrations/025-secret-mode-check.ts +0 -49
  387. package/src/db/migrations/026-user-dms-bot-id.test.ts +0 -116
  388. package/src/db/migrations/026-user-dms-bot-id.ts +0 -54
  389. package/src/db/migrations/027-provider-credentials.ts +0 -41
  390. package/src/db/migrations/_test-helpers.ts +0 -41
  391. package/src/db/migrations/index.ts +0 -127
  392. package/src/db/migrations/module-agent-to-agent-destinations.ts +0 -84
  393. package/src/db/migrations/module-approvals-pending-approvals.ts +0 -42
  394. package/src/db/migrations/module-approvals-title-options.ts +0 -40
  395. package/src/db/schema.ts +0 -258
  396. package/src/db/session-db.test.ts +0 -93
  397. package/src/db/session-db.ts +0 -325
  398. package/src/db/sessions.ts +0 -241
  399. package/src/delivery.test.ts +0 -148
  400. package/src/delivery.ts +0 -445
  401. package/src/env.ts +0 -74
  402. package/src/group-folder.test.ts +0 -35
  403. package/src/group-folder.ts +0 -44
  404. package/src/group-init.ts +0 -92
  405. package/src/host-core.test.ts +0 -456
  406. package/src/host-sweep.test.ts +0 -146
  407. package/src/host-sweep.ts +0 -287
  408. package/src/index.ts +0 -232
  409. package/src/install-slug.ts +0 -33
  410. package/src/log.test.ts +0 -81
  411. package/src/log.ts +0 -117
  412. package/src/mcp/http.ts +0 -72
  413. package/src/mcp/server.ts +0 -92
  414. package/src/mcp/stdio.ts +0 -51
  415. package/src/mcp/tools/activity.ts +0 -88
  416. package/src/mcp/tools/agent-groups.ts +0 -183
  417. package/src/mcp/tools/approvals.ts +0 -122
  418. package/src/mcp/tools/channels.test.ts +0 -126
  419. package/src/mcp/tools/channels.ts +0 -134
  420. package/src/mcp/tools/index.ts +0 -27
  421. package/src/mcp/tools/oauth.ts +0 -48
  422. package/src/mcp/tools/secrets.ts +0 -169
  423. package/src/mcp/tools/sessions.ts +0 -135
  424. package/src/mcp/types.ts +0 -51
  425. package/src/modules/agent-to-agent/agent-route.test.ts +0 -46
  426. package/src/modules/agent-to-agent/agent-route.ts +0 -223
  427. package/src/modules/agent-to-agent/create-agent.ts +0 -127
  428. package/src/modules/agent-to-agent/db/agent-destinations.ts +0 -135
  429. package/src/modules/agent-to-agent/index.ts +0 -22
  430. package/src/modules/agent-to-agent/write-destinations.ts +0 -59
  431. package/src/modules/approvals/agent.md +0 -45
  432. package/src/modules/approvals/index.ts +0 -21
  433. package/src/modules/approvals/picks.test.ts +0 -291
  434. package/src/modules/approvals/primitive.ts +0 -279
  435. package/src/modules/approvals/project.md +0 -27
  436. package/src/modules/approvals/response-handler.ts +0 -87
  437. package/src/modules/index.ts +0 -24
  438. package/src/modules/interactive/agent.md +0 -21
  439. package/src/modules/interactive/index.ts +0 -69
  440. package/src/modules/interactive/project.md +0 -12
  441. package/src/modules/mount-security/expand-path.test.ts +0 -82
  442. package/src/modules/mount-security/index.ts +0 -459
  443. package/src/modules/mount-security/migrate.test.ts +0 -91
  444. package/src/modules/permissions/access.ts +0 -28
  445. package/src/modules/permissions/channel-approval.test.ts +0 -389
  446. package/src/modules/permissions/channel-approval.ts +0 -188
  447. package/src/modules/permissions/db/agent-group-members.ts +0 -44
  448. package/src/modules/permissions/db/pending-channel-approvals.test.ts +0 -86
  449. package/src/modules/permissions/db/pending-channel-approvals.ts +0 -66
  450. package/src/modules/permissions/db/pending-sender-approvals.ts +0 -60
  451. package/src/modules/permissions/db/user-dms.ts +0 -58
  452. package/src/modules/permissions/db/user-roles.ts +0 -85
  453. package/src/modules/permissions/db/users.ts +0 -38
  454. package/src/modules/permissions/index.ts +0 -421
  455. package/src/modules/permissions/permissions.test.ts +0 -358
  456. package/src/modules/permissions/sender-approval.test.ts +0 -641
  457. package/src/modules/permissions/sender-approval.ts +0 -165
  458. package/src/modules/permissions/user-dm.ts +0 -200
  459. package/src/modules/provider-credentials/db.ts +0 -121
  460. package/src/modules/provider-credentials/index.ts +0 -12
  461. package/src/modules/provider-credentials/spawn.test.ts +0 -206
  462. package/src/modules/provider-credentials/spawn.ts +0 -114
  463. package/src/modules/scheduling/actions.ts +0 -113
  464. package/src/modules/scheduling/db.test.ts +0 -282
  465. package/src/modules/scheduling/db.ts +0 -148
  466. package/src/modules/scheduling/index.ts +0 -34
  467. package/src/modules/scheduling/recurrence.test.ts +0 -98
  468. package/src/modules/scheduling/recurrence.ts +0 -54
  469. package/src/modules/self-mod/agent.md +0 -30
  470. package/src/modules/self-mod/apply.ts +0 -85
  471. package/src/modules/self-mod/index.ts +0 -30
  472. package/src/modules/self-mod/project.md +0 -39
  473. package/src/modules/self-mod/request.ts +0 -91
  474. package/src/modules/typing/index.ts +0 -165
  475. package/src/oauth/agent-app-connections.ts +0 -103
  476. package/src/oauth/app-configs.test.ts +0 -64
  477. package/src/oauth/app-configs.ts +0 -114
  478. package/src/oauth/app-connections.test.ts +0 -109
  479. package/src/oauth/app-connections.ts +0 -178
  480. package/src/oauth/crypto.ts +0 -56
  481. package/src/oauth/flow.ts +0 -104
  482. package/src/oauth/providers/google.test.ts +0 -38
  483. package/src/oauth/providers/google.ts +0 -46
  484. package/src/oauth/providers/index.ts +0 -48
  485. package/src/oauth/state-store.test.ts +0 -54
  486. package/src/oauth/state-store.ts +0 -93
  487. package/src/parachute/README.md +0 -27
  488. package/src/parachute/create-agent.test.ts +0 -83
  489. package/src/parachute/create-agent.ts +0 -122
  490. package/src/parachute/group-status.test.ts +0 -165
  491. package/src/parachute/group-status.ts +0 -136
  492. package/src/parachute/types.ts +0 -41
  493. package/src/parachute/vault-mcp.test.ts +0 -251
  494. package/src/parachute/vault-mcp.ts +0 -232
  495. package/src/platform-id.test.ts +0 -104
  496. package/src/platform-id.ts +0 -109
  497. package/src/providers/index.ts +0 -6
  498. package/src/providers/provider-container-registry.ts +0 -58
  499. package/src/response-registry.ts +0 -45
  500. package/src/router.ts +0 -530
  501. package/src/secrets/crypto.test.ts +0 -45
  502. package/src/secrets/crypto.ts +0 -55
  503. package/src/secrets/index.ts +0 -461
  504. package/src/secrets/master-key.ts +0 -70
  505. package/src/secrets/secrets.test.ts +0 -651
  506. package/src/session-manager.attachments.test.ts +0 -171
  507. package/src/session-manager.dup-skip.test.ts +0 -173
  508. package/src/session-manager.migrate.test.ts +0 -59
  509. package/src/session-manager.ts +0 -451
  510. package/src/startup-bootstrap.test.ts +0 -226
  511. package/src/startup-bootstrap.ts +0 -207
  512. package/src/state-sqlite.ts +0 -182
  513. package/src/timezone.test.ts +0 -64
  514. package/src/timezone.ts +0 -37
  515. package/src/types.ts +0 -233
  516. package/src/web/auth.test.ts +0 -335
  517. package/src/web/auth.ts +0 -214
  518. package/src/web/discord-validate.test.ts +0 -77
  519. package/src/web/discord-validate.ts +0 -88
  520. package/src/web/hub-discovery.test.ts +0 -98
  521. package/src/web/hub-discovery.ts +0 -69
  522. package/src/web/routes/activity.ts +0 -106
  523. package/src/web/routes/agent-provider.test.ts +0 -282
  524. package/src/web/routes/agent-provider.ts +0 -309
  525. package/src/web/routes/approvals.ts +0 -185
  526. package/src/web/routes/apps.ts +0 -434
  527. package/src/web/routes/channels-mg-detail.test.ts +0 -324
  528. package/src/web/routes/channels-mga-detail.test.ts +0 -472
  529. package/src/web/routes/channels.ts +0 -311
  530. package/src/web/routes/oauth-providers.ts +0 -42
  531. package/src/web/routes/secrets.test.ts +0 -220
  532. package/src/web/routes/secrets.ts +0 -317
  533. package/src/web/routes/sessions.ts +0 -123
  534. package/src/web/routes/settings.test.ts +0 -106
  535. package/src/web/routes/settings.ts +0 -247
  536. package/src/web/routes/setup-status.ts +0 -205
  537. package/src/web/routes/vaults.test.ts +0 -389
  538. package/src/web/routes/vaults.ts +0 -225
  539. package/src/web/server-version.test.ts +0 -16
  540. package/src/web/server.ts +0 -1024
  541. package/src/web/services-manifest.test.ts +0 -148
  542. package/src/web/services-manifest.ts +0 -66
  543. package/src/web/static-serve.test.ts +0 -255
  544. package/src/web/static-serve.ts +0 -104
  545. package/src/web/telegram-validate.test.ts +0 -116
  546. package/src/web/telegram-validate.ts +0 -107
  547. package/src/web/vault-proxy.test.ts +0 -214
  548. package/src/web/vault-proxy.ts +0 -120
  549. package/src/web/wire-channel.ts +0 -181
  550. package/src/webhook-server.ts +0 -134
  551. package/vitest.config.ts +0 -18
  552. package/web/README.md +0 -63
  553. package/web/ui/index.html +0 -13
  554. package/web/ui/package.json +0 -35
  555. package/web/ui/pnpm-lock.yaml +0 -2164
  556. package/web/ui/scripts/verify-base.mjs +0 -31
  557. package/web/ui/src/App.tsx +0 -88
  558. package/web/ui/src/components/ActivityFeed.tsx +0 -444
  559. package/web/ui/src/components/AgentGroupPicker.tsx +0 -263
  560. package/web/ui/src/components/AgentProviderCards.tsx +0 -220
  561. package/web/ui/src/components/CredentialForm.tsx +0 -214
  562. package/web/ui/src/components/ScopeGrants.tsx +0 -74
  563. package/web/ui/src/components/StatusDot.tsx +0 -43
  564. package/web/ui/src/components/VaultPicker.tsx +0 -127
  565. package/web/ui/src/components/setup/AdapterInstallStep.tsx +0 -178
  566. package/web/ui/src/components/setup/AgentGroupStep.tsx +0 -43
  567. package/web/ui/src/components/setup/ChannelPickStep.tsx +0 -74
  568. package/web/ui/src/components/setup/DoneStep.tsx +0 -49
  569. package/web/ui/src/components/setup/PrereqStep.tsx +0 -129
  570. package/web/ui/src/components/setup/TestConnectionStep.tsx +0 -108
  571. package/web/ui/src/components/setup/TestMessageStep.tsx +0 -104
  572. package/web/ui/src/components/setup/WireChannelStep.tsx +0 -166
  573. package/web/ui/src/components/setup/types.ts +0 -105
  574. package/web/ui/src/lib/api.test.ts +0 -410
  575. package/web/ui/src/lib/api.ts +0 -1248
  576. package/web/ui/src/lib/auth.test.ts +0 -352
  577. package/web/ui/src/lib/auth.ts +0 -405
  578. package/web/ui/src/lib/channel-adapters.ts +0 -136
  579. package/web/ui/src/main.tsx +0 -19
  580. package/web/ui/src/routes/ApprovalsList.tsx +0 -294
  581. package/web/ui/src/routes/Apps.tsx +0 -613
  582. package/web/ui/src/routes/ChannelWireDetail.test.tsx +0 -233
  583. package/web/ui/src/routes/ChannelWireDetail.tsx +0 -403
  584. package/web/ui/src/routes/ChannelsList.tsx +0 -158
  585. package/web/ui/src/routes/GroupDetail.test.tsx +0 -206
  586. package/web/ui/src/routes/GroupDetail.tsx +0 -880
  587. package/web/ui/src/routes/GroupList.tsx +0 -187
  588. package/web/ui/src/routes/MessagingGroupDetail.test.tsx +0 -233
  589. package/web/ui/src/routes/MessagingGroupDetail.tsx +0 -306
  590. package/web/ui/src/routes/NewGroupWizard.tsx +0 -390
  591. package/web/ui/src/routes/OAuthCallback.tsx +0 -56
  592. package/web/ui/src/routes/SecretsList.tsx +0 -942
  593. package/web/ui/src/routes/SessionsList.tsx +0 -220
  594. package/web/ui/src/routes/SettingsAgentProvider.tsx +0 -109
  595. package/web/ui/src/routes/SettingsApprovals.tsx +0 -234
  596. package/web/ui/src/routes/SetupWizard.tsx +0 -219
  597. package/web/ui/src/routes/VaultDetail.test.tsx +0 -363
  598. package/web/ui/src/routes/VaultDetail.tsx +0 -960
  599. package/web/ui/src/routes/VaultsList.tsx +0 -295
  600. package/web/ui/src/routes/WireChannelPage.tsx +0 -413
  601. package/web/ui/src/styles.css +0 -608
  602. package/web/ui/src/test/setup.ts +0 -23
  603. package/web/ui/src/vite-env.d.ts +0 -10
  604. package/web/ui/vite.config.ts +0 -34
  605. 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.2",
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
  }