@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
|
@@ -15,12 +15,15 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { createReadStream } from "node:fs";
|
|
18
|
+
import { hostname } from "node:os";
|
|
18
19
|
import { PassThrough, Readable } from "node:stream";
|
|
19
20
|
import { Database } from "bun:sqlite";
|
|
20
21
|
|
|
21
22
|
import { z } from "zod";
|
|
22
23
|
|
|
24
|
+
import { getPlatformAssistantId } from "../../config/env.js";
|
|
23
25
|
import { invalidateConfigCache } from "../../config/loader.js";
|
|
26
|
+
import { getAssistantName } from "../../daemon/identity-helpers.js";
|
|
24
27
|
import { getDb, resetDb } from "../../memory/db-connection.js";
|
|
25
28
|
import { validateMigrationState } from "../../memory/migrations/validate-migration-state.js";
|
|
26
29
|
import { credentialKey } from "../../security/credential-key.js";
|
|
@@ -40,6 +43,8 @@ import {
|
|
|
40
43
|
getWorkspaceDir,
|
|
41
44
|
getWorkspaceHooksDir,
|
|
42
45
|
} from "../../util/platform.js";
|
|
46
|
+
import { APP_VERSION } from "../../version.js";
|
|
47
|
+
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
|
|
43
48
|
import {
|
|
44
49
|
validateGcsSignedUrl,
|
|
45
50
|
type ValidateGcsSignedUrlOptions,
|
|
@@ -48,11 +53,23 @@ import {
|
|
|
48
53
|
JobAlreadyInProgressError,
|
|
49
54
|
migrationJobs,
|
|
50
55
|
} from "../migrations/job-registry.js";
|
|
56
|
+
import { getOriginMode } from "../migrations/origin-mode.js";
|
|
57
|
+
import type {
|
|
58
|
+
VBundleAssistantInfo,
|
|
59
|
+
VBundleCompatibility,
|
|
60
|
+
VBundleExportOptions,
|
|
61
|
+
VBundleOriginInfo,
|
|
62
|
+
} from "../migrations/vbundle-builder.js";
|
|
51
63
|
import { streamExportVBundle } from "../migrations/vbundle-builder.js";
|
|
52
64
|
import {
|
|
53
65
|
analyzeImport,
|
|
54
66
|
DefaultPathResolver,
|
|
55
67
|
} from "../migrations/vbundle-import-analyzer.js";
|
|
68
|
+
import {
|
|
69
|
+
evaluateRuntimeCompatibility,
|
|
70
|
+
formatRuntimeCompatibilityMessage,
|
|
71
|
+
type RuntimeCompatibility,
|
|
72
|
+
} from "../migrations/vbundle-import-policy.js";
|
|
56
73
|
import {
|
|
57
74
|
commitImport,
|
|
58
75
|
extractCredentialsFromBundle,
|
|
@@ -67,6 +84,7 @@ import {
|
|
|
67
84
|
InternalError,
|
|
68
85
|
NotFoundError,
|
|
69
86
|
RouteError,
|
|
87
|
+
UnprocessableEntityError,
|
|
70
88
|
} from "./errors.js";
|
|
71
89
|
import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
72
90
|
import { RouteResponse } from "./types.js";
|
|
@@ -136,6 +154,110 @@ export async function reconcileVellumMetadataFromCes(warningSink: {
|
|
|
136
154
|
|
|
137
155
|
const log = getLogger("migration-routes");
|
|
138
156
|
|
|
157
|
+
/**
|
|
158
|
+
* Fields the export pipeline must populate on the v1 manifest.
|
|
159
|
+
*
|
|
160
|
+
* Centralized so both the synchronous-bytes and async-to-gcs handlers
|
|
161
|
+
* compute the same values (and a future caller doesn't accidentally drift).
|
|
162
|
+
*/
|
|
163
|
+
interface ExportManifestInputs {
|
|
164
|
+
assistant: VBundleAssistantInfo;
|
|
165
|
+
origin: VBundleOriginInfo;
|
|
166
|
+
compatibility: VBundleCompatibility;
|
|
167
|
+
exportOptions: VBundleExportOptions;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Resolve the `assistant.id` for an export.
|
|
172
|
+
*
|
|
173
|
+
* Mirrors `platform/client.ts`'s precedence: in-memory override (set at
|
|
174
|
+
* daemon startup or by secret-routes) → credential store → daemon-internal
|
|
175
|
+
* fallback. The schema requires `id` to be non-empty, so we fall back to
|
|
176
|
+
* `DAEMON_INTERNAL_ASSISTANT_ID` rather than the empty string.
|
|
177
|
+
*/
|
|
178
|
+
async function resolveAssistantId(): Promise<string> {
|
|
179
|
+
const inMemory = getPlatformAssistantId();
|
|
180
|
+
if (inMemory) return inMemory;
|
|
181
|
+
try {
|
|
182
|
+
const stored = await getSecureKeyAsync(
|
|
183
|
+
credentialKey("vellum", "platform_assistant_id"),
|
|
184
|
+
);
|
|
185
|
+
if (stored) return stored;
|
|
186
|
+
} catch (err) {
|
|
187
|
+
log.warn(
|
|
188
|
+
{ err },
|
|
189
|
+
"Failed to read platform_assistant_id from credential store; falling back to daemon-internal id",
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
return DAEMON_INTERNAL_ASSISTANT_ID;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Decide the truthful `secrets_redacted` flag for an export.
|
|
197
|
+
*
|
|
198
|
+
* The export entry points pass every collected credential through to the
|
|
199
|
+
* builder unfiltered, so the bundle is NOT redacted whenever any
|
|
200
|
+
* credentials made it in. Only flip to true when the credential list is
|
|
201
|
+
* empty AND every credential read succeeded — i.e. there genuinely are
|
|
202
|
+
* no secrets in the bundle.
|
|
203
|
+
*
|
|
204
|
+
* Two failure modes both force `false`:
|
|
205
|
+
* - `storeUnreachable`: the top-level `listSecureKeysAsync()` call
|
|
206
|
+
* failed, so we never even discovered which accounts exist.
|
|
207
|
+
* - `perAccountUnreachable`: the LIST call succeeded but one or more
|
|
208
|
+
* individual `getSecureKeyResultAsync(account)` reads returned
|
|
209
|
+
* `unreachable: true`. Those accounts were silently skipped from the
|
|
210
|
+
* `credentials` array, so a `credentialCount === 0` outcome could
|
|
211
|
+
* reflect "we couldn't read them" rather than "no secrets exist".
|
|
212
|
+
* Claiming a clean redaction in that case would be a lie.
|
|
213
|
+
*
|
|
214
|
+
* NOTE: a managed-mode bundle with `secrets_redacted: false` will fail
|
|
215
|
+
* the validator's cross-field refine. That surfaces an existing
|
|
216
|
+
* platform-side enforcement gap — the runtime emits the truthful value
|
|
217
|
+
* and lets the schema flag it.
|
|
218
|
+
*/
|
|
219
|
+
export function computeSecretsRedacted(
|
|
220
|
+
credentialCount: number,
|
|
221
|
+
storeUnreachable: boolean,
|
|
222
|
+
perAccountUnreachable: boolean,
|
|
223
|
+
): boolean {
|
|
224
|
+
return credentialCount === 0 && !storeUnreachable && !perAccountUnreachable;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Compute the v1 manifest inputs that aren't tied to per-call options.
|
|
229
|
+
*
|
|
230
|
+
* `walkDirectoryForMetadata` skips `embedding-models`, `data/qdrant`,
|
|
231
|
+
* `signals`, and `deprecated` — `logs` is NOT in the skip list, so log
|
|
232
|
+
* files end up in `manifest.contents`. Browser state and memory vectors
|
|
233
|
+
* (qdrant) are skipped, so those flags are false.
|
|
234
|
+
*/
|
|
235
|
+
async function buildExportManifestInputs(): Promise<ExportManifestInputs> {
|
|
236
|
+
const assistantId = await resolveAssistantId();
|
|
237
|
+
const assistantName = getAssistantName() ?? "Assistant";
|
|
238
|
+
const originMode = await getOriginMode();
|
|
239
|
+
return {
|
|
240
|
+
assistant: {
|
|
241
|
+
id: assistantId,
|
|
242
|
+
name: assistantName,
|
|
243
|
+
runtime_version: APP_VERSION,
|
|
244
|
+
},
|
|
245
|
+
origin: {
|
|
246
|
+
mode: originMode,
|
|
247
|
+
hostname: hostname(),
|
|
248
|
+
},
|
|
249
|
+
compatibility: {
|
|
250
|
+
min_runtime_version: APP_VERSION,
|
|
251
|
+
max_runtime_version: null,
|
|
252
|
+
},
|
|
253
|
+
exportOptions: {
|
|
254
|
+
include_logs: true,
|
|
255
|
+
include_browser_state: false,
|
|
256
|
+
include_memory_vectors: false,
|
|
257
|
+
},
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
139
261
|
/**
|
|
140
262
|
* POST /v1/migrations/validate
|
|
141
263
|
*
|
|
@@ -188,18 +310,21 @@ export async function handleMigrationValidate({
|
|
|
188
310
|
*
|
|
189
311
|
* Auth: Requires settings.write scope. Allowed for actor, svc_gateway, svc_daemon, local.
|
|
190
312
|
*/
|
|
191
|
-
export async function handleMigrationExport(
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
313
|
+
export async function handleMigrationExport(
|
|
314
|
+
_args: RouteHandlerArgs,
|
|
315
|
+
): Promise<RouteResponse> {
|
|
316
|
+
// The legacy `description` field is no longer carried on the v1
|
|
317
|
+
// manifest. Older clients still POST it; we silently ignore it.
|
|
197
318
|
let cleanup: (() => Promise<void>) | undefined;
|
|
198
319
|
|
|
199
320
|
try {
|
|
200
321
|
// Read all stored credentials to include in the export bundle
|
|
201
322
|
const credentialList = await listSecureKeysAsync();
|
|
202
323
|
const credentials: Array<{ account: string; value: string }> = [];
|
|
324
|
+
// Track per-account read failures separately from the top-level LIST
|
|
325
|
+
// failure. A single skipped account means we cannot truthfully claim
|
|
326
|
+
// the bundle is fully redacted — we don't know what we missed.
|
|
327
|
+
let perAccountUnreachable = false;
|
|
203
328
|
if (credentialList.unreachable) {
|
|
204
329
|
log.warn(
|
|
205
330
|
"Credential store is unreachable — export will not include credentials",
|
|
@@ -208,6 +333,7 @@ export async function handleMigrationExport({
|
|
|
208
333
|
for (const account of credentialList.accounts) {
|
|
209
334
|
const result = await getSecureKeyResultAsync(account);
|
|
210
335
|
if (result.unreachable) {
|
|
336
|
+
perAccountUnreachable = true;
|
|
211
337
|
log.warn(
|
|
212
338
|
{ account },
|
|
213
339
|
"Credential store unreachable when reading credential — skipping",
|
|
@@ -218,10 +344,17 @@ export async function handleMigrationExport({
|
|
|
218
344
|
}
|
|
219
345
|
}
|
|
220
346
|
|
|
347
|
+
const manifestInputs = await buildExportManifestInputs();
|
|
348
|
+
const secretsRedacted = computeSecretsRedacted(
|
|
349
|
+
credentials.length,
|
|
350
|
+
credentialList.unreachable,
|
|
351
|
+
perAccountUnreachable,
|
|
352
|
+
);
|
|
353
|
+
|
|
221
354
|
const result = await streamExportVBundle({
|
|
222
355
|
workspaceDir: getWorkspaceDir(),
|
|
223
|
-
|
|
224
|
-
|
|
356
|
+
...manifestInputs,
|
|
357
|
+
secretsRedacted,
|
|
225
358
|
credentials,
|
|
226
359
|
checkpoint: () => {
|
|
227
360
|
const dbPath = getDbPath();
|
|
@@ -262,8 +395,12 @@ export async function handleMigrationExport({
|
|
|
262
395
|
"Content-Type": "application/octet-stream",
|
|
263
396
|
"Content-Disposition": `attachment; filename="${filename}"`,
|
|
264
397
|
"Content-Length": String(size),
|
|
265
|
-
|
|
266
|
-
"
|
|
398
|
+
// `schema_version` is now an integer; clients that parse this header
|
|
399
|
+
// continue to work, but the value flips from "1.0" to "1".
|
|
400
|
+
"X-Vbundle-Schema-Version": String(manifest.schema_version),
|
|
401
|
+
// Header name preserved for cross-version client compat; populated
|
|
402
|
+
// from the renamed manifest `checksum` field.
|
|
403
|
+
"X-Vbundle-Manifest-Sha256": manifest.checksum,
|
|
267
404
|
"X-Vbundle-Credentials-Included": String(credentials.length),
|
|
268
405
|
});
|
|
269
406
|
} catch (err) {
|
|
@@ -288,15 +425,23 @@ const MigrationExportToGcsBody = z.object({
|
|
|
288
425
|
});
|
|
289
426
|
|
|
290
427
|
/**
|
|
291
|
-
* Collected credentials plus
|
|
428
|
+
* Collected credentials plus warning markers if the credential store was
|
|
292
429
|
* unreachable. The caller surfaces the warning in logs; production callers
|
|
293
430
|
* fail closed on errors (a thrown exception → 500) to avoid shipping a
|
|
294
431
|
* bundle with partial credentials. An unreachable store is NOT an error —
|
|
295
432
|
* `handleMigrationExport` treats that case as "export without credentials".
|
|
433
|
+
*
|
|
434
|
+
* - `unreachable`: the top-level `listSecureKeysAsync()` call failed.
|
|
435
|
+
* - `perAccountUnreachable`: the LIST succeeded but one or more individual
|
|
436
|
+
* `getSecureKeyResultAsync(account)` calls returned `unreachable: true`.
|
|
437
|
+
* Those accounts were silently skipped from `credentials`, so the count
|
|
438
|
+
* here understates reality. The flag is what tells `computeSecretsRedacted`
|
|
439
|
+
* it cannot claim a clean redaction.
|
|
296
440
|
*/
|
|
297
441
|
interface CollectedCredentials {
|
|
298
442
|
credentials: Array<{ account: string; value: string }>;
|
|
299
443
|
unreachable: boolean;
|
|
444
|
+
perAccountUnreachable: boolean;
|
|
300
445
|
}
|
|
301
446
|
|
|
302
447
|
/**
|
|
@@ -311,12 +456,18 @@ async function collectExportCredentials(): Promise<CollectedCredentials> {
|
|
|
311
456
|
log.warn(
|
|
312
457
|
"Credential store is unreachable — export will not include credentials",
|
|
313
458
|
);
|
|
314
|
-
return {
|
|
459
|
+
return {
|
|
460
|
+
credentials: [],
|
|
461
|
+
unreachable: true,
|
|
462
|
+
perAccountUnreachable: false,
|
|
463
|
+
};
|
|
315
464
|
}
|
|
316
465
|
const credentials: Array<{ account: string; value: string }> = [];
|
|
466
|
+
let perAccountUnreachable = false;
|
|
317
467
|
for (const account of credentialList.accounts) {
|
|
318
468
|
const result = await getSecureKeyResultAsync(account);
|
|
319
469
|
if (result.unreachable) {
|
|
470
|
+
perAccountUnreachable = true;
|
|
320
471
|
log.warn(
|
|
321
472
|
{ account },
|
|
322
473
|
"Credential store unreachable when reading credential — skipping",
|
|
@@ -325,7 +476,7 @@ async function collectExportCredentials(): Promise<CollectedCredentials> {
|
|
|
325
476
|
credentials.push({ account, value: result.value });
|
|
326
477
|
}
|
|
327
478
|
}
|
|
328
|
-
return { credentials, unreachable: false };
|
|
479
|
+
return { credentials, unreachable: false, perAccountUnreachable };
|
|
329
480
|
}
|
|
330
481
|
|
|
331
482
|
/**
|
|
@@ -355,9 +506,7 @@ async function collectExportCredentials(): Promise<CollectedCredentials> {
|
|
|
355
506
|
*
|
|
356
507
|
* Auth: settings.write scope (matches `migrations/export`).
|
|
357
508
|
*/
|
|
358
|
-
export async function handleMigrationExportToGcs({
|
|
359
|
-
body,
|
|
360
|
-
}: RouteHandlerArgs) {
|
|
509
|
+
export async function handleMigrationExportToGcs({ body }: RouteHandlerArgs) {
|
|
361
510
|
// ── 1. Parse JSON body ────────────────────────────────────────────────
|
|
362
511
|
const parsed = MigrationExportToGcsBody.safeParse(body);
|
|
363
512
|
if (!parsed.success) {
|
|
@@ -399,9 +548,29 @@ export async function handleMigrationExportToGcs({
|
|
|
399
548
|
);
|
|
400
549
|
}
|
|
401
550
|
|
|
402
|
-
const description = parsed.data.description;
|
|
403
551
|
const uploadUrl = parsed.data.upload_url;
|
|
404
552
|
|
|
553
|
+
// Compute the v1 manifest inputs once outside the async job runner so we
|
|
554
|
+
// surface failures (e.g. credential-store probe) as a synchronous 500
|
|
555
|
+
// before the caller starts polling.
|
|
556
|
+
let manifestInputs: ExportManifestInputs;
|
|
557
|
+
try {
|
|
558
|
+
manifestInputs = await buildExportManifestInputs();
|
|
559
|
+
} catch (err) {
|
|
560
|
+
log.error({ err }, "Failed to assemble export manifest inputs");
|
|
561
|
+
throw new InternalError(
|
|
562
|
+
err instanceof Error
|
|
563
|
+
? err.message
|
|
564
|
+
: "Failed to assemble export manifest inputs",
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
const secretsRedacted = computeSecretsRedacted(
|
|
569
|
+
collected.credentials.length,
|
|
570
|
+
collected.unreachable,
|
|
571
|
+
collected.perAccountUnreachable,
|
|
572
|
+
);
|
|
573
|
+
|
|
405
574
|
// ── 4. Enqueue the job. The runner captures the collected credentials.
|
|
406
575
|
let job;
|
|
407
576
|
try {
|
|
@@ -410,8 +579,8 @@ export async function handleMigrationExportToGcs({
|
|
|
410
579
|
try {
|
|
411
580
|
const result = await streamExportVBundle({
|
|
412
581
|
workspaceDir: getWorkspaceDir(),
|
|
413
|
-
|
|
414
|
-
|
|
582
|
+
...manifestInputs,
|
|
583
|
+
secretsRedacted,
|
|
415
584
|
credentials: collected.credentials,
|
|
416
585
|
checkpoint: () => {
|
|
417
586
|
const dbPath = getDbPath();
|
|
@@ -493,7 +662,7 @@ export async function handleMigrationExportToGcs({
|
|
|
493
662
|
|
|
494
663
|
return {
|
|
495
664
|
size,
|
|
496
|
-
sha256: manifest.
|
|
665
|
+
sha256: manifest.checksum,
|
|
497
666
|
schemaVersion: manifest.schema_version,
|
|
498
667
|
credentialsIncluded: collected.credentials.length,
|
|
499
668
|
};
|
|
@@ -557,9 +726,7 @@ async function extractFileData(
|
|
|
557
726
|
const formData = await syntheticReq.formData();
|
|
558
727
|
const file = formData.get("file");
|
|
559
728
|
if (!file || !(file instanceof Blob)) {
|
|
560
|
-
throw new BadRequestError(
|
|
561
|
-
'Multipart upload requires a "file" field',
|
|
562
|
-
);
|
|
729
|
+
throw new BadRequestError('Multipart upload requires a "file" field');
|
|
563
730
|
}
|
|
564
731
|
return new Uint8Array(await file.arrayBuffer());
|
|
565
732
|
} catch (err) {
|
|
@@ -705,6 +872,23 @@ export async function handleMigrationImport(
|
|
|
705
872
|
};
|
|
706
873
|
}
|
|
707
874
|
|
|
875
|
+
// Pre-check runtime-version compat before the DB close/reopen cycle.
|
|
876
|
+
// commitImport runs the same gate as defense-in-depth for callers that
|
|
877
|
+
// don't pre-check; we run it here too so an incompatible bundle short-
|
|
878
|
+
// circuits before resetDb().
|
|
879
|
+
const compatResult = evaluateRuntimeCompatibility(
|
|
880
|
+
validation.manifest!.compatibility,
|
|
881
|
+
APP_VERSION,
|
|
882
|
+
);
|
|
883
|
+
if (!compatResult.ok) {
|
|
884
|
+
throwImportCommitFailure({
|
|
885
|
+
ok: false,
|
|
886
|
+
reason: "version_incompatible",
|
|
887
|
+
bundle_compat: compatResult.bundle_compat,
|
|
888
|
+
runtime_version: compatResult.runtime_version,
|
|
889
|
+
});
|
|
890
|
+
}
|
|
891
|
+
|
|
708
892
|
const pathResolver = new DefaultPathResolver(
|
|
709
893
|
getWorkspaceDir(),
|
|
710
894
|
getWorkspaceHooksDir(),
|
|
@@ -757,6 +941,12 @@ export async function handleMigrationImport(
|
|
|
757
941
|
|
|
758
942
|
return importCommitSuccessResult(result.report, credentialsImported);
|
|
759
943
|
} catch (err) {
|
|
944
|
+
// Preserve typed RouteError instances (e.g. UnprocessableEntityError for
|
|
945
|
+
// version_incompatible, BadRequestError for validation_failed) — only
|
|
946
|
+
// wrap genuinely unexpected errors as 500 InternalError.
|
|
947
|
+
if (err instanceof RouteError) {
|
|
948
|
+
throw err;
|
|
949
|
+
}
|
|
760
950
|
log.error({ err }, "Unexpected error during import commit");
|
|
761
951
|
throw new InternalError(
|
|
762
952
|
err instanceof Error ? err.message : "Unexpected import error",
|
|
@@ -853,12 +1043,18 @@ interface GcsImportErrorInit {
|
|
|
853
1043
|
| "fetch_failed"
|
|
854
1044
|
| "validation_failed"
|
|
855
1045
|
| "extraction_failed"
|
|
1046
|
+
| "version_incompatible"
|
|
856
1047
|
| "write_failed";
|
|
857
1048
|
message: string;
|
|
858
1049
|
upstreamStatus?: number;
|
|
859
1050
|
reason?: string;
|
|
860
1051
|
errors?: Array<{ code: string; message: string; path?: string }>;
|
|
861
1052
|
partial_report?: ImportCommitReport;
|
|
1053
|
+
/** Populated for `version_incompatible` — mirrors the platform's PR #5470
|
|
1054
|
+
* response shape so the URL-body endpoint can return the same body. */
|
|
1055
|
+
bundle_compat?: RuntimeCompatibility;
|
|
1056
|
+
/** Populated for `version_incompatible`. */
|
|
1057
|
+
runtime_version?: string;
|
|
862
1058
|
}
|
|
863
1059
|
|
|
864
1060
|
class GcsImportError extends Error {
|
|
@@ -867,6 +1063,8 @@ class GcsImportError extends Error {
|
|
|
867
1063
|
public readonly reason?: string;
|
|
868
1064
|
public readonly errors?: GcsImportErrorInit["errors"];
|
|
869
1065
|
public readonly partial_report?: ImportCommitReport;
|
|
1066
|
+
public readonly bundle_compat?: RuntimeCompatibility;
|
|
1067
|
+
public readonly runtime_version?: string;
|
|
870
1068
|
|
|
871
1069
|
constructor(init: GcsImportErrorInit) {
|
|
872
1070
|
super(init.message);
|
|
@@ -884,6 +1082,12 @@ class GcsImportError extends Error {
|
|
|
884
1082
|
if (init.partial_report !== undefined) {
|
|
885
1083
|
this.partial_report = init.partial_report;
|
|
886
1084
|
}
|
|
1085
|
+
if (init.bundle_compat !== undefined) {
|
|
1086
|
+
this.bundle_compat = init.bundle_compat;
|
|
1087
|
+
}
|
|
1088
|
+
if (init.runtime_version !== undefined) {
|
|
1089
|
+
this.runtime_version = init.runtime_version;
|
|
1090
|
+
}
|
|
887
1091
|
}
|
|
888
1092
|
}
|
|
889
1093
|
|
|
@@ -910,7 +1114,7 @@ class GcsImportError extends Error {
|
|
|
910
1114
|
* The signed URL is never echoed into errors or logs — only the extracted
|
|
911
1115
|
* `host`/`path` are.
|
|
912
1116
|
*/
|
|
913
|
-
|
|
1117
|
+
async function runGcsImport(
|
|
914
1118
|
url: string,
|
|
915
1119
|
_correlationId?: string,
|
|
916
1120
|
): Promise<ImportSummary> {
|
|
@@ -1182,6 +1386,22 @@ export async function runGcsImport(
|
|
|
1182
1386
|
reason: result.reason,
|
|
1183
1387
|
});
|
|
1184
1388
|
}
|
|
1389
|
+
if (result.reason === "version_incompatible") {
|
|
1390
|
+
// Returned by commitImport / streamCommitImport when the runtime falls
|
|
1391
|
+
// outside the bundle's compat range. The platform-side gate is the
|
|
1392
|
+
// primary check; this catches legacy bundles whose ExportJob row
|
|
1393
|
+
// predates PR #5470 (compat columns NULL → platform gate skipped).
|
|
1394
|
+
throw new GcsImportError({
|
|
1395
|
+
code: "version_incompatible",
|
|
1396
|
+
message: formatRuntimeCompatibilityMessage(
|
|
1397
|
+
result.bundle_compat,
|
|
1398
|
+
result.runtime_version,
|
|
1399
|
+
),
|
|
1400
|
+
reason: result.reason,
|
|
1401
|
+
bundle_compat: result.bundle_compat,
|
|
1402
|
+
runtime_version: result.runtime_version,
|
|
1403
|
+
});
|
|
1404
|
+
}
|
|
1185
1405
|
// write_failed
|
|
1186
1406
|
throw new GcsImportError({
|
|
1187
1407
|
code: "write_failed",
|
|
@@ -1281,6 +1501,20 @@ function throwGcsImportError(err: unknown): never {
|
|
|
1281
1501
|
}),
|
|
1282
1502
|
);
|
|
1283
1503
|
}
|
|
1504
|
+
if (err.code === "version_incompatible") {
|
|
1505
|
+
// 422 (not 500) — the bundle is structurally valid but cannot be
|
|
1506
|
+
// imported on this runtime. Body mirrors the platform's PR #5470
|
|
1507
|
+
// response shape.
|
|
1508
|
+
throw new UnprocessableEntityError(err.message, {
|
|
1509
|
+
reason: "version_incompatible" as const,
|
|
1510
|
+
...(err.bundle_compat !== undefined && {
|
|
1511
|
+
bundle_compat: err.bundle_compat,
|
|
1512
|
+
}),
|
|
1513
|
+
...(err.runtime_version !== undefined && {
|
|
1514
|
+
runtime_version: err.runtime_version,
|
|
1515
|
+
}),
|
|
1516
|
+
});
|
|
1517
|
+
}
|
|
1284
1518
|
if (err.code === "extraction_failed") {
|
|
1285
1519
|
throw new InternalError(err.message);
|
|
1286
1520
|
}
|
|
@@ -1303,9 +1537,7 @@ function throwGcsImportError(err: unknown): never {
|
|
|
1303
1537
|
*
|
|
1304
1538
|
* Auth: Requires settings.write scope. Allowed for actor, svc_gateway, svc_daemon, local.
|
|
1305
1539
|
*/
|
|
1306
|
-
export async function handleMigrationImportFromGcs({
|
|
1307
|
-
body,
|
|
1308
|
-
}: RouteHandlerArgs) {
|
|
1540
|
+
export async function handleMigrationImportFromGcs({ body }: RouteHandlerArgs) {
|
|
1309
1541
|
const parsed = MigrationImportFromGcsBody.safeParse(body);
|
|
1310
1542
|
if (!parsed.success) {
|
|
1311
1543
|
throw new BadRequestError(
|
|
@@ -1515,6 +1747,29 @@ function throwImportCommitFailure(
|
|
|
1515
1747
|
throw new InternalError(result.message);
|
|
1516
1748
|
}
|
|
1517
1749
|
|
|
1750
|
+
if (result.reason === "version_incompatible") {
|
|
1751
|
+
// Returned by commitImport / streamCommitImport when the runtime falls
|
|
1752
|
+
// outside the bundle's compat range. The platform-side gate is the
|
|
1753
|
+
// primary check; this catches legacy bundles whose ExportJob row
|
|
1754
|
+
// predates PR #5470 (compat columns NULL → platform gate skipped).
|
|
1755
|
+
//
|
|
1756
|
+
// 422 (not 500) — the bundle is structurally valid but cannot be
|
|
1757
|
+
// imported on this runtime; the caller can act on it (upgrade the
|
|
1758
|
+
// runtime, choose a different bundle). Body mirrors the platform's
|
|
1759
|
+
// PR #5470 response shape.
|
|
1760
|
+
throw new UnprocessableEntityError(
|
|
1761
|
+
formatRuntimeCompatibilityMessage(
|
|
1762
|
+
result.bundle_compat,
|
|
1763
|
+
result.runtime_version,
|
|
1764
|
+
),
|
|
1765
|
+
{
|
|
1766
|
+
reason: "version_incompatible" as const,
|
|
1767
|
+
bundle_compat: result.bundle_compat,
|
|
1768
|
+
runtime_version: result.runtime_version,
|
|
1769
|
+
},
|
|
1770
|
+
);
|
|
1771
|
+
}
|
|
1772
|
+
|
|
1518
1773
|
// write_failed
|
|
1519
1774
|
throw new InternalError(result.message);
|
|
1520
1775
|
}
|
|
@@ -1652,8 +1907,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
1652
1907
|
}),
|
|
1653
1908
|
additionalResponses: {
|
|
1654
1909
|
"502": {
|
|
1655
|
-
description:
|
|
1656
|
-
"Upstream fetch failed (URL body only).",
|
|
1910
|
+
description: "Upstream fetch failed (URL body only).",
|
|
1657
1911
|
},
|
|
1658
1912
|
},
|
|
1659
1913
|
responseBody: z.object({
|
|
@@ -1710,8 +1964,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
1710
1964
|
}),
|
|
1711
1965
|
additionalResponses: {
|
|
1712
1966
|
"409": {
|
|
1713
|
-
description:
|
|
1714
|
-
"Another import job is already pending or running.",
|
|
1967
|
+
description: "Another import job is already pending or running.",
|
|
1715
1968
|
},
|
|
1716
1969
|
},
|
|
1717
1970
|
handler: handleMigrationImportFromGcs,
|
|
@@ -15,7 +15,7 @@ import { RouteError } from "../errors.js";
|
|
|
15
15
|
*/
|
|
16
16
|
const PLAYGROUND_DISABLED_CODE = "playground_disabled";
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
function isPlaygroundEnabled(): boolean {
|
|
19
19
|
return isAssistantFeatureFlagEnabled("compaction-playground", getConfig());
|
|
20
20
|
}
|
|
21
21
|
|
|
@@ -6,8 +6,6 @@ import { ROUTES as SEED_CONVERSATION_ROUTES } from "./seed-conversation.js";
|
|
|
6
6
|
import { ROUTES as SEEDED_CONVERSATIONS_ROUTES } from "./seeded-conversations.js";
|
|
7
7
|
import { ROUTES as STATE_ROUTES } from "./state.js";
|
|
8
8
|
|
|
9
|
-
export { assertPlaygroundEnabled } from "./guard.js";
|
|
10
|
-
|
|
11
9
|
export const ROUTES: RouteDefinition[] = [
|
|
12
10
|
...FORCE_COMPACT_ROUTES,
|
|
13
11
|
...INJECT_FAILURES_ROUTES,
|
|
@@ -14,7 +14,6 @@
|
|
|
14
14
|
|
|
15
15
|
import { z } from "zod";
|
|
16
16
|
|
|
17
|
-
import { broadcastToAllClients } from "../../acp/index.js";
|
|
18
17
|
import {
|
|
19
18
|
getActiveRestartToken,
|
|
20
19
|
handleRecordingPause,
|
|
@@ -24,7 +23,6 @@ import {
|
|
|
24
23
|
handleRecordingStop,
|
|
25
24
|
isRecordingIdle,
|
|
26
25
|
} from "../../daemon/handlers/recording.js";
|
|
27
|
-
import type { HandlerContext } from "../../daemon/handlers/shared.js";
|
|
28
26
|
import type {
|
|
29
27
|
RecordingOptions,
|
|
30
28
|
RecordingStatus,
|
|
@@ -40,17 +38,6 @@ import type { RouteDefinition, RouteHandlerArgs } from "./types.js";
|
|
|
40
38
|
|
|
41
39
|
const log = getLogger("recording-routes");
|
|
42
40
|
|
|
43
|
-
// ---------------------------------------------------------------------------
|
|
44
|
-
// Broadcast shim — recording handlers only use ctx.broadcast()
|
|
45
|
-
// ---------------------------------------------------------------------------
|
|
46
|
-
|
|
47
|
-
function getBroadcastCtx(): HandlerContext {
|
|
48
|
-
if (!broadcastToAllClients) {
|
|
49
|
-
throw new InternalError("Broadcast not initialized");
|
|
50
|
-
}
|
|
51
|
-
return { broadcast: broadcastToAllClients } as HandlerContext;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
41
|
// ---------------------------------------------------------------------------
|
|
55
42
|
// Handlers
|
|
56
43
|
// ---------------------------------------------------------------------------
|
|
@@ -60,11 +47,9 @@ async function handleStartRecording({ body }: RouteHandlerArgs) {
|
|
|
60
47
|
throw new BadRequestError("conversationId is required");
|
|
61
48
|
}
|
|
62
49
|
|
|
63
|
-
const ctx = getBroadcastCtx();
|
|
64
50
|
const recordingId = handleRecordingStart(
|
|
65
51
|
body.conversationId,
|
|
66
52
|
body.options as RecordingOptions | undefined,
|
|
67
|
-
ctx,
|
|
68
53
|
);
|
|
69
54
|
|
|
70
55
|
if (!recordingId) {
|
|
@@ -90,8 +75,7 @@ async function handleStopRecording({ body }: RouteHandlerArgs) {
|
|
|
90
75
|
throw new BadRequestError("conversationId is required");
|
|
91
76
|
}
|
|
92
77
|
|
|
93
|
-
const
|
|
94
|
-
const recordingId = handleRecordingStop(body.conversationId, ctx);
|
|
78
|
+
const recordingId = handleRecordingStop(body.conversationId);
|
|
95
79
|
|
|
96
80
|
if (!recordingId) {
|
|
97
81
|
log.debug(
|
|
@@ -114,8 +98,7 @@ async function handlePauseRecording({ body }: RouteHandlerArgs) {
|
|
|
114
98
|
throw new BadRequestError("conversationId is required");
|
|
115
99
|
}
|
|
116
100
|
|
|
117
|
-
const
|
|
118
|
-
const recordingId = handleRecordingPause(body.conversationId, ctx);
|
|
101
|
+
const recordingId = handleRecordingPause(body.conversationId);
|
|
119
102
|
|
|
120
103
|
if (!recordingId) {
|
|
121
104
|
log.debug(
|
|
@@ -138,8 +121,7 @@ async function handleResumeRecording({ body }: RouteHandlerArgs) {
|
|
|
138
121
|
throw new BadRequestError("conversationId is required");
|
|
139
122
|
}
|
|
140
123
|
|
|
141
|
-
const
|
|
142
|
-
const recordingId = handleRecordingResume(body.conversationId, ctx);
|
|
124
|
+
const recordingId = handleRecordingResume(body.conversationId);
|
|
143
125
|
|
|
144
126
|
if (!recordingId) {
|
|
145
127
|
log.debug(
|
|
@@ -198,10 +180,8 @@ async function handlePostRecordingStatus({ body }: RouteHandlerArgs) {
|
|
|
198
180
|
type: "recording_status",
|
|
199
181
|
};
|
|
200
182
|
|
|
201
|
-
const ctx = getBroadcastCtx();
|
|
202
|
-
|
|
203
183
|
try {
|
|
204
|
-
await handleRecordingStatusCore(msg
|
|
184
|
+
await handleRecordingStatusCore(msg);
|
|
205
185
|
} catch (err) {
|
|
206
186
|
log.error(
|
|
207
187
|
{ err, conversationId: body.conversationId, status: body.status },
|
|
@@ -16,7 +16,6 @@ import {
|
|
|
16
16
|
import { getLogger } from "../../util/logger.js";
|
|
17
17
|
import { buildAssistantEvent } from "../assistant-event.js";
|
|
18
18
|
import { assistantEventHub } from "../assistant-event-hub.js";
|
|
19
|
-
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
|
|
20
19
|
import { BadRequestError, NotFoundError } from "./errors.js";
|
|
21
20
|
import type { RouteDefinition } from "./types.js";
|
|
22
21
|
|
|
@@ -46,9 +45,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
46
45
|
|
|
47
46
|
const conversation = getConversation(conversationId);
|
|
48
47
|
if (!conversation) {
|
|
49
|
-
throw new NotFoundError(
|
|
50
|
-
`Conversation ${conversationId} not found`,
|
|
51
|
-
);
|
|
48
|
+
throw new NotFoundError(`Conversation ${conversationId} not found`);
|
|
52
49
|
}
|
|
53
50
|
|
|
54
51
|
updateConversationTitle(conversationId, title, 0);
|
|
@@ -56,7 +53,6 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
56
53
|
assistantEventHub
|
|
57
54
|
.publish(
|
|
58
55
|
buildAssistantEvent(
|
|
59
|
-
DAEMON_INTERNAL_ASSISTANT_ID,
|
|
60
56
|
{
|
|
61
57
|
type: "conversation_title_updated",
|
|
62
58
|
conversationId,
|
|
@@ -71,7 +67,7 @@ export const ROUTES: RouteDefinition[] = [
|
|
|
71
67
|
|
|
72
68
|
assistantEventHub
|
|
73
69
|
.publish(
|
|
74
|
-
buildAssistantEvent(
|
|
70
|
+
buildAssistantEvent({
|
|
75
71
|
type: "conversation_list_invalidated",
|
|
76
72
|
reason: "renamed",
|
|
77
73
|
}),
|