@openparachute/agent 0.1.2 → 0.2.0

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