@openparachute/agent 0.1.2 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.parachute/module.json +124 -8
- package/LICENSE +2 -16
- package/README.md +118 -166
- package/package.json +35 -42
- 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/dist/assets/index-C-iWdFFV.css +1 -0
- package/web/ui/dist/assets/index-VFETBk0a.js +60 -0
- package/web/ui/dist/index.html +15 -0
- 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,120 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: init-first-agent
|
|
3
|
-
description: Walk the operator through creating the first NanoClaw agent for a DM channel — resolve the operator's channel identity, wire the DM messaging group to a new agent, and trigger a welcome DM via the normal delivery path. Use after channel credentials are configured and the service is running.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Init First Agent
|
|
7
|
-
|
|
8
|
-
Stand up the first NanoClaw agent for a channel and verify end-to-end delivery by having the agent DM the operator. Everything the skill does is idempotent — rerunning is safe.
|
|
9
|
-
|
|
10
|
-
## Prerequisites
|
|
11
|
-
|
|
12
|
-
- **Service running.** Check: `launchctl list | grep nanoclaw` (macOS) or `systemctl --user status nanoclaw` (Linux). If stopped, tell the user to run `/setup` first.
|
|
13
|
-
- **Target channel installed.** At least one `/add-<channel>` skill has run, credentials are in `.env`, and the adapter is uncommented in `src/channels/index.ts`.
|
|
14
|
-
- **Adapter connected.** Tail `logs/nanoclaw.log` — look for a recent `channel setup` / `adapter connected` line for the target channel.
|
|
15
|
-
|
|
16
|
-
## 1. Pick the channel
|
|
17
|
-
|
|
18
|
-
Read `src/channels/index.ts` to find enabled channels (uncommented imports). Cross-check `.env` for the relevant credentials.
|
|
19
|
-
|
|
20
|
-
AskUserQuestion: "Which channel should host the welcome DM?" with one option per enabled channel (Discord, Slack, Telegram, WhatsApp, Webex, Teams, Google Chat, Matrix, iMessage, Resend, …).
|
|
21
|
-
|
|
22
|
-
Record the choice as `CHANNEL` (lowercase, e.g. `discord`).
|
|
23
|
-
|
|
24
|
-
## 2. Ask for the operator's identity
|
|
25
|
-
|
|
26
|
-
Read the channel's own skill for its `## Channel Info > how-to-find-id` section (e.g. `.claude/skills/add-discord/SKILL.md`, `.claude/skills/add-telegram/SKILL.md`). Show those instructions to the user in plain text.
|
|
27
|
-
|
|
28
|
-
Then ask in plain text (NOT `AskUserQuestion` — these are free-form):
|
|
29
|
-
|
|
30
|
-
1. **Your user id on this channel** — e.g. a Discord user ID, Telegram user ID, Slack user ID. Record as `USER_HANDLE`.
|
|
31
|
-
2. **Your display name** — human name, used to name the agent group (`dm-with-<normalized>`) and as the welcome-message addressee. Record as `DISPLAY_NAME`.
|
|
32
|
-
3. **Agent persona name** — the assistant's display name. Default: `DISPLAY_NAME`. Record as `AGENT_NAME`.
|
|
33
|
-
|
|
34
|
-
## 3. Resolve the DM platform id
|
|
35
|
-
|
|
36
|
-
This depends on whether the channel supports cold DM via `adapter.openDM`.
|
|
37
|
-
|
|
38
|
-
**Channels without cold DM (direct-addressable): telegram, whatsapp, imessage, matrix, resend.** The user handle doubles as the DM chat id. Set:
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
PLATFORM_ID=${CHANNEL}:${USER_HANDLE}
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
Skip to step 4.
|
|
45
|
-
|
|
46
|
-
**Channels with cold DM (resolution-required): discord, slack, teams, webex, gchat.** The bot can DM cold at runtime via Chat SDK, but this skill runs standalone — it can't call the adapter. Two resolutions:
|
|
47
|
-
|
|
48
|
-
### 3a. User DMs the bot once (Discord / Slack / Teams / Webex / gChat)
|
|
49
|
-
|
|
50
|
-
Tell the user:
|
|
51
|
-
|
|
52
|
-
> Send any single message to the bot as a DM from your account on `${CHANNEL}`. The router will record the DM as a messaging group. Reply `done` here when you've sent the message.
|
|
53
|
-
|
|
54
|
-
Wait for the user's confirmation. Then look up the most recent DM messaging groups:
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
sqlite3 data/v2.db "SELECT id, platform_id, name, created_at FROM messaging_groups WHERE channel_type='${CHANNEL}' AND is_group=0 ORDER BY created_at DESC LIMIT 5"
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
Show the top rows to the user and confirm which `platform_id` is theirs (usually the most recent). Record as `PLATFORM_ID`. If none appeared, check `logs/nanoclaw.log` for `unknown_sender` drops — the adapter might be rejecting inbound due to connection or permission issues.
|
|
61
|
-
|
|
62
|
-
### 3b. Telegram pair-code path (if the user prefers not to DM first)
|
|
63
|
-
|
|
64
|
-
For Telegram only, there's an existing pair-code primitive. When you run this tool, take the output and extract the pairing code. Then show it to the user in plain text and ask the user to send the code in the Telegram chat to complete the pairing.
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
npx tsx setup/index.ts --step pair-telegram -- --intent new-agent:dm-with-<folder>
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
Parse the `PAIR_TELEGRAM_ISSUED` status block for `CODE` and follow the `REMINDER_TO_ASSISTANT` line in that block. Then wait for the `PAIR_TELEGRAM` block — read `PLATFORM_ID` and `PAIRED_USER_ID` from it. telegram.ts's interceptor has already upserted the user and granted owner if none existed yet. Use `PLATFORM_ID` and `PAIRED_USER_ID` directly in step 4.
|
|
71
|
-
|
|
72
|
-
## 4. Run the init script
|
|
73
|
-
|
|
74
|
-
```bash
|
|
75
|
-
npx tsx scripts/init-first-agent.ts \
|
|
76
|
-
--channel "${CHANNEL}" \
|
|
77
|
-
--user-id "${CHANNEL}:${USER_HANDLE}" \
|
|
78
|
-
--platform-id "${PLATFORM_ID}" \
|
|
79
|
-
--display-name "${DISPLAY_NAME}" \
|
|
80
|
-
--agent-name "${AGENT_NAME}"
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
Add `--welcome "System instruction: ..."` to override the default welcome prompt.
|
|
84
|
-
|
|
85
|
-
The script:
|
|
86
|
-
1. Upserts the `users` row and grants `owner` role if no owner exists.
|
|
87
|
-
2. Creates the `agent_groups` row and calls `initGroupFilesystem` at `groups/dm-with-<name>/`.
|
|
88
|
-
3. Reuses or creates the DM `messaging_groups` row.
|
|
89
|
-
4. Wires them via `messaging_group_agents` (which auto-creates the companion `agent_destinations` row).
|
|
90
|
-
5. Hands the welcome message to the running service via its CLI socket (`data/cli.sock`), targeting the DM messaging group. The service routes it into the DM session, which wakes the container synchronously. If the socket isn't reachable (service down), falls back to a direct `inbound.db` write that the next host sweep picks up.
|
|
91
|
-
|
|
92
|
-
Show the script's output to the user.
|
|
93
|
-
|
|
94
|
-
## 5. Verify
|
|
95
|
-
|
|
96
|
-
The welcome DM is queued synchronously; the only wait is container cold-start (~60s on first launch) before the agent processes the message and the reply flows through `outbound.db` to the channel.
|
|
97
|
-
|
|
98
|
-
Do not tail the log or poll in a sleep loop. Ask the user in plain text:
|
|
99
|
-
|
|
100
|
-
> The welcome DM should arrive shortly. Let me know when you've received it (or if it doesn't arrive within two minutes).
|
|
101
|
-
|
|
102
|
-
Wait for the user's reply. If they confirm receipt, the skill is done.
|
|
103
|
-
|
|
104
|
-
If they say it didn't arrive, then diagnose using the DB directly (no waiting loops required — the message either delivered or it didn't):
|
|
105
|
-
|
|
106
|
-
- `sqlite3 data/v2-sessions/<agent-group-id>/sessions/<session-id>/outbound.db "SELECT id, status, created_at FROM messages_out ORDER BY created_at DESC LIMIT 5"` — check for stuck `pending` rows. Replace `<agent-group-id>` and `<session-id>` with the values from the script's output.
|
|
107
|
-
- `grep -E 'Unauthorized channel destination|container.*exited|error' logs/nanoclaw.log | tail -20` — look for ACL rejections or container crashes.
|
|
108
|
-
- `ls data/v2-sessions/<agent-group-id>/sessions/*/outbound.db` — confirm the session exists.
|
|
109
|
-
|
|
110
|
-
## Troubleshooting
|
|
111
|
-
|
|
112
|
-
**"Missing required args"** — the script wants `--channel`, `--user-id`, `--platform-id`, `--display-name` at minimum. Re-check the command you assembled.
|
|
113
|
-
|
|
114
|
-
**No `messaging_groups` row appears after the user DMs (step 3a)** — the router silently drops messages from unknown senders under `strict` policy but still creates the `messaging_groups` row. If the row is missing entirely, the adapter isn't receiving the inbound message. Check `logs/nanoclaw.log` for adapter errors (auth, gateway disconnect, rate limit).
|
|
115
|
-
|
|
116
|
-
**Owner already exists** — `hasAnyOwner()` returned true, so the grant is skipped silently. That's fine; the script still creates the agent and wiring. Reassigning ownership needs a separate flow (not this skill).
|
|
117
|
-
|
|
118
|
-
**Wrong person got the welcome DM** — the `--platform-id` you passed is someone else's DM channel. Rerun with the correct one; the script is idempotent on user/messaging-group/agent-group but writes a new session welcome each run.
|
|
119
|
-
|
|
120
|
-
**Agent group name collision** — if `dm-with-<display-name>` already exists (e.g. rerunning with the same display name), the script reuses it. Pass a different `--display-name` to get a distinct folder.
|
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: init-onecli
|
|
3
|
-
description: Install and initialize OneCLI Agent Vault. Migrates existing .env credentials to the vault. Use after /update-nanoclaw brings in OneCLI as a breaking change, or for first-time OneCLI setup.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Initialize OneCLI Agent Vault
|
|
7
|
-
|
|
8
|
-
This skill installs OneCLI, configures the Agent Vault gateway, and migrates any existing `.env` credentials into it. Run this after `/update-nanoclaw` introduces OneCLI as a breaking change, or any time OneCLI needs to be set up from scratch.
|
|
9
|
-
|
|
10
|
-
**Principle:** When something is broken or missing, fix it. Don't tell the user to go fix it themselves unless it genuinely requires their manual action (e.g. pasting a token).
|
|
11
|
-
|
|
12
|
-
## Phase 1: Pre-flight
|
|
13
|
-
|
|
14
|
-
### Check if OneCLI is already working
|
|
15
|
-
|
|
16
|
-
```bash
|
|
17
|
-
onecli version 2>/dev/null
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
If the command succeeds, OneCLI is installed, check for an Anthropic secret:
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
onecli secrets list
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
If an Anthropic secret exists, tell the user OneCLI is already configured and working. Use AskUserQuestion:
|
|
27
|
-
|
|
28
|
-
1. **Keep current setup** — description: "OneCLI is installed and has credentials configured. Nothing to do."
|
|
29
|
-
2. **Reconfigure** — description: "Start fresh — reinstall OneCLI and re-register credentials."
|
|
30
|
-
|
|
31
|
-
If they choose to keep, skip to Phase 5 (Verify). If they choose to reconfigure, continue.
|
|
32
|
-
|
|
33
|
-
### Check for native credential proxy
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
grep "credential-proxy" src/index.ts 2>/dev/null
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
If `startCredentialProxy` is imported, the native credential proxy skill is active. Tell the user: "You're currently using the native credential proxy (`.env`-based). This skill will switch you to OneCLI's Agent Vault, which adds per-agent policies and rate limits. Your `.env` credentials will be migrated to the vault."
|
|
40
|
-
|
|
41
|
-
Use AskUserQuestion:
|
|
42
|
-
1. **Continue** — description: "Switch to OneCLI Agent Vault."
|
|
43
|
-
2. **Cancel** — description: "Keep the native credential proxy."
|
|
44
|
-
|
|
45
|
-
If they cancel, stop.
|
|
46
|
-
|
|
47
|
-
### Check the codebase expects OneCLI
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
grep "@onecli-sh/sdk" package.json
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
If `@onecli-sh/sdk` is NOT in package.json, the codebase hasn't been updated to use OneCLI yet. Tell the user to run `/update-nanoclaw` first to get the OneCLI integration, then retry `/init-onecli`. Stop here.
|
|
54
|
-
|
|
55
|
-
## Phase 2: Install OneCLI
|
|
56
|
-
|
|
57
|
-
### Install the gateway and CLI
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
curl -fsSL onecli.sh/install | sh
|
|
61
|
-
curl -fsSL onecli.sh/cli/install | sh
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Verify: `onecli version`
|
|
65
|
-
|
|
66
|
-
If the command is not found, the CLI was likely installed to `~/.local/bin/`. Add it to PATH:
|
|
67
|
-
|
|
68
|
-
```bash
|
|
69
|
-
export PATH="$HOME/.local/bin:$PATH"
|
|
70
|
-
grep -q '.local/bin' ~/.bashrc 2>/dev/null || echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
|
|
71
|
-
grep -q '.local/bin' ~/.zshrc 2>/dev/null || echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
Re-verify with `onecli version`.
|
|
75
|
-
|
|
76
|
-
### Configure the CLI
|
|
77
|
-
|
|
78
|
-
Point the CLI at the local OneCLI instance, the ONECLI_URL was output from the install script above:
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
onecli config set api-host ${ONECLI_URL}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### Set ONECLI_URL in .env
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
grep -q 'ONECLI_URL' .env 2>/dev/null || echo 'ONECLI_URL=${ONECLI_URL}' >> .env
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### Wait for gateway readiness
|
|
91
|
-
|
|
92
|
-
The gateway may take a moment to start after installation. Poll for up to 15 seconds:
|
|
93
|
-
|
|
94
|
-
```bash
|
|
95
|
-
for i in $(seq 1 15); do
|
|
96
|
-
curl -sf ${ONECLI_URL}/health && break
|
|
97
|
-
sleep 1
|
|
98
|
-
done
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
If it never becomes healthy, check if the gateway process is running:
|
|
102
|
-
|
|
103
|
-
```bash
|
|
104
|
-
ps aux | grep -i onecli | grep -v grep
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
If it's not running, try starting it manually: `onecli start`. If that fails, show the error and stop — the user needs to debug their OneCLI installation.
|
|
108
|
-
|
|
109
|
-
## Phase 3: Migrate existing credentials
|
|
110
|
-
|
|
111
|
-
### Scan .env for credentials to migrate
|
|
112
|
-
|
|
113
|
-
Read the `.env` file and look for these credential variables:
|
|
114
|
-
|
|
115
|
-
| .env variable | OneCLI secret type | Host pattern |
|
|
116
|
-
|---|---|---|
|
|
117
|
-
| `ANTHROPIC_API_KEY` | `anthropic` | `api.anthropic.com` |
|
|
118
|
-
| `CLAUDE_CODE_OAUTH_TOKEN` | `anthropic` | `api.anthropic.com` |
|
|
119
|
-
| `ANTHROPIC_AUTH_TOKEN` | `anthropic` | `api.anthropic.com` |
|
|
120
|
-
|
|
121
|
-
Read `.env`:
|
|
122
|
-
|
|
123
|
-
```bash
|
|
124
|
-
cat .env
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
Parse the file for any of the credential variables listed above.
|
|
128
|
-
|
|
129
|
-
### If credentials found in .env
|
|
130
|
-
|
|
131
|
-
For each credential found, migrate it to OneCLI:
|
|
132
|
-
|
|
133
|
-
**Anthropic API key** (`ANTHROPIC_API_KEY=sk-ant-...`):
|
|
134
|
-
```bash
|
|
135
|
-
onecli secrets create --name Anthropic --type anthropic --value <key> --host-pattern api.anthropic.com
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
**Claude OAuth token** (`CLAUDE_CODE_OAUTH_TOKEN=...` or `ANTHROPIC_AUTH_TOKEN=...`):
|
|
139
|
-
```bash
|
|
140
|
-
onecli secrets create --name Anthropic --type anthropic --value <token> --host-pattern api.anthropic.com
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
After successful migration, remove the credential lines from `.env`. Use the Edit tool to remove only the credential variable lines (`ANTHROPIC_API_KEY`, `CLAUDE_CODE_OAUTH_TOKEN`, `ANTHROPIC_AUTH_TOKEN`). Keep all other `.env` entries intact (e.g. `ONECLI_URL`, `TELEGRAM_BOT_TOKEN`, channel tokens).
|
|
144
|
-
|
|
145
|
-
Verify the secret was registered:
|
|
146
|
-
```bash
|
|
147
|
-
onecli secrets list
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
Tell the user: "Migrated your Anthropic credentials from `.env` to the OneCLI Agent Vault. The raw keys have been removed from `.env` — they're now managed by OneCLI and will be injected at request time without entering containers."
|
|
151
|
-
|
|
152
|
-
### Offer to migrate other container-facing credentials
|
|
153
|
-
|
|
154
|
-
After handling Anthropic credentials (whether migrated or freshly registered), scan `.env` again for remaining credential variables that containers use for outbound API calls.
|
|
155
|
-
|
|
156
|
-
**Important:** Only migrate credentials that containers use via outbound HTTPS. Channel tokens (`TELEGRAM_BOT_TOKEN`, `SLACK_BOT_TOKEN`, `SLACK_APP_TOKEN`, `DISCORD_BOT_TOKEN`) are used by the NanoClaw host process to connect to messaging platforms — they must stay in `.env`.
|
|
157
|
-
|
|
158
|
-
Known container-facing credentials:
|
|
159
|
-
|
|
160
|
-
| .env variable | Secret name | Host pattern |
|
|
161
|
-
|---|---|---|
|
|
162
|
-
| `OPENAI_API_KEY` | `OpenAI` | `api.openai.com` |
|
|
163
|
-
| `PARALLEL_API_KEY` | `Parallel` | `api.parallel.ai` |
|
|
164
|
-
|
|
165
|
-
If any of these are found with non-empty values, present them to the user:
|
|
166
|
-
|
|
167
|
-
AskUserQuestion (multiSelect): "These credentials are used by container agents for outbound API calls. Moving them to the vault means agents never see the raw keys, and you can apply rate limits and policies."
|
|
168
|
-
|
|
169
|
-
- One option per credential found (e.g., "OPENAI_API_KEY" — description: "Used by voice transcription and other OpenAI integrations inside containers")
|
|
170
|
-
- **Skip — keep them in .env** — description: "Leave these in .env for now. You can move them later."
|
|
171
|
-
|
|
172
|
-
For each credential the user selects:
|
|
173
|
-
|
|
174
|
-
```bash
|
|
175
|
-
onecli secrets create --name <SecretName> --type api_key --value <value> --host-pattern <host>
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
If there are credential variables not in the table above that look container-facing (i.e. not a channel token), ask the user: "Is `<VARIABLE_NAME>` used by agents inside containers? If so, what API host does it authenticate against? (e.g., `api.example.com`)" — then migrate accordingly.
|
|
179
|
-
|
|
180
|
-
After migration, remove the migrated lines from `.env` using the Edit tool. Keep channel tokens and any credentials the user chose not to migrate.
|
|
181
|
-
|
|
182
|
-
Verify all secrets were registered:
|
|
183
|
-
```bash
|
|
184
|
-
onecli secrets list
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
### If no credentials found in .env
|
|
188
|
-
|
|
189
|
-
No migration needed. Proceed to register credentials fresh.
|
|
190
|
-
|
|
191
|
-
Check if OneCLI already has an Anthropic secret:
|
|
192
|
-
```bash
|
|
193
|
-
onecli secrets list
|
|
194
|
-
```
|
|
195
|
-
|
|
196
|
-
If an Anthropic secret already exists, skip to Phase 4.
|
|
197
|
-
|
|
198
|
-
Otherwise, register credentials using the same flow as `/setup`:
|
|
199
|
-
|
|
200
|
-
AskUserQuestion: Do you want to use your **Claude subscription** (Pro/Max) or an **Anthropic API key**?
|
|
201
|
-
|
|
202
|
-
1. **Claude subscription (Pro/Max)** — description: "Uses your existing Claude Pro or Max subscription. You'll run `claude setup-token` in another terminal to get your token."
|
|
203
|
-
2. **Anthropic API key** — description: "Pay-per-use API key from console.anthropic.com."
|
|
204
|
-
|
|
205
|
-
#### Subscription path
|
|
206
|
-
|
|
207
|
-
Tell the user to run `claude setup-token` in another terminal and copy the token it outputs. Do NOT collect the token in chat.
|
|
208
|
-
|
|
209
|
-
Once they have the token, AskUserQuestion with two options:
|
|
210
|
-
|
|
211
|
-
1. **Dashboard** — description: "Best if you have a browser on this machine. Open ${ONECLI_URL} and add the secret in the UI. Use type 'anthropic' and paste your token as the value."
|
|
212
|
-
2. **CLI** — description: "Best for remote/headless servers. Run: `onecli secrets create --name Anthropic --type anthropic --value YOUR_TOKEN --host-pattern api.anthropic.com`"
|
|
213
|
-
|
|
214
|
-
#### API key path
|
|
215
|
-
|
|
216
|
-
Tell the user to get an API key from https://console.anthropic.com/settings/keys if they don't have one.
|
|
217
|
-
|
|
218
|
-
AskUserQuestion with two options:
|
|
219
|
-
|
|
220
|
-
1. **Dashboard** — description: "Best if you have a browser on this machine. Open ${ONECLI_URL} and add the secret in the UI."
|
|
221
|
-
2. **CLI** — description: "Best for remote/headless servers. Run: `onecli secrets create --name Anthropic --type anthropic --value YOUR_KEY --host-pattern api.anthropic.com`"
|
|
222
|
-
|
|
223
|
-
#### After either path
|
|
224
|
-
|
|
225
|
-
Ask them to let you know when done.
|
|
226
|
-
|
|
227
|
-
**If the user's response happens to contain a token or key** (starts with `sk-ant-` or looks like a token): handle it gracefully — run the `onecli secrets create` command with that value on their behalf.
|
|
228
|
-
|
|
229
|
-
**After user confirms:** verify with `onecli secrets list` that an Anthropic secret exists. If not, ask again.
|
|
230
|
-
|
|
231
|
-
## Phase 4: Build and restart
|
|
232
|
-
|
|
233
|
-
```bash
|
|
234
|
-
pnpm run build
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
If build fails, diagnose and fix. Common issue: `@onecli-sh/sdk` not installed — run `pnpm install` first.
|
|
238
|
-
|
|
239
|
-
Restart the service:
|
|
240
|
-
- macOS (launchd): `launchctl kickstart -k gui/$(id -u)/com.nanoclaw`
|
|
241
|
-
- Linux (systemd): `systemctl --user restart nanoclaw`
|
|
242
|
-
- WSL/manual: stop and re-run `bash start-nanoclaw.sh`
|
|
243
|
-
|
|
244
|
-
## Phase 5: Verify
|
|
245
|
-
|
|
246
|
-
Check logs for successful OneCLI integration:
|
|
247
|
-
|
|
248
|
-
```bash
|
|
249
|
-
tail -30 logs/nanoclaw.log | grep -i "onecli\|gateway"
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
Expected: `OneCLI gateway config applied` messages when containers start.
|
|
253
|
-
|
|
254
|
-
If the service is running and a channel is configured, tell the user to send a test message to verify the agent responds.
|
|
255
|
-
|
|
256
|
-
Tell the user:
|
|
257
|
-
- OneCLI Agent Vault is now managing credentials
|
|
258
|
-
- Agents never see raw API keys — credentials are injected at the gateway level
|
|
259
|
-
- To manage secrets: `onecli secrets list`, or open ${ONECLI_URL}
|
|
260
|
-
- To add rate limits or policies: `onecli rules create --help`
|
|
261
|
-
|
|
262
|
-
## Troubleshooting
|
|
263
|
-
|
|
264
|
-
**"OneCLI gateway not reachable" in logs:** The gateway isn't running. Check with `curl -sf ${ONECLI_URL}/health`. Start it with `onecli start` if needed.
|
|
265
|
-
|
|
266
|
-
**Container gets no credentials:** Verify `ONECLI_URL` is set in `.env` and the gateway has an Anthropic secret (`onecli secrets list`).
|
|
267
|
-
|
|
268
|
-
**Old .env credentials still present:** This skill should have removed them. Double-check `.env` for `ANTHROPIC_API_KEY`, `CLAUDE_CODE_OAUTH_TOKEN`, or `ANTHROPIC_AUTH_TOKEN` and remove them manually if still present.
|
|
269
|
-
|
|
270
|
-
**Port 10254 already in use:** Another OneCLI instance may be running. Check with `lsof -i :10254` and kill the old process, or configure a different port.
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: manage-channels
|
|
3
|
-
description: Wire channels to agent groups, manage isolation levels, add new channel groups. Use after adding a channel, during setup, or standalone to reconfigure.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Manage Channels
|
|
7
|
-
|
|
8
|
-
Wire messaging channels to agent groups. See `docs/isolation-model.md` for the full isolation model.
|
|
9
|
-
|
|
10
|
-
Privilege is a **user-level** concept, not a channel-level one (see `src/db/user-roles.ts`, `src/access.ts`). There is no "main channel" / "main group" — any user can be granted `owner` or `admin` (global or scoped to an agent group) via `grantRole()`, and messages from unknown senders are gated per-messaging-group by `unknown_sender_policy` (`strict` | `request_approval` | `public`).
|
|
11
|
-
|
|
12
|
-
## Assess Current State
|
|
13
|
-
|
|
14
|
-
Read the central DB (`data/v2.db`) — query `agent_groups`, `messaging_groups`, `messaging_group_agents`, `users`, and `user_roles` tables. Also check `.env` for channel tokens and `src/channels/index.ts` for uncommented imports.
|
|
15
|
-
|
|
16
|
-
Categorize channels as: **wired** (has DB entities + messaging_group_agents row), **configured but unwired** (has credentials + barrel import, no DB entities), or **not configured**.
|
|
17
|
-
|
|
18
|
-
If the instance has no owner yet (`SELECT COUNT(*) FROM user_roles WHERE role='owner' AND agent_group_id IS NULL` returns 0), tell the user they should run `/init-first-agent` first — it stands up the first agent group, promotes the operator to owner, and verifies delivery end-to-end by having the agent DM them. Then return here for any additional channels/groups.
|
|
19
|
-
|
|
20
|
-
## First Channel (No Agent Groups Exist)
|
|
21
|
-
|
|
22
|
-
**Delegate to `/init-first-agent`.** It handles: channel choice, operator identity lookup, DM platform id resolution (with cold-DM or pair-code fallback), agent group creation, wiring, and the welcome DM. Return here afterward for any additional channels.
|
|
23
|
-
|
|
24
|
-
## Wire New Channel
|
|
25
|
-
|
|
26
|
-
For each unwired channel:
|
|
27
|
-
|
|
28
|
-
1. Read its SKILL.md `## Channel Info` for terminology, how-to-find-id, typical-use, and default-isolation
|
|
29
|
-
2. Ask for the platform ID using the platform's terminology
|
|
30
|
-
3. Ask the isolation question (see below)
|
|
31
|
-
4. Register with the appropriate flags
|
|
32
|
-
|
|
33
|
-
### Isolation Question
|
|
34
|
-
|
|
35
|
-
Present a multiple-choice with a contextual recommendation. The three options:
|
|
36
|
-
|
|
37
|
-
- **Same conversation** (`--session-mode "agent-shared"` + existing folder) — all messages land in one session. Recommend for webhook + chat combos (GitHub + Slack).
|
|
38
|
-
- **Same agent, separate conversations** (`--session-mode "shared"` + existing folder) — shared workspace/memory, independent threads. Recommend for same user across platforms.
|
|
39
|
-
- **Separate agent** (new `--folder`) — full isolation. Recommend when different people are involved.
|
|
40
|
-
|
|
41
|
-
Use the channel's `typical-use` and `default-isolation` fields to pick the recommendation. Offer to explain more if the user is unsure — reference `docs/isolation-model.md` for the detailed explanation.
|
|
42
|
-
|
|
43
|
-
### Register Command
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
pnpm exec tsx setup/index.ts --step register -- \
|
|
47
|
-
--platform-id "<id>" --name "<name>" \
|
|
48
|
-
--folder "<folder>" --channel "<type>" \
|
|
49
|
-
--session-mode "<shared|agent-shared|per-thread>" \
|
|
50
|
-
--assistant-name "<name>"
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
The `register` step creates the agent group (reusing it if the folder already exists), the messaging group, and the wiring row. `createMessagingGroupAgent` auto-creates the companion `agent_destinations` row so the agent can address the channel by name — no separate destination step needed.
|
|
54
|
-
|
|
55
|
-
For separate agents, also ask for a folder name and optionally a different assistant name.
|
|
56
|
-
|
|
57
|
-
## Add Channel Group
|
|
58
|
-
|
|
59
|
-
When adding another group/chat on an already-configured platform (e.g. a second Telegram group):
|
|
60
|
-
|
|
61
|
-
1. **Telegram:** ask the isolation question first to determine intent (`wire-to:<folder>` for an existing agent, `new-agent:<folder>` for a fresh one). Run `pnpm exec tsx setup/index.ts --step pair-telegram -- --intent <intent>`, show the CODE (follow the `REMINDER_TO_ASSISTANT` line in the `PAIR_TELEGRAM_ISSUED` block) and tell the user to post `@<botname> CODE` in the target group (or DM the bot for a private chat). Wait for the `PAIR_TELEGRAM` block. The inbound interceptor has already created the `messaging_groups` row with `unknown_sender_policy = 'strict'` and upserted the paired user — `register` only needs to add the wiring:
|
|
62
|
-
|
|
63
|
-
```bash
|
|
64
|
-
pnpm exec tsx setup/index.ts --step register -- \
|
|
65
|
-
--platform-id "<PLATFORM_ID>" --name "<group-name>" \
|
|
66
|
-
--folder "<folder>" --channel "telegram" \
|
|
67
|
-
--session-mode "<shared|agent-shared|per-thread>" \
|
|
68
|
-
--assistant-name "<name>"
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
2. **Other channels:** read the channel's SKILL.md `## Channel Info` for terminology and how-to-find-id. Ask for the new group/chat ID, ask the isolation question, then register. No package or credential changes needed.
|
|
72
|
-
|
|
73
|
-
## Change Wiring
|
|
74
|
-
|
|
75
|
-
1. Show current wiring (agent_groups × messaging_group_agents)
|
|
76
|
-
2. Ask which channel to move and to which agent group
|
|
77
|
-
3. Delete the old `messaging_group_agents` entry, create a new one
|
|
78
|
-
4. Note: existing sessions stay with the old agent group; new messages route to the new one. The `agent_destinations` row created for the old wiring is NOT automatically removed — if you want the old agent to stop seeing the channel as a named target, delete it from `agent_destinations` manually.
|
|
79
|
-
|
|
80
|
-
## Show Configuration
|
|
81
|
-
|
|
82
|
-
Display a readable summary showing:
|
|
83
|
-
|
|
84
|
-
- **Agent groups** with their wired channels (from `messaging_group_agents`)
|
|
85
|
-
- **Configured-but-unwired** channels (credentials present, no DB entities)
|
|
86
|
-
- **Unconfigured** channels
|
|
87
|
-
- **Privileged users**: `SELECT user_id, role, agent_group_id FROM user_roles ORDER BY role='owner' DESC`
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: manage-mounts
|
|
3
|
-
description: Configure which host directories agent containers can access. View, add, or remove mount allowlist entries. Triggers on "mounts", "mount allowlist", "agent access to directories", "container mounts".
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Manage Mounts
|
|
7
|
-
|
|
8
|
-
Configure which host directories NanoClaw agent containers can access. The mount allowlist lives at `~/.config/nanoclaw/mount-allowlist.json`.
|
|
9
|
-
|
|
10
|
-
## Show Current Config
|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
cat ~/.config/nanoclaw/mount-allowlist.json 2>/dev/null || echo "No mount allowlist configured"
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
Show the current config to the user in a readable format: which directories are allowed, whether non-main agents are read-only.
|
|
17
|
-
|
|
18
|
-
## Add Directories
|
|
19
|
-
|
|
20
|
-
Ask which directories the user wants agents to access. For each path:
|
|
21
|
-
- Validate the path exists
|
|
22
|
-
- Ask if it should be read-only for non-main agents (default: yes)
|
|
23
|
-
|
|
24
|
-
Build the JSON config and write it:
|
|
25
|
-
|
|
26
|
-
```bash
|
|
27
|
-
npx tsx setup/index.ts --step mounts --force -- --json '{"allowedRoots":[{"path":"/path/to/dir","readOnly":false}],"blockedPatterns":[],"nonMainReadOnly":true}'
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
Use `--force` to overwrite the existing config.
|
|
31
|
-
|
|
32
|
-
## Remove Directories
|
|
33
|
-
|
|
34
|
-
Read the current config, show it, ask which entry to remove, write the updated config.
|
|
35
|
-
|
|
36
|
-
## Reset to Empty
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
npx tsx setup/index.ts --step mounts --force -- --empty
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
## After Changes
|
|
43
|
-
|
|
44
|
-
Restart the service so containers pick up the new config:
|
|
45
|
-
|
|
46
|
-
- macOS: `launchctl kickstart -k gui/$(id -u)/com.nanoclaw`
|
|
47
|
-
- Linux: `systemctl --user restart nanoclaw`
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
# Migrating OpenClaw Cron Jobs to NanoClaw Scheduled Tasks
|
|
2
|
-
|
|
3
|
-
This file is referenced by SKILL.md Phase 5 when cron jobs are detected.
|
|
4
|
-
|
|
5
|
-
**Before inserting tasks:** Read `src/db.ts` and search for `scheduled_tasks` to verify the current table schema. The schema below is a reference — if columns have been added, removed, or renamed, use the current schema from the source code.
|
|
6
|
-
|
|
7
|
-
Also verify the `createTask` function signature in `src/db.ts` — it may be simpler to call it via a script than raw SQL.
|
|
8
|
-
|
|
9
|
-
## OpenClaw Cron Job Format
|
|
10
|
-
|
|
11
|
-
Source: `<STATE_DIR>/cron/jobs.json` (from `src/cron/types.ts`). If the file format doesn't match what's described below, read the actual file and adapt — OpenClaw may have changed the schema.
|
|
12
|
-
|
|
13
|
-
The jobs file is `{ version: 1, jobs: CronJob[] }`. Each job has:
|
|
14
|
-
- `id`, `name`, `description`, `enabled`, `deleteAfterRun`
|
|
15
|
-
- `schedule`: `{ kind: "cron", expr: string, tz?: string }` | `{ kind: "every", everyMs: number }` | `{ kind: "at", at: string }`
|
|
16
|
-
- `payload`: `{ kind: "agentTurn", message: string, model?, thinking?, timeoutSeconds? }` | `{ kind: "systemEvent", text: string }`
|
|
17
|
-
- `sessionTarget`: `"main"` | `"isolated"` | `"current"` | `"session:<id>"`
|
|
18
|
-
- `wakeMode`: `"next-heartbeat"` | `"now"`
|
|
19
|
-
- `delivery`: `{ mode: "none" | "announce" | "webhook", channel?, to?, threadId?, bestEffort? }`
|
|
20
|
-
- `failureAlert`: `{ after?: number, channel?, to?, cooldownMs? }` | `false`
|
|
21
|
-
- `state`: runtime state (nextRunAtMs, lastRunStatus, consecutiveErrors, etc.)
|
|
22
|
-
|
|
23
|
-
## NanoClaw `scheduled_tasks` Table
|
|
24
|
-
|
|
25
|
-
Source: `src/db.ts`
|
|
26
|
-
|
|
27
|
-
| Column | Type | Notes |
|
|
28
|
-
|--------|------|-------|
|
|
29
|
-
| `id` | TEXT PK | Unique task ID |
|
|
30
|
-
| `group_folder` | TEXT | Target group directory (e.g. `"main"`) |
|
|
31
|
-
| `chat_jid` | TEXT | Target chat JID |
|
|
32
|
-
| `prompt` | TEXT | Task instructions |
|
|
33
|
-
| `script` | TEXT | Optional bash pre-check script |
|
|
34
|
-
| `schedule_type` | TEXT | `"cron"`, `"interval"`, or `"once"` |
|
|
35
|
-
| `schedule_value` | TEXT | Cron expr, ms interval, or ISO timestamp |
|
|
36
|
-
| `context_mode` | TEXT | `"group"` or `"isolated"` (default) |
|
|
37
|
-
| `next_run` | TEXT | ISO timestamp — must be computed at insert time |
|
|
38
|
-
| `last_run` | TEXT | null initially |
|
|
39
|
-
| `last_result` | TEXT | null initially |
|
|
40
|
-
| `status` | TEXT | `"active"`, `"paused"`, or `"completed"` |
|
|
41
|
-
| `created_at` | TEXT | ISO timestamp |
|
|
42
|
-
|
|
43
|
-
## Field Mapping
|
|
44
|
-
|
|
45
|
-
- `schedule.kind:"cron"` + `schedule.expr` → `schedule_type:"cron"`, `schedule_value:<expr>`
|
|
46
|
-
- `schedule.kind:"every"` + `schedule.everyMs` → `schedule_type:"interval"`, `schedule_value:<ms as string>`
|
|
47
|
-
- `schedule.kind:"at"` + `schedule.at` → `schedule_type:"once"`, `schedule_value:<ISO timestamp>`
|
|
48
|
-
- `payload.message` or `payload.text` → `prompt`
|
|
49
|
-
- `sessionTarget:"isolated"` → `context_mode:"isolated"`, `sessionTarget:"main"` or `"current"` → `context_mode:"group"`
|
|
50
|
-
|
|
51
|
-
## What Doesn't Map
|
|
52
|
-
|
|
53
|
-
- `delivery.mode:"webhook"` — NanoClaw has no webhook delivery. Discuss with the user: this could be implemented as a task `script` that runs `curl` to hit the webhook endpoint.
|
|
54
|
-
- `failureAlert` — NanoClaw has no failure alert system. Note this to the user.
|
|
55
|
-
- `wakeMode` — NanoClaw tasks always wake the agent immediately.
|
|
56
|
-
- `payload.model`, `payload.thinking`, `payload.timeoutSeconds` — NanoClaw doesn't support per-task model/thinking config. These are handled by the SDK.
|
|
57
|
-
- `deleteAfterRun` — NanoClaw `"once"` tasks are marked `"completed"` after running, not deleted.
|
|
58
|
-
|
|
59
|
-
## For Each Enabled Job
|
|
60
|
-
|
|
61
|
-
1. Show what it does: name, schedule, prompt, delivery mode
|
|
62
|
-
2. Explain any differences (no retry config, no webhook delivery, no failure alerts)
|
|
63
|
-
3. If `delivery.mode:"webhook"`: discuss with the user — a task `script` with `curl` often suffices
|
|
64
|
-
4. Ask if they want to keep this task
|
|
65
|
-
|
|
66
|
-
## Inserting Tasks
|
|
67
|
-
|
|
68
|
-
Insert directly into the SQLite database. This requires groups to be registered first (Phase 1). Use the registered group's `folder` and `chat_jid`:
|
|
69
|
-
|
|
70
|
-
```bash
|
|
71
|
-
pnpm exec tsx -e "
|
|
72
|
-
const Database = require('better-sqlite3');
|
|
73
|
-
const { CronExpressionParser } = require('cron-parser');
|
|
74
|
-
const db = new Database('store/messages.db');
|
|
75
|
-
// Compute next_run for cron tasks:
|
|
76
|
-
// const interval = CronExpressionParser.parse('<expr>', { tz: process.env.TZ || 'UTC' });
|
|
77
|
-
// const nextRun = interval.next().toISOString();
|
|
78
|
-
db.prepare(\`INSERT INTO scheduled_tasks (id, group_folder, chat_jid, prompt, script, schedule_type, schedule_value, context_mode, next_run, status, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\`).run(
|
|
79
|
-
'migrated-<original-id>',
|
|
80
|
-
'<group_folder>',
|
|
81
|
-
'<chat_jid>',
|
|
82
|
-
'<mapped prompt>',
|
|
83
|
-
null,
|
|
84
|
-
'<mapped schedule_type>',
|
|
85
|
-
'<mapped schedule_value>',
|
|
86
|
-
'<mapped context_mode>',
|
|
87
|
-
'<computed next_run ISO>',
|
|
88
|
-
'active',
|
|
89
|
-
new Date().toISOString()
|
|
90
|
-
);
|
|
91
|
-
db.close();
|
|
92
|
-
"
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
**Computing `next_run`:**
|
|
96
|
-
- `cron` tasks: use `CronExpressionParser.parse(expr, { tz }).next().toISOString()`
|
|
97
|
-
- `interval` tasks: `new Date(Date.now() + ms).toISOString()`
|
|
98
|
-
- `once` tasks: `next_run` equals `schedule_value`
|
|
99
|
-
|
|
100
|
-
If groups haven't been registered yet (database doesn't exist), save the task details to `groups/main/openclaw-migration-tasks.md` with the exact SQL payloads, and tell the user: "These tasks will be created after `/setup` registers your groups."
|