@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
|
@@ -432,6 +432,12 @@ describe("relationship-state-writer", () => {
|
|
|
432
432
|
// Also sanity: it must be a real, recent date (not the epoch
|
|
433
433
|
// sentinel we emit when stat fails).
|
|
434
434
|
expect(Date.parse(first.hatchedDate)).toBeGreaterThan(0);
|
|
435
|
+
const sidecarPath = join(workspaceDir, "data", "hatched.json");
|
|
436
|
+
expect(existsSync(sidecarPath)).toBe(true);
|
|
437
|
+
const sidecar = JSON.parse(readFileSync(sidecarPath, "utf-8")) as {
|
|
438
|
+
hatchedAt: string;
|
|
439
|
+
};
|
|
440
|
+
expect(sidecar.hatchedAt).toBe(first.hatchedDate);
|
|
435
441
|
});
|
|
436
442
|
|
|
437
443
|
test("honors an explicit Hatched bullet in IDENTITY.md over file birthtime", async () => {
|
|
@@ -488,9 +494,10 @@ describe("relationship-state-writer", () => {
|
|
|
488
494
|
expect(state.hatchedDate).toBe("2025-01-15T00:00:00.000Z");
|
|
489
495
|
});
|
|
490
496
|
|
|
491
|
-
test("
|
|
492
|
-
// Seed
|
|
493
|
-
// explicit Hatched bullet —
|
|
497
|
+
test("sidecar takes precedence over IDENTITY.md metadata", async () => {
|
|
498
|
+
// Seed an existing sidecar and then an IDENTITY.md without an
|
|
499
|
+
// explicit Hatched bullet — the persisted sidecar wins so the
|
|
500
|
+
// date remains stable across later identity edits.
|
|
494
501
|
mkdirSync(join(workspaceDir, "data"), { recursive: true });
|
|
495
502
|
writeFileSync(
|
|
496
503
|
join(workspaceDir, "data", "hatched.json"),
|
|
@@ -500,12 +507,7 @@ describe("relationship-state-writer", () => {
|
|
|
500
507
|
writeFile("IDENTITY.md", "- **Name:** Sage\n- **Role:** Assistant\n");
|
|
501
508
|
|
|
502
509
|
const state = (await computeRelationshipState()) as RelationshipStateLike;
|
|
503
|
-
|
|
504
|
-
// written, so birthtime will be a much more recent date.
|
|
505
|
-
expect(state.hatchedDate).not.toBe("2020-06-01T00:00:00.000Z");
|
|
506
|
-
expect(Date.parse(state.hatchedDate)).toBeGreaterThan(
|
|
507
|
-
Date.parse("2020-06-01T00:00:00.000Z"),
|
|
508
|
-
);
|
|
510
|
+
expect(state.hatchedDate).toBe("2020-06-01T00:00:00.000Z");
|
|
509
511
|
});
|
|
510
512
|
});
|
|
511
513
|
|
|
@@ -704,6 +706,36 @@ describe("relationship-state-writer", () => {
|
|
|
704
706
|
expect(state.facts[0]?.source).toBe("onboarding");
|
|
705
707
|
});
|
|
706
708
|
|
|
709
|
+
test("tone group ID 'warm' maps to descriptive voice fact 'Warm and easy'", async () => {
|
|
710
|
+
writeOnboardingSidecar({
|
|
711
|
+
tools: [],
|
|
712
|
+
tasks: [],
|
|
713
|
+
tone: "warm",
|
|
714
|
+
});
|
|
715
|
+
|
|
716
|
+
const state = (await computeRelationshipState()) as RelationshipStateLike;
|
|
717
|
+
const voiceFacts = state.facts.filter(
|
|
718
|
+
(f) => f.category === "voice" && f.source === "onboarding",
|
|
719
|
+
);
|
|
720
|
+
expect(voiceFacts).toHaveLength(1);
|
|
721
|
+
expect(voiceFacts[0]!.text).toBe("Warm and easy");
|
|
722
|
+
});
|
|
723
|
+
|
|
724
|
+
test("unrecognized tone value passes through verbatim (backwards-compatible)", async () => {
|
|
725
|
+
writeOnboardingSidecar({
|
|
726
|
+
tools: [],
|
|
727
|
+
tasks: [],
|
|
728
|
+
tone: "balanced",
|
|
729
|
+
});
|
|
730
|
+
|
|
731
|
+
const state = (await computeRelationshipState()) as RelationshipStateLike;
|
|
732
|
+
const voiceFacts = state.facts.filter(
|
|
733
|
+
(f) => f.category === "voice" && f.source === "onboarding",
|
|
734
|
+
);
|
|
735
|
+
expect(voiceFacts).toHaveLength(1);
|
|
736
|
+
expect(voiceFacts[0]!.text).toBe("balanced");
|
|
737
|
+
});
|
|
738
|
+
|
|
707
739
|
test("missing sidecar produces no onboarding-sourced facts", async () => {
|
|
708
740
|
writeFile("USER.md", "- Preferred name: Alex");
|
|
709
741
|
const state = (await computeRelationshipState()) as RelationshipStateLike;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { describe, expect, mock, test } from "bun:test";
|
|
2
|
+
|
|
3
|
+
// ─── Mocks ─────────────────────────────────────────────────────────────
|
|
4
|
+
|
|
5
|
+
let mockConnectedProviders = new Set<string>();
|
|
6
|
+
|
|
7
|
+
mock.module("../../oauth/oauth-store.js", () => ({
|
|
8
|
+
isProviderConnected: async (provider: string) =>
|
|
9
|
+
mockConnectedProviders.has(provider),
|
|
10
|
+
listProviders: () => [
|
|
11
|
+
{ provider: "google" },
|
|
12
|
+
{ provider: "slack" },
|
|
13
|
+
{ provider: "notion" },
|
|
14
|
+
{ provider: "linear" },
|
|
15
|
+
{ provider: "github" },
|
|
16
|
+
],
|
|
17
|
+
}));
|
|
18
|
+
|
|
19
|
+
mock.module("../../util/logger.js", () => ({
|
|
20
|
+
getLogger: () =>
|
|
21
|
+
new Proxy({} as Record<string, unknown>, {
|
|
22
|
+
get: () => () => {},
|
|
23
|
+
}),
|
|
24
|
+
}));
|
|
25
|
+
|
|
26
|
+
const { getSuggestedPrompts } = await import("../suggested-prompts.js");
|
|
27
|
+
|
|
28
|
+
// ─── Tests ─────────────────────────────────────────────────────────────
|
|
29
|
+
|
|
30
|
+
describe("getSuggestedPrompts", () => {
|
|
31
|
+
test("shows 'Connect X' prompts when providers are disconnected", async () => {
|
|
32
|
+
mockConnectedProviders = new Set();
|
|
33
|
+
|
|
34
|
+
const prompts = await getSuggestedPrompts();
|
|
35
|
+
const ids = prompts.map((p) => p.id);
|
|
36
|
+
|
|
37
|
+
expect(ids).toContain("connect-google");
|
|
38
|
+
expect(ids).toContain("connect-slack");
|
|
39
|
+
expect(prompts.find((p) => p.id === "connect-google")!.label).toBe(
|
|
40
|
+
"Connect Gmail",
|
|
41
|
+
);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("shows email management prompts when Google is connected", async () => {
|
|
45
|
+
mockConnectedProviders = new Set(["google"]);
|
|
46
|
+
|
|
47
|
+
const prompts = await getSuggestedPrompts();
|
|
48
|
+
const ids = prompts.map((p) => p.id);
|
|
49
|
+
|
|
50
|
+
// Should NOT show "Connect Gmail"
|
|
51
|
+
expect(ids).not.toContain("connect-google");
|
|
52
|
+
|
|
53
|
+
// Should show management prompts
|
|
54
|
+
expect(ids).toContain("manage-google-triage-my-inbox");
|
|
55
|
+
expect(ids).toContain("manage-google-summarize-today's-emails");
|
|
56
|
+
|
|
57
|
+
const triage = prompts.find(
|
|
58
|
+
(p) => p.id === "manage-google-triage-my-inbox",
|
|
59
|
+
);
|
|
60
|
+
expect(triage).toBeDefined();
|
|
61
|
+
expect(triage!.label).toBe("Triage my inbox");
|
|
62
|
+
expect(triage!.icon).toBe("mail");
|
|
63
|
+
expect(triage!.source).toBe("deterministic");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("still shows Connect prompts for disconnected providers alongside management prompts", async () => {
|
|
67
|
+
mockConnectedProviders = new Set(["google"]);
|
|
68
|
+
|
|
69
|
+
const prompts = await getSuggestedPrompts();
|
|
70
|
+
const ids = prompts.map((p) => p.id);
|
|
71
|
+
|
|
72
|
+
// Gmail management prompts
|
|
73
|
+
expect(ids).toContain("manage-google-triage-my-inbox");
|
|
74
|
+
// Slack still disconnected
|
|
75
|
+
expect(ids).toContain("connect-slack");
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("providers without connectedPrompts show nothing when connected", async () => {
|
|
79
|
+
mockConnectedProviders = new Set(["slack"]);
|
|
80
|
+
|
|
81
|
+
const prompts = await getSuggestedPrompts();
|
|
82
|
+
const ids = prompts.map((p) => p.id);
|
|
83
|
+
|
|
84
|
+
// No connect prompt since connected
|
|
85
|
+
expect(ids).not.toContain("connect-slack");
|
|
86
|
+
// No management prompts since Slack doesn't define any
|
|
87
|
+
expect(ids.filter((id) => id.startsWith("manage-slack"))).toHaveLength(0);
|
|
88
|
+
});
|
|
89
|
+
});
|
package/src/home/feed-writer.ts
CHANGED
|
@@ -54,7 +54,6 @@ import { join } from "node:path";
|
|
|
54
54
|
|
|
55
55
|
import { buildAssistantEvent } from "../runtime/assistant-event.js";
|
|
56
56
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
57
|
-
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
|
|
58
57
|
import { getLogger } from "../util/logger.js";
|
|
59
58
|
import { getDataDir } from "../util/platform.js";
|
|
60
59
|
import {
|
|
@@ -457,7 +456,7 @@ function compareFeedItems(a: FeedItem, b: FeedItem): number {
|
|
|
457
456
|
function publishHomeFeedUpdated(updatedAt: string, newItemCount: number): void {
|
|
458
457
|
assistantEventHub
|
|
459
458
|
.publish(
|
|
460
|
-
buildAssistantEvent(
|
|
459
|
+
buildAssistantEvent({
|
|
461
460
|
type: "home_feed_updated",
|
|
462
461
|
updatedAt,
|
|
463
462
|
newItemCount,
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Post-connection feed nudge.
|
|
3
|
+
*
|
|
4
|
+
* Emits a one-time nudge feed item when the user successfully connects
|
|
5
|
+
* an email-capable OAuth provider. The nudge highlights ongoing email
|
|
6
|
+
* management capabilities (inbox triage, daily digests) so the user
|
|
7
|
+
* discovers what they can do beyond the initial setup.
|
|
8
|
+
*
|
|
9
|
+
* Uses a deterministic id (`connect-nudge:<service>`) so reconnecting
|
|
10
|
+
* the same provider replaces the existing nudge in place rather than
|
|
11
|
+
* appending a duplicate.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { FeedItem } from "./feed-types.js";
|
|
15
|
+
import { appendFeedItem } from "./feed-writer.js";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Services that should trigger an email management nudge on connection.
|
|
19
|
+
* Only providers with real email integration are listed — see
|
|
20
|
+
* `relationship-state-writer.ts` for the same "only Gmail is real" note.
|
|
21
|
+
*/
|
|
22
|
+
const EMAIL_SERVICES = new Set(["google"]);
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Emit a feed nudge for a newly connected email provider.
|
|
26
|
+
*
|
|
27
|
+
* No-ops silently when the service is not email-capable. Never throws —
|
|
28
|
+
* the feed writer's warn-log contract absorbs persistence failures.
|
|
29
|
+
*/
|
|
30
|
+
export async function emitPostConnectNudge(service: string): Promise<void> {
|
|
31
|
+
if (!EMAIL_SERVICES.has(service)) return;
|
|
32
|
+
|
|
33
|
+
const now = new Date();
|
|
34
|
+
const expiresAt = new Date(
|
|
35
|
+
now.getTime() + 7 * 24 * 60 * 60 * 1000,
|
|
36
|
+
).toISOString();
|
|
37
|
+
|
|
38
|
+
const item: FeedItem = {
|
|
39
|
+
id: `connect-nudge:${service}`,
|
|
40
|
+
type: "nudge",
|
|
41
|
+
priority: 70,
|
|
42
|
+
title: "Gmail connected — want ongoing help?",
|
|
43
|
+
summary:
|
|
44
|
+
"I can triage your inbox, summarize new emails, or draft replies to important threads.",
|
|
45
|
+
source: "gmail",
|
|
46
|
+
timestamp: now.toISOString(),
|
|
47
|
+
status: "new",
|
|
48
|
+
expiresAt,
|
|
49
|
+
author: "platform",
|
|
50
|
+
createdAt: now.toISOString(),
|
|
51
|
+
actions: [
|
|
52
|
+
{
|
|
53
|
+
id: "inbox-triage",
|
|
54
|
+
label: "Triage my inbox",
|
|
55
|
+
prompt:
|
|
56
|
+
"Help me triage my inbox — summarize what's unread and flag anything that needs a reply",
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: "daily-digest",
|
|
60
|
+
label: "Set up daily digest",
|
|
61
|
+
prompt:
|
|
62
|
+
"Set up a daily email digest that summarizes my unread messages each morning",
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
await appendFeedItem(item);
|
|
68
|
+
}
|
|
@@ -18,13 +18,7 @@
|
|
|
18
18
|
* a missing or unreadable file degrades gracefully to an empty string.
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
import {
|
|
22
|
-
existsSync,
|
|
23
|
-
mkdirSync,
|
|
24
|
-
readFileSync,
|
|
25
|
-
statSync,
|
|
26
|
-
writeFileSync,
|
|
27
|
-
} from "node:fs";
|
|
21
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
28
22
|
import { join } from "node:path";
|
|
29
23
|
|
|
30
24
|
import { countConversations as countConversationsDb } from "../memory/conversation-queries.js";
|
|
@@ -32,7 +26,6 @@ import { listConnections } from "../oauth/oauth-store.js";
|
|
|
32
26
|
import { resolveGuardianPersonaPath } from "../prompts/persona-resolver.js";
|
|
33
27
|
import { buildAssistantEvent } from "../runtime/assistant-event.js";
|
|
34
28
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
35
|
-
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
|
|
36
29
|
import type { OnboardingContext } from "../types/onboarding-context.js";
|
|
37
30
|
import { getLogger } from "../util/logger.js";
|
|
38
31
|
import {
|
|
@@ -40,6 +33,7 @@ import {
|
|
|
40
33
|
getWorkspaceDir,
|
|
41
34
|
getWorkspacePromptPath,
|
|
42
35
|
} from "../util/platform.js";
|
|
36
|
+
import { resolveAndPersistHatchedAt } from "../workspace/hatched-date.js";
|
|
43
37
|
import { computeProgressPercent, computeTier } from "./progress-formula.js";
|
|
44
38
|
import {
|
|
45
39
|
type Capability,
|
|
@@ -150,11 +144,12 @@ function readOnboardingSidecar(): OnboardingContext | null {
|
|
|
150
144
|
* Reads USER.md / SOUL.md / IDENTITY.md, queries the oauth connection
|
|
151
145
|
* store, and counts conversations via the DB-authoritative helper.
|
|
152
146
|
*
|
|
153
|
-
* Side effect: on the very first call
|
|
154
|
-
*
|
|
155
|
-
* `data/hatched.json`
|
|
156
|
-
* timestamp. All other paths are read-only. Callers
|
|
157
|
-
* persist the full snapshot should use
|
|
147
|
+
* Side effect: on the very first call without an explicit Hatched
|
|
148
|
+
* bullet or existing hatched sidecar, the shared resolver persists a
|
|
149
|
+
* one-time `data/hatched.json` value seeded from IDENTITY.md metadata
|
|
150
|
+
* or a real current timestamp. All other paths are read-only. Callers
|
|
151
|
+
* that want to persist the full snapshot should use
|
|
152
|
+
* `writeRelationshipState()`.
|
|
158
153
|
*/
|
|
159
154
|
export async function computeRelationshipState(): Promise<RelationshipState> {
|
|
160
155
|
// Persona source-of-truth:
|
|
@@ -318,7 +313,7 @@ export async function writeRelationshipState(): Promise<void> {
|
|
|
318
313
|
function publishRelationshipStateUpdated(updatedAt: string): void {
|
|
319
314
|
assistantEventHub
|
|
320
315
|
.publish(
|
|
321
|
-
buildAssistantEvent(
|
|
316
|
+
buildAssistantEvent({
|
|
322
317
|
type: "relationship_state_updated",
|
|
323
318
|
updatedAt,
|
|
324
319
|
}),
|
|
@@ -423,6 +418,20 @@ function safeRead(path: string): string {
|
|
|
423
418
|
}
|
|
424
419
|
}
|
|
425
420
|
|
|
421
|
+
/**
|
|
422
|
+
* Map personality-group tone IDs (from onboarding) to human-readable
|
|
423
|
+
* voice descriptions displayed as relationship-state facts.
|
|
424
|
+
* Unrecognized values (e.g. legacy `"balanced"` or free-text tones from
|
|
425
|
+
* older clients) fall through via the `?? tone` fallback in
|
|
426
|
+
* `extractFacts`.
|
|
427
|
+
*/
|
|
428
|
+
const TONE_VOICE_MAP: Record<string, string> = {
|
|
429
|
+
grounded: "Calm and precise",
|
|
430
|
+
warm: "Warm and easy",
|
|
431
|
+
energetic: "Fast and direct",
|
|
432
|
+
poetic: "Quiet and observant",
|
|
433
|
+
};
|
|
434
|
+
|
|
426
435
|
/**
|
|
427
436
|
* Walk the workspace prompt files and emit a flat list of inferred
|
|
428
437
|
* facts. This is deliberately a simple bullet/heading parser — the TDD
|
|
@@ -478,7 +487,7 @@ function extractFacts(input: {
|
|
|
478
487
|
facts.push({
|
|
479
488
|
id: nextId("onboarding"),
|
|
480
489
|
category: "voice",
|
|
481
|
-
text: tone,
|
|
490
|
+
text: TONE_VOICE_MAP[tone] ?? tone,
|
|
482
491
|
confidence: "strong",
|
|
483
492
|
source: "onboarding",
|
|
484
493
|
});
|
|
@@ -669,74 +678,17 @@ function countConversations(): number {
|
|
|
669
678
|
}
|
|
670
679
|
}
|
|
671
680
|
|
|
672
|
-
/**
|
|
673
|
-
* Filename for the hatched-date sidecar, used as a stable fallback
|
|
674
|
-
* when IDENTITY.md is missing / unreadable / has no explicit hatched
|
|
675
|
-
* bullet and file stat is unavailable. Lives under the workspace
|
|
676
|
-
* data dir alongside `relationship-state.json`.
|
|
677
|
-
*/
|
|
678
|
-
const HATCHED_SIDECAR_FILENAME = "hatched.json";
|
|
679
|
-
|
|
680
|
-
function getHatchedSidecarPath(): string {
|
|
681
|
-
return join(getDataDir(), HATCHED_SIDECAR_FILENAME);
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
/**
|
|
685
|
-
* Resolve a stable hatched-date fallback timestamp.
|
|
686
|
-
*
|
|
687
|
-
* The Swift client, OpenAPI schema, and UI have no special handling
|
|
688
|
-
* for a Unix-epoch sentinel — they'll render "1/1/1970" to the user.
|
|
689
|
-
* Instead, we use `new Date().toISOString()` the first time a
|
|
690
|
-
* fallback is needed and persist it to a small sidecar file
|
|
691
|
-
* (`data/hatched.json`). Subsequent calls read the sidecar first, so
|
|
692
|
-
* the returned timestamp is monotonic across writes and the
|
|
693
|
-
* `hatchedDate` field never drifts once initialized.
|
|
694
|
-
*
|
|
695
|
-
* Never throws — a sidecar read/write failure still yields a valid
|
|
696
|
-
* (though non-stable) `now` timestamp, which is still far better than
|
|
697
|
-
* the epoch sentinel.
|
|
698
|
-
*/
|
|
699
|
-
function resolveFallbackHatchedDate(): string {
|
|
700
|
-
const path = getHatchedSidecarPath();
|
|
701
|
-
try {
|
|
702
|
-
if (existsSync(path)) {
|
|
703
|
-
const parsed = JSON.parse(readFileSync(path, "utf-8")) as {
|
|
704
|
-
hatchedAt?: string;
|
|
705
|
-
};
|
|
706
|
-
if (parsed.hatchedAt && !isNaN(Date.parse(parsed.hatchedAt))) {
|
|
707
|
-
return parsed.hatchedAt;
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
} catch {
|
|
711
|
-
// Fall through to write a fresh sidecar.
|
|
712
|
-
}
|
|
713
|
-
const now = new Date().toISOString();
|
|
714
|
-
try {
|
|
715
|
-
mkdirSync(getDataDir(), { recursive: true });
|
|
716
|
-
writeFileSync(path, JSON.stringify({ hatchedAt: now }, null, 2), "utf-8");
|
|
717
|
-
} catch {
|
|
718
|
-
// If even the sidecar write fails, return `now` anyway — the
|
|
719
|
-
// caller will just get a fresh-looking date on every call. Not
|
|
720
|
-
// ideal, but far better than the epoch sentinel.
|
|
721
|
-
}
|
|
722
|
-
return now;
|
|
723
|
-
}
|
|
724
|
-
|
|
725
681
|
/**
|
|
726
682
|
* Pull `assistantName` and `hatchedDate` from IDENTITY.md.
|
|
727
683
|
*
|
|
728
684
|
* IDENTITY.md is a freeform markdown file, so for the name we scan
|
|
729
685
|
* bullet lines for any recognizable `name` label (`Name`,
|
|
730
686
|
* `Assistant Name`, `Preferred Name`, etc.). For the hatched date we
|
|
731
|
-
* prefer any explicit `hatched:` / `birth:` bullet, then
|
|
732
|
-
*
|
|
733
|
-
*
|
|
734
|
-
*
|
|
735
|
-
*
|
|
736
|
-
* boundary, so a raw `Date.now()` fallback would cause `hatchedDate`
|
|
737
|
-
* to drift forward on every write. Instead, when nothing else is
|
|
738
|
-
* readable we resolve via `resolveFallbackHatchedDate()` which
|
|
739
|
-
* persists a stable timestamp to a sidecar file on first use.
|
|
687
|
+
* prefer any explicit `hatched:` / `birth:` bullet, then use the
|
|
688
|
+
* shared hatched-date resolver. That resolver reads an existing
|
|
689
|
+
* `data/hatched.json` sidecar first, otherwise seeds it from valid
|
|
690
|
+
* IDENTITY.md birthtime/mtime or a real current timestamp. This keeps
|
|
691
|
+
* `hatchedDate` stable without writing from read-only HTTP handlers.
|
|
740
692
|
*/
|
|
741
693
|
function parseIdentity(identityPath: string): {
|
|
742
694
|
assistantName: string;
|
|
@@ -779,24 +731,10 @@ function parseIdentity(identityPath: string): {
|
|
|
779
731
|
return { assistantName, hatchedDate: explicitHatched };
|
|
780
732
|
}
|
|
781
733
|
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
const stats = statSync(identityPath);
|
|
787
|
-
const candidate =
|
|
788
|
-
stats.birthtime.getTime() > 0 ? stats.birthtime : stats.mtime;
|
|
789
|
-
if (candidate.getTime() > 0) {
|
|
790
|
-
return { assistantName, hatchedDate: candidate.toISOString() };
|
|
791
|
-
}
|
|
792
|
-
} catch {
|
|
793
|
-
// File missing or unreadable — fall through to the sidecar.
|
|
794
|
-
}
|
|
795
|
-
|
|
796
|
-
// Last-ditch fallback: `resolveFallbackHatchedDate` returns a stable,
|
|
797
|
-
// real timestamp (persisted to `data/hatched.json` on first call) so
|
|
798
|
-
// the wire contract always carries a valid ISO date.
|
|
799
|
-
return { assistantName, hatchedDate: resolveFallbackHatchedDate() };
|
|
734
|
+
return {
|
|
735
|
+
assistantName,
|
|
736
|
+
hatchedDate: resolveAndPersistHatchedAt(identityPath),
|
|
737
|
+
};
|
|
800
738
|
}
|
|
801
739
|
|
|
802
740
|
/**
|
|
@@ -21,14 +21,34 @@ const log = getLogger("suggested-prompts");
|
|
|
21
21
|
* listed here produce deterministic "Connect X" prompts when disconnected.
|
|
22
22
|
* The icon values are VIcon case names rendered by the macOS client.
|
|
23
23
|
*/
|
|
24
|
+
interface PromptEntry {
|
|
25
|
+
label: string;
|
|
26
|
+
prompt: string;
|
|
27
|
+
icon: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
24
30
|
const CONNECT_PROMPT_META: Record<
|
|
25
31
|
string,
|
|
26
|
-
|
|
32
|
+
PromptEntry & { connectedPrompts?: PromptEntry[] }
|
|
27
33
|
> = {
|
|
28
34
|
google: {
|
|
29
35
|
label: "Connect Gmail",
|
|
30
36
|
prompt: "Help me connect my Gmail account",
|
|
31
37
|
icon: "mail",
|
|
38
|
+
connectedPrompts: [
|
|
39
|
+
{
|
|
40
|
+
label: "Triage my inbox",
|
|
41
|
+
prompt:
|
|
42
|
+
"Help me triage my inbox — summarize what's unread and flag anything that needs a reply",
|
|
43
|
+
icon: "mail",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
label: "Summarize today's emails",
|
|
47
|
+
prompt:
|
|
48
|
+
"Summarize the emails I received today and highlight anything important",
|
|
49
|
+
icon: "mail",
|
|
50
|
+
},
|
|
51
|
+
],
|
|
32
52
|
},
|
|
33
53
|
slack: {
|
|
34
54
|
label: "Connect Slack",
|
|
@@ -75,7 +95,9 @@ export async function getSuggestedPrompts(): Promise<SuggestedPrompt[]> {
|
|
|
75
95
|
|
|
76
96
|
/**
|
|
77
97
|
* Check which well-known OAuth providers are not connected and return
|
|
78
|
-
* a "Connect X" prompt for each.
|
|
98
|
+
* a "Connect X" prompt for each. For connected providers that have
|
|
99
|
+
* `connectedPrompts`, return those instead so users discover ongoing
|
|
100
|
+
* management capabilities.
|
|
79
101
|
*/
|
|
80
102
|
async function getDeterministicPrompts(): Promise<SuggestedPrompt[]> {
|
|
81
103
|
const providers = listProviders();
|
|
@@ -86,15 +108,29 @@ async function getDeterministicPrompts(): Promise<SuggestedPrompt[]> {
|
|
|
86
108
|
if (!meta) continue;
|
|
87
109
|
|
|
88
110
|
const connected = await isProviderConnected(provider.provider);
|
|
89
|
-
if (connected) continue;
|
|
90
111
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
112
|
+
if (!connected) {
|
|
113
|
+
prompts.push({
|
|
114
|
+
id: `connect-${provider.provider}`,
|
|
115
|
+
label: meta.label,
|
|
116
|
+
icon: meta.icon,
|
|
117
|
+
prompt: meta.prompt,
|
|
118
|
+
source: "deterministic",
|
|
119
|
+
});
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (meta.connectedPrompts) {
|
|
124
|
+
for (const cp of meta.connectedPrompts) {
|
|
125
|
+
prompts.push({
|
|
126
|
+
id: `manage-${provider.provider}-${cp.label.toLowerCase().replace(/\s+/g, "-")}`,
|
|
127
|
+
label: cp.label,
|
|
128
|
+
icon: cp.icon,
|
|
129
|
+
prompt: cp.prompt,
|
|
130
|
+
source: "deterministic",
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
98
134
|
}
|
|
99
135
|
|
|
100
136
|
return prompts;
|
|
@@ -27,17 +27,30 @@
|
|
|
27
27
|
* All public-facing ingress URL construction is centralized here.
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
+
import {
|
|
31
|
+
buildTwilioConnectActionUrl,
|
|
32
|
+
buildTwilioMediaStreamUrl,
|
|
33
|
+
buildTwilioRelayUrl,
|
|
34
|
+
buildTwilioStatusWebhookUrl,
|
|
35
|
+
buildTwilioVoiceWebhookUrl,
|
|
36
|
+
normalizePublicBaseUrl,
|
|
37
|
+
} from "@vellumai/service-contracts/twilio-ingress";
|
|
38
|
+
|
|
30
39
|
import { getIngressPublicBaseUrl } from "../config/env.js";
|
|
31
40
|
|
|
32
41
|
export interface IngressConfig {
|
|
33
|
-
ingress?: {
|
|
42
|
+
ingress?: {
|
|
43
|
+
enabled?: boolean;
|
|
44
|
+
publicBaseUrl?: string;
|
|
45
|
+
};
|
|
34
46
|
}
|
|
35
47
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
48
|
+
function assertPublicIngressEnabled(config: IngressConfig): void {
|
|
49
|
+
if (config.ingress?.enabled === false) {
|
|
50
|
+
throw new Error(
|
|
51
|
+
"Public ingress is disabled. Ask the assistant to enable it, or update it from the Settings page.",
|
|
52
|
+
);
|
|
53
|
+
}
|
|
41
54
|
}
|
|
42
55
|
|
|
43
56
|
/**
|
|
@@ -51,23 +64,15 @@ function normalizeUrl(url: string): string {
|
|
|
51
64
|
* Throws if no source provides a non-empty value or if ingress is disabled.
|
|
52
65
|
*/
|
|
53
66
|
export function getPublicBaseUrl(config: IngressConfig): string {
|
|
54
|
-
|
|
55
|
-
throw new Error(
|
|
56
|
-
"Public ingress is disabled. Ask the assistant to enable it, or update it from the Settings page.",
|
|
57
|
-
);
|
|
58
|
-
}
|
|
67
|
+
assertPublicIngressEnabled(config);
|
|
59
68
|
|
|
60
69
|
const ingressValue = config.ingress?.publicBaseUrl;
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (normalized) return normalized;
|
|
64
|
-
}
|
|
70
|
+
const normalizedIngressValue = normalizePublicBaseUrl(ingressValue);
|
|
71
|
+
if (normalizedIngressValue) return normalizedIngressValue;
|
|
65
72
|
|
|
66
73
|
const ingressEnvValue = getIngressPublicBaseUrl();
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (normalized) return normalized;
|
|
70
|
-
}
|
|
74
|
+
const normalizedIngressEnvValue = normalizePublicBaseUrl(ingressEnvValue);
|
|
75
|
+
if (normalizedIngressEnvValue) return normalizedIngressEnvValue;
|
|
71
76
|
|
|
72
77
|
throw new Error(
|
|
73
78
|
"No public base URL configured. Set ingress.publicBaseUrl in config.",
|
|
@@ -87,27 +92,24 @@ export function getTwilioVoiceWebhookUrl(
|
|
|
87
92
|
config: IngressConfig,
|
|
88
93
|
callSessionId?: string,
|
|
89
94
|
): string {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
return `${base}/webhooks/twilio/voice`;
|
|
95
|
+
return buildTwilioVoiceWebhookUrl(
|
|
96
|
+
getPublicBaseUrl(config),
|
|
97
|
+
callSessionId,
|
|
98
|
+
);
|
|
95
99
|
}
|
|
96
100
|
|
|
97
101
|
/**
|
|
98
102
|
* Build the Twilio status callback URL.
|
|
99
103
|
*/
|
|
100
104
|
export function getTwilioStatusCallbackUrl(config: IngressConfig): string {
|
|
101
|
-
|
|
102
|
-
return `${base}/webhooks/twilio/status`;
|
|
105
|
+
return buildTwilioStatusWebhookUrl(getPublicBaseUrl(config));
|
|
103
106
|
}
|
|
104
107
|
|
|
105
108
|
/**
|
|
106
109
|
* Build the Twilio connect-action callback URL.
|
|
107
110
|
*/
|
|
108
111
|
export function getTwilioConnectActionUrl(config: IngressConfig): string {
|
|
109
|
-
|
|
110
|
-
return `${base}/webhooks/twilio/connect-action`;
|
|
112
|
+
return buildTwilioConnectActionUrl(getPublicBaseUrl(config));
|
|
111
113
|
}
|
|
112
114
|
|
|
113
115
|
/**
|
|
@@ -115,9 +117,7 @@ export function getTwilioConnectActionUrl(config: IngressConfig): string {
|
|
|
115
117
|
* Converts http:// → ws:// and https:// → wss://.
|
|
116
118
|
*/
|
|
117
119
|
export function getTwilioRelayUrl(config: IngressConfig): string {
|
|
118
|
-
|
|
119
|
-
const wsBase = base.replace(/^http(s?)/, "ws$1");
|
|
120
|
-
return `${wsBase}/webhooks/twilio/relay`;
|
|
120
|
+
return buildTwilioRelayUrl(getPublicBaseUrl(config));
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
/**
|
|
@@ -127,9 +127,7 @@ export function getTwilioRelayUrl(config: IngressConfig): string {
|
|
|
127
127
|
* Converts http:// → ws:// and https:// → wss://.
|
|
128
128
|
*/
|
|
129
129
|
export function getTwilioMediaStreamUrl(config: IngressConfig): string {
|
|
130
|
-
|
|
131
|
-
const wsBase = base.replace(/^http(s?)/, "ws$1");
|
|
132
|
-
return `${wsBase}/webhooks/twilio/media-stream`;
|
|
130
|
+
return buildTwilioMediaStreamUrl(getPublicBaseUrl(config));
|
|
133
131
|
}
|
|
134
132
|
|
|
135
133
|
/**
|