@openparachute/agent 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.parachute/module.json +124 -8
- package/LICENSE +2 -16
- package/README.md +118 -166
- package/package.json +32 -43
- package/scripts/spawn-agent.ts +371 -0
- package/src/_parked/interactive-spawn.test.ts +324 -0
- package/src/_parked/interactive-spawn.ts +701 -0
- package/src/agent-defs.test.ts +1504 -0
- package/src/agent-defs.ts +1702 -0
- package/src/agent-mcp-config.test.ts +115 -0
- package/src/agent-mcp-config.ts +115 -0
- package/src/agents.test.ts +360 -0
- package/src/agents.ts +379 -0
- package/src/auth.test.ts +46 -0
- package/src/auth.ts +140 -0
- package/src/backends/attached-queue.test.ts +376 -0
- package/src/backends/attached-queue.ts +372 -0
- package/src/backends/programmatic.test.ts +1715 -0
- package/src/backends/programmatic.ts +927 -0
- package/src/backends/registry.test.ts +1494 -0
- package/src/backends/registry.ts +1202 -0
- package/src/backends/stream-json.test.ts +570 -0
- package/src/backends/stream-json.ts +392 -0
- package/src/backends/types.ts +223 -0
- package/src/bridge.ts +417 -0
- package/src/channel-backend-wiring.test.ts +237 -0
- package/src/credentials.test.ts +274 -0
- package/src/credentials.ts +380 -0
- package/src/cron.test.ts +342 -0
- package/src/cron.ts +380 -0
- package/src/daemon-agent-def-api.test.ts +166 -0
- package/src/daemon-agent-defs-api.test.ts +953 -0
- package/src/daemon-agent-env-api.test.ts +338 -0
- package/src/daemon-attached-queue-store.test.ts +65 -0
- package/src/daemon-config-api.test.ts +962 -0
- package/src/daemon-jobs-api.test.ts +271 -0
- package/src/daemon-vault-chat.test.ts +250 -0
- package/src/daemon.test.ts +746 -0
- package/src/daemon.ts +3314 -0
- package/src/def-vaults.test.ts +136 -0
- package/src/def-vaults.ts +165 -0
- package/src/delivery-state.test.ts +110 -0
- package/src/delivery-state.ts +154 -0
- package/src/effective-env.test.ts +114 -0
- package/src/effective-env.ts +184 -0
- package/src/env-compat.ts +39 -0
- package/src/grants.test.ts +638 -0
- package/src/grants.ts +675 -0
- package/src/hub-jwt.test.ts +161 -0
- package/src/hub-jwt.ts +182 -0
- package/src/jobs.test.ts +245 -0
- package/src/jobs.ts +266 -0
- package/src/mcp-http.test.ts +265 -0
- package/src/mcp-http.ts +771 -0
- package/src/mint-token.test.ts +152 -0
- package/src/mint-token.ts +139 -0
- package/src/module-manifest.test.ts +158 -0
- package/src/oauth-discovery.ts +134 -0
- package/src/programmatic-wiring.test.ts +838 -0
- package/src/registry.test.ts +227 -0
- package/src/registry.ts +228 -0
- package/src/resolve-port.test.ts +64 -0
- package/src/routing.test.ts +184 -0
- package/src/routing.ts +76 -0
- package/src/runner.test.ts +506 -0
- package/src/runner.ts +255 -0
- package/src/sandbox/config.test.ts +150 -0
- package/src/sandbox/config.ts +102 -0
- package/src/sandbox/egress.test.ts +113 -0
- package/src/sandbox/egress.ts +123 -0
- package/src/sandbox/index.ts +180 -0
- package/src/sandbox/live-seatbelt.test.ts +277 -0
- package/src/sandbox/mounts.test.ts +154 -0
- package/src/sandbox/mounts.ts +133 -0
- package/src/sandbox/sandbox.test.ts +168 -0
- package/src/sandbox/types.ts +382 -0
- package/src/services-manifest.test.ts +106 -0
- package/src/services-manifest.ts +95 -0
- package/src/spa-serve.test.ts +116 -0
- package/src/spa-serve.ts +116 -0
- package/src/spawn-agent-cli.test.ts +172 -0
- package/src/spawn-agent.test.ts +1218 -0
- package/src/spawn-agent.ts +569 -0
- package/src/spawn-deps.test.ts +54 -0
- package/src/spawn-deps.ts +166 -0
- package/src/telegram/api.ts +153 -0
- package/src/terminal-assets.test.ts +50 -0
- package/src/terminal-assets.ts +79 -0
- package/src/terminal-ui.ts +305 -0
- package/src/terminal.test.ts +530 -0
- package/src/terminal.ts +458 -0
- package/src/transport.ts +270 -0
- package/src/transports/http-ui.test.ts +455 -0
- package/src/transports/http-ui.ts +201 -0
- package/src/transports/telegram.test.ts +174 -0
- package/src/transports/telegram.ts +426 -0
- package/src/transports/vault.test.ts +2011 -0
- package/src/transports/vault.ts +1790 -0
- package/src/ui-kit.test.ts +178 -0
- package/src/ui-kit.ts +402 -0
- package/tsconfig.json +8 -14
- package/web/ui/tsconfig.json +2 -1
- package/.claude/scheduled_tasks.lock +0 -1
- package/.claude/settings.json +0 -5
- package/.claude/skills/add-atomic-chat-tool/SKILL.md +0 -243
- package/.claude/skills/add-atomic-chat-tool/atomic-chat-mcp-stdio.ts +0 -229
- package/.claude/skills/add-codex/SKILL.md +0 -161
- package/.claude/skills/add-dashboard/SKILL.md +0 -138
- package/.claude/skills/add-dashboard/resources/dashboard-pusher.ts +0 -495
- package/.claude/skills/add-emacs/SKILL.md +0 -296
- package/.claude/skills/add-gcal-tool/SKILL.md +0 -210
- package/.claude/skills/add-gchat/REMOVE.md +0 -6
- package/.claude/skills/add-gchat/SKILL.md +0 -92
- package/.claude/skills/add-gchat/VERIFY.md +0 -3
- package/.claude/skills/add-github/REMOVE.md +0 -6
- package/.claude/skills/add-github/SKILL.md +0 -148
- package/.claude/skills/add-github/VERIFY.md +0 -3
- package/.claude/skills/add-gmail-tool/SKILL.md +0 -229
- package/.claude/skills/add-imessage/REMOVE.md +0 -6
- package/.claude/skills/add-imessage/SKILL.md +0 -113
- package/.claude/skills/add-imessage/VERIFY.md +0 -3
- package/.claude/skills/add-karpathy-llm-wiki/SKILL.md +0 -110
- package/.claude/skills/add-karpathy-llm-wiki/llm-wiki.md +0 -75
- package/.claude/skills/add-linear/REMOVE.md +0 -6
- package/.claude/skills/add-linear/SKILL.md +0 -168
- package/.claude/skills/add-linear/VERIFY.md +0 -3
- package/.claude/skills/add-macos-statusbar/SKILL.md +0 -133
- package/.claude/skills/add-macos-statusbar/add/src/statusbar.swift +0 -147
- package/.claude/skills/add-matrix/REMOVE.md +0 -6
- package/.claude/skills/add-matrix/SKILL.md +0 -148
- package/.claude/skills/add-matrix/VERIFY.md +0 -3
- package/.claude/skills/add-ollama-provider/SKILL.md +0 -179
- package/.claude/skills/add-ollama-tool/SKILL.md +0 -193
- package/.claude/skills/add-opencode/SKILL.md +0 -229
- package/.claude/skills/add-parallel/SKILL.md +0 -290
- package/.claude/skills/add-resend/REMOVE.md +0 -6
- package/.claude/skills/add-resend/SKILL.md +0 -93
- package/.claude/skills/add-resend/VERIFY.md +0 -3
- package/.claude/skills/add-signal/REMOVE.md +0 -13
- package/.claude/skills/add-signal/SKILL.md +0 -318
- package/.claude/skills/add-signal/VERIFY.md +0 -5
- package/.claude/skills/add-slack/REMOVE.md +0 -6
- package/.claude/skills/add-slack/SKILL.md +0 -112
- package/.claude/skills/add-slack/VERIFY.md +0 -3
- package/.claude/skills/add-teams/REMOVE.md +0 -6
- package/.claude/skills/add-teams/SKILL.md +0 -207
- package/.claude/skills/add-teams/VERIFY.md +0 -3
- package/.claude/skills/add-vercel/SKILL.md +0 -147
- package/.claude/skills/add-vercel/container-skills/vercel-cli/SKILL.md +0 -103
- package/.claude/skills/add-webex/REMOVE.md +0 -6
- package/.claude/skills/add-webex/SKILL.md +0 -88
- package/.claude/skills/add-webex/VERIFY.md +0 -3
- package/.claude/skills/add-wechat/REMOVE.md +0 -49
- package/.claude/skills/add-wechat/SKILL.md +0 -170
- package/.claude/skills/add-wechat/scripts/wire-dm.ts +0 -172
- package/.claude/skills/add-whatsapp/SKILL.md +0 -264
- package/.claude/skills/add-whatsapp-cloud/REMOVE.md +0 -6
- package/.claude/skills/add-whatsapp-cloud/SKILL.md +0 -95
- package/.claude/skills/add-whatsapp-cloud/VERIFY.md +0 -3
- package/.claude/skills/claw/SKILL.md +0 -131
- package/.claude/skills/claw/scripts/claw +0 -374
- package/.claude/skills/convert-to-apple-container/SKILL.md +0 -212
- package/.claude/skills/customize/SKILL.md +0 -110
- package/.claude/skills/debug/SKILL.md +0 -349
- package/.claude/skills/get-qodo-rules/SKILL.md +0 -122
- package/.claude/skills/get-qodo-rules/references/output-format.md +0 -41
- package/.claude/skills/get-qodo-rules/references/pagination.md +0 -33
- package/.claude/skills/get-qodo-rules/references/repository-scope.md +0 -26
- package/.claude/skills/init-first-agent/SKILL.md +0 -120
- package/.claude/skills/init-onecli/SKILL.md +0 -270
- package/.claude/skills/manage-channels/SKILL.md +0 -87
- package/.claude/skills/manage-mounts/SKILL.md +0 -47
- package/.claude/skills/migrate-from-openclaw/MIGRATE_CRONS.md +0 -100
- package/.claude/skills/migrate-from-openclaw/SKILL.md +0 -447
- package/.claude/skills/migrate-from-openclaw/scripts/discover-openclaw.ts +0 -734
- package/.claude/skills/migrate-from-openclaw/scripts/extract-channel-credentials.ts +0 -476
- package/.claude/skills/migrate-nanoclaw/SKILL.md +0 -484
- package/.claude/skills/migrate-nanoclaw/diagnostics.md +0 -51
- package/.claude/skills/qodo-pr-resolver/SKILL.md +0 -326
- package/.claude/skills/qodo-pr-resolver/resources/providers.md +0 -329
- package/.claude/skills/update-nanoclaw/SKILL.md +0 -243
- package/.claude/skills/update-nanoclaw/diagnostics.md +0 -48
- package/.claude/skills/update-skills/SKILL.md +0 -130
- package/.claude/skills/use-native-credential-proxy/SKILL.md +0 -167
- package/.claude/skills/x-integration/SKILL.md +0 -417
- package/.claude/skills/x-integration/agent.ts +0 -243
- package/.claude/skills/x-integration/host.ts +0 -155
- package/.claude/skills/x-integration/lib/browser.ts +0 -148
- package/.claude/skills/x-integration/lib/config.ts +0 -62
- package/.claude/skills/x-integration/scripts/like.ts +0 -56
- package/.claude/skills/x-integration/scripts/post.ts +0 -66
- package/.claude/skills/x-integration/scripts/quote.ts +0 -80
- package/.claude/skills/x-integration/scripts/reply.ts +0 -74
- package/.claude/skills/x-integration/scripts/retweet.ts +0 -62
- package/.claude/skills/x-integration/scripts/setup.ts +0 -87
- package/.github/CODEOWNERS +0 -10
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -18
- package/.github/workflows/bump-version.yml +0 -35
- package/.github/workflows/ci.yml +0 -39
- package/.github/workflows/label-pr.yml +0 -40
- package/.github/workflows/update-tokens.yml +0 -43
- package/.husky/pre-commit +0 -1
- package/.mcp.json +0 -3
- package/.nvmrc +0 -1
- package/.prettierrc +0 -4
- package/CHANGELOG.md +0 -221
- package/CLAUDE.md +0 -307
- package/CODE_OF_CONDUCT.md +0 -128
- package/CONTRIBUTING.md +0 -159
- package/CONTRIBUTORS.md +0 -26
- package/LICENSE-NANOCLAW-MIT +0 -21
- package/README_ja.md +0 -194
- package/README_zh.md +0 -194
- package/assets/nanoclaw-favicon.png +0 -0
- package/assets/nanoclaw-icon.png +0 -0
- package/assets/nanoclaw-logo-dark.png +0 -0
- package/assets/nanoclaw-logo.png +0 -0
- package/assets/nanoclaw-profile.jpeg +0 -0
- package/assets/nanoclaw-sales.png +0 -0
- package/assets/social-preview.jpg +0 -0
- package/config-examples/mount-allowlist.json +0 -25
- package/container/.dockerignore +0 -2
- package/container/CLAUDE.md +0 -21
- package/container/Dockerfile +0 -121
- package/container/agent-runner/bun.lock +0 -243
- package/container/agent-runner/package.json +0 -22
- package/container/agent-runner/scripts/sdk-signal-probe.ts +0 -169
- package/container/agent-runner/src/config.ts +0 -55
- package/container/agent-runner/src/db/connection.ts +0 -267
- package/container/agent-runner/src/db/index.ts +0 -20
- package/container/agent-runner/src/db/messages-in.ts +0 -138
- package/container/agent-runner/src/db/messages-out.ts +0 -143
- package/container/agent-runner/src/db/session-routing.ts +0 -30
- package/container/agent-runner/src/db/session-state.test.ts +0 -100
- package/container/agent-runner/src/db/session-state.ts +0 -79
- package/container/agent-runner/src/destinations.ts +0 -135
- package/container/agent-runner/src/formatter.test.ts +0 -167
- package/container/agent-runner/src/formatter.ts +0 -260
- package/container/agent-runner/src/index.ts +0 -110
- package/container/agent-runner/src/integration.test.ts +0 -121
- package/container/agent-runner/src/mcp-tools/agents.instructions.md +0 -26
- package/container/agent-runner/src/mcp-tools/agents.ts +0 -66
- package/container/agent-runner/src/mcp-tools/core.instructions.md +0 -27
- package/container/agent-runner/src/mcp-tools/core.ts +0 -262
- package/container/agent-runner/src/mcp-tools/index.ts +0 -22
- package/container/agent-runner/src/mcp-tools/interactive.instructions.md +0 -22
- package/container/agent-runner/src/mcp-tools/interactive.ts +0 -169
- package/container/agent-runner/src/mcp-tools/scheduling.instructions.md +0 -40
- package/container/agent-runner/src/mcp-tools/scheduling.ts +0 -299
- package/container/agent-runner/src/mcp-tools/self-mod.instructions.md +0 -25
- package/container/agent-runner/src/mcp-tools/self-mod.ts +0 -120
- package/container/agent-runner/src/mcp-tools/server.ts +0 -54
- package/container/agent-runner/src/mcp-tools/types.ts +0 -6
- package/container/agent-runner/src/poll-loop.test.ts +0 -248
- package/container/agent-runner/src/poll-loop.ts +0 -437
- package/container/agent-runner/src/providers/claude.ts +0 -379
- package/container/agent-runner/src/providers/factory.test.ts +0 -19
- package/container/agent-runner/src/providers/factory.ts +0 -13
- package/container/agent-runner/src/providers/index.ts +0 -6
- package/container/agent-runner/src/providers/mock.ts +0 -77
- package/container/agent-runner/src/providers/provider-registry.ts +0 -33
- package/container/agent-runner/src/providers/types.ts +0 -82
- package/container/agent-runner/src/scheduling/task-script.ts +0 -121
- package/container/agent-runner/src/timezone.test.ts +0 -93
- package/container/agent-runner/src/timezone.ts +0 -107
- package/container/agent-runner/tsconfig.json +0 -14
- package/container/build.sh +0 -48
- package/container/entrypoint.sh +0 -16
- package/container/skills/agent-browser/SKILL.md +0 -159
- package/container/skills/frontend-engineer/SKILL.md +0 -157
- package/container/skills/self-customize/SKILL.md +0 -87
- package/container/skills/slack-formatting/SKILL.md +0 -94
- package/container/skills/vercel-cli/SKILL.md +0 -111
- package/container/skills/welcome/SKILL.md +0 -85
- package/docs/APPLE-CONTAINER-NETWORKING.md +0 -90
- package/docs/BRANCH-FORK-MAINTENANCE.md +0 -81
- package/docs/README.md +0 -25
- package/docs/SDK_DEEP_DIVE.md +0 -643
- package/docs/SECURITY.md +0 -162
- package/docs/agent-runner-details.md +0 -749
- package/docs/api-details.md +0 -365
- package/docs/architecture-diagram.html +0 -422
- package/docs/architecture-diagram.md +0 -215
- package/docs/architecture.md +0 -751
- package/docs/audit/2026-04-30-channel-endpoint-audit.md +0 -36
- package/docs/build-and-runtime.md +0 -80
- package/docs/cross-mount-stress/README.md +0 -112
- package/docs/cross-mount-stress/container-writer-retry.mjs +0 -55
- package/docs/cross-mount-stress/container-writer-slow.mjs +0 -42
- package/docs/cross-mount-stress/container-writer.mjs +0 -47
- package/docs/cross-mount-stress/host-writer-retry.mjs +0 -55
- package/docs/cross-mount-stress/host-writer-slow.mjs +0 -43
- package/docs/cross-mount-stress/host-writer.mjs +0 -47
- package/docs/db-central.md +0 -316
- package/docs/db-session.md +0 -183
- package/docs/db.md +0 -119
- package/docs/design/2026-04-29-vault-management-ui.md +0 -231
- package/docs/design/2026-04-30-channel-wiring-rework.md +0 -234
- package/docs/design/2026-05-01-channel-wiring-approvals-deep-dive.md +0 -272
- package/docs/design/2026-05-02-channel-policy-and-approval-routing.md +0 -250
- package/docs/docker-sandboxes.md +0 -359
- package/docs/isolation-model.md +0 -88
- package/docs/ollama.md +0 -79
- package/docs/parachute-integration.md +0 -109
- package/docs/post-night-rebirth-reflections.md +0 -151
- package/eslint.config.js +0 -32
- package/pnpm-workspace.yaml +0 -8
- package/repo-tokens/README.md +0 -113
- package/repo-tokens/action.yml +0 -186
- package/repo-tokens/badge.svg +0 -23
- package/repo-tokens/examples/green.svg +0 -14
- package/repo-tokens/examples/red.svg +0 -14
- package/repo-tokens/examples/yellow-green.svg +0 -14
- package/repo-tokens/examples/yellow.svg +0 -14
- package/scripts/chat.ts +0 -101
- package/scripts/cleanup-sessions.sh +0 -150
- package/scripts/init-cli-agent.ts +0 -171
- package/scripts/init-first-agent.ts +0 -377
- package/scripts/parachute.ts +0 -158
- package/scripts/run-migrations.ts +0 -105
- package/scripts/sanity-live-poll.ts +0 -95
- package/scripts/seed-discord.ts +0 -79
- package/scripts/test-v2-agent.ts +0 -106
- package/scripts/test-v2-channel-e2e.ts +0 -265
- package/scripts/test-v2-host.ts +0 -184
- package/src/channels/adapter.ts +0 -214
- package/src/channels/ask-question.ts +0 -46
- package/src/channels/channel-registry.test.ts +0 -421
- package/src/channels/channel-registry.ts +0 -313
- package/src/channels/chat-sdk-bridge.test.ts +0 -84
- package/src/channels/chat-sdk-bridge.ts +0 -652
- package/src/channels/cli.ts +0 -276
- package/src/channels/discord.ts +0 -90
- package/src/channels/index.ts +0 -17
- package/src/channels/telegram-markdown-sanitize.test.ts +0 -78
- package/src/channels/telegram-markdown-sanitize.ts +0 -55
- package/src/channels/telegram-pairing.test.ts +0 -254
- package/src/channels/telegram-pairing.ts +0 -339
- package/src/channels/telegram.ts +0 -279
- package/src/channels/trust-hint.test.ts +0 -48
- package/src/channels/trust-hint.ts +0 -75
- package/src/claude-md-compose.migrate.test.ts +0 -64
- package/src/claude-md-compose.ts +0 -205
- package/src/command-gate.ts +0 -63
- package/src/config.test.ts +0 -93
- package/src/config.ts +0 -108
- package/src/container-config.ts +0 -167
- package/src/container-runner.test.ts +0 -32
- package/src/container-runner.ts +0 -576
- package/src/container-runtime.test.ts +0 -169
- package/src/container-runtime.ts +0 -92
- package/src/db/_bun-sqlite-shim.ts +0 -88
- package/src/db/agent-activity.test.ts +0 -155
- package/src/db/agent-activity.ts +0 -121
- package/src/db/agent-groups.ts +0 -77
- package/src/db/connection.migrate.test.ts +0 -143
- package/src/db/connection.ts +0 -224
- package/src/db/db-v2.test.ts +0 -440
- package/src/db/dropped-messages.ts +0 -44
- package/src/db/index.ts +0 -40
- package/src/db/messaging-groups.ts +0 -252
- package/src/db/migrations/001-initial.ts +0 -112
- package/src/db/migrations/002-chat-sdk-state.ts +0 -36
- package/src/db/migrations/008-dropped-messages.ts +0 -27
- package/src/db/migrations/009-drop-pending-credentials.ts +0 -13
- package/src/db/migrations/010-engage-modes.ts +0 -103
- package/src/db/migrations/011-pending-sender-approvals.ts +0 -40
- package/src/db/migrations/012-channel-registration.ts +0 -48
- package/src/db/migrations/013-approval-render-metadata.ts +0 -27
- package/src/db/migrations/014-secrets.ts +0 -44
- package/src/db/migrations/015-secrets-drop-host-pattern.ts +0 -18
- package/src/db/migrations/016-secret-assignments.ts +0 -30
- package/src/db/migrations/017-agent-activity.ts +0 -40
- package/src/db/migrations/018-oauth-app-configs.ts +0 -34
- package/src/db/migrations/019-oauth-app-connections.ts +0 -48
- package/src/db/migrations/020-agent-app-connections.ts +0 -28
- package/src/db/migrations/021-pending-oauth-states.ts +0 -35
- package/src/db/migrations/022-app-connections-provider.ts +0 -25
- package/src/db/migrations/023-agent-group-secret-mode.test.ts +0 -124
- package/src/db/migrations/023-agent-group-secret-mode.ts +0 -65
- package/src/db/migrations/024-collapse-approvals.test.ts +0 -249
- package/src/db/migrations/024-collapse-approvals.ts +0 -182
- package/src/db/migrations/025-secret-mode-check.test.ts +0 -155
- package/src/db/migrations/025-secret-mode-check.ts +0 -49
- package/src/db/migrations/026-user-dms-bot-id.test.ts +0 -116
- package/src/db/migrations/026-user-dms-bot-id.ts +0 -54
- package/src/db/migrations/027-provider-credentials.ts +0 -41
- package/src/db/migrations/_test-helpers.ts +0 -41
- package/src/db/migrations/index.ts +0 -127
- package/src/db/migrations/module-agent-to-agent-destinations.ts +0 -84
- package/src/db/migrations/module-approvals-pending-approvals.ts +0 -42
- package/src/db/migrations/module-approvals-title-options.ts +0 -40
- package/src/db/schema.ts +0 -258
- package/src/db/session-db.test.ts +0 -93
- package/src/db/session-db.ts +0 -325
- package/src/db/sessions.ts +0 -241
- package/src/delivery.test.ts +0 -148
- package/src/delivery.ts +0 -445
- package/src/env.ts +0 -74
- package/src/group-folder.test.ts +0 -35
- package/src/group-folder.ts +0 -44
- package/src/group-init.ts +0 -92
- package/src/host-core.test.ts +0 -456
- package/src/host-sweep.test.ts +0 -146
- package/src/host-sweep.ts +0 -287
- package/src/index.ts +0 -227
- package/src/install-slug.ts +0 -33
- package/src/log.test.ts +0 -81
- package/src/log.ts +0 -117
- package/src/mcp/http.ts +0 -72
- package/src/mcp/server.ts +0 -92
- package/src/mcp/stdio.ts +0 -51
- package/src/mcp/tools/activity.ts +0 -88
- package/src/mcp/tools/agent-groups.ts +0 -183
- package/src/mcp/tools/approvals.ts +0 -122
- package/src/mcp/tools/channels.ts +0 -199
- package/src/mcp/tools/index.ts +0 -27
- package/src/mcp/tools/oauth.ts +0 -48
- package/src/mcp/tools/secrets.ts +0 -169
- package/src/mcp/tools/sessions.ts +0 -135
- package/src/mcp/types.ts +0 -51
- package/src/modules/agent-to-agent/agent-route.test.ts +0 -46
- package/src/modules/agent-to-agent/agent-route.ts +0 -223
- package/src/modules/agent-to-agent/create-agent.ts +0 -127
- package/src/modules/agent-to-agent/db/agent-destinations.ts +0 -135
- package/src/modules/agent-to-agent/index.ts +0 -22
- package/src/modules/agent-to-agent/write-destinations.ts +0 -59
- package/src/modules/approvals/agent.md +0 -45
- package/src/modules/approvals/index.ts +0 -21
- package/src/modules/approvals/picks.test.ts +0 -291
- package/src/modules/approvals/primitive.ts +0 -279
- package/src/modules/approvals/project.md +0 -27
- package/src/modules/approvals/response-handler.ts +0 -87
- package/src/modules/index.ts +0 -24
- package/src/modules/interactive/agent.md +0 -21
- package/src/modules/interactive/index.ts +0 -69
- package/src/modules/interactive/project.md +0 -12
- package/src/modules/mount-security/index.ts +0 -448
- package/src/modules/mount-security/migrate.test.ts +0 -91
- package/src/modules/permissions/access.ts +0 -28
- package/src/modules/permissions/channel-approval.test.ts +0 -389
- package/src/modules/permissions/channel-approval.ts +0 -188
- package/src/modules/permissions/db/agent-group-members.ts +0 -44
- package/src/modules/permissions/db/pending-channel-approvals.test.ts +0 -86
- package/src/modules/permissions/db/pending-channel-approvals.ts +0 -66
- package/src/modules/permissions/db/pending-sender-approvals.ts +0 -60
- package/src/modules/permissions/db/user-dms.ts +0 -58
- package/src/modules/permissions/db/user-roles.ts +0 -85
- package/src/modules/permissions/db/users.ts +0 -38
- package/src/modules/permissions/index.ts +0 -421
- package/src/modules/permissions/permissions.test.ts +0 -358
- package/src/modules/permissions/sender-approval.test.ts +0 -470
- package/src/modules/permissions/sender-approval.ts +0 -165
- package/src/modules/permissions/user-dm.ts +0 -200
- package/src/modules/provider-credentials/db.ts +0 -121
- package/src/modules/provider-credentials/index.ts +0 -12
- package/src/modules/provider-credentials/spawn.test.ts +0 -206
- package/src/modules/provider-credentials/spawn.ts +0 -114
- package/src/modules/scheduling/actions.ts +0 -113
- package/src/modules/scheduling/db.test.ts +0 -282
- package/src/modules/scheduling/db.ts +0 -148
- package/src/modules/scheduling/index.ts +0 -34
- package/src/modules/scheduling/recurrence.test.ts +0 -98
- package/src/modules/scheduling/recurrence.ts +0 -54
- package/src/modules/self-mod/agent.md +0 -30
- package/src/modules/self-mod/apply.ts +0 -85
- package/src/modules/self-mod/index.ts +0 -30
- package/src/modules/self-mod/project.md +0 -39
- package/src/modules/self-mod/request.ts +0 -91
- package/src/modules/typing/index.ts +0 -165
- package/src/oauth/agent-app-connections.ts +0 -103
- package/src/oauth/app-configs.test.ts +0 -64
- package/src/oauth/app-configs.ts +0 -114
- package/src/oauth/app-connections.test.ts +0 -109
- package/src/oauth/app-connections.ts +0 -178
- package/src/oauth/crypto.ts +0 -56
- package/src/oauth/flow.ts +0 -104
- package/src/oauth/providers/google.test.ts +0 -38
- package/src/oauth/providers/google.ts +0 -46
- package/src/oauth/providers/index.ts +0 -48
- package/src/oauth/state-store.test.ts +0 -54
- package/src/oauth/state-store.ts +0 -93
- package/src/parachute/README.md +0 -27
- package/src/parachute/create-agent.test.ts +0 -83
- package/src/parachute/create-agent.ts +0 -122
- package/src/parachute/group-status.test.ts +0 -165
- package/src/parachute/group-status.ts +0 -136
- package/src/parachute/types.ts +0 -41
- package/src/parachute/vault-mcp.test.ts +0 -251
- package/src/parachute/vault-mcp.ts +0 -232
- package/src/platform-id.test.ts +0 -104
- package/src/platform-id.ts +0 -109
- package/src/providers/index.ts +0 -6
- package/src/providers/provider-container-registry.ts +0 -58
- package/src/response-registry.ts +0 -45
- package/src/router.ts +0 -530
- package/src/secrets/crypto.test.ts +0 -45
- package/src/secrets/crypto.ts +0 -55
- package/src/secrets/index.ts +0 -355
- package/src/secrets/master-key.ts +0 -70
- package/src/secrets/secrets.test.ts +0 -354
- package/src/session-manager.migrate.test.ts +0 -59
- package/src/session-manager.ts +0 -433
- package/src/startup-bootstrap.test.ts +0 -226
- package/src/startup-bootstrap.ts +0 -207
- package/src/state-sqlite.ts +0 -182
- package/src/timezone.test.ts +0 -64
- package/src/timezone.ts +0 -37
- package/src/types.ts +0 -230
- package/src/web/auth.test.ts +0 -335
- package/src/web/auth.ts +0 -214
- package/src/web/discord-validate.test.ts +0 -77
- package/src/web/discord-validate.ts +0 -88
- package/src/web/hub-discovery.test.ts +0 -98
- package/src/web/hub-discovery.ts +0 -69
- package/src/web/routes/activity.ts +0 -106
- package/src/web/routes/agent-provider.test.ts +0 -282
- package/src/web/routes/agent-provider.ts +0 -309
- package/src/web/routes/approvals.ts +0 -185
- package/src/web/routes/apps.ts +0 -434
- package/src/web/routes/channels-mg-detail.test.ts +0 -324
- package/src/web/routes/channels-mga-detail.test.ts +0 -425
- package/src/web/routes/channels.ts +0 -489
- package/src/web/routes/oauth-providers.ts +0 -42
- package/src/web/routes/secrets.test.ts +0 -175
- package/src/web/routes/secrets.ts +0 -282
- package/src/web/routes/sessions.ts +0 -123
- package/src/web/routes/settings.test.ts +0 -106
- package/src/web/routes/settings.ts +0 -247
- package/src/web/routes/setup-status.ts +0 -205
- package/src/web/routes/vaults.test.ts +0 -389
- package/src/web/routes/vaults.ts +0 -225
- package/src/web/server-version.test.ts +0 -16
- package/src/web/server.ts +0 -1003
- package/src/web/services-manifest.test.ts +0 -120
- package/src/web/services-manifest.ts +0 -61
- package/src/web/static-serve.test.ts +0 -255
- package/src/web/static-serve.ts +0 -104
- package/src/web/telegram-validate.test.ts +0 -116
- package/src/web/telegram-validate.ts +0 -107
- package/src/web/vault-proxy.test.ts +0 -214
- package/src/web/vault-proxy.ts +0 -120
- package/src/web/wire-channel.ts +0 -181
- package/src/webhook-server.ts +0 -134
- package/vitest.config.ts +0 -18
- package/web/README.md +0 -63
- package/web/ui/index.html +0 -13
- package/web/ui/package.json +0 -35
- package/web/ui/pnpm-lock.yaml +0 -2164
- package/web/ui/scripts/verify-base.mjs +0 -31
- package/web/ui/src/App.tsx +0 -88
- package/web/ui/src/components/ActivityFeed.tsx +0 -444
- package/web/ui/src/components/AgentGroupPicker.tsx +0 -263
- package/web/ui/src/components/AgentProviderCards.tsx +0 -220
- package/web/ui/src/components/CredentialForm.tsx +0 -214
- package/web/ui/src/components/ScopeGrants.tsx +0 -74
- package/web/ui/src/components/StatusDot.tsx +0 -43
- package/web/ui/src/components/VaultPicker.tsx +0 -127
- package/web/ui/src/components/setup/AdapterInstallStep.tsx +0 -178
- package/web/ui/src/components/setup/AgentGroupStep.tsx +0 -43
- package/web/ui/src/components/setup/ChannelPickStep.tsx +0 -74
- package/web/ui/src/components/setup/DoneStep.tsx +0 -49
- package/web/ui/src/components/setup/PrereqStep.tsx +0 -129
- package/web/ui/src/components/setup/TestConnectionStep.tsx +0 -108
- package/web/ui/src/components/setup/TestMessageStep.tsx +0 -104
- package/web/ui/src/components/setup/WireChannelStep.tsx +0 -166
- package/web/ui/src/components/setup/types.ts +0 -105
- package/web/ui/src/lib/api.test.ts +0 -410
- package/web/ui/src/lib/api.ts +0 -1210
- package/web/ui/src/lib/auth.test.ts +0 -139
- package/web/ui/src/lib/auth.ts +0 -348
- package/web/ui/src/lib/channel-adapters.ts +0 -136
- package/web/ui/src/main.tsx +0 -19
- package/web/ui/src/routes/ApprovalsList.tsx +0 -294
- package/web/ui/src/routes/Apps.tsx +0 -613
- package/web/ui/src/routes/ChannelWireDetail.test.tsx +0 -233
- package/web/ui/src/routes/ChannelWireDetail.tsx +0 -403
- package/web/ui/src/routes/ChannelsList.tsx +0 -158
- package/web/ui/src/routes/GroupDetail.tsx +0 -755
- package/web/ui/src/routes/GroupList.tsx +0 -187
- package/web/ui/src/routes/MessagingGroupDetail.test.tsx +0 -233
- package/web/ui/src/routes/MessagingGroupDetail.tsx +0 -306
- package/web/ui/src/routes/NewGroupWizard.tsx +0 -390
- package/web/ui/src/routes/OAuthCallback.tsx +0 -56
- package/web/ui/src/routes/SecretsList.tsx +0 -921
- package/web/ui/src/routes/SessionsList.tsx +0 -220
- package/web/ui/src/routes/SettingsAgentProvider.tsx +0 -109
- package/web/ui/src/routes/SettingsApprovals.tsx +0 -234
- package/web/ui/src/routes/SetupWizard.tsx +0 -219
- package/web/ui/src/routes/VaultDetail.test.tsx +0 -361
- package/web/ui/src/routes/VaultDetail.tsx +0 -960
- package/web/ui/src/routes/VaultsList.tsx +0 -295
- package/web/ui/src/routes/WireChannelPage.tsx +0 -413
- package/web/ui/src/styles.css +0 -608
- package/web/ui/src/test/setup.ts +0 -23
- package/web/ui/src/vite-env.d.ts +0 -10
- package/web/ui/vite.config.ts +0 -34
- 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,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`.)
|