@openparachute/agent 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (598) hide show
  1. package/.parachute/module.json +124 -8
  2. package/LICENSE +2 -16
  3. package/README.md +118 -166
  4. package/package.json +32 -43
  5. package/scripts/spawn-agent.ts +371 -0
  6. package/src/_parked/interactive-spawn.test.ts +324 -0
  7. package/src/_parked/interactive-spawn.ts +701 -0
  8. package/src/agent-defs.test.ts +1504 -0
  9. package/src/agent-defs.ts +1702 -0
  10. package/src/agent-mcp-config.test.ts +115 -0
  11. package/src/agent-mcp-config.ts +115 -0
  12. package/src/agents.test.ts +360 -0
  13. package/src/agents.ts +379 -0
  14. package/src/auth.test.ts +46 -0
  15. package/src/auth.ts +140 -0
  16. package/src/backends/attached-queue.test.ts +376 -0
  17. package/src/backends/attached-queue.ts +372 -0
  18. package/src/backends/programmatic.test.ts +1715 -0
  19. package/src/backends/programmatic.ts +927 -0
  20. package/src/backends/registry.test.ts +1494 -0
  21. package/src/backends/registry.ts +1202 -0
  22. package/src/backends/stream-json.test.ts +570 -0
  23. package/src/backends/stream-json.ts +392 -0
  24. package/src/backends/types.ts +223 -0
  25. package/src/bridge.ts +417 -0
  26. package/src/channel-backend-wiring.test.ts +237 -0
  27. package/src/credentials.test.ts +274 -0
  28. package/src/credentials.ts +380 -0
  29. package/src/cron.test.ts +342 -0
  30. package/src/cron.ts +380 -0
  31. package/src/daemon-agent-def-api.test.ts +166 -0
  32. package/src/daemon-agent-defs-api.test.ts +953 -0
  33. package/src/daemon-agent-env-api.test.ts +338 -0
  34. package/src/daemon-attached-queue-store.test.ts +65 -0
  35. package/src/daemon-config-api.test.ts +962 -0
  36. package/src/daemon-jobs-api.test.ts +271 -0
  37. package/src/daemon-vault-chat.test.ts +250 -0
  38. package/src/daemon.test.ts +746 -0
  39. package/src/daemon.ts +3314 -0
  40. package/src/def-vaults.test.ts +136 -0
  41. package/src/def-vaults.ts +165 -0
  42. package/src/delivery-state.test.ts +110 -0
  43. package/src/delivery-state.ts +154 -0
  44. package/src/effective-env.test.ts +114 -0
  45. package/src/effective-env.ts +184 -0
  46. package/src/env-compat.ts +39 -0
  47. package/src/grants.test.ts +638 -0
  48. package/src/grants.ts +675 -0
  49. package/src/hub-jwt.test.ts +161 -0
  50. package/src/hub-jwt.ts +182 -0
  51. package/src/jobs.test.ts +245 -0
  52. package/src/jobs.ts +266 -0
  53. package/src/mcp-http.test.ts +265 -0
  54. package/src/mcp-http.ts +771 -0
  55. package/src/mint-token.test.ts +152 -0
  56. package/src/mint-token.ts +139 -0
  57. package/src/module-manifest.test.ts +158 -0
  58. package/src/oauth-discovery.ts +134 -0
  59. package/src/programmatic-wiring.test.ts +838 -0
  60. package/src/registry.test.ts +227 -0
  61. package/src/registry.ts +228 -0
  62. package/src/resolve-port.test.ts +64 -0
  63. package/src/routing.test.ts +184 -0
  64. package/src/routing.ts +76 -0
  65. package/src/runner.test.ts +506 -0
  66. package/src/runner.ts +255 -0
  67. package/src/sandbox/config.test.ts +150 -0
  68. package/src/sandbox/config.ts +102 -0
  69. package/src/sandbox/egress.test.ts +113 -0
  70. package/src/sandbox/egress.ts +123 -0
  71. package/src/sandbox/index.ts +180 -0
  72. package/src/sandbox/live-seatbelt.test.ts +277 -0
  73. package/src/sandbox/mounts.test.ts +154 -0
  74. package/src/sandbox/mounts.ts +133 -0
  75. package/src/sandbox/sandbox.test.ts +168 -0
  76. package/src/sandbox/types.ts +382 -0
  77. package/src/services-manifest.test.ts +106 -0
  78. package/src/services-manifest.ts +95 -0
  79. package/src/spa-serve.test.ts +116 -0
  80. package/src/spa-serve.ts +116 -0
  81. package/src/spawn-agent-cli.test.ts +172 -0
  82. package/src/spawn-agent.test.ts +1218 -0
  83. package/src/spawn-agent.ts +569 -0
  84. package/src/spawn-deps.test.ts +54 -0
  85. package/src/spawn-deps.ts +166 -0
  86. package/src/telegram/api.ts +153 -0
  87. package/src/terminal-assets.test.ts +50 -0
  88. package/src/terminal-assets.ts +79 -0
  89. package/src/terminal-ui.ts +305 -0
  90. package/src/terminal.test.ts +530 -0
  91. package/src/terminal.ts +458 -0
  92. package/src/transport.ts +270 -0
  93. package/src/transports/http-ui.test.ts +455 -0
  94. package/src/transports/http-ui.ts +201 -0
  95. package/src/transports/telegram.test.ts +174 -0
  96. package/src/transports/telegram.ts +426 -0
  97. package/src/transports/vault.test.ts +2011 -0
  98. package/src/transports/vault.ts +1790 -0
  99. package/src/ui-kit.test.ts +178 -0
  100. package/src/ui-kit.ts +402 -0
  101. package/tsconfig.json +8 -14
  102. package/web/ui/tsconfig.json +2 -1
  103. package/.claude/scheduled_tasks.lock +0 -1
  104. package/.claude/settings.json +0 -5
  105. package/.claude/skills/add-atomic-chat-tool/SKILL.md +0 -243
  106. package/.claude/skills/add-atomic-chat-tool/atomic-chat-mcp-stdio.ts +0 -229
  107. package/.claude/skills/add-codex/SKILL.md +0 -161
  108. package/.claude/skills/add-dashboard/SKILL.md +0 -138
  109. package/.claude/skills/add-dashboard/resources/dashboard-pusher.ts +0 -495
  110. package/.claude/skills/add-emacs/SKILL.md +0 -296
  111. package/.claude/skills/add-gcal-tool/SKILL.md +0 -210
  112. package/.claude/skills/add-gchat/REMOVE.md +0 -6
  113. package/.claude/skills/add-gchat/SKILL.md +0 -92
  114. package/.claude/skills/add-gchat/VERIFY.md +0 -3
  115. package/.claude/skills/add-github/REMOVE.md +0 -6
  116. package/.claude/skills/add-github/SKILL.md +0 -148
  117. package/.claude/skills/add-github/VERIFY.md +0 -3
  118. package/.claude/skills/add-gmail-tool/SKILL.md +0 -229
  119. package/.claude/skills/add-imessage/REMOVE.md +0 -6
  120. package/.claude/skills/add-imessage/SKILL.md +0 -113
  121. package/.claude/skills/add-imessage/VERIFY.md +0 -3
  122. package/.claude/skills/add-karpathy-llm-wiki/SKILL.md +0 -110
  123. package/.claude/skills/add-karpathy-llm-wiki/llm-wiki.md +0 -75
  124. package/.claude/skills/add-linear/REMOVE.md +0 -6
  125. package/.claude/skills/add-linear/SKILL.md +0 -168
  126. package/.claude/skills/add-linear/VERIFY.md +0 -3
  127. package/.claude/skills/add-macos-statusbar/SKILL.md +0 -133
  128. package/.claude/skills/add-macos-statusbar/add/src/statusbar.swift +0 -147
  129. package/.claude/skills/add-matrix/REMOVE.md +0 -6
  130. package/.claude/skills/add-matrix/SKILL.md +0 -148
  131. package/.claude/skills/add-matrix/VERIFY.md +0 -3
  132. package/.claude/skills/add-ollama-provider/SKILL.md +0 -179
  133. package/.claude/skills/add-ollama-tool/SKILL.md +0 -193
  134. package/.claude/skills/add-opencode/SKILL.md +0 -229
  135. package/.claude/skills/add-parallel/SKILL.md +0 -290
  136. package/.claude/skills/add-resend/REMOVE.md +0 -6
  137. package/.claude/skills/add-resend/SKILL.md +0 -93
  138. package/.claude/skills/add-resend/VERIFY.md +0 -3
  139. package/.claude/skills/add-signal/REMOVE.md +0 -13
  140. package/.claude/skills/add-signal/SKILL.md +0 -318
  141. package/.claude/skills/add-signal/VERIFY.md +0 -5
  142. package/.claude/skills/add-slack/REMOVE.md +0 -6
  143. package/.claude/skills/add-slack/SKILL.md +0 -112
  144. package/.claude/skills/add-slack/VERIFY.md +0 -3
  145. package/.claude/skills/add-teams/REMOVE.md +0 -6
  146. package/.claude/skills/add-teams/SKILL.md +0 -207
  147. package/.claude/skills/add-teams/VERIFY.md +0 -3
  148. package/.claude/skills/add-vercel/SKILL.md +0 -147
  149. package/.claude/skills/add-vercel/container-skills/vercel-cli/SKILL.md +0 -103
  150. package/.claude/skills/add-webex/REMOVE.md +0 -6
  151. package/.claude/skills/add-webex/SKILL.md +0 -88
  152. package/.claude/skills/add-webex/VERIFY.md +0 -3
  153. package/.claude/skills/add-wechat/REMOVE.md +0 -49
  154. package/.claude/skills/add-wechat/SKILL.md +0 -170
  155. package/.claude/skills/add-wechat/scripts/wire-dm.ts +0 -172
  156. package/.claude/skills/add-whatsapp/SKILL.md +0 -264
  157. package/.claude/skills/add-whatsapp-cloud/REMOVE.md +0 -6
  158. package/.claude/skills/add-whatsapp-cloud/SKILL.md +0 -95
  159. package/.claude/skills/add-whatsapp-cloud/VERIFY.md +0 -3
  160. package/.claude/skills/claw/SKILL.md +0 -131
  161. package/.claude/skills/claw/scripts/claw +0 -374
  162. package/.claude/skills/convert-to-apple-container/SKILL.md +0 -212
  163. package/.claude/skills/customize/SKILL.md +0 -110
  164. package/.claude/skills/debug/SKILL.md +0 -349
  165. package/.claude/skills/get-qodo-rules/SKILL.md +0 -122
  166. package/.claude/skills/get-qodo-rules/references/output-format.md +0 -41
  167. package/.claude/skills/get-qodo-rules/references/pagination.md +0 -33
  168. package/.claude/skills/get-qodo-rules/references/repository-scope.md +0 -26
  169. package/.claude/skills/init-first-agent/SKILL.md +0 -120
  170. package/.claude/skills/init-onecli/SKILL.md +0 -270
  171. package/.claude/skills/manage-channels/SKILL.md +0 -87
  172. package/.claude/skills/manage-mounts/SKILL.md +0 -47
  173. package/.claude/skills/migrate-from-openclaw/MIGRATE_CRONS.md +0 -100
  174. package/.claude/skills/migrate-from-openclaw/SKILL.md +0 -447
  175. package/.claude/skills/migrate-from-openclaw/scripts/discover-openclaw.ts +0 -734
  176. package/.claude/skills/migrate-from-openclaw/scripts/extract-channel-credentials.ts +0 -476
  177. package/.claude/skills/migrate-nanoclaw/SKILL.md +0 -484
  178. package/.claude/skills/migrate-nanoclaw/diagnostics.md +0 -51
  179. package/.claude/skills/qodo-pr-resolver/SKILL.md +0 -326
  180. package/.claude/skills/qodo-pr-resolver/resources/providers.md +0 -329
  181. package/.claude/skills/update-nanoclaw/SKILL.md +0 -243
  182. package/.claude/skills/update-nanoclaw/diagnostics.md +0 -48
  183. package/.claude/skills/update-skills/SKILL.md +0 -130
  184. package/.claude/skills/use-native-credential-proxy/SKILL.md +0 -167
  185. package/.claude/skills/x-integration/SKILL.md +0 -417
  186. package/.claude/skills/x-integration/agent.ts +0 -243
  187. package/.claude/skills/x-integration/host.ts +0 -155
  188. package/.claude/skills/x-integration/lib/browser.ts +0 -148
  189. package/.claude/skills/x-integration/lib/config.ts +0 -62
  190. package/.claude/skills/x-integration/scripts/like.ts +0 -56
  191. package/.claude/skills/x-integration/scripts/post.ts +0 -66
  192. package/.claude/skills/x-integration/scripts/quote.ts +0 -80
  193. package/.claude/skills/x-integration/scripts/reply.ts +0 -74
  194. package/.claude/skills/x-integration/scripts/retweet.ts +0 -62
  195. package/.claude/skills/x-integration/scripts/setup.ts +0 -87
  196. package/.github/CODEOWNERS +0 -10
  197. package/.github/PULL_REQUEST_TEMPLATE.md +0 -18
  198. package/.github/workflows/bump-version.yml +0 -35
  199. package/.github/workflows/ci.yml +0 -39
  200. package/.github/workflows/label-pr.yml +0 -40
  201. package/.github/workflows/update-tokens.yml +0 -43
  202. package/.husky/pre-commit +0 -1
  203. package/.mcp.json +0 -3
  204. package/.nvmrc +0 -1
  205. package/.prettierrc +0 -4
  206. package/CHANGELOG.md +0 -221
  207. package/CLAUDE.md +0 -307
  208. package/CODE_OF_CONDUCT.md +0 -128
  209. package/CONTRIBUTING.md +0 -159
  210. package/CONTRIBUTORS.md +0 -26
  211. package/LICENSE-NANOCLAW-MIT +0 -21
  212. package/README_ja.md +0 -194
  213. package/README_zh.md +0 -194
  214. package/assets/nanoclaw-favicon.png +0 -0
  215. package/assets/nanoclaw-icon.png +0 -0
  216. package/assets/nanoclaw-logo-dark.png +0 -0
  217. package/assets/nanoclaw-logo.png +0 -0
  218. package/assets/nanoclaw-profile.jpeg +0 -0
  219. package/assets/nanoclaw-sales.png +0 -0
  220. package/assets/social-preview.jpg +0 -0
  221. package/config-examples/mount-allowlist.json +0 -25
  222. package/container/.dockerignore +0 -2
  223. package/container/CLAUDE.md +0 -21
  224. package/container/Dockerfile +0 -121
  225. package/container/agent-runner/bun.lock +0 -243
  226. package/container/agent-runner/package.json +0 -22
  227. package/container/agent-runner/scripts/sdk-signal-probe.ts +0 -169
  228. package/container/agent-runner/src/config.ts +0 -55
  229. package/container/agent-runner/src/db/connection.ts +0 -267
  230. package/container/agent-runner/src/db/index.ts +0 -20
  231. package/container/agent-runner/src/db/messages-in.ts +0 -138
  232. package/container/agent-runner/src/db/messages-out.ts +0 -143
  233. package/container/agent-runner/src/db/session-routing.ts +0 -30
  234. package/container/agent-runner/src/db/session-state.test.ts +0 -100
  235. package/container/agent-runner/src/db/session-state.ts +0 -79
  236. package/container/agent-runner/src/destinations.ts +0 -135
  237. package/container/agent-runner/src/formatter.test.ts +0 -167
  238. package/container/agent-runner/src/formatter.ts +0 -260
  239. package/container/agent-runner/src/index.ts +0 -110
  240. package/container/agent-runner/src/integration.test.ts +0 -121
  241. package/container/agent-runner/src/mcp-tools/agents.instructions.md +0 -26
  242. package/container/agent-runner/src/mcp-tools/agents.ts +0 -66
  243. package/container/agent-runner/src/mcp-tools/core.instructions.md +0 -27
  244. package/container/agent-runner/src/mcp-tools/core.ts +0 -262
  245. package/container/agent-runner/src/mcp-tools/index.ts +0 -22
  246. package/container/agent-runner/src/mcp-tools/interactive.instructions.md +0 -22
  247. package/container/agent-runner/src/mcp-tools/interactive.ts +0 -169
  248. package/container/agent-runner/src/mcp-tools/scheduling.instructions.md +0 -40
  249. package/container/agent-runner/src/mcp-tools/scheduling.ts +0 -299
  250. package/container/agent-runner/src/mcp-tools/self-mod.instructions.md +0 -25
  251. package/container/agent-runner/src/mcp-tools/self-mod.ts +0 -120
  252. package/container/agent-runner/src/mcp-tools/server.ts +0 -54
  253. package/container/agent-runner/src/mcp-tools/types.ts +0 -6
  254. package/container/agent-runner/src/poll-loop.test.ts +0 -248
  255. package/container/agent-runner/src/poll-loop.ts +0 -437
  256. package/container/agent-runner/src/providers/claude.ts +0 -379
  257. package/container/agent-runner/src/providers/factory.test.ts +0 -19
  258. package/container/agent-runner/src/providers/factory.ts +0 -13
  259. package/container/agent-runner/src/providers/index.ts +0 -6
  260. package/container/agent-runner/src/providers/mock.ts +0 -77
  261. package/container/agent-runner/src/providers/provider-registry.ts +0 -33
  262. package/container/agent-runner/src/providers/types.ts +0 -82
  263. package/container/agent-runner/src/scheduling/task-script.ts +0 -121
  264. package/container/agent-runner/src/timezone.test.ts +0 -93
  265. package/container/agent-runner/src/timezone.ts +0 -107
  266. package/container/agent-runner/tsconfig.json +0 -14
  267. package/container/build.sh +0 -48
  268. package/container/entrypoint.sh +0 -16
  269. package/container/skills/agent-browser/SKILL.md +0 -159
  270. package/container/skills/frontend-engineer/SKILL.md +0 -157
  271. package/container/skills/self-customize/SKILL.md +0 -87
  272. package/container/skills/slack-formatting/SKILL.md +0 -94
  273. package/container/skills/vercel-cli/SKILL.md +0 -111
  274. package/container/skills/welcome/SKILL.md +0 -85
  275. package/docs/APPLE-CONTAINER-NETWORKING.md +0 -90
  276. package/docs/BRANCH-FORK-MAINTENANCE.md +0 -81
  277. package/docs/README.md +0 -25
  278. package/docs/SDK_DEEP_DIVE.md +0 -643
  279. package/docs/SECURITY.md +0 -162
  280. package/docs/agent-runner-details.md +0 -749
  281. package/docs/api-details.md +0 -365
  282. package/docs/architecture-diagram.html +0 -422
  283. package/docs/architecture-diagram.md +0 -215
  284. package/docs/architecture.md +0 -751
  285. package/docs/audit/2026-04-30-channel-endpoint-audit.md +0 -36
  286. package/docs/build-and-runtime.md +0 -80
  287. package/docs/cross-mount-stress/README.md +0 -112
  288. package/docs/cross-mount-stress/container-writer-retry.mjs +0 -55
  289. package/docs/cross-mount-stress/container-writer-slow.mjs +0 -42
  290. package/docs/cross-mount-stress/container-writer.mjs +0 -47
  291. package/docs/cross-mount-stress/host-writer-retry.mjs +0 -55
  292. package/docs/cross-mount-stress/host-writer-slow.mjs +0 -43
  293. package/docs/cross-mount-stress/host-writer.mjs +0 -47
  294. package/docs/db-central.md +0 -316
  295. package/docs/db-session.md +0 -183
  296. package/docs/db.md +0 -119
  297. package/docs/design/2026-04-29-vault-management-ui.md +0 -231
  298. package/docs/design/2026-04-30-channel-wiring-rework.md +0 -234
  299. package/docs/design/2026-05-01-channel-wiring-approvals-deep-dive.md +0 -272
  300. package/docs/design/2026-05-02-channel-policy-and-approval-routing.md +0 -250
  301. package/docs/docker-sandboxes.md +0 -359
  302. package/docs/isolation-model.md +0 -88
  303. package/docs/ollama.md +0 -79
  304. package/docs/parachute-integration.md +0 -109
  305. package/docs/post-night-rebirth-reflections.md +0 -151
  306. package/eslint.config.js +0 -32
  307. package/pnpm-workspace.yaml +0 -8
  308. package/repo-tokens/README.md +0 -113
  309. package/repo-tokens/action.yml +0 -186
  310. package/repo-tokens/badge.svg +0 -23
  311. package/repo-tokens/examples/green.svg +0 -14
  312. package/repo-tokens/examples/red.svg +0 -14
  313. package/repo-tokens/examples/yellow-green.svg +0 -14
  314. package/repo-tokens/examples/yellow.svg +0 -14
  315. package/scripts/chat.ts +0 -101
  316. package/scripts/cleanup-sessions.sh +0 -150
  317. package/scripts/init-cli-agent.ts +0 -171
  318. package/scripts/init-first-agent.ts +0 -377
  319. package/scripts/parachute.ts +0 -158
  320. package/scripts/run-migrations.ts +0 -105
  321. package/scripts/sanity-live-poll.ts +0 -95
  322. package/scripts/seed-discord.ts +0 -79
  323. package/scripts/test-v2-agent.ts +0 -106
  324. package/scripts/test-v2-channel-e2e.ts +0 -265
  325. package/scripts/test-v2-host.ts +0 -184
  326. package/src/channels/adapter.ts +0 -214
  327. package/src/channels/ask-question.ts +0 -46
  328. package/src/channels/channel-registry.test.ts +0 -421
  329. package/src/channels/channel-registry.ts +0 -313
  330. package/src/channels/chat-sdk-bridge.test.ts +0 -84
  331. package/src/channels/chat-sdk-bridge.ts +0 -652
  332. package/src/channels/cli.ts +0 -276
  333. package/src/channels/discord.ts +0 -90
  334. package/src/channels/index.ts +0 -17
  335. package/src/channels/telegram-markdown-sanitize.test.ts +0 -78
  336. package/src/channels/telegram-markdown-sanitize.ts +0 -55
  337. package/src/channels/telegram-pairing.test.ts +0 -254
  338. package/src/channels/telegram-pairing.ts +0 -339
  339. package/src/channels/telegram.ts +0 -279
  340. package/src/channels/trust-hint.test.ts +0 -48
  341. package/src/channels/trust-hint.ts +0 -75
  342. package/src/claude-md-compose.migrate.test.ts +0 -64
  343. package/src/claude-md-compose.ts +0 -205
  344. package/src/command-gate.ts +0 -63
  345. package/src/config.test.ts +0 -93
  346. package/src/config.ts +0 -108
  347. package/src/container-config.ts +0 -167
  348. package/src/container-runner.test.ts +0 -32
  349. package/src/container-runner.ts +0 -576
  350. package/src/container-runtime.test.ts +0 -169
  351. package/src/container-runtime.ts +0 -92
  352. package/src/db/_bun-sqlite-shim.ts +0 -88
  353. package/src/db/agent-activity.test.ts +0 -155
  354. package/src/db/agent-activity.ts +0 -121
  355. package/src/db/agent-groups.ts +0 -77
  356. package/src/db/connection.migrate.test.ts +0 -143
  357. package/src/db/connection.ts +0 -224
  358. package/src/db/db-v2.test.ts +0 -440
  359. package/src/db/dropped-messages.ts +0 -44
  360. package/src/db/index.ts +0 -40
  361. package/src/db/messaging-groups.ts +0 -252
  362. package/src/db/migrations/001-initial.ts +0 -112
  363. package/src/db/migrations/002-chat-sdk-state.ts +0 -36
  364. package/src/db/migrations/008-dropped-messages.ts +0 -27
  365. package/src/db/migrations/009-drop-pending-credentials.ts +0 -13
  366. package/src/db/migrations/010-engage-modes.ts +0 -103
  367. package/src/db/migrations/011-pending-sender-approvals.ts +0 -40
  368. package/src/db/migrations/012-channel-registration.ts +0 -48
  369. package/src/db/migrations/013-approval-render-metadata.ts +0 -27
  370. package/src/db/migrations/014-secrets.ts +0 -44
  371. package/src/db/migrations/015-secrets-drop-host-pattern.ts +0 -18
  372. package/src/db/migrations/016-secret-assignments.ts +0 -30
  373. package/src/db/migrations/017-agent-activity.ts +0 -40
  374. package/src/db/migrations/018-oauth-app-configs.ts +0 -34
  375. package/src/db/migrations/019-oauth-app-connections.ts +0 -48
  376. package/src/db/migrations/020-agent-app-connections.ts +0 -28
  377. package/src/db/migrations/021-pending-oauth-states.ts +0 -35
  378. package/src/db/migrations/022-app-connections-provider.ts +0 -25
  379. package/src/db/migrations/023-agent-group-secret-mode.test.ts +0 -124
  380. package/src/db/migrations/023-agent-group-secret-mode.ts +0 -65
  381. package/src/db/migrations/024-collapse-approvals.test.ts +0 -249
  382. package/src/db/migrations/024-collapse-approvals.ts +0 -182
  383. package/src/db/migrations/025-secret-mode-check.test.ts +0 -155
  384. package/src/db/migrations/025-secret-mode-check.ts +0 -49
  385. package/src/db/migrations/026-user-dms-bot-id.test.ts +0 -116
  386. package/src/db/migrations/026-user-dms-bot-id.ts +0 -54
  387. package/src/db/migrations/027-provider-credentials.ts +0 -41
  388. package/src/db/migrations/_test-helpers.ts +0 -41
  389. package/src/db/migrations/index.ts +0 -127
  390. package/src/db/migrations/module-agent-to-agent-destinations.ts +0 -84
  391. package/src/db/migrations/module-approvals-pending-approvals.ts +0 -42
  392. package/src/db/migrations/module-approvals-title-options.ts +0 -40
  393. package/src/db/schema.ts +0 -258
  394. package/src/db/session-db.test.ts +0 -93
  395. package/src/db/session-db.ts +0 -325
  396. package/src/db/sessions.ts +0 -241
  397. package/src/delivery.test.ts +0 -148
  398. package/src/delivery.ts +0 -445
  399. package/src/env.ts +0 -74
  400. package/src/group-folder.test.ts +0 -35
  401. package/src/group-folder.ts +0 -44
  402. package/src/group-init.ts +0 -92
  403. package/src/host-core.test.ts +0 -456
  404. package/src/host-sweep.test.ts +0 -146
  405. package/src/host-sweep.ts +0 -287
  406. package/src/index.ts +0 -227
  407. package/src/install-slug.ts +0 -33
  408. package/src/log.test.ts +0 -81
  409. package/src/log.ts +0 -117
  410. package/src/mcp/http.ts +0 -72
  411. package/src/mcp/server.ts +0 -92
  412. package/src/mcp/stdio.ts +0 -51
  413. package/src/mcp/tools/activity.ts +0 -88
  414. package/src/mcp/tools/agent-groups.ts +0 -183
  415. package/src/mcp/tools/approvals.ts +0 -122
  416. package/src/mcp/tools/channels.ts +0 -199
  417. package/src/mcp/tools/index.ts +0 -27
  418. package/src/mcp/tools/oauth.ts +0 -48
  419. package/src/mcp/tools/secrets.ts +0 -169
  420. package/src/mcp/tools/sessions.ts +0 -135
  421. package/src/mcp/types.ts +0 -51
  422. package/src/modules/agent-to-agent/agent-route.test.ts +0 -46
  423. package/src/modules/agent-to-agent/agent-route.ts +0 -223
  424. package/src/modules/agent-to-agent/create-agent.ts +0 -127
  425. package/src/modules/agent-to-agent/db/agent-destinations.ts +0 -135
  426. package/src/modules/agent-to-agent/index.ts +0 -22
  427. package/src/modules/agent-to-agent/write-destinations.ts +0 -59
  428. package/src/modules/approvals/agent.md +0 -45
  429. package/src/modules/approvals/index.ts +0 -21
  430. package/src/modules/approvals/picks.test.ts +0 -291
  431. package/src/modules/approvals/primitive.ts +0 -279
  432. package/src/modules/approvals/project.md +0 -27
  433. package/src/modules/approvals/response-handler.ts +0 -87
  434. package/src/modules/index.ts +0 -24
  435. package/src/modules/interactive/agent.md +0 -21
  436. package/src/modules/interactive/index.ts +0 -69
  437. package/src/modules/interactive/project.md +0 -12
  438. package/src/modules/mount-security/index.ts +0 -448
  439. package/src/modules/mount-security/migrate.test.ts +0 -91
  440. package/src/modules/permissions/access.ts +0 -28
  441. package/src/modules/permissions/channel-approval.test.ts +0 -389
  442. package/src/modules/permissions/channel-approval.ts +0 -188
  443. package/src/modules/permissions/db/agent-group-members.ts +0 -44
  444. package/src/modules/permissions/db/pending-channel-approvals.test.ts +0 -86
  445. package/src/modules/permissions/db/pending-channel-approvals.ts +0 -66
  446. package/src/modules/permissions/db/pending-sender-approvals.ts +0 -60
  447. package/src/modules/permissions/db/user-dms.ts +0 -58
  448. package/src/modules/permissions/db/user-roles.ts +0 -85
  449. package/src/modules/permissions/db/users.ts +0 -38
  450. package/src/modules/permissions/index.ts +0 -421
  451. package/src/modules/permissions/permissions.test.ts +0 -358
  452. package/src/modules/permissions/sender-approval.test.ts +0 -470
  453. package/src/modules/permissions/sender-approval.ts +0 -165
  454. package/src/modules/permissions/user-dm.ts +0 -200
  455. package/src/modules/provider-credentials/db.ts +0 -121
  456. package/src/modules/provider-credentials/index.ts +0 -12
  457. package/src/modules/provider-credentials/spawn.test.ts +0 -206
  458. package/src/modules/provider-credentials/spawn.ts +0 -114
  459. package/src/modules/scheduling/actions.ts +0 -113
  460. package/src/modules/scheduling/db.test.ts +0 -282
  461. package/src/modules/scheduling/db.ts +0 -148
  462. package/src/modules/scheduling/index.ts +0 -34
  463. package/src/modules/scheduling/recurrence.test.ts +0 -98
  464. package/src/modules/scheduling/recurrence.ts +0 -54
  465. package/src/modules/self-mod/agent.md +0 -30
  466. package/src/modules/self-mod/apply.ts +0 -85
  467. package/src/modules/self-mod/index.ts +0 -30
  468. package/src/modules/self-mod/project.md +0 -39
  469. package/src/modules/self-mod/request.ts +0 -91
  470. package/src/modules/typing/index.ts +0 -165
  471. package/src/oauth/agent-app-connections.ts +0 -103
  472. package/src/oauth/app-configs.test.ts +0 -64
  473. package/src/oauth/app-configs.ts +0 -114
  474. package/src/oauth/app-connections.test.ts +0 -109
  475. package/src/oauth/app-connections.ts +0 -178
  476. package/src/oauth/crypto.ts +0 -56
  477. package/src/oauth/flow.ts +0 -104
  478. package/src/oauth/providers/google.test.ts +0 -38
  479. package/src/oauth/providers/google.ts +0 -46
  480. package/src/oauth/providers/index.ts +0 -48
  481. package/src/oauth/state-store.test.ts +0 -54
  482. package/src/oauth/state-store.ts +0 -93
  483. package/src/parachute/README.md +0 -27
  484. package/src/parachute/create-agent.test.ts +0 -83
  485. package/src/parachute/create-agent.ts +0 -122
  486. package/src/parachute/group-status.test.ts +0 -165
  487. package/src/parachute/group-status.ts +0 -136
  488. package/src/parachute/types.ts +0 -41
  489. package/src/parachute/vault-mcp.test.ts +0 -251
  490. package/src/parachute/vault-mcp.ts +0 -232
  491. package/src/platform-id.test.ts +0 -104
  492. package/src/platform-id.ts +0 -109
  493. package/src/providers/index.ts +0 -6
  494. package/src/providers/provider-container-registry.ts +0 -58
  495. package/src/response-registry.ts +0 -45
  496. package/src/router.ts +0 -530
  497. package/src/secrets/crypto.test.ts +0 -45
  498. package/src/secrets/crypto.ts +0 -55
  499. package/src/secrets/index.ts +0 -355
  500. package/src/secrets/master-key.ts +0 -70
  501. package/src/secrets/secrets.test.ts +0 -354
  502. package/src/session-manager.migrate.test.ts +0 -59
  503. package/src/session-manager.ts +0 -433
  504. package/src/startup-bootstrap.test.ts +0 -226
  505. package/src/startup-bootstrap.ts +0 -207
  506. package/src/state-sqlite.ts +0 -182
  507. package/src/timezone.test.ts +0 -64
  508. package/src/timezone.ts +0 -37
  509. package/src/types.ts +0 -230
  510. package/src/web/auth.test.ts +0 -335
  511. package/src/web/auth.ts +0 -214
  512. package/src/web/discord-validate.test.ts +0 -77
  513. package/src/web/discord-validate.ts +0 -88
  514. package/src/web/hub-discovery.test.ts +0 -98
  515. package/src/web/hub-discovery.ts +0 -69
  516. package/src/web/routes/activity.ts +0 -106
  517. package/src/web/routes/agent-provider.test.ts +0 -282
  518. package/src/web/routes/agent-provider.ts +0 -309
  519. package/src/web/routes/approvals.ts +0 -185
  520. package/src/web/routes/apps.ts +0 -434
  521. package/src/web/routes/channels-mg-detail.test.ts +0 -324
  522. package/src/web/routes/channels-mga-detail.test.ts +0 -425
  523. package/src/web/routes/channels.ts +0 -489
  524. package/src/web/routes/oauth-providers.ts +0 -42
  525. package/src/web/routes/secrets.test.ts +0 -175
  526. package/src/web/routes/secrets.ts +0 -282
  527. package/src/web/routes/sessions.ts +0 -123
  528. package/src/web/routes/settings.test.ts +0 -106
  529. package/src/web/routes/settings.ts +0 -247
  530. package/src/web/routes/setup-status.ts +0 -205
  531. package/src/web/routes/vaults.test.ts +0 -389
  532. package/src/web/routes/vaults.ts +0 -225
  533. package/src/web/server-version.test.ts +0 -16
  534. package/src/web/server.ts +0 -1003
  535. package/src/web/services-manifest.test.ts +0 -120
  536. package/src/web/services-manifest.ts +0 -61
  537. package/src/web/static-serve.test.ts +0 -255
  538. package/src/web/static-serve.ts +0 -104
  539. package/src/web/telegram-validate.test.ts +0 -116
  540. package/src/web/telegram-validate.ts +0 -107
  541. package/src/web/vault-proxy.test.ts +0 -214
  542. package/src/web/vault-proxy.ts +0 -120
  543. package/src/web/wire-channel.ts +0 -181
  544. package/src/webhook-server.ts +0 -134
  545. package/vitest.config.ts +0 -18
  546. package/web/README.md +0 -63
  547. package/web/ui/index.html +0 -13
  548. package/web/ui/package.json +0 -35
  549. package/web/ui/pnpm-lock.yaml +0 -2164
  550. package/web/ui/scripts/verify-base.mjs +0 -31
  551. package/web/ui/src/App.tsx +0 -88
  552. package/web/ui/src/components/ActivityFeed.tsx +0 -444
  553. package/web/ui/src/components/AgentGroupPicker.tsx +0 -263
  554. package/web/ui/src/components/AgentProviderCards.tsx +0 -220
  555. package/web/ui/src/components/CredentialForm.tsx +0 -214
  556. package/web/ui/src/components/ScopeGrants.tsx +0 -74
  557. package/web/ui/src/components/StatusDot.tsx +0 -43
  558. package/web/ui/src/components/VaultPicker.tsx +0 -127
  559. package/web/ui/src/components/setup/AdapterInstallStep.tsx +0 -178
  560. package/web/ui/src/components/setup/AgentGroupStep.tsx +0 -43
  561. package/web/ui/src/components/setup/ChannelPickStep.tsx +0 -74
  562. package/web/ui/src/components/setup/DoneStep.tsx +0 -49
  563. package/web/ui/src/components/setup/PrereqStep.tsx +0 -129
  564. package/web/ui/src/components/setup/TestConnectionStep.tsx +0 -108
  565. package/web/ui/src/components/setup/TestMessageStep.tsx +0 -104
  566. package/web/ui/src/components/setup/WireChannelStep.tsx +0 -166
  567. package/web/ui/src/components/setup/types.ts +0 -105
  568. package/web/ui/src/lib/api.test.ts +0 -410
  569. package/web/ui/src/lib/api.ts +0 -1210
  570. package/web/ui/src/lib/auth.test.ts +0 -139
  571. package/web/ui/src/lib/auth.ts +0 -348
  572. package/web/ui/src/lib/channel-adapters.ts +0 -136
  573. package/web/ui/src/main.tsx +0 -19
  574. package/web/ui/src/routes/ApprovalsList.tsx +0 -294
  575. package/web/ui/src/routes/Apps.tsx +0 -613
  576. package/web/ui/src/routes/ChannelWireDetail.test.tsx +0 -233
  577. package/web/ui/src/routes/ChannelWireDetail.tsx +0 -403
  578. package/web/ui/src/routes/ChannelsList.tsx +0 -158
  579. package/web/ui/src/routes/GroupDetail.tsx +0 -755
  580. package/web/ui/src/routes/GroupList.tsx +0 -187
  581. package/web/ui/src/routes/MessagingGroupDetail.test.tsx +0 -233
  582. package/web/ui/src/routes/MessagingGroupDetail.tsx +0 -306
  583. package/web/ui/src/routes/NewGroupWizard.tsx +0 -390
  584. package/web/ui/src/routes/OAuthCallback.tsx +0 -56
  585. package/web/ui/src/routes/SecretsList.tsx +0 -921
  586. package/web/ui/src/routes/SessionsList.tsx +0 -220
  587. package/web/ui/src/routes/SettingsAgentProvider.tsx +0 -109
  588. package/web/ui/src/routes/SettingsApprovals.tsx +0 -234
  589. package/web/ui/src/routes/SetupWizard.tsx +0 -219
  590. package/web/ui/src/routes/VaultDetail.test.tsx +0 -361
  591. package/web/ui/src/routes/VaultDetail.tsx +0 -960
  592. package/web/ui/src/routes/VaultsList.tsx +0 -295
  593. package/web/ui/src/routes/WireChannelPage.tsx +0 -413
  594. package/web/ui/src/styles.css +0 -608
  595. package/web/ui/src/test/setup.ts +0 -23
  596. package/web/ui/src/vite-env.d.ts +0 -10
  597. package/web/ui/vite.config.ts +0 -34
  598. package/web/ui/vitest.config.ts +0 -25
@@ -1,229 +0,0 @@
1
- ---
2
- name: add-opencode
3
- description: Use OpenCode as an agent provider (AGENT_PROVIDER=opencode). OpenRouter, OpenAI, Google, DeepSeek, etc. via OpenCode config — not the Anthropic Agent SDK. Per-session and per-group via agent_provider; host passes OPENCODE_* and XDG mount when spawning containers.
4
- ---
5
-
6
- # OpenCode agent provider
7
-
8
- NanoClaw runs agents in a long-lived **poll loop** inside the container. The backend is selected with **`AGENT_PROVIDER`** (`claude` | `opencode` | `mock`).
9
-
10
- Trunk ships with only the `claude` provider baked in. This skill copies the OpenCode provider files in from the `providers` branch, wires them into the host and container barrels, installs dependencies, and rebuilds the image.
11
-
12
- ## Install
13
-
14
- ### Pre-flight
15
-
16
- If all of the following are already present, skip to **Configuration**:
17
-
18
- - `src/providers/opencode.ts`
19
- - `container/agent-runner/src/providers/opencode.ts`
20
- - `import './opencode.js';` line in `src/providers/index.ts`
21
- - `import './opencode.js';` line in `container/agent-runner/src/providers/index.ts`
22
- - `@opencode-ai/sdk` in `container/agent-runner/package.json`
23
- - `opencode-ai@${OPENCODE_VERSION}` in the pnpm global-install block in `container/Dockerfile`
24
-
25
- Missing pieces — continue below. All steps are idempotent; re-running is safe.
26
-
27
- ### 1. Fetch the providers branch
28
-
29
- ```bash
30
- git fetch origin providers
31
- ```
32
-
33
- ### 2. Copy the OpenCode source files
34
-
35
- Wholesale copies (owned entirely by this skill — user edits to these files won't survive a re-run, as designed):
36
-
37
- ```bash
38
- git show origin/providers:src/providers/opencode.ts > src/providers/opencode.ts
39
- git show origin/providers:container/agent-runner/src/providers/opencode.ts > container/agent-runner/src/providers/opencode.ts
40
- git show origin/providers:container/agent-runner/src/providers/mcp-to-opencode.ts > container/agent-runner/src/providers/mcp-to-opencode.ts
41
- git show origin/providers:container/agent-runner/src/providers/mcp-to-opencode.test.ts > container/agent-runner/src/providers/mcp-to-opencode.test.ts
42
- git show origin/providers:container/agent-runner/src/providers/opencode.factory.test.ts > container/agent-runner/src/providers/opencode.factory.test.ts
43
- ```
44
-
45
- ### 3. Append the self-registration imports
46
-
47
- Each barrel gets one line appended at the end — skip if the line is already present.
48
-
49
- `src/providers/index.ts`:
50
-
51
- ```typescript
52
- import './opencode.js';
53
- ```
54
-
55
- `container/agent-runner/src/providers/index.ts`:
56
-
57
- ```typescript
58
- import './opencode.js';
59
- ```
60
-
61
- ### 4. Add the agent-runner dependency
62
-
63
- Pinned. Bump deliberately, not with `bun update`. Use `1.4.17` — must match the `opencode-ai` CLI version pinned in step 5. The 1.14.x SDK has a completely different API and is **incompatible** with the current provider code.
64
-
65
- ```bash
66
- cd container/agent-runner && bun add @opencode-ai/sdk@1.4.17 && cd -
67
- ```
68
-
69
- ### 5. Add `opencode-ai` to the container Dockerfile
70
-
71
- Two edits to `container/Dockerfile`, both idempotent (skip if already present):
72
-
73
- **(a)** In the "Pin CLI versions" ARG block (around line 18), add after `ARG VERCEL_VERSION=latest`:
74
-
75
- ```dockerfile
76
- ARG OPENCODE_VERSION=1.4.17
77
- ```
78
-
79
- > **Do not use `latest`** — the CLI and SDK must be the same version. `latest` silently upgrades the CLI to 1.14.x which has a breaking session API change (UUID session IDs → `ses_` prefix) incompatible with SDK 1.4.x.
80
-
81
- **(b)** In the `pnpm install -g` block (around line 80), append `"opencode-ai@${OPENCODE_VERSION}"` to the list:
82
-
83
- ```dockerfile
84
- pnpm install -g \
85
- "@anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}" \
86
- "agent-browser@${AGENT_BROWSER_VERSION}" \
87
- "vercel@${VERCEL_VERSION}" \
88
- "opencode-ai@${OPENCODE_VERSION}"
89
- ```
90
-
91
- ### 6. Build
92
-
93
- ```bash
94
- pnpm run build # host
95
- pnpm exec tsc -p container/agent-runner/tsconfig.json --noEmit # container typecheck
96
- ./container/build.sh # agent image
97
- ```
98
-
99
- > **Build cache gotcha:** The container buildkit caches COPY steps aggressively. If provider files were already present in the build context before, the new files may not be picked up. If you see "Unknown provider: opencode" after the build, prune the builder and rebuild:
100
- > ```bash
101
- > docker builder prune -f && ./container/build.sh
102
- > ```
103
-
104
- ### 7. Propagate to existing per-group overlays
105
-
106
- Each agent group has a live source overlay at `data/v2-sessions/<group-id>/agent-runner-src/providers/` that **overrides the image at runtime**. This overlay is created when the group is first wired and never auto-updated by image rebuilds. Any group that already existed before this skill ran needs the new files copied in manually.
107
-
108
- ```bash
109
- for overlay in data/v2-sessions/*/agent-runner-src/providers/; do
110
- [ -d "$overlay" ] || continue
111
- cp container/agent-runner/src/providers/opencode.ts "$overlay"
112
- cp container/agent-runner/src/providers/mcp-to-opencode.ts "$overlay"
113
- cp container/agent-runner/src/providers/index.ts "$overlay"
114
- echo "Updated: $overlay"
115
- done
116
- ```
117
-
118
- ## Configuration
119
-
120
- ### Host `.env` (typical)
121
-
122
- Set model/provider strings in the form OpenCode expects (often `provider/model-id`). **Put comments on their own lines** — a `#` inside a value is kept verbatim and breaks model IDs.
123
-
124
- These variables are read **on the host** and passed into the container only when the effective provider is `opencode`. They do not switch the provider by themselves; the DB still needs `agent_provider` set (below).
125
-
126
- - `OPENCODE_PROVIDER` — OpenCode provider id, e.g. `openrouter`, `anthropic`, `deepseek`.
127
- - `OPENCODE_MODEL` — full model id in `provider/model` form, e.g. `deepseek/deepseek-chat`.
128
- - `OPENCODE_SMALL_MODEL` — optional second model for lighter tasks; defaults to `OPENCODE_MODEL` if unset.
129
- - `ANTHROPIC_BASE_URL` — **required for non-`anthropic` providers.** The opencode container provider passes this as the `baseURL` for the upstream provider config so requests route through OneCLI's credential proxy or directly to the provider's API. Set it to the provider's API base URL (e.g. `https://api.deepseek.com/v1`, `https://openrouter.ai/api/v1`).
130
-
131
- Credentials: register provider API keys in OneCLI with the matching `--host-pattern` (e.g. `api.deepseek.com`, `openrouter.ai`). OneCLI injects them via `HTTPS_PROXY` in the container — the key never lives in `.env` or the container environment.
132
-
133
- After adding a secret, **grant the agent access** — agents in `selective` mode only receive secrets they've been explicitly assigned:
134
-
135
- ```bash
136
- # Find the agent id and secret id, then:
137
- onecli agents set-secrets --id <agent-id> --secret-ids <existing-ids>,<new-secret-id>
138
- ```
139
-
140
- Always include existing secret IDs in the list — `set-secrets` replaces, not appends.
141
-
142
- #### Example: DeepSeek
143
-
144
- ```env
145
- OPENCODE_PROVIDER=deepseek
146
- OPENCODE_MODEL=deepseek/deepseek-chat
147
- OPENCODE_SMALL_MODEL=deepseek/deepseek-chat
148
- ANTHROPIC_BASE_URL=https://api.deepseek.com/v1
149
- ```
150
-
151
- Register the key:
152
- ```bash
153
- onecli secrets create --name "DeepSeek" --type generic \
154
- --value YOUR_KEY --host-pattern "api.deepseek.com" \
155
- --header-name "Authorization" --value-format "Bearer {value}"
156
- ```
157
-
158
- #### Example: OpenRouter
159
-
160
- ```env
161
- OPENCODE_PROVIDER=openrouter
162
- OPENCODE_MODEL=openrouter/anthropic/claude-sonnet-4
163
- OPENCODE_SMALL_MODEL=openrouter/anthropic/claude-haiku-4.5
164
- ANTHROPIC_BASE_URL=https://openrouter.ai/api/v1
165
- ```
166
-
167
- Register the key:
168
- ```bash
169
- onecli secrets create --name "OpenRouter" --type generic \
170
- --value YOUR_KEY --host-pattern "openrouter.ai" \
171
- --header-name "Authorization" --value-format "Bearer {value}"
172
- ```
173
-
174
- #### Example: Anthropic (no ANTHROPIC_BASE_URL needed)
175
-
176
- When `OPENCODE_PROVIDER` is `anthropic`, OpenCode uses normal Anthropic env inside the container — the proxy + placeholder key pattern is unchanged and `ANTHROPIC_BASE_URL` is not required.
177
-
178
- ```env
179
- OPENCODE_PROVIDER=anthropic
180
- OPENCODE_MODEL=anthropic/claude-sonnet-4-20250514
181
- OPENCODE_SMALL_MODEL=anthropic/claude-haiku-4-5-20251001
182
- ```
183
-
184
- #### OpenCode Zen (`x-api-key`, not Bearer)
185
-
186
- Zen's HTTP API (e.g. `POST …/zen/v1/messages`) expects the key in the **`x-api-key`** header. If OneCLI injects **`Authorization: Bearer …`** only, Zen often returns **401 / "Missing API key"** even though the gateway is working.
187
-
188
- **Naming:** NanoClaw **`AGENT_PROVIDER=opencode`** (DB `agent_provider`) means "run the **OpenCode agent provider**." Separately, **`OPENCODE_PROVIDER=opencode`** in `.env` is OpenCode's **Zen provider id** inside the OpenCode config (see [Zen docs](https://opencode.ai/docs/zen/)).
189
-
190
- **Host `.env` (typical Zen shape):**
191
-
192
- ```env
193
- OPENCODE_PROVIDER=opencode
194
- OPENCODE_MODEL=opencode/big-pickle
195
- OPENCODE_SMALL_MODEL=opencode/big-pickle
196
- ANTHROPIC_BASE_URL=https://opencode.ai/zen/v1
197
- ```
198
-
199
- Use a real Zen model id from the docs; `big-pickle` is one example.
200
-
201
- **OneCLI:** register the Zen key with **`x-api-key`**, not Bearer:
202
-
203
- ```bash
204
- onecli secrets create --name "OpenCode Zen" --type generic \
205
- --value YOUR_ZEN_KEY --host-pattern opencode.ai \
206
- --header-name "x-api-key" --value-format "{value}"
207
- ```
208
-
209
- ### Per group / per session
210
-
211
- Set `"provider": "opencode"` in the group's **`container.json`** (`groups/<folder>/container.json`) — the in-container runner reads `provider` from there, not from the DB. The DB columns **`agent_groups.agent_provider`** and **`sessions.agent_provider`** (session overrides group) only drive host-side provider contribution — per-session XDG mount, `OPENCODE_*` env passthrough — and do not propagate into `container.json` at spawn time. Set both, or just edit `container.json`; if they disagree, the runner uses `container.json` and the host-side resolver falls back through session → group → `container.json` → `'claude'`.
212
-
213
- Extra MCP servers still come from **`NANOCLAW_MCP_SERVERS`** / `container_config.mcpServers` on the host; the runner merges them into the same `mcpServers` object passed to **both** Claude and OpenCode providers.
214
-
215
- ## Operational notes
216
-
217
- - OpenCode keeps a local **`opencode serve`** process and SSE subscription; the provider tears down with **`stream.return`** and **SIGKILL** on the server process on **`abort()`** / shared runtime reset to avoid MCP/zombie hangs.
218
- - Session continuation uses UUID format (SDK 1.4.x / CLI 1.4.x). Stale sessions are cleared by `isSessionInvalid` on OpenCode-specific error patterns. If you see UUID-related errors after an accidental CLI upgrade, clear `session_state` in `outbound.db` and wipe the `opencode-xdg` directory under the session folder.
219
- - **`NO_PROXY`** for localhost matters when the OpenCode client talks to `127.0.0.1` inside the container while HTTP(S)_PROXY is set (e.g. OneCLI).
220
-
221
- ## Verify
222
-
223
- ```bash
224
- grep -q "./opencode.js" container/agent-runner/src/providers/index.ts && echo "container barrel: OK"
225
- grep -q "./opencode.js" src/providers/index.ts && echo "host barrel: OK"
226
- grep -q "@opencode-ai/sdk" container/agent-runner/package.json && echo "agent-runner dep: OK"
227
- grep -q "opencode-ai@" container/Dockerfile && echo "Dockerfile install: OK"
228
- cd container/agent-runner && bun test src/providers/ && cd -
229
- ```
@@ -1,290 +0,0 @@
1
- # Add Parallel AI Integration
2
-
3
- Adds Parallel AI MCP integration to NanoClaw for advanced web research capabilities.
4
-
5
- ## What This Adds
6
-
7
- - **Quick Search** - Fast web lookups using Parallel Search API (free to use)
8
- - **Deep Research** - Comprehensive analysis using Parallel Task API (asks permission)
9
- - **Non-blocking Design** - Uses NanoClaw scheduler for result polling (no container blocking)
10
-
11
- ## Prerequisites
12
-
13
- User must have:
14
- 1. Parallel AI API key from https://platform.parallel.ai
15
- 2. NanoClaw already set up and running
16
- 3. Docker installed and running
17
-
18
- ## Implementation Steps
19
-
20
- Run all steps automatically. Only pause for user input when explicitly needed.
21
-
22
- ### 1. Get Parallel AI API Key
23
-
24
- Use `AskUserQuestion: Do you have a Parallel AI API key, or should I help you get one?`
25
-
26
- **If they have one:**
27
- Collect it now.
28
-
29
- **If they need one:**
30
- Tell them:
31
- > 1. Go to https://platform.parallel.ai
32
- > 2. Sign up or log in
33
- > 3. Navigate to API Keys section
34
- > 4. Create a new API key
35
- > 5. Copy the key and paste it here
36
-
37
- Wait for the API key.
38
-
39
- ### 2. Add API Key to Environment
40
-
41
- Add `PARALLEL_API_KEY` to `.env`:
42
-
43
- ```bash
44
- # Check if .env exists, create if not
45
- if [ ! -f .env ]; then
46
- touch .env
47
- fi
48
-
49
- # Add PARALLEL_API_KEY if not already present
50
- if ! grep -q "PARALLEL_API_KEY=" .env; then
51
- echo "PARALLEL_API_KEY=${API_KEY_FROM_USER}" >> .env
52
- echo "✓ Added PARALLEL_API_KEY to .env"
53
- else
54
- # Update existing key
55
- sed -i.bak "s/^PARALLEL_API_KEY=.*/PARALLEL_API_KEY=${API_KEY_FROM_USER}/" .env
56
- echo "✓ Updated PARALLEL_API_KEY in .env"
57
- fi
58
- ```
59
-
60
- Verify:
61
- ```bash
62
- grep "PARALLEL_API_KEY" .env | head -c 50
63
- ```
64
-
65
- ### 3. Update Container Runner
66
-
67
- Add `PARALLEL_API_KEY` to allowed environment variables in `src/container-runner.ts`:
68
-
69
- Find the line:
70
- ```typescript
71
- const allowedVars = ['CLAUDE_CODE_OAUTH_TOKEN', 'ANTHROPIC_API_KEY'];
72
- ```
73
-
74
- Replace with:
75
- ```typescript
76
- const allowedVars = ['CLAUDE_CODE_OAUTH_TOKEN', 'ANTHROPIC_API_KEY', 'PARALLEL_API_KEY'];
77
- ```
78
-
79
- ### 4. Configure MCP Servers in Agent Runner
80
-
81
- Update `container/agent-runner/src/index.ts`:
82
-
83
- Find the section where `mcpServers` is configured (around line 237-252):
84
- ```typescript
85
- const mcpServers: Record<string, any> = {
86
- nanoclaw: ipcMcp
87
- };
88
- ```
89
-
90
- Add Parallel AI MCP servers after the nanoclaw server:
91
- ```typescript
92
- const mcpServers: Record<string, any> = {
93
- nanoclaw: ipcMcp
94
- };
95
-
96
- // Add Parallel AI MCP servers if API key is available
97
- const parallelApiKey = process.env.PARALLEL_API_KEY;
98
- if (parallelApiKey) {
99
- mcpServers['parallel-search'] = {
100
- type: 'http', // REQUIRED: Must specify type for HTTP MCP servers
101
- url: 'https://search-mcp.parallel.ai/mcp',
102
- headers: {
103
- 'Authorization': `Bearer ${parallelApiKey}`
104
- }
105
- };
106
- mcpServers['parallel-task'] = {
107
- type: 'http', // REQUIRED: Must specify type for HTTP MCP servers
108
- url: 'https://task-mcp.parallel.ai/mcp',
109
- headers: {
110
- 'Authorization': `Bearer ${parallelApiKey}`
111
- }
112
- };
113
- log('Parallel AI MCP servers configured');
114
- } else {
115
- log('PARALLEL_API_KEY not set, skipping Parallel AI integration');
116
- }
117
- ```
118
-
119
- Also update the `allowedTools` array to include Parallel MCP tools (around line 242-248):
120
- ```typescript
121
- allowedTools: [
122
- 'Bash',
123
- 'Read', 'Write', 'Edit', 'Glob', 'Grep',
124
- 'WebSearch', 'WebFetch',
125
- 'mcp__nanoclaw__*',
126
- 'mcp__parallel-search__*',
127
- 'mcp__parallel-task__*'
128
- ],
129
- ```
130
-
131
- ### 5. Add Usage Instructions to CLAUDE.md
132
-
133
- Add Parallel AI usage instructions to `groups/main/CLAUDE.md`:
134
-
135
- Find the "## What You Can Do" section and add after the existing bullet points:
136
- ```markdown
137
- - Use Parallel AI for web research and deep learning tasks
138
- ```
139
-
140
- Then add a new section after "## What You Can Do":
141
- ```markdown
142
- ## Web Research Tools
143
-
144
- You have access to two Parallel AI research tools:
145
-
146
- ### Quick Web Search (`mcp__parallel-search__search`)
147
- **When to use:** Freely use for factual lookups, current events, definitions, recent information, or verifying facts.
148
-
149
- **Examples:**
150
- - "Who invented the transistor?"
151
- - "What's the latest news about quantum computing?"
152
- - "When was the UN founded?"
153
- - "What are the top programming languages in 2026?"
154
-
155
- **Speed:** Fast (2-5 seconds)
156
- **Cost:** Low
157
- **Permission:** Not needed - use whenever it helps answer the question
158
-
159
- ### Deep Research (`mcp__parallel-task__create_task_run`)
160
- **When to use:** Comprehensive analysis, learning about complex topics, comparing concepts, historical overviews, or structured research.
161
-
162
- **Examples:**
163
- - "Explain the development of quantum mechanics from 1900-1930"
164
- - "Compare the literary styles of Hemingway and Faulkner"
165
- - "Research the evolution of jazz from bebop to fusion"
166
- - "Analyze the causes of the French Revolution"
167
-
168
- **Speed:** Slower (1-20 minutes depending on depth)
169
- **Cost:** Higher (varies by processor tier)
170
- **Permission:** ALWAYS use `AskUserQuestion` before using this tool
171
-
172
- **How to ask permission:**
173
- ```
174
- AskUserQuestion: I can do deep research on [topic] using Parallel's Task API. This will take 2-5 minutes and provide comprehensive analysis with citations. Should I proceed?
175
- ```
176
-
177
- **After permission - DO NOT BLOCK! Use scheduler instead:**
178
-
179
- 1. Create the task using `mcp__parallel-task__create_task_run`
180
- 2. Get the `run_id` from the response
181
- 3. Create a polling scheduled task using `mcp__nanoclaw__schedule_task`:
182
- ```
183
- Prompt: "Check Parallel AI task run [run_id] and send results when ready.
184
-
185
- 1. Use the Parallel Task MCP to check the task status
186
- 2. If status is 'completed', extract the results
187
- 3. Send results to user with mcp__nanoclaw__send_message
188
- 4. Use mcp__nanoclaw__complete_scheduled_task to mark this task as done
189
-
190
- If status is still 'running' or 'pending', do nothing (task will run again in 30s).
191
- If status is 'failed', send error message and complete the task."
192
-
193
- Schedule: interval every 30 seconds
194
- Context mode: isolated
195
- ```
196
- 4. Send acknowledgment with tracking link
197
- 5. Exit immediately - scheduler handles the rest
198
-
199
- ### Choosing Between Them
200
-
201
- **Use Search when:**
202
- - Question needs a quick fact or recent information
203
- - Simple definition or clarification
204
- - Verifying specific details
205
- - Current events or news
206
-
207
- **Use Deep Research (with permission) when:**
208
- - User wants to learn about a complex topic
209
- - Question requires analysis or comparison
210
- - Historical context or evolution of concepts
211
- - Structured, comprehensive understanding needed
212
- - User explicitly asks to "research" or "explain in depth"
213
-
214
- **Default behavior:** Prefer search for most questions. Only suggest deep research when the topic genuinely requires comprehensive analysis.
215
- ```
216
-
217
- ### 6. Rebuild Container
218
-
219
- Build the container with updated agent runner:
220
-
221
- ```bash
222
- ./container/build.sh
223
- ```
224
-
225
- Verify the build:
226
- ```bash
227
- echo '{}' | docker run -i --entrypoint /bin/echo nanoclaw-agent:latest "Container OK"
228
- ```
229
-
230
- ### 7. Restart Service
231
-
232
- Rebuild the main app and restart:
233
-
234
- ```bash
235
- pnpm run build
236
- launchctl kickstart -k gui/$(id -u)/com.nanoclaw # macOS
237
- # Linux: systemctl --user restart nanoclaw
238
- ```
239
-
240
- Wait 3 seconds for service to start, then verify:
241
- ```bash
242
- sleep 3
243
- launchctl list | grep nanoclaw # macOS
244
- # Linux: systemctl --user status nanoclaw
245
- ```
246
-
247
- ### 8. Test Integration
248
-
249
- Tell the user to test:
250
- > Send a message to your assistant: `@[YourAssistantName] what's the latest news about AI?`
251
- >
252
- > The assistant should use Parallel Search API to find current information.
253
- >
254
- > Then try: `@[YourAssistantName] can you research the history of artificial intelligence?`
255
- >
256
- > The assistant should ask for permission before using the Task API.
257
-
258
- Check logs to verify MCP servers loaded:
259
- ```bash
260
- tail -20 logs/nanoclaw.log
261
- ```
262
-
263
- Look for: `Parallel AI MCP servers configured`
264
-
265
- ## Troubleshooting
266
-
267
- **Container hangs or times out:**
268
- - Check that `type: 'http'` is specified in MCP server config
269
- - Verify API key is correct in .env
270
- - Check container logs: `cat groups/main/logs/container-*.log | tail -50`
271
-
272
- **MCP servers not loading:**
273
- - Ensure PARALLEL_API_KEY is in .env
274
- - Verify container-runner.ts includes PARALLEL_API_KEY in allowedVars
275
- - Check agent-runner logs for "Parallel AI MCP servers configured" message
276
-
277
- **Task polling not working:**
278
- - Verify scheduled task was created: `sqlite3 store/messages.db "SELECT * FROM scheduled_tasks"`
279
- - Check task runs: `tail -f logs/nanoclaw.log | grep "scheduled task"`
280
- - Ensure task prompt includes proper Parallel MCP tool names
281
-
282
- ## Uninstalling
283
-
284
- To remove Parallel AI integration:
285
-
286
- 1. Remove from .env: `sed -i.bak '/PARALLEL_API_KEY/d' .env`
287
- 2. Revert changes to container-runner.ts and agent-runner/src/index.ts
288
- 3. Remove Web Research Tools section from groups/main/CLAUDE.md
289
- 4. Rebuild: `./container/build.sh && pnpm run build`
290
- 5. Restart: `launchctl kickstart -k gui/$(id -u)/com.nanoclaw` (macOS) or `systemctl --user restart nanoclaw` (Linux)
@@ -1,6 +0,0 @@
1
- # Remove Resend Email Channel
2
-
3
- 1. Comment out `import './resend.js'` in `src/channels/index.ts`
4
- 2. Remove `RESEND_API_KEY`, `RESEND_FROM_ADDRESS`, `RESEND_FROM_NAME`, `RESEND_WEBHOOK_SECRET` from `.env`
5
- 3. `pnpm uninstall @resend/chat-sdk-adapter`
6
- 4. Rebuild and restart
@@ -1,93 +0,0 @@
1
- ---
2
- name: add-resend
3
- description: Add Resend (email) channel integration via Chat SDK.
4
- ---
5
-
6
- # Add Resend Email Channel
7
-
8
- Connect NanoClaw to email via Resend for async email conversations.
9
-
10
- ## Install
11
-
12
- NanoClaw doesn't ship channels in trunk. This skill copies the Resend adapter in from the `channels` branch.
13
-
14
- ### Pre-flight (idempotent)
15
-
16
- Skip to **Credentials** if all of these are already in place:
17
-
18
- - `src/channels/resend.ts` exists
19
- - `src/channels/index.ts` contains `import './resend.js';`
20
- - `@resend/chat-sdk-adapter` is listed in `package.json` dependencies
21
-
22
- Otherwise continue. Every step below is safe to re-run.
23
-
24
- ### 1. Fetch the channels branch
25
-
26
- ```bash
27
- git fetch origin channels
28
- ```
29
-
30
- ### 2. Copy the adapter
31
-
32
- ```bash
33
- git show origin/channels:src/channels/resend.ts > src/channels/resend.ts
34
- ```
35
-
36
- ### 3. Append the self-registration import
37
-
38
- Append to `src/channels/index.ts` (skip if the line is already present):
39
-
40
- ```typescript
41
- import './resend.js';
42
- ```
43
-
44
- ### 4. Install the adapter package (pinned)
45
-
46
- ```bash
47
- pnpm install @resend/chat-sdk-adapter@0.1.1
48
- ```
49
-
50
- ### 5. Build
51
-
52
- ```bash
53
- pnpm run build
54
- ```
55
-
56
- ## Credentials
57
-
58
- 1. Go to [resend.com](https://resend.com) and create an account.
59
- 2. Add and verify your sending domain.
60
- 3. Go to **API Keys** and create a new key.
61
- 4. Set up a webhook:
62
- - Go to **Webhooks** > **Add webhook**.
63
- - URL: `https://your-domain/webhook/resend`.
64
- - Events: select **email.received**.
65
- - Copy the signing secret.
66
-
67
- ### Configure environment
68
-
69
- Add to `.env`:
70
-
71
- ```bash
72
- RESEND_API_KEY=re_...
73
- RESEND_FROM_ADDRESS=bot@yourdomain.com
74
- RESEND_FROM_NAME=NanoClaw
75
- RESEND_WEBHOOK_SECRET=your-webhook-secret
76
- ```
77
-
78
- Sync to container: `mkdir -p data/env && cp .env data/env/env`
79
-
80
- ## Next Steps
81
-
82
- If you're in the middle of `/setup`, return to the setup flow now.
83
-
84
- Otherwise, run `/manage-channels` to wire this channel to an agent group.
85
-
86
- ## Channel Info
87
-
88
- - **type**: `resend`
89
- - **terminology**: Resend handles email. Each email thread (identified by subject/In-Reply-To headers) is a separate conversation. The "from address" is the bot's identity.
90
- - **how-to-find-id**: The platform ID is the from email address (e.g. `bot@yourdomain.com`). Each sender's email thread becomes its own conversation.
91
- - **supports-threads**: yes (via email threading headers -- replies to the same thread stay together)
92
- - **typical-use**: Async communication -- email conversations with longer response expectations
93
- - **default-isolation**: Same agent group if you want your agent to handle email alongside other channels. Separate agent group if email contains sensitive correspondence that shouldn't be accessible from other channels.
@@ -1,3 +0,0 @@
1
- # Verify Resend Email Channel
2
-
3
- Send an email to the configured from address. The bot should respond via email within a few seconds.
@@ -1,13 +0,0 @@
1
- # Remove Signal
2
-
3
- 1. Comment out `import './signal.js'` in `src/channels/index.ts`
4
- 2. Remove `SIGNAL_ACCOUNT` (and any other `SIGNAL_*` vars) from `.env`
5
- 3. Rebuild and restart
6
-
7
- If you also want to unlink the Signal account from `signal-cli`:
8
-
9
- ```bash
10
- signal-cli -a +1YOURNUMBER removeDevice --deviceId <id>
11
- ```
12
-
13
- (Find the device id with `signal-cli -a +1YOURNUMBER listDevices`.)