@openparachute/agent 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.parachute/module.json +124 -8
- package/LICENSE +2 -16
- package/README.md +118 -166
- package/package.json +32 -43
- package/scripts/spawn-agent.ts +371 -0
- package/src/_parked/interactive-spawn.test.ts +324 -0
- package/src/_parked/interactive-spawn.ts +701 -0
- package/src/agent-defs.test.ts +1504 -0
- package/src/agent-defs.ts +1702 -0
- package/src/agent-mcp-config.test.ts +115 -0
- package/src/agent-mcp-config.ts +115 -0
- package/src/agents.test.ts +360 -0
- package/src/agents.ts +379 -0
- package/src/auth.test.ts +46 -0
- package/src/auth.ts +140 -0
- package/src/backends/attached-queue.test.ts +376 -0
- package/src/backends/attached-queue.ts +372 -0
- package/src/backends/programmatic.test.ts +1715 -0
- package/src/backends/programmatic.ts +927 -0
- package/src/backends/registry.test.ts +1494 -0
- package/src/backends/registry.ts +1202 -0
- package/src/backends/stream-json.test.ts +570 -0
- package/src/backends/stream-json.ts +392 -0
- package/src/backends/types.ts +223 -0
- package/src/bridge.ts +417 -0
- package/src/channel-backend-wiring.test.ts +237 -0
- package/src/credentials.test.ts +274 -0
- package/src/credentials.ts +380 -0
- package/src/cron.test.ts +342 -0
- package/src/cron.ts +380 -0
- package/src/daemon-agent-def-api.test.ts +166 -0
- package/src/daemon-agent-defs-api.test.ts +953 -0
- package/src/daemon-agent-env-api.test.ts +338 -0
- package/src/daemon-attached-queue-store.test.ts +65 -0
- package/src/daemon-config-api.test.ts +962 -0
- package/src/daemon-jobs-api.test.ts +271 -0
- package/src/daemon-vault-chat.test.ts +250 -0
- package/src/daemon.test.ts +746 -0
- package/src/daemon.ts +3314 -0
- package/src/def-vaults.test.ts +136 -0
- package/src/def-vaults.ts +165 -0
- package/src/delivery-state.test.ts +110 -0
- package/src/delivery-state.ts +154 -0
- package/src/effective-env.test.ts +114 -0
- package/src/effective-env.ts +184 -0
- package/src/env-compat.ts +39 -0
- package/src/grants.test.ts +638 -0
- package/src/grants.ts +675 -0
- package/src/hub-jwt.test.ts +161 -0
- package/src/hub-jwt.ts +182 -0
- package/src/jobs.test.ts +245 -0
- package/src/jobs.ts +266 -0
- package/src/mcp-http.test.ts +265 -0
- package/src/mcp-http.ts +771 -0
- package/src/mint-token.test.ts +152 -0
- package/src/mint-token.ts +139 -0
- package/src/module-manifest.test.ts +158 -0
- package/src/oauth-discovery.ts +134 -0
- package/src/programmatic-wiring.test.ts +838 -0
- package/src/registry.test.ts +227 -0
- package/src/registry.ts +228 -0
- package/src/resolve-port.test.ts +64 -0
- package/src/routing.test.ts +184 -0
- package/src/routing.ts +76 -0
- package/src/runner.test.ts +506 -0
- package/src/runner.ts +255 -0
- package/src/sandbox/config.test.ts +150 -0
- package/src/sandbox/config.ts +102 -0
- package/src/sandbox/egress.test.ts +113 -0
- package/src/sandbox/egress.ts +123 -0
- package/src/sandbox/index.ts +180 -0
- package/src/sandbox/live-seatbelt.test.ts +277 -0
- package/src/sandbox/mounts.test.ts +154 -0
- package/src/sandbox/mounts.ts +133 -0
- package/src/sandbox/sandbox.test.ts +168 -0
- package/src/sandbox/types.ts +382 -0
- package/src/services-manifest.test.ts +106 -0
- package/src/services-manifest.ts +95 -0
- package/src/spa-serve.test.ts +116 -0
- package/src/spa-serve.ts +116 -0
- package/src/spawn-agent-cli.test.ts +172 -0
- package/src/spawn-agent.test.ts +1218 -0
- package/src/spawn-agent.ts +569 -0
- package/src/spawn-deps.test.ts +54 -0
- package/src/spawn-deps.ts +166 -0
- package/src/telegram/api.ts +153 -0
- package/src/terminal-assets.test.ts +50 -0
- package/src/terminal-assets.ts +79 -0
- package/src/terminal-ui.ts +305 -0
- package/src/terminal.test.ts +530 -0
- package/src/terminal.ts +458 -0
- package/src/transport.ts +270 -0
- package/src/transports/http-ui.test.ts +455 -0
- package/src/transports/http-ui.ts +201 -0
- package/src/transports/telegram.test.ts +174 -0
- package/src/transports/telegram.ts +426 -0
- package/src/transports/vault.test.ts +2011 -0
- package/src/transports/vault.ts +1790 -0
- package/src/ui-kit.test.ts +178 -0
- package/src/ui-kit.ts +402 -0
- package/tsconfig.json +8 -14
- package/web/ui/tsconfig.json +2 -1
- package/.claude/scheduled_tasks.lock +0 -1
- package/.claude/settings.json +0 -5
- package/.claude/skills/add-atomic-chat-tool/SKILL.md +0 -243
- package/.claude/skills/add-atomic-chat-tool/atomic-chat-mcp-stdio.ts +0 -229
- package/.claude/skills/add-codex/SKILL.md +0 -161
- package/.claude/skills/add-dashboard/SKILL.md +0 -138
- package/.claude/skills/add-dashboard/resources/dashboard-pusher.ts +0 -495
- package/.claude/skills/add-emacs/SKILL.md +0 -296
- package/.claude/skills/add-gcal-tool/SKILL.md +0 -210
- package/.claude/skills/add-gchat/REMOVE.md +0 -6
- package/.claude/skills/add-gchat/SKILL.md +0 -92
- package/.claude/skills/add-gchat/VERIFY.md +0 -3
- package/.claude/skills/add-github/REMOVE.md +0 -6
- package/.claude/skills/add-github/SKILL.md +0 -148
- package/.claude/skills/add-github/VERIFY.md +0 -3
- package/.claude/skills/add-gmail-tool/SKILL.md +0 -229
- package/.claude/skills/add-imessage/REMOVE.md +0 -6
- package/.claude/skills/add-imessage/SKILL.md +0 -113
- package/.claude/skills/add-imessage/VERIFY.md +0 -3
- package/.claude/skills/add-karpathy-llm-wiki/SKILL.md +0 -110
- package/.claude/skills/add-karpathy-llm-wiki/llm-wiki.md +0 -75
- package/.claude/skills/add-linear/REMOVE.md +0 -6
- package/.claude/skills/add-linear/SKILL.md +0 -168
- package/.claude/skills/add-linear/VERIFY.md +0 -3
- package/.claude/skills/add-macos-statusbar/SKILL.md +0 -133
- package/.claude/skills/add-macos-statusbar/add/src/statusbar.swift +0 -147
- package/.claude/skills/add-matrix/REMOVE.md +0 -6
- package/.claude/skills/add-matrix/SKILL.md +0 -148
- package/.claude/skills/add-matrix/VERIFY.md +0 -3
- package/.claude/skills/add-ollama-provider/SKILL.md +0 -179
- package/.claude/skills/add-ollama-tool/SKILL.md +0 -193
- package/.claude/skills/add-opencode/SKILL.md +0 -229
- package/.claude/skills/add-parallel/SKILL.md +0 -290
- package/.claude/skills/add-resend/REMOVE.md +0 -6
- package/.claude/skills/add-resend/SKILL.md +0 -93
- package/.claude/skills/add-resend/VERIFY.md +0 -3
- package/.claude/skills/add-signal/REMOVE.md +0 -13
- package/.claude/skills/add-signal/SKILL.md +0 -318
- package/.claude/skills/add-signal/VERIFY.md +0 -5
- package/.claude/skills/add-slack/REMOVE.md +0 -6
- package/.claude/skills/add-slack/SKILL.md +0 -112
- package/.claude/skills/add-slack/VERIFY.md +0 -3
- package/.claude/skills/add-teams/REMOVE.md +0 -6
- package/.claude/skills/add-teams/SKILL.md +0 -207
- package/.claude/skills/add-teams/VERIFY.md +0 -3
- package/.claude/skills/add-vercel/SKILL.md +0 -147
- package/.claude/skills/add-vercel/container-skills/vercel-cli/SKILL.md +0 -103
- package/.claude/skills/add-webex/REMOVE.md +0 -6
- package/.claude/skills/add-webex/SKILL.md +0 -88
- package/.claude/skills/add-webex/VERIFY.md +0 -3
- package/.claude/skills/add-wechat/REMOVE.md +0 -49
- package/.claude/skills/add-wechat/SKILL.md +0 -170
- package/.claude/skills/add-wechat/scripts/wire-dm.ts +0 -172
- package/.claude/skills/add-whatsapp/SKILL.md +0 -264
- package/.claude/skills/add-whatsapp-cloud/REMOVE.md +0 -6
- package/.claude/skills/add-whatsapp-cloud/SKILL.md +0 -95
- package/.claude/skills/add-whatsapp-cloud/VERIFY.md +0 -3
- package/.claude/skills/claw/SKILL.md +0 -131
- package/.claude/skills/claw/scripts/claw +0 -374
- package/.claude/skills/convert-to-apple-container/SKILL.md +0 -212
- package/.claude/skills/customize/SKILL.md +0 -110
- package/.claude/skills/debug/SKILL.md +0 -349
- package/.claude/skills/get-qodo-rules/SKILL.md +0 -122
- package/.claude/skills/get-qodo-rules/references/output-format.md +0 -41
- package/.claude/skills/get-qodo-rules/references/pagination.md +0 -33
- package/.claude/skills/get-qodo-rules/references/repository-scope.md +0 -26
- package/.claude/skills/init-first-agent/SKILL.md +0 -120
- package/.claude/skills/init-onecli/SKILL.md +0 -270
- package/.claude/skills/manage-channels/SKILL.md +0 -87
- package/.claude/skills/manage-mounts/SKILL.md +0 -47
- package/.claude/skills/migrate-from-openclaw/MIGRATE_CRONS.md +0 -100
- package/.claude/skills/migrate-from-openclaw/SKILL.md +0 -447
- package/.claude/skills/migrate-from-openclaw/scripts/discover-openclaw.ts +0 -734
- package/.claude/skills/migrate-from-openclaw/scripts/extract-channel-credentials.ts +0 -476
- package/.claude/skills/migrate-nanoclaw/SKILL.md +0 -484
- package/.claude/skills/migrate-nanoclaw/diagnostics.md +0 -51
- package/.claude/skills/qodo-pr-resolver/SKILL.md +0 -326
- package/.claude/skills/qodo-pr-resolver/resources/providers.md +0 -329
- package/.claude/skills/update-nanoclaw/SKILL.md +0 -243
- package/.claude/skills/update-nanoclaw/diagnostics.md +0 -48
- package/.claude/skills/update-skills/SKILL.md +0 -130
- package/.claude/skills/use-native-credential-proxy/SKILL.md +0 -167
- package/.claude/skills/x-integration/SKILL.md +0 -417
- package/.claude/skills/x-integration/agent.ts +0 -243
- package/.claude/skills/x-integration/host.ts +0 -155
- package/.claude/skills/x-integration/lib/browser.ts +0 -148
- package/.claude/skills/x-integration/lib/config.ts +0 -62
- package/.claude/skills/x-integration/scripts/like.ts +0 -56
- package/.claude/skills/x-integration/scripts/post.ts +0 -66
- package/.claude/skills/x-integration/scripts/quote.ts +0 -80
- package/.claude/skills/x-integration/scripts/reply.ts +0 -74
- package/.claude/skills/x-integration/scripts/retweet.ts +0 -62
- package/.claude/skills/x-integration/scripts/setup.ts +0 -87
- package/.github/CODEOWNERS +0 -10
- package/.github/PULL_REQUEST_TEMPLATE.md +0 -18
- package/.github/workflows/bump-version.yml +0 -35
- package/.github/workflows/ci.yml +0 -39
- package/.github/workflows/label-pr.yml +0 -40
- package/.github/workflows/update-tokens.yml +0 -43
- package/.husky/pre-commit +0 -1
- package/.mcp.json +0 -3
- package/.nvmrc +0 -1
- package/.prettierrc +0 -4
- package/CHANGELOG.md +0 -221
- package/CLAUDE.md +0 -307
- package/CODE_OF_CONDUCT.md +0 -128
- package/CONTRIBUTING.md +0 -159
- package/CONTRIBUTORS.md +0 -26
- package/LICENSE-NANOCLAW-MIT +0 -21
- package/README_ja.md +0 -194
- package/README_zh.md +0 -194
- package/assets/nanoclaw-favicon.png +0 -0
- package/assets/nanoclaw-icon.png +0 -0
- package/assets/nanoclaw-logo-dark.png +0 -0
- package/assets/nanoclaw-logo.png +0 -0
- package/assets/nanoclaw-profile.jpeg +0 -0
- package/assets/nanoclaw-sales.png +0 -0
- package/assets/social-preview.jpg +0 -0
- package/config-examples/mount-allowlist.json +0 -25
- package/container/.dockerignore +0 -2
- package/container/CLAUDE.md +0 -21
- package/container/Dockerfile +0 -121
- package/container/agent-runner/bun.lock +0 -243
- package/container/agent-runner/package.json +0 -22
- package/container/agent-runner/scripts/sdk-signal-probe.ts +0 -169
- package/container/agent-runner/src/config.ts +0 -55
- package/container/agent-runner/src/db/connection.ts +0 -267
- package/container/agent-runner/src/db/index.ts +0 -20
- package/container/agent-runner/src/db/messages-in.ts +0 -138
- package/container/agent-runner/src/db/messages-out.ts +0 -143
- package/container/agent-runner/src/db/session-routing.ts +0 -30
- package/container/agent-runner/src/db/session-state.test.ts +0 -100
- package/container/agent-runner/src/db/session-state.ts +0 -79
- package/container/agent-runner/src/destinations.ts +0 -135
- package/container/agent-runner/src/formatter.test.ts +0 -167
- package/container/agent-runner/src/formatter.ts +0 -260
- package/container/agent-runner/src/index.ts +0 -110
- package/container/agent-runner/src/integration.test.ts +0 -121
- package/container/agent-runner/src/mcp-tools/agents.instructions.md +0 -26
- package/container/agent-runner/src/mcp-tools/agents.ts +0 -66
- package/container/agent-runner/src/mcp-tools/core.instructions.md +0 -27
- package/container/agent-runner/src/mcp-tools/core.ts +0 -262
- package/container/agent-runner/src/mcp-tools/index.ts +0 -22
- package/container/agent-runner/src/mcp-tools/interactive.instructions.md +0 -22
- package/container/agent-runner/src/mcp-tools/interactive.ts +0 -169
- package/container/agent-runner/src/mcp-tools/scheduling.instructions.md +0 -40
- package/container/agent-runner/src/mcp-tools/scheduling.ts +0 -299
- package/container/agent-runner/src/mcp-tools/self-mod.instructions.md +0 -25
- package/container/agent-runner/src/mcp-tools/self-mod.ts +0 -120
- package/container/agent-runner/src/mcp-tools/server.ts +0 -54
- package/container/agent-runner/src/mcp-tools/types.ts +0 -6
- package/container/agent-runner/src/poll-loop.test.ts +0 -248
- package/container/agent-runner/src/poll-loop.ts +0 -437
- package/container/agent-runner/src/providers/claude.ts +0 -379
- package/container/agent-runner/src/providers/factory.test.ts +0 -19
- package/container/agent-runner/src/providers/factory.ts +0 -13
- package/container/agent-runner/src/providers/index.ts +0 -6
- package/container/agent-runner/src/providers/mock.ts +0 -77
- package/container/agent-runner/src/providers/provider-registry.ts +0 -33
- package/container/agent-runner/src/providers/types.ts +0 -82
- package/container/agent-runner/src/scheduling/task-script.ts +0 -121
- package/container/agent-runner/src/timezone.test.ts +0 -93
- package/container/agent-runner/src/timezone.ts +0 -107
- package/container/agent-runner/tsconfig.json +0 -14
- package/container/build.sh +0 -48
- package/container/entrypoint.sh +0 -16
- package/container/skills/agent-browser/SKILL.md +0 -159
- package/container/skills/frontend-engineer/SKILL.md +0 -157
- package/container/skills/self-customize/SKILL.md +0 -87
- package/container/skills/slack-formatting/SKILL.md +0 -94
- package/container/skills/vercel-cli/SKILL.md +0 -111
- package/container/skills/welcome/SKILL.md +0 -85
- package/docs/APPLE-CONTAINER-NETWORKING.md +0 -90
- package/docs/BRANCH-FORK-MAINTENANCE.md +0 -81
- package/docs/README.md +0 -25
- package/docs/SDK_DEEP_DIVE.md +0 -643
- package/docs/SECURITY.md +0 -162
- package/docs/agent-runner-details.md +0 -749
- package/docs/api-details.md +0 -365
- package/docs/architecture-diagram.html +0 -422
- package/docs/architecture-diagram.md +0 -215
- package/docs/architecture.md +0 -751
- package/docs/audit/2026-04-30-channel-endpoint-audit.md +0 -36
- package/docs/build-and-runtime.md +0 -80
- package/docs/cross-mount-stress/README.md +0 -112
- package/docs/cross-mount-stress/container-writer-retry.mjs +0 -55
- package/docs/cross-mount-stress/container-writer-slow.mjs +0 -42
- package/docs/cross-mount-stress/container-writer.mjs +0 -47
- package/docs/cross-mount-stress/host-writer-retry.mjs +0 -55
- package/docs/cross-mount-stress/host-writer-slow.mjs +0 -43
- package/docs/cross-mount-stress/host-writer.mjs +0 -47
- package/docs/db-central.md +0 -316
- package/docs/db-session.md +0 -183
- package/docs/db.md +0 -119
- package/docs/design/2026-04-29-vault-management-ui.md +0 -231
- package/docs/design/2026-04-30-channel-wiring-rework.md +0 -234
- package/docs/design/2026-05-01-channel-wiring-approvals-deep-dive.md +0 -272
- package/docs/design/2026-05-02-channel-policy-and-approval-routing.md +0 -250
- package/docs/docker-sandboxes.md +0 -359
- package/docs/isolation-model.md +0 -88
- package/docs/ollama.md +0 -79
- package/docs/parachute-integration.md +0 -109
- package/docs/post-night-rebirth-reflections.md +0 -151
- package/eslint.config.js +0 -32
- package/pnpm-workspace.yaml +0 -8
- package/repo-tokens/README.md +0 -113
- package/repo-tokens/action.yml +0 -186
- package/repo-tokens/badge.svg +0 -23
- package/repo-tokens/examples/green.svg +0 -14
- package/repo-tokens/examples/red.svg +0 -14
- package/repo-tokens/examples/yellow-green.svg +0 -14
- package/repo-tokens/examples/yellow.svg +0 -14
- package/scripts/chat.ts +0 -101
- package/scripts/cleanup-sessions.sh +0 -150
- package/scripts/init-cli-agent.ts +0 -171
- package/scripts/init-first-agent.ts +0 -377
- package/scripts/parachute.ts +0 -158
- package/scripts/run-migrations.ts +0 -105
- package/scripts/sanity-live-poll.ts +0 -95
- package/scripts/seed-discord.ts +0 -79
- package/scripts/test-v2-agent.ts +0 -106
- package/scripts/test-v2-channel-e2e.ts +0 -265
- package/scripts/test-v2-host.ts +0 -184
- package/src/channels/adapter.ts +0 -214
- package/src/channels/ask-question.ts +0 -46
- package/src/channels/channel-registry.test.ts +0 -421
- package/src/channels/channel-registry.ts +0 -313
- package/src/channels/chat-sdk-bridge.test.ts +0 -84
- package/src/channels/chat-sdk-bridge.ts +0 -652
- package/src/channels/cli.ts +0 -276
- package/src/channels/discord.ts +0 -90
- package/src/channels/index.ts +0 -17
- package/src/channels/telegram-markdown-sanitize.test.ts +0 -78
- package/src/channels/telegram-markdown-sanitize.ts +0 -55
- package/src/channels/telegram-pairing.test.ts +0 -254
- package/src/channels/telegram-pairing.ts +0 -339
- package/src/channels/telegram.ts +0 -279
- package/src/channels/trust-hint.test.ts +0 -48
- package/src/channels/trust-hint.ts +0 -75
- package/src/claude-md-compose.migrate.test.ts +0 -64
- package/src/claude-md-compose.ts +0 -205
- package/src/command-gate.ts +0 -63
- package/src/config.test.ts +0 -93
- package/src/config.ts +0 -108
- package/src/container-config.ts +0 -167
- package/src/container-runner.test.ts +0 -32
- package/src/container-runner.ts +0 -576
- package/src/container-runtime.test.ts +0 -169
- package/src/container-runtime.ts +0 -92
- package/src/db/_bun-sqlite-shim.ts +0 -88
- package/src/db/agent-activity.test.ts +0 -155
- package/src/db/agent-activity.ts +0 -121
- package/src/db/agent-groups.ts +0 -77
- package/src/db/connection.migrate.test.ts +0 -143
- package/src/db/connection.ts +0 -224
- package/src/db/db-v2.test.ts +0 -440
- package/src/db/dropped-messages.ts +0 -44
- package/src/db/index.ts +0 -40
- package/src/db/messaging-groups.ts +0 -252
- package/src/db/migrations/001-initial.ts +0 -112
- package/src/db/migrations/002-chat-sdk-state.ts +0 -36
- package/src/db/migrations/008-dropped-messages.ts +0 -27
- package/src/db/migrations/009-drop-pending-credentials.ts +0 -13
- package/src/db/migrations/010-engage-modes.ts +0 -103
- package/src/db/migrations/011-pending-sender-approvals.ts +0 -40
- package/src/db/migrations/012-channel-registration.ts +0 -48
- package/src/db/migrations/013-approval-render-metadata.ts +0 -27
- package/src/db/migrations/014-secrets.ts +0 -44
- package/src/db/migrations/015-secrets-drop-host-pattern.ts +0 -18
- package/src/db/migrations/016-secret-assignments.ts +0 -30
- package/src/db/migrations/017-agent-activity.ts +0 -40
- package/src/db/migrations/018-oauth-app-configs.ts +0 -34
- package/src/db/migrations/019-oauth-app-connections.ts +0 -48
- package/src/db/migrations/020-agent-app-connections.ts +0 -28
- package/src/db/migrations/021-pending-oauth-states.ts +0 -35
- package/src/db/migrations/022-app-connections-provider.ts +0 -25
- package/src/db/migrations/023-agent-group-secret-mode.test.ts +0 -124
- package/src/db/migrations/023-agent-group-secret-mode.ts +0 -65
- package/src/db/migrations/024-collapse-approvals.test.ts +0 -249
- package/src/db/migrations/024-collapse-approvals.ts +0 -182
- package/src/db/migrations/025-secret-mode-check.test.ts +0 -155
- package/src/db/migrations/025-secret-mode-check.ts +0 -49
- package/src/db/migrations/026-user-dms-bot-id.test.ts +0 -116
- package/src/db/migrations/026-user-dms-bot-id.ts +0 -54
- package/src/db/migrations/027-provider-credentials.ts +0 -41
- package/src/db/migrations/_test-helpers.ts +0 -41
- package/src/db/migrations/index.ts +0 -127
- package/src/db/migrations/module-agent-to-agent-destinations.ts +0 -84
- package/src/db/migrations/module-approvals-pending-approvals.ts +0 -42
- package/src/db/migrations/module-approvals-title-options.ts +0 -40
- package/src/db/schema.ts +0 -258
- package/src/db/session-db.test.ts +0 -93
- package/src/db/session-db.ts +0 -325
- package/src/db/sessions.ts +0 -241
- package/src/delivery.test.ts +0 -148
- package/src/delivery.ts +0 -445
- package/src/env.ts +0 -74
- package/src/group-folder.test.ts +0 -35
- package/src/group-folder.ts +0 -44
- package/src/group-init.ts +0 -92
- package/src/host-core.test.ts +0 -456
- package/src/host-sweep.test.ts +0 -146
- package/src/host-sweep.ts +0 -287
- package/src/index.ts +0 -227
- package/src/install-slug.ts +0 -33
- package/src/log.test.ts +0 -81
- package/src/log.ts +0 -117
- package/src/mcp/http.ts +0 -72
- package/src/mcp/server.ts +0 -92
- package/src/mcp/stdio.ts +0 -51
- package/src/mcp/tools/activity.ts +0 -88
- package/src/mcp/tools/agent-groups.ts +0 -183
- package/src/mcp/tools/approvals.ts +0 -122
- package/src/mcp/tools/channels.ts +0 -199
- package/src/mcp/tools/index.ts +0 -27
- package/src/mcp/tools/oauth.ts +0 -48
- package/src/mcp/tools/secrets.ts +0 -169
- package/src/mcp/tools/sessions.ts +0 -135
- package/src/mcp/types.ts +0 -51
- package/src/modules/agent-to-agent/agent-route.test.ts +0 -46
- package/src/modules/agent-to-agent/agent-route.ts +0 -223
- package/src/modules/agent-to-agent/create-agent.ts +0 -127
- package/src/modules/agent-to-agent/db/agent-destinations.ts +0 -135
- package/src/modules/agent-to-agent/index.ts +0 -22
- package/src/modules/agent-to-agent/write-destinations.ts +0 -59
- package/src/modules/approvals/agent.md +0 -45
- package/src/modules/approvals/index.ts +0 -21
- package/src/modules/approvals/picks.test.ts +0 -291
- package/src/modules/approvals/primitive.ts +0 -279
- package/src/modules/approvals/project.md +0 -27
- package/src/modules/approvals/response-handler.ts +0 -87
- package/src/modules/index.ts +0 -24
- package/src/modules/interactive/agent.md +0 -21
- package/src/modules/interactive/index.ts +0 -69
- package/src/modules/interactive/project.md +0 -12
- package/src/modules/mount-security/index.ts +0 -448
- package/src/modules/mount-security/migrate.test.ts +0 -91
- package/src/modules/permissions/access.ts +0 -28
- package/src/modules/permissions/channel-approval.test.ts +0 -389
- package/src/modules/permissions/channel-approval.ts +0 -188
- package/src/modules/permissions/db/agent-group-members.ts +0 -44
- package/src/modules/permissions/db/pending-channel-approvals.test.ts +0 -86
- package/src/modules/permissions/db/pending-channel-approvals.ts +0 -66
- package/src/modules/permissions/db/pending-sender-approvals.ts +0 -60
- package/src/modules/permissions/db/user-dms.ts +0 -58
- package/src/modules/permissions/db/user-roles.ts +0 -85
- package/src/modules/permissions/db/users.ts +0 -38
- package/src/modules/permissions/index.ts +0 -421
- package/src/modules/permissions/permissions.test.ts +0 -358
- package/src/modules/permissions/sender-approval.test.ts +0 -470
- package/src/modules/permissions/sender-approval.ts +0 -165
- package/src/modules/permissions/user-dm.ts +0 -200
- package/src/modules/provider-credentials/db.ts +0 -121
- package/src/modules/provider-credentials/index.ts +0 -12
- package/src/modules/provider-credentials/spawn.test.ts +0 -206
- package/src/modules/provider-credentials/spawn.ts +0 -114
- package/src/modules/scheduling/actions.ts +0 -113
- package/src/modules/scheduling/db.test.ts +0 -282
- package/src/modules/scheduling/db.ts +0 -148
- package/src/modules/scheduling/index.ts +0 -34
- package/src/modules/scheduling/recurrence.test.ts +0 -98
- package/src/modules/scheduling/recurrence.ts +0 -54
- package/src/modules/self-mod/agent.md +0 -30
- package/src/modules/self-mod/apply.ts +0 -85
- package/src/modules/self-mod/index.ts +0 -30
- package/src/modules/self-mod/project.md +0 -39
- package/src/modules/self-mod/request.ts +0 -91
- package/src/modules/typing/index.ts +0 -165
- package/src/oauth/agent-app-connections.ts +0 -103
- package/src/oauth/app-configs.test.ts +0 -64
- package/src/oauth/app-configs.ts +0 -114
- package/src/oauth/app-connections.test.ts +0 -109
- package/src/oauth/app-connections.ts +0 -178
- package/src/oauth/crypto.ts +0 -56
- package/src/oauth/flow.ts +0 -104
- package/src/oauth/providers/google.test.ts +0 -38
- package/src/oauth/providers/google.ts +0 -46
- package/src/oauth/providers/index.ts +0 -48
- package/src/oauth/state-store.test.ts +0 -54
- package/src/oauth/state-store.ts +0 -93
- package/src/parachute/README.md +0 -27
- package/src/parachute/create-agent.test.ts +0 -83
- package/src/parachute/create-agent.ts +0 -122
- package/src/parachute/group-status.test.ts +0 -165
- package/src/parachute/group-status.ts +0 -136
- package/src/parachute/types.ts +0 -41
- package/src/parachute/vault-mcp.test.ts +0 -251
- package/src/parachute/vault-mcp.ts +0 -232
- package/src/platform-id.test.ts +0 -104
- package/src/platform-id.ts +0 -109
- package/src/providers/index.ts +0 -6
- package/src/providers/provider-container-registry.ts +0 -58
- package/src/response-registry.ts +0 -45
- package/src/router.ts +0 -530
- package/src/secrets/crypto.test.ts +0 -45
- package/src/secrets/crypto.ts +0 -55
- package/src/secrets/index.ts +0 -355
- package/src/secrets/master-key.ts +0 -70
- package/src/secrets/secrets.test.ts +0 -354
- package/src/session-manager.migrate.test.ts +0 -59
- package/src/session-manager.ts +0 -433
- package/src/startup-bootstrap.test.ts +0 -226
- package/src/startup-bootstrap.ts +0 -207
- package/src/state-sqlite.ts +0 -182
- package/src/timezone.test.ts +0 -64
- package/src/timezone.ts +0 -37
- package/src/types.ts +0 -230
- package/src/web/auth.test.ts +0 -335
- package/src/web/auth.ts +0 -214
- package/src/web/discord-validate.test.ts +0 -77
- package/src/web/discord-validate.ts +0 -88
- package/src/web/hub-discovery.test.ts +0 -98
- package/src/web/hub-discovery.ts +0 -69
- package/src/web/routes/activity.ts +0 -106
- package/src/web/routes/agent-provider.test.ts +0 -282
- package/src/web/routes/agent-provider.ts +0 -309
- package/src/web/routes/approvals.ts +0 -185
- package/src/web/routes/apps.ts +0 -434
- package/src/web/routes/channels-mg-detail.test.ts +0 -324
- package/src/web/routes/channels-mga-detail.test.ts +0 -425
- package/src/web/routes/channels.ts +0 -489
- package/src/web/routes/oauth-providers.ts +0 -42
- package/src/web/routes/secrets.test.ts +0 -175
- package/src/web/routes/secrets.ts +0 -282
- package/src/web/routes/sessions.ts +0 -123
- package/src/web/routes/settings.test.ts +0 -106
- package/src/web/routes/settings.ts +0 -247
- package/src/web/routes/setup-status.ts +0 -205
- package/src/web/routes/vaults.test.ts +0 -389
- package/src/web/routes/vaults.ts +0 -225
- package/src/web/server-version.test.ts +0 -16
- package/src/web/server.ts +0 -1003
- package/src/web/services-manifest.test.ts +0 -120
- package/src/web/services-manifest.ts +0 -61
- package/src/web/static-serve.test.ts +0 -255
- package/src/web/static-serve.ts +0 -104
- package/src/web/telegram-validate.test.ts +0 -116
- package/src/web/telegram-validate.ts +0 -107
- package/src/web/vault-proxy.test.ts +0 -214
- package/src/web/vault-proxy.ts +0 -120
- package/src/web/wire-channel.ts +0 -181
- package/src/webhook-server.ts +0 -134
- package/vitest.config.ts +0 -18
- package/web/README.md +0 -63
- package/web/ui/index.html +0 -13
- package/web/ui/package.json +0 -35
- package/web/ui/pnpm-lock.yaml +0 -2164
- package/web/ui/scripts/verify-base.mjs +0 -31
- package/web/ui/src/App.tsx +0 -88
- package/web/ui/src/components/ActivityFeed.tsx +0 -444
- package/web/ui/src/components/AgentGroupPicker.tsx +0 -263
- package/web/ui/src/components/AgentProviderCards.tsx +0 -220
- package/web/ui/src/components/CredentialForm.tsx +0 -214
- package/web/ui/src/components/ScopeGrants.tsx +0 -74
- package/web/ui/src/components/StatusDot.tsx +0 -43
- package/web/ui/src/components/VaultPicker.tsx +0 -127
- package/web/ui/src/components/setup/AdapterInstallStep.tsx +0 -178
- package/web/ui/src/components/setup/AgentGroupStep.tsx +0 -43
- package/web/ui/src/components/setup/ChannelPickStep.tsx +0 -74
- package/web/ui/src/components/setup/DoneStep.tsx +0 -49
- package/web/ui/src/components/setup/PrereqStep.tsx +0 -129
- package/web/ui/src/components/setup/TestConnectionStep.tsx +0 -108
- package/web/ui/src/components/setup/TestMessageStep.tsx +0 -104
- package/web/ui/src/components/setup/WireChannelStep.tsx +0 -166
- package/web/ui/src/components/setup/types.ts +0 -105
- package/web/ui/src/lib/api.test.ts +0 -410
- package/web/ui/src/lib/api.ts +0 -1210
- package/web/ui/src/lib/auth.test.ts +0 -139
- package/web/ui/src/lib/auth.ts +0 -348
- package/web/ui/src/lib/channel-adapters.ts +0 -136
- package/web/ui/src/main.tsx +0 -19
- package/web/ui/src/routes/ApprovalsList.tsx +0 -294
- package/web/ui/src/routes/Apps.tsx +0 -613
- package/web/ui/src/routes/ChannelWireDetail.test.tsx +0 -233
- package/web/ui/src/routes/ChannelWireDetail.tsx +0 -403
- package/web/ui/src/routes/ChannelsList.tsx +0 -158
- package/web/ui/src/routes/GroupDetail.tsx +0 -755
- package/web/ui/src/routes/GroupList.tsx +0 -187
- package/web/ui/src/routes/MessagingGroupDetail.test.tsx +0 -233
- package/web/ui/src/routes/MessagingGroupDetail.tsx +0 -306
- package/web/ui/src/routes/NewGroupWizard.tsx +0 -390
- package/web/ui/src/routes/OAuthCallback.tsx +0 -56
- package/web/ui/src/routes/SecretsList.tsx +0 -921
- package/web/ui/src/routes/SessionsList.tsx +0 -220
- package/web/ui/src/routes/SettingsAgentProvider.tsx +0 -109
- package/web/ui/src/routes/SettingsApprovals.tsx +0 -234
- package/web/ui/src/routes/SetupWizard.tsx +0 -219
- package/web/ui/src/routes/VaultDetail.test.tsx +0 -361
- package/web/ui/src/routes/VaultDetail.tsx +0 -960
- package/web/ui/src/routes/VaultsList.tsx +0 -295
- package/web/ui/src/routes/WireChannelPage.tsx +0 -413
- package/web/ui/src/styles.css +0 -608
- package/web/ui/src/test/setup.ts +0 -23
- package/web/ui/src/vite-env.d.ts +0 -10
- package/web/ui/vite.config.ts +0 -34
- package/web/ui/vitest.config.ts +0 -25
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import fs from 'fs';
|
|
2
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
-
|
|
4
|
-
vi.mock('../../../config.js', async () => {
|
|
5
|
-
const actual = await vi.importActual('../../../config.js');
|
|
6
|
-
return { ...actual, DATA_DIR: '/tmp/paraclaw-test-pending-channel-approvals' };
|
|
7
|
-
});
|
|
8
|
-
|
|
9
|
-
const TEST_DIR = '/tmp/paraclaw-test-pending-channel-approvals';
|
|
10
|
-
|
|
11
|
-
const sampleRow = (messagingGroupId: string) => ({
|
|
12
|
-
messaging_group_id: messagingGroupId,
|
|
13
|
-
agent_group_id: 'ag-1',
|
|
14
|
-
original_message: '{"text":"hi"}',
|
|
15
|
-
approver_user_id: 'user-1',
|
|
16
|
-
created_at: new Date().toISOString(),
|
|
17
|
-
title: 'Card',
|
|
18
|
-
options_json: '[]',
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
describe('pending_channel_approvals atomic create', () => {
|
|
22
|
-
beforeEach(async () => {
|
|
23
|
-
if (fs.existsSync(TEST_DIR)) fs.rmSync(TEST_DIR, { recursive: true });
|
|
24
|
-
fs.mkdirSync(TEST_DIR, { recursive: true });
|
|
25
|
-
vi.resetModules();
|
|
26
|
-
const { initTestDb, runMigrations } = await import('../../../db/index.js');
|
|
27
|
-
const db = initTestDb();
|
|
28
|
-
runMigrations(db);
|
|
29
|
-
const { createAgentGroup } = await import('../../../db/agent-groups.js');
|
|
30
|
-
const { createMessagingGroup } = await import('../../../db/messaging-groups.js');
|
|
31
|
-
createAgentGroup({
|
|
32
|
-
id: 'ag-1',
|
|
33
|
-
folder: 'group-1',
|
|
34
|
-
name: 'G',
|
|
35
|
-
agent_provider: null,
|
|
36
|
-
created_at: new Date().toISOString(),
|
|
37
|
-
});
|
|
38
|
-
for (const id of ['mg-1', 'mg-2']) {
|
|
39
|
-
createMessagingGroup({
|
|
40
|
-
id,
|
|
41
|
-
channel_type: 'telegram',
|
|
42
|
-
platform_id: `telegram:bot:${id}`,
|
|
43
|
-
name: null,
|
|
44
|
-
is_group: 0,
|
|
45
|
-
unknown_sender_policy: 'request_approval',
|
|
46
|
-
created_at: new Date().toISOString(),
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
const { upsertUser } = await import('./users.js');
|
|
50
|
-
upsertUser({
|
|
51
|
-
id: 'user-1',
|
|
52
|
-
kind: 'human',
|
|
53
|
-
display_name: 'User',
|
|
54
|
-
created_at: new Date().toISOString(),
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
afterEach(async () => {
|
|
59
|
-
const { closeDb } = await import('../../../db/index.js');
|
|
60
|
-
closeDb();
|
|
61
|
-
if (fs.existsSync(TEST_DIR)) fs.rmSync(TEST_DIR, { recursive: true });
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it('returns true on first insert, false on duplicate, and never throws', async () => {
|
|
65
|
-
const { createPendingChannelApproval, getPendingChannelApproval } = await import('./pending-channel-approvals.js');
|
|
66
|
-
|
|
67
|
-
const first = createPendingChannelApproval(sampleRow('mg-1'));
|
|
68
|
-
expect(first).toBe(true);
|
|
69
|
-
|
|
70
|
-
// Concurrent inbounds racing past the dedup check used to throw
|
|
71
|
-
// `UNIQUE constraint failed`. With ON CONFLICT DO NOTHING they
|
|
72
|
-
// return false silently and the caller skips delivery without an
|
|
73
|
-
// ERROR-level log line.
|
|
74
|
-
const second = createPendingChannelApproval(sampleRow('mg-1'));
|
|
75
|
-
expect(second).toBe(false);
|
|
76
|
-
|
|
77
|
-
const stored = getPendingChannelApproval('mg-1');
|
|
78
|
-
expect(stored?.title).toBe('Card');
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('lets a different messaging_group_id through without conflict', async () => {
|
|
82
|
-
const { createPendingChannelApproval } = await import('./pending-channel-approvals.js');
|
|
83
|
-
expect(createPendingChannelApproval(sampleRow('mg-1'))).toBe(true);
|
|
84
|
-
expect(createPendingChannelApproval(sampleRow('mg-2'))).toBe(true);
|
|
85
|
-
});
|
|
86
|
-
});
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CRUD for pending_channel_approvals — the in-flight state for the
|
|
3
|
-
* unknown-channel registration flow. A row exists while an owner-approval
|
|
4
|
-
* card is outstanding; it's deleted on approve (after wiring is created)
|
|
5
|
-
* or deny (after denied_at is set on the messaging_group).
|
|
6
|
-
*
|
|
7
|
-
* PRIMARY KEY on messaging_group_id gives free in-flight dedup. A second
|
|
8
|
-
* mention/DM while a card is pending resolves via
|
|
9
|
-
* `hasInFlightChannelApproval` in the request flow and drops silently
|
|
10
|
-
* instead of spamming the owner.
|
|
11
|
-
*/
|
|
12
|
-
import { getDb } from '../../../db/connection.js';
|
|
13
|
-
|
|
14
|
-
export interface PendingChannelApproval {
|
|
15
|
-
messaging_group_id: string;
|
|
16
|
-
agent_group_id: string;
|
|
17
|
-
original_message: string;
|
|
18
|
-
approver_user_id: string;
|
|
19
|
-
created_at: string;
|
|
20
|
-
/** Card title shown at creation and re-used by getAskQuestionRender on click. */
|
|
21
|
-
title: string;
|
|
22
|
-
/** Normalized options (JSON-encoded NormalizedOption[]) — same shape persisted on pending_approvals. */
|
|
23
|
-
options_json: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Insert atomically; returns true iff this call won the race and inserted
|
|
28
|
-
* the row. Returns false (without throwing) if a row was already present
|
|
29
|
-
* for this messaging_group_id — the previous non-atomic check+insert pair
|
|
30
|
-
* threw `UNIQUE constraint failed` when concurrent inbounds raced past
|
|
31
|
-
* the dedup check, surfacing as ERROR-level noise on every multi-mention
|
|
32
|
-
* burst even though user-visible behavior was correct.
|
|
33
|
-
*/
|
|
34
|
-
export function createPendingChannelApproval(row: PendingChannelApproval): boolean {
|
|
35
|
-
const result = getDb()
|
|
36
|
-
.prepare(
|
|
37
|
-
`INSERT INTO pending_channel_approvals (
|
|
38
|
-
messaging_group_id, agent_group_id, original_message,
|
|
39
|
-
approver_user_id, created_at, title, options_json
|
|
40
|
-
)
|
|
41
|
-
VALUES (
|
|
42
|
-
@messaging_group_id, @agent_group_id, @original_message,
|
|
43
|
-
@approver_user_id, @created_at, @title, @options_json
|
|
44
|
-
)
|
|
45
|
-
ON CONFLICT(messaging_group_id) DO NOTHING`,
|
|
46
|
-
)
|
|
47
|
-
.run(row);
|
|
48
|
-
return result.changes > 0;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function getPendingChannelApproval(messagingGroupId: string): PendingChannelApproval | undefined {
|
|
52
|
-
return getDb()
|
|
53
|
-
.prepare('SELECT * FROM pending_channel_approvals WHERE messaging_group_id = ?')
|
|
54
|
-
.get(messagingGroupId) as PendingChannelApproval | undefined;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function hasInFlightChannelApproval(messagingGroupId: string): boolean {
|
|
58
|
-
const row = getDb()
|
|
59
|
-
.prepare('SELECT 1 AS x FROM pending_channel_approvals WHERE messaging_group_id = ?')
|
|
60
|
-
.get(messagingGroupId) as { x: number } | undefined;
|
|
61
|
-
return row !== undefined;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export function deletePendingChannelApproval(messagingGroupId: string): void {
|
|
65
|
-
getDb().prepare('DELETE FROM pending_channel_approvals WHERE messaging_group_id = ?').run(messagingGroupId);
|
|
66
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CRUD for pending_sender_approvals — the in-flight state for the
|
|
3
|
-
* request_approval unknown-sender flow. Rows are created when an unknown
|
|
4
|
-
* sender writes into a wired messaging group with that policy, and are
|
|
5
|
-
* deleted on admin approve (after adding the user as a member) or deny.
|
|
6
|
-
*
|
|
7
|
-
* UNIQUE(messaging_group_id, sender_identity) enforces in-flight dedup:
|
|
8
|
-
* a retry / second message from the same unknown sender while a card is
|
|
9
|
-
* still pending is silently dropped instead of spamming the admin.
|
|
10
|
-
*/
|
|
11
|
-
import { getDb } from '../../../db/connection.js';
|
|
12
|
-
|
|
13
|
-
export interface PendingSenderApproval {
|
|
14
|
-
id: string;
|
|
15
|
-
messaging_group_id: string;
|
|
16
|
-
agent_group_id: string;
|
|
17
|
-
sender_identity: string;
|
|
18
|
-
sender_name: string | null;
|
|
19
|
-
original_message: string;
|
|
20
|
-
approver_user_id: string;
|
|
21
|
-
created_at: string;
|
|
22
|
-
/** Card title shown at creation and re-used by getAskQuestionRender on click. */
|
|
23
|
-
title: string;
|
|
24
|
-
/** Normalized options (JSON-encoded NormalizedOption[]) — same shape persisted on pending_approvals. */
|
|
25
|
-
options_json: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function createPendingSenderApproval(row: PendingSenderApproval): void {
|
|
29
|
-
getDb()
|
|
30
|
-
.prepare(
|
|
31
|
-
`INSERT INTO pending_sender_approvals (
|
|
32
|
-
id, messaging_group_id, agent_group_id, sender_identity,
|
|
33
|
-
sender_name, original_message, approver_user_id, created_at,
|
|
34
|
-
title, options_json
|
|
35
|
-
)
|
|
36
|
-
VALUES (
|
|
37
|
-
@id, @messaging_group_id, @agent_group_id, @sender_identity,
|
|
38
|
-
@sender_name, @original_message, @approver_user_id, @created_at,
|
|
39
|
-
@title, @options_json
|
|
40
|
-
)`,
|
|
41
|
-
)
|
|
42
|
-
.run(row);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export function getPendingSenderApproval(id: string): PendingSenderApproval | undefined {
|
|
46
|
-
return getDb().prepare('SELECT * FROM pending_sender_approvals WHERE id = ?').get(id) as
|
|
47
|
-
| PendingSenderApproval
|
|
48
|
-
| undefined;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function hasInFlightSenderApproval(messagingGroupId: string, senderIdentity: string): boolean {
|
|
52
|
-
const row = getDb()
|
|
53
|
-
.prepare('SELECT 1 AS x FROM pending_sender_approvals WHERE messaging_group_id = ? AND sender_identity = ?')
|
|
54
|
-
.get(messagingGroupId, senderIdentity) as { x: number } | undefined;
|
|
55
|
-
return row !== undefined;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function deletePendingSenderApproval(id: string): void {
|
|
59
|
-
getDb().prepare('DELETE FROM pending_sender_approvals WHERE id = ?').run(id);
|
|
60
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import type { UserDm } from '../../../types.js';
|
|
2
|
-
import { getDb } from '../../../db/connection.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Insert or replace a user DM cache row. Migration 026 added the
|
|
6
|
-
* `bot_id` column to the PK; callers may pass `''` (empty string) to
|
|
7
|
-
* write the configurable channel-default slot, or a real bot id for a
|
|
8
|
-
* specific cache.
|
|
9
|
-
*/
|
|
10
|
-
export function upsertUserDm(row: UserDm): void {
|
|
11
|
-
getDb()
|
|
12
|
-
.prepare(
|
|
13
|
-
`INSERT INTO user_dms (user_id, channel_type, bot_id, messaging_group_id, resolved_at)
|
|
14
|
-
VALUES (@user_id, @channel_type, @bot_id, @messaging_group_id, @resolved_at)
|
|
15
|
-
ON CONFLICT(user_id, channel_type, bot_id) DO UPDATE SET
|
|
16
|
-
messaging_group_id = excluded.messaging_group_id,
|
|
17
|
-
resolved_at = excluded.resolved_at`,
|
|
18
|
-
)
|
|
19
|
-
.run(row);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Look up the cache row for `(user, channel, bot)`. `botId` defaults to
|
|
24
|
-
* `''` so legacy callers that don't yet know about bots get the
|
|
25
|
-
* channel-default slot — which is what they want before
|
|
26
|
-
* `pickApprovalDelivery` was extended to thread the origin bot through.
|
|
27
|
-
*/
|
|
28
|
-
export function getUserDm(userId: string, channelType: string, botId: string = ''): UserDm | undefined {
|
|
29
|
-
return getDb()
|
|
30
|
-
.prepare('SELECT * FROM user_dms WHERE user_id = ? AND channel_type = ? AND bot_id = ?')
|
|
31
|
-
.get(userId, channelType, botId) as UserDm | undefined;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* All cache rows for one user, across every `(channel_type, bot_id)`
|
|
36
|
-
* pair. Order is unspecified — callers that care about a specific bot
|
|
37
|
-
* should use {@link getUserDm} directly.
|
|
38
|
-
*/
|
|
39
|
-
export function getUserDmsForUser(userId: string): UserDm[] {
|
|
40
|
-
return getDb().prepare('SELECT * FROM user_dms WHERE user_id = ?').all(userId) as UserDm[];
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function deleteUserDm(userId: string, channelType: string, botId: string = ''): void {
|
|
44
|
-
getDb()
|
|
45
|
-
.prepare('DELETE FROM user_dms WHERE user_id = ? AND channel_type = ? AND bot_id = ?')
|
|
46
|
-
.run(userId, channelType, botId);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* List the channel-default rows (`bot_id = ''`) for one user. The
|
|
51
|
-
* settings UI uses this to render "default approval bot per channel"
|
|
52
|
-
* — one row per channel where the user has any DM cached.
|
|
53
|
-
*/
|
|
54
|
-
export function getDefaultUserDmsForUser(userId: string): UserDm[] {
|
|
55
|
-
return getDb()
|
|
56
|
-
.prepare("SELECT * FROM user_dms WHERE user_id = ? AND bot_id = '' ORDER BY channel_type")
|
|
57
|
-
.all(userId) as UserDm[];
|
|
58
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import type { UserRole, UserRoleKind } from '../../../types.js';
|
|
2
|
-
import { getDb } from '../../../db/connection.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Grant a role. Owner rows must have agent_group_id = null (enforced here,
|
|
6
|
-
* not by schema, so callers get a clean error path).
|
|
7
|
-
*/
|
|
8
|
-
export function grantRole(row: UserRole): void {
|
|
9
|
-
if (row.role === 'owner' && row.agent_group_id !== null) {
|
|
10
|
-
throw new Error('owner role must be global (agent_group_id = null)');
|
|
11
|
-
}
|
|
12
|
-
getDb()
|
|
13
|
-
.prepare(
|
|
14
|
-
`INSERT INTO user_roles (user_id, role, agent_group_id, granted_by, granted_at)
|
|
15
|
-
VALUES (@user_id, @role, @agent_group_id, @granted_by, @granted_at)`,
|
|
16
|
-
)
|
|
17
|
-
.run(row);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function revokeRole(userId: string, role: UserRoleKind, agentGroupId: string | null): void {
|
|
21
|
-
if (agentGroupId === null) {
|
|
22
|
-
getDb()
|
|
23
|
-
.prepare('DELETE FROM user_roles WHERE user_id = ? AND role = ? AND agent_group_id IS NULL')
|
|
24
|
-
.run(userId, role);
|
|
25
|
-
} else {
|
|
26
|
-
getDb()
|
|
27
|
-
.prepare('DELETE FROM user_roles WHERE user_id = ? AND role = ? AND agent_group_id = ?')
|
|
28
|
-
.run(userId, role, agentGroupId);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function getUserRoles(userId: string): UserRole[] {
|
|
33
|
-
return getDb().prepare('SELECT * FROM user_roles WHERE user_id = ?').all(userId) as UserRole[];
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function isOwner(userId: string): boolean {
|
|
37
|
-
const row = getDb()
|
|
38
|
-
.prepare('SELECT 1 FROM user_roles WHERE user_id = ? AND role = ? AND agent_group_id IS NULL LIMIT 1')
|
|
39
|
-
.get(userId, 'owner');
|
|
40
|
-
return !!row;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function isGlobalAdmin(userId: string): boolean {
|
|
44
|
-
const row = getDb()
|
|
45
|
-
.prepare('SELECT 1 FROM user_roles WHERE user_id = ? AND role = ? AND agent_group_id IS NULL LIMIT 1')
|
|
46
|
-
.get(userId, 'admin');
|
|
47
|
-
return !!row;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function isAdminOfAgentGroup(userId: string, agentGroupId: string): boolean {
|
|
51
|
-
const row = getDb()
|
|
52
|
-
.prepare('SELECT 1 FROM user_roles WHERE user_id = ? AND role = ? AND agent_group_id = ? LIMIT 1')
|
|
53
|
-
.get(userId, 'admin', agentGroupId);
|
|
54
|
-
return !!row;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** Any admin privilege over this agent group: global admin OR scoped admin. */
|
|
58
|
-
export function hasAdminPrivilege(userId: string, agentGroupId: string): boolean {
|
|
59
|
-
return isOwner(userId) || isGlobalAdmin(userId) || isAdminOfAgentGroup(userId, agentGroupId);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export function getOwners(): UserRole[] {
|
|
63
|
-
return getDb()
|
|
64
|
-
.prepare('SELECT * FROM user_roles WHERE role = ? AND agent_group_id IS NULL ORDER BY granted_at')
|
|
65
|
-
.all('owner') as UserRole[];
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export function hasAnyOwner(): boolean {
|
|
69
|
-
const row = getDb()
|
|
70
|
-
.prepare('SELECT 1 FROM user_roles WHERE role = ? AND agent_group_id IS NULL LIMIT 1')
|
|
71
|
-
.get('owner');
|
|
72
|
-
return !!row;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export function getGlobalAdmins(): UserRole[] {
|
|
76
|
-
return getDb()
|
|
77
|
-
.prepare('SELECT * FROM user_roles WHERE role = ? AND agent_group_id IS NULL ORDER BY granted_at')
|
|
78
|
-
.all('admin') as UserRole[];
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export function getAdminsOfAgentGroup(agentGroupId: string): UserRole[] {
|
|
82
|
-
return getDb()
|
|
83
|
-
.prepare('SELECT * FROM user_roles WHERE role = ? AND agent_group_id = ? ORDER BY granted_at')
|
|
84
|
-
.all('admin', agentGroupId) as UserRole[];
|
|
85
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { User } from '../../../types.js';
|
|
2
|
-
import { getDb } from '../../../db/connection.js';
|
|
3
|
-
|
|
4
|
-
export function createUser(user: User): void {
|
|
5
|
-
getDb()
|
|
6
|
-
.prepare(
|
|
7
|
-
`INSERT INTO users (id, kind, display_name, created_at)
|
|
8
|
-
VALUES (@id, @kind, @display_name, @created_at)`,
|
|
9
|
-
)
|
|
10
|
-
.run(user);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function upsertUser(user: User): void {
|
|
14
|
-
getDb()
|
|
15
|
-
.prepare(
|
|
16
|
-
`INSERT INTO users (id, kind, display_name, created_at)
|
|
17
|
-
VALUES (@id, @kind, @display_name, @created_at)
|
|
18
|
-
ON CONFLICT(id) DO UPDATE SET
|
|
19
|
-
display_name = COALESCE(excluded.display_name, users.display_name)`,
|
|
20
|
-
)
|
|
21
|
-
.run(user);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export function getUser(id: string): User | undefined {
|
|
25
|
-
return getDb().prepare('SELECT * FROM users WHERE id = ?').get(id) as User | undefined;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function getAllUsers(): User[] {
|
|
29
|
-
return getDb().prepare('SELECT * FROM users ORDER BY created_at').all() as User[];
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export function updateDisplayName(id: string, displayName: string): void {
|
|
33
|
-
getDb().prepare('UPDATE users SET display_name = ? WHERE id = ?').run(displayName, id);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function deleteUser(id: string): void {
|
|
37
|
-
getDb().prepare('DELETE FROM users WHERE id = ?').run(id);
|
|
38
|
-
}
|