@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.
- 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 -263
- 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 -172
- package/scripts/init-first-agent.ts +0 -378
- 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 -80
- 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/api-translator.test.ts +0 -306
- package/src/channels/api-translator.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 -128
- 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 -269
- package/src/container-runtime.ts +0 -167
- 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 -176
- package/src/db/connection.ts +0 -259
- 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 -232
- 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.test.ts +0 -126
- package/src/mcp/tools/channels.ts +0 -134
- 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/expand-path.test.ts +0 -82
- package/src/modules/mount-security/index.ts +0 -459
- 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 -641
- 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 -461
- package/src/secrets/master-key.ts +0 -70
- package/src/secrets/secrets.test.ts +0 -651
- package/src/session-manager.attachments.test.ts +0 -171
- package/src/session-manager.dup-skip.test.ts +0 -173
- package/src/session-manager.migrate.test.ts +0 -59
- package/src/session-manager.ts +0 -451
- 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 -233
- 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 -472
- package/src/web/routes/channels.ts +0 -311
- package/src/web/routes/oauth-providers.ts +0 -42
- package/src/web/routes/secrets.test.ts +0 -220
- package/src/web/routes/secrets.ts +0 -317
- 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 -1024
- package/src/web/services-manifest.test.ts +0 -148
- package/src/web/services-manifest.ts +0 -66
- 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 -1248
- package/web/ui/src/lib/auth.test.ts +0 -352
- package/web/ui/src/lib/auth.ts +0 -405
- 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.test.tsx +0 -206
- package/web/ui/src/routes/GroupDetail.tsx +0 -880
- 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 -942
- 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 -363
- 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,172 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env pnpm exec tsx
|
|
2
|
-
/**
|
|
3
|
-
* Wire a WeChat DM (or group) to an agent group.
|
|
4
|
-
*
|
|
5
|
-
* After /add-wechat installs the adapter and the user scans the QR login,
|
|
6
|
-
* the first inbound message from another WeChat account auto-creates a
|
|
7
|
-
* `messaging_groups` row. This script finds that row, asks the operator
|
|
8
|
-
* which agent group to wire it to, and inserts the `messaging_group_agents`
|
|
9
|
-
* join row with sensible defaults — the "post-login wiring" step /add-wechat
|
|
10
|
-
* otherwise requires manual SQL for.
|
|
11
|
-
*
|
|
12
|
-
* Usage:
|
|
13
|
-
* pnpm exec tsx .claude/skills/add-wechat/scripts/wire-dm.ts
|
|
14
|
-
*
|
|
15
|
-
* Flags:
|
|
16
|
-
* --platform-id <id> Wire a specific messaging group (default: most recent unwired)
|
|
17
|
-
* --agent-group <id> Target agent group (default: interactive pick; or solo admin group)
|
|
18
|
-
* --sender-policy <p> public | strict (default: public)
|
|
19
|
-
* --session-mode <m> shared | per-thread (default: shared)
|
|
20
|
-
* --non-interactive Fail instead of prompting
|
|
21
|
-
*/
|
|
22
|
-
import Database from 'better-sqlite3';
|
|
23
|
-
import path from 'node:path';
|
|
24
|
-
import readline from 'node:readline';
|
|
25
|
-
|
|
26
|
-
const DB_PATH = process.env.NANOCLAW_DB_PATH ?? path.join(process.cwd(), 'data', 'v2.db');
|
|
27
|
-
|
|
28
|
-
type SenderPolicy = 'public' | 'strict' | 'request_approval';
|
|
29
|
-
|
|
30
|
-
interface Args {
|
|
31
|
-
platformId?: string;
|
|
32
|
-
agentGroupId?: string;
|
|
33
|
-
senderPolicy: SenderPolicy;
|
|
34
|
-
sessionMode: 'shared' | 'per-thread';
|
|
35
|
-
interactive: boolean;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function parseArgs(argv: string[]): Args {
|
|
39
|
-
const args: Args = {
|
|
40
|
-
// Default matches the router's auto-create (`request_approval`) so the
|
|
41
|
-
// admin gets an approval card on the next unknown-sender DM rather than
|
|
42
|
-
// a silent allow. Pass `--sender-policy public` to open the channel to
|
|
43
|
-
// anyone, or `strict` to require explicit membership.
|
|
44
|
-
senderPolicy: 'request_approval',
|
|
45
|
-
sessionMode: 'shared',
|
|
46
|
-
interactive: true,
|
|
47
|
-
};
|
|
48
|
-
for (let i = 0; i < argv.length; i++) {
|
|
49
|
-
const flag = argv[i];
|
|
50
|
-
const val = argv[i + 1];
|
|
51
|
-
switch (flag) {
|
|
52
|
-
case '--platform-id': args.platformId = val; i++; break;
|
|
53
|
-
case '--agent-group': args.agentGroupId = val; i++; break;
|
|
54
|
-
case '--sender-policy':
|
|
55
|
-
if (val !== 'public' && val !== 'strict' && val !== 'request_approval') {
|
|
56
|
-
throw new Error(`bad --sender-policy: ${val} (use public | strict | request_approval)`);
|
|
57
|
-
}
|
|
58
|
-
args.senderPolicy = val; i++; break;
|
|
59
|
-
case '--session-mode':
|
|
60
|
-
if (val !== 'shared' && val !== 'per-thread') throw new Error(`bad --session-mode: ${val}`);
|
|
61
|
-
args.sessionMode = val; i++; break;
|
|
62
|
-
case '--non-interactive': args.interactive = false; break;
|
|
63
|
-
case '--help': case '-h':
|
|
64
|
-
console.log('See .claude/skills/add-wechat/scripts/wire-dm.ts header for usage.');
|
|
65
|
-
process.exit(0);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
return args;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
async function prompt(q: string): Promise<string> {
|
|
72
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
73
|
-
return new Promise((resolve) => rl.question(q, (a) => { rl.close(); resolve(a.trim()); }));
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function generateId(prefix: string): string {
|
|
77
|
-
return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async function main(): Promise<void> {
|
|
81
|
-
const args = parseArgs(process.argv.slice(2));
|
|
82
|
-
const db = new Database(DB_PATH);
|
|
83
|
-
db.pragma('journal_mode = WAL');
|
|
84
|
-
|
|
85
|
-
// 1. Pick the messaging group
|
|
86
|
-
let platformId = args.platformId;
|
|
87
|
-
if (!platformId) {
|
|
88
|
-
const rows = db.prepare(`
|
|
89
|
-
SELECT mg.id, mg.platform_id, mg.name, mg.is_group, mg.created_at
|
|
90
|
-
FROM messaging_groups mg
|
|
91
|
-
LEFT JOIN messaging_group_agents mga ON mga.messaging_group_id = mg.id
|
|
92
|
-
WHERE mg.channel_type = 'wechat' AND mga.id IS NULL
|
|
93
|
-
ORDER BY mg.created_at DESC
|
|
94
|
-
`).all() as Array<{ id: string; platform_id: string; name: string | null; is_group: number; created_at: string }>;
|
|
95
|
-
|
|
96
|
-
if (rows.length === 0) {
|
|
97
|
-
console.error('No unwired WeChat messaging groups found.');
|
|
98
|
-
console.error('Send a message to the bot first (from another WeChat account), then re-run.');
|
|
99
|
-
process.exit(1);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
if (rows.length === 1 || !args.interactive) {
|
|
103
|
-
platformId = rows[0].platform_id;
|
|
104
|
-
console.log(`Using most recent unwired group: ${platformId} (${rows[0].is_group ? 'group' : 'DM'})`);
|
|
105
|
-
} else {
|
|
106
|
-
console.log('Unwired WeChat messaging groups:');
|
|
107
|
-
rows.forEach((r, i) => {
|
|
108
|
-
console.log(` ${i + 1}. ${r.platform_id} (${r.is_group ? 'group' : 'DM'}, ${r.created_at})`);
|
|
109
|
-
});
|
|
110
|
-
const pick = await prompt('Pick one [1]: ');
|
|
111
|
-
const idx = pick === '' ? 0 : parseInt(pick, 10) - 1;
|
|
112
|
-
if (Number.isNaN(idx) || idx < 0 || idx >= rows.length) throw new Error('invalid choice');
|
|
113
|
-
platformId = rows[idx].platform_id;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
const mg = db.prepare(
|
|
118
|
-
'SELECT id, platform_id, is_group FROM messaging_groups WHERE channel_type = ? AND platform_id = ?'
|
|
119
|
-
).get('wechat', platformId) as { id: string; platform_id: string; is_group: number } | undefined;
|
|
120
|
-
if (!mg) throw new Error(`no wechat messaging_group with platform_id = ${platformId}`);
|
|
121
|
-
|
|
122
|
-
// 2. Pick the agent group
|
|
123
|
-
let agentGroupId = args.agentGroupId;
|
|
124
|
-
if (!agentGroupId) {
|
|
125
|
-
const agents = db.prepare('SELECT id, name, is_admin FROM agent_groups ORDER BY is_admin DESC, created_at ASC')
|
|
126
|
-
.all() as Array<{ id: string; name: string; is_admin: number }>;
|
|
127
|
-
if (agents.length === 0) throw new Error('no agent groups exist — create one first');
|
|
128
|
-
|
|
129
|
-
const adminAgents = agents.filter((a) => a.is_admin === 1);
|
|
130
|
-
if (adminAgents.length === 1 && !args.interactive) {
|
|
131
|
-
agentGroupId = adminAgents[0].id;
|
|
132
|
-
console.log(`Auto-selected sole admin agent group: ${adminAgents[0].name} (${agentGroupId})`);
|
|
133
|
-
} else if (args.interactive) {
|
|
134
|
-
console.log('Agent groups:');
|
|
135
|
-
agents.forEach((a, i) => {
|
|
136
|
-
console.log(` ${i + 1}. ${a.name} (${a.id})${a.is_admin ? ' [admin]' : ''}`);
|
|
137
|
-
});
|
|
138
|
-
const pick = await prompt('Pick one [1]: ');
|
|
139
|
-
const idx = pick === '' ? 0 : parseInt(pick, 10) - 1;
|
|
140
|
-
if (Number.isNaN(idx) || idx < 0 || idx >= agents.length) throw new Error('invalid choice');
|
|
141
|
-
agentGroupId = agents[idx].id;
|
|
142
|
-
} else {
|
|
143
|
-
throw new Error('multiple agent groups exist; pass --agent-group <id>');
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const ag = db.prepare('SELECT id, name FROM agent_groups WHERE id = ?').get(agentGroupId) as
|
|
148
|
-
{ id: string; name: string } | undefined;
|
|
149
|
-
if (!ag) throw new Error(`no agent_group with id = ${agentGroupId}`);
|
|
150
|
-
|
|
151
|
-
// 3. Update sender policy + wire
|
|
152
|
-
const tx = db.transaction(() => {
|
|
153
|
-
db.prepare('UPDATE messaging_groups SET unknown_sender_policy = ? WHERE id = ?')
|
|
154
|
-
.run(args.senderPolicy, mg.id);
|
|
155
|
-
|
|
156
|
-
db.prepare(`
|
|
157
|
-
INSERT INTO messaging_group_agents
|
|
158
|
-
(id, messaging_group_id, agent_group_id, trigger_rules, response_scope, session_mode, priority, created_at)
|
|
159
|
-
VALUES (?, ?, ?, '', 'all', ?, 10, datetime('now'))
|
|
160
|
-
`).run(generateId('mga'), mg.id, ag.id, args.sessionMode);
|
|
161
|
-
});
|
|
162
|
-
tx();
|
|
163
|
-
|
|
164
|
-
console.log('');
|
|
165
|
-
console.log(`WIRED platform_id=${mg.platform_id} agent_group=${ag.name} policy=${args.senderPolicy} mode=${args.sessionMode}`);
|
|
166
|
-
db.close();
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
main().catch((err) => {
|
|
170
|
-
console.error('FAILED:', err.message);
|
|
171
|
-
process.exit(1);
|
|
172
|
-
});
|
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: add-whatsapp
|
|
3
|
-
description: Add WhatsApp channel via native Baileys adapter. Direct connection — no Chat SDK bridge. Uses QR code or pairing code for authentication.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Add WhatsApp Channel
|
|
7
|
-
|
|
8
|
-
Adds WhatsApp support via the native Baileys adapter (no Chat SDK bridge).
|
|
9
|
-
|
|
10
|
-
## Install
|
|
11
|
-
|
|
12
|
-
NanoClaw doesn't ship channels in trunk. This skill copies the native WhatsApp (Baileys) adapter and its `whatsapp-auth` setup step in from the `channels` branch. No Chat SDK bridge.
|
|
13
|
-
|
|
14
|
-
### Pre-flight (idempotent)
|
|
15
|
-
|
|
16
|
-
Skip to **Credentials** if all of these are already in place:
|
|
17
|
-
|
|
18
|
-
- `src/channels/whatsapp.ts` exists
|
|
19
|
-
- `src/channels/index.ts` contains `import './whatsapp.js';`
|
|
20
|
-
- `setup/whatsapp-auth.ts` and `setup/groups.ts` both exist
|
|
21
|
-
- `setup/index.ts`'s `STEPS` map contains both `'whatsapp-auth':` and `groups:`
|
|
22
|
-
- `@whiskeysockets/baileys`, `qrcode`, `pino` are listed in `package.json` dependencies
|
|
23
|
-
|
|
24
|
-
Otherwise continue. Every step below is safe to re-run.
|
|
25
|
-
|
|
26
|
-
### 1. Fetch the channels branch
|
|
27
|
-
|
|
28
|
-
```bash
|
|
29
|
-
git fetch origin channels
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### 2. Copy the adapter and setup steps
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
git show origin/channels:src/channels/whatsapp.ts > src/channels/whatsapp.ts
|
|
36
|
-
git show origin/channels:setup/whatsapp-auth.ts > setup/whatsapp-auth.ts
|
|
37
|
-
git show origin/channels:setup/groups.ts > setup/groups.ts
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### 3. Append the self-registration import
|
|
41
|
-
|
|
42
|
-
Append to `src/channels/index.ts` (skip if already present):
|
|
43
|
-
|
|
44
|
-
```typescript
|
|
45
|
-
import './whatsapp.js';
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### 4. Register the setup steps
|
|
49
|
-
|
|
50
|
-
In `setup/index.ts`, add these entries to the `STEPS` map (skip lines already present):
|
|
51
|
-
|
|
52
|
-
```typescript
|
|
53
|
-
groups: () => import('./groups.js'),
|
|
54
|
-
'whatsapp-auth': () => import('./whatsapp-auth.js'),
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
### 5. Install the adapter packages (pinned)
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
pnpm install @whiskeysockets/baileys@6.17.16 qrcode@1.5.4 @types/qrcode@1.5.6 pino@9.6.0
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
### 6. Build
|
|
64
|
-
|
|
65
|
-
```bash
|
|
66
|
-
pnpm run build
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
## Credentials
|
|
70
|
-
|
|
71
|
-
WhatsApp uses linked-device authentication — no API key, just a one-time pairing from your phone.
|
|
72
|
-
|
|
73
|
-
### Check current state
|
|
74
|
-
|
|
75
|
-
Check if WhatsApp is already authenticated. If `store/auth/creds.json` exists, skip to "Shared vs dedicated number".
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
test -f store/auth/creds.json && echo "WhatsApp auth exists" || echo "No WhatsApp auth"
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
### Detect environment
|
|
82
|
-
|
|
83
|
-
Check whether the environment is headless (no display server):
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
[[ -z "$DISPLAY" && -z "$WAYLAND_DISPLAY" && "$OSTYPE" != darwin* ]] && echo "IS_HEADLESS=true" || echo "IS_HEADLESS=false"
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### Ask the user
|
|
90
|
-
|
|
91
|
-
Use `AskUserQuestion` to collect configuration. **Adapt auth options based on environment:**
|
|
92
|
-
|
|
93
|
-
If IS_HEADLESS=true AND not WSL → AskUserQuestion: How do you want to authenticate WhatsApp?
|
|
94
|
-
- **Pairing code** (Recommended) - Enter a numeric code on your phone (no camera needed, requires phone number)
|
|
95
|
-
- **QR code in terminal** - Displays QR code in the terminal (can be too small on some displays)
|
|
96
|
-
|
|
97
|
-
Otherwise (macOS, desktop Linux, or WSL) → AskUserQuestion: How do you want to authenticate WhatsApp?
|
|
98
|
-
- **QR code in browser** (Recommended) - Opens a browser window with a large, scannable QR code
|
|
99
|
-
- **Pairing code** - Enter a numeric code on your phone (no camera needed, requires phone number)
|
|
100
|
-
- **QR code in terminal** - Displays QR code in the terminal (can be too small on some displays)
|
|
101
|
-
|
|
102
|
-
If they chose pairing code:
|
|
103
|
-
|
|
104
|
-
AskUserQuestion: What is your phone number? (Digits only — country code followed by your 10-digit number, no + prefix, spaces, or dashes. Example: 14155551234 where 1 is the US country code and 4155551234 is the phone number.)
|
|
105
|
-
|
|
106
|
-
### Clean previous auth state (if re-authenticating)
|
|
107
|
-
|
|
108
|
-
```bash
|
|
109
|
-
rm -rf store/auth/
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
### Run WhatsApp authentication
|
|
113
|
-
|
|
114
|
-
For QR code in browser (recommended):
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
pnpm exec tsx setup/index.ts --step whatsapp-auth -- --method qr-browser
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
(Bash timeout: 150000ms)
|
|
121
|
-
|
|
122
|
-
Tell the user:
|
|
123
|
-
|
|
124
|
-
> A browser window will open with a QR code.
|
|
125
|
-
>
|
|
126
|
-
> 1. Open WhatsApp > **Settings** > **Linked Devices** > **Link a Device**
|
|
127
|
-
> 2. Scan the QR code in the browser
|
|
128
|
-
> 3. The page will show "Authenticated!" when done
|
|
129
|
-
|
|
130
|
-
For QR code in terminal:
|
|
131
|
-
|
|
132
|
-
```bash
|
|
133
|
-
pnpm exec tsx setup/index.ts --step whatsapp-auth -- --method qr-terminal
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
(Bash timeout: 150000ms)
|
|
137
|
-
|
|
138
|
-
Tell the user:
|
|
139
|
-
|
|
140
|
-
> 1. Open WhatsApp > **Settings** > **Linked Devices** > **Link a Device**
|
|
141
|
-
> 2. Scan the QR code displayed in the terminal
|
|
142
|
-
|
|
143
|
-
For pairing code:
|
|
144
|
-
|
|
145
|
-
Tell the user to have WhatsApp open on **Settings > Linked Devices > Link a Device**, ready to tap **"Link with phone number instead"** — the code expires in ~60 seconds and must be entered immediately.
|
|
146
|
-
|
|
147
|
-
Run the auth process in the background and poll `store/pairing-code.txt` for the code:
|
|
148
|
-
|
|
149
|
-
```bash
|
|
150
|
-
rm -f store/pairing-code.txt && pnpm exec tsx setup/index.ts --step whatsapp-auth -- --method pairing-code --phone <their-phone-number> > /tmp/wa-auth.log 2>&1 &
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
Then immediately poll for the code (do NOT wait for the background command to finish):
|
|
154
|
-
|
|
155
|
-
```bash
|
|
156
|
-
for i in $(seq 1 20); do [ -f store/pairing-code.txt ] && cat store/pairing-code.txt && break; sleep 1; done
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
Display the code to the user the moment it appears. Tell them:
|
|
160
|
-
|
|
161
|
-
> **Enter this code now** — it expires in ~60 seconds.
|
|
162
|
-
>
|
|
163
|
-
> 1. Open WhatsApp > **Settings** > **Linked Devices** > **Link a Device**
|
|
164
|
-
> 2. Tap **Link with phone number instead**
|
|
165
|
-
> 3. Enter the code immediately
|
|
166
|
-
|
|
167
|
-
After the user enters the code, poll for authentication to complete:
|
|
168
|
-
|
|
169
|
-
```bash
|
|
170
|
-
for i in $(seq 1 60); do grep -q 'STATUS: authenticated' /tmp/wa-auth.log 2>/dev/null && echo "authenticated" && break; grep -q 'STATUS: failed' /tmp/wa-auth.log 2>/dev/null && echo "failed" && break; sleep 2; done
|
|
171
|
-
```
|
|
172
|
-
|
|
173
|
-
**If failed:** logged_out → delete `store/auth/` and re-run. timeout → ask user, offer retry.
|
|
174
|
-
|
|
175
|
-
### Verify authentication succeeded
|
|
176
|
-
|
|
177
|
-
```bash
|
|
178
|
-
test -f store/auth/creds.json && echo "Authentication successful" || echo "Authentication failed"
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
### Shared vs dedicated number
|
|
182
|
-
|
|
183
|
-
AskUserQuestion: Is this a shared phone number (personal WhatsApp) or a dedicated number?
|
|
184
|
-
- **Shared number** — your personal WhatsApp (bot prefixes messages with its name)
|
|
185
|
-
- **Dedicated number** — a separate phone/SIM for the assistant
|
|
186
|
-
|
|
187
|
-
If dedicated, add to `.env`:
|
|
188
|
-
|
|
189
|
-
```bash
|
|
190
|
-
ASSISTANT_HAS_OWN_NUMBER=true
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
## Next Steps
|
|
194
|
-
|
|
195
|
-
If you're in the middle of `/setup`, return to the setup flow now.
|
|
196
|
-
|
|
197
|
-
Otherwise, run `/manage-channels` to wire this channel to an agent group.
|
|
198
|
-
|
|
199
|
-
## Channel Info
|
|
200
|
-
|
|
201
|
-
- **type**: `whatsapp`
|
|
202
|
-
- **terminology**: WhatsApp calls them "groups" and "chats." A "chat" is a 1:1 DM; a "group" has multiple members.
|
|
203
|
-
- **how-to-find-id**: DMs use `<phone>@s.whatsapp.net` (e.g. `14155551234@s.whatsapp.net`). Groups use `<id>@g.us`. To find your number: `node -e "const c=JSON.parse(require('fs').readFileSync('store/auth/creds.json','utf-8'));console.log(c.me?.id?.split(':')[0]+'@s.whatsapp.net')"`. Groups are auto-discovered — check `sqlite3 data/v2.db "SELECT platform_id, name FROM messaging_groups WHERE channel_type='whatsapp' AND is_group=1"`.
|
|
204
|
-
- **supports-threads**: no
|
|
205
|
-
- **typical-use**: Interactive chat — direct messages or small groups
|
|
206
|
-
- **default-isolation**: Same agent group if you're the only participant across multiple chats. Separate agent group if different people are in different groups.
|
|
207
|
-
|
|
208
|
-
### Features
|
|
209
|
-
|
|
210
|
-
- Markdown formatting — `**bold**`→`*bold*`, `*italic*`→`_italic_`, headings→bold, code blocks preserved
|
|
211
|
-
- Approval questions — `ask_user_question` renders with `/approve`, `/reject` slash commands
|
|
212
|
-
- File attachments — send and receive images, video, audio, documents
|
|
213
|
-
- Reactions — send emoji reactions on messages
|
|
214
|
-
- Typing indicators — composing presence updates
|
|
215
|
-
- Credential requests — text fallback (WhatsApp has no modal support)
|
|
216
|
-
|
|
217
|
-
Not supported (WhatsApp linked device limitation): edit messages, delete messages.
|
|
218
|
-
|
|
219
|
-
## Troubleshooting
|
|
220
|
-
|
|
221
|
-
### QR code expired
|
|
222
|
-
|
|
223
|
-
QR codes expire after ~60 seconds. Re-run the auth command:
|
|
224
|
-
|
|
225
|
-
```bash
|
|
226
|
-
rm -rf store/auth/ && pnpm exec tsx setup/index.ts --step whatsapp-auth -- --method qr-browser
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
### Pairing code not working
|
|
230
|
-
|
|
231
|
-
Codes expire in ~60 seconds. Delete auth and retry:
|
|
232
|
-
|
|
233
|
-
```bash
|
|
234
|
-
rm -rf store/auth/ && pnpm exec tsx setup/index.ts --step whatsapp-auth -- --method pairing-code --phone <phone>
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
Ensure: digits only (no `+`), phone has internet, WhatsApp is updated.
|
|
238
|
-
|
|
239
|
-
If pairing code keeps failing, switch to QR-browser auth instead:
|
|
240
|
-
|
|
241
|
-
```bash
|
|
242
|
-
rm -rf store/auth/ && pnpm exec tsx setup/index.ts --step whatsapp-auth -- --method qr-browser
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
### "waiting for this message" on reactions
|
|
246
|
-
|
|
247
|
-
Signal sessions corrupted from rapid restarts. Clear sessions:
|
|
248
|
-
|
|
249
|
-
```bash
|
|
250
|
-
systemctl --user stop nanoclaw
|
|
251
|
-
rm store/auth/session-*.json
|
|
252
|
-
systemctl --user start nanoclaw
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
### Bot not responding
|
|
256
|
-
|
|
257
|
-
1. Auth exists: `test -f store/auth/creds.json`
|
|
258
|
-
2. Connected: `grep "Connected to WhatsApp" logs/nanoclaw.log | tail -1`
|
|
259
|
-
3. Channel wired: `sqlite3 data/v2.db "SELECT mg.platform_id, mg.name FROM messaging_groups mg JOIN messaging_group_agents mga ON mg.id=mga.messaging_group_id WHERE mg.channel_type='whatsapp'"`
|
|
260
|
-
4. Service running: `systemctl --user status nanoclaw`
|
|
261
|
-
|
|
262
|
-
### "conflict" disconnection
|
|
263
|
-
|
|
264
|
-
Two instances connected with same credentials. Ensure only one NanoClaw process is running.
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
# Remove WhatsApp Cloud API Channel
|
|
2
|
-
|
|
3
|
-
1. Comment out `import './whatsapp-cloud.js'` in `src/channels/index.ts`
|
|
4
|
-
2. Remove `WHATSAPP_ACCESS_TOKEN`, `WHATSAPP_PHONE_NUMBER_ID`, `WHATSAPP_APP_SECRET`, `WHATSAPP_VERIFY_TOKEN` from `.env`
|
|
5
|
-
3. `pnpm uninstall @chat-adapter/whatsapp`
|
|
6
|
-
4. Rebuild and restart
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: add-whatsapp-cloud
|
|
3
|
-
description: Add WhatsApp Business Cloud API channel via Chat SDK. Official Meta API.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Add WhatsApp Cloud API Channel
|
|
7
|
-
|
|
8
|
-
Connect NanoClaw to WhatsApp via the official Meta WhatsApp Business Cloud API.
|
|
9
|
-
|
|
10
|
-
## Install
|
|
11
|
-
|
|
12
|
-
NanoClaw doesn't ship channels in trunk. This skill copies the WhatsApp Cloud 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/whatsapp-cloud.ts` exists
|
|
19
|
-
- `src/channels/index.ts` contains `import './whatsapp-cloud.js';`
|
|
20
|
-
- `@chat-adapter/whatsapp` 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/whatsapp-cloud.ts > src/channels/whatsapp-cloud.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 './whatsapp-cloud.js';
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
### 4. Install the adapter package (pinned)
|
|
45
|
-
|
|
46
|
-
```bash
|
|
47
|
-
pnpm install @chat-adapter/whatsapp@4.26.0
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### 5. Build
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
pnpm run build
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
## Credentials
|
|
57
|
-
|
|
58
|
-
1. Go to [Meta for Developers](https://developers.facebook.com/apps/) and create an app (type: Business).
|
|
59
|
-
2. Add the **WhatsApp** product.
|
|
60
|
-
3. Go to **WhatsApp** > **API Setup**:
|
|
61
|
-
- Note the **Phone Number ID** (not the phone number itself).
|
|
62
|
-
- Generate a **permanent System User access token** with `whatsapp_business_messaging` permission.
|
|
63
|
-
4. Go to **WhatsApp** > **Configuration**:
|
|
64
|
-
- Set webhook URL: `https://your-domain/webhook/whatsapp`.
|
|
65
|
-
- Set a **Verify Token** (any random string you choose).
|
|
66
|
-
- Subscribe to webhook fields: `messages`.
|
|
67
|
-
5. Copy the **App Secret** from **Settings** > **Basic**.
|
|
68
|
-
|
|
69
|
-
### Configure environment
|
|
70
|
-
|
|
71
|
-
Add to `.env`:
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
WHATSAPP_ACCESS_TOKEN=your-system-user-access-token
|
|
75
|
-
WHATSAPP_PHONE_NUMBER_ID=your-phone-number-id
|
|
76
|
-
WHATSAPP_APP_SECRET=your-app-secret
|
|
77
|
-
WHATSAPP_VERIFY_TOKEN=your-verify-token
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Sync to container: `mkdir -p data/env && cp .env data/env/env`
|
|
81
|
-
|
|
82
|
-
## Next Steps
|
|
83
|
-
|
|
84
|
-
If you're in the middle of `/setup`, return to the setup flow now.
|
|
85
|
-
|
|
86
|
-
Otherwise, run `/manage-channels` to wire this channel to an agent group.
|
|
87
|
-
|
|
88
|
-
## Channel Info
|
|
89
|
-
|
|
90
|
-
- **type**: `whatsapp-cloud`
|
|
91
|
-
- **terminology**: WhatsApp Cloud API supports 1:1 conversations only (no group chats). Each conversation is with a phone number.
|
|
92
|
-
- **how-to-find-id**: The platform ID is the Phone Number ID from the Meta Business dashboard (not the phone number itself). Find it under WhatsApp > API Setup.
|
|
93
|
-
- **supports-threads**: no
|
|
94
|
-
- **typical-use**: Interactive 1:1 chat -- direct messages only
|
|
95
|
-
- **default-isolation**: Same agent group if you're the only person messaging the bot. Each additional person who messages gets their own conversation automatically, but they share the agent's workspace and memory -- use a separate agent group if you need information isolation between different contacts.
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: claw
|
|
3
|
-
description: Install the claw CLI tool — run NanoClaw agent containers from the command line without opening a chat app.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# claw — NanoClaw CLI
|
|
7
|
-
|
|
8
|
-
`claw` is a Python CLI that sends prompts directly to a NanoClaw agent container from the terminal. It reads registered groups from the NanoClaw database, picks up secrets from `.env`, and pipes a JSON payload into a container run — no chat app required.
|
|
9
|
-
|
|
10
|
-
## What it does
|
|
11
|
-
|
|
12
|
-
- Send a prompt to any registered group by name, folder, or JID
|
|
13
|
-
- Default target is the main group (no `-g` needed for most use)
|
|
14
|
-
- Resume a previous session with `-s <session-id>`
|
|
15
|
-
- Read prompts from stdin (`--pipe`) for scripting and piping
|
|
16
|
-
- List all registered groups with `--list-groups`
|
|
17
|
-
- Auto-detects `container` or `docker` runtime (or override with `--runtime`)
|
|
18
|
-
- Prints the agent's response to stdout; session ID to stderr
|
|
19
|
-
- Verbose mode (`-v`) shows the command, redacted payload, and exit code
|
|
20
|
-
|
|
21
|
-
## Prerequisites
|
|
22
|
-
|
|
23
|
-
- Python 3.8 or later
|
|
24
|
-
- NanoClaw installed with a built and tagged container image (`nanoclaw-agent:latest`)
|
|
25
|
-
- Either `container` (Apple Container, macOS 15+) or `docker` available in `PATH`
|
|
26
|
-
|
|
27
|
-
## Install
|
|
28
|
-
|
|
29
|
-
Run this skill from within the NanoClaw directory. The script auto-detects its location, so the symlink always points to the right place.
|
|
30
|
-
|
|
31
|
-
### 1. Copy the script
|
|
32
|
-
|
|
33
|
-
```bash
|
|
34
|
-
mkdir -p scripts
|
|
35
|
-
cp "${CLAUDE_SKILL_DIR}/scripts/claw" scripts/claw
|
|
36
|
-
chmod +x scripts/claw
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### 2. Symlink into PATH
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
mkdir -p ~/bin
|
|
43
|
-
ln -sf "$(pwd)/scripts/claw" ~/bin/claw
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
Make sure `~/bin` is in `PATH`. Add this to `~/.zshrc` or `~/.bashrc` if needed:
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
export PATH="$HOME/bin:$PATH"
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
Then reload the shell:
|
|
53
|
-
|
|
54
|
-
```bash
|
|
55
|
-
source ~/.zshrc # or ~/.bashrc
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### 3. Verify
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
claw --list-groups
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
You should see registered groups. If NanoClaw isn't running or the database doesn't exist yet, the list will be empty — that's fine.
|
|
65
|
-
|
|
66
|
-
## Usage Examples
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
# Send a prompt to the main group
|
|
70
|
-
claw "What's on my calendar today?"
|
|
71
|
-
|
|
72
|
-
# Send to a specific group by name (fuzzy match)
|
|
73
|
-
claw -g "family" "Remind everyone about dinner at 7"
|
|
74
|
-
|
|
75
|
-
# Send to a group by exact JID
|
|
76
|
-
claw -j "120363336345536173@g.us" "Hello"
|
|
77
|
-
|
|
78
|
-
# Resume a previous session
|
|
79
|
-
claw -s abc123 "Continue where we left off"
|
|
80
|
-
|
|
81
|
-
# Read prompt from stdin
|
|
82
|
-
echo "Summarize this" | claw --pipe -g dev
|
|
83
|
-
|
|
84
|
-
# Pipe a file
|
|
85
|
-
cat report.txt | claw --pipe "Summarize this report"
|
|
86
|
-
|
|
87
|
-
# List all registered groups
|
|
88
|
-
claw --list-groups
|
|
89
|
-
|
|
90
|
-
# Force a specific runtime
|
|
91
|
-
claw --runtime docker "Hello"
|
|
92
|
-
|
|
93
|
-
# Use a custom image tag (e.g. after rebuilding with a new tag)
|
|
94
|
-
claw --image nanoclaw-agent:dev "Hello"
|
|
95
|
-
|
|
96
|
-
# Verbose mode (debug info, secrets redacted)
|
|
97
|
-
claw -v "Hello"
|
|
98
|
-
|
|
99
|
-
# Custom timeout for long-running tasks
|
|
100
|
-
claw --timeout 600 "Run the full analysis"
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Troubleshooting
|
|
104
|
-
|
|
105
|
-
### "neither 'container' nor 'docker' found"
|
|
106
|
-
|
|
107
|
-
Install Docker Desktop or Apple Container (macOS 15+), or pass `--runtime` explicitly.
|
|
108
|
-
|
|
109
|
-
### "no secrets found in .env"
|
|
110
|
-
|
|
111
|
-
The script auto-detects your NanoClaw directory and reads `.env` from it. Check that the file exists and contains at least one of: `CLAUDE_CODE_OAUTH_TOKEN`, `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`.
|
|
112
|
-
|
|
113
|
-
### Container times out
|
|
114
|
-
|
|
115
|
-
The default timeout is 300 seconds. For longer tasks, pass `--timeout 600` (or higher). If the container consistently hangs, check that your `nanoclaw-agent:latest` image is up to date by running `./container/build.sh`.
|
|
116
|
-
|
|
117
|
-
### "group not found"
|
|
118
|
-
|
|
119
|
-
Run `claw --list-groups` to see what's registered. Group lookup does a fuzzy partial match on name and folder — if your query matches multiple groups, you'll get an error listing the ambiguous matches.
|
|
120
|
-
|
|
121
|
-
### Container crashes mid-stream
|
|
122
|
-
|
|
123
|
-
Containers run with `--rm` so they are automatically removed. If the agent crashes before emitting the output sentinel, `claw` falls back to printing raw stdout. Use `-v` to see what the container produced. Rebuild the image with `./container/build.sh` if crashes are consistent.
|
|
124
|
-
|
|
125
|
-
### Override the NanoClaw directory
|
|
126
|
-
|
|
127
|
-
If `claw` can't find your database or `.env`, set the `NANOCLAW_DIR` environment variable:
|
|
128
|
-
|
|
129
|
-
```bash
|
|
130
|
-
export NANOCLAW_DIR=/path/to/your/nanoclaw
|
|
131
|
-
```
|