@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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { v4 as uuid } from "uuid";
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
+
addAppConversationId,
|
|
4
5
|
getApp,
|
|
5
6
|
getAppDirPath,
|
|
6
7
|
getAppPreview,
|
|
@@ -13,15 +14,20 @@ import {
|
|
|
13
14
|
getMessages,
|
|
14
15
|
updateMessageContent,
|
|
15
16
|
} from "../memory/conversation-crud.js";
|
|
17
|
+
import {
|
|
18
|
+
assistantEventHub,
|
|
19
|
+
broadcastMessage,
|
|
20
|
+
} from "../runtime/assistant-event-hub.js";
|
|
16
21
|
import type {
|
|
17
22
|
InteractiveUiRequest,
|
|
18
23
|
InteractiveUiResult,
|
|
19
|
-
} from "../runtime/interactive-ui.js";
|
|
24
|
+
} from "../runtime/interactive-ui-types.js";
|
|
20
25
|
import type { ToolExecutionResult } from "../tools/types.js";
|
|
21
26
|
import { getLogger } from "../util/logger.js";
|
|
22
27
|
import { isPlainObject } from "../util/object.js";
|
|
23
28
|
import { buildConversationErrorMessage } from "./conversation-error.js";
|
|
24
29
|
import { launchConversation } from "./conversation-launch.js";
|
|
30
|
+
import type { HostAppControlProxy } from "./host-app-control-proxy.js";
|
|
25
31
|
import type { HostCuProxy } from "./host-cu-proxy.js";
|
|
26
32
|
import type {
|
|
27
33
|
CardSurfaceData,
|
|
@@ -39,6 +45,7 @@ import type {
|
|
|
39
45
|
} from "./message-protocol.js";
|
|
40
46
|
import { INTERACTIVE_SURFACE_TYPES } from "./message-protocol.js";
|
|
41
47
|
import type { ConversationTransportMetadata } from "./message-types/conversations.js";
|
|
48
|
+
import type { HostAppControlInput } from "./message-types/host-app-control.js";
|
|
42
49
|
import type { UserMessageAttachment } from "./message-types/shared.js";
|
|
43
50
|
import type { TrustContext } from "./trust-context.js";
|
|
44
51
|
|
|
@@ -255,7 +262,6 @@ export interface SurfaceConversationContext {
|
|
|
255
262
|
emit(type: string, message: string, meta?: Record<string, unknown>): void;
|
|
256
263
|
};
|
|
257
264
|
sendToClient(msg: ServerMessage): void;
|
|
258
|
-
broadcastToAllClients?(msg: ServerMessage): void;
|
|
259
265
|
pendingSurfaceActions: Map<string, { surfaceType: SurfaceType }>;
|
|
260
266
|
lastSurfaceAction: Map<
|
|
261
267
|
string,
|
|
@@ -319,14 +325,23 @@ export interface SurfaceConversationContext {
|
|
|
319
325
|
}>;
|
|
320
326
|
/** Optional proxy for delegating computer-use actions to a connected desktop client. */
|
|
321
327
|
hostCuProxy?: HostCuProxy;
|
|
328
|
+
/** Optional proxy for delegating per-app app-control actions to a connected desktop client. */
|
|
329
|
+
hostAppControlProxy?: HostAppControlProxy;
|
|
330
|
+
/**
|
|
331
|
+
* Setter that lets the resolver detach the conversation's app-control proxy
|
|
332
|
+
* after `app_control_stop`. Disposes the existing proxy when transitioning
|
|
333
|
+
* to undefined so subsequent tool calls cleanly fail with "unavailable"
|
|
334
|
+
* rather than dispatching to a torn-down proxy.
|
|
335
|
+
*/
|
|
336
|
+
setHostAppControlProxy?(proxy: HostAppControlProxy | undefined): void;
|
|
322
337
|
/** True when no interactive client is connected (headless / channel-only). */
|
|
323
338
|
readonly hasNoClient?: boolean;
|
|
324
339
|
isProcessing(): boolean;
|
|
325
340
|
enqueueMessage(
|
|
326
341
|
content: string,
|
|
327
342
|
attachments: UserMessageAttachment[],
|
|
328
|
-
onEvent
|
|
329
|
-
requestId
|
|
343
|
+
onEvent?: (msg: ServerMessage) => void,
|
|
344
|
+
requestId?: string,
|
|
330
345
|
activeSurfaceId?: string,
|
|
331
346
|
currentPage?: string,
|
|
332
347
|
metadata?: Record<string, unknown>,
|
|
@@ -338,7 +353,7 @@ export interface SurfaceConversationContext {
|
|
|
338
353
|
processMessage(
|
|
339
354
|
content: string,
|
|
340
355
|
attachments: UserMessageAttachment[],
|
|
341
|
-
onEvent
|
|
356
|
+
onEvent?: (msg: ServerMessage) => void,
|
|
342
357
|
requestId?: string,
|
|
343
358
|
activeSurfaceId?: string,
|
|
344
359
|
currentPage?: string,
|
|
@@ -485,9 +500,7 @@ export function showStandaloneSurface(
|
|
|
485
500
|
// the client side, preventing stale user interactions from reaching
|
|
486
501
|
// handleSurfaceAction and being misrouted to the LLM.
|
|
487
502
|
try {
|
|
488
|
-
|
|
489
|
-
ctx.broadcastToAllClients ?? ctx.sendToClient.bind(ctx);
|
|
490
|
-
emitTimeout({
|
|
503
|
+
broadcastMessage({
|
|
491
504
|
type: "ui_surface_complete",
|
|
492
505
|
conversationId: ctx.conversationId,
|
|
493
506
|
surfaceId,
|
|
@@ -523,9 +536,7 @@ export function showStandaloneSurface(
|
|
|
523
536
|
actions,
|
|
524
537
|
});
|
|
525
538
|
|
|
526
|
-
|
|
527
|
-
const emit = ctx.broadcastToAllClients ?? ctx.sendToClient.bind(ctx);
|
|
528
|
-
emit({
|
|
539
|
+
broadcastMessage({
|
|
529
540
|
type: "ui_surface_show",
|
|
530
541
|
conversationId: ctx.conversationId,
|
|
531
542
|
surfaceId,
|
|
@@ -994,9 +1005,7 @@ export async function handleSurfaceAction(
|
|
|
994
1005
|
summary,
|
|
995
1006
|
};
|
|
996
1007
|
|
|
997
|
-
|
|
998
|
-
const emit = ctx.broadcastToAllClients ?? ctx.sendToClient.bind(ctx);
|
|
999
|
-
emit({
|
|
1008
|
+
broadcastMessage({
|
|
1000
1009
|
type: "ui_surface_complete",
|
|
1001
1010
|
conversationId: ctx.conversationId,
|
|
1002
1011
|
surfaceId,
|
|
@@ -1211,12 +1220,11 @@ export async function handleSurfaceAction(
|
|
|
1211
1220
|
|
|
1212
1221
|
const requestId = uuid();
|
|
1213
1222
|
ctx.surfaceActionRequestIds.add(requestId);
|
|
1214
|
-
//
|
|
1215
|
-
//
|
|
1216
|
-
//
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
const onEvent = (msg: ServerMessage) => emit(msg);
|
|
1223
|
+
// Pass conversationId so events without an inline conversationId (e.g.
|
|
1224
|
+
// text_delta) are published with the correct conversation scope and
|
|
1225
|
+
// reach the SSE subscriber filtered to this conversation.
|
|
1226
|
+
const onEvent = (msg: ServerMessage) =>
|
|
1227
|
+
broadcastMessage(msg, ctx.conversationId);
|
|
1220
1228
|
|
|
1221
1229
|
ctx.traceEmitter.emit("request_received", "Surface action received", {
|
|
1222
1230
|
requestId,
|
|
@@ -1250,7 +1258,7 @@ export async function handleSurfaceAction(
|
|
|
1250
1258
|
// Echo the prompt to the client so it appears in the chat UI.
|
|
1251
1259
|
// Deferred until after rejection check to avoid ghost messages.
|
|
1252
1260
|
if (prompt) {
|
|
1253
|
-
|
|
1261
|
+
broadcastMessage({
|
|
1254
1262
|
type: "user_message_echo",
|
|
1255
1263
|
text: prompt,
|
|
1256
1264
|
conversationId: ctx.conversationId,
|
|
@@ -1350,16 +1358,11 @@ export async function handleSurfaceAction(
|
|
|
1350
1358
|
surfaceData,
|
|
1351
1359
|
);
|
|
1352
1360
|
|
|
1353
|
-
// Use broadcastToAllClients so events reach the SSE hub — sendToClient is
|
|
1354
|
-
// reset to a no-op between HTTP requests (see history-restored path for
|
|
1355
|
-
// full rationale).
|
|
1356
|
-
const emit = ctx.broadcastToAllClients ?? ctx.sendToClient.bind(ctx);
|
|
1357
|
-
|
|
1358
1361
|
// Forms are one-shot surfaces — auto-complete immediately so the client
|
|
1359
1362
|
// transitions from the "Submitting…" spinner to a completion chip without
|
|
1360
1363
|
// requiring the LLM to call ui_dismiss.
|
|
1361
1364
|
if (pending.surfaceType === "form") {
|
|
1362
|
-
|
|
1365
|
+
broadcastMessage({
|
|
1363
1366
|
type: "ui_surface_complete",
|
|
1364
1367
|
conversationId: ctx.conversationId,
|
|
1365
1368
|
surfaceId,
|
|
@@ -1455,7 +1458,11 @@ export async function handleSurfaceAction(
|
|
|
1455
1458
|
|
|
1456
1459
|
const requestId = uuid();
|
|
1457
1460
|
ctx.surfaceActionRequestIds.add(requestId);
|
|
1458
|
-
|
|
1461
|
+
// Pass conversationId so events without an inline conversationId (e.g.
|
|
1462
|
+
// text_delta) are published with the correct conversation scope and
|
|
1463
|
+
// reach the SSE subscriber filtered to this conversation.
|
|
1464
|
+
const onEvent = (msg: ServerMessage) =>
|
|
1465
|
+
broadcastMessage(msg, ctx.conversationId);
|
|
1459
1466
|
|
|
1460
1467
|
ctx.traceEmitter.emit("request_received", "Surface action received", {
|
|
1461
1468
|
requestId,
|
|
@@ -1503,7 +1510,7 @@ export async function handleSurfaceAction(
|
|
|
1503
1510
|
// Echo the user's prompt to the client so it appears in the chat UI.
|
|
1504
1511
|
// Deferred until after rejection check to avoid ghost messages.
|
|
1505
1512
|
if (shouldRelayPrompt && prompt) {
|
|
1506
|
-
|
|
1513
|
+
broadcastMessage({
|
|
1507
1514
|
type: "user_message_echo",
|
|
1508
1515
|
text: prompt,
|
|
1509
1516
|
conversationId: ctx.conversationId,
|
|
@@ -1567,6 +1574,7 @@ export async function handleSurfaceAction(
|
|
|
1567
1574
|
);
|
|
1568
1575
|
onEvent({
|
|
1569
1576
|
type: "error",
|
|
1577
|
+
conversationId: ctx.conversationId,
|
|
1570
1578
|
message: `Failed to process surface action: ${message}`,
|
|
1571
1579
|
});
|
|
1572
1580
|
});
|
|
@@ -1775,6 +1783,56 @@ export async function surfaceProxyResolver(
|
|
|
1775
1783
|
// Record the action and proxy to the connected desktop client
|
|
1776
1784
|
const reasoning =
|
|
1777
1785
|
typeof input.reasoning === "string" ? input.reasoning : undefined;
|
|
1786
|
+
const targetClientId =
|
|
1787
|
+
typeof input.target_client_id === "string" && input.target_client_id !== ""
|
|
1788
|
+
? input.target_client_id
|
|
1789
|
+
: undefined;
|
|
1790
|
+
|
|
1791
|
+
// Validate targetClientId before recordAction so an invalid ID does not
|
|
1792
|
+
// burn a step or pollute action history. (HostBashProxy / HostFileProxy
|
|
1793
|
+
// both validate at the tool-resolution layer before incrementing any
|
|
1794
|
+
// state; this mirrors that behaviour for CU.)
|
|
1795
|
+
if (targetClientId != null) {
|
|
1796
|
+
const client = assistantEventHub.getClientById(targetClientId);
|
|
1797
|
+
if (!client) {
|
|
1798
|
+
return {
|
|
1799
|
+
content: `No connected client with id '${targetClientId}'. Run \`assistant clients list --capability host_cu\` to see available clients.`,
|
|
1800
|
+
isError: true,
|
|
1801
|
+
};
|
|
1802
|
+
}
|
|
1803
|
+
if (!client.capabilities.includes("host_cu")) {
|
|
1804
|
+
return {
|
|
1805
|
+
content: `Client '${targetClientId}' does not support host_cu. Run \`assistant clients list --capability host_cu\` to see available clients.`,
|
|
1806
|
+
isError: true,
|
|
1807
|
+
};
|
|
1808
|
+
}
|
|
1809
|
+
}
|
|
1810
|
+
|
|
1811
|
+
// Guard: require explicit targeting when multiple CU-capable clients are
|
|
1812
|
+
// connected. The tool schemas document target_client_id as "required when
|
|
1813
|
+
// multiple clients support host_cu" but nothing enforced it at runtime
|
|
1814
|
+
// until now. Without this guard, the request would broadcast to all
|
|
1815
|
+
// capable clients simultaneously, causing the same CU action to execute
|
|
1816
|
+
// on multiple machines.
|
|
1817
|
+
//
|
|
1818
|
+
// Asymmetry with host_bash / host_file (host-shell.ts): the bash/file
|
|
1819
|
+
// guard additionally checks `transportInterface != null &&
|
|
1820
|
+
// !supportsHostProxy(transportInterface)` and so only fires for non-host-
|
|
1821
|
+
// proxy transports (web, Slack). For CU that check would be a no-op:
|
|
1822
|
+
// every host_cu-capable client is host-proxy-capable by definition
|
|
1823
|
+
// (host_cu only ships on macOS and the Chrome extension), so there is no
|
|
1824
|
+
// host_cu-capable transport for which auto-routing-to-self would be
|
|
1825
|
+
// appropriate. We therefore fire whenever there is genuine ambiguity.
|
|
1826
|
+
if (targetClientId == null) {
|
|
1827
|
+
const cuClients = assistantEventHub.listClientsByCapability("host_cu");
|
|
1828
|
+
if (cuClients.length > 1) {
|
|
1829
|
+
return {
|
|
1830
|
+
content: `Error: multiple clients support host_cu. Specify which client to target with \`target_client_id\`. Run \`assistant clients list --capability host_cu\` to see client IDs and labels.`,
|
|
1831
|
+
isError: true,
|
|
1832
|
+
};
|
|
1833
|
+
}
|
|
1834
|
+
}
|
|
1835
|
+
|
|
1778
1836
|
ctx.hostCuProxy.recordAction(toolName, input, reasoning);
|
|
1779
1837
|
return ctx.hostCuProxy.request(
|
|
1780
1838
|
toolName,
|
|
@@ -1783,6 +1841,55 @@ export async function surfaceProxyResolver(
|
|
|
1783
1841
|
ctx.hostCuProxy.stepCount,
|
|
1784
1842
|
reasoning,
|
|
1785
1843
|
signal,
|
|
1844
|
+
targetClientId,
|
|
1845
|
+
);
|
|
1846
|
+
}
|
|
1847
|
+
|
|
1848
|
+
// Route app-control proxy tools (all app_control_* tool variants)
|
|
1849
|
+
if (toolName.startsWith("app_control_")) {
|
|
1850
|
+
if (!ctx.hostAppControlProxy || !ctx.hostAppControlProxy.isAvailable()) {
|
|
1851
|
+
return {
|
|
1852
|
+
content:
|
|
1853
|
+
"App control is not available — enable the `app-control` feature flag and connect a macOS client.",
|
|
1854
|
+
isError: true,
|
|
1855
|
+
};
|
|
1856
|
+
}
|
|
1857
|
+
|
|
1858
|
+
// `app_control_stop` resolves immediately: tear down the proxy without
|
|
1859
|
+
// a client round-trip. Mirrors CU's terminal-tool short-circuit
|
|
1860
|
+
// (`computer_use_done` / `computer_use_respond`). Clear the
|
|
1861
|
+
// conversation's reference (setter disposes the existing proxy) so a
|
|
1862
|
+
// later `app_control_observe`/etc. cleanly fails with "unavailable"
|
|
1863
|
+
// instead of dispatching against a torn-down proxy, and so a sibling
|
|
1864
|
+
// conversation can acquire the released singleton lock without the
|
|
1865
|
+
// disposed proxy still being addressable.
|
|
1866
|
+
if (toolName === "app_control_stop") {
|
|
1867
|
+
if (ctx.setHostAppControlProxy) {
|
|
1868
|
+
ctx.setHostAppControlProxy(undefined);
|
|
1869
|
+
} else {
|
|
1870
|
+
ctx.hostAppControlProxy.dispose();
|
|
1871
|
+
}
|
|
1872
|
+
return { content: "App control stopped.", isError: false };
|
|
1873
|
+
}
|
|
1874
|
+
|
|
1875
|
+
// The TS `HostAppControlInput` (and the Swift mirror) is a discriminated
|
|
1876
|
+
// union on `tool` ("start" | "observe" | "press" | …). The agent's raw
|
|
1877
|
+
// tool input only carries the action-specific payload (app, x/y, text,
|
|
1878
|
+
// …) — the discriminator is implied by `toolName` (`app_control_<tool>`).
|
|
1879
|
+
// Inject it here so the proxy's singleton-lock guard (`input.tool ===
|
|
1880
|
+
// "start"`) and the Swift client's discriminated-union decoder both see
|
|
1881
|
+
// the field they require.
|
|
1882
|
+
const tool = toolName.slice("app_control_".length);
|
|
1883
|
+
const inputWithTool = {
|
|
1884
|
+
...input,
|
|
1885
|
+
tool,
|
|
1886
|
+
} as unknown as HostAppControlInput;
|
|
1887
|
+
|
|
1888
|
+
return ctx.hostAppControlProxy.request(
|
|
1889
|
+
toolName,
|
|
1890
|
+
inputWithTool,
|
|
1891
|
+
ctx.conversationId,
|
|
1892
|
+
signal ?? new AbortController().signal,
|
|
1786
1893
|
);
|
|
1787
1894
|
}
|
|
1788
1895
|
|
|
@@ -2016,6 +2123,14 @@ export async function surfaceProxyResolver(
|
|
|
2016
2123
|
const openMode = input.open_mode as string | undefined;
|
|
2017
2124
|
const app = getApp(appId);
|
|
2018
2125
|
if (!app) return { content: `App not found: ${appId}`, isError: true };
|
|
2126
|
+
|
|
2127
|
+
// Track conversation association (best-effort — failures must not break open flow).
|
|
2128
|
+
try {
|
|
2129
|
+
addAppConversationId(appId, ctx.conversationId);
|
|
2130
|
+
} catch (err) {
|
|
2131
|
+
log.warn({ err, appId }, "Failed to track conversation ID on app_open");
|
|
2132
|
+
}
|
|
2133
|
+
|
|
2019
2134
|
// Generate a minimal fallback preview from app metadata so that the
|
|
2020
2135
|
// surface is always rendered as a clickable preview card (not an
|
|
2021
2136
|
// un-clickable fallback chip) after conversation restart.
|
|
@@ -13,12 +13,12 @@ import {
|
|
|
13
13
|
} from "../channels/types.js";
|
|
14
14
|
import { isHttpAuthDisabled } from "../config/env.js";
|
|
15
15
|
import { getIsPlatform } from "../config/env-registry.js";
|
|
16
|
-
import type { CesClient } from "../credential-execution/client.js";
|
|
17
16
|
import { getBindingByConversation } from "../memory/external-conversation-store.js";
|
|
18
17
|
import type { PermissionPrompter } from "../permissions/prompter.js";
|
|
19
18
|
import type { SecretPrompter } from "../permissions/secret-prompter.js";
|
|
20
19
|
import type { Message, ToolDefinition } from "../providers/types.js";
|
|
21
20
|
import type { TrustClass } from "../runtime/actor-trust-resolver.js";
|
|
21
|
+
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
22
22
|
import { coreAppProxyTools } from "../tools/apps/definitions.js";
|
|
23
23
|
import { registerConversationSender } from "../tools/browser/browser-screencast.js";
|
|
24
24
|
import type { ToolExecutor } from "../tools/executor.js";
|
|
@@ -43,7 +43,6 @@ import {
|
|
|
43
43
|
projectSkillTools,
|
|
44
44
|
type SkillProjectionCache,
|
|
45
45
|
} from "./conversation-skill-tools.js";
|
|
46
|
-
import type { SurfaceConversationContext } from "./conversation-surfaces.js";
|
|
47
46
|
import { surfaceProxyResolver } from "./conversation-surfaces.js";
|
|
48
47
|
import {
|
|
49
48
|
isDoordashCommand,
|
|
@@ -72,67 +71,8 @@ export function resolveTrustClass(
|
|
|
72
71
|
return trustContext?.trustClass ?? "unknown";
|
|
73
72
|
}
|
|
74
73
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Subset of Conversation state that the tool executor callback reads at
|
|
79
|
-
* call time (not construction time). These are captured by the
|
|
80
|
-
* returned closure, so they must be live references.
|
|
81
|
-
*/
|
|
82
|
-
export interface ToolSetupContext extends SurfaceConversationContext {
|
|
83
|
-
readonly conversationId: string;
|
|
84
|
-
assistantId?: string;
|
|
85
|
-
currentRequestId?: string;
|
|
86
|
-
workingDir: string;
|
|
87
|
-
abortController: AbortController | null;
|
|
88
|
-
/** When set, only tools in this set may execute during the current turn. */
|
|
89
|
-
allowedToolNames?: Set<string>;
|
|
90
|
-
/** Conversation memory policy used to propagate scopeId into ToolContext. */
|
|
91
|
-
memoryPolicy: { scopeId: string };
|
|
92
|
-
/** True when the conversation has no connected client (HTTP-only path). */
|
|
93
|
-
hasNoClient?: boolean;
|
|
94
|
-
/** When true, the conversation is executing a task run and must not become interactive. */
|
|
95
|
-
headlessLock?: boolean;
|
|
96
|
-
/** When set, this conversation is executing a task run. Used to retrieve ephemeral permission rules. */
|
|
97
|
-
taskRunId?: string;
|
|
98
|
-
/** Guardian runtime context for the conversation — trustClass is propagated into ToolContext for control-plane policy enforcement. */
|
|
99
|
-
trustContext?: TrustContext;
|
|
100
|
-
/** Voice/call session ID, if the conversation originates from a call. Propagated into ToolContext for scoped grant consumption. */
|
|
101
|
-
callSessionId?: string;
|
|
102
|
-
/** Optional proxy for delegating host_bash execution to a connected client. */
|
|
103
|
-
hostBashProxy?: import("./host-bash-proxy.js").HostBashProxy;
|
|
104
|
-
/** Optional proxy for delegating CDP commands to a connected client (managed/cloud-hosted mode). */
|
|
105
|
-
hostBrowserProxy?: import("./host-browser-proxy.js").HostBrowserProxy;
|
|
106
|
-
/** Optional proxy for delegating host_file_read/write/edit execution to a connected client. */
|
|
107
|
-
hostFileProxy?: import("./host-file-proxy.js").HostFileProxy;
|
|
108
|
-
/** Optional proxy for delegating bidirectional file transfers between sandbox and host. */
|
|
109
|
-
hostTransferProxy?: import("./host-transfer-proxy.js").HostTransferProxy;
|
|
110
|
-
/** CES RPC client for credential execution operations. Injected when CES tools are enabled and the CES process is available. */
|
|
111
|
-
cesClient?: CesClient;
|
|
112
|
-
/** The interface ID of the connected client driving the current turn (e.g. "macos", "chrome-extension"). Propagated into ToolContext for browser backend selection. */
|
|
113
|
-
readonly transportInterface?: InterfaceId;
|
|
114
|
-
/**
|
|
115
|
-
* Registry-routed sender override for the host browser proxy. When set
|
|
116
|
-
* (non-undefined), indicates the browser proxy sender was replaced by a
|
|
117
|
-
* ChromeExtensionRegistry WebSocket sender — i.e., an extension connection
|
|
118
|
-
* was actively wired at turn-start. Propagated into ToolContext as
|
|
119
|
-
* `hostBrowserRegistryRouted` (boolean) so the CDP factory can distinguish
|
|
120
|
-
* SSE-backed proxies from extension-backed proxies.
|
|
121
|
-
*/
|
|
122
|
-
hostBrowserSenderOverride?: (
|
|
123
|
-
msg: import("./message-protocol.js").ServerMessage,
|
|
124
|
-
) => void;
|
|
125
|
-
/** Turn-scoped flag: true when any tool call in the current turn received explicit user approval via interactive prompt. Cleared at turn end. */
|
|
126
|
-
approvedViaPromptThisTurn?: boolean;
|
|
127
|
-
/**
|
|
128
|
-
* Per-turn snapshot of the resolved inference-profile override, set by
|
|
129
|
-
* `runAgentLoopImpl`. Propagated into `ToolContext.overrideProfile` so
|
|
130
|
-
* tools that spawn nested invocations (e.g. `subagent_spawn`) can forward
|
|
131
|
-
* the override without round-tripping through a row read that would
|
|
132
|
-
* return `undefined` for the in-flight (background) subagent.
|
|
133
|
-
*/
|
|
134
|
-
currentTurnOverrideProfile?: string;
|
|
135
|
-
}
|
|
74
|
+
import type { ToolSetupContext } from "./tool-setup-types.js";
|
|
75
|
+
export type { ToolSetupContext } from "./tool-setup-types.js";
|
|
136
76
|
|
|
137
77
|
// ── buildToolDefinitions ─────────────────────────────────────────────
|
|
138
78
|
|
|
@@ -162,7 +102,6 @@ export function createToolExecutor(
|
|
|
162
102
|
secretPrompter: SecretPrompter,
|
|
163
103
|
ctx: ToolSetupContext,
|
|
164
104
|
handleToolLifecycleEvent: ToolLifecycleEventHandler,
|
|
165
|
-
broadcastToAllClients?: (msg: ServerMessage) => void,
|
|
166
105
|
): (
|
|
167
106
|
name: string,
|
|
168
107
|
input: Record<string, unknown>,
|
|
@@ -214,14 +153,9 @@ export function createToolExecutor(
|
|
|
214
153
|
allowedToolNames: ctx.allowedToolNames,
|
|
215
154
|
memoryScopeId: ctx.memoryPolicy.scopeId,
|
|
216
155
|
toolUseId,
|
|
217
|
-
hostBashProxy: ctx.hostBashProxy,
|
|
218
|
-
hostBrowserProxy: ctx.hostBrowserProxy,
|
|
219
|
-
hostFileProxy: ctx.hostFileProxy,
|
|
220
|
-
hostTransferProxy: ctx.hostTransferProxy,
|
|
221
156
|
isPlatformHosted: getIsPlatform(),
|
|
222
157
|
cesClient: ctx.cesClient,
|
|
223
158
|
transportInterface: ctx.transportInterface,
|
|
224
|
-
hostBrowserRegistryRouted: !!ctx.hostBrowserSenderOverride,
|
|
225
159
|
overrideProfile: ctx.currentTurnOverrideProfile,
|
|
226
160
|
onToolLifecycleEvent: handleToolLifecycleEvent,
|
|
227
161
|
sendToClient: (msg) => {
|
|
@@ -282,16 +216,6 @@ export function createToolExecutor(
|
|
|
282
216
|
// Clone to avoid mutating shared input objects
|
|
283
217
|
const toolInput = { ...rawToolInput };
|
|
284
218
|
|
|
285
|
-
// Propagate outer activity when inner input lacks a valid one
|
|
286
|
-
if (
|
|
287
|
-
typeof input.activity === "string" &&
|
|
288
|
-
input.activity &&
|
|
289
|
-
(typeof toolInput.activity !== "string" ||
|
|
290
|
-
toolInput.activity.length === 0)
|
|
291
|
-
) {
|
|
292
|
-
toolInput.activity = input.activity;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
219
|
if (!toolName) {
|
|
296
220
|
return {
|
|
297
221
|
content:
|
|
@@ -310,10 +234,7 @@ export function createToolExecutor(
|
|
|
310
234
|
ctx.approvedViaPromptThisTurn = true;
|
|
311
235
|
}
|
|
312
236
|
|
|
313
|
-
runPostExecutionSideEffects(toolName, toolInput, result, {
|
|
314
|
-
ctx,
|
|
315
|
-
broadcastToAllClients,
|
|
316
|
-
});
|
|
237
|
+
runPostExecutionSideEffects(toolName, toolInput, result, { ctx });
|
|
317
238
|
|
|
318
239
|
return result;
|
|
319
240
|
}
|
|
@@ -328,10 +249,7 @@ export function createToolExecutor(
|
|
|
328
249
|
ctx.approvedViaPromptThisTurn = true;
|
|
329
250
|
}
|
|
330
251
|
|
|
331
|
-
runPostExecutionSideEffects(name, input, result, {
|
|
332
|
-
ctx,
|
|
333
|
-
broadcastToAllClients,
|
|
334
|
-
});
|
|
252
|
+
runPostExecutionSideEffects(name, input, result, { ctx });
|
|
335
253
|
|
|
336
254
|
return result;
|
|
337
255
|
};
|
|
@@ -467,6 +385,19 @@ export function isToolActiveForContext(
|
|
|
467
385
|
// Per-capability check is authoritative for structural support: if the
|
|
468
386
|
// transport cannot service this capability, the tool is filtered out.
|
|
469
387
|
if (transport && capability && !supportsHostProxy(transport, capability)) {
|
|
388
|
+
// Cross-client exception: allow host_bash for non-host-proxy interfaces when
|
|
389
|
+
// at least one capable client is connected via the event hub.
|
|
390
|
+
// Only applies to host_bash (not host_file, host_cu, host_browser — Phase 2).
|
|
391
|
+
// Excludes chrome-extension (security boundary: extension only gets host_browser)
|
|
392
|
+
// and hasNoClient turns (no interactive approval UI available).
|
|
393
|
+
if (
|
|
394
|
+
capability === "host_bash" &&
|
|
395
|
+
transport !== "chrome-extension" &&
|
|
396
|
+
!ctx.hasNoClient &&
|
|
397
|
+
assistantEventHub.listClientsByCapability("host_bash").length > 0
|
|
398
|
+
) {
|
|
399
|
+
return true;
|
|
400
|
+
}
|
|
470
401
|
return false;
|
|
471
402
|
}
|
|
472
403
|
|
|
@@ -2,10 +2,13 @@ import { getConfig } from "../config/loader.js";
|
|
|
2
2
|
import { updateConversationUsage } from "../memory/conversation-crud.js";
|
|
3
3
|
import { recordUsageEvent } from "../memory/llm-usage-store.js";
|
|
4
4
|
import type { UsageActor } from "../usage/actors.js";
|
|
5
|
+
import { resolveUsageAttribution } from "../usage/attribution.js";
|
|
5
6
|
import type {
|
|
6
7
|
AnthropicCacheCreationTokenDetails,
|
|
7
8
|
PricingResult,
|
|
8
9
|
PricingUsage,
|
|
10
|
+
UsageAttributionInput,
|
|
11
|
+
UsageAttributionSnapshot,
|
|
9
12
|
} from "../usage/types.js";
|
|
10
13
|
import { getLogger } from "../util/logger.js";
|
|
11
14
|
import {
|
|
@@ -117,6 +120,34 @@ function resolveStructuredPricing(
|
|
|
117
120
|
}
|
|
118
121
|
}
|
|
119
122
|
|
|
123
|
+
function isUsageAttributionSnapshot(
|
|
124
|
+
attribution:
|
|
125
|
+
| UsageAttributionInput
|
|
126
|
+
| UsageAttributionSnapshot
|
|
127
|
+
| null
|
|
128
|
+
| undefined,
|
|
129
|
+
): attribution is UsageAttributionSnapshot {
|
|
130
|
+
return (
|
|
131
|
+
attribution != null &&
|
|
132
|
+
typeof (attribution as UsageAttributionSnapshot).resolvedProvider ===
|
|
133
|
+
"string" &&
|
|
134
|
+
typeof (attribution as UsageAttributionSnapshot).resolvedModel === "string"
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function resolveAttribution(
|
|
139
|
+
attribution:
|
|
140
|
+
| UsageAttributionInput
|
|
141
|
+
| UsageAttributionSnapshot
|
|
142
|
+
| null
|
|
143
|
+
| undefined,
|
|
144
|
+
): UsageAttributionSnapshot | null {
|
|
145
|
+
if (attribution == null) return null;
|
|
146
|
+
return isUsageAttributionSnapshot(attribution)
|
|
147
|
+
? attribution
|
|
148
|
+
: resolveUsageAttribution(attribution);
|
|
149
|
+
}
|
|
150
|
+
|
|
120
151
|
export function recordUsage(
|
|
121
152
|
ctx: UsageContext,
|
|
122
153
|
inputTokens: number,
|
|
@@ -130,6 +161,7 @@ export function recordUsage(
|
|
|
130
161
|
rawResponse?: unknown,
|
|
131
162
|
llmCallCount = 1,
|
|
132
163
|
contextWindow?: { tokens: number; maxTokens: number },
|
|
164
|
+
attribution?: UsageAttributionInput | UsageAttributionSnapshot | null,
|
|
133
165
|
): void {
|
|
134
166
|
if (inputTokens <= 0 && outputTokens <= 0) return;
|
|
135
167
|
|
|
@@ -193,6 +225,7 @@ export function recordUsage(
|
|
|
193
225
|
|
|
194
226
|
// Dual-write: persist per-turn usage event to the new ledger table
|
|
195
227
|
try {
|
|
228
|
+
const attributionSnapshot = resolveAttribution(attribution);
|
|
196
229
|
recordUsageEvent(
|
|
197
230
|
{
|
|
198
231
|
actor,
|
|
@@ -206,6 +239,9 @@ export function recordUsage(
|
|
|
206
239
|
runId: null,
|
|
207
240
|
requestId,
|
|
208
241
|
llmCallCount,
|
|
242
|
+
callSite: attributionSnapshot?.callSite ?? null,
|
|
243
|
+
inferenceProfile: attributionSnapshot?.appliedProfile ?? null,
|
|
244
|
+
inferenceProfileSource: attributionSnapshot?.profileSource ?? null,
|
|
209
245
|
},
|
|
210
246
|
pricing,
|
|
211
247
|
);
|