@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
package/scripts/test-v2-host.ts
DELETED
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Real end-to-end test of v2: host router → Docker container → agent-runner → delivery.
|
|
3
|
-
*
|
|
4
|
-
* 1. Init central DB with agent group + messaging group + wiring
|
|
5
|
-
* 2. Route an inbound message (creates session, writes inbound.db, spawns container)
|
|
6
|
-
* 3. Container runs v2 agent-runner, polls inbound.db, queries Claude, writes outbound.db
|
|
7
|
-
* 4. Poll outbound.db for messages_out response
|
|
8
|
-
*
|
|
9
|
-
* Usage: pnpm exec tsx scripts/test-v2-host.ts
|
|
10
|
-
*/
|
|
11
|
-
import Database from 'better-sqlite3';
|
|
12
|
-
import fs from 'fs';
|
|
13
|
-
import path from 'path';
|
|
14
|
-
|
|
15
|
-
const TEST_DIR = '/tmp/paraclaw-v2-e2e';
|
|
16
|
-
if (fs.existsSync(TEST_DIR)) fs.rmSync(TEST_DIR, { recursive: true });
|
|
17
|
-
fs.mkdirSync(TEST_DIR, { recursive: true });
|
|
18
|
-
|
|
19
|
-
// --- Step 1: Init central DB ---
|
|
20
|
-
console.log('\n=== Step 1: Init central DB ===');
|
|
21
|
-
|
|
22
|
-
import { initDb } from '../src/db/connection.js';
|
|
23
|
-
import { runMigrations } from '../src/db/migrations/index.js';
|
|
24
|
-
import { createAgentGroup } from '../src/db/agent-groups.js';
|
|
25
|
-
import { createMessagingGroup, createMessagingGroupAgent } from '../src/db/messaging-groups.js';
|
|
26
|
-
|
|
27
|
-
const centralDb = initDb(path.join(TEST_DIR, 'v2.db'));
|
|
28
|
-
runMigrations(centralDb);
|
|
29
|
-
|
|
30
|
-
// Create groups dir for agent folder mount
|
|
31
|
-
const groupsDir = path.resolve(process.cwd(), 'groups');
|
|
32
|
-
const testGroupDir = path.join(groupsDir, 'test-agent-e2e');
|
|
33
|
-
fs.mkdirSync(testGroupDir, { recursive: true });
|
|
34
|
-
fs.writeFileSync(path.join(testGroupDir, 'CLAUDE.md'), '# Test Agent\nYou are a test agent. Be brief.\n');
|
|
35
|
-
|
|
36
|
-
createAgentGroup({
|
|
37
|
-
id: 'ag-e2e',
|
|
38
|
-
name: 'E2E Test Agent',
|
|
39
|
-
folder: 'test-agent-e2e',
|
|
40
|
-
agent_provider: 'claude',
|
|
41
|
-
created_at: new Date().toISOString(),
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
createMessagingGroup({
|
|
45
|
-
id: 'mg-e2e',
|
|
46
|
-
channel_type: 'test',
|
|
47
|
-
platform_id: 'e2e-channel',
|
|
48
|
-
name: 'E2E Test Channel',
|
|
49
|
-
is_group: 0,
|
|
50
|
-
unknown_sender_policy: 'public',
|
|
51
|
-
created_at: new Date().toISOString(),
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
createMessagingGroupAgent({
|
|
55
|
-
id: 'mga-e2e',
|
|
56
|
-
messaging_group_id: 'mg-e2e',
|
|
57
|
-
agent_group_id: 'ag-e2e',
|
|
58
|
-
engage_mode: 'pattern',
|
|
59
|
-
engage_pattern: '.',
|
|
60
|
-
sender_scope: 'all',
|
|
61
|
-
ignored_message_policy: 'drop',
|
|
62
|
-
session_mode: 'shared',
|
|
63
|
-
priority: 0,
|
|
64
|
-
created_at: new Date().toISOString(),
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
console.log('✓ Central DB initialized');
|
|
68
|
-
|
|
69
|
-
// --- Step 2: Route inbound message (spawns container) ---
|
|
70
|
-
console.log('\n=== Step 2: Route inbound message ===');
|
|
71
|
-
|
|
72
|
-
import { routeInbound } from '../src/router.js';
|
|
73
|
-
import { findSession } from '../src/db/sessions.js';
|
|
74
|
-
import { inboundDbPath, outboundDbPath } from '../src/session-manager.js';
|
|
75
|
-
|
|
76
|
-
await routeInbound({
|
|
77
|
-
channelType: 'test',
|
|
78
|
-
platformId: 'e2e-channel',
|
|
79
|
-
threadId: null,
|
|
80
|
-
message: {
|
|
81
|
-
id: 'msg-e2e-1',
|
|
82
|
-
kind: 'chat',
|
|
83
|
-
content: JSON.stringify({
|
|
84
|
-
sender: 'Gavriel',
|
|
85
|
-
text: 'Say "E2E works!" and nothing else. Do not use any tools.',
|
|
86
|
-
}),
|
|
87
|
-
timestamp: new Date().toISOString(),
|
|
88
|
-
},
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
const session = findSession('mg-e2e', null);
|
|
92
|
-
if (!session) {
|
|
93
|
-
console.log('✗ No session created!');
|
|
94
|
-
process.exit(1);
|
|
95
|
-
}
|
|
96
|
-
console.log(`✓ Session: ${session.id}`);
|
|
97
|
-
console.log(`✓ Container status: ${session.container_status}`);
|
|
98
|
-
|
|
99
|
-
const inDbPath = inboundDbPath('ag-e2e', session.id);
|
|
100
|
-
const outDbPath = outboundDbPath('ag-e2e', session.id);
|
|
101
|
-
console.log(`✓ Inbound DB: ${inDbPath}`);
|
|
102
|
-
console.log(`✓ Outbound DB: ${outDbPath}`);
|
|
103
|
-
|
|
104
|
-
// --- Step 3: Wait for response ---
|
|
105
|
-
console.log('\n=== Step 3: Waiting for Claude response... ===');
|
|
106
|
-
|
|
107
|
-
const startTime = Date.now();
|
|
108
|
-
const TIMEOUT_MS = 120_000;
|
|
109
|
-
|
|
110
|
-
const checkForResponse = (): boolean => {
|
|
111
|
-
try {
|
|
112
|
-
const db = new Database(outDbPath, { readonly: true });
|
|
113
|
-
const out = db.prepare('SELECT * FROM messages_out').all() as Array<Record<string, unknown>>;
|
|
114
|
-
db.close();
|
|
115
|
-
return out.length > 0;
|
|
116
|
-
} catch {
|
|
117
|
-
return false;
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
await new Promise<void>((resolve) => {
|
|
122
|
-
const poll = () => {
|
|
123
|
-
if (checkForResponse()) {
|
|
124
|
-
resolve();
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
if (Date.now() - startTime > TIMEOUT_MS) {
|
|
128
|
-
console.log(`\n✗ Timed out after ${TIMEOUT_MS / 1000}s`);
|
|
129
|
-
printState();
|
|
130
|
-
process.exit(1);
|
|
131
|
-
}
|
|
132
|
-
const elapsed = Math.floor((Date.now() - startTime) / 1000);
|
|
133
|
-
if (elapsed > 0 && elapsed % 10 === 0) {
|
|
134
|
-
process.stdout.write(` ${elapsed}s...`);
|
|
135
|
-
}
|
|
136
|
-
setTimeout(poll, 1000);
|
|
137
|
-
};
|
|
138
|
-
poll();
|
|
139
|
-
});
|
|
140
|
-
|
|
141
|
-
// --- Step 4: Print results ---
|
|
142
|
-
console.log('\n\n=== Results ===');
|
|
143
|
-
printState();
|
|
144
|
-
|
|
145
|
-
// Clean up test group dir
|
|
146
|
-
fs.rmSync(testGroupDir, { recursive: true, force: true });
|
|
147
|
-
|
|
148
|
-
process.exit(0);
|
|
149
|
-
|
|
150
|
-
function printState() {
|
|
151
|
-
try {
|
|
152
|
-
const inDb = new Database(inDbPath, { readonly: true });
|
|
153
|
-
const inRows = inDb.prepare('SELECT * FROM messages_in').all() as Array<Record<string, unknown>>;
|
|
154
|
-
inDb.close();
|
|
155
|
-
|
|
156
|
-
console.log('\nmessages_in (inbound.db):');
|
|
157
|
-
for (const r of inRows) {
|
|
158
|
-
console.log(` [${r.id}] status=${r.status} kind=${r.kind}`);
|
|
159
|
-
}
|
|
160
|
-
} catch (err) {
|
|
161
|
-
console.log(` (could not read inbound DB: ${err})`);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
try {
|
|
165
|
-
const outDb = new Database(outDbPath, { readonly: true });
|
|
166
|
-
const outRows = outDb.prepare('SELECT * FROM messages_out').all() as Array<Record<string, unknown>>;
|
|
167
|
-
const ackRows = outDb.prepare('SELECT * FROM processing_ack').all() as Array<Record<string, unknown>>;
|
|
168
|
-
outDb.close();
|
|
169
|
-
|
|
170
|
-
console.log('\nmessages_out (outbound.db):');
|
|
171
|
-
for (const r of outRows) {
|
|
172
|
-
const content = JSON.parse(r.content as string);
|
|
173
|
-
console.log(` [${r.id}] kind=${r.kind}`);
|
|
174
|
-
console.log(` → ${content.text}`);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
console.log('\nprocessing_ack (outbound.db):');
|
|
178
|
-
for (const r of ackRows) {
|
|
179
|
-
console.log(` [${r.message_id}] status=${r.status} changed=${r.status_changed}`);
|
|
180
|
-
}
|
|
181
|
-
} catch (err) {
|
|
182
|
-
console.log(` (could not read outbound DB: ${err})`);
|
|
183
|
-
}
|
|
184
|
-
}
|
package/src/channels/adapter.ts
DELETED
|
@@ -1,214 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* v2 Channel Adapter interface.
|
|
3
|
-
*
|
|
4
|
-
* Channel adapters bridge Paraclaw with messaging platforms (Discord, Slack, etc.).
|
|
5
|
-
* Two patterns: native adapters (implement directly) or Chat SDK bridge (wrap a Chat SDK adapter).
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/** Passed to the adapter at setup time. */
|
|
9
|
-
export interface ChannelSetup {
|
|
10
|
-
/** Called when an inbound message arrives from the platform. */
|
|
11
|
-
onInbound(platformId: string, threadId: string | null, message: InboundMessage): void | Promise<void>;
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Called by admin-transport adapters (CLI) that want to route a message to
|
|
15
|
-
* an arbitrary channel/platform and optionally redirect replies elsewhere.
|
|
16
|
-
* Regular chat adapters should use `onInbound`; `onInboundEvent` skips the
|
|
17
|
-
* adapter-channel-type injection so the caller can target any wired mg.
|
|
18
|
-
*/
|
|
19
|
-
onInboundEvent(event: InboundEvent): void | Promise<void>;
|
|
20
|
-
|
|
21
|
-
/** Called when the adapter discovers metadata about a conversation. */
|
|
22
|
-
onMetadata(platformId: string, name?: string, isGroup?: boolean): void;
|
|
23
|
-
|
|
24
|
-
/** Called when a user clicks a button/action in a card (e.g., ask_user_question response). */
|
|
25
|
-
onAction(questionId: string, selectedOption: string, userId: string): void;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/** Delivery address used for reply-to overrides and (normally) the inbound's own origin. */
|
|
29
|
-
export interface DeliveryAddress {
|
|
30
|
-
channelType: string;
|
|
31
|
-
platformId: string;
|
|
32
|
-
threadId: string | null;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Full inbound event handed to the router.
|
|
37
|
-
*
|
|
38
|
-
* `channelType` + `platformId` + `threadId` identify which messaging group /
|
|
39
|
-
* session receives the message. `replyTo`, when set, overrides where the
|
|
40
|
-
* agent's reply is delivered — used by the CLI admin transport when the
|
|
41
|
-
* operator wants a message routed to one channel but replies echoed back to
|
|
42
|
-
* their terminal. Agents cannot set `replyTo`; it is a router-layer concept
|
|
43
|
-
* set only by external adapters carrying operator intent.
|
|
44
|
-
*/
|
|
45
|
-
export interface InboundEvent {
|
|
46
|
-
channelType: string;
|
|
47
|
-
platformId: string;
|
|
48
|
-
threadId: string | null;
|
|
49
|
-
message: {
|
|
50
|
-
id: string;
|
|
51
|
-
kind: 'chat' | 'chat-sdk';
|
|
52
|
-
content: string; // JSON blob
|
|
53
|
-
timestamp: string;
|
|
54
|
-
/**
|
|
55
|
-
* Platform-confirmed bot-mention signal forwarded from the adapter.
|
|
56
|
-
* See InboundMessage.isMention for the full explanation.
|
|
57
|
-
*/
|
|
58
|
-
isMention?: boolean;
|
|
59
|
-
/** True when the source is a group/channel thread, false for DMs. */
|
|
60
|
-
isGroup?: boolean;
|
|
61
|
-
};
|
|
62
|
-
replyTo?: DeliveryAddress;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/** Inbound message from adapter to host. */
|
|
66
|
-
export interface InboundMessage {
|
|
67
|
-
id: string;
|
|
68
|
-
kind: 'chat' | 'chat-sdk';
|
|
69
|
-
content: unknown; // JS object — host will JSON.stringify before writing to session DB
|
|
70
|
-
timestamp: string;
|
|
71
|
-
/**
|
|
72
|
-
* Platform-confirmed signal that this message is a mention of the bot.
|
|
73
|
-
*
|
|
74
|
-
* Set by adapters that know the platform's own mention semantics — e.g.
|
|
75
|
-
* the Chat SDK bridge sets it true from `onNewMention` / `onDirectMessage`
|
|
76
|
-
* and forwards `message.isMention` from `onSubscribedMessage`. Use this
|
|
77
|
-
* in the router instead of agent-name regex matching, which breaks on
|
|
78
|
-
* platforms where the mention text is the bot's platform username (e.g.
|
|
79
|
-
* Telegram's `@paraclaw_refactr_bot`) rather than the agent_group
|
|
80
|
-
* display name (e.g. `@Andy`).
|
|
81
|
-
*
|
|
82
|
-
* Adapters that don't set it (native / legacy) leave it undefined — the
|
|
83
|
-
* router falls back to text-match against agent_group_name.
|
|
84
|
-
*/
|
|
85
|
-
isMention?: boolean;
|
|
86
|
-
/** True when the source is a group/channel thread, false for DMs. */
|
|
87
|
-
isGroup?: boolean;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/** A file attachment to deliver alongside a message. */
|
|
91
|
-
export interface OutboundFile {
|
|
92
|
-
filename: string;
|
|
93
|
-
data: Buffer;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/** Outbound message from host to adapter. */
|
|
97
|
-
export interface OutboundMessage {
|
|
98
|
-
kind: string;
|
|
99
|
-
content: unknown; // parsed JSON from messages_out
|
|
100
|
-
files?: OutboundFile[]; // file attachments from the session outbox
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/** Discovered conversation info (from syncConversations). */
|
|
104
|
-
export interface ConversationInfo {
|
|
105
|
-
platformId: string;
|
|
106
|
-
name: string;
|
|
107
|
-
isGroup: boolean;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/** The v2 channel adapter contract. */
|
|
111
|
-
export interface ChannelAdapter {
|
|
112
|
-
name: string;
|
|
113
|
-
channelType: string;
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Stable per-bot identity used as the second segment of v2 platform_ids
|
|
117
|
-
* (`<channel>:<botId>:<native>`). Null/undefined for adapters that have
|
|
118
|
-
* no bot dimension at all (CLI admin transport). Resolved at adapter
|
|
119
|
-
* factory time — Telegram via `getMe.id`, Discord via
|
|
120
|
-
* `DISCORD_APPLICATION_ID`. Used by the registry to look up the right
|
|
121
|
-
* adapter when delivering a v2 platform_id back out.
|
|
122
|
-
*/
|
|
123
|
-
botId?: string | null;
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* Whether this adapter models conversations as threads.
|
|
127
|
-
*
|
|
128
|
-
* true — adapter's platform uses threads as the primary conversation unit
|
|
129
|
-
* (Discord, Slack, Linear, GitHub). One thread = one session; the
|
|
130
|
-
* agent replies into the originating thread.
|
|
131
|
-
* false — adapter's platform treats the channel itself as the conversation
|
|
132
|
-
* (Telegram, WhatsApp, iMessage). Thread ids are stripped at the
|
|
133
|
-
* router; agent replies go to the channel.
|
|
134
|
-
*/
|
|
135
|
-
supportsThreads: boolean;
|
|
136
|
-
|
|
137
|
-
// Lifecycle
|
|
138
|
-
setup(config: ChannelSetup): Promise<void>;
|
|
139
|
-
teardown(): Promise<void>;
|
|
140
|
-
isConnected(): boolean;
|
|
141
|
-
|
|
142
|
-
// Outbound delivery — returns the platform message ID if available
|
|
143
|
-
deliver(platformId: string, threadId: string | null, message: OutboundMessage): Promise<string | undefined>;
|
|
144
|
-
|
|
145
|
-
// Optional
|
|
146
|
-
setTyping?(platformId: string, threadId: string | null): Promise<void>;
|
|
147
|
-
syncConversations?(): Promise<ConversationInfo[]>;
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Subscribe the bot to a thread so follow-up messages route via the
|
|
151
|
-
* platform's "subscribed message" path (onSubscribedMessage in Chat SDK).
|
|
152
|
-
* Called by the router when a mention-sticky wiring first engages in a
|
|
153
|
-
* thread. Idempotent: calling twice on the same thread is a no-op.
|
|
154
|
-
*
|
|
155
|
-
* Platforms without a subscription concept can omit this; the router
|
|
156
|
-
* treats absence as a no-op.
|
|
157
|
-
*/
|
|
158
|
-
subscribe?(platformId: string, threadId: string): Promise<void>;
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Open (or fetch) a DM with this user, returning the platform_id of the
|
|
162
|
-
* resulting DM channel. Called by the host on demand to initiate cold
|
|
163
|
-
* DMs — approvals, pairing handshakes, host-initiated notifications — to
|
|
164
|
-
* users who may never have messaged the bot themselves.
|
|
165
|
-
*
|
|
166
|
-
* Omit this method on channels where the user handle IS already the DM
|
|
167
|
-
* chat id (Telegram, WhatsApp, iMessage, email, Matrix). Callers will
|
|
168
|
-
* fall through to using the handle directly.
|
|
169
|
-
*
|
|
170
|
-
* For channels that distinguish user id from DM channel id (Discord,
|
|
171
|
-
* Slack, Teams, Webex, gChat): implement by delegating to Chat SDK's
|
|
172
|
-
* chat.openDM, which hits the platform's idempotent open-DM endpoint.
|
|
173
|
-
* Returning the same platform_id on repeated calls is expected.
|
|
174
|
-
*/
|
|
175
|
-
openDM?(userHandle: string): Promise<string>;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/** Factory function that creates a channel adapter (returns null if credentials missing). */
|
|
179
|
-
export type ChannelAdapterFactory = () => ChannelAdapter | null | Promise<ChannelAdapter | null>;
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Build an adapter from a stored secret. Channel modules implement this so
|
|
183
|
-
* the registry's secrets-backed startup scan and the dynamic register-bot
|
|
184
|
-
* endpoint can spawn additional bot adapters beyond the `.env`-defined
|
|
185
|
-
* primary, without channel-registry needing to know per-channel internals.
|
|
186
|
-
*
|
|
187
|
-
* Receives the full secret name (e.g. `CHANNEL_BOT_TOKEN:discord:9128…`)
|
|
188
|
-
* and its plaintext value (the bot token). Adapters that need more than
|
|
189
|
-
* just a token (Discord needs `applicationId`) parse it out of the name's
|
|
190
|
-
* trailing segment, which by convention is the bot's identity.
|
|
191
|
-
*
|
|
192
|
-
* Returns the adapter ready for `setup()`; the caller wires up host
|
|
193
|
-
* callbacks. Returns null if the secret can't produce a viable adapter
|
|
194
|
-
* (e.g. token rejected by the platform); callers log + skip.
|
|
195
|
-
*/
|
|
196
|
-
export type ChannelSpawnFromSecret = (secretName: string, secretValue: string) => Promise<ChannelAdapter | null>;
|
|
197
|
-
|
|
198
|
-
/** Registration entry for a channel adapter. */
|
|
199
|
-
export interface ChannelRegistration {
|
|
200
|
-
factory: ChannelAdapterFactory;
|
|
201
|
-
/**
|
|
202
|
-
* Optional. Channels that support multi-bot operation expose this so the
|
|
203
|
-
* registry can spawn additional bots from `CHANNEL_BOT_TOKEN:<channel>:*`
|
|
204
|
-
* secrets at boot time and on-demand via the register-bot HTTP endpoint.
|
|
205
|
-
*
|
|
206
|
-
* Channels without it support exactly one bot per install (the
|
|
207
|
-
* `.env`-defined primary).
|
|
208
|
-
*/
|
|
209
|
-
spawnFromSecret?: ChannelSpawnFromSecret;
|
|
210
|
-
containerConfig?: {
|
|
211
|
-
mounts?: Array<{ hostPath: string; containerPath: string; readonly: boolean }>;
|
|
212
|
-
env?: Record<string, string>;
|
|
213
|
-
};
|
|
214
|
-
}
|