@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
|
@@ -18,11 +18,8 @@ import {
|
|
|
18
18
|
createUserMessage,
|
|
19
19
|
} from "../../agent/message-types.js";
|
|
20
20
|
import {
|
|
21
|
-
canServiceRegistryBrowser,
|
|
22
|
-
canServiceSseBrowser,
|
|
23
21
|
CHANNEL_IDS,
|
|
24
22
|
INTERFACE_IDS,
|
|
25
|
-
type InterfaceId,
|
|
26
23
|
isInteractiveInterface,
|
|
27
24
|
parseChannelId,
|
|
28
25
|
parseInterfaceId,
|
|
@@ -38,8 +35,8 @@ import {
|
|
|
38
35
|
isModelSlashCommand,
|
|
39
36
|
} from "../../daemon/conversation-process.js";
|
|
40
37
|
import {
|
|
38
|
+
buildSlashContextForContent,
|
|
41
39
|
resolveSlash,
|
|
42
|
-
type SlashContext,
|
|
43
40
|
} from "../../daemon/conversation-slash.js";
|
|
44
41
|
import { getOrCreateConversation as getOrCreateConversationInstance } from "../../daemon/conversation-store.js";
|
|
45
42
|
import {
|
|
@@ -47,23 +44,19 @@ import {
|
|
|
47
44
|
isWakeUpGreeting,
|
|
48
45
|
} from "../../daemon/first-greeting.js";
|
|
49
46
|
import { renderHistoryContent } from "../../daemon/handlers/shared.js";
|
|
50
|
-
import {
|
|
51
|
-
import { HostBrowserProxy } from "../../daemon/host-browser-proxy.js";
|
|
47
|
+
import { HostAppControlProxy } from "../../daemon/host-app-control-proxy.js";
|
|
52
48
|
import { HostCuProxy } from "../../daemon/host-cu-proxy.js";
|
|
53
|
-
import {
|
|
54
|
-
import { HostTransferProxy } from "../../daemon/host-transfer-proxy.js";
|
|
49
|
+
import { preactivateHostProxySkills } from "../../daemon/host-proxy-preactivation.js";
|
|
55
50
|
import type { ServerMessage } from "../../daemon/message-protocol.js";
|
|
56
51
|
import type {
|
|
57
52
|
HostProxyTransportMetadata,
|
|
58
53
|
NonHostProxyTransportMetadata,
|
|
59
54
|
} from "../../daemon/message-types/conversations.js";
|
|
60
55
|
import { HeartbeatService } from "../../heartbeat/heartbeat-service.js";
|
|
61
|
-
import { emitFeedEvent } from "../../home/emit-feed-event.js";
|
|
62
56
|
import {
|
|
63
57
|
writeOnboardingSidecar,
|
|
64
58
|
writeRelationshipState,
|
|
65
59
|
} from "../../home/relationship-state-writer.js";
|
|
66
|
-
import { rewriteCommandPreview } from "../../home/rewrite-command-preview.js";
|
|
67
60
|
import { ipcCall } from "../../ipc/gateway-client.js";
|
|
68
61
|
import {
|
|
69
62
|
getAttachmentById,
|
|
@@ -72,8 +65,6 @@ import {
|
|
|
72
65
|
getSourcePathsForAttachments,
|
|
73
66
|
} from "../../memory/attachments-store.js";
|
|
74
67
|
import {
|
|
75
|
-
createCanonicalGuardianRequest,
|
|
76
|
-
generateCanonicalRequestCode,
|
|
77
68
|
listCanonicalGuardianRequests,
|
|
78
69
|
listPendingRequestsByConversationScope,
|
|
79
70
|
resolveCanonicalGuardianRequest,
|
|
@@ -98,8 +89,6 @@ import { searchConversations } from "../../memory/conversation-queries.js";
|
|
|
98
89
|
import { getConfiguredProvider } from "../../providers/provider-send-message.js";
|
|
99
90
|
import type { Provider } from "../../providers/types.js";
|
|
100
91
|
import { checkIngressForSecrets } from "../../security/secret-ingress.js";
|
|
101
|
-
import { redactSecrets } from "../../security/secret-scanner.js";
|
|
102
|
-
import { summarizeToolInput } from "../../tools/tool-input-summary.js";
|
|
103
92
|
import { getLogger } from "../../util/logger.js";
|
|
104
93
|
import {
|
|
105
94
|
getInterfacesDir,
|
|
@@ -107,11 +96,8 @@ import {
|
|
|
107
96
|
} from "../../util/platform.js";
|
|
108
97
|
import { silentlyWithLog } from "../../util/silently.js";
|
|
109
98
|
import { buildAssistantEvent } from "../assistant-event.js";
|
|
110
|
-
import { assistantEventHub } from "../assistant-event-hub.js";
|
|
99
|
+
import { assistantEventHub, broadcastMessage } from "../assistant-event-hub.js";
|
|
111
100
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
|
|
112
|
-
import { getChromeExtensionRegistry } from "../chrome-extension-registry.js";
|
|
113
|
-
import { getClientRegistry } from "../client-registry.js";
|
|
114
|
-
import { bridgeConfirmationRequestToGuardian } from "../confirmation-request-guardian-bridge.js";
|
|
115
101
|
import { routeGuardianReply } from "../guardian-reply-router.js";
|
|
116
102
|
import { healGuardianBindingDrift } from "../guardian-vellum-migration.js";
|
|
117
103
|
import type {
|
|
@@ -357,18 +343,6 @@ async function tryConsumeCanonicalGuardianReply(params: {
|
|
|
357
343
|
return { consumed: true, messageId };
|
|
358
344
|
}
|
|
359
345
|
|
|
360
|
-
function resolveCanonicalRequestSourceType(
|
|
361
|
-
sourceChannel: string | undefined,
|
|
362
|
-
): "desktop" | "channel" | "voice" {
|
|
363
|
-
if (sourceChannel === "phone") {
|
|
364
|
-
return "voice";
|
|
365
|
-
}
|
|
366
|
-
if (sourceChannel === "vellum") {
|
|
367
|
-
return "desktop";
|
|
368
|
-
}
|
|
369
|
-
return "channel";
|
|
370
|
-
}
|
|
371
|
-
|
|
372
346
|
function getInterfaceFilesWithMtimes(
|
|
373
347
|
interfacesDir: string | null,
|
|
374
348
|
): Array<{ path: string; mtimeMs: number }> {
|
|
@@ -1022,348 +996,6 @@ function mergeConsecutiveAssistantMessages(messages: MessageRow[]): {
|
|
|
1022
996
|
return { messages: result, mergedIdMap };
|
|
1023
997
|
}
|
|
1024
998
|
|
|
1025
|
-
/**
|
|
1026
|
-
* Build an `onEvent` callback that publishes every outbound event to the
|
|
1027
|
-
* assistant event hub, maintaining ordered delivery through a serial chain.
|
|
1028
|
-
*
|
|
1029
|
-
* Also registers pending interactions when confirmation_request,
|
|
1030
|
-
* secret_request, host_bash_request, host_browser_request, host_file_request,
|
|
1031
|
-
* or host_cu_request events flow through, so standalone approval/result
|
|
1032
|
-
* endpoints can look up the conversation by requestId.
|
|
1033
|
-
*/
|
|
1034
|
-
function makeHubPublisher(
|
|
1035
|
-
deps: SendMessageDeps,
|
|
1036
|
-
conversationId: string,
|
|
1037
|
-
conversation: Conversation,
|
|
1038
|
-
): (msg: ServerMessage) => void {
|
|
1039
|
-
let hubChain: Promise<void> = Promise.resolve();
|
|
1040
|
-
return (msg: ServerMessage) => {
|
|
1041
|
-
// Register pending interactions for approval events
|
|
1042
|
-
if (msg.type === "confirmation_request") {
|
|
1043
|
-
pendingInteractions.register(msg.requestId, {
|
|
1044
|
-
conversation,
|
|
1045
|
-
conversationId,
|
|
1046
|
-
kind: "confirmation",
|
|
1047
|
-
confirmationDetails: {
|
|
1048
|
-
toolName: msg.toolName,
|
|
1049
|
-
input: msg.input,
|
|
1050
|
-
riskLevel: msg.riskLevel,
|
|
1051
|
-
executionTarget: msg.executionTarget,
|
|
1052
|
-
allowlistOptions: msg.allowlistOptions,
|
|
1053
|
-
scopeOptions: msg.scopeOptions,
|
|
1054
|
-
persistentDecisionsAllowed: msg.persistentDecisionsAllowed,
|
|
1055
|
-
},
|
|
1056
|
-
});
|
|
1057
|
-
|
|
1058
|
-
const inputRecord = msg.input as Record<string, unknown>;
|
|
1059
|
-
const commandPreview =
|
|
1060
|
-
redactSecrets(summarizeToolInput(msg.toolName, inputRecord)) ||
|
|
1061
|
-
undefined;
|
|
1062
|
-
const technicalTitle = commandPreview
|
|
1063
|
-
? `Requesting permission: ${commandPreview}`
|
|
1064
|
-
: `Requesting approval to use ${msg.toolName}.`;
|
|
1065
|
-
const dedupKey = `tool-approval:${msg.requestId}`;
|
|
1066
|
-
|
|
1067
|
-
// Emit immediately with the technical preview.
|
|
1068
|
-
void emitFeedEvent({
|
|
1069
|
-
source: "assistant",
|
|
1070
|
-
title: technicalTitle,
|
|
1071
|
-
summary: technicalTitle,
|
|
1072
|
-
dedupKey,
|
|
1073
|
-
urgency: msg.riskLevel === "high" ? "high" : "medium",
|
|
1074
|
-
conversationId,
|
|
1075
|
-
detailPanel: { kind: "toolPermission" },
|
|
1076
|
-
}).catch((err) => {
|
|
1077
|
-
log.warn(
|
|
1078
|
-
{ err, requestId: msg.requestId },
|
|
1079
|
-
"Failed to emit tool approval request feed event",
|
|
1080
|
-
);
|
|
1081
|
-
});
|
|
1082
|
-
|
|
1083
|
-
// Background: rewrite into prose and update the feed item.
|
|
1084
|
-
if (commandPreview) {
|
|
1085
|
-
void rewriteCommandPreview(msg.toolName, commandPreview)
|
|
1086
|
-
.then((prose) => {
|
|
1087
|
-
if (prose) {
|
|
1088
|
-
const proseTitle = `Requesting permission: ${prose}`;
|
|
1089
|
-
return emitFeedEvent({
|
|
1090
|
-
source: "assistant",
|
|
1091
|
-
title: proseTitle,
|
|
1092
|
-
summary: proseTitle,
|
|
1093
|
-
dedupKey,
|
|
1094
|
-
urgency: msg.riskLevel === "high" ? "high" : "medium",
|
|
1095
|
-
conversationId,
|
|
1096
|
-
detailPanel: { kind: "toolPermission" },
|
|
1097
|
-
});
|
|
1098
|
-
}
|
|
1099
|
-
})
|
|
1100
|
-
.catch((err) => {
|
|
1101
|
-
log.warn(
|
|
1102
|
-
{ err, requestId: msg.requestId },
|
|
1103
|
-
"Failed to update feed event with prose rewrite",
|
|
1104
|
-
);
|
|
1105
|
-
});
|
|
1106
|
-
}
|
|
1107
|
-
|
|
1108
|
-
// Create a canonical guardian request so HTTP handlers can find it
|
|
1109
|
-
// via applyCanonicalGuardianDecision.
|
|
1110
|
-
try {
|
|
1111
|
-
const trustContext = conversation.trustContext;
|
|
1112
|
-
const sourceChannel = trustContext?.sourceChannel ?? "vellum";
|
|
1113
|
-
const inputRecord = msg.input as Record<string, unknown>;
|
|
1114
|
-
const activityRaw =
|
|
1115
|
-
(typeof inputRecord.activity === "string"
|
|
1116
|
-
? inputRecord.activity
|
|
1117
|
-
: undefined) ??
|
|
1118
|
-
(typeof inputRecord.reason === "string"
|
|
1119
|
-
? inputRecord.reason
|
|
1120
|
-
: undefined);
|
|
1121
|
-
const canonicalRequest = createCanonicalGuardianRequest({
|
|
1122
|
-
id: msg.requestId,
|
|
1123
|
-
kind: "tool_approval",
|
|
1124
|
-
sourceType: resolveCanonicalRequestSourceType(sourceChannel),
|
|
1125
|
-
sourceChannel,
|
|
1126
|
-
conversationId,
|
|
1127
|
-
requesterExternalUserId: trustContext?.requesterExternalUserId,
|
|
1128
|
-
requesterChatId: trustContext?.requesterChatId,
|
|
1129
|
-
guardianExternalUserId: trustContext?.guardianExternalUserId,
|
|
1130
|
-
guardianPrincipalId: trustContext?.guardianPrincipalId ?? undefined,
|
|
1131
|
-
toolName: msg.toolName,
|
|
1132
|
-
commandPreview:
|
|
1133
|
-
redactSecrets(summarizeToolInput(msg.toolName, inputRecord)) ||
|
|
1134
|
-
undefined,
|
|
1135
|
-
riskLevel: msg.riskLevel,
|
|
1136
|
-
activityText: activityRaw ? redactSecrets(activityRaw) : undefined,
|
|
1137
|
-
executionTarget: msg.executionTarget,
|
|
1138
|
-
status: "pending",
|
|
1139
|
-
requestCode: generateCanonicalRequestCode(),
|
|
1140
|
-
expiresAt: Date.now() + 5 * 60 * 1000,
|
|
1141
|
-
});
|
|
1142
|
-
|
|
1143
|
-
// For trusted-contact conversations, bridge to guardian.question so the
|
|
1144
|
-
// guardian gets notified and can approve via callback/request-code.
|
|
1145
|
-
if (trustContext) {
|
|
1146
|
-
bridgeConfirmationRequestToGuardian({
|
|
1147
|
-
canonicalRequest,
|
|
1148
|
-
trustContext,
|
|
1149
|
-
conversationId,
|
|
1150
|
-
toolName: msg.toolName,
|
|
1151
|
-
assistantId:
|
|
1152
|
-
conversation.assistantId ?? DAEMON_INTERNAL_ASSISTANT_ID,
|
|
1153
|
-
});
|
|
1154
|
-
}
|
|
1155
|
-
} catch (err) {
|
|
1156
|
-
log.debug(
|
|
1157
|
-
{ err, requestId: msg.requestId, conversationId },
|
|
1158
|
-
"Failed to create canonical request from hub publisher",
|
|
1159
|
-
);
|
|
1160
|
-
}
|
|
1161
|
-
} else if (msg.type === "secret_request") {
|
|
1162
|
-
pendingInteractions.register(msg.requestId, {
|
|
1163
|
-
conversation,
|
|
1164
|
-
conversationId,
|
|
1165
|
-
kind: "secret",
|
|
1166
|
-
});
|
|
1167
|
-
} else {
|
|
1168
|
-
registerHostProxyPendingInteraction(msg, conversation, conversationId);
|
|
1169
|
-
}
|
|
1170
|
-
|
|
1171
|
-
// ServerMessage is a large union; conversationId exists on most but not all variants.
|
|
1172
|
-
const msgConversationId =
|
|
1173
|
-
"conversationId" in msg &&
|
|
1174
|
-
typeof (msg as { conversationId?: unknown }).conversationId === "string"
|
|
1175
|
-
? (msg as { conversationId: string }).conversationId
|
|
1176
|
-
: undefined;
|
|
1177
|
-
// `conversation_list_invalidated` is a list-level system event: it
|
|
1178
|
-
// describes no particular conversation and every connected client
|
|
1179
|
-
// should refresh its sidebar. Publish it unscoped so the SSE hub does
|
|
1180
|
-
// not filter it out by the subscriber's `filter.conversationId`.
|
|
1181
|
-
// Other events (including `conversation_title_updated`) stay scoped to
|
|
1182
|
-
// their conversation — unscoped scoped-events would leak foreign
|
|
1183
|
-
// `conversationId` values to native clients' speculative ID-resolution
|
|
1184
|
-
// path. For `conversation_title_updated` we instead enqueue a matching
|
|
1185
|
-
// unscoped `conversation_list_invalidated` below so other clients'
|
|
1186
|
-
// sidebars can refresh and pick up the new title.
|
|
1187
|
-
const resolvedConversationId =
|
|
1188
|
-
msg.type === "conversation_list_invalidated"
|
|
1189
|
-
? undefined
|
|
1190
|
-
: (msgConversationId ?? conversationId);
|
|
1191
|
-
const event = buildAssistantEvent(
|
|
1192
|
-
DAEMON_INTERNAL_ASSISTANT_ID,
|
|
1193
|
-
msg,
|
|
1194
|
-
resolvedConversationId,
|
|
1195
|
-
);
|
|
1196
|
-
hubChain = (async () => {
|
|
1197
|
-
await hubChain;
|
|
1198
|
-
try {
|
|
1199
|
-
await deps.assistantEventHub.publish(event);
|
|
1200
|
-
} catch (err) {
|
|
1201
|
-
log.warn(
|
|
1202
|
-
{ err },
|
|
1203
|
-
"assistant-events hub subscriber threw during POST /messages",
|
|
1204
|
-
);
|
|
1205
|
-
}
|
|
1206
|
-
|
|
1207
|
-
// When the agent loop auto-generates a conversation title, also
|
|
1208
|
-
// broadcast an unscoped `conversation_list_invalidated` so every
|
|
1209
|
-
// connected client's sidebar can refresh and pick up the new title.
|
|
1210
|
-
// Without this, clients viewing other conversations (or a draft)
|
|
1211
|
-
// would never learn that the title for this conversation changed.
|
|
1212
|
-
// The scoped `conversation_title_updated` above still handles the
|
|
1213
|
-
// in-place update for the client currently viewing this conversation.
|
|
1214
|
-
if (msg.type === "conversation_title_updated") {
|
|
1215
|
-
try {
|
|
1216
|
-
await deps.assistantEventHub.publish(
|
|
1217
|
-
buildAssistantEvent(DAEMON_INTERNAL_ASSISTANT_ID, {
|
|
1218
|
-
type: "conversation_list_invalidated",
|
|
1219
|
-
reason: "renamed",
|
|
1220
|
-
}),
|
|
1221
|
-
);
|
|
1222
|
-
} catch (err) {
|
|
1223
|
-
log.warn(
|
|
1224
|
-
{ err },
|
|
1225
|
-
"Failed to publish conversation_list_invalidated after title update",
|
|
1226
|
-
);
|
|
1227
|
-
}
|
|
1228
|
-
}
|
|
1229
|
-
})();
|
|
1230
|
-
};
|
|
1231
|
-
}
|
|
1232
|
-
|
|
1233
|
-
/**
|
|
1234
|
-
* Register pending interactions for host proxy request envelopes so
|
|
1235
|
-
* standalone result endpoints can resolve by requestId.
|
|
1236
|
-
*
|
|
1237
|
-
* Returns the registered requestId when a host proxy request was registered.
|
|
1238
|
-
* Callers that route through non-hub transports (e.g. registry-routed
|
|
1239
|
-
* host_browser sends) can use this to clean up the registration if send fails.
|
|
1240
|
-
*/
|
|
1241
|
-
function registerHostProxyPendingInteraction(
|
|
1242
|
-
msg: ServerMessage,
|
|
1243
|
-
conversation: Conversation,
|
|
1244
|
-
conversationId: string,
|
|
1245
|
-
): string | undefined {
|
|
1246
|
-
if (msg.type === "host_bash_request") {
|
|
1247
|
-
pendingInteractions.register(msg.requestId, {
|
|
1248
|
-
conversation,
|
|
1249
|
-
conversationId,
|
|
1250
|
-
kind: "host_bash",
|
|
1251
|
-
});
|
|
1252
|
-
return msg.requestId;
|
|
1253
|
-
}
|
|
1254
|
-
if (msg.type === "host_browser_request") {
|
|
1255
|
-
pendingInteractions.register(msg.requestId, {
|
|
1256
|
-
conversation,
|
|
1257
|
-
conversationId,
|
|
1258
|
-
kind: "host_browser",
|
|
1259
|
-
});
|
|
1260
|
-
return msg.requestId;
|
|
1261
|
-
}
|
|
1262
|
-
if (msg.type === "host_file_request") {
|
|
1263
|
-
pendingInteractions.register(msg.requestId, {
|
|
1264
|
-
conversation,
|
|
1265
|
-
conversationId,
|
|
1266
|
-
kind: "host_file",
|
|
1267
|
-
});
|
|
1268
|
-
return msg.requestId;
|
|
1269
|
-
}
|
|
1270
|
-
if (msg.type === "host_cu_request") {
|
|
1271
|
-
pendingInteractions.register(msg.requestId, {
|
|
1272
|
-
conversation,
|
|
1273
|
-
conversationId,
|
|
1274
|
-
kind: "host_cu",
|
|
1275
|
-
});
|
|
1276
|
-
return msg.requestId;
|
|
1277
|
-
}
|
|
1278
|
-
if (msg.type === "host_transfer_request") {
|
|
1279
|
-
pendingInteractions.register(msg.requestId, {
|
|
1280
|
-
conversation,
|
|
1281
|
-
conversationId,
|
|
1282
|
-
kind: "host_transfer",
|
|
1283
|
-
});
|
|
1284
|
-
return msg.requestId;
|
|
1285
|
-
}
|
|
1286
|
-
return undefined;
|
|
1287
|
-
}
|
|
1288
|
-
|
|
1289
|
-
/**
|
|
1290
|
-
* Resolve the host_browser sender function for a conversation turn.
|
|
1291
|
-
*
|
|
1292
|
-
* Transport selection:
|
|
1293
|
-
* 1. **WebSocket registry** — when the guardian has an active entry in
|
|
1294
|
-
* ChromeExtensionRegistry (self-hosted direct WS connection), the
|
|
1295
|
-
* registry-routed sender is returned. Frames go directly over the
|
|
1296
|
-
* WebSocket to the extension.
|
|
1297
|
-
* 2. **SSE event hub** — when no WebSocket connection exists but a
|
|
1298
|
-
* chrome-extension client is connected via SSE (cloud/platform mode),
|
|
1299
|
-
* the SSE hub sender (`onEvent`) is returned. The extension receives
|
|
1300
|
-
* `host_browser_request` frames as SSE events and POSTs results back
|
|
1301
|
-
* to `/v1/host-browser-result`.
|
|
1302
|
-
*
|
|
1303
|
-
* When neither transport is available, `onEvent` is returned as the
|
|
1304
|
-
* default sender (used by macOS for its native host_browser path).
|
|
1305
|
-
* `hasSseExtension` is `false` in that case so the caller can avoid
|
|
1306
|
-
* provisioning a stale `HostBrowserProxy` for interfaces that don't
|
|
1307
|
-
* natively support host_browser.
|
|
1308
|
-
*/
|
|
1309
|
-
function resolveHostBrowserSender(
|
|
1310
|
-
conversation: Conversation,
|
|
1311
|
-
conversationId: string,
|
|
1312
|
-
actorPrincipalId: string | undefined,
|
|
1313
|
-
onEvent: (msg: ServerMessage) => void,
|
|
1314
|
-
sourceInterface: InterfaceId,
|
|
1315
|
-
): {
|
|
1316
|
-
sender: (msg: ServerMessage) => void;
|
|
1317
|
-
isRegistryRouted: boolean;
|
|
1318
|
-
hasSseExtension: boolean;
|
|
1319
|
-
} {
|
|
1320
|
-
const guardianId =
|
|
1321
|
-
conversation.trustContext?.guardianPrincipalId ?? actorPrincipalId;
|
|
1322
|
-
const hasExtensionConnection =
|
|
1323
|
-
!!guardianId && !!getChromeExtensionRegistry().get(guardianId);
|
|
1324
|
-
|
|
1325
|
-
// Priority 1: WebSocket registry — direct WS to the extension.
|
|
1326
|
-
if (hasExtensionConnection) {
|
|
1327
|
-
const registrySender = (msg: ServerMessage): void => {
|
|
1328
|
-
const requestId = registerHostProxyPendingInteraction(
|
|
1329
|
-
msg,
|
|
1330
|
-
conversation,
|
|
1331
|
-
conversationId,
|
|
1332
|
-
);
|
|
1333
|
-
const gid =
|
|
1334
|
-
conversation.trustContext?.guardianPrincipalId ?? actorPrincipalId;
|
|
1335
|
-
if (!gid) {
|
|
1336
|
-
if (requestId) pendingInteractions.resolve(requestId);
|
|
1337
|
-
throw new Error(
|
|
1338
|
-
"host_browser send skipped: no guardianId on AuthContext",
|
|
1339
|
-
);
|
|
1340
|
-
}
|
|
1341
|
-
const ok = getChromeExtensionRegistry().send(gid, msg);
|
|
1342
|
-
if (!ok) {
|
|
1343
|
-
if (requestId) pendingInteractions.resolve(requestId);
|
|
1344
|
-
throw new Error(
|
|
1345
|
-
`host_browser send failed: no active connection for guardian ${gid}`,
|
|
1346
|
-
);
|
|
1347
|
-
}
|
|
1348
|
-
};
|
|
1349
|
-
return {
|
|
1350
|
-
sender: registrySender,
|
|
1351
|
-
isRegistryRouted: true,
|
|
1352
|
-
hasSseExtension: false,
|
|
1353
|
-
};
|
|
1354
|
-
}
|
|
1355
|
-
|
|
1356
|
-
// Priority 2: SSE-connected chrome extension (cloud/platform mode).
|
|
1357
|
-
// Check the ClientRegistry for a chrome-extension client specifically —
|
|
1358
|
-
// getMostRecentByCapability("host_browser") would also match macOS
|
|
1359
|
-
// clients, which handle browser frames through their own native path.
|
|
1360
|
-
const hasSseExtension =
|
|
1361
|
-
canServiceSseBrowser(sourceInterface) &&
|
|
1362
|
-
!!getClientRegistry().getMostRecentByInterface("chrome-extension");
|
|
1363
|
-
|
|
1364
|
-
return { sender: onEvent, isRegistryRouted: false, hasSseExtension };
|
|
1365
|
-
}
|
|
1366
|
-
|
|
1367
999
|
/**
|
|
1368
1000
|
* Persist the pre-chat onboarding payload to disk.
|
|
1369
1001
|
*
|
|
@@ -1647,7 +1279,7 @@ export async function handleSendMessage(
|
|
|
1647
1279
|
if (!hasMessages(mapping.conversationId)) {
|
|
1648
1280
|
smDeps.assistantEventHub
|
|
1649
1281
|
.publish(
|
|
1650
|
-
buildAssistantEvent(
|
|
1282
|
+
buildAssistantEvent({
|
|
1651
1283
|
type: "conversation_list_invalidated",
|
|
1652
1284
|
reason: "created",
|
|
1653
1285
|
}),
|
|
@@ -1690,10 +1322,9 @@ export async function handleSendMessage(
|
|
|
1690
1322
|
|
|
1691
1323
|
// Store pre-chat onboarding context on the conversation when this is the
|
|
1692
1324
|
// very first message (no prior messages loaded). Artifact persistence
|
|
1693
|
-
// (IDENTITY.md, USER.md, sidecar)
|
|
1694
|
-
//
|
|
1695
|
-
// the
|
|
1696
|
-
// path it runs immediately before inference starts.
|
|
1325
|
+
// (IDENTITY.md, USER.md, sidecar) runs before either the canned greeting
|
|
1326
|
+
// broadcast or normal LLM inference so client-side identity reads observe
|
|
1327
|
+
// the selected assistant name.
|
|
1697
1328
|
const isFirstOnboarding =
|
|
1698
1329
|
!!body.onboarding && conversation.messages.length === 0;
|
|
1699
1330
|
if (isFirstOnboarding) {
|
|
@@ -1757,125 +1388,39 @@ export async function handleSendMessage(
|
|
|
1757
1388
|
conversation.setTrustContext({ trustClass: "guardian", sourceChannel });
|
|
1758
1389
|
}
|
|
1759
1390
|
|
|
1760
|
-
const onEvent = makeHubPublisher(
|
|
1761
|
-
smDeps,
|
|
1762
|
-
mapping.conversationId,
|
|
1763
|
-
conversation,
|
|
1764
|
-
);
|
|
1765
1391
|
const isInteractive = isInteractiveInterface(sourceInterface);
|
|
1766
|
-
//
|
|
1767
|
-
//
|
|
1768
|
-
//
|
|
1769
|
-
|
|
1770
|
-
|
|
1771
|
-
|
|
1772
|
-
if (supportsHostProxy(sourceInterface, "host_bash")) {
|
|
1773
|
-
// Reuse the existing proxy if the conversation is actively processing a
|
|
1774
|
-
// host bash request to avoid orphaning in-flight requests.
|
|
1775
|
-
if (!conversation.isProcessing() || !conversation.hostBashProxy) {
|
|
1776
|
-
const proxy = new HostBashProxy(onEvent, (requestId) => {
|
|
1777
|
-
pendingInteractions.resolve(requestId);
|
|
1778
|
-
});
|
|
1779
|
-
conversation.setHostBashProxy(proxy);
|
|
1392
|
+
// Bash/File/Transfer singletons are globally available via isAvailable() —
|
|
1393
|
+
// no per-conversation gating needed. CU is per-conversation (owns step
|
|
1394
|
+
// count, AX tree history, loop detection).
|
|
1395
|
+
if (supportsHostProxy(sourceInterface, "host_cu")) {
|
|
1396
|
+
if (!conversation.isProcessing() || !conversation.hostCuProxy) {
|
|
1397
|
+
conversation.setHostCuProxy(new HostCuProxy());
|
|
1780
1398
|
}
|
|
1781
1399
|
} else if (!conversation.isProcessing()) {
|
|
1782
|
-
conversation.
|
|
1783
|
-
}
|
|
1784
|
-
// Resolve the host_browser sender — registry-routed when the guardian has
|
|
1785
|
-
// an active WS extension connection, SSE hub when a chrome-extension is
|
|
1786
|
-
// connected via SSE (cloud mode), or SSE hub as default for macOS.
|
|
1787
|
-
const {
|
|
1788
|
-
sender: browserProxySendToClient,
|
|
1789
|
-
isRegistryRouted,
|
|
1790
|
-
hasSseExtension,
|
|
1791
|
-
} = resolveHostBrowserSender(
|
|
1792
|
-
conversation,
|
|
1793
|
-
mapping.conversationId,
|
|
1794
|
-
actorPrincipalId,
|
|
1795
|
-
onEvent,
|
|
1796
|
-
sourceInterface,
|
|
1797
|
-
);
|
|
1798
|
-
|
|
1799
|
-
// Stash the registry-routed sender on the conversation so queue-drain
|
|
1800
|
-
// restores (which run outside of conversation-routes.ts and only have
|
|
1801
|
-
// access to `sendToClient`) can preserve it when calling
|
|
1802
|
-
// `restoreBrowserProxyAvailability()`. The override is set when the
|
|
1803
|
-
// sender is registry-routed (regardless of interface) and cleared when
|
|
1804
|
-
// the SSE hub sender is used, so the drain path always restores the
|
|
1805
|
-
// correct transport.
|
|
1806
|
-
if (isRegistryRouted) {
|
|
1807
|
-
conversation.hostBrowserSenderOverride = browserProxySendToClient;
|
|
1808
|
-
} else {
|
|
1809
|
-
conversation.hostBrowserSenderOverride = undefined;
|
|
1400
|
+
conversation.setHostCuProxy(undefined);
|
|
1810
1401
|
}
|
|
1811
|
-
|
|
1812
|
-
//
|
|
1813
|
-
//
|
|
1814
|
-
//
|
|
1815
|
-
//
|
|
1816
|
-
//
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
supportsHostProxy(sourceInterface) ||
|
|
1822
|
-
(canServiceRegistryBrowser(sourceInterface) && isRegistryRouted) ||
|
|
1823
|
-
hasSseExtension;
|
|
1824
|
-
if (shouldProvisionBrowserProxy) {
|
|
1825
|
-
if (!conversation.isProcessing() || !conversation.hostBrowserProxy) {
|
|
1826
|
-
const browserProxy = new HostBrowserProxy(
|
|
1827
|
-
browserProxySendToClient,
|
|
1828
|
-
(requestId) => {
|
|
1829
|
-
pendingInteractions.resolve(requestId);
|
|
1830
|
-
},
|
|
1402
|
+
// App-control mirrors CU's per-conversation lifecycle: the proxy owns a
|
|
1403
|
+
// singleton lock plus per-session loop tracking. Instantiation is
|
|
1404
|
+
// unconditional when the client supports the capability — feature-flag
|
|
1405
|
+
// gating lives in the skill-projection layer (which reads the
|
|
1406
|
+
// `feature-flag: app-control` declaration in SKILL.md frontmatter), so
|
|
1407
|
+
// an attached proxy is harmless when the flag resolves to off.
|
|
1408
|
+
if (supportsHostProxy(sourceInterface, "host_app_control")) {
|
|
1409
|
+
if (!conversation.isProcessing() || !conversation.hostAppControlProxy) {
|
|
1410
|
+
conversation.setHostAppControlProxy(
|
|
1411
|
+
new HostAppControlProxy(mapping.conversationId),
|
|
1831
1412
|
);
|
|
1832
|
-
conversation.setHostBrowserProxy(browserProxy);
|
|
1833
1413
|
}
|
|
1834
1414
|
} else if (!conversation.isProcessing()) {
|
|
1835
|
-
conversation.
|
|
1415
|
+
conversation.setHostAppControlProxy(undefined);
|
|
1836
1416
|
}
|
|
1837
|
-
if
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
conversation.setHostFileProxy(fileProxy);
|
|
1843
|
-
}
|
|
1844
|
-
if (!conversation.isProcessing() || !conversation.getHostTransferProxy()) {
|
|
1845
|
-
const transferProxy = new HostTransferProxy(onEvent, (requestId) => {
|
|
1846
|
-
pendingInteractions.resolve(requestId);
|
|
1847
|
-
});
|
|
1848
|
-
conversation.setHostTransferProxy(transferProxy);
|
|
1849
|
-
}
|
|
1850
|
-
} else if (!conversation.isProcessing()) {
|
|
1851
|
-
conversation.setHostFileProxy(undefined);
|
|
1852
|
-
conversation.setHostTransferProxy(undefined);
|
|
1853
|
-
}
|
|
1854
|
-
if (supportsHostProxy(sourceInterface, "host_cu")) {
|
|
1855
|
-
if (!conversation.isProcessing() || !conversation.hostCuProxy) {
|
|
1856
|
-
const cuProxy = new HostCuProxy(onEvent, (requestId) => {
|
|
1857
|
-
pendingInteractions.resolve(requestId);
|
|
1858
|
-
});
|
|
1859
|
-
conversation.setHostCuProxy(cuProxy);
|
|
1860
|
-
}
|
|
1861
|
-
// Only preactivate CU when the conversation is idle — if the conversation is
|
|
1862
|
-
// processing, this message will be queued and preactivation is deferred
|
|
1863
|
-
// to dequeue time in drainQueueImpl to avoid mutating in-flight turn state.
|
|
1864
|
-
if (!conversation.isProcessing()) {
|
|
1865
|
-
conversation.addPreactivatedSkillId("computer-use");
|
|
1866
|
-
}
|
|
1867
|
-
} else if (!conversation.isProcessing()) {
|
|
1868
|
-
conversation.setHostCuProxy(undefined);
|
|
1417
|
+
// Only preactivate when the conversation is idle — if it's processing,
|
|
1418
|
+
// this message will be queued and preactivation is deferred to dequeue
|
|
1419
|
+
// time in drainQueueImpl to avoid mutating in-flight turn state.
|
|
1420
|
+
if (!conversation.isProcessing()) {
|
|
1421
|
+
preactivateHostProxySkills(conversation, sourceInterface);
|
|
1869
1422
|
}
|
|
1870
1423
|
// Wire sendToClient to the SSE hub so all subsystems can reach the HTTP client.
|
|
1871
|
-
// Called after setHostBashProxy so updateSender targets the current proxy.
|
|
1872
|
-
// When proxies are preserved during an active turn (non-desktop request while
|
|
1873
|
-
// processing), skip updating proxy senders to avoid degrading them. The gate
|
|
1874
|
-
// matches the host_bash capability because the legacy "reject send during
|
|
1875
|
-
// host bash" flow is what this is really protecting.
|
|
1876
|
-
const preservingProxies =
|
|
1877
|
-
conversation.isProcessing() &&
|
|
1878
|
-
!supportsHostProxy(sourceInterface, "host_bash");
|
|
1879
1424
|
// hasNoClient must remain `!isInteractive` so downstream tool gating
|
|
1880
1425
|
// (`isToolActiveForContext` for HOST_TOOL_NAMES, `createToolExecutor`'s
|
|
1881
1426
|
// `isInteractive: !ctx.hasNoClient`) keeps host_bash/host_file/host_cu
|
|
@@ -1883,23 +1428,7 @@ export async function handleSendMessage(
|
|
|
1883
1428
|
// is non-interactive (no SSE prompter UI) but still has a connected client
|
|
1884
1429
|
// that can service host_browser_request events; we restore that single
|
|
1885
1430
|
// proxy explicitly below without relaxing `hasNoClient`.
|
|
1886
|
-
conversation.updateClient(
|
|
1887
|
-
skipProxySenderUpdate: preservingProxies,
|
|
1888
|
-
});
|
|
1889
|
-
// Re-enable the browser proxy for turns that provisioned one. This covers:
|
|
1890
|
-
// - macOS: always provisioned (SSE sender or registry-routed when extension
|
|
1891
|
-
// is connected)
|
|
1892
|
-
// - chrome-extension: natively supports host_browser (non-interactive but
|
|
1893
|
-
// has a connected client for host_browser_request events)
|
|
1894
|
-
//
|
|
1895
|
-
// The helper bypasses the `hasNoClient` gate so chrome-extension turns can
|
|
1896
|
-
// drive the browser via CDP without leaking host_bash/host_file tool
|
|
1897
|
-
// availability. It reads `hostBrowserSenderOverride` (set above when
|
|
1898
|
-
// registry-routed) and applies the correct sender — including after
|
|
1899
|
-
// queue-drain restores run from conversation-process.ts.
|
|
1900
|
-
if (shouldProvisionBrowserProxy) {
|
|
1901
|
-
conversation.restoreBrowserProxyAvailability?.();
|
|
1902
|
-
}
|
|
1431
|
+
conversation.updateClient(broadcastMessage, !isInteractive);
|
|
1903
1432
|
|
|
1904
1433
|
// ── Canned first-greeting fast path ──
|
|
1905
1434
|
// On a completely fresh workspace, skip LLM inference for the macOS
|
|
@@ -1960,25 +1489,30 @@ export async function handleSendMessage(
|
|
|
1960
1489
|
conversationId,
|
|
1961
1490
|
};
|
|
1962
1491
|
|
|
1492
|
+
if (isFirstOnboarding) {
|
|
1493
|
+
persistOnboardingArtifacts(body.onboarding!);
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1963
1496
|
setTimeout(() => {
|
|
1964
|
-
|
|
1497
|
+
broadcastMessage({
|
|
1965
1498
|
type: "user_message_echo",
|
|
1966
1499
|
text: rawContent,
|
|
1967
1500
|
conversationId,
|
|
1968
1501
|
messageId: persisted.id,
|
|
1969
1502
|
clientMessageId,
|
|
1970
1503
|
});
|
|
1971
|
-
|
|
1972
|
-
|
|
1504
|
+
broadcastMessage({
|
|
1505
|
+
type: "assistant_text_delta",
|
|
1506
|
+
text: cannedGreeting,
|
|
1507
|
+
conversationId,
|
|
1508
|
+
});
|
|
1509
|
+
broadcastMessage({ type: "message_complete", conversationId });
|
|
1973
1510
|
conversation.processing = false;
|
|
1974
1511
|
silentlyWithLog(
|
|
1975
1512
|
conversation.drainQueue(),
|
|
1976
1513
|
"canned-greeting queue drain",
|
|
1977
1514
|
);
|
|
1978
1515
|
|
|
1979
|
-
if (isFirstOnboarding) {
|
|
1980
|
-
persistOnboardingArtifacts(body.onboarding!);
|
|
1981
|
-
}
|
|
1982
1516
|
conversation.warmPromptCache();
|
|
1983
1517
|
}, 0);
|
|
1984
1518
|
|
|
@@ -2022,7 +1556,7 @@ export async function handleSendMessage(
|
|
|
2022
1556
|
content: content ?? "",
|
|
2023
1557
|
attachments,
|
|
2024
1558
|
conversation,
|
|
2025
|
-
onEvent,
|
|
1559
|
+
onEvent: broadcastMessage,
|
|
2026
1560
|
// Desktop path: disable NL classification to avoid consuming non-decision
|
|
2027
1561
|
// messages while a tool confirmation is pending. Deterministic code-prefix
|
|
2028
1562
|
// and callback parsing remain active. Mirrors conversation-process.ts behavior.
|
|
@@ -2055,7 +1589,7 @@ export async function handleSendMessage(
|
|
|
2055
1589
|
const enqueueResult = conversation.enqueueMessage(
|
|
2056
1590
|
content ?? "",
|
|
2057
1591
|
attachments,
|
|
2058
|
-
|
|
1592
|
+
broadcastMessage,
|
|
2059
1593
|
requestId,
|
|
2060
1594
|
undefined, // activeSurfaceId
|
|
2061
1595
|
undefined, // currentPage
|
|
@@ -2093,10 +1627,7 @@ export async function handleSendMessage(
|
|
|
2093
1627
|
for (const interaction of pendingInteractions.getByConversation(
|
|
2094
1628
|
mapping.conversationId,
|
|
2095
1629
|
)) {
|
|
2096
|
-
if (
|
|
2097
|
-
interaction.conversation === conversation &&
|
|
2098
|
-
interaction.kind === "confirmation"
|
|
2099
|
-
) {
|
|
1630
|
+
if (interaction.kind === "confirmation") {
|
|
2100
1631
|
conversation.emitConfirmationStateChanged({
|
|
2101
1632
|
conversationId: mapping.conversationId,
|
|
2102
1633
|
requestId: interaction.requestId,
|
|
@@ -2111,7 +1642,7 @@ export async function handleSendMessage(
|
|
|
2111
1642
|
}
|
|
2112
1643
|
}
|
|
2113
1644
|
conversation.denyAllPendingConfirmations();
|
|
2114
|
-
pendingInteractions.removeByConversation(
|
|
1645
|
+
pendingInteractions.removeByConversation(mapping.conversationId);
|
|
2115
1646
|
}
|
|
2116
1647
|
|
|
2117
1648
|
// Expire any orphaned canonical requests that survived without a
|
|
@@ -2140,10 +1671,7 @@ export async function handleSendMessage(
|
|
|
2140
1671
|
for (const interaction of pendingInteractions.getByConversation(
|
|
2141
1672
|
mapping.conversationId,
|
|
2142
1673
|
)) {
|
|
2143
|
-
if (
|
|
2144
|
-
interaction.conversation === conversation &&
|
|
2145
|
-
interaction.kind === "confirmation"
|
|
2146
|
-
) {
|
|
1674
|
+
if (interaction.kind === "confirmation") {
|
|
2147
1675
|
conversation.emitConfirmationStateChanged({
|
|
2148
1676
|
conversationId: mapping.conversationId,
|
|
2149
1677
|
requestId: interaction.requestId,
|
|
@@ -2158,7 +1686,7 @@ export async function handleSendMessage(
|
|
|
2158
1686
|
}
|
|
2159
1687
|
}
|
|
2160
1688
|
conversation.denyAllPendingConfirmations();
|
|
2161
|
-
pendingInteractions.removeByConversation(
|
|
1689
|
+
pendingInteractions.removeByConversation(mapping.conversationId);
|
|
2162
1690
|
}
|
|
2163
1691
|
|
|
2164
1692
|
// Expire any orphaned canonical requests that survived without a
|
|
@@ -2179,17 +1707,14 @@ export async function handleSendMessage(
|
|
|
2179
1707
|
|
|
2180
1708
|
// Resolve slash commands before persisting or running the agent loop.
|
|
2181
1709
|
const rawContent = content ?? "";
|
|
2182
|
-
const
|
|
2183
|
-
|
|
1710
|
+
const slashContext = buildSlashContextForContent(rawContent, {
|
|
1711
|
+
conversationId: mapping.conversationId,
|
|
2184
1712
|
messageCount: conversation.getMessages().length,
|
|
2185
1713
|
inputTokens: conversation.usageStats.inputTokens,
|
|
2186
1714
|
outputTokens: conversation.usageStats.outputTokens,
|
|
2187
|
-
maxInputTokens: config.llm.default.contextWindow.maxInputTokens,
|
|
2188
|
-
model: config.llm.default.model,
|
|
2189
|
-
provider: config.llm.default.provider,
|
|
2190
1715
|
estimatedCost: conversation.usageStats.estimatedCost,
|
|
2191
1716
|
userMessageInterface: sourceInterface,
|
|
2192
|
-
};
|
|
1717
|
+
});
|
|
2193
1718
|
const slashResult = await resolveSlash(rawContent, slashContext);
|
|
2194
1719
|
|
|
2195
1720
|
if (slashResult.kind === "unknown") {
|
|
@@ -2246,7 +1771,7 @@ export async function handleSendMessage(
|
|
|
2246
1771
|
// Snapshot model info now so the deferred callback cannot observe
|
|
2247
1772
|
// a config change from a concurrent request.
|
|
2248
1773
|
const modelInfoEvent = isModelSlashCommand(rawContent)
|
|
2249
|
-
? await buildModelInfoEvent()
|
|
1774
|
+
? await buildModelInfoEvent(mapping.conversationId)
|
|
2250
1775
|
: null;
|
|
2251
1776
|
|
|
2252
1777
|
const response = {
|
|
@@ -2266,7 +1791,7 @@ export async function handleSendMessage(
|
|
|
2266
1791
|
const conversationId = mapping.conversationId;
|
|
2267
1792
|
const message = slashResult.message;
|
|
2268
1793
|
setTimeout(() => {
|
|
2269
|
-
|
|
1794
|
+
broadcastMessage({
|
|
2270
1795
|
type: "user_message_echo",
|
|
2271
1796
|
text: rawContent,
|
|
2272
1797
|
conversationId,
|
|
@@ -2274,10 +1799,14 @@ export async function handleSendMessage(
|
|
|
2274
1799
|
clientMessageId,
|
|
2275
1800
|
});
|
|
2276
1801
|
if (modelInfoEvent) {
|
|
2277
|
-
|
|
1802
|
+
broadcastMessage(modelInfoEvent);
|
|
2278
1803
|
}
|
|
2279
|
-
|
|
2280
|
-
|
|
1804
|
+
broadcastMessage({
|
|
1805
|
+
type: "assistant_text_delta",
|
|
1806
|
+
text: message,
|
|
1807
|
+
conversationId,
|
|
1808
|
+
});
|
|
1809
|
+
broadcastMessage({
|
|
2281
1810
|
type: "message_complete",
|
|
2282
1811
|
conversationId: conversationId,
|
|
2283
1812
|
});
|
|
@@ -2323,7 +1852,7 @@ export async function handleSendMessage(
|
|
|
2323
1852
|
// HTTP timeout on large contexts, causing a false "Failed to send".
|
|
2324
1853
|
(async () => {
|
|
2325
1854
|
try {
|
|
2326
|
-
|
|
1855
|
+
broadcastMessage({
|
|
2327
1856
|
type: "user_message_echo",
|
|
2328
1857
|
text: rawContent,
|
|
2329
1858
|
conversationId,
|
|
@@ -2347,11 +1876,15 @@ export async function handleSendMessage(
|
|
|
2347
1876
|
);
|
|
2348
1877
|
conversation.getMessages().push(assistantMsg);
|
|
2349
1878
|
|
|
2350
|
-
|
|
2351
|
-
|
|
1879
|
+
broadcastMessage({
|
|
1880
|
+
type: "assistant_text_delta",
|
|
1881
|
+
text: responseText,
|
|
1882
|
+
conversationId,
|
|
1883
|
+
});
|
|
1884
|
+
broadcastMessage({ type: "message_complete", conversationId });
|
|
2352
1885
|
} catch (err) {
|
|
2353
1886
|
log.error({ err, conversationId }, "Compact command failed");
|
|
2354
|
-
|
|
1887
|
+
broadcastMessage({
|
|
2355
1888
|
type: "conversation_error",
|
|
2356
1889
|
conversationId,
|
|
2357
1890
|
code: "UNKNOWN",
|
|
@@ -2389,7 +1922,7 @@ export async function handleSendMessage(
|
|
|
2389
1922
|
throw err;
|
|
2390
1923
|
}
|
|
2391
1924
|
|
|
2392
|
-
|
|
1925
|
+
broadcastMessage({
|
|
2393
1926
|
type: "user_message_echo",
|
|
2394
1927
|
text: resolvedContent,
|
|
2395
1928
|
conversationId: mapping.conversationId,
|
|
@@ -2398,9 +1931,9 @@ export async function handleSendMessage(
|
|
|
2398
1931
|
clientMessageId,
|
|
2399
1932
|
});
|
|
2400
1933
|
|
|
2401
|
-
// Fire-and-forget the agent loop; events flow to the hub via
|
|
1934
|
+
// Fire-and-forget the agent loop; events flow to the hub via broadcastMessage.
|
|
2402
1935
|
conversation
|
|
2403
|
-
.runAgentLoop(resolvedContent, messageId,
|
|
1936
|
+
.runAgentLoop(resolvedContent, messageId, broadcastMessage, {
|
|
2404
1937
|
isInteractive,
|
|
2405
1938
|
isUserMessage: true,
|
|
2406
1939
|
})
|