@vellumai/assistant 0.6.2 → 0.6.4
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/ARCHITECTURE.md +273 -10
- package/Dockerfile +2 -3
- package/bun.lock +41 -49
- package/bunfig.toml +3 -0
- package/docs/architecture/memory.md +1 -1
- package/docs/backup-troubleshooting.md +52 -0
- package/docs/browser-use-architecture-phase2.md +174 -0
- package/docs/stt-provider-onboarding.md +120 -0
- package/knip.json +12 -2
- package/node_modules/@vellumai/ces-contracts/bun.lock +8 -6
- package/node_modules/@vellumai/ces-contracts/package.json +3 -3
- package/node_modules/@vellumai/ces-contracts/src/rpc.ts +42 -0
- package/openapi.yaml +1111 -86
- package/package.json +40 -42
- package/scripts/generate-openapi.ts +0 -2
- package/scripts/test.sh +73 -18
- package/src/__tests__/acp-session.test.ts +43 -0
- package/src/__tests__/agent-image-optimize.test.ts +28 -0
- package/src/__tests__/agent-loop.test.ts +123 -0
- package/src/__tests__/anthropic-provider.test.ts +263 -10
- package/src/__tests__/app-builder-tool-scripts.test.ts +1 -0
- package/src/__tests__/app-executors.test.ts +1 -0
- package/src/__tests__/app-source-watcher.test.ts +37 -11
- package/src/__tests__/approval-routes-http.test.ts +178 -1
- package/src/__tests__/auto-analysis-end-to-end.test.ts +550 -0
- package/src/__tests__/auto-analysis-prompt.test.ts +50 -0
- package/src/__tests__/browser-fill-credential.test.ts +240 -94
- package/src/__tests__/browser-manager.test.ts +40 -27
- package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
- package/src/__tests__/browser-skill-endstate.test.ts +31 -7
- package/src/__tests__/btw-routes.test.ts +7 -0
- package/src/__tests__/call-controller.test.ts +581 -20
- package/src/__tests__/catalog-files.test.ts +1000 -0
- package/src/__tests__/channel-approvals.test.ts +53 -0
- package/src/__tests__/channel-invite-transport.test.ts +2 -2
- package/src/__tests__/channel-readiness-routes.test.ts +16 -20
- package/src/__tests__/channel-readiness-service.test.ts +12 -7
- package/src/__tests__/checker.test.ts +157 -10
- package/src/__tests__/clawhub-files.test.ts +347 -0
- package/src/__tests__/commit-message-enrichment-service.test.ts +36 -19
- package/src/__tests__/config-analysis.test.ts +100 -0
- package/src/__tests__/config-managed-gemini-defaults.test.ts +326 -0
- package/src/__tests__/config-schema-cmd.test.ts +2 -2
- package/src/__tests__/config-schema.test.ts +1248 -224
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +339 -0
- package/src/__tests__/config-watcher.test.ts +43 -8
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +23 -0
- package/src/__tests__/contact-store-user-file.test.ts +512 -0
- package/src/__tests__/contacts-write.test.ts +197 -0
- package/src/__tests__/context-overflow-approval.test.ts +16 -1
- package/src/__tests__/context-window-manager.test.ts +88 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -1
- package/src/__tests__/conversation-agent-loop.test.ts +99 -3
- package/src/__tests__/conversation-analysis-routes.test.ts +2 -2
- package/src/__tests__/conversation-attachments.test.ts +80 -4
- package/src/__tests__/conversation-confirmation-signals.test.ts +290 -0
- package/src/__tests__/conversation-error.test.ts +70 -0
- package/src/__tests__/conversation-fork-crud.test.ts +17 -0
- package/src/__tests__/conversation-history-web-search.test.ts +12 -4
- package/src/__tests__/conversation-host-access-routes.test.ts +229 -0
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -1
- package/src/__tests__/conversation-inject-context.test.ts +103 -0
- package/src/__tests__/conversation-launcher-skill-regression.test.ts +51 -0
- package/src/__tests__/conversation-list-source.test.ts +145 -0
- package/src/__tests__/conversation-pre-run-repair.test.ts +2 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -0
- package/src/__tests__/conversation-queue.test.ts +946 -62
- package/src/__tests__/conversation-routes-disk-view.test.ts +275 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +16 -0
- package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +324 -46
- package/src/__tests__/conversation-skill-tools.test.ts +7 -4
- package/src/__tests__/conversation-slash-commands.test.ts +33 -0
- package/src/__tests__/conversation-slash-queue.test.ts +89 -18
- package/src/__tests__/conversation-slash-unknown.test.ts +2 -0
- package/src/__tests__/conversation-starter-routes.test.ts +126 -0
- package/src/__tests__/conversation-starters-cadence.test.ts +161 -0
- package/src/__tests__/conversation-store.test.ts +195 -0
- package/src/__tests__/conversation-tool-setup-batch-authorized.test.ts +226 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +193 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +2 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +2 -0
- package/src/__tests__/credential-execution-approval-bridge.test.ts +32 -1
- package/src/__tests__/credential-health-service.test.ts +352 -0
- package/src/__tests__/credential-security-invariants.test.ts +6 -3
- package/src/__tests__/credential-vault-unit.test.ts +383 -7
- package/src/__tests__/credential-vault.test.ts +152 -13
- package/src/__tests__/credentials-cli.test.ts +42 -18
- package/src/__tests__/cross-provider-web-search.test.ts +146 -35
- package/src/__tests__/date-context.test.ts +4 -4
- package/src/__tests__/deterministic-verification-control-plane.test.ts +10 -1
- package/src/__tests__/device-id.test.ts +112 -0
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +167 -4
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +1 -3
- package/src/__tests__/email-html-renderer.test.ts +71 -0
- package/src/__tests__/email-invite-adapter.test.ts +36 -32
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +256 -0
- package/src/__tests__/emit-event-signal.test.ts +71 -0
- package/src/__tests__/extension-id-sync-guard.test.ts +222 -0
- package/src/__tests__/fixtures/mock-chrome-extension.ts +386 -0
- package/src/__tests__/gateway-only-enforcement.test.ts +206 -1
- package/src/__tests__/gateway-only-guard.test.ts +2 -0
- package/src/__tests__/gemini-provider.test.ts +66 -2
- package/src/__tests__/get-skill-detail-audit.test.ts +325 -0
- package/src/__tests__/gmail-archive-fallback.test.ts +193 -0
- package/src/__tests__/gmail-archive-gate.test.ts +246 -0
- package/src/__tests__/gmail-preferences.test.ts +117 -0
- package/src/__tests__/guardian-routing-invariants.test.ts +70 -2
- package/src/__tests__/headless-browser-interactions.test.ts +738 -359
- package/src/__tests__/headless-browser-mode.test.ts +614 -0
- package/src/__tests__/headless-browser-navigate.test.ts +528 -49
- package/src/__tests__/headless-browser-read-tools.test.ts +274 -100
- package/src/__tests__/headless-browser-snapshot.test.ts +250 -77
- package/src/__tests__/heartbeat-service.test.ts +70 -17
- package/src/__tests__/home-state-routes.test.ts +162 -0
- package/src/__tests__/host-bash-proxy.test.ts +145 -1
- package/src/__tests__/host-browser-e2e-cloud.test.ts +596 -0
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +286 -0
- package/src/__tests__/host-browser-e2e-self-hosted.test.ts +374 -0
- package/src/__tests__/host-browser-event-routes.test.ts +350 -0
- package/src/__tests__/host-browser-proxy.test.ts +444 -0
- package/src/__tests__/host-browser-routes.test.ts +198 -0
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +423 -0
- package/src/__tests__/host-cu-proxy.test.ts +166 -1
- package/src/__tests__/host-file-proxy.test.ts +185 -1
- package/src/__tests__/host-file-read-tool.test.ts +52 -0
- package/src/__tests__/host-proxy-interface.test.ts +165 -0
- package/src/__tests__/host-shell-tool.test.ts +1 -11
- package/src/__tests__/http-user-message-parity.test.ts +1 -0
- package/src/__tests__/identity-intro-cache.test.ts +40 -10
- package/src/__tests__/init-feature-flag-overrides.test.ts +38 -112
- package/src/__tests__/integration-status.test.ts +6 -7
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +141 -0
- package/src/__tests__/list-messages-tool-merge.test.ts +37 -12
- package/src/__tests__/llm-context-normalization.test.ts +488 -0
- package/src/__tests__/llm-context-route-provider.test.ts +86 -5
- package/src/__tests__/llm-usage-store.test.ts +363 -0
- package/src/__tests__/mcp-client-auth.test.ts +40 -4
- package/src/__tests__/mcp-health-check.test.ts +10 -3
- package/src/__tests__/media-stream-output.test.ts +555 -0
- package/src/__tests__/media-stream-parser.test.ts +374 -0
- package/src/__tests__/media-stream-server-integration.test.ts +1234 -0
- package/src/__tests__/media-stream-stt-session.test.ts +588 -0
- package/src/__tests__/media-turn-detector.test.ts +440 -0
- package/src/__tests__/message-queue.test.ts +125 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +3 -1
- package/src/__tests__/migration-export-http.test.ts +67 -8
- package/src/__tests__/migration-export-streaming.test.ts +66 -0
- package/src/__tests__/migration-import-commit-http.test.ts +109 -7
- package/src/__tests__/migration-import-preflight-http.test.ts +6 -5
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +151 -0
- package/src/__tests__/model-intents.test.ts +2 -2
- package/src/__tests__/native-host-marker-sync-guard.test.ts +157 -0
- package/src/__tests__/oauth-apps-routes.test.ts +18 -12
- package/src/__tests__/oauth-cli.test.ts +709 -60
- package/src/__tests__/oauth-connect-orchestrator.test.ts +118 -24
- package/src/__tests__/oauth-provider-seed-logos.test.ts +23 -0
- package/src/__tests__/oauth-provider-serializer.test.ts +147 -10
- package/src/__tests__/oauth-provider-visibility.test.ts +19 -21
- package/src/__tests__/oauth-providers-routes.test.ts +52 -14
- package/src/__tests__/oauth-store.test.ts +1465 -176
- package/src/__tests__/oauth2-gateway-transport.test.ts +460 -26
- package/src/__tests__/onboarding-template-contract.test.ts +81 -70
- package/src/__tests__/openai-provider.test.ts +178 -2
- package/src/__tests__/openai-responses-cutover-guard.test.ts +184 -0
- package/src/__tests__/openai-responses-provider.test.ts +1105 -0
- package/src/__tests__/openrouter-token-estimation.test.ts +100 -0
- package/src/__tests__/outlook-categories.test.ts +1 -1
- package/src/__tests__/outlook-client-automation.test.ts +1 -1
- package/src/__tests__/outlook-compose-tools.test.ts +1 -1
- package/src/__tests__/outlook-email-watcher.test.ts +1 -1
- package/src/__tests__/outlook-follow-up.test.ts +1 -1
- package/src/__tests__/outlook-messaging-provider.test.ts +2 -2
- package/src/__tests__/outlook-trash.test.ts +1 -1
- package/src/__tests__/outlook-unsubscribe.test.ts +32 -3
- package/src/__tests__/permission-checker-host-gate.test.ts +74 -14
- package/src/__tests__/permission-mode.test.ts +28 -56
- package/src/__tests__/persona-resolver.test.ts +251 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +4 -0
- package/src/__tests__/platform-callback-registration.test.ts +19 -0
- package/src/__tests__/platform.test.ts +92 -1
- package/src/__tests__/post-turn-tool-result-truncation.test.ts +343 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +267 -0
- package/src/__tests__/pricing.test.ts +174 -0
- package/src/__tests__/proxy-approval-callback.test.ts +18 -0
- package/src/__tests__/qdrant-manager.test.ts +29 -8
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +194 -0
- package/src/__tests__/relationship-state-contract.test.ts +175 -0
- package/src/__tests__/relay-server.test.ts +423 -5
- package/src/__tests__/require-fresh-approval.test.ts +40 -1
- package/src/__tests__/sanitize-config-for-transfer.test.ts +132 -0
- package/src/__tests__/schedule-routes.test.ts +162 -0
- package/src/__tests__/search-skills-unified.test.ts +118 -0
- package/src/__tests__/secret-detection-handler.test.ts +84 -0
- package/src/__tests__/secret-ingress-http.test.ts +1 -0
- package/src/__tests__/secret-scanner-executor.test.ts +4 -0
- package/src/__tests__/secure-keys.test.ts +107 -0
- package/src/__tests__/send-endpoint-busy.test.ts +8 -1
- package/src/__tests__/sequence-store.test.ts +1 -1
- package/src/__tests__/server-history-render.test.ts +49 -0
- package/src/__tests__/set-permission-mode.test.ts +13 -250
- package/src/__tests__/settings-routes.test.ts +201 -0
- package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +801 -0
- package/src/__tests__/skills-files-catalog-fallback.test.ts +738 -0
- package/src/__tests__/skills.test.ts +5 -2
- package/src/__tests__/skillssh-files.test.ts +446 -0
- package/src/__tests__/slack-block-formatting.test.ts +110 -0
- package/src/__tests__/slack-channel-config.test.ts +576 -16
- package/src/__tests__/stt-catalog-parity.test.ts +282 -0
- package/src/__tests__/stt-stream-session.test.ts +535 -0
- package/src/__tests__/subagent-detail.test.ts +44 -2
- package/src/__tests__/subagent-disposal.test.ts +1 -0
- package/src/__tests__/subagent-fork-notifications.test.ts +291 -0
- package/src/__tests__/subagent-fork-spawn.test.ts +384 -0
- package/src/__tests__/subagent-manager-notify.test.ts +1 -0
- package/src/__tests__/subagent-notify-parent.test.ts +1 -0
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +411 -0
- package/src/__tests__/subagent-tools.test.ts +1 -0
- package/src/__tests__/subagent-types.test.ts +1 -0
- package/src/__tests__/system-prompt-ask-mode.test.ts +27 -71
- package/src/__tests__/system-prompt.test.ts +184 -27
- package/src/__tests__/task-scheduler.test.ts +32 -6
- package/src/__tests__/telegram-config.test.ts +10 -13
- package/src/__tests__/telephony-stt-routing.test.ts +329 -0
- package/src/__tests__/terminal-tools.test.ts +25 -5
- package/src/__tests__/test-preload.ts +18 -0
- package/src/__tests__/test-support/browser-skill-harness.ts +4 -1
- package/src/__tests__/tool-approval-handler.test.ts +73 -0
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +9 -5
- package/src/__tests__/tool-executor-shell-integration.test.ts +4 -0
- package/src/__tests__/tool-executor.test.ts +33 -24
- package/src/__tests__/tool-result-truncation.test.ts +36 -0
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +22 -0
- package/src/__tests__/top-level-renderer.test.ts +73 -1
- package/src/__tests__/transport-hints-queue.test.ts +14 -29
- package/src/__tests__/trust-store.test.ts +7 -1
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +1 -1
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +109 -0
- package/src/__tests__/tts-catalog-parity.test.ts +345 -0
- package/src/__tests__/twilio-routes-twiml.test.ts +512 -114
- package/src/__tests__/twilio-routes.test.ts +376 -0
- package/src/__tests__/unicode.test.ts +293 -0
- package/src/__tests__/update-bulletin-format.test.ts +59 -0
- package/src/__tests__/update-bulletin.test.ts +206 -5
- package/src/__tests__/usage-routes.test.ts +25 -4
- package/src/__tests__/user-reference.test.ts +46 -61
- package/src/__tests__/v2-consent-policy.test.ts +103 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +4 -0
- package/src/__tests__/voice-config-update.test.ts +403 -0
- package/src/__tests__/voice-quality.test.ts +434 -19
- package/src/__tests__/workspace-heartbeat-service.test.ts +7 -0
- package/src/__tests__/workspace-migration-033-stt-service-explicit-config.test.ts +547 -0
- package/src/__tests__/workspace-migration-034-remove-calls-voice-transcription-provider.test.ts +596 -0
- package/src/__tests__/workspace-migration-drop-user-md.test.ts +368 -0
- package/src/__tests__/workspace-migration-meets.test.ts +244 -0
- package/src/__tests__/workspace-migration-seed-device-id.test.ts +14 -20
- package/src/__tests__/workspace-policy.test.ts +2 -0
- package/src/acp/client-handler.ts +30 -4
- package/src/agent/image-optimize.ts +24 -12
- package/src/agent/loop.ts +55 -9
- package/src/approvals/guardian-request-resolvers.ts +21 -15
- package/src/backup/__tests__/backup-key.test.ts +152 -0
- package/src/backup/__tests__/backup-worker.test.ts +767 -0
- package/src/backup/__tests__/list-snapshots.test.ts +87 -0
- package/src/backup/__tests__/local-writer.test.ts +218 -0
- package/src/backup/__tests__/offsite-writer.test.ts +641 -0
- package/src/backup/__tests__/paths.test.ts +300 -0
- package/src/backup/__tests__/restore.test.ts +498 -0
- package/src/backup/__tests__/snapshot-lock.test.ts +352 -0
- package/src/backup/__tests__/stream-crypt.test.ts +228 -0
- package/src/backup/backup-key.ts +137 -0
- package/src/backup/backup-worker.ts +459 -0
- package/src/backup/list-snapshots.ts +147 -0
- package/src/backup/local-writer.ts +133 -0
- package/src/backup/offsite-writer.ts +222 -0
- package/src/backup/paths.ts +226 -0
- package/src/backup/restore.ts +322 -0
- package/src/backup/snapshot-lock.ts +431 -0
- package/src/backup/stream-crypt.ts +263 -0
- package/src/browser-session/__tests__/manager.test.ts +297 -0
- package/src/browser-session/backends/cdp-inspect.ts +30 -0
- package/src/browser-session/backends/extension.ts +26 -0
- package/src/browser-session/backends/local.ts +24 -0
- package/src/browser-session/events.ts +164 -0
- package/src/browser-session/index.ts +27 -0
- package/src/browser-session/manager.ts +159 -0
- package/src/browser-session/types.ts +28 -0
- package/src/bundler/package-resolver.ts +4 -0
- package/src/calls/audio-store.ts +11 -5
- package/src/calls/call-controller.ts +226 -71
- package/src/calls/call-domain.ts +9 -0
- package/src/calls/call-speech-output.ts +190 -0
- package/src/calls/call-transport.ts +77 -0
- package/src/calls/media-stream-audio-transcode.ts +173 -0
- package/src/calls/media-stream-output.ts +660 -0
- package/src/calls/media-stream-parser.ts +300 -0
- package/src/calls/media-stream-protocol.ts +166 -0
- package/src/calls/media-stream-server.ts +592 -0
- package/src/calls/media-stream-stt-session.ts +460 -0
- package/src/calls/media-turn-detector.ts +230 -0
- package/src/calls/relay-server.ts +90 -75
- package/src/calls/resolve-call-tts-provider.ts +136 -0
- package/src/calls/telephony-stt-routing.ts +145 -0
- package/src/calls/tts-call-strategy.ts +161 -0
- package/src/calls/tts-text-sanitizer.ts +32 -16
- package/src/calls/twilio-routes.ts +281 -17
- package/src/calls/voice-quality.ts +78 -35
- package/src/calls/voice-session-bridge.ts +8 -1
- package/src/channels/__tests__/types.test.ts +134 -0
- package/src/channels/types.ts +69 -3
- package/src/cli/__tests__/run-assistant-command.ts +11 -1
- package/src/cli/commands/__tests__/backup.test.ts +1165 -0
- package/src/cli/commands/__tests__/domain-register.test.ts +234 -0
- package/src/cli/commands/__tests__/domain-status.test.ts +132 -0
- package/src/cli/commands/__tests__/email-attachment.test.ts +422 -0
- package/src/cli/commands/__tests__/email-download.test.ts +16 -1
- package/src/cli/commands/__tests__/email-list.test.ts +22 -4
- package/src/cli/commands/__tests__/email-register.test.ts +4 -4
- package/src/cli/commands/__tests__/email-send.test.ts +37 -4
- package/src/cli/commands/__tests__/email-status.test.ts +5 -1
- package/src/cli/commands/__tests__/email-unregister.test.ts +34 -5
- package/src/cli/commands/backup.ts +993 -0
- package/src/cli/commands/conversations.ts +77 -0
- package/src/cli/commands/credentials.ts +3 -4
- package/src/cli/commands/domain.ts +210 -0
- package/src/cli/commands/email.ts +273 -16
- package/src/cli/commands/mcp.ts +16 -4
- package/src/cli/commands/oauth/__tests__/connect.test.ts +56 -44
- package/src/cli/commands/oauth/__tests__/disconnect.test.ts +21 -21
- package/src/cli/commands/oauth/__tests__/mode.test.ts +17 -17
- package/src/cli/commands/oauth/__tests__/ping.test.ts +16 -16
- package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +32 -33
- package/src/cli/commands/oauth/__tests__/providers-register.test.ts +330 -0
- package/src/cli/commands/oauth/__tests__/providers-update.test.ts +117 -12
- package/src/cli/commands/oauth/__tests__/status.test.ts +10 -10
- package/src/cli/commands/oauth/__tests__/token.test.ts +7 -7
- package/src/cli/commands/oauth/apps.ts +7 -4
- package/src/cli/commands/oauth/connect.ts +6 -3
- package/src/cli/commands/oauth/disconnect.ts +1 -1
- package/src/cli/commands/oauth/mode.ts +12 -3
- package/src/cli/commands/oauth/providers.ts +215 -36
- package/src/cli/commands/oauth/shared.ts +7 -6
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +254 -0
- package/src/cli/commands/platform/__tests__/connect.test.ts +6 -0
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +6 -0
- package/src/cli/commands/platform/index.ts +107 -10
- package/src/cli/commands/usage.ts +10 -9
- package/src/cli/lib/daemon-credential-client.ts +4 -0
- package/src/cli/program.ts +30 -4
- package/src/config/__tests__/backup-schema.test.ts +134 -0
- package/src/config/assistant-feature-flags.ts +61 -62
- package/src/config/bundled-skills/app-builder/SKILL.md +26 -249
- package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +141 -0
- package/src/config/bundled-skills/app-builder/references/INTERACTION_HOOKS.md +56 -0
- package/src/config/bundled-skills/app-builder/references/WIDGETS.md +125 -0
- package/src/config/bundled-skills/browser/SKILL.md +30 -5
- package/src/config/bundled-skills/browser/TOOLS.json +123 -0
- package/src/config/bundled-skills/browser/tools/browser-attach.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-detach.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-status.ts +12 -0
- package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +17 -0
- package/src/config/bundled-skills/contacts/SKILL.md +5 -2
- package/src/config/bundled-skills/document/SKILL.md +4 -0
- package/src/config/bundled-skills/gmail/SKILL.md +54 -8
- package/src/config/bundled-skills/gmail/TOOLS.json +33 -3
- package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +116 -9
- package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +138 -11
- package/src/config/bundled-skills/gmail/tools/gmail-preferences-tool.ts +59 -0
- package/src/config/bundled-skills/gmail/tools/gmail-preferences.ts +82 -0
- package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +113 -17
- package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +2 -2
- package/src/config/bundled-skills/media-processing/SKILL.md +3 -9
- package/src/config/bundled-skills/media-processing/TOOLS.json +1 -6
- package/src/config/bundled-skills/media-processing/__tests__/audio-transcribe.test.ts +125 -0
- package/src/config/bundled-skills/media-processing/__tests__/extract-keyframes.test.ts +181 -0
- package/src/config/bundled-skills/media-processing/__tests__/preprocess-audio.test.ts +141 -0
- package/src/config/bundled-skills/media-processing/services/audio-transcribe.ts +32 -87
- package/src/config/bundled-skills/media-processing/services/preprocess.ts +8 -4
- package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +0 -10
- package/src/config/bundled-skills/messaging/SKILL.md +3 -3
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +2 -2
- package/src/config/bundled-skills/outlook/SKILL.md +9 -2
- package/src/config/bundled-skills/outlook/tools/outlook-unsubscribe.ts +2 -2
- package/src/config/bundled-skills/phone-calls/SKILL.md +2 -2
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +27 -18
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +3 -3
- package/src/config/bundled-skills/settings/TOOLS.json +3 -3
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +26 -22
- package/src/config/bundled-skills/slack/SKILL.md +1 -0
- package/src/config/bundled-skills/subagent/SKILL.md +21 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +8 -4
- package/src/config/bundled-skills/tasks/SKILL.md +5 -0
- package/src/config/bundled-skills/transcribe/SKILL.md +9 -14
- package/src/config/bundled-skills/transcribe/TOOLS.json +2 -7
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +256 -0
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +38 -188
- package/src/config/bundled-tool-registry.ts +8 -0
- package/src/config/env-registry.ts +38 -0
- package/src/config/env.ts +49 -4
- package/src/config/feature-flag-registry.json +85 -14
- package/src/config/loader.ts +82 -13
- package/src/config/sanitize-for-transfer.ts +47 -0
- package/src/config/schema.ts +81 -15
- package/src/config/schemas/__tests__/stt.test.ts +43 -0
- package/src/config/schemas/analysis.ts +51 -0
- package/src/config/schemas/backup.ts +72 -0
- package/src/config/schemas/calls.ts +1 -26
- package/src/config/schemas/elevenlabs.ts +0 -59
- package/src/config/schemas/filing.ts +47 -7
- package/src/config/schemas/heartbeat.ts +27 -5
- package/src/config/schemas/host-browser.ts +112 -0
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/memory-lifecycle.ts +14 -2
- package/src/config/schemas/memory-retrieval.ts +103 -0
- package/src/config/schemas/security.ts +0 -6
- package/src/config/schemas/services.ts +52 -0
- package/src/config/schemas/stt.ts +59 -0
- package/src/config/schemas/tts.ts +230 -0
- package/src/config/schemas/updates.ts +14 -0
- package/src/config/skills.ts +4 -0
- package/src/config/types.ts +4 -1
- package/src/contacts/contact-store.ts +56 -11
- package/src/contacts/contacts-write.ts +38 -1
- package/src/context/post-turn-tool-result-truncation.ts +177 -0
- package/src/context/tool-result-truncation.ts +2 -1
- package/src/context/window-manager.ts +61 -10
- package/src/credential-execution/approval-bridge.ts +49 -15
- package/src/credential-execution/executable-discovery.ts +12 -2
- package/src/credential-execution/process-manager.ts +33 -2
- package/src/credential-health/credential-health-service.ts +366 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +324 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +497 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +195 -0
- package/src/daemon/__tests__/lifecycle-startup-ordering.test.ts +127 -0
- package/src/daemon/app-source-watcher.ts +35 -0
- package/src/daemon/config-watcher.ts +99 -5
- package/src/daemon/context-overflow-approval.ts +5 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +23 -2
- package/src/daemon/conversation-agent-loop.ts +153 -42
- package/src/daemon/conversation-attachments.ts +40 -0
- package/src/daemon/conversation-error.ts +11 -0
- package/src/daemon/conversation-history.ts +40 -6
- package/src/daemon/conversation-launch.ts +220 -0
- package/src/daemon/conversation-lifecycle.ts +59 -9
- package/src/daemon/conversation-messaging.ts +37 -3
- package/src/daemon/conversation-notifiers.ts +5 -0
- package/src/daemon/conversation-process.ts +622 -13
- package/src/daemon/conversation-queue-manager.ts +24 -0
- package/src/daemon/conversation-runtime-assembly.ts +128 -36
- package/src/daemon/conversation-slash.ts +36 -0
- package/src/daemon/conversation-surfaces.ts +131 -40
- package/src/daemon/conversation-tool-setup.ts +99 -8
- package/src/daemon/conversation-usage.ts +7 -4
- package/src/daemon/conversation-workspace.ts +12 -0
- package/src/daemon/conversation.ts +292 -16
- package/src/daemon/date-context.ts +10 -10
- package/src/daemon/first-greeting.ts +3 -2
- package/src/daemon/handlers/config-slack-channel.ts +269 -94
- package/src/daemon/handlers/conversations.ts +13 -141
- package/src/daemon/handlers/shared.ts +80 -0
- package/src/daemon/handlers/skills.ts +483 -44
- package/src/daemon/host-bash-proxy.ts +48 -13
- package/src/daemon/host-browser-proxy.ts +192 -0
- package/src/daemon/host-cu-proxy.ts +36 -11
- package/src/daemon/host-file-proxy.ts +57 -9
- package/src/daemon/lifecycle.ts +179 -28
- package/src/daemon/message-protocol.ts +13 -0
- package/src/daemon/message-types/conversations.ts +89 -14
- package/src/daemon/message-types/home.ts +40 -0
- package/src/daemon/message-types/host-browser.ts +100 -0
- package/src/daemon/message-types/meet.ts +143 -0
- package/src/daemon/message-types/messages.ts +19 -5
- package/src/daemon/message-types/schedules.ts +34 -2
- package/src/daemon/message-types/skills.ts +26 -0
- package/src/daemon/message-types/subagents.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/server.ts +439 -14
- package/src/daemon/shutdown-handlers.ts +32 -4
- package/src/daemon/shutdown-registry.ts +40 -0
- package/src/daemon/tool-side-effects.ts +15 -0
- package/src/daemon/transport-hints.ts +5 -24
- package/src/email/html-renderer.ts +76 -0
- package/src/heartbeat/heartbeat-service.ts +93 -7
- package/src/home/__tests__/assistant-feed-authoring.test.ts +156 -0
- package/src/home/__tests__/emit-feed-event.test.ts +169 -0
- package/src/home/__tests__/feed-scheduler.test.ts +194 -0
- package/src/home/__tests__/feed-types.test.ts +275 -0
- package/src/home/__tests__/feed-writer.test.ts +688 -0
- package/src/home/__tests__/phase5-exit-criteria.test.ts +212 -0
- package/src/home/__tests__/platform-gmail-digest.test.ts +222 -0
- package/src/home/__tests__/progress-formula.test.ts +213 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +740 -0
- package/src/home/__tests__/rollup-producer.test.ts +398 -0
- package/src/home/assistant-feed-authoring.ts +124 -0
- package/src/home/emit-feed-event.ts +158 -0
- package/src/home/feed-scheduler.ts +247 -0
- package/src/home/feed-types.ts +181 -0
- package/src/home/feed-writer.ts +469 -0
- package/src/home/platform-gmail-digest.ts +163 -0
- package/src/home/progress-formula.ts +86 -0
- package/src/home/relationship-state-writer.ts +824 -0
- package/src/home/relationship-state.ts +143 -0
- package/src/home/rollup-producer.ts +384 -0
- package/src/hooks/runner.ts +7 -0
- package/src/inbound/platform-callback-registration.ts +30 -20
- package/src/inbound/public-ingress-urls.ts +12 -0
- package/src/instrument.ts +1 -1
- package/src/ipc/__tests__/cli-ipc.test.ts +200 -0
- package/src/ipc/cli-client.ts +151 -0
- package/src/ipc/cli-server.ts +234 -0
- package/src/ipc/gateway-client.ts +180 -0
- package/src/ipc/routes/index.ts +5 -0
- package/src/ipc/routes/wake-conversation.ts +19 -0
- package/src/mcp/client.ts +59 -24
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +356 -0
- package/src/memory/__tests__/auto-analysis-guard.test.ts +57 -0
- package/src/memory/__tests__/conversation-analyze-job.test.ts +232 -0
- package/src/memory/__tests__/find-analysis-conversation.test.ts +196 -0
- package/src/memory/app-store.ts +31 -1
- package/src/memory/attachments-store.ts +70 -0
- package/src/memory/auto-analysis-enqueue.ts +127 -0
- package/src/memory/auto-analysis-guard.ts +27 -0
- package/src/memory/cleanup-schedule-state.ts +37 -0
- package/src/memory/conversation-analyze-job.ts +73 -0
- package/src/memory/conversation-crud.ts +122 -0
- package/src/memory/conversation-disk-view.ts +7 -0
- package/src/memory/conversation-group-migration.ts +34 -2
- package/src/memory/conversation-queries.ts +6 -5
- package/src/memory/conversation-starters-cadence.ts +76 -0
- package/src/memory/conversation-title-service.ts +5 -2
- package/src/memory/db-init.ts +18 -0
- package/src/memory/db-maintenance.ts +108 -0
- package/src/memory/db.ts +1 -0
- package/src/memory/embedding-backend.test.ts +75 -0
- package/src/memory/embedding-backend.ts +131 -5
- package/src/memory/embedding-gemini.test.ts +54 -0
- package/src/memory/embedding-gemini.ts +20 -9
- package/src/memory/embedding-local.ts +176 -17
- package/src/memory/graph/consolidation.ts +10 -23
- package/src/memory/graph/conversation-graph-memory.ts +15 -0
- package/src/memory/graph/extraction-job.ts +15 -0
- package/src/memory/graph/extraction.test.ts +23 -0
- package/src/memory/graph/extraction.ts +8 -0
- package/src/memory/graph/retriever.ts +67 -40
- package/src/memory/graph/scoring.test.ts +186 -0
- package/src/memory/graph/scoring.ts +31 -1
- package/src/memory/graph/store.test.ts +7 -3
- package/src/memory/graph/store.ts +47 -12
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/group-crud.ts +6 -1
- package/src/memory/indexer.ts +95 -16
- package/src/memory/job-handlers/cleanup.ts +11 -8
- package/src/memory/job-handlers/conversation-starters.ts +16 -10
- package/src/memory/jobs-store.ts +64 -4
- package/src/memory/jobs-worker.ts +22 -9
- package/src/memory/llm-usage-store.ts +137 -60
- package/src/memory/migrations/213-oauth-providers-scope-separator.ts +13 -0
- package/src/memory/migrations/214-oauth-providers-refresh-url.ts +11 -0
- package/src/memory/migrations/215-oauth-providers-revoke.ts +14 -0
- package/src/memory/migrations/216-oauth-providers-token-auth-method.ts +30 -0
- package/src/memory/migrations/217-conversation-host-access.ts +40 -0
- package/src/memory/migrations/218-oauth-providers-logo-url.ts +11 -0
- package/src/memory/migrations/219-oauth-providers-token-exchange-body-format.ts +15 -0
- package/src/memory/migrations/220-normalize-user-file-by-principal.ts +190 -0
- package/src/memory/migrations/221-conversations-archived-at.ts +16 -0
- package/src/memory/migrations/index.ts +12 -0
- package/src/memory/migrations/registry.ts +16 -0
- package/src/memory/qdrant-manager.ts +43 -16
- package/src/memory/schema/conversations.ts +3 -0
- package/src/memory/schema/oauth.ts +21 -13
- package/src/memory/usage-buckets.ts +396 -0
- package/src/messaging/providers/gmail/client.ts +57 -6
- package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +282 -0
- package/src/messaging/providers/slack/adapter.ts +143 -38
- package/src/messaging/providers/slack/client.ts +16 -0
- package/src/messaging/providers/slack/types.ts +4 -0
- package/src/notifications/decision-engine.ts +3 -3
- package/src/notifications/signal.ts +5 -0
- package/src/oauth/AGENTS.md +76 -0
- package/src/oauth/__tests__/identity-verifier.test.ts +25 -19
- package/src/oauth/__tests__/seed-providers-managed.test.ts +32 -0
- package/src/oauth/byo-connection.test.ts +26 -9
- package/src/oauth/byo-connection.ts +10 -8
- package/src/oauth/connect-orchestrator.ts +25 -21
- package/src/oauth/connect-types.ts +3 -3
- package/src/oauth/connection-resolver.test.ts +17 -4
- package/src/oauth/connection-resolver.ts +22 -18
- package/src/oauth/connection.ts +3 -1
- package/src/oauth/manual-token-connection.ts +13 -13
- package/src/oauth/oauth-store.ts +223 -100
- package/src/oauth/platform-connection.test.ts +101 -3
- package/src/oauth/platform-connection.ts +56 -35
- package/src/oauth/provider-serializer.ts +31 -5
- package/src/oauth/revoke.ts +76 -0
- package/src/oauth/seed-providers.ts +133 -87
- package/src/oauth/token-persistence.ts +1 -1
- package/src/permissions/checker.ts +16 -6
- package/src/permissions/defaults.ts +49 -1
- package/src/permissions/permission-mode.ts +4 -11
- package/src/permissions/prompter.ts +13 -1
- package/src/permissions/trust-store.ts +3 -3
- package/src/permissions/v2-consent-policy.ts +87 -0
- package/src/permissions/workspace-policy.ts +3 -0
- package/src/platform/client.test.ts +10 -0
- package/src/platform/sync-identity.ts +129 -0
- package/src/prompts/persona-resolver.ts +126 -2
- package/src/prompts/system-prompt.ts +76 -38
- package/src/prompts/templates/BOOTSTRAP-REFERENCE.md +3 -65
- package/src/prompts/templates/BOOTSTRAP.md +59 -105
- package/src/prompts/templates/SOUL.md +3 -1
- package/src/prompts/templates/UPDATES.md +12 -0
- package/src/prompts/templates/channels/slack.md +20 -0
- package/src/prompts/update-bulletin-format.ts +26 -9
- package/src/prompts/update-bulletin.ts +34 -23
- package/src/prompts/user-reference.ts +20 -17
- package/src/providers/__tests__/provider-secret-catalog.test.ts +42 -0
- package/src/providers/anthropic/client.ts +157 -60
- package/src/providers/fireworks/client.ts +2 -2
- package/src/providers/gemini/client.ts +9 -1
- package/src/providers/model-catalog.ts +6 -0
- package/src/providers/model-intents.ts +4 -4
- package/src/providers/ollama/client.ts +2 -2
- package/src/providers/openai/chat-completions-provider.ts +474 -0
- package/src/providers/openai/client.ts +25 -440
- package/src/providers/openai/responses-provider.ts +502 -0
- package/src/providers/openrouter/client.ts +101 -4
- package/src/providers/provider-secret-catalog.ts +139 -0
- package/src/providers/registry.ts +2 -2
- package/src/providers/retry.ts +14 -3
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +251 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +828 -0
- package/src/providers/speech-to-text/deepgram-realtime.test.ts +980 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +767 -0
- package/src/providers/speech-to-text/deepgram.test.ts +332 -0
- package/src/providers/speech-to-text/deepgram.ts +115 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.test.ts +743 -0
- package/src/providers/speech-to-text/google-gemini-live-stream.ts +625 -0
- package/src/providers/speech-to-text/google-gemini.test.ts +226 -0
- package/src/providers/speech-to-text/google-gemini.ts +101 -0
- package/src/providers/speech-to-text/openai-whisper-stream.test.ts +564 -0
- package/src/providers/speech-to-text/openai-whisper-stream.ts +381 -0
- package/src/providers/speech-to-text/openai-whisper.test.ts +1 -37
- package/src/providers/speech-to-text/openai-whisper.ts +63 -33
- package/src/providers/speech-to-text/provider-catalog.ts +306 -0
- package/src/providers/speech-to-text/resolve.ts +386 -6
- package/src/providers/types.ts +10 -1
- package/src/runtime/AGENTS.md +65 -0
- package/src/runtime/__tests__/agent-wake.test.ts +831 -0
- package/src/runtime/__tests__/browser-extension-pair-routes.test.ts +715 -0
- package/src/runtime/__tests__/capability-tokens.test.ts +258 -0
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +518 -0
- package/src/runtime/__tests__/runtime-mode.test.ts +62 -0
- package/src/runtime/__tests__/slack-block-formatting.test.ts +481 -0
- package/src/runtime/agent-wake.ts +512 -0
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +1 -0
- package/src/runtime/auth/__tests__/middleware.test.ts +116 -1
- package/src/runtime/auth/__tests__/route-policy.test.ts +48 -0
- package/src/runtime/auth/middleware.ts +98 -0
- package/src/runtime/auth/route-policy.ts +33 -9
- package/src/runtime/auth/token-service.ts +56 -1
- package/src/runtime/btw-sidechain.ts +2 -0
- package/src/runtime/capability-tokens.ts +414 -0
- package/src/runtime/channel-approvals.ts +18 -5
- package/src/runtime/channel-invite-transport.ts +1 -1
- package/src/runtime/channel-invite-transports/email.ts +14 -6
- package/src/runtime/channel-readiness-service.ts +12 -22
- package/src/runtime/chrome-extension-registry.ts +368 -0
- package/src/runtime/confirmation-request-guardian-bridge.ts +6 -0
- package/src/runtime/guardian-decision-types.ts +7 -0
- package/src/runtime/http-server.ts +815 -75
- package/src/runtime/http-types.ts +6 -2
- package/src/runtime/migrations/__tests__/rebind-secrets-credentials.test.ts +172 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +276 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +198 -0
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +360 -0
- package/src/runtime/migrations/migration-transport.ts +7 -0
- package/src/runtime/migrations/migration-wizard.ts +23 -2
- package/src/runtime/migrations/rebind-secrets-screen.ts +76 -15
- package/src/runtime/migrations/vbundle-builder.ts +145 -38
- package/src/runtime/migrations/vbundle-import-analyzer.ts +96 -1
- package/src/runtime/migrations/vbundle-importer.ts +89 -5
- package/src/runtime/pending-interactions.ts +18 -13
- package/src/runtime/routes/__tests__/backup-routes.test.ts +967 -0
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +507 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +208 -0
- package/src/runtime/routes/__tests__/stt-routes.test.ts +406 -0
- package/src/runtime/routes/__tests__/tts-routes.test.ts +474 -0
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +148 -17
- package/src/runtime/routes/app-management-routes.ts +12 -18
- package/src/runtime/routes/approval-routes.ts +90 -16
- package/src/runtime/routes/attachment-routes.test.ts +9 -3
- package/src/runtime/routes/attachment-routes.ts +216 -17
- package/src/runtime/routes/backup-routes.ts +519 -0
- package/src/runtime/routes/browser-extension-pair-routes.ts +556 -0
- package/src/runtime/routes/btw-routes.ts +8 -6
- package/src/runtime/routes/contact-routes.test.ts +298 -0
- package/src/runtime/routes/contact-routes.ts +132 -5
- package/src/runtime/routes/conversation-analysis-routes.ts +22 -141
- package/src/runtime/routes/conversation-management-routes.ts +223 -0
- package/src/runtime/routes/conversation-routes.ts +598 -103
- package/src/runtime/routes/conversation-starter-routes.ts +78 -16
- package/src/runtime/routes/filing-routes.ts +93 -0
- package/src/runtime/routes/guardian-action-routes.ts +24 -13
- package/src/runtime/routes/home-feed-routes.ts +334 -0
- package/src/runtime/routes/home-state-routes.ts +138 -0
- package/src/runtime/routes/host-browser-routes.ts +268 -0
- package/src/runtime/routes/host-file-routes.ts +9 -1
- package/src/runtime/routes/identity-intro-cache.ts +7 -3
- package/src/runtime/routes/identity-routes.ts +262 -33
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +46 -39
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +15 -15
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +137 -0
- package/src/runtime/routes/integrations/slack/__tests__/share.test.ts +179 -0
- package/src/runtime/routes/integrations/slack/channel.ts +11 -3
- package/src/runtime/routes/integrations/slack/share.ts +45 -7
- package/src/runtime/routes/llm-context-normalization.ts +303 -0
- package/src/runtime/routes/log-export-routes.ts +42 -22
- package/src/runtime/routes/memory-item-routes.test.ts +3 -2
- package/src/runtime/routes/memory-item-routes.ts +1 -7
- package/src/runtime/routes/migration-routes.ts +122 -2
- package/src/runtime/routes/oauth-apps.ts +15 -17
- package/src/runtime/routes/oauth-providers.ts +4 -0
- package/src/runtime/routes/schedule-routes.ts +24 -11
- package/src/runtime/routes/settings-routes.ts +31 -102
- package/src/runtime/routes/skills-routes.ts +128 -9
- package/src/runtime/routes/stt-routes.ts +233 -0
- package/src/runtime/routes/subagents-routes.ts +14 -10
- package/src/runtime/routes/surface-action-routes.ts +41 -2
- package/src/runtime/routes/tts-routes.ts +108 -24
- package/src/runtime/routes/usage-routes.ts +38 -9
- package/src/runtime/routes/user-route-dispatcher.ts +50 -5
- package/src/runtime/routes/user-routes.ts +13 -1
- package/src/runtime/routes/work-items-routes.ts +8 -1
- package/src/runtime/routes/workspace-routes.test.ts +22 -0
- package/src/runtime/routes/workspace-routes.ts +8 -1
- package/src/runtime/routes/workspace-utils.ts +2 -0
- package/src/runtime/runtime-mode.ts +33 -0
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +444 -0
- package/src/runtime/services/__tests__/analyze-deps-singleton.test.ts +67 -0
- package/src/runtime/services/__tests__/auto-analysis-prompt.test.ts +53 -0
- package/src/runtime/services/__tests__/manual-analysis-prompt.test.ts +41 -0
- package/src/runtime/services/analyze-conversation.ts +344 -0
- package/src/runtime/services/analyze-deps-singleton.ts +32 -0
- package/src/runtime/services/auto-analysis-prompt.ts +55 -0
- package/src/runtime/skill-route-registry.ts +49 -0
- package/src/runtime/slack-block-formatting.ts +437 -10
- package/src/schedule/scheduler.ts +57 -5
- package/src/security/ces-credential-client.ts +20 -0
- package/src/security/ces-rpc-credential-backend.ts +17 -0
- package/src/security/credential-backend.ts +5 -0
- package/src/security/oauth2.ts +68 -29
- package/src/security/secure-keys.ts +143 -27
- package/src/security/token-manager.ts +31 -10
- package/src/sequence/engine.ts +23 -0
- package/src/sequence/types.ts +1 -1
- package/src/skills/catalog-files.ts +554 -0
- package/src/skills/category-inference.ts +122 -0
- package/src/skills/clawhub-files.ts +213 -0
- package/src/skills/clawhub.ts +84 -23
- package/src/skills/skill-file-provider.ts +40 -0
- package/src/skills/skillssh-files.ts +395 -0
- package/src/skills/skillssh-registry.ts +4 -4
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +392 -0
- package/src/stt/__tests__/types.test.ts +89 -0
- package/src/stt/daemon-batch-transcriber.ts +195 -0
- package/src/stt/stt-stream-session.ts +499 -0
- package/src/stt/types.ts +330 -0
- package/src/stt/wav-encoder.test.ts +373 -0
- package/src/stt/wav-encoder.ts +175 -0
- package/src/subagent/manager.ts +169 -40
- package/src/subagent/types.ts +19 -0
- package/src/tools/apps/executors.ts +11 -2
- package/src/tools/browser/__tests__/auth-detector.test.ts +202 -108
- package/src/tools/browser/__tests__/browser-mode.test.ts +119 -0
- package/src/tools/browser/__tests__/browser-status.test.ts +123 -0
- package/src/tools/browser/auth-detector.ts +43 -12
- package/src/tools/browser/browser-execution.ts +1787 -342
- package/src/tools/browser/browser-manager.ts +81 -12
- package/src/tools/browser/browser-mode-constants.ts +12 -0
- package/src/tools/browser/browser-mode.ts +92 -0
- package/src/tools/browser/browser-status-constants.ts +33 -0
- package/src/tools/browser/cdp-client/__tests__/accessibility-snapshot.test.ts +318 -0
- package/src/tools/browser/cdp-client/__tests__/cdp-dom-helpers.test.ts +1175 -0
- package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +1263 -0
- package/src/tools/browser/cdp-client/__tests__/extension-cdp-client.test.ts +359 -0
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +1993 -0
- package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-nested-frames.json +64 -0
- package/src/tools/browser/cdp-client/__tests__/fixtures/ax-tree-simple.json +69 -0
- package/src/tools/browser/cdp-client/__tests__/local-cdp-client.test.ts +310 -0
- package/src/tools/browser/cdp-client/__tests__/types.test.ts +96 -0
- package/src/tools/browser/cdp-client/accessibility-snapshot.ts +387 -0
- package/src/tools/browser/cdp-client/cdp-dom-helpers.ts +695 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/discovery.test.ts +1007 -0
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +580 -0
- package/src/tools/browser/cdp-client/cdp-inspect/discovery.ts +744 -0
- package/src/tools/browser/cdp-client/cdp-inspect/ws-transport.ts +579 -0
- package/src/tools/browser/cdp-client/cdp-inspect-client.ts +868 -0
- package/src/tools/browser/cdp-client/errors.ts +49 -0
- package/src/tools/browser/cdp-client/extension-cdp-client.ts +148 -0
- package/src/tools/browser/cdp-client/factory.ts +914 -0
- package/src/tools/browser/cdp-client/index.ts +28 -0
- package/src/tools/browser/cdp-client/local-cdp-client.ts +187 -0
- package/src/tools/browser/cdp-client/types.ts +120 -0
- package/src/tools/credentials/vault.ts +35 -6
- package/src/tools/filesystem/edit.ts +1 -1
- package/src/tools/filesystem/list.ts +1 -1
- package/src/tools/filesystem/read.ts +1 -1
- package/src/tools/filesystem/write.ts +2 -1
- package/src/tools/host-filesystem/edit.ts +1 -1
- package/src/tools/host-filesystem/read.ts +12 -15
- package/src/tools/host-filesystem/write.ts +1 -1
- package/src/tools/host-terminal/host-shell.ts +21 -16
- package/src/tools/network/web-fetch.ts +5 -2
- package/src/tools/network/web-search.ts +5 -2
- package/src/tools/permission-checker.ts +77 -82
- package/src/tools/registry.ts +0 -2
- package/src/tools/secret-detection-handler.ts +34 -0
- package/src/tools/shared/filesystem/image-read.ts +61 -40
- package/src/tools/shared/shell-output.ts +3 -1
- package/src/tools/side-effects.ts +2 -0
- package/src/tools/skills/sandbox-runner.ts +3 -2
- package/src/tools/subagent/spawn.ts +47 -3
- package/src/tools/subagent/status.ts +2 -0
- package/src/tools/system/register.ts +2 -16
- package/src/tools/terminal/safe-env.ts +15 -0
- package/src/tools/terminal/shell.ts +36 -20
- package/src/tools/tool-approval-handler.ts +48 -2
- package/src/tools/tool-manifest.ts +21 -0
- package/src/tools/types.ts +19 -0
- package/src/tools/ui-surface/definitions.ts +6 -1
- package/src/tts/__tests__/provider-adapters.test.ts +834 -0
- package/src/tts/__tests__/provider-catalog-consistency.test.ts +196 -0
- package/src/tts/__tests__/provider-catalog.test.ts +183 -0
- package/src/tts/__tests__/provider-registry.test.ts +90 -0
- package/src/tts/provider-catalog.ts +201 -0
- package/src/tts/provider-registry.ts +73 -0
- package/src/tts/providers/deepgram-provider.ts +219 -0
- package/src/tts/providers/elevenlabs-provider.ts +211 -0
- package/src/tts/providers/fish-audio-provider.ts +183 -0
- package/src/tts/providers/index.ts +42 -0
- package/src/tts/providers/register-builtins.ts +130 -0
- package/src/tts/synthesize-text.ts +110 -0
- package/src/tts/tts-config-resolver.ts +78 -0
- package/src/tts/types.ts +153 -0
- package/src/types/onboarding-context.ts +7 -0
- package/src/util/abort-reasons.ts +58 -0
- package/src/util/device-id.ts +32 -16
- package/src/util/errors.ts +9 -1
- package/src/util/platform.ts +63 -24
- package/src/util/pricing.ts +66 -3
- package/src/util/spawn.ts +1 -1
- package/src/util/truncate.ts +4 -2
- package/src/util/unicode.ts +201 -0
- package/src/version.ts +19 -24
- package/src/watcher/engine.ts +23 -0
- package/src/watcher/watcher-store.ts +31 -0
- package/src/workspace/migrations/003-seed-device-id.ts +9 -3
- package/src/workspace/migrations/017-seed-persona-dirs.ts +68 -4
- package/src/workspace/migrations/029-seed-pkb.ts +1 -1
- package/src/workspace/migrations/031-drop-user-md.ts +317 -0
- package/src/workspace/migrations/031-llm-log-retention-zero-to-null.ts +73 -0
- package/src/workspace/migrations/032-tts-provider-unification.ts +227 -0
- package/src/workspace/migrations/033-stt-service-explicit-config.ts +122 -0
- package/src/workspace/migrations/034-remove-calls-voice-transcription-provider.ts +215 -0
- package/src/workspace/migrations/035-seed-slack-channel-persona.ts +50 -0
- package/src/workspace/migrations/036-update-pkb-index-bar.ts +37 -0
- package/src/workspace/migrations/037-create-meets-dir.ts +61 -0
- package/src/workspace/migrations/registry.ts +16 -0
- package/src/workspace/top-level-renderer.ts +31 -1
- package/src/workspace/turn-commit.ts +31 -0
- package/src/__tests__/chrome-cdp.test.ts +0 -419
- package/src/__tests__/email-cli.test.ts +0 -297
- package/src/__tests__/email-service-config-fallback.test.ts +0 -102
- package/src/__tests__/permission-mode-sse.test.ts +0 -418
- package/src/__tests__/permission-mode-store.test.ts +0 -277
- package/src/browser-extension-relay/protocol.ts +0 -63
- package/src/browser-extension-relay/server.ts +0 -203
- package/src/cli/commands/browser-relay.ts +0 -536
- package/src/config/schemas/sandbox.ts +0 -14
- package/src/email/guardrails.ts +0 -221
- package/src/email/provider.ts +0 -117
- package/src/email/providers/agentmail.ts +0 -361
- package/src/email/providers/index.ts +0 -65
- package/src/email/service.ts +0 -384
- package/src/email/types.ts +0 -126
- package/src/permissions/permission-mode-store.ts +0 -180
- package/src/prompts/templates/USER.md +0 -13
- package/src/providers/speech-to-text/types.ts +0 -17
- package/src/tools/browser/chrome-cdp.ts +0 -239
- package/src/tools/system/set-permission-mode.ts +0 -103
|
@@ -30,6 +30,7 @@ export interface SlackChannelConfigResult {
|
|
|
30
30
|
success: boolean;
|
|
31
31
|
hasBotToken: boolean;
|
|
32
32
|
hasAppToken: boolean;
|
|
33
|
+
hasUserToken: boolean;
|
|
33
34
|
connected: boolean;
|
|
34
35
|
teamId?: string;
|
|
35
36
|
teamName?: string;
|
|
@@ -58,18 +59,33 @@ function ensureBotTokenInjectionTemplates(): void {
|
|
|
58
59
|
});
|
|
59
60
|
}
|
|
60
61
|
|
|
62
|
+
/** Ensure the user token credential has injection templates for the proxy. */
|
|
63
|
+
function ensureUserTokenInjectionTemplates(): void {
|
|
64
|
+
upsertCredentialMetadata("slack_channel", "user_token", {
|
|
65
|
+
allowedDomains: ["slack.com"],
|
|
66
|
+
injectionTemplates: SLACK_INJECTION_TEMPLATES,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
61
70
|
/**
|
|
62
|
-
* Backfill injection templates on the Slack
|
|
71
|
+
* Backfill injection templates on the Slack credentials.
|
|
63
72
|
* Called on daemon startup so existing credentials get proxy support.
|
|
64
73
|
*/
|
|
65
74
|
export function backfillSlackInjectionTemplates(): void {
|
|
66
|
-
const
|
|
75
|
+
const botMeta = getCredentialMetadata("slack_channel", "bot_token");
|
|
67
76
|
if (
|
|
68
|
-
|
|
69
|
-
(!
|
|
77
|
+
botMeta &&
|
|
78
|
+
(!botMeta.injectionTemplates || botMeta.injectionTemplates.length === 0)
|
|
70
79
|
) {
|
|
71
80
|
ensureBotTokenInjectionTemplates();
|
|
72
81
|
}
|
|
82
|
+
const userMeta = getCredentialMetadata("slack_channel", "user_token");
|
|
83
|
+
if (
|
|
84
|
+
userMeta &&
|
|
85
|
+
(!userMeta.injectionTemplates || userMeta.injectionTemplates.length === 0)
|
|
86
|
+
) {
|
|
87
|
+
ensureUserTokenInjectionTemplates();
|
|
88
|
+
}
|
|
73
89
|
}
|
|
74
90
|
|
|
75
91
|
// -- Business logic --
|
|
@@ -87,6 +103,9 @@ export async function getSlackChannelConfig(): Promise<SlackChannelConfigResult>
|
|
|
87
103
|
const hasAppToken = !!(await getSecureKeyAsync(
|
|
88
104
|
credentialKey("slack_channel", "app_token"),
|
|
89
105
|
));
|
|
106
|
+
const hasUserToken = !!(await getSecureKeyAsync(
|
|
107
|
+
credentialKey("slack_channel", "user_token"),
|
|
108
|
+
));
|
|
90
109
|
const conn = getConnectionByProvider("slack_channel");
|
|
91
110
|
const connected =
|
|
92
111
|
!!(conn && conn.status === "active") && hasBotToken && hasAppToken;
|
|
@@ -96,11 +115,15 @@ export async function getSlackChannelConfig(): Promise<SlackChannelConfigResult>
|
|
|
96
115
|
if (hasBotToken) {
|
|
97
116
|
ensureBotTokenInjectionTemplates();
|
|
98
117
|
}
|
|
118
|
+
if (hasUserToken) {
|
|
119
|
+
ensureUserTokenInjectionTemplates();
|
|
120
|
+
}
|
|
99
121
|
|
|
100
122
|
return {
|
|
101
123
|
success: true,
|
|
102
124
|
hasBotToken,
|
|
103
125
|
hasAppToken,
|
|
126
|
+
hasUserToken,
|
|
104
127
|
connected,
|
|
105
128
|
...(teamId ? { teamId } : {}),
|
|
106
129
|
...(teamName ? { teamName } : {}),
|
|
@@ -109,9 +132,37 @@ export async function getSlackChannelConfig(): Promise<SlackChannelConfigResult>
|
|
|
109
132
|
};
|
|
110
133
|
}
|
|
111
134
|
|
|
135
|
+
/** Build an error-path result snapshot that reports the current credential state. */
|
|
136
|
+
async function currentErrorSnapshot(
|
|
137
|
+
error: string,
|
|
138
|
+
): Promise<SlackChannelConfigResult> {
|
|
139
|
+
const errHasBotToken = !!(await getSecureKeyAsync(
|
|
140
|
+
credentialKey("slack_channel", "bot_token"),
|
|
141
|
+
));
|
|
142
|
+
const errHasAppToken = !!(await getSecureKeyAsync(
|
|
143
|
+
credentialKey("slack_channel", "app_token"),
|
|
144
|
+
));
|
|
145
|
+
const errHasUserToken = !!(await getSecureKeyAsync(
|
|
146
|
+
credentialKey("slack_channel", "user_token"),
|
|
147
|
+
));
|
|
148
|
+
const errConn = getConnectionByProvider("slack_channel");
|
|
149
|
+
return {
|
|
150
|
+
success: false,
|
|
151
|
+
hasBotToken: errHasBotToken,
|
|
152
|
+
hasAppToken: errHasAppToken,
|
|
153
|
+
hasUserToken: errHasUserToken,
|
|
154
|
+
connected:
|
|
155
|
+
!!(errConn && errConn.status === "active") &&
|
|
156
|
+
errHasBotToken &&
|
|
157
|
+
errHasAppToken,
|
|
158
|
+
error,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
112
162
|
export async function setSlackChannelConfig(
|
|
113
163
|
botToken?: string,
|
|
114
164
|
appToken?: string,
|
|
165
|
+
userToken?: string,
|
|
115
166
|
): Promise<SlackChannelConfigResult> {
|
|
116
167
|
let metadata: {
|
|
117
168
|
teamId?: string;
|
|
@@ -138,25 +189,9 @@ export async function setSlackChannelConfig(
|
|
|
138
189
|
user?: string;
|
|
139
190
|
};
|
|
140
191
|
if (!data.ok) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
)
|
|
144
|
-
const errHasAppToken = !!(await getSecureKeyAsync(
|
|
145
|
-
credentialKey("slack_channel", "app_token"),
|
|
146
|
-
));
|
|
147
|
-
const errConn = getConnectionByProvider("slack_channel");
|
|
148
|
-
return {
|
|
149
|
-
success: false,
|
|
150
|
-
hasBotToken: errHasBotToken,
|
|
151
|
-
hasAppToken: errHasAppToken,
|
|
152
|
-
connected:
|
|
153
|
-
!!(errConn && errConn.status === "active") &&
|
|
154
|
-
errHasBotToken &&
|
|
155
|
-
errHasAppToken,
|
|
156
|
-
error: `Slack API validation failed: ${
|
|
157
|
-
data.error ?? "unknown error"
|
|
158
|
-
}`,
|
|
159
|
-
};
|
|
192
|
+
return currentErrorSnapshot(
|
|
193
|
+
`Slack API validation failed: ${data.error ?? "unknown error"}`,
|
|
194
|
+
);
|
|
160
195
|
}
|
|
161
196
|
metadata = {
|
|
162
197
|
teamId: data.team_id,
|
|
@@ -166,23 +201,7 @@ export async function setSlackChannelConfig(
|
|
|
166
201
|
};
|
|
167
202
|
} catch (err) {
|
|
168
203
|
const message = err instanceof Error ? err.message : String(err);
|
|
169
|
-
|
|
170
|
-
credentialKey("slack_channel", "bot_token"),
|
|
171
|
-
));
|
|
172
|
-
const errHasAppToken = !!(await getSecureKeyAsync(
|
|
173
|
-
credentialKey("slack_channel", "app_token"),
|
|
174
|
-
));
|
|
175
|
-
const errConn = getConnectionByProvider("slack_channel");
|
|
176
|
-
return {
|
|
177
|
-
success: false,
|
|
178
|
-
hasBotToken: errHasBotToken,
|
|
179
|
-
hasAppToken: errHasAppToken,
|
|
180
|
-
connected:
|
|
181
|
-
!!(errConn && errConn.status === "active") &&
|
|
182
|
-
errHasBotToken &&
|
|
183
|
-
errHasAppToken,
|
|
184
|
-
error: `Failed to validate bot token: ${message}`,
|
|
185
|
-
};
|
|
204
|
+
return currentErrorSnapshot(`Failed to validate bot token: ${message}`);
|
|
186
205
|
}
|
|
187
206
|
|
|
188
207
|
const stored = await setSecureKeyAsync(
|
|
@@ -190,23 +209,7 @@ export async function setSlackChannelConfig(
|
|
|
190
209
|
botToken,
|
|
191
210
|
);
|
|
192
211
|
if (!stored) {
|
|
193
|
-
|
|
194
|
-
credentialKey("slack_channel", "bot_token"),
|
|
195
|
-
));
|
|
196
|
-
const errHasAppToken = !!(await getSecureKeyAsync(
|
|
197
|
-
credentialKey("slack_channel", "app_token"),
|
|
198
|
-
));
|
|
199
|
-
const errConn = getConnectionByProvider("slack_channel");
|
|
200
|
-
return {
|
|
201
|
-
success: false,
|
|
202
|
-
hasBotToken: errHasBotToken,
|
|
203
|
-
hasAppToken: errHasAppToken,
|
|
204
|
-
connected:
|
|
205
|
-
!!(errConn && errConn.status === "active") &&
|
|
206
|
-
errHasBotToken &&
|
|
207
|
-
errHasAppToken,
|
|
208
|
-
error: "Failed to store bot token in secure storage",
|
|
209
|
-
};
|
|
212
|
+
return currentErrorSnapshot("Failed to store bot token in secure storage");
|
|
210
213
|
}
|
|
211
214
|
|
|
212
215
|
ensureBotTokenInjectionTemplates();
|
|
@@ -218,6 +221,73 @@ export async function setSlackChannelConfig(
|
|
|
218
221
|
setNestedValue(raw, "slack.botUsername", metadata.botUsername ?? "");
|
|
219
222
|
saveRawConfig(raw);
|
|
220
223
|
invalidateConfigCache();
|
|
224
|
+
|
|
225
|
+
// Cross-check existing user_token against the newly-stored bot_token's
|
|
226
|
+
// workspace. A user_token persisted under a previous workspace (or whose
|
|
227
|
+
// auth.test returns ok:false) must be cleared so reads and writes never
|
|
228
|
+
// fan out across workspaces.
|
|
229
|
+
//
|
|
230
|
+
// IMPORTANT: we only clear on a definitive negative signal —
|
|
231
|
+
// (a) auth.test returned ok:false, or
|
|
232
|
+
// (b) auth.test returned ok:true with a team_id that differs from the new
|
|
233
|
+
// bot_token's team_id.
|
|
234
|
+
//
|
|
235
|
+
// Transient failures (network error, non-JSON response, JSON parse error)
|
|
236
|
+
// must NOT wipe a still-valid user_token: for user-scope installs,
|
|
237
|
+
// re-issuing can require admin approval. The adapter already tolerates a
|
|
238
|
+
// stale token — it will surface on next real use, at which point the user
|
|
239
|
+
// can re-run setup.
|
|
240
|
+
const existingUserToken = await getSecureKeyAsync(
|
|
241
|
+
credentialKey("slack_channel", "user_token"),
|
|
242
|
+
);
|
|
243
|
+
if (existingUserToken) {
|
|
244
|
+
let shouldClear = false;
|
|
245
|
+
let clearReason: string | undefined;
|
|
246
|
+
try {
|
|
247
|
+
const res = await fetch("https://slack.com/api/auth.test", {
|
|
248
|
+
method: "POST",
|
|
249
|
+
headers: { Authorization: `Bearer ${existingUserToken}` },
|
|
250
|
+
});
|
|
251
|
+
const data = (await res.json()) as {
|
|
252
|
+
ok: boolean;
|
|
253
|
+
error?: string;
|
|
254
|
+
team_id?: string;
|
|
255
|
+
};
|
|
256
|
+
if (!data.ok) {
|
|
257
|
+
shouldClear = true;
|
|
258
|
+
clearReason = "User token validation failed; it has been removed.";
|
|
259
|
+
} else if (
|
|
260
|
+
metadata.teamId &&
|
|
261
|
+
data.team_id &&
|
|
262
|
+
data.team_id !== metadata.teamId
|
|
263
|
+
) {
|
|
264
|
+
shouldClear = true;
|
|
265
|
+
clearReason =
|
|
266
|
+
"User token from a different workspace was removed.";
|
|
267
|
+
}
|
|
268
|
+
} catch (err) {
|
|
269
|
+
// Transient failure (DNS error, network blip, connection reset,
|
|
270
|
+
// non-JSON response, JSON parse failure). Leave the user_token in
|
|
271
|
+
// place — we have no definitive signal that it's invalid. Future
|
|
272
|
+
// reads that actually hit Slack will fail naturally if the token is
|
|
273
|
+
// actually bad, and the user can re-run setup then.
|
|
274
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
275
|
+
_log.warn(
|
|
276
|
+
{ err: message },
|
|
277
|
+
"Skipping user_token re-validation due to transient error; leaving existing user_token in place.",
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
if (shouldClear) {
|
|
281
|
+
const cleared = await clearSlackUserToken();
|
|
282
|
+
if (!cleared.success) {
|
|
283
|
+
const failMsg =
|
|
284
|
+
"User token workspace mismatch detected but removal failed; please clear it manually.";
|
|
285
|
+
warning = warning ? `${warning} ${failMsg}` : failMsg;
|
|
286
|
+
} else if (clearReason) {
|
|
287
|
+
warning = warning ? `${warning} ${clearReason}` : clearReason;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
221
291
|
} else {
|
|
222
292
|
// Use existing metadata from config if no new bot token provided
|
|
223
293
|
const { teamId, teamName, botUserId, botUsername } = getConfig().slack;
|
|
@@ -232,23 +302,7 @@ export async function setSlackChannelConfig(
|
|
|
232
302
|
// Validate and store app token
|
|
233
303
|
if (appToken) {
|
|
234
304
|
if (!appToken.startsWith("xapp-")) {
|
|
235
|
-
|
|
236
|
-
credentialKey("slack_channel", "bot_token"),
|
|
237
|
-
));
|
|
238
|
-
const errHasAppToken = !!(await getSecureKeyAsync(
|
|
239
|
-
credentialKey("slack_channel", "app_token"),
|
|
240
|
-
));
|
|
241
|
-
const errConn = getConnectionByProvider("slack_channel");
|
|
242
|
-
return {
|
|
243
|
-
success: false,
|
|
244
|
-
hasBotToken: errHasBotToken,
|
|
245
|
-
hasAppToken: errHasAppToken,
|
|
246
|
-
connected:
|
|
247
|
-
!!(errConn && errConn.status === "active") &&
|
|
248
|
-
errHasBotToken &&
|
|
249
|
-
errHasAppToken,
|
|
250
|
-
error: 'Invalid app token: must start with "xapp-"',
|
|
251
|
-
};
|
|
305
|
+
return currentErrorSnapshot('Invalid app token: must start with "xapp-"');
|
|
252
306
|
}
|
|
253
307
|
|
|
254
308
|
const stored = await setSecureKeyAsync(
|
|
@@ -256,41 +310,86 @@ export async function setSlackChannelConfig(
|
|
|
256
310
|
appToken,
|
|
257
311
|
);
|
|
258
312
|
if (!stored) {
|
|
259
|
-
|
|
260
|
-
credentialKey("slack_channel", "bot_token"),
|
|
261
|
-
));
|
|
262
|
-
const errHasAppToken = !!(await getSecureKeyAsync(
|
|
263
|
-
credentialKey("slack_channel", "app_token"),
|
|
264
|
-
));
|
|
265
|
-
const errConn = getConnectionByProvider("slack_channel");
|
|
266
|
-
return {
|
|
267
|
-
success: false,
|
|
268
|
-
hasBotToken: errHasBotToken,
|
|
269
|
-
hasAppToken: errHasAppToken,
|
|
270
|
-
connected:
|
|
271
|
-
!!(errConn && errConn.status === "active") &&
|
|
272
|
-
errHasBotToken &&
|
|
273
|
-
errHasAppToken,
|
|
274
|
-
error: "Failed to store app token in secure storage",
|
|
275
|
-
};
|
|
313
|
+
return currentErrorSnapshot("Failed to store app token in secure storage");
|
|
276
314
|
}
|
|
277
315
|
|
|
278
316
|
upsertCredentialMetadata("slack_channel", "app_token", {});
|
|
279
317
|
}
|
|
280
318
|
|
|
319
|
+
// Validate and store user token (optional — grants read access to channels
|
|
320
|
+
// the bot isn't a member of; writes always continue to go through the bot).
|
|
321
|
+
if (userToken) {
|
|
322
|
+
if (!userToken.startsWith("xoxp-")) {
|
|
323
|
+
return currentErrorSnapshot(
|
|
324
|
+
'Invalid user token: must start with "xoxp-"',
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
let userTeamId: string | undefined;
|
|
329
|
+
try {
|
|
330
|
+
const res = await fetch("https://slack.com/api/auth.test", {
|
|
331
|
+
method: "POST",
|
|
332
|
+
headers: { Authorization: `Bearer ${userToken}` },
|
|
333
|
+
});
|
|
334
|
+
const data = (await res.json()) as {
|
|
335
|
+
ok: boolean;
|
|
336
|
+
error?: string;
|
|
337
|
+
team_id?: string;
|
|
338
|
+
};
|
|
339
|
+
if (!data.ok) {
|
|
340
|
+
return currentErrorSnapshot(
|
|
341
|
+
`Slack API validation failed: ${data.error ?? "unknown error"}`,
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
userTeamId = data.team_id;
|
|
345
|
+
} catch (err) {
|
|
346
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
347
|
+
return currentErrorSnapshot(
|
|
348
|
+
`Failed to validate user token: ${message}`,
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// Cross-check: if a bot token has already been configured, the user token
|
|
353
|
+
// must be for the same workspace. If no bot token is configured yet, store
|
|
354
|
+
// provisionally and skip the cross-check — the order of setup can vary.
|
|
355
|
+
const existingBotTeamId = metadata.teamId;
|
|
356
|
+
if (existingBotTeamId && userTeamId && existingBotTeamId !== userTeamId) {
|
|
357
|
+
return currentErrorSnapshot(
|
|
358
|
+
"User token is for a different workspace than the bot token",
|
|
359
|
+
);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const stored = await setSecureKeyAsync(
|
|
363
|
+
credentialKey("slack_channel", "user_token"),
|
|
364
|
+
userToken,
|
|
365
|
+
);
|
|
366
|
+
if (!stored) {
|
|
367
|
+
return currentErrorSnapshot(
|
|
368
|
+
"Failed to store user token in secure storage",
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
ensureUserTokenInjectionTemplates();
|
|
373
|
+
}
|
|
374
|
+
|
|
281
375
|
const hasBotToken = !!(await getSecureKeyAsync(
|
|
282
376
|
credentialKey("slack_channel", "bot_token"),
|
|
283
377
|
));
|
|
284
378
|
const hasAppToken = !!(await getSecureKeyAsync(
|
|
285
379
|
credentialKey("slack_channel", "app_token"),
|
|
286
380
|
));
|
|
381
|
+
const hasUserToken = !!(await getSecureKeyAsync(
|
|
382
|
+
credentialKey("slack_channel", "user_token"),
|
|
383
|
+
));
|
|
287
384
|
|
|
288
385
|
if (hasBotToken && !hasAppToken) {
|
|
289
|
-
|
|
386
|
+
const msg =
|
|
290
387
|
"Bot token stored but app token is missing — connection incomplete.";
|
|
388
|
+
warning = warning ? `${warning} ${msg}` : msg;
|
|
291
389
|
} else if (!hasBotToken && hasAppToken) {
|
|
292
|
-
|
|
390
|
+
const msg =
|
|
293
391
|
"App token stored but bot token is missing — connection incomplete.";
|
|
392
|
+
warning = warning ? `${warning} ${msg}` : msg;
|
|
294
393
|
}
|
|
295
394
|
|
|
296
395
|
// Sync oauth_connection record so getConnectionByProvider("slack_channel")
|
|
@@ -309,12 +408,79 @@ export async function setSlackChannelConfig(
|
|
|
309
408
|
success: true,
|
|
310
409
|
hasBotToken,
|
|
311
410
|
hasAppToken,
|
|
411
|
+
hasUserToken,
|
|
312
412
|
connected: hasBotToken && hasAppToken,
|
|
313
413
|
...metadata,
|
|
314
414
|
...(warning ? { warning } : {}),
|
|
315
415
|
};
|
|
316
416
|
}
|
|
317
417
|
|
|
418
|
+
/**
|
|
419
|
+
* Surgically remove the Slack user_token credential.
|
|
420
|
+
*
|
|
421
|
+
* Deletes only the user_token secure key and its credential metadata. Leaves
|
|
422
|
+
* the bot_token, app_token, oauth_connection row, and Slack config metadata
|
|
423
|
+
* untouched so the Socket Mode connection stays up. Returns a
|
|
424
|
+
* `SlackChannelConfigResult` reflecting the remaining state. A `not-found`
|
|
425
|
+
* delete outcome is reported as a failure to match the credential_store
|
|
426
|
+
* delete semantics (callers and automation rely on missing-credential
|
|
427
|
+
* detection).
|
|
428
|
+
*/
|
|
429
|
+
export async function clearSlackUserToken(): Promise<SlackChannelConfigResult> {
|
|
430
|
+
const result = await deleteSecureKeyAsync(
|
|
431
|
+
credentialKey("slack_channel", "user_token"),
|
|
432
|
+
);
|
|
433
|
+
|
|
434
|
+
if (result === "error" || result === "not-found") {
|
|
435
|
+
const hasBotToken = !!(await getSecureKeyAsync(
|
|
436
|
+
credentialKey("slack_channel", "bot_token"),
|
|
437
|
+
));
|
|
438
|
+
const hasAppToken = !!(await getSecureKeyAsync(
|
|
439
|
+
credentialKey("slack_channel", "app_token"),
|
|
440
|
+
));
|
|
441
|
+
const hasUserToken = !!(await getSecureKeyAsync(
|
|
442
|
+
credentialKey("slack_channel", "user_token"),
|
|
443
|
+
));
|
|
444
|
+
const conn = getConnectionByProvider("slack_channel");
|
|
445
|
+
return {
|
|
446
|
+
success: false,
|
|
447
|
+
hasBotToken,
|
|
448
|
+
hasAppToken,
|
|
449
|
+
hasUserToken,
|
|
450
|
+
connected:
|
|
451
|
+
!!(conn && conn.status === "active") && hasBotToken && hasAppToken,
|
|
452
|
+
error:
|
|
453
|
+
result === "not-found"
|
|
454
|
+
? "Slack user token not found in secure storage"
|
|
455
|
+
: "Failed to delete Slack user token from secure storage",
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
deleteCredentialMetadata("slack_channel", "user_token");
|
|
460
|
+
|
|
461
|
+
const hasBotToken = !!(await getSecureKeyAsync(
|
|
462
|
+
credentialKey("slack_channel", "bot_token"),
|
|
463
|
+
));
|
|
464
|
+
const hasAppToken = !!(await getSecureKeyAsync(
|
|
465
|
+
credentialKey("slack_channel", "app_token"),
|
|
466
|
+
));
|
|
467
|
+
const conn = getConnectionByProvider("slack_channel");
|
|
468
|
+
const { teamId, teamName, botUserId, botUsername } = getConfig().slack;
|
|
469
|
+
|
|
470
|
+
return {
|
|
471
|
+
success: true,
|
|
472
|
+
hasBotToken,
|
|
473
|
+
hasAppToken,
|
|
474
|
+
hasUserToken: false,
|
|
475
|
+
connected:
|
|
476
|
+
!!(conn && conn.status === "active") && hasBotToken && hasAppToken,
|
|
477
|
+
...(teamId ? { teamId } : {}),
|
|
478
|
+
...(teamName ? { teamName } : {}),
|
|
479
|
+
...(botUserId ? { botUserId } : {}),
|
|
480
|
+
...(botUsername ? { botUsername } : {}),
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
|
|
318
484
|
export async function clearSlackChannelConfig(): Promise<SlackChannelConfigResult> {
|
|
319
485
|
const r1 = await deleteSecureKeyAsync(
|
|
320
486
|
credentialKey("slack_channel", "bot_token"),
|
|
@@ -322,8 +488,11 @@ export async function clearSlackChannelConfig(): Promise<SlackChannelConfigResul
|
|
|
322
488
|
const r2 = await deleteSecureKeyAsync(
|
|
323
489
|
credentialKey("slack_channel", "app_token"),
|
|
324
490
|
);
|
|
491
|
+
const r3 = await deleteSecureKeyAsync(
|
|
492
|
+
credentialKey("slack_channel", "user_token"),
|
|
493
|
+
);
|
|
325
494
|
|
|
326
|
-
if (r1 === "error" || r2 === "error") {
|
|
495
|
+
if (r1 === "error" || r2 === "error" || r3 === "error") {
|
|
327
496
|
// Check each key individually so partial deletions report accurate status.
|
|
328
497
|
const hasBotToken = !!(await getSecureKeyAsync(
|
|
329
498
|
credentialKey("slack_channel", "bot_token"),
|
|
@@ -331,11 +500,15 @@ export async function clearSlackChannelConfig(): Promise<SlackChannelConfigResul
|
|
|
331
500
|
const hasAppToken = !!(await getSecureKeyAsync(
|
|
332
501
|
credentialKey("slack_channel", "app_token"),
|
|
333
502
|
));
|
|
503
|
+
const hasUserToken = !!(await getSecureKeyAsync(
|
|
504
|
+
credentialKey("slack_channel", "user_token"),
|
|
505
|
+
));
|
|
334
506
|
const conn = getConnectionByProvider("slack_channel");
|
|
335
507
|
return {
|
|
336
508
|
success: false,
|
|
337
509
|
hasBotToken,
|
|
338
510
|
hasAppToken,
|
|
511
|
+
hasUserToken,
|
|
339
512
|
connected:
|
|
340
513
|
!!(conn && conn.status === "active") && hasBotToken && hasAppToken,
|
|
341
514
|
error: "Failed to delete Slack channel credentials from secure storage",
|
|
@@ -344,6 +517,7 @@ export async function clearSlackChannelConfig(): Promise<SlackChannelConfigResul
|
|
|
344
517
|
|
|
345
518
|
deleteCredentialMetadata("slack_channel", "bot_token");
|
|
346
519
|
deleteCredentialMetadata("slack_channel", "app_token");
|
|
520
|
+
deleteCredentialMetadata("slack_channel", "user_token");
|
|
347
521
|
|
|
348
522
|
// Remove the oauth_connection row so getConnectionByProvider returns undefined.
|
|
349
523
|
removeManualTokenConnection("slack_channel");
|
|
@@ -360,6 +534,7 @@ export async function clearSlackChannelConfig(): Promise<SlackChannelConfigResul
|
|
|
360
534
|
success: true,
|
|
361
535
|
hasBotToken: false,
|
|
362
536
|
hasAppToken: false,
|
|
537
|
+
hasUserToken: false,
|
|
363
538
|
connected: false,
|
|
364
539
|
};
|
|
365
540
|
}
|