@vellumai/assistant 0.7.0 → 0.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ARCHITECTURE.md +38 -56
- package/Dockerfile +2 -0
- package/README.md +3 -4
- package/__tests__/permissions/gateway-threshold-reader.test.ts +88 -142
- package/bun.lock +29 -26
- package/docs/architecture/security.md +38 -16
- package/docs/plugins.md +7 -9
- package/knip.json +2 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +39 -1
- package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
- package/node_modules/@vellumai/service-contracts/package.json +2 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
- package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
- package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
- package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
- package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +9 -5
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
- package/node_modules/@vellumai/slack-text/bun.lock +24 -0
- package/node_modules/@vellumai/slack-text/package.json +18 -0
- package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
- package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
- package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
- package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
- package/node_modules/@vellumai/twilio-client/package.json +18 -0
- package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
- package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
- package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
- package/openapi.yaml +869 -129
- package/package.json +8 -3
- package/scripts/generate-openapi.ts +16 -111
- package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
- package/src/__tests__/anthropic-provider.test.ts +56 -13
- package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
- package/src/__tests__/app-bundler.test.ts +170 -1
- package/src/__tests__/app-control-flow.test.ts +374 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
- package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
- package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
- package/src/__tests__/app-conversation-ids.test.ts +151 -0
- package/src/__tests__/app-executors.test.ts +30 -43
- package/src/__tests__/approval-cascade.test.ts +0 -15
- package/src/__tests__/approval-routes-http.test.ts +29 -23
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
- package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
- package/src/__tests__/assistant-event-hub.test.ts +235 -79
- package/src/__tests__/assistant-event.test.ts +10 -5
- package/src/__tests__/assistant-events-sse-hardening.test.ts +44 -17
- package/src/__tests__/assistant-feature-flags-integration.test.ts +11 -36
- package/src/__tests__/background-shell-host-bash.test.ts +46 -56
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
- package/src/__tests__/btw-routes.test.ts +13 -4
- package/src/__tests__/call-controller.test.ts +50 -2
- package/src/__tests__/call-domain.test.ts +0 -2
- package/src/__tests__/call-routes-http.test.ts +0 -2
- package/src/__tests__/call-site-routing-provider.test.ts +193 -0
- package/src/__tests__/channel-approval-routes.test.ts +10 -296
- package/src/__tests__/channel-approvals.test.ts +25 -17
- package/src/__tests__/channel-guardian.test.ts +100 -146
- package/src/__tests__/channel-readiness-service.test.ts +59 -1
- package/src/__tests__/checker.test.ts +23 -38
- package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
- package/src/__tests__/compaction-events.test.ts +2 -0
- package/src/__tests__/config-loader-backfill.test.ts +90 -155
- package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
- package/src/__tests__/config-schema-cmd.test.ts +0 -1
- package/src/__tests__/config-schema.test.ts +6 -48
- package/src/__tests__/config-set-platform-guard.test.ts +48 -4
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +2 -2
- package/src/__tests__/config-watcher.test.ts +14 -2
- package/src/__tests__/connection-policy.test.ts +1 -52
- package/src/__tests__/contacts-write.test.ts +2 -64
- package/src/__tests__/context-image-dimensions.test.ts +1 -1
- package/src/__tests__/context-search-memory-source.test.ts +120 -1
- package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
- package/src/__tests__/context-search-pkb-source.test.ts +49 -0
- package/src/__tests__/context-search-workspace-source.test.ts +9 -22
- package/src/__tests__/context-window-manager.test.ts +46 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
- package/src/__tests__/conversation-agent-loop.test.ts +980 -13
- package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
- package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
- package/src/__tests__/conversation-history-web-search.test.ts +4 -3
- package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-lifecycle.test.ts +40 -4
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
- package/src/__tests__/conversation-process-callsite.test.ts +79 -2
- package/src/__tests__/conversation-queue.test.ts +3 -8
- package/src/__tests__/conversation-routes-disk-view.test.ts +7 -161
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -104
- package/src/__tests__/conversation-routes-slash-commands.test.ts +76 -66
- package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
- package/src/__tests__/conversation-slash-commands.test.ts +24 -8
- package/src/__tests__/conversation-slash-queue.test.ts +2 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-starter-routes.test.ts +79 -2
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
- package/src/__tests__/conversation-surfaces-app-control.test.ts +317 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
- package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
- package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
- package/src/__tests__/conversation-usage.test.ts +253 -3
- package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
- package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
- package/src/__tests__/credential-health-service.test.ts +68 -0
- package/src/__tests__/credential-security-e2e.test.ts +4 -3
- package/src/__tests__/credential-security-invariants.test.ts +1 -5
- package/src/__tests__/credential-token-resolver.test.ts +180 -0
- package/src/__tests__/credentials-cli.test.ts +5 -12
- package/src/__tests__/cu-unified-flow.test.ts +206 -27
- package/src/__tests__/daemon-assistant-events.test.ts +34 -21
- package/src/__tests__/daemon-credential-client.test.ts +102 -17
- package/src/__tests__/db-connection-isolation.test.ts +125 -0
- package/src/__tests__/db-migration-rollback.test.ts +101 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
- package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
- package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
- package/src/__tests__/document-conversations.test.ts +332 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
- package/src/__tests__/emit-event-signal.test.ts +4 -6
- package/src/__tests__/events-client-registration.test.ts +193 -49
- package/src/__tests__/filing-service.test.ts +58 -7
- package/src/__tests__/first-greeting.test.ts +156 -150
- package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
- package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
- package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +1 -1
- package/src/__tests__/guardian-grant-minting.test.ts +7 -2
- package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
- package/src/__tests__/guardian-routing-state.test.ts +1 -1
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +30 -11
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -84
- package/src/__tests__/headless-browser-mode.test.ts +4 -9
- package/src/__tests__/headless-browser-navigate.test.ts +21 -20
- package/src/__tests__/heartbeat-service.test.ts +1007 -8
- package/src/__tests__/helpers/call-route-handler.ts +7 -1
- package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
- package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
- package/src/__tests__/host-app-control-proxy.test.ts +602 -0
- package/src/__tests__/host-app-control-routes.test.ts +263 -0
- package/src/__tests__/host-bash-proxy.test.ts +270 -147
- package/src/__tests__/host-bash-routes.test.ts +294 -0
- package/src/__tests__/host-browser-proxy.test.ts +126 -198
- package/src/__tests__/host-browser-routes.test.ts +50 -54
- package/src/__tests__/host-cu-proxy.test.ts +78 -144
- package/src/__tests__/host-cu-routes-targeted.test.ts +300 -0
- package/src/__tests__/host-file-edit-tool.test.ts +47 -1
- package/src/__tests__/host-file-proxy-targeted.test.ts +339 -0
- package/src/__tests__/host-file-proxy.test.ts +62 -122
- package/src/__tests__/host-file-read-tool.test.ts +59 -21
- package/src/__tests__/host-file-routes-targeted.test.ts +262 -0
- package/src/__tests__/host-file-write-tool.test.ts +42 -1
- package/src/__tests__/host-proxy-base.test.ts +312 -0
- package/src/__tests__/host-shell-tool.test.ts +53 -70
- package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +583 -0
- package/src/__tests__/host-transfer-proxy.test.ts +145 -56
- package/src/__tests__/host-transfer-routes-targeted.test.ts +447 -0
- package/src/__tests__/http-user-message-parity.test.ts +1 -6
- package/src/__tests__/identity-intro-cache.test.ts +29 -0
- package/src/__tests__/identity-routes.test.ts +103 -1
- package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
- package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
- package/src/__tests__/injector-chain.test.ts +10 -5
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
- package/src/__tests__/inline-command-runner.test.ts +0 -67
- package/src/__tests__/inline-skill-load-permissions.test.ts +5 -13
- package/src/__tests__/install-skill-routing.test.ts +1 -13
- package/src/__tests__/integration-status.test.ts +85 -5
- package/src/__tests__/intent-routing.test.ts +0 -1
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
- package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
- package/src/__tests__/llm-catalog-parity.test.ts +90 -0
- package/src/__tests__/llm-context-resolution.test.ts +180 -0
- package/src/__tests__/llm-resolver.test.ts +80 -12
- package/src/__tests__/llm-usage-store.test.ts +269 -4
- package/src/__tests__/log-export-routes.test.ts +89 -0
- package/src/__tests__/managed-profile-guard.test.ts +225 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +0 -11
- package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
- package/src/__tests__/mcp-auth-routes.test.ts +197 -0
- package/src/__tests__/mcp-cli.test.ts +338 -2
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
- package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
- package/src/__tests__/migration-export-http.test.ts +33 -26
- package/src/__tests__/migration-export-streaming.test.ts +18 -10
- package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
- package/src/__tests__/migration-import-commit-http.test.ts +172 -21
- package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
- package/src/__tests__/migration-import-from-url.test.ts +20 -6
- package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
- package/src/__tests__/migration-parity-persistence.test.ts +62 -25
- package/src/__tests__/migration-transport.test.ts +115 -23
- package/src/__tests__/migration-validate-http.test.ts +105 -80
- package/src/__tests__/migration-wizard.test.ts +133 -27
- package/src/__tests__/mock-gateway-ipc.ts +1 -0
- package/src/__tests__/non-member-access-request.test.ts +1 -1
- package/src/__tests__/notification-guardian-path.test.ts +1 -1
- package/src/__tests__/oauth-cli.test.ts +0 -2
- package/src/__tests__/oauth-store.test.ts +19 -0
- package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
- package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
- package/src/__tests__/platform-bash-auto-approve.test.ts +26 -21
- package/src/__tests__/prechat-onboarding-contract.test.ts +34 -8
- package/src/__tests__/pricing.test.ts +68 -4
- package/src/__tests__/process-message-background-slack.test.ts +333 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
- package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
- package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
- package/src/__tests__/provider-usage-tracking.test.ts +208 -0
- package/src/__tests__/public-ingress-urls.test.ts +97 -0
- package/src/__tests__/reaction-persistence.test.ts +9 -6
- package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
- package/src/__tests__/recording-handler.test.ts +64 -81
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
- package/src/__tests__/relay-server.test.ts +18 -13
- package/src/__tests__/require-fresh-approval.test.ts +13 -23
- package/src/__tests__/retry-backoff.test.ts +87 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
- package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
- package/src/__tests__/runtime-events-sse.test.ts +13 -18
- package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
- package/src/__tests__/schedule-retry.test.ts +715 -0
- package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
- package/src/__tests__/search-skills-unified.test.ts +9 -15
- package/src/__tests__/secret-ingress-cli.test.ts +2 -5
- package/src/__tests__/secret-ingress-http.test.ts +1 -4
- package/src/__tests__/secret-onetime-send.test.ts +4 -2
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
- package/src/__tests__/secret-response-routing.test.ts +29 -15
- package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
- package/src/__tests__/secret-scanner.test.ts +2 -545
- package/src/__tests__/send-endpoint-busy.test.ts +12 -24
- package/src/__tests__/settings-routes.test.ts +1 -1
- package/src/__tests__/shell-credential-ref.test.ts +0 -8
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -57
- package/src/__tests__/skill-feature-flags.test.ts +43 -41
- package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
- package/src/__tests__/skill-load-inline-command.test.ts +0 -51
- package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
- package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
- package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -12
- package/src/__tests__/skill-tool-factory.test.ts +97 -0
- package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
- package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
- package/src/__tests__/slack-channel-config.test.ts +9 -14
- package/src/__tests__/slack-inbound-verification.test.ts +1 -62
- package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
- package/src/__tests__/subagent-manager-notify.test.ts +70 -70
- package/src/__tests__/subagent-notify-parent.test.ts +80 -83
- package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
- package/src/__tests__/system-prompt.test.ts +115 -14
- package/src/__tests__/telegram-config.test.ts +0 -1
- package/src/__tests__/terminal-tools.test.ts +0 -89
- package/src/__tests__/test-preload.ts +8 -0
- package/src/__tests__/thread-backfill.test.ts +945 -31
- package/src/__tests__/tool-approval-handler.test.ts +3 -4
- package/src/__tests__/tool-audit-listener.test.ts +48 -0
- package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -7
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -17
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -8
- package/src/__tests__/tool-executor.test.ts +12 -20
- package/src/__tests__/tool-metrics-listener.test.ts +0 -35
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
- package/src/__tests__/tool-trace-listener.test.ts +0 -17
- package/src/__tests__/transfer-progress-screen.test.ts +63 -26
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
- package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
- package/src/__tests__/trusted-contact-verification.test.ts +1 -1
- package/src/__tests__/tts-catalog-parity.test.ts +16 -5
- package/src/__tests__/twilio-config.test.ts +3 -16
- package/src/__tests__/twilio-routes.test.ts +3 -5
- package/src/__tests__/twilio-validation.test.ts +93 -0
- package/src/__tests__/usage-attribution.test.ts +247 -0
- package/src/__tests__/usage-cli.test.ts +143 -0
- package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
- package/src/__tests__/usage-routes.test.ts +150 -0
- package/src/__tests__/validation-results-screen.test.ts +39 -16
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +47 -138
- package/src/__tests__/verification-control-plane-policy.test.ts +6 -11
- package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
- package/src/__tests__/voice-session-bridge.test.ts +5 -5
- package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
- package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
- package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
- package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
- package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
- package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
- package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
- package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
- package/src/acp/index.ts +0 -15
- package/src/acp/session-manager.ts +37 -34
- package/src/agent/loop.ts +16 -1
- package/src/approvals/AGENTS.md +4 -0
- package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
- package/src/approvals/guardian-request-resolvers.ts +10 -2
- package/src/backup/__tests__/paths.test.ts +0 -22
- package/src/backup/__tests__/restore.test.ts +94 -177
- package/src/backup/paths.ts +2 -15
- package/src/backup/restore.ts +107 -231
- package/src/browser-session/events.ts +0 -9
- package/src/bundler/app-bundler.ts +51 -3
- package/src/calls/call-store.ts +1 -34
- package/src/calls/guardian-question-copy.ts +0 -108
- package/src/calls/relay-server.ts +4 -68
- package/src/calls/twilio-config.ts +2 -17
- package/src/calls/twilio-rest.ts +31 -141
- package/src/calls/twilio-routes.ts +12 -13
- package/src/calls/voice-session-bridge.ts +7 -38
- package/src/channels/types.ts +8 -42
- package/src/cli/commands/__tests__/backup.test.ts +6 -277
- package/src/cli/commands/__tests__/cache.test.ts +152 -5
- package/src/cli/commands/__tests__/gateway.test.ts +288 -0
- package/src/cli/commands/__tests__/memory-v2.test.ts +18 -28
- package/src/cli/commands/__tests__/trust.test.ts +21 -387
- package/src/cli/commands/__tests__/webhooks.test.ts +0 -1
- package/src/cli/commands/backup.ts +6 -331
- package/src/cli/commands/cache-fs.ts +8 -0
- package/src/cli/commands/cache.ts +153 -82
- package/src/cli/commands/clients.ts +64 -7
- package/src/cli/commands/completions.ts +3 -3
- package/src/cli/commands/contacts.ts +304 -76
- package/src/cli/commands/conversations.ts +2 -5
- package/src/cli/commands/credentials.ts +15 -7
- package/src/cli/commands/domain.ts +66 -15
- package/src/cli/commands/gateway.ts +183 -0
- package/src/cli/commands/keys.ts +13 -7
- package/src/cli/commands/mcp.ts +116 -156
- package/src/cli/commands/memory-v2.ts +320 -53
- package/src/cli/commands/oauth/shared.ts +2 -29
- package/src/cli/commands/pending.ts +102 -0
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
- package/src/cli/commands/platform/__tests__/connect.test.ts +0 -2
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -2
- package/src/cli/commands/platform/__tests__/status.test.ts +13 -15
- package/src/cli/commands/platform/disconnect.ts +5 -4
- package/src/cli/commands/platform/index.ts +0 -18
- package/src/cli/commands/skills.ts +77 -35
- package/src/cli/commands/trust.ts +70 -430
- package/src/cli/commands/usage.ts +25 -16
- package/src/cli/lib/daemon-credential-client.ts +115 -19
- package/src/cli/program.ts +4 -0
- package/src/cli.ts +0 -21
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +67 -10
- package/src/config/bundled-skills/acp/SKILL.md +6 -0
- package/src/config/bundled-skills/acp/TOOLS.json +1 -22
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
- package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
- package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
- package/src/config/bundled-skills/app-control/SKILL.md +75 -0
- package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
- package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
- package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
- package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
- package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
- package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
- package/src/config/bundled-skills/document/TOOLS.json +0 -8
- package/src/config/bundled-skills/followups/TOOLS.json +0 -12
- package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
- package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
- package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
- package/src/config/bundled-skills/messaging/TOOLS.json +14 -44
- package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +19 -4
- package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
- package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
- package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
- package/src/config/bundled-skills/settings/SKILL.md +4 -0
- package/src/config/bundled-skills/settings/TOOLS.json +0 -12
- package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
- package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
- package/src/config/bundled-skills/subagent/SKILL.md +6 -2
- package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
- package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
- package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
- package/src/config/bundled-tool-registry.ts +21 -0
- package/src/config/env-registry.ts +12 -4
- package/src/config/env.ts +22 -26
- package/src/config/feature-flag-registry.json +40 -152
- package/src/config/llm-callsite-catalog.ts +12 -0
- package/src/config/llm-context-resolution.ts +80 -0
- package/src/config/llm-resolver.ts +58 -22
- package/src/config/loader.ts +76 -102
- package/src/config/sanitize-for-transfer.ts +2 -0
- package/src/config/schema.ts +2 -158
- package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
- package/src/config/schemas/__tests__/memory-v2.test.ts +8 -4
- package/src/config/schemas/call-site-catalog.ts +271 -0
- package/src/config/schemas/calls.ts +5 -14
- package/src/config/schemas/heartbeat.ts +63 -0
- package/src/config/schemas/inference.ts +1 -1
- package/src/config/schemas/ingress.ts +11 -7
- package/src/config/schemas/llm.ts +34 -11
- package/src/config/schemas/memory-lifecycle.ts +77 -24
- package/src/config/schemas/memory-retrieval.ts +2 -2
- package/src/config/schemas/memory-v2.ts +57 -4
- package/src/config/schemas/platform.ts +6 -0
- package/src/config/schemas/security.ts +1 -42
- package/src/config/schemas/services.ts +7 -21
- package/src/config/schemas/skills.ts +5 -11
- package/src/config/schemas/tts.ts +1 -1
- package/src/config/seed-inference-profiles.ts +117 -0
- package/src/config/skills.ts +0 -90
- package/src/config/types.ts +3 -6
- package/src/contacts/contact-store.ts +0 -47
- package/src/contacts/contacts-write.ts +1 -132
- package/src/context/window-manager.ts +43 -5
- package/src/credential-execution/feature-gates.ts +10 -10
- package/src/credential-execution/process-manager.ts +46 -51
- package/src/credential-health/credential-health-service.ts +21 -16
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +126 -5
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
- package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
- package/src/daemon/config-watcher.ts +4 -3
- package/src/daemon/connection-policy.ts +1 -26
- package/src/daemon/conversation-agent-loop-handlers.ts +74 -7
- package/src/daemon/conversation-agent-loop.ts +309 -64
- package/src/daemon/conversation-history.ts +8 -8
- package/src/daemon/conversation-launch.ts +20 -135
- package/src/daemon/conversation-lifecycle.ts +8 -1
- package/src/daemon/conversation-messaging.ts +1 -0
- package/src/daemon/conversation-process.ts +97 -172
- package/src/daemon/conversation-runtime-assembly.ts +219 -76
- package/src/daemon/conversation-slash.ts +47 -5
- package/src/daemon/conversation-store.ts +7 -31
- package/src/daemon/conversation-surfaces.ts +144 -29
- package/src/daemon/conversation-tool-setup.ts +18 -87
- package/src/daemon/conversation-usage.ts +36 -0
- package/src/daemon/conversation.ts +134 -231
- package/src/daemon/daemon-control.ts +3 -71
- package/src/daemon/daemon-skill-host.ts +8 -11
- package/src/daemon/dictation-profile-store.ts +2 -26
- package/src/daemon/doordash-steps.ts +1 -1
- package/src/daemon/first-greeting.ts +44 -156
- package/src/daemon/handlers/config-channels.ts +12 -12
- package/src/daemon/handlers/config-ingress.ts +4 -165
- package/src/daemon/handlers/config-model.ts +1 -1
- package/src/daemon/handlers/config-voice.ts +0 -42
- package/src/daemon/handlers/conversations.ts +11 -190
- package/src/daemon/handlers/recording.ts +26 -158
- package/src/daemon/handlers/shared.ts +27 -72
- package/src/daemon/handlers/skills.ts +42 -93
- package/src/daemon/host-app-control-proxy.ts +293 -0
- package/src/daemon/host-bash-proxy.ts +124 -92
- package/src/daemon/host-browser-proxy.ts +111 -88
- package/src/daemon/host-cu-proxy.ts +100 -104
- package/src/daemon/host-file-proxy.ts +136 -91
- package/src/daemon/host-proxy-base.ts +294 -0
- package/src/daemon/host-proxy-preactivation.ts +82 -0
- package/src/daemon/host-transfer-proxy.ts +303 -147
- package/src/daemon/lifecycle.ts +164 -132
- package/src/daemon/message-protocol.ts +3 -8
- package/src/daemon/message-types/contacts.ts +23 -1
- package/src/daemon/message-types/conversations.ts +18 -8
- package/src/daemon/message-types/host-app-control.ts +150 -0
- package/src/daemon/message-types/host-bash.ts +5 -0
- package/src/daemon/message-types/host-cu.ts +3 -0
- package/src/daemon/message-types/host-file.ts +5 -0
- package/src/daemon/message-types/host-transfer.ts +4 -0
- package/src/daemon/message-types/messages.ts +10 -9
- package/src/daemon/message-types/schedules.ts +8 -3
- package/src/daemon/message-types/skills.ts +2 -2
- package/src/daemon/message-types/workspace.ts +1 -1
- package/src/daemon/process-message.ts +119 -239
- package/src/daemon/server.ts +13 -462
- package/src/daemon/shutdown-handlers.ts +2 -5
- package/src/daemon/tool-setup-types.ts +51 -0
- package/src/daemon/tool-side-effects.ts +126 -108
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +4 -9
- package/src/events/domain-events.ts +0 -8
- package/src/events/tool-audit-listener.ts +5 -2
- package/src/events/tool-domain-event-publisher.ts +0 -10
- package/src/events/tool-metrics-listener.ts +0 -17
- package/src/events/tool-trace-listener.ts +0 -14
- package/src/filing/filing-service.ts +13 -1
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +21 -9
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +216 -0
- package/src/heartbeat/heartbeat-run-store.ts +236 -0
- package/src/heartbeat/heartbeat-service.ts +303 -54
- package/src/home/__tests__/feed-writer.test.ts +0 -4
- package/src/home/__tests__/post-connect-feed.test.ts +99 -0
- package/src/home/__tests__/relationship-state-writer.test.ts +41 -9
- package/src/home/__tests__/suggested-prompts.test.ts +89 -0
- package/src/home/feed-writer.ts +1 -2
- package/src/home/post-connect-feed.ts +68 -0
- package/src/home/relationship-state-writer.ts +33 -95
- package/src/home/suggested-prompts.ts +46 -10
- package/src/inbound/public-ingress-urls.ts +32 -34
- package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
- package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
- package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
- package/src/ipc/assistant-server.ts +17 -11
- package/src/ipc/cli-client.ts +32 -1
- package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
- package/src/ipc/routes/route-adapter.ts +1 -1
- package/src/ipc/routes/trust-rules.test.ts +0 -95
- package/src/ipc/skill-ipc-types.ts +41 -0
- package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
- package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
- package/src/ipc/skill-routes/events.ts +12 -23
- package/src/ipc/skill-routes/identity.ts +4 -17
- package/src/ipc/skill-routes/index.ts +1 -1
- package/src/ipc/skill-server.ts +6 -39
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
- package/src/live-voice/live-voice-metrics.ts +10 -10
- package/src/live-voice/protocol.ts +4 -13
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
- package/src/mcp/manager.ts +0 -5
- package/src/mcp/mcp-auth-orchestrator.ts +213 -0
- package/src/mcp/mcp-auth-state.ts +133 -0
- package/src/mcp/mcp-oauth-provider.ts +19 -0
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
- package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
- package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
- package/src/memory/anisotropy.test.ts +247 -0
- package/src/memory/anisotropy.ts +443 -0
- package/src/memory/app-git-service.ts +0 -32
- package/src/memory/app-store.ts +154 -0
- package/src/memory/attachments-store.ts +6 -0
- package/src/memory/auto-analysis-constants.ts +17 -0
- package/src/memory/auto-analysis-guard.ts +5 -15
- package/src/memory/canonical-guardian-store.ts +7 -7
- package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
- package/src/memory/context-search/agent-protocol.ts +6 -6
- package/src/memory/context-search/agent-runner.ts +32 -7
- package/src/memory/context-search/sources/memory-v2.ts +590 -0
- package/src/memory/context-search/sources/memory.ts +5 -0
- package/src/memory/context-search/sources/pkb.ts +10 -1
- package/src/memory/context-search/sources/workspace.ts +3 -2
- package/src/memory/conversation-crud.ts +30 -5
- package/src/memory/conversation-disk-view.ts +1 -5
- package/src/memory/conversation-key-store.ts +2 -15
- package/src/memory/conversation-starter-checkpoints.ts +63 -0
- package/src/memory/db-connection.ts +62 -0
- package/src/memory/db-init.ts +18 -0
- package/src/memory/embedding-backend.ts +12 -42
- package/src/memory/embedding-gemini.ts +0 -2
- package/src/memory/embedding-local.ts +6 -6
- package/src/memory/embedding-ollama.ts +6 -6
- package/src/memory/embedding-openai.ts +6 -6
- package/src/memory/embedding-types.ts +21 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +49 -8
- package/src/memory/graph/conversation-graph-memory.ts +35 -36
- package/src/memory/graph/graph-search.ts +8 -0
- package/src/memory/graph/injection.test.ts +2 -2
- package/src/memory/graph/injection.ts +1 -1
- package/src/memory/graph/retriever.ts +28 -0
- package/src/memory/graph/tools.ts +1 -1
- package/src/memory/guardian-action-store.ts +0 -83
- package/src/memory/guardian-approvals.ts +0 -48
- package/src/memory/indexer.ts +1 -15
- package/src/memory/job-handlers/conversation-starters.ts +36 -53
- package/src/memory/job-utils.ts +0 -6
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
- package/src/memory/jobs/embed-concept-page.ts +28 -2
- package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
- package/src/memory/jobs-store.ts +66 -23
- package/src/memory/jobs-worker.ts +114 -79
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +129 -43
- package/src/memory/memory-v2-activation-log-store.ts +115 -0
- package/src/memory/migrations/233-document-conversations.ts +54 -0
- package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
- package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
- package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
- package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
- package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
- package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
- package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
- package/src/memory/migrations/index.ts +19 -0
- package/src/memory/migrations/registry.ts +32 -0
- package/src/memory/pkb/pkb-search.ts +7 -0
- package/src/memory/qdrant-client.ts +50 -20
- package/src/memory/raw-query.ts +2 -68
- package/src/memory/schema/conversations.ts +7 -0
- package/src/memory/schema/infrastructure.ts +40 -0
- package/src/memory/search/semantic.ts +12 -16
- package/src/memory/sparse-tokenize.ts +49 -0
- package/src/memory/tool-usage-store.ts +2 -0
- package/src/memory/usage-buckets.ts +40 -1
- package/src/memory/usage-grouped-buckets.ts +127 -0
- package/src/memory/v2/__tests__/activation.test.ts +361 -180
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
- package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
- package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
- package/src/memory/v2/__tests__/injection.test.ts +424 -33
- package/src/memory/v2/__tests__/migration.test.ts +64 -36
- package/src/memory/v2/__tests__/page-store.test.ts +191 -8
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
- package/src/memory/v2/__tests__/sim.test.ts +166 -6
- package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
- package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
- package/src/memory/v2/__tests__/static-context.test.ts +152 -0
- package/src/memory/v2/activation.ts +215 -163
- package/src/memory/v2/backfill-jobs.ts +15 -100
- package/src/memory/v2/consolidation-job.ts +17 -17
- package/src/memory/v2/constants.ts +7 -0
- package/src/memory/v2/edge-index.ts +191 -0
- package/src/memory/v2/injection.ts +241 -84
- package/src/memory/v2/migration.ts +57 -64
- package/src/memory/v2/now-text.ts +2 -3
- package/src/memory/v2/page-store.ts +168 -31
- package/src/memory/v2/prompts/consolidation.ts +385 -88
- package/src/memory/v2/prompts/sweep.ts +3 -3
- package/src/memory/v2/qdrant.ts +99 -1
- package/src/memory/v2/sim.ts +126 -16
- package/src/memory/v2/skill-qdrant.ts +12 -3
- package/src/memory/v2/skill-store.ts +71 -8
- package/src/memory/v2/sparse-bm25.ts +245 -0
- package/src/memory/v2/static-context.ts +63 -0
- package/src/memory/v2/types.ts +10 -20
- package/src/memory/validation.ts +0 -11
- package/src/messaging/draft-store.ts +0 -6
- package/src/messaging/provider-types.ts +8 -0
- package/src/messaging/provider.ts +7 -0
- package/src/messaging/providers/gmail/client.ts +1 -121
- package/src/messaging/providers/gmail/types.ts +0 -49
- package/src/messaging/providers/outlook/client.ts +0 -73
- package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
- package/src/messaging/providers/slack/adapter.ts +123 -52
- package/src/messaging/providers/slack/backfill.test.ts +95 -6
- package/src/messaging/providers/slack/backfill.ts +89 -11
- package/src/messaging/providers/slack/client.ts +10 -124
- package/src/messaging/providers/slack/message-metadata.ts +12 -2
- package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
- package/src/messaging/providers/slack/render-transcript.ts +126 -25
- package/src/messaging/providers/slack/types.ts +1 -32
- package/src/notifications/README.md +10 -10
- package/src/notifications/broadcaster.ts +1 -1
- package/src/notifications/guardian-question-mode.ts +5 -5
- package/src/oauth/connect-orchestrator.ts +4 -0
- package/src/oauth/connection-resolver.test.ts +8 -0
- package/src/oauth/connection-resolver.ts +8 -16
- package/src/oauth/credential-token-resolver.ts +95 -0
- package/src/oauth/manual-token-connection.ts +26 -34
- package/src/oauth/oauth-store.ts +6 -4
- package/src/outbound-proxy/certs.ts +0 -7
- package/src/outbound-proxy/index.ts +1 -59
- package/src/outbound-proxy/logging.ts +1 -1
- package/src/outbound-proxy/policy.ts +6 -5
- package/src/outbound-proxy/router.ts +2 -1
- package/src/permissions/approval-policy.test.ts +6 -275
- package/src/permissions/approval-policy.ts +0 -51
- package/src/permissions/approval-provenance.test.ts +184 -0
- package/src/permissions/approval-provenance.ts +70 -0
- package/src/permissions/checker.test.ts +0 -1
- package/src/permissions/checker.ts +7 -18
- package/src/permissions/gateway-threshold-reader.ts +6 -1
- package/src/permissions/prompter.ts +43 -3
- package/src/permissions/secret-prompter.ts +25 -48
- package/src/permissions/types.ts +33 -0
- package/src/permissions/workspace-policy.ts +0 -5
- package/src/platform/sync-identity.ts +0 -8
- package/src/plugins/defaults/injectors.ts +69 -2
- package/src/plugins/defaults/overflow-reduce.ts +3 -2
- package/src/plugins/types.ts +8 -0
- package/src/prompts/bootstrap-cleanup.ts +27 -0
- package/src/prompts/system-prompt.ts +37 -88
- package/src/prompts/templates/BOOTSTRAP.md +52 -6
- package/src/prompts/templates/SOUL.md +13 -1
- package/src/prompts/update-bulletin-job.ts +2 -0
- package/src/providers/__tests__/retry-callsite.test.ts +138 -1
- package/src/providers/anthropic/client.ts +72 -33
- package/src/providers/call-site-routing.ts +42 -3
- package/src/providers/gemini/client.ts +18 -2
- package/src/providers/managed-proxy/context.ts +0 -5
- package/src/providers/model-catalog.ts +105 -19
- package/src/providers/openai/chat-completions-provider.ts +6 -0
- package/src/providers/openai/responses-provider.ts +7 -1
- package/src/providers/provider-send-message.ts +45 -2
- package/src/providers/ratelimit.ts +7 -2
- package/src/providers/registry.ts +14 -9
- package/src/providers/retry.ts +96 -8
- package/src/providers/speech-to-text/provider-catalog.ts +7 -8
- package/src/providers/types.ts +13 -0
- package/src/providers/usage-tracking.ts +96 -0
- package/src/runtime/AGENTS.md +10 -6
- package/src/runtime/__tests__/agent-wake.test.ts +89 -0
- package/src/runtime/agent-wake.ts +39 -2
- package/src/runtime/assistant-event-hub.ts +570 -52
- package/src/runtime/assistant-event.ts +2 -6
- package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
- package/src/runtime/auth/context.ts +0 -9
- package/src/runtime/auth/middleware.ts +1 -97
- package/src/runtime/auth/route-policy.ts +30 -9
- package/src/runtime/auth/token-service.ts +0 -11
- package/src/runtime/btw-sidechain.ts +2 -3
- package/src/runtime/channel-approvals.ts +6 -2
- package/src/runtime/channel-invite-transport.ts +2 -48
- package/src/runtime/channel-invite-transports/email.ts +1 -1
- package/src/runtime/channel-invite-transports/slack.ts +1 -1
- package/src/runtime/channel-invite-transports/telegram.ts +1 -1
- package/src/runtime/channel-invite-transports/voice.ts +1 -1
- package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
- package/src/runtime/channel-invite-types.ts +54 -0
- package/src/runtime/channel-readiness-service.ts +32 -13
- package/src/runtime/channel-verification-service.ts +3 -5
- package/src/runtime/http-errors.ts +0 -34
- package/src/runtime/http-router.ts +6 -3
- package/src/runtime/http-server.ts +16 -402
- package/src/runtime/http-types.ts +5 -5
- package/src/runtime/interactive-ui.ts +0 -1
- package/src/runtime/middleware/auth.ts +0 -20
- package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
- package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
- package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
- package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
- package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
- package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
- package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
- package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
- package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
- package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +296 -80
- package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
- package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
- package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
- package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
- package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +421 -0
- package/src/runtime/migrations/migration-transport.ts +49 -16
- package/src/runtime/migrations/migration-wizard.ts +2 -2
- package/src/runtime/migrations/origin-mode.ts +40 -0
- package/src/runtime/migrations/vbundle-builder.ts +457 -136
- package/src/runtime/migrations/vbundle-import-analyzer.ts +13 -11
- package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
- package/src/runtime/migrations/vbundle-importer.ts +251 -74
- package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
- package/src/runtime/migrations/vbundle-streaming-importer.ts +329 -38
- package/src/runtime/migrations/vbundle-streaming-validator.ts +203 -28
- package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
- package/src/runtime/migrations/vbundle-validator.ts +328 -41
- package/src/runtime/pending-interactions.ts +48 -13
- package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
- package/src/runtime/routes/__tests__/backup-routes.test.ts +49 -168
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +333 -0
- package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
- package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
- package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
- package/src/runtime/routes/acp-routes.test.ts +0 -3
- package/src/runtime/routes/acp-routes.ts +3 -7
- package/src/runtime/routes/app-management-routes.ts +18 -9
- package/src/runtime/routes/approval-interception-types.ts +13 -0
- package/src/runtime/routes/approval-routes.ts +55 -14
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
- package/src/runtime/routes/avatar-routes.ts +3 -5
- package/src/runtime/routes/backup-routes.ts +15 -38
- package/src/runtime/routes/browser-routes.ts +1 -15
- package/src/runtime/routes/btw-routes.ts +14 -37
- package/src/runtime/routes/channel-guardian-routes.ts +1 -5
- package/src/runtime/routes/channel-readiness-routes.ts +3 -7
- package/src/runtime/routes/channel-route-shared.ts +2 -28
- package/src/runtime/routes/client-routes.ts +46 -12
- package/src/runtime/routes/consolidation-routes.ts +115 -0
- package/src/runtime/routes/contact-prompt-routes.ts +183 -0
- package/src/runtime/routes/conversation-list-routes.ts +12 -29
- package/src/runtime/routes/conversation-management-routes.ts +14 -51
- package/src/runtime/routes/conversation-query-routes.ts +156 -9
- package/src/runtime/routes/conversation-routes.ts +72 -539
- package/src/runtime/routes/conversation-starter-routes.ts +19 -40
- package/src/runtime/routes/document-pdf-renderer.ts +165 -0
- package/src/runtime/routes/documents-routes.ts +83 -18
- package/src/runtime/routes/errors.ts +19 -4
- package/src/runtime/routes/events-routes.ts +68 -94
- package/src/runtime/routes/filing-routes.ts +18 -1
- package/src/runtime/routes/gateway-log-routes.ts +79 -0
- package/src/runtime/routes/guardian-action-routes.ts +4 -9
- package/src/runtime/routes/guardian-approval-interception.ts +2 -8
- package/src/runtime/routes/heartbeat-routes.ts +103 -38
- package/src/runtime/routes/host-app-control-routes.ts +134 -0
- package/src/runtime/routes/host-bash-routes.ts +37 -6
- package/src/runtime/routes/host-browser-routes.ts +96 -25
- package/src/runtime/routes/host-cu-routes.ts +48 -13
- package/src/runtime/routes/host-file-routes.ts +35 -11
- package/src/runtime/routes/host-transfer-routes.ts +73 -37
- package/src/runtime/routes/http-adapter.ts +1 -0
- package/src/runtime/routes/identity-intro-cache.ts +30 -0
- package/src/runtime/routes/identity-routes.ts +93 -49
- package/src/runtime/routes/inbound-message-handler.ts +581 -146
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -95
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
- package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
- package/src/runtime/routes/index.ts +12 -0
- package/src/runtime/routes/integrations/slack/channel.ts +0 -24
- package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
- package/src/runtime/routes/mcp-auth-routes.ts +132 -0
- package/src/runtime/routes/memory-item-routes.ts +10 -12
- package/src/runtime/routes/memory-v2-routes.ts +451 -16
- package/src/runtime/routes/migration-routes.ts +284 -31
- package/src/runtime/routes/playground/guard.ts +1 -1
- package/src/runtime/routes/playground/index.ts +0 -2
- package/src/runtime/routes/recording-routes.ts +4 -24
- package/src/runtime/routes/rename-conversation-routes.ts +2 -6
- package/src/runtime/routes/schedule-routes.ts +10 -6
- package/src/runtime/routes/secret-routes.ts +87 -18
- package/src/runtime/routes/settings-routes.ts +29 -28
- package/src/runtime/routes/skills-routes.ts +12 -31
- package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
- package/src/runtime/routes/task-routes.ts +6 -6
- package/src/runtime/routes/trust-rules-routes.ts +3 -94
- package/src/runtime/routes/types.ts +4 -4
- package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
- package/src/runtime/routes/usage-routes.ts +87 -10
- package/src/runtime/routes/user-routes.ts +17 -31
- package/src/runtime/routes/work-items-routes.ts +1 -4
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
- package/src/runtime/services/analyze-conversation.ts +7 -17
- package/src/runtime/services/conversation-serializer.ts +2 -4
- package/src/runtime/verification-outbound-actions.ts +1 -1
- package/src/runtime/verification-rate-limiter.ts +1 -1
- package/src/runtime/verification-templates.ts +4 -7
- package/src/schedule/integration-status.ts +66 -2
- package/src/schedule/recurrence-engine.ts +4 -1
- package/src/schedule/retry-backoff.ts +18 -0
- package/src/schedule/retry-policy.ts +82 -0
- package/src/schedule/schedule-recovery.ts +64 -0
- package/src/schedule/schedule-store.ts +106 -18
- package/src/schedule/scheduler-types.ts +25 -0
- package/src/schedule/scheduler.ts +63 -38
- package/src/security/oauth-callback-registry.ts +8 -0
- package/src/security/secret-scanner.ts +14 -547
- package/src/security/secure-keys.ts +31 -11
- package/src/security/token-manager.ts +7 -3
- package/src/sequence/analytics.ts +5 -5
- package/src/sequence/engine.ts +1 -1
- package/src/signals/cancel.ts +16 -25
- package/src/signals/conversation-undo.ts +2 -27
- package/src/signals/emit-event.ts +1 -2
- package/src/signals/user-message.ts +108 -22
- package/src/skills/catalog-files.ts +2 -8
- package/src/skills/catalog-install.ts +1 -0
- package/src/skills/clawhub.ts +2 -2
- package/src/skills/include-graph.ts +5 -5
- package/src/skills/inline-command-runner.ts +1 -7
- package/src/skills/remote-skill-policy.ts +5 -5
- package/src/skills/skill-file-provider.ts +1 -1
- package/src/skills/skill-file-types.ts +13 -0
- package/src/skills/skillssh-audit-types.ts +28 -0
- package/src/skills/skillssh-registry.ts +8 -21
- package/src/subagent/manager.ts +67 -84
- package/src/tasks/task-store.ts +1 -28
- package/src/telemetry/types.ts +8 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +59 -15
- package/src/telemetry/usage-telemetry-reporter.ts +4 -5
- package/src/tools/acp/spawn.test.ts +1 -2
- package/src/tools/acp/steer.test.ts +1 -2
- package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
- package/src/tools/apps/executors.ts +56 -69
- package/src/tools/browser/__tests__/browser-status.test.ts +55 -135
- package/src/tools/browser/browser-execution.ts +31 -147
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +145 -70
- package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
- package/src/tools/browser/cdp-client/factory.ts +62 -91
- package/src/tools/browser/cdp-client/index.ts +1 -27
- package/src/tools/computer-use/definitions.ts +42 -20
- package/src/tools/executor.ts +46 -31
- package/src/tools/host-filesystem/edit.ts +29 -2
- package/src/tools/host-filesystem/read.ts +29 -2
- package/src/tools/host-filesystem/transfer.test.ts +45 -42
- package/src/tools/host-filesystem/transfer.ts +35 -4
- package/src/tools/host-filesystem/write.ts +29 -2
- package/src/tools/host-terminal/host-shell.ts +62 -3
- package/src/tools/network/script-proxy/index.ts +1 -10
- package/src/tools/permission-checker.ts +66 -1
- package/src/tools/schedule/create.ts +6 -0
- package/src/tools/schedule/list.ts +2 -0
- package/src/tools/schedule/update.ts +10 -0
- package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
- package/src/tools/shared/filesystem/path-policy.ts +25 -1
- package/src/tools/skills/load.ts +0 -32
- package/src/tools/skills/sandbox-runner.ts +1 -6
- package/src/tools/skills/skill-tool-factory.ts +32 -0
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/terminal/shell.ts +2 -78
- package/src/tools/tool-approval-handler.ts +1 -5
- package/src/tools/types.ts +16 -39
- package/src/tts/__tests__/provider-catalog.test.ts +2 -2
- package/src/tts/provider-catalog.ts +1 -1
- package/src/usage/actors.ts +2 -1
- package/src/usage/attribution.ts +185 -0
- package/src/usage/pricing.ts +166 -0
- package/src/usage/types.ts +14 -0
- package/src/util/json.ts +13 -0
- package/src/util/logger.ts +3 -3
- package/src/util/pricing.ts +50 -3
- package/src/work-items/work-item-runner.ts +15 -42
- package/src/workspace/hatched-date.ts +86 -0
- package/src/workspace/migrations/003-seed-device-id.ts +1 -1
- package/src/workspace/migrations/006-services-config.ts +8 -5
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
- package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
- package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
- package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
- package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +6 -4
- package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
- package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
- package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
- package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +54 -0
- package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
- package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
- package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
- package/src/workspace/migrations/AGENTS.md +1 -1
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/utils.ts +21 -0
- package/src/workspace/provider-commit-message-generator.ts +3 -3
- package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -904
- package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -296
- package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -431
- package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
- package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
- package/src/__tests__/secret-detection-handler.test.ts +0 -67
- package/src/__tests__/secret-scanner-executor.test.ts +0 -450
- package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
- package/src/__tests__/terminal-sandbox.test.ts +0 -374
- package/src/__tests__/tool-notification-listener.test.ts +0 -65
- package/src/__tests__/twilio-rest.test.ts +0 -34
- package/src/backup/__tests__/backup-key.test.ts +0 -152
- package/src/backup/__tests__/backup-worker.test.ts +0 -754
- package/src/backup/__tests__/offsite-writer.test.ts +0 -641
- package/src/backup/__tests__/stream-crypt.test.ts +0 -228
- package/src/backup/backup-key.ts +0 -137
- package/src/backup/backup-worker.ts +0 -438
- package/src/backup/offsite-writer.ts +0 -222
- package/src/backup/stream-crypt.ts +0 -263
- package/src/context/__tests__/microcompact.test.ts +0 -805
- package/src/context/microcompact.ts +0 -443
- package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
- package/src/daemon/message-types/pairing.ts +0 -58
- package/src/events/tool-notification-listener.ts +0 -17
- package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
- package/src/memory/v2/__tests__/edges.test.ts +0 -435
- package/src/memory/v2/edges.ts +0 -217
- package/src/outbound-proxy/config.ts +0 -94
- package/src/outbound-proxy/health.ts +0 -62
- package/src/outbound-proxy/types.ts +0 -150
- package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
- package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
- package/src/runtime/__tests__/client-registry.test.ts +0 -271
- package/src/runtime/capability-tokens.ts +0 -190
- package/src/runtime/chrome-extension-registry.ts +0 -368
- package/src/runtime/client-registry.ts +0 -254
- package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
- package/src/signals/mcp-reload.ts +0 -18
- package/src/tools/secret-detection-handler.ts +0 -269
- package/src/tools/terminal/backends/native.ts +0 -327
- package/src/tools/terminal/backends/types.ts +0 -37
- package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
- package/src/tools/terminal/sandbox.ts +0 -40
|
@@ -12,7 +12,6 @@ import {
|
|
|
12
12
|
findContactChannel,
|
|
13
13
|
findGuardianForChannel,
|
|
14
14
|
} from "../../../contacts/contact-store.js";
|
|
15
|
-
import { touchChannelLastSeen } from "../../../contacts/contacts-write.js";
|
|
16
15
|
import type {
|
|
17
16
|
ChannelStatus,
|
|
18
17
|
ContactChannel,
|
|
@@ -104,40 +103,6 @@ export interface AclResult {
|
|
|
104
103
|
resolvedMember: ResolvedMember | null;
|
|
105
104
|
/** When set, the caller must return this response immediately. */
|
|
106
105
|
earlyResponse?: Record<string, unknown>;
|
|
107
|
-
/**
|
|
108
|
-
* Parsed guardian verification code from the message content, if any.
|
|
109
|
-
* Surfaced here so downstream verification intercept logic can use it
|
|
110
|
-
* without re-parsing.
|
|
111
|
-
*/
|
|
112
|
-
guardianVerifyCode: string | undefined;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Strip Slack/Telegram mrkdwn formatting wrappers from a raw message.
|
|
117
|
-
* When users copy-paste a verification code from the desktop app with
|
|
118
|
-
* rich-text formatting (e.g. bold), Slack preserves it as `*code*` in
|
|
119
|
-
* the message text, which would otherwise fail the strict bare-code regex.
|
|
120
|
-
*/
|
|
121
|
-
function stripMrkdwnFormatting(text: string): string {
|
|
122
|
-
// Bold (*…*), italic (_…_), strikethrough (~…~), inline code (`…`)
|
|
123
|
-
return text.replace(/^[*_~`]+/, "").replace(/[*_~`]+$/, "");
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Parse a guardian verification code from message content.
|
|
128
|
-
* Accepts a bare code as the entire message: 6-digit numeric OR 64-char hex
|
|
129
|
-
* (hex is retained for compatibility with unbound inbound/bootstrap sessions
|
|
130
|
-
* that intentionally use high-entropy secrets).
|
|
131
|
-
*
|
|
132
|
-
* Strips surrounding mrkdwn formatting characters first so that codes
|
|
133
|
-
* pasted with bold/italic/code formatting are still recognized.
|
|
134
|
-
*/
|
|
135
|
-
function parseGuardianVerifyCode(content: string): string | undefined {
|
|
136
|
-
const stripped = stripMrkdwnFormatting(content);
|
|
137
|
-
const bareMatch = stripped.match(/^([0-9a-fA-F]{64}|\d{6})$/);
|
|
138
|
-
if (bareMatch) return bareMatch[1];
|
|
139
|
-
|
|
140
|
-
return undefined;
|
|
141
106
|
}
|
|
142
107
|
|
|
143
108
|
/** Map ChannelStatus to the API-facing member status (excludes "unverified"). */
|
|
@@ -174,11 +139,6 @@ export async function enforceIngressAcl(
|
|
|
174
139
|
|
|
175
140
|
let resolvedMember: ResolvedMember | null = null;
|
|
176
141
|
|
|
177
|
-
// Verification codes must bypass the ACL membership check — users without a
|
|
178
|
-
// member record need to verify before they can be recognized as members.
|
|
179
|
-
const guardianVerifyCode = parseGuardianVerifyCode(trimmedContent);
|
|
180
|
-
const isGuardianVerifyCode = guardianVerifyCode !== undefined;
|
|
181
|
-
|
|
182
142
|
// /start gv_<token> bootstrap commands must also bypass ACL — the user
|
|
183
143
|
// hasn't been verified yet and needs to complete the bootstrap handshake.
|
|
184
144
|
const rawCommandIntentForAcl = sourceMetadata?.commandIntent;
|
|
@@ -228,27 +188,7 @@ export async function enforceIngressAcl(
|
|
|
228
188
|
}
|
|
229
189
|
|
|
230
190
|
if (!resolvedMember) {
|
|
231
|
-
// Determine whether a verification-code bypass is warranted: only allow
|
|
232
|
-
// when there is a pending (unconsumed, unexpired) challenge AND no
|
|
233
|
-
// active guardian binding for this (assistantId, channel).
|
|
234
191
|
let denyNonMember = true;
|
|
235
|
-
if (isGuardianVerifyCode) {
|
|
236
|
-
// Allow bypass when there is any consumable challenge or active
|
|
237
|
-
// outbound session. The !hasActiveBinding guard is intentionally
|
|
238
|
-
// omitted: rebind sessions create a consumable challenge while a
|
|
239
|
-
// binding already exists, and the identity check inside
|
|
240
|
-
// validateAndConsumeVerification prevents unauthorized takeovers.
|
|
241
|
-
const hasPendingChallenge = !!getPendingSession(sourceChannel);
|
|
242
|
-
const hasActiveOutboundSession = !!findActiveSession(sourceChannel);
|
|
243
|
-
if (hasPendingChallenge || hasActiveOutboundSession) {
|
|
244
|
-
denyNonMember = false;
|
|
245
|
-
} else {
|
|
246
|
-
log.info(
|
|
247
|
-
{ sourceChannel, hasPendingChallenge, hasActiveOutboundSession },
|
|
248
|
-
"Ingress ACL: guardian verification bypass denied",
|
|
249
|
-
);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
192
|
|
|
253
193
|
// Bootstrap deep-link commands bypass ACL only when the token
|
|
254
194
|
// resolves to a real pending_bootstrap session. Without this check,
|
|
@@ -297,7 +237,6 @@ export async function enforceIngressAcl(
|
|
|
297
237
|
return {
|
|
298
238
|
resolvedMember: null,
|
|
299
239
|
earlyResponse: inviteResult,
|
|
300
|
-
guardianVerifyCode,
|
|
301
240
|
};
|
|
302
241
|
}
|
|
303
242
|
|
|
@@ -322,7 +261,6 @@ export async function enforceIngressAcl(
|
|
|
322
261
|
return {
|
|
323
262
|
resolvedMember: null,
|
|
324
263
|
earlyResponse: codeInterceptResult,
|
|
325
|
-
guardianVerifyCode,
|
|
326
264
|
};
|
|
327
265
|
}
|
|
328
266
|
|
|
@@ -400,7 +338,6 @@ export async function enforceIngressAcl(
|
|
|
400
338
|
reason: "verification_challenge_sent",
|
|
401
339
|
verificationSessionId: slackVerifyResult.sessionId,
|
|
402
340
|
}),
|
|
403
|
-
guardianVerifyCode,
|
|
404
341
|
};
|
|
405
342
|
}
|
|
406
343
|
}
|
|
@@ -466,7 +403,6 @@ export async function enforceIngressAcl(
|
|
|
466
403
|
// callback delivery failed (e.g. signing-key mismatch → 401).
|
|
467
404
|
...(!replyDelivered && { replyText }),
|
|
468
405
|
}),
|
|
469
|
-
guardianVerifyCode,
|
|
470
406
|
};
|
|
471
407
|
}
|
|
472
408
|
}
|
|
@@ -474,27 +410,9 @@ export async function enforceIngressAcl(
|
|
|
474
410
|
if (resolvedMember) {
|
|
475
411
|
if (resolvedMember.channel.status !== "active") {
|
|
476
412
|
const isBlockedMember = resolvedMember.channel.status === "blocked";
|
|
477
|
-
//
|
|
478
|
-
// bootstrap commands must pass through for re-verifiable states
|
|
413
|
+
// Bootstrap commands must pass through for re-verifiable states
|
|
479
414
|
// (pending/revoked), but never for blocked members.
|
|
480
415
|
let denyInactiveMember = true;
|
|
481
|
-
if (!isBlockedMember && isGuardianVerifyCode) {
|
|
482
|
-
const hasPendingChallenge = !!getPendingSession(sourceChannel);
|
|
483
|
-
const hasActiveOutboundSession = !!findActiveSession(sourceChannel);
|
|
484
|
-
if (hasPendingChallenge || hasActiveOutboundSession) {
|
|
485
|
-
denyInactiveMember = false;
|
|
486
|
-
} else {
|
|
487
|
-
log.info(
|
|
488
|
-
{
|
|
489
|
-
sourceChannel,
|
|
490
|
-
channelId: resolvedMember.channel.id,
|
|
491
|
-
hasPendingChallenge,
|
|
492
|
-
hasActiveOutboundSession,
|
|
493
|
-
},
|
|
494
|
-
"Ingress ACL: inactive member verification bypass denied",
|
|
495
|
-
);
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
416
|
if (!isBlockedMember && isBootstrapCommand) {
|
|
499
417
|
const bootstrapPayload = (
|
|
500
418
|
rawCommandIntentForAcl as Record<string, unknown>
|
|
@@ -543,7 +461,6 @@ export async function enforceIngressAcl(
|
|
|
543
461
|
return {
|
|
544
462
|
resolvedMember: null,
|
|
545
463
|
earlyResponse: inviteResult,
|
|
546
|
-
guardianVerifyCode,
|
|
547
464
|
};
|
|
548
465
|
}
|
|
549
466
|
|
|
@@ -573,7 +490,6 @@ export async function enforceIngressAcl(
|
|
|
573
490
|
return {
|
|
574
491
|
resolvedMember: null,
|
|
575
492
|
earlyResponse: codeInterceptResult,
|
|
576
|
-
guardianVerifyCode,
|
|
577
493
|
};
|
|
578
494
|
}
|
|
579
495
|
|
|
@@ -657,7 +573,6 @@ export async function enforceIngressAcl(
|
|
|
657
573
|
reason: "verification_challenge_sent",
|
|
658
574
|
verificationSessionId: slackVerifyResult.sessionId,
|
|
659
575
|
}),
|
|
660
|
-
guardianVerifyCode,
|
|
661
576
|
};
|
|
662
577
|
}
|
|
663
578
|
}
|
|
@@ -730,7 +645,6 @@ export async function enforceIngressAcl(
|
|
|
730
645
|
reason: `member_${channelStatusToMemberStatus(resolvedMember.channel.status)}`,
|
|
731
646
|
...(!inactiveReplyDelivered && { replyText: inactiveReplyText }),
|
|
732
647
|
}),
|
|
733
|
-
guardianVerifyCode,
|
|
734
648
|
};
|
|
735
649
|
}
|
|
736
650
|
}
|
|
@@ -771,20 +685,13 @@ export async function enforceIngressAcl(
|
|
|
771
685
|
reason: "policy_deny",
|
|
772
686
|
...(!denyReplyDelivered && { replyText: denyReplyText }),
|
|
773
687
|
}),
|
|
774
|
-
guardianVerifyCode,
|
|
775
688
|
};
|
|
776
689
|
}
|
|
777
690
|
|
|
778
|
-
// 'allow' or 'escalate' — update last seen timestamp.
|
|
779
|
-
// touchContactInteraction is intentionally NOT called here because
|
|
780
|
-
// duplicate detection hasn't run yet. It's called in
|
|
781
|
-
// inbound-message-handler.ts after dedup so webhook retries don't
|
|
782
|
-
// inflate interaction counts.
|
|
783
|
-
touchChannelLastSeen(resolvedMember.channel.id);
|
|
784
691
|
}
|
|
785
692
|
}
|
|
786
693
|
|
|
787
|
-
return { resolvedMember
|
|
694
|
+
return { resolvedMember };
|
|
788
695
|
}
|
|
789
696
|
|
|
790
697
|
// ---------------------------------------------------------------------------
|
|
@@ -74,6 +74,7 @@ export interface BackgroundProcessingParams {
|
|
|
74
74
|
externalChatId: string;
|
|
75
75
|
trustCtx: TrustContext;
|
|
76
76
|
metadataHints: string[];
|
|
77
|
+
slackRuntimeContextNotice?: string;
|
|
77
78
|
metadataUxBrief?: string;
|
|
78
79
|
replyCallbackUrl?: string;
|
|
79
80
|
assistantId?: string;
|
|
@@ -108,6 +109,7 @@ export function processChannelMessageInBackground(
|
|
|
108
109
|
externalChatId,
|
|
109
110
|
trustCtx,
|
|
110
111
|
metadataHints,
|
|
112
|
+
slackRuntimeContextNotice,
|
|
111
113
|
metadataUxBrief,
|
|
112
114
|
replyCallbackUrl,
|
|
113
115
|
assistantId,
|
|
@@ -222,6 +224,7 @@ export function processChannelMessageInBackground(
|
|
|
222
224
|
trustContext: trustCtx,
|
|
223
225
|
isInteractive: resolveRoutingState(trustCtx).promptWaitingAllowed,
|
|
224
226
|
...(cmdIntent ? { commandIntent: cmdIntent } : {}),
|
|
227
|
+
...(slackRuntimeContextNotice ? { slackRuntimeContextNotice } : {}),
|
|
225
228
|
...(slackInbound ? { slackInbound } : {}),
|
|
226
229
|
},
|
|
227
230
|
sourceChannel,
|
|
@@ -15,7 +15,6 @@
|
|
|
15
15
|
* focused on orchestration.
|
|
16
16
|
*/
|
|
17
17
|
import type { ChannelId } from "../../../channels/types.js";
|
|
18
|
-
import { touchContactInteraction } from "../../../contacts/contacts-write.js";
|
|
19
18
|
import {
|
|
20
19
|
getMessageById,
|
|
21
20
|
updateMessageContent,
|
|
@@ -65,7 +64,6 @@ export async function handleEditIntercept(
|
|
|
65
64
|
canonicalAssistantId,
|
|
66
65
|
assistantId,
|
|
67
66
|
content,
|
|
68
|
-
channelId,
|
|
69
67
|
} = params;
|
|
70
68
|
|
|
71
69
|
// Dedup the edit event itself (retried edited_message webhooks)
|
|
@@ -84,12 +82,6 @@ export async function handleEditIntercept(
|
|
|
84
82
|
});
|
|
85
83
|
}
|
|
86
84
|
|
|
87
|
-
// Track contact interaction only for genuinely new edit events (not webhook
|
|
88
|
-
// retries), matching the pattern used for the normal message path.
|
|
89
|
-
if (channelId) {
|
|
90
|
-
touchContactInteraction(channelId);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
85
|
// Retry lookup a few times -- the original message may still be processing
|
|
94
86
|
// (linkMessage hasn't been called yet). Short backoff avoids losing edits
|
|
95
87
|
// that arrive while the original agent loop is in progress.
|
|
@@ -7,7 +7,6 @@ import { SttError } from "../../../stt/types.js";
|
|
|
7
7
|
// Mocks — must be set up before importing the module under test
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
9
9
|
|
|
10
|
-
let mockFeatureFlagEnabled = true;
|
|
11
10
|
let mockAttachments: Array<{
|
|
12
11
|
id: string;
|
|
13
12
|
mimeType: string;
|
|
@@ -20,14 +19,6 @@ let mockAttachments: Array<{
|
|
|
20
19
|
}> = [];
|
|
21
20
|
let mockTranscriber: BatchTranscriber | null = null;
|
|
22
21
|
|
|
23
|
-
mock.module("../../../config/assistant-feature-flags.js", () => ({
|
|
24
|
-
isAssistantFeatureFlagEnabled: () => mockFeatureFlagEnabled,
|
|
25
|
-
}));
|
|
26
|
-
|
|
27
|
-
mock.module("../../../config/loader.js", () => ({
|
|
28
|
-
getConfig: () => ({}),
|
|
29
|
-
}));
|
|
30
|
-
|
|
31
22
|
mock.module("../../../memory/attachments-store.js", () => ({
|
|
32
23
|
getAttachmentsByIds: (ids: string[]) =>
|
|
33
24
|
mockAttachments.filter((a) => ids.includes(a.id)),
|
|
@@ -115,7 +106,6 @@ function makeImageAttachment(id: string) {
|
|
|
115
106
|
|
|
116
107
|
describe("tryTranscribeAudioAttachments", () => {
|
|
117
108
|
beforeEach(() => {
|
|
118
|
-
mockFeatureFlagEnabled = true;
|
|
119
109
|
mockAttachments = [];
|
|
120
110
|
mockTranscriber = null;
|
|
121
111
|
});
|
|
@@ -189,16 +179,6 @@ describe("tryTranscribeAudioAttachments", () => {
|
|
|
189
179
|
);
|
|
190
180
|
});
|
|
191
181
|
|
|
192
|
-
test("feature flag disabled returns disabled", async () => {
|
|
193
|
-
mockFeatureFlagEnabled = false;
|
|
194
|
-
const audio = makeAudioAttachment("a1");
|
|
195
|
-
mockAttachments = [audio];
|
|
196
|
-
|
|
197
|
-
const result = await tryTranscribeAudioAttachments(["a1"]);
|
|
198
|
-
|
|
199
|
-
expect(result).toEqual({ status: "disabled" });
|
|
200
|
-
});
|
|
201
|
-
|
|
202
182
|
test("30-second timeout fires and returns error without blocking", async () => {
|
|
203
183
|
const audio = makeAudioAttachment("a1");
|
|
204
184
|
mockAttachments = [audio];
|
|
@@ -2,22 +2,21 @@
|
|
|
2
2
|
* Auto-transcribe audio attachments from channel inbound messages.
|
|
3
3
|
*
|
|
4
4
|
* Returns a discriminated result type so callers can handle each outcome
|
|
5
|
-
* (transcribed, no audio,
|
|
5
|
+
* (transcribed, no audio, no provider, error) without exceptions.
|
|
6
6
|
* Never throws — failures are represented as result variants so that message
|
|
7
7
|
* delivery is never blocked by transcription issues.
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
import {
|
|
11
|
+
getAttachmentById,
|
|
12
|
+
getAttachmentsByIds,
|
|
13
|
+
} from "../../../memory/attachments-store.js";
|
|
13
14
|
import { resolveBatchTranscriber } from "../../../providers/speech-to-text/resolve.js";
|
|
14
15
|
import { normalizeSttError } from "../../../stt/daemon-batch-transcriber.js";
|
|
15
16
|
import { getLogger } from "../../../util/logger.js";
|
|
16
17
|
|
|
17
18
|
const log = getLogger("transcribe-audio");
|
|
18
19
|
|
|
19
|
-
const VOICE_TRANSCRIPTION_FLAG_KEY = "channel-voice-transcription" as const;
|
|
20
|
-
|
|
21
20
|
/** Timeout for the entire transcription pipeline (all attachments). */
|
|
22
21
|
const TRANSCRIPTION_TIMEOUT_MS = 30_000;
|
|
23
22
|
|
|
@@ -28,7 +27,6 @@ const TRANSCRIPTION_TIMEOUT_MS = 30_000;
|
|
|
28
27
|
export type TranscribeResult =
|
|
29
28
|
| { status: "transcribed"; text: string }
|
|
30
29
|
| { status: "no_audio" }
|
|
31
|
-
| { status: "disabled" }
|
|
32
30
|
| { status: "no_provider"; reason: string }
|
|
33
31
|
| { status: "error"; reason: string };
|
|
34
32
|
|
|
@@ -40,12 +38,6 @@ export async function tryTranscribeAudioAttachments(
|
|
|
40
38
|
attachmentIds: string[],
|
|
41
39
|
): Promise<TranscribeResult> {
|
|
42
40
|
try {
|
|
43
|
-
// Check feature flag
|
|
44
|
-
const config = getConfig();
|
|
45
|
-
if (!isAssistantFeatureFlagEnabled(VOICE_TRANSCRIPTION_FLAG_KEY, config)) {
|
|
46
|
-
return { status: "disabled" };
|
|
47
|
-
}
|
|
48
|
-
|
|
49
41
|
// Look up attachments and filter to audio MIME types
|
|
50
42
|
const resolved = getAttachmentsByIds(attachmentIds);
|
|
51
43
|
const audioAttachments = resolved.filter((a) =>
|
|
@@ -26,6 +26,8 @@ import { ROUTES as CHANNEL_READINESS_ROUTES } from "./channel-readiness-routes.j
|
|
|
26
26
|
import { CHANNEL_ROUTES } from "./channel-route-definitions.js";
|
|
27
27
|
import { ROUTES as CHANNEL_VERIFICATION_ROUTES } from "./channel-verification-routes.js";
|
|
28
28
|
import { ROUTES as CLIENT_ROUTES } from "./client-routes.js";
|
|
29
|
+
import { ROUTES as CONSOLIDATION_ROUTES } from "./consolidation-routes.js";
|
|
30
|
+
import { CONTACT_PROMPT_ROUTES } from "./contact-prompt-routes.js";
|
|
29
31
|
import { ROUTES as CONTACT_ROUTES } from "./contact-routes.js";
|
|
30
32
|
import { ROUTES as CONVERSATION_ANALYSIS_ROUTES } from "./conversation-analysis-routes.js";
|
|
31
33
|
import { ROUTES as CONVERSATION_ATTENTION_ROUTES } from "./conversation-attention-routes.js";
|
|
@@ -41,12 +43,14 @@ import { ROUTES as DIAGNOSTICS_ROUTES } from "./diagnostics-routes.js";
|
|
|
41
43
|
import { ROUTES as DOCUMENT_ROUTES } from "./documents-routes.js";
|
|
42
44
|
import { ROUTES as EVENTS_ROUTES } from "./events-routes.js";
|
|
43
45
|
import { ROUTES as FILING_ROUTES } from "./filing-routes.js";
|
|
46
|
+
import { ROUTES as GATEWAY_LOG_ROUTES } from "./gateway-log-routes.js";
|
|
44
47
|
import { ROUTES as GLOBAL_SEARCH_ROUTES } from "./global-search-routes.js";
|
|
45
48
|
import { ROUTES as GROUP_ROUTES } from "./group-routes.js";
|
|
46
49
|
import { ROUTES as GUARDIAN_ACTION_ROUTES } from "./guardian-action-routes.js";
|
|
47
50
|
import { ROUTES as HEARTBEAT_ROUTES } from "./heartbeat-routes.js";
|
|
48
51
|
import { ROUTES as HOME_FEED_ROUTES } from "./home-feed-routes.js";
|
|
49
52
|
import { ROUTES as HOME_STATE_ROUTES } from "./home-state-routes.js";
|
|
53
|
+
import { ROUTES as HOST_APP_CONTROL_ROUTES } from "./host-app-control-routes.js";
|
|
50
54
|
import { ROUTES as HOST_BASH_ROUTES } from "./host-bash-routes.js";
|
|
51
55
|
import { ROUTES as HOST_BROWSER_ROUTES } from "./host-browser-routes.js";
|
|
52
56
|
import { ROUTES as HOST_CU_ROUTES } from "./host-cu-routes.js";
|
|
@@ -61,7 +65,9 @@ import { ROUTES as VERCEL_ROUTES } from "./integrations/vercel.js";
|
|
|
61
65
|
import { ROUTES as INTERFACE_ROUTES } from "./interface-routes.js";
|
|
62
66
|
import { ROUTES as INTERNAL_OAUTH_ROUTES } from "./internal-oauth-routes.js";
|
|
63
67
|
import { ROUTES as INTERNAL_TWILIO_ROUTES } from "./internal-twilio-routes.js";
|
|
68
|
+
import { ROUTES as LLM_CALL_SITES_ROUTES } from "./llm-call-sites-routes.js";
|
|
64
69
|
import { ROUTES as LOG_EXPORT_ROUTES } from "./log-export-routes.js";
|
|
70
|
+
import { ROUTES as MCP_AUTH_ROUTES } from "./mcp-auth-routes.js";
|
|
65
71
|
import { ROUTES as MEMORY_ITEM_ROUTES } from "./memory-item-routes.js";
|
|
66
72
|
import { ROUTES as MEMORY_V2_ROUTES } from "./memory-v2-routes.js";
|
|
67
73
|
import { ROUTES as MIGRATION_ROLLBACK_ROUTES } from "./migration-rollback-routes.js";
|
|
@@ -119,12 +125,14 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
119
125
|
...BTW_ROUTES,
|
|
120
126
|
...BRAIN_GRAPH_ROUTES,
|
|
121
127
|
...CLIENT_ROUTES,
|
|
128
|
+
...CONTACT_PROMPT_ROUTES,
|
|
122
129
|
...CONTACT_ROUTES,
|
|
123
130
|
...CONVERSATION_ANALYSIS_ROUTES,
|
|
124
131
|
...CONVERSATION_ATTENTION_ROUTES,
|
|
125
132
|
...CONVERSATION_LIST_ROUTES,
|
|
126
133
|
...CONVERSATION_MANAGEMENT_ROUTES,
|
|
127
134
|
...CONVERSATION_MESSAGE_ROUTES,
|
|
135
|
+
...CONSOLIDATION_ROUTES,
|
|
128
136
|
...CREDENTIAL_PROMPT_ROUTES,
|
|
129
137
|
...DEFER_ROUTES,
|
|
130
138
|
...CONVERSATION_QUERY_ROUTES,
|
|
@@ -134,12 +142,14 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
134
142
|
...DOCUMENT_ROUTES,
|
|
135
143
|
...EVENTS_ROUTES,
|
|
136
144
|
...FILING_ROUTES,
|
|
145
|
+
...GATEWAY_LOG_ROUTES,
|
|
137
146
|
...GLOBAL_SEARCH_ROUTES,
|
|
138
147
|
...GROUP_ROUTES,
|
|
139
148
|
...GUARDIAN_ACTION_ROUTES,
|
|
140
149
|
...HEARTBEAT_ROUTES,
|
|
141
150
|
...HOME_FEED_ROUTES,
|
|
142
151
|
...HOME_STATE_ROUTES,
|
|
152
|
+
...HOST_APP_CONTROL_ROUTES,
|
|
143
153
|
...HOST_BASH_ROUTES,
|
|
144
154
|
...HOST_BROWSER_ROUTES,
|
|
145
155
|
...HOST_CU_ROUTES,
|
|
@@ -148,8 +158,10 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
148
158
|
...IDENTITY_ROUTES,
|
|
149
159
|
...INTERFACE_ROUTES,
|
|
150
160
|
...INTERNAL_OAUTH_ROUTES,
|
|
161
|
+
...MCP_AUTH_ROUTES,
|
|
151
162
|
...INTERNAL_TWILIO_ROUTES,
|
|
152
163
|
...LOG_EXPORT_ROUTES,
|
|
164
|
+
...LLM_CALL_SITES_ROUTES,
|
|
153
165
|
...MEMORY_ITEM_ROUTES,
|
|
154
166
|
...MEMORY_V2_ROUTES,
|
|
155
167
|
...MIGRATION_ROLLBACK_ROUTES,
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
* GET /v1/integrations/slack/channel/config — get current config status
|
|
5
5
|
* POST /v1/integrations/slack/channel/config — validate and store credentials
|
|
6
6
|
* DELETE /v1/integrations/slack/channel/config — clear credentials
|
|
7
|
-
* POST /v1/integrations/slack/channel/oauth-install — run OAuth loopback to capture bot+user tokens
|
|
8
7
|
*/
|
|
9
8
|
|
|
10
9
|
import {
|
|
@@ -12,7 +11,6 @@ import {
|
|
|
12
11
|
getSlackChannelConfig,
|
|
13
12
|
setSlackChannelConfig,
|
|
14
13
|
} from "../../../../daemon/handlers/config-slack-channel.js";
|
|
15
|
-
import { runSlackChannelOAuthInstall } from "../../../../daemon/handlers/slack-channel-oauth-install.js";
|
|
16
14
|
import { BadRequestError } from "../../errors.js";
|
|
17
15
|
import type { RouteDefinition, RouteHandlerArgs } from "../../types.js";
|
|
18
16
|
|
|
@@ -45,17 +43,6 @@ async function handleClearSlackChannelConfig() {
|
|
|
45
43
|
return clearSlackChannelConfig();
|
|
46
44
|
}
|
|
47
45
|
|
|
48
|
-
async function handleSlackChannelOAuthInstall() {
|
|
49
|
-
const result = await runSlackChannelOAuthInstall();
|
|
50
|
-
if (!result.success) {
|
|
51
|
-
throw new BadRequestError(
|
|
52
|
-
(result as { error?: string }).error ??
|
|
53
|
-
"Slack OAuth install failed",
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
return result;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
46
|
// ---------------------------------------------------------------------------
|
|
60
47
|
// Route definitions
|
|
61
48
|
// ---------------------------------------------------------------------------
|
|
@@ -91,15 +78,4 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
91
78
|
requirePolicyEnforcement: true,
|
|
92
79
|
handler: () => handleClearSlackChannelConfig(),
|
|
93
80
|
},
|
|
94
|
-
{
|
|
95
|
-
operationId: "integrations_slack_channel_oauth_install_post",
|
|
96
|
-
endpoint: "integrations/slack/channel/oauth-install",
|
|
97
|
-
method: "POST",
|
|
98
|
-
summary: "Run Slack OAuth install",
|
|
99
|
-
description:
|
|
100
|
-
"Run an OAuth2 loopback flow to install the Slack app and capture bot + user tokens.",
|
|
101
|
-
tags: ["integrations"],
|
|
102
|
-
requirePolicyEnforcement: true,
|
|
103
|
-
handler: () => handleSlackChannelOAuthInstall(),
|
|
104
|
-
},
|
|
105
81
|
];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { CALL_SITE_CATALOG, CALL_SITE_DOMAINS } from "../../config/schemas/call-site-catalog.js";
|
|
2
|
+
import type { RouteDefinition } from "./types.js";
|
|
3
|
+
|
|
4
|
+
async function handleGetCallSites() {
|
|
5
|
+
return {
|
|
6
|
+
domains: CALL_SITE_DOMAINS,
|
|
7
|
+
callSites: CALL_SITE_CATALOG,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const ROUTES: RouteDefinition[] = [
|
|
12
|
+
{
|
|
13
|
+
operationId: "llm_call_sites_list",
|
|
14
|
+
method: "GET",
|
|
15
|
+
endpoint: "config/llm/call-sites",
|
|
16
|
+
handler: handleGetCallSites,
|
|
17
|
+
summary: "List LLM call sites",
|
|
18
|
+
description:
|
|
19
|
+
"Returns the full catalog of LLM call sites with display names, descriptions, and domain groupings. Used by clients to render the per-call-site override settings UI.",
|
|
20
|
+
tags: ["config"],
|
|
21
|
+
},
|
|
22
|
+
];
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal routes for daemon-owned MCP OAuth flows.
|
|
3
|
+
*
|
|
4
|
+
* POST internal/mcp/auth/start — kicks off the OAuth flow in the daemon
|
|
5
|
+
* and returns the authorization URL
|
|
6
|
+
* GET internal/mcp/auth/status/:serverId — polls current flow status
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { z } from "zod";
|
|
10
|
+
|
|
11
|
+
import { loadRawConfig } from "../../config/loader.js";
|
|
12
|
+
import type { McpConfig } from "../../config/schemas/mcp.js";
|
|
13
|
+
import { reloadMcpServers } from "../../daemon/mcp-reload-service.js";
|
|
14
|
+
import { orchestrateMcpOAuthConnect } from "../../mcp/mcp-auth-orchestrator.js";
|
|
15
|
+
import { getMcpAuthState } from "../../mcp/mcp-auth-state.js";
|
|
16
|
+
import { getLogger } from "../../util/logger.js";
|
|
17
|
+
import { BadRequestError, InternalError, NotFoundError } from "./errors.js";
|
|
18
|
+
import type { RouteDefinition } from "./types.js";
|
|
19
|
+
|
|
20
|
+
const log = getLogger("mcp-auth-routes");
|
|
21
|
+
|
|
22
|
+
async function handleMcpAuthStart({
|
|
23
|
+
body,
|
|
24
|
+
}: {
|
|
25
|
+
body?: Record<string, unknown>;
|
|
26
|
+
}): Promise<{ auth_url: string; state: string; already_authenticated?: boolean }> {
|
|
27
|
+
const { serverId } = body as { serverId: string };
|
|
28
|
+
|
|
29
|
+
const raw = loadRawConfig();
|
|
30
|
+
const servers =
|
|
31
|
+
(raw.mcp as Partial<McpConfig> | undefined)?.servers ?? {};
|
|
32
|
+
const serverConfig = servers[serverId];
|
|
33
|
+
|
|
34
|
+
if (!serverConfig) {
|
|
35
|
+
throw new BadRequestError(`MCP server "${serverId}" not configured`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const transport = serverConfig.transport;
|
|
39
|
+
if (transport.type !== "sse" && transport.type !== "streamable-http") {
|
|
40
|
+
throw new BadRequestError(
|
|
41
|
+
`OAuth only supported for sse/streamable-http transports (server "${serverId}" uses ${transport.type})`,
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
let result: { auth_url: string; already_authenticated?: boolean };
|
|
46
|
+
try {
|
|
47
|
+
result = await orchestrateMcpOAuthConnect({
|
|
48
|
+
serverId,
|
|
49
|
+
transport: {
|
|
50
|
+
url: transport.url,
|
|
51
|
+
type: transport.type,
|
|
52
|
+
headers: transport.headers,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
} catch (err) {
|
|
56
|
+
throw new InternalError(err instanceof Error ? err.message : String(err));
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return { auth_url: result.auth_url, state: serverId, already_authenticated: result.already_authenticated };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function handleMcpAuthStatus({
|
|
63
|
+
pathParams,
|
|
64
|
+
}: {
|
|
65
|
+
pathParams?: Record<string, string>;
|
|
66
|
+
}):
|
|
67
|
+
| { status: "pending"; auth_url: string }
|
|
68
|
+
| { status: "complete" }
|
|
69
|
+
| { status: "error"; error: string } {
|
|
70
|
+
const { serverId } = pathParams as { serverId: string };
|
|
71
|
+
const state = getMcpAuthState(serverId);
|
|
72
|
+
|
|
73
|
+
if (state === null) {
|
|
74
|
+
throw new NotFoundError(`No active OAuth flow for server "${serverId}"`);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (state.status === "pending") return { status: "pending", auth_url: state.authUrl };
|
|
78
|
+
if (state.status === "complete") return { status: "complete" };
|
|
79
|
+
return { status: "error", error: state.error };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function handleMcpReload(_args: {
|
|
83
|
+
body?: Record<string, unknown>;
|
|
84
|
+
}): { ok: true } {
|
|
85
|
+
// Fire-and-forget: reloadMcpServers() has its own reloadInProgress mutex,
|
|
86
|
+
// so concurrent calls coalesce.
|
|
87
|
+
void reloadMcpServers().catch((err) => {
|
|
88
|
+
log.warn(
|
|
89
|
+
{ err: err instanceof Error ? err.message : String(err) },
|
|
90
|
+
"internal_mcp_reload background reload failed",
|
|
91
|
+
);
|
|
92
|
+
});
|
|
93
|
+
return { ok: true };
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export const ROUTES: RouteDefinition[] = [
|
|
97
|
+
{
|
|
98
|
+
operationId: "internal_mcp_auth_start",
|
|
99
|
+
endpoint: "internal/mcp/auth/start",
|
|
100
|
+
method: "POST",
|
|
101
|
+
summary: "Start MCP OAuth flow",
|
|
102
|
+
description:
|
|
103
|
+
"Starts a daemon-owned MCP OAuth flow and returns the authorization URL for the CLI to open in the browser.",
|
|
104
|
+
tags: ["internal"],
|
|
105
|
+
requestBody: z.object({ serverId: z.string() }),
|
|
106
|
+
handler: handleMcpAuthStart,
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
operationId: "internal_mcp_auth_status",
|
|
110
|
+
endpoint: "internal/mcp/auth/status/:serverId",
|
|
111
|
+
method: "GET",
|
|
112
|
+
summary: "Poll MCP OAuth flow status",
|
|
113
|
+
description:
|
|
114
|
+
"Returns the current status of an in-flight MCP OAuth flow (pending/complete/error).",
|
|
115
|
+
tags: ["internal"],
|
|
116
|
+
pathParams: [{ name: "serverId" }],
|
|
117
|
+
additionalResponses: {
|
|
118
|
+
"404": { description: "No active OAuth flow for the given serverId" },
|
|
119
|
+
},
|
|
120
|
+
handler: handleMcpAuthStatus,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
operationId: "internal_mcp_reload",
|
|
124
|
+
endpoint: "internal/mcp/reload",
|
|
125
|
+
method: "POST",
|
|
126
|
+
summary: "Trigger MCP server reload",
|
|
127
|
+
description:
|
|
128
|
+
"Kicks off reloadMcpServers() async on the daemon. Returns immediately.",
|
|
129
|
+
tags: ["internal"],
|
|
130
|
+
handler: handleMcpReload,
|
|
131
|
+
},
|
|
132
|
+
];
|