@openparachute/agent 0.1.2 → 0.2.2

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