@vellumai/assistant 0.10.8 → 0.10.9-dev.202607152225.ec6fdbf
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/AGENTS.md +4 -0
- package/ARCHITECTURE.md +52 -88
- package/README.md +14 -35
- package/docs/activation-funnel-telemetry.md +20 -18
- package/docs/architecture/scheduling.md +0 -86
- package/docs/runbook-trusted-contacts.md +19 -19
- package/docs/trusted-contact-access.md +70 -69
- package/docs/workspace-tools.md +4 -2
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +62 -360
- package/eslint-rules/cli-no-daemon-internals.js +91 -275
- package/eslint.config.mjs +4 -4
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/node_modules/@vellumai/gateway-client/src/__tests__/guardian-request-contract.test.ts +575 -0
- package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +20 -0
- package/node_modules/@vellumai/gateway-client/src/guardian-request-contract.ts +687 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +82 -0
- package/node_modules/@vellumai/service-contracts/package.json +1 -0
- package/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
- package/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
- package/openapi.yaml +353 -742
- package/package.json +2 -2
- package/scripts/build-test-fixtures.ts +3 -2
- package/scripts/test.ts +2 -7
- package/src/__tests__/activation-early-marking.test.ts +1 -8
- package/src/__tests__/actor-token-service.test.ts +0 -7
- package/src/__tests__/add-message-preassigned-id.test.ts +1 -1
- package/src/__tests__/add-message-skip-indexing.test.ts +164 -0
- package/src/__tests__/agent-image-optimize.test.ts +104 -1
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +5 -15
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +0 -6
- package/src/__tests__/agent-loop-override-profile.test.ts +48 -50
- package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +4 -17
- package/src/__tests__/agent-loop-set-system-prompt.test.ts +3 -14
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +0 -4
- package/src/__tests__/agent-wake-override-profile.test.ts +40 -71
- package/src/__tests__/always-loaded-tools-guard.test.ts +4 -7
- package/src/__tests__/annotate-activity-metadata.test.ts +4 -31
- package/src/__tests__/annotate-risk-options.test.ts +4 -31
- package/src/__tests__/anthropic-provider.test.ts +11 -0
- package/src/__tests__/app-asset-bytes.test.ts +72 -0
- package/src/__tests__/app-builder-tool-scripts.test.ts +0 -1
- package/src/__tests__/app-bundler.test.ts +4 -20
- package/src/__tests__/app-conversation-ids-backfill.test.ts +1 -8
- package/src/__tests__/app-executors.test.ts +2 -49
- package/src/__tests__/app-routes-csp.test.ts +126 -157
- package/src/__tests__/approval-cascade.test.ts +0 -82
- package/src/__tests__/approval-interception-trust-gates.test.ts +0 -7
- package/src/__tests__/approval-primitive.test.ts +1 -9
- package/src/__tests__/approval-routes-http.test.ts +5 -63
- package/src/__tests__/assistant-event-hub-machine-name.test.ts +1 -19
- package/src/__tests__/assistant-events-sse-hardening.test.ts +4 -21
- package/src/__tests__/attachment-stored-path-annotation.test.ts +1 -19
- package/src/__tests__/attachment-upload-trusted-source.test.ts +0 -13
- package/src/__tests__/attachments-store-heic-normalize.test.ts +0 -13
- package/src/__tests__/attachments-store.test.ts +5 -19
- package/src/__tests__/audit-log-rotation.test.ts +1 -9
- package/src/__tests__/auth-fallback-events-store.test.ts +43 -59
- package/src/__tests__/available-skills.test.ts +7 -15
- package/src/__tests__/avatar-e2e.test.ts +0 -19
- package/src/__tests__/avatar-generator.test.ts +0 -9
- package/src/__tests__/background-shell-bash.test.ts +0 -20
- package/src/__tests__/background-shell-host-bash.test.ts +0 -34
- package/src/__tests__/background-workers-disk-pressure.test.ts +1 -43
- package/src/__tests__/browser-fill-credential.test.ts +0 -7
- package/src/__tests__/browser-manager.test.ts +1 -8
- package/src/__tests__/browser-skill-endstate.test.ts +1 -5
- package/src/__tests__/btw-routes.test.ts +7 -30
- package/src/__tests__/build-persisted-content.test.ts +96 -29
- package/src/__tests__/bundle-scanner.test.ts +27 -1
- package/src/__tests__/call-controller.test.ts +96 -149
- package/src/__tests__/call-conversation-messages.test.ts +2 -9
- package/src/__tests__/call-domain.test.ts +21 -56
- package/src/__tests__/call-pointer-message-composer.test.ts +0 -8
- package/src/__tests__/call-pointer-messages.test.ts +1 -8
- package/src/__tests__/call-recovery.test.ts +4 -11
- package/src/__tests__/call-routes-http.test.ts +12 -47
- package/src/__tests__/call-site-routing-provider.test.ts +5 -16
- package/src/__tests__/call-start-guardian-guard.test.ts +0 -10
- package/src/__tests__/call-state.test.ts +1 -8
- package/src/__tests__/call-store.test.ts +4 -11
- package/src/__tests__/cancel-resolves-conversation-key.test.ts +0 -32
- package/src/__tests__/catalog-cache.test.ts +0 -8
- package/src/__tests__/catalog-files.test.ts +0 -8
- package/src/__tests__/catalog-install-normalize.test.ts +0 -7
- package/src/__tests__/ces-rpc-credential-backend.test.ts +0 -7
- package/src/__tests__/channel-approval-routes.test.ts +23 -34
- package/src/__tests__/channel-approvals.test.ts +0 -7
- package/src/__tests__/channel-delivery-store.test.ts +6 -17
- package/src/__tests__/channel-guardian.test.ts +0 -7
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +15 -20
- package/src/__tests__/channel-readiness-routes.test.ts +41 -67
- package/src/__tests__/channel-readiness-service.test.ts +13 -45
- package/src/__tests__/channel-readiness-slack-remote.test.ts +5 -22
- package/src/__tests__/channel-reply-delivery.test.ts +18 -5
- package/src/__tests__/channel-retry-sweep.test.ts +0 -7
- package/src/__tests__/chat-credential-redaction.test.ts +1395 -0
- package/src/__tests__/chat-reveal-guard-priming.test.ts +791 -0
- package/src/__tests__/checker.test.ts +0 -24
- package/src/__tests__/clawhub-files.test.ts +0 -8
- package/src/__tests__/clawhub.test.ts +0 -7
- package/src/__tests__/clear-all-lexical.test.ts +0 -6
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +3 -0
- package/src/__tests__/client-os-metadata-persistence.test.ts +0 -5
- package/src/__tests__/compaction-events.test.ts +26 -99
- package/src/__tests__/compaction-ledger-store.test.ts +1 -7
- package/src/__tests__/compaction-summary-head-persisted-count.test.ts +0 -27
- package/src/__tests__/compaction-trail-store.test.ts +1 -19
- package/src/__tests__/compaction.benchmark.test.ts +2 -6
- package/src/__tests__/compactor-call-site-logging.test.ts +0 -21
- package/src/__tests__/compactor-fixed-boundary.test.ts +0 -21
- package/src/__tests__/compactor-image-manifest-trust.test.ts +1 -10
- package/src/__tests__/compactor-low-watermark-cut.test.ts +0 -21
- package/src/__tests__/compactor-media-strip.test.ts +0 -21
- package/src/__tests__/compactor-preserved-tail-count.test.ts +0 -21
- package/src/__tests__/compactor-summary-call-truncation.test.ts +0 -21
- package/src/__tests__/compactor-web-search-strip.test.ts +0 -21
- package/src/__tests__/config-get-vision-flag.test.ts +24 -53
- package/src/__tests__/config-loader-backfill.test.ts +9 -25
- package/src/__tests__/config-loader-platform-defaults.test.ts +0 -21
- package/src/__tests__/config-schema-cmd.test.ts +10 -11
- package/src/__tests__/config-schema.test.ts +221 -275
- package/src/__tests__/config-set-route.test.ts +32 -62
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +44 -83
- package/src/__tests__/config-watcher-skill-reseed.test.ts +0 -16
- package/src/__tests__/config-watcher.test.ts +2 -17
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +57 -63
- package/src/__tests__/contact-store-interaction-info.test.ts +1 -8
- package/src/__tests__/contact-store-user-file.test.ts +1 -8
- package/src/__tests__/contacts-tools.test.ts +21 -26
- package/src/__tests__/contacts-write.test.ts +1 -8
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -6
- package/src/__tests__/context-window-manager-compact-retry.test.ts +0 -27
- package/src/__tests__/context-window-manager-overflow-rung.test.ts +0 -21
- package/src/__tests__/conversation-abort-tool-results.test.ts +9 -90
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +5 -41
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +16 -54
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +14 -79
- package/src/__tests__/conversation-agent-loop.test.ts +213 -136
- package/src/__tests__/conversation-app-control-instantiation.test.ts +10 -16
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +0 -43
- package/src/__tests__/conversation-attachments.test.ts +0 -17
- package/src/__tests__/conversation-attention-store.test.ts +1 -9
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -8
- package/src/__tests__/conversation-clear-safety.test.ts +20 -20
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -82
- package/src/__tests__/conversation-crud-enabled-plugins.test.ts +1 -7
- package/src/__tests__/conversation-crud-inference-profile.test.ts +1 -7
- package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -7
- package/src/__tests__/conversation-disk-view-integration.test.ts +1 -26
- package/src/__tests__/conversation-disk-view.test.ts +1 -26
- package/src/__tests__/conversation-enabledplugins-route.test.ts +3 -21
- package/src/__tests__/conversation-error.test.ts +21 -7
- package/src/__tests__/conversation-fork-crud.test.ts +35 -44
- package/src/__tests__/conversation-fork-retrospective.test.ts +9 -24
- package/src/__tests__/conversation-fork-route.test.ts +0 -32
- package/src/__tests__/conversation-history-web-search.test.ts +20 -17
- package/src/__tests__/conversation-inference-profile-list.test.ts +0 -17
- package/src/__tests__/conversation-inference-profile-route.test.ts +2 -24
- package/src/__tests__/conversation-init.benchmark.test.ts +3 -56
- package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -33
- package/src/__tests__/conversation-lifecycle.test.ts +63 -103
- package/src/__tests__/conversation-list-source.test.ts +0 -18
- package/src/__tests__/conversation-load-history-repair.test.ts +39 -91
- package/src/__tests__/conversation-load-history-stripped.test.ts +12 -57
- package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +10 -20
- package/src/__tests__/conversation-message-id-uuidv7.test.ts +1 -18
- package/src/__tests__/conversation-pairing.test.ts +0 -7
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +0 -9
- package/src/__tests__/conversation-process-callsite.test.ts +15 -97
- package/src/__tests__/conversation-provider-retry-repair.test.ts +3 -84
- package/src/__tests__/conversation-queue.test.ts +12 -108
- package/src/__tests__/conversation-routes-disk-view.test.ts +8 -60
- package/src/__tests__/conversation-routes-enabled-plugins.test.ts +5 -63
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +13 -22
- package/src/__tests__/conversation-routes-hidden-queue.test.ts +5 -64
- package/src/__tests__/conversation-routes-slash-commands.test.ts +19 -87
- package/src/__tests__/conversation-runtime-assembly.test.ts +34 -37
- package/src/__tests__/conversation-seed-composer.test.ts +3 -3
- package/src/__tests__/conversation-skill-tools.test.ts +19 -32
- package/src/__tests__/conversation-slash-queue.test.ts +3 -90
- package/src/__tests__/conversation-slash-unknown.test.ts +0 -87
- package/src/__tests__/conversation-speed-override.test.ts +19 -94
- package/src/__tests__/conversation-starter-routes.test.ts +0 -7
- package/src/__tests__/conversation-store.test.ts +72 -66
- package/src/__tests__/conversation-summarize-route.test.ts +0 -11
- package/src/__tests__/conversation-summarize-up-to.test.ts +4 -89
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +131 -0
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +36 -36
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +4 -2
- package/src/__tests__/conversation-title-service.test.ts +0 -7
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +0 -1
- package/src/__tests__/conversation-tool-setup-attribution.test.ts +37 -60
- package/src/__tests__/conversation-tool-setup-tools-disabled.test.ts +17 -17
- package/src/__tests__/conversation-unread-route.test.ts +0 -7
- package/src/__tests__/conversation-usage.test.ts +21 -71
- package/src/__tests__/conversation-wait-for-idle.test.ts +0 -82
- package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -45
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -88
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -88
- package/src/__tests__/conversations-defer-cli.test.ts +3 -0
- package/src/__tests__/conversations-import-system-filter.test.ts +0 -17
- package/src/__tests__/credential-broker-browser-fill.test.ts +0 -9
- package/src/__tests__/credential-broker-server-use.test.ts +0 -9
- package/src/__tests__/credential-health-service.test.ts +14 -31
- package/src/__tests__/credential-metadata-store.test.ts +0 -8
- package/src/__tests__/credential-prompt-route.test.ts +9 -15
- package/src/__tests__/credential-resolve.test.ts +0 -8
- package/src/__tests__/credential-routes.test.ts +250 -0
- package/src/__tests__/credential-security-invariants.test.ts +4 -8
- package/src/__tests__/credential-token-resolver.test.ts +0 -9
- package/src/__tests__/cross-provider-web-search.test.ts +12 -18
- package/src/__tests__/daemon-assistant-events.test.ts +1 -9
- package/src/__tests__/daemon-credential-client.test.ts +0 -7
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +1 -8
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +1 -7
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +0 -8
- package/src/__tests__/db-readiness-http-gate.test.ts +0 -18
- package/src/__tests__/db-rename-inference-profile-snake-case-migration.test.ts +1 -7
- package/src/__tests__/db-test-helpers.ts +10 -3
- package/src/__tests__/delete-managed-skill-tool.test.ts +0 -7
- package/src/__tests__/delete-propagation.test.ts +0 -7
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -7
- package/src/__tests__/device-id.test.ts +1 -9
- package/src/__tests__/disk-pressure-guard.test.ts +0 -4
- package/src/__tests__/disk-pressure-routes.test.ts +0 -4
- package/src/__tests__/disk-pressure-tools.test.ts +4 -42
- package/src/__tests__/dm-backfill.test.ts +0 -7
- package/src/__tests__/dm-persistence.test.ts +0 -5
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -8
- package/src/__tests__/drain-requeue-on-contention.test.ts +1 -8
- package/src/__tests__/dynamic-skill-background-guard.test.ts +0 -43
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -27
- package/src/__tests__/edit-propagation.test.ts +1 -8
- package/src/__tests__/email-invite-adapter.test.ts +8 -33
- package/src/__tests__/embedding-managed-proxy-selection.test.ts +0 -8
- package/src/__tests__/emit-event-signal.test.ts +1 -1
- package/src/__tests__/emit-signal-routing-intent.test.ts +0 -7
- package/src/__tests__/empty-state-greeting-cache.test.ts +9 -9
- package/src/__tests__/encrypted-store.test.ts +0 -9
- package/src/__tests__/ensure-conversation-exists.test.ts +1 -18
- package/src/__tests__/events-client-registration.test.ts +1 -19
- package/src/__tests__/events-dev-bypass-actor.test.ts +0 -7
- package/src/__tests__/events-tail-route.test.ts +1 -8
- package/src/__tests__/file-list-tool.test.ts +22 -15
- package/src/__tests__/followup-tools.test.ts +1 -16
- package/src/__tests__/gateway-only-enforcement.test.ts +3 -44
- package/src/__tests__/get-skill-detail-audit.test.ts +0 -7
- package/src/__tests__/google-calendar-watcher.test.ts +175 -0
- package/src/__tests__/guardian-action-sweep.test.ts +0 -7
- package/src/__tests__/guardian-binding-drift-heal.test.ts +0 -7
- package/src/__tests__/guardian-card-withdrawal.test.ts +60 -64
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +172 -135
- package/src/__tests__/guardian-dispatch.test.ts +58 -157
- package/src/__tests__/guardian-expiry-notifier.test.ts +56 -48
- package/src/__tests__/guardian-gateway-sim.ts +626 -0
- package/src/__tests__/guardian-outbound-http.test.ts +0 -7
- package/src/__tests__/guardian-routing-invariants.test.ts +229 -220
- package/src/__tests__/guardian-routing-state.test.ts +2 -9
- package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -17
- package/src/__tests__/guardian-wait-controller.test.ts +44 -43
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +26 -91
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +18 -103
- package/src/__tests__/headless-browser-interactions.test.ts +0 -7
- package/src/__tests__/headless-browser-mode.test.ts +0 -9
- package/src/__tests__/headless-browser-navigate.test.ts +0 -7
- package/src/__tests__/headless-browser-read-tools.test.ts +0 -7
- package/src/__tests__/headless-browser-snapshot.test.ts +0 -7
- package/src/__tests__/heartbeat-disk-pressure.test.ts +9 -38
- package/src/__tests__/heartbeat-service.test.ts +83 -106
- package/src/__tests__/helpers/channel-test-adapter.ts +10 -0
- package/src/__tests__/helpers/gateway-guardian-requests-store-bridge.ts +155 -0
- package/src/__tests__/helpers/set-config.ts +40 -0
- package/src/__tests__/host-bash-proxy.test.ts +18 -34
- package/src/__tests__/host-browser-proxy.test.ts +15 -20
- package/src/__tests__/host-shell-tool.test.ts +2 -34
- package/src/__tests__/http-conversation-lineage.test.ts +3 -19
- package/src/__tests__/http-user-message-parity.test.ts +3 -95
- package/src/__tests__/identity-routes.test.ts +1 -9
- package/src/__tests__/image-recovery-hook.test.ts +36 -0
- package/src/__tests__/inbound-admitted-introduction-nudge.test.ts +6 -12
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -7
- package/src/__tests__/inbound-slack-persistence.test.ts +0 -5
- package/src/__tests__/inbound-trust-verdict.test.ts +2 -8
- package/src/__tests__/inference-no-mode-boot-e2e.test.ts +52 -8
- package/src/__tests__/inference-profile-reaper.test.ts +1 -7
- package/src/__tests__/inference-profile-session-handler.test.ts +4 -30
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -20
- package/src/__tests__/ingress-url-consistency.test.ts +1 -23
- package/src/__tests__/injector-background-turn.test.ts +10 -24
- package/src/__tests__/injector-chain.test.ts +4 -13
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +19 -17
- package/src/__tests__/inline-command-runner.test.ts +0 -34
- package/src/__tests__/inline-skill-load-permissions.test.ts +1 -30
- package/src/__tests__/install-skill-routing.test.ts +7 -6
- package/src/__tests__/integration-status.test.ts +25 -17
- package/src/__tests__/intent-routing.test.ts +1 -50
- package/src/__tests__/internal-telemetry-routes.test.ts +41 -22
- package/src/__tests__/interrupted-turn-reconciler.test.ts +1 -8
- package/src/__tests__/introduction-card-resolver.test.ts +108 -117
- package/src/__tests__/invite-redeemed-ipc.test.ts +0 -7
- package/src/__tests__/invite-routes-http.test.ts +12 -23
- package/src/__tests__/jobs-store-has-pending-job.test.ts +59 -0
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +1 -14
- package/src/__tests__/jobs-store-skill-card-upsert.test.ts +191 -0
- package/src/__tests__/jobs-store-upsert-debounced.test.ts +1 -14
- package/src/__tests__/lexical-index-dual-write.test.ts +0 -6
- package/src/__tests__/list-all-apps.test.ts +200 -0
- package/src/__tests__/list-messages-attachments.test.ts +11 -20
- package/src/__tests__/list-messages-background-tool-completion.test.ts +6 -18
- package/src/__tests__/list-messages-client-message-id.test.ts +4 -16
- package/src/__tests__/list-messages-hidden-metadata.test.ts +6 -18
- package/src/__tests__/list-messages-page-latest.test.ts +3 -19
- package/src/__tests__/list-messages-queued.test.ts +1 -18
- package/src/__tests__/list-messages-tool-merge.test.ts +7 -18
- package/src/__tests__/llm-context-resolution.test.ts +32 -56
- package/src/__tests__/llm-context-route-provider.test.ts +1 -8
- package/src/__tests__/llm-request-log-agent-loop-exit-reason.test.ts +1 -19
- package/src/__tests__/llm-request-log-call-site.test.ts +1 -19
- package/src/__tests__/llm-request-log-clickhouse-routing.test.ts +114 -0
- package/src/__tests__/llm-request-log-clickhouse-writer-guards.test.ts +108 -0
- package/src/__tests__/llm-request-log-disabled-writes.test.ts +11 -30
- package/src/__tests__/llm-request-log-sink-clickhouse.test.ts +205 -0
- package/src/__tests__/llm-request-log-source-clickhouse.test.ts +1 -22
- package/src/__tests__/llm-request-log-source-factory.test.ts +23 -69
- package/src/__tests__/llm-request-log-turn-query.test.ts +1 -19
- package/src/__tests__/llm-resolver-override-or-default.test.ts +3 -52
- package/src/__tests__/llm-resolver.test.ts +342 -602
- package/src/__tests__/llm-schema.test.ts +79 -37
- package/src/__tests__/llm-usage-store.test.ts +1 -7
- package/src/__tests__/log-export-routes.test.ts +0 -7
- package/src/__tests__/log-export-workspace.test.ts +0 -7
- package/src/__tests__/managed-profile-guard.test.ts +125 -137
- package/src/__tests__/managed-skill-lifecycle.test.ts +6 -50
- package/src/__tests__/managed-speech-defaults.test.ts +138 -0
- package/src/__tests__/managed-store.test.ts +1 -16
- package/src/__tests__/mcp-auth-routes.test.ts +15 -26
- package/src/__tests__/mcp-config-secret-boundary.test.ts +49 -91
- package/src/__tests__/mcp-health-check.test.ts +14 -20
- package/src/__tests__/media-generate-image.test.ts +25 -32
- package/src/__tests__/media-stream-output.test.ts +0 -9
- package/src/__tests__/media-stream-server-integration.test.ts +19 -27
- package/src/__tests__/media-stream-stt-session.test.ts +16 -29
- package/src/__tests__/memory-jobs-worker-backoff.test.ts +6 -19
- package/src/__tests__/memory-jobs-worker-cleanup-cadence.test.ts +33 -12
- package/src/__tests__/memory-jobs-worker-lanes.test.ts +10 -29
- package/src/__tests__/memory-recall-log-store.test.ts +1 -19
- package/src/__tests__/memory-retrieval-hook.test.ts +0 -3
- package/src/__tests__/memory-upsert-concurrency.test.ts +12 -35
- package/src/__tests__/memory-v2-static-injector.test.ts +5 -17
- package/src/__tests__/messages-after-tiebreaker.test.ts +1 -7
- package/src/__tests__/messaging-send-tool.test.ts +67 -7
- package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -18
- package/src/__tests__/migration-export-http.test.ts +10 -23
- package/src/__tests__/migration-export-streaming.test.ts +0 -18
- package/src/__tests__/migration-export-to-gcs.test.ts +0 -19
- package/src/__tests__/migration-import-commit-http.test.ts +11 -23
- package/src/__tests__/migration-import-from-gcs.test.ts +0 -19
- package/src/__tests__/migration-import-from-url.test.ts +0 -19
- package/src/__tests__/migration-import-preflight-http.test.ts +10 -22
- package/src/__tests__/migration-jobs-status.test.ts +8 -23
- package/src/__tests__/migration-validate-http.test.ts +2 -19
- package/src/__tests__/mtime-cache.test.ts +116 -2
- package/src/__tests__/native-web-search.test.ts +0 -21
- package/src/__tests__/non-member-access-request.test.ts +102 -93
- package/src/__tests__/notification-broadcaster.test.ts +32 -21
- package/src/__tests__/notification-candidate-guardian-context.test.ts +36 -34
- package/src/__tests__/notification-decision-fallback.test.ts +0 -7
- package/src/__tests__/notification-decision-identity.test.ts +0 -7
- package/src/__tests__/notification-decision-recipient-context.test.ts +0 -7
- package/src/__tests__/notification-deep-link.test.ts +0 -7
- package/src/__tests__/notification-guardian-path.test.ts +48 -93
- package/src/__tests__/notification-platform-adapter.test.ts +0 -7
- package/src/__tests__/notification-routing-intent.test.ts +1 -9
- package/src/__tests__/notification-schedule-notify-dedup.test.ts +1 -9
- package/src/__tests__/notification-telegram-adapter.test.ts +0 -7
- package/src/__tests__/oauth-cli.test.ts +0 -19
- package/src/__tests__/oauth-commands-routes.test.ts +28 -43
- package/src/__tests__/oauth-connect-orchestrator.test.ts +17 -26
- package/src/__tests__/oauth-connect-routes.test.ts +19 -18
- package/src/__tests__/oauth-provider-profiles.test.ts +3 -9
- package/src/__tests__/oauth-provider-visibility.test.ts +0 -7
- package/src/__tests__/oauth-store.test.ts +0 -7
- package/src/__tests__/oauth2-gateway-transport.test.ts +41 -43
- package/src/__tests__/openai-responses-prompt-cache.test.ts +355 -0
- package/src/__tests__/openai-responses-provider.test.ts +98 -9
- package/src/__tests__/openrouter-responses-transport.test.ts +170 -0
- package/src/__tests__/outbound-slack-persistence.test.ts +13 -46
- package/src/__tests__/outlook-email-watcher.test.ts +0 -9
- package/src/__tests__/outlook-messaging-provider.test.ts +71 -0
- package/src/__tests__/path-policy.test.ts +0 -7
- package/src/__tests__/persist-media-references.test.ts +1 -6
- package/src/__tests__/persist-unsendable-image-downscale.test.ts +6 -3
- package/src/__tests__/persist-unsendable-image.test.ts +39 -7
- package/src/__tests__/persistence-secret-redaction.test.ts +7 -28
- package/src/__tests__/platform-bash-auto-approve.test.ts +0 -46
- package/src/__tests__/platform-callback-registration.test.ts +10 -9
- package/src/__tests__/platform-proxy-context.test.ts +0 -8
- package/src/__tests__/playbook-execution.test.ts +0 -14
- package/src/__tests__/playbook-tools.test.ts +0 -14
- package/src/__tests__/plugin-api-model-profiles.test.ts +12 -35
- package/src/__tests__/plugin-app-serve-routes.test.ts +315 -0
- package/src/__tests__/plugin-import-boundary-guard.test.ts +5 -3
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -2
- package/src/__tests__/plugin-types.test.ts +0 -7
- package/src/__tests__/prechat-onboarding-contract.test.ts +0 -27
- package/src/__tests__/pricing.test.ts +45 -0
- package/src/__tests__/process-message-background-slack.test.ts +7 -21
- package/src/__tests__/process-message-display-content.test.ts +37 -6
- package/src/__tests__/processing-flag-persist-failure.test.ts +0 -44
- package/src/__tests__/provider-commit-message-generator.test.ts +57 -63
- package/src/__tests__/provider-error-scenarios.test.ts +5 -6
- package/src/__tests__/provider-platform-proxy-integration.test.ts +21 -57
- package/src/__tests__/provider-registry-ollama.test.ts +8 -18
- package/src/__tests__/provider-send-message-override-profile.test.ts +28 -39
- package/src/__tests__/provider-streaming.benchmark.test.ts +1 -6
- package/src/__tests__/provider-usage-tracking.test.ts +13 -35
- package/src/__tests__/proxy-approval-callback.test.ts +0 -16
- package/src/__tests__/prune-old-conversations-job.test.ts +29 -21
- package/src/__tests__/prune-old-tool-invocations-job.test.ts +1 -9
- package/src/__tests__/public-ingress-urls.test.ts +1 -24
- package/src/__tests__/published-app-updater.test.ts +22 -16
- package/src/__tests__/qdrant-collection-migration.test.ts +0 -7
- package/src/__tests__/qdrant-manager.test.ts +0 -8
- package/src/__tests__/ratelimit.test.ts +1 -8
- package/src/__tests__/reaction-persistence.test.ts +18 -24
- package/src/__tests__/rebuild-index-graph-nodes.test.ts +0 -14
- package/src/__tests__/recording-handler.test.ts +0 -27
- package/src/__tests__/request-secret-standalone-channel-gate.test.ts +4 -16
- package/src/__tests__/require-fresh-approval.test.ts +0 -45
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +24 -36
- package/src/__tests__/retry-prompt-cache-key.test.ts +123 -0
- package/src/__tests__/retry-thinking-adaptive-only.test.ts +45 -61
- package/src/__tests__/retry-thinking-tool-choice.test.ts +60 -80
- package/src/__tests__/retry-verbosity-normalization.test.ts +27 -37
- package/src/__tests__/reveal-success-registry.test.ts +123 -0
- package/src/__tests__/run-conversation-turn-persistence.test.ts +113 -0
- package/src/__tests__/{scheduler-worker-standdown.test.ts → run-due-schedules.test.ts} +5 -77
- package/src/__tests__/runtime-attachment-metadata.test.ts +5 -18
- package/src/__tests__/runtime-events-sse-bilingual.test.ts +1 -19
- package/src/__tests__/runtime-events-sse-parity.test.ts +1 -20
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +1 -19
- package/src/__tests__/runtime-events-sse.test.ts +1 -20
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +306 -5
- package/src/__tests__/schedule-retry.test.ts +22 -23
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +18 -42
- package/src/__tests__/schedule-routes.test.ts +2 -150
- package/src/__tests__/schedule-store.test.ts +0 -8
- package/src/__tests__/schedule-tools.test.ts +1 -16
- package/src/__tests__/scheduler-disk-pressure.test.ts +0 -26
- package/src/__tests__/scheduler-recurrence.test.ts +43 -76
- package/src/__tests__/scheduler-reuse-conversation.test.ts +19 -35
- package/src/__tests__/scheduler-wake.test.ts +8 -24
- package/src/__tests__/scoped-approval-grants.test.ts +1 -9
- package/src/__tests__/scoped-grant-security-matrix.test.ts +1 -9
- package/src/__tests__/search-skills-unified.test.ts +0 -6
- package/src/__tests__/secret-allowlist.test.ts +1 -8
- package/src/__tests__/secret-fixtures.ts +9 -0
- package/src/__tests__/secret-ingress-channel.test.ts +4 -32
- package/src/__tests__/secret-ingress-cli.test.ts +3 -37
- package/src/__tests__/secret-ingress-http.test.ts +15 -78
- package/src/__tests__/secret-ingress.test.ts +14 -31
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +4 -10
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -9
- package/src/__tests__/secret-routes-platform-proxy.test.ts +3 -40
- package/src/__tests__/secure-keys-managed-failover.test.ts +0 -7
- package/src/__tests__/secure-keys.test.ts +0 -9
- package/src/__tests__/send-endpoint-busy.test.ts +47 -91
- package/src/__tests__/sequence-store.test.ts +0 -9
- package/src/__tests__/server-history-render.test.ts +29 -8
- package/src/__tests__/set-permission-mode.test.ts +8 -16
- package/src/__tests__/settings-routes.test.ts +0 -7
- package/src/__tests__/shell-credential-ref.test.ts +0 -18
- package/src/__tests__/shell-observability.test.ts +0 -21
- package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -34
- package/src/__tests__/skill-load-feature-flag.test.ts +0 -27
- package/src/__tests__/skill-load-inline-command.test.ts +0 -25
- package/src/__tests__/skill-load-inline-includes.test.ts +0 -25
- package/src/__tests__/skill-load-plugin-scope.test.ts +0 -24
- package/src/__tests__/skill-projection-feature-flag.test.ts +14 -33
- package/src/__tests__/skill-projection.benchmark.test.ts +14 -19
- package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -39
- package/src/__tests__/skills-file-content-endpoint.test.ts +0 -7
- package/src/__tests__/skills-files-catalog-fallback.test.ts +0 -14
- package/src/__tests__/slack-channel-config.test.ts +24 -79
- package/src/__tests__/slack-inbound-verification.test.ts +5 -13
- package/src/__tests__/{slack-reaction-canonical-approval.test.ts → slack-reaction-guardian-approval.test.ts} +18 -74
- package/src/__tests__/slack-share-routes.test.ts +0 -1
- package/src/__tests__/slim-skill-category.test.ts +0 -14
- package/src/__tests__/stale-approval-dedup.test.ts +0 -7
- package/src/__tests__/subagent-call-site-routing.test.ts +72 -111
- package/src/__tests__/subagent-detail.test.ts +1 -1
- package/src/__tests__/subagent-fork-prompt-role.test.ts +0 -12
- package/src/__tests__/subagent-notify-parent.test.ts +4 -6
- package/src/__tests__/subagent-spawn-and-await.test.ts +0 -18
- package/src/__tests__/subagent-tool-filtering.test.ts +21 -31
- package/src/__tests__/subagent-tool-gate-mode.test.ts +6 -32
- package/src/__tests__/subagent-tools.test.ts +92 -67
- package/src/__tests__/suggestion-routes.test.ts +28 -42
- package/src/__tests__/summarize-boundary.test.ts +2 -1
- package/src/__tests__/system-prompt-ask-mode.test.ts +0 -25
- package/src/__tests__/system-prompt.test.ts +0 -33
- package/src/__tests__/task-memory-cleanup.test.ts +18 -192
- package/src/__tests__/telegram-bot-username-resolution.test.ts +24 -48
- package/src/__tests__/telegram-config.test.ts +0 -8
- package/src/__tests__/telemetry-routes.test.ts +100 -0
- package/src/__tests__/telephony-credential-preflight.test.ts +7 -11
- package/src/__tests__/telephony-tts-guard.test.ts +38 -21
- package/src/__tests__/terminal-tools.test.ts +0 -21
- package/src/__tests__/thread-backfill.test.ts +0 -7
- package/src/__tests__/title-generate-hook.test.ts +11 -10
- package/src/__tests__/token-manager.test.ts +0 -9
- package/src/__tests__/tool-approval-handler.test.ts +0 -8
- package/src/__tests__/tool-execution-abort-cleanup.test.ts +5 -33
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +3 -23
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -48
- package/src/__tests__/tool-executor.test.ts +3 -49
- package/src/__tests__/tool-grant-request-escalation.test.ts +51 -153
- package/src/__tests__/tool-preview-lifecycle.test.ts +2 -29
- package/src/__tests__/tool-profiler.test.ts +72 -1
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +0 -29
- package/src/__tests__/tool-side-effects-slack-dm.test.ts +0 -1
- package/src/__tests__/tool-start-timestamp.test.ts +4 -31
- package/src/__tests__/tools-get-route.test.ts +2 -1
- package/src/__tests__/trust-context-guards.test.ts +19 -7
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +75 -79
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +14 -18
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -7
- package/src/__tests__/trusted-contact-verification.test.ts +1 -9
- package/src/__tests__/turn-boundary-resolution.test.ts +1 -19
- package/src/__tests__/turn-events-store.test.ts +1 -7
- package/src/__tests__/turn-outcome-read.test.ts +1 -7
- package/src/__tests__/twilio-config.test.ts +11 -28
- package/src/__tests__/twilio-provider.test.ts +2 -13
- package/src/__tests__/twilio-routes-twiml.test.ts +1 -8
- package/src/__tests__/twilio-routes.test.ts +52 -103
- package/src/__tests__/twilio-validation.test.ts +5 -22
- package/src/__tests__/ui-file-upload-surface.test.ts +6 -9
- package/src/__tests__/usage-attribution.test.ts +25 -56
- package/src/__tests__/usage-cache-backfill-migration.test.ts +8 -15
- package/src/__tests__/usage-routes.test.ts +1 -8
- package/src/__tests__/vbundle-pax-and-symlink.test.ts +0 -18
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +0 -24
- package/src/__tests__/vercel-config.test.ts +0 -7
- package/src/__tests__/verification-control-plane-policy.test.ts +0 -45
- package/src/__tests__/voice-approval-resolver-relay.test.ts +106 -75
- package/src/__tests__/voice-config-update.test.ts +114 -21
- package/src/__tests__/voice-ingress-preflight.test.ts +16 -15
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -30
- package/src/__tests__/voice-session-bridge-processing-wait.test.ts +1 -17
- package/src/__tests__/voice-session-bridge.test.ts +14 -46
- package/src/__tests__/web-search-backend-failure.test.ts +0 -21
- package/src/__tests__/whatsapp-invite-adapter.test.ts +11 -30
- package/src/__tests__/workspace-git-service.test.ts +801 -2
- package/src/__tests__/workspace-migration-009-backfill-conversation-disk-view.test.ts +1 -26
- package/src/__tests__/workspace-migration-013-repair-conversation-disk-view.test.ts +1 -26
- package/src/__tests__/workspace-migration-028-recover-conversations-from-disk-view.test.ts +1 -26
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +1 -9
- package/src/a2a/__tests__/task-store.test.ts +0 -9
- package/src/acp/__tests__/session-manager-persistence.test.ts +1 -8
- package/src/acp/__tests__/session-manager-resume.test.ts +0 -7
- package/src/acp/__tests__/session-manager-startup.test.ts +1 -8
- package/src/agent/image-optimize.ts +80 -0
- package/src/agent/loop.ts +20 -5
- package/src/api/events/open-conversation.test.ts +64 -0
- package/src/api/events/open-conversation.ts +33 -0
- package/src/api/index.ts +6 -0
- package/src/approvals/AGENTS.md +1 -1
- package/src/approvals/guardian-card-withdrawal.ts +26 -19
- package/src/approvals/guardian-decision-primitive.ts +172 -102
- package/src/approvals/guardian-expiry-notifier.ts +20 -19
- package/src/approvals/guardian-request-resolvers.ts +305 -275
- package/src/apps/app-store.ts +320 -15
- package/src/background-wake/background-wake-routes.test.ts +2 -3
- package/src/background-wake/next-wake.test.ts +23 -20
- package/src/background-wake/wake-intent-hooks.test.ts +0 -10
- package/src/bundler/app-bundler.ts +34 -48
- package/src/bundler/app-compiler.ts +39 -4
- package/src/bundler/bundle-scanner.ts +13 -0
- package/src/bundler/manifest.ts +1 -1
- package/src/calls/__tests__/call-setup-router.test.ts +84 -88
- package/src/calls/__tests__/fish-audio-client.test.ts +6 -11
- package/src/calls/__tests__/voice-control-protocol.test.ts +47 -0
- package/src/calls/__tests__/voice-session-bridge.test.ts +151 -16
- package/src/calls/__tests__/voice-triage-escalate.test.ts +128 -0
- package/src/calls/access-request-wait.ts +35 -35
- package/src/calls/call-controller.ts +48 -45
- package/src/calls/call-setup-flow.ts +2 -2
- package/src/calls/call-setup-router.ts +1 -24
- package/src/calls/guardian-dispatch.ts +47 -30
- package/src/calls/guardian-wait-controller.ts +31 -18
- package/src/calls/media-turn-detector.ts +11 -1
- package/src/calls/telephony-credential-preflight.ts +19 -1
- package/src/calls/telephony-tts-capability.ts +18 -1
- package/src/calls/voice-control-protocol.ts +12 -0
- package/src/calls/voice-session-bridge.ts +110 -15
- package/src/calls/voice-triage-escalate.ts +136 -0
- package/src/channels/__tests__/gateway-guardian-requests.test.ts +669 -0
- package/src/channels/gateway-guardian-requests.ts +410 -0
- package/src/channels/types.ts +10 -5
- package/src/cli/AGENTS.md +77 -51
- package/src/cli/__tests__/cli-command-help-coverage.test.ts +29 -0
- package/src/cli/commands/__tests__/conversations-import.test.ts +23 -24
- package/src/cli/commands/__tests__/gateway.test.ts +55 -0
- package/src/cli/commands/__tests__/inference-models.test.ts +3 -0
- package/src/cli/commands/__tests__/inference-profiles.test.ts +3 -0
- package/src/cli/commands/__tests__/inference-providers.test.ts +3 -0
- package/src/cli/commands/__tests__/inference-send.test.ts +0 -10
- package/src/cli/commands/__tests__/inference-session.test.ts +4 -11
- package/src/cli/commands/__tests__/ui.test.ts +2 -2
- package/src/cli/commands/apps.help.ts +46 -0
- package/src/cli/commands/apps.ts +51 -0
- package/src/cli/commands/avatar.help.ts +229 -0
- package/src/cli/commands/avatar.ts +58 -250
- package/src/cli/commands/backup.help.ts +183 -0
- package/src/cli/commands/backup.ts +107 -276
- package/src/cli/commands/bash.help.ts +38 -0
- package/src/cli/commands/bash.ts +51 -75
- package/src/cli/commands/browser.help.ts +193 -0
- package/src/cli/commands/browser.ts +234 -347
- package/src/cli/commands/cache.help.ts +123 -0
- package/src/cli/commands/cache.ts +72 -166
- package/src/cli/commands/changelog.help.ts +59 -0
- package/src/cli/commands/changelog.ts +29 -61
- package/src/cli/commands/channel-verification-sessions.help.ts +178 -0
- package/src/cli/commands/channel-verification-sessions.ts +71 -226
- package/src/cli/commands/channels/index.help.ts +67 -0
- package/src/cli/commands/channels/index.ts +55 -105
- package/src/cli/commands/clients.help.ts +72 -0
- package/src/cli/commands/clients.ts +100 -153
- package/src/cli/commands/completions.help.ts +33 -0
- package/src/cli/commands/completions.ts +43 -66
- package/src/cli/commands/config.help.ts +126 -0
- package/src/cli/commands/config.ts +59 -174
- package/src/cli/commands/contacts.help.ts +327 -0
- package/src/cli/commands/contacts.ts +318 -603
- package/src/cli/commands/conversations-defer.ts +141 -202
- package/src/cli/commands/conversations-import.ts +80 -113
- package/src/cli/commands/conversations.help.ts +364 -0
- package/src/cli/commands/conversations.ts +143 -328
- package/src/cli/commands/credentials.help.ts +290 -0
- package/src/cli/commands/credentials.ts +271 -487
- package/src/cli/commands/db/index.help.ts +27 -0
- package/src/cli/commands/db/index.ts +7 -3
- package/src/cli/commands/db/refresh.ts +131 -0
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +19 -9
- package/src/cli/commands/db/repair.ts +41 -43
- package/src/cli/commands/db/status.ts +79 -83
- package/src/cli/commands/domain.help.ts +34 -0
- package/src/cli/commands/domain.ts +10 -15
- package/src/cli/commands/email.help.ts +176 -0
- package/src/cli/commands/email.ts +323 -412
- package/src/cli/commands/gateway.help.ts +115 -0
- package/src/cli/commands/gateway.ts +105 -123
- package/src/cli/commands/image-generation.help.ts +72 -0
- package/src/cli/commands/image-generation.ts +13 -62
- package/src/cli/commands/inference-callsites.ts +34 -49
- package/src/cli/commands/inference-models.ts +6 -21
- package/src/cli/commands/inference-profiles.ts +95 -156
- package/src/cli/commands/inference-providers-default.ts +27 -42
- package/src/cli/commands/inference-providers.ts +25 -87
- package/src/cli/commands/inference-session.ts +189 -249
- package/src/cli/commands/inference.help.ts +485 -0
- package/src/cli/commands/inference.ts +104 -165
- package/src/cli/commands/keys.help.ts +46 -0
- package/src/cli/commands/keys.ts +37 -71
- package/src/cli/commands/mcp.help.ts +167 -0
- package/src/cli/commands/mcp.ts +123 -267
- package/src/cli/commands/memory/__tests__/memory-items.test.ts +4 -0
- package/src/cli/commands/memory/__tests__/memory-v2.test.ts +4 -0
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +4 -0
- package/src/cli/commands/memory/__tests__/worker.test.ts +12 -5
- package/src/cli/commands/memory/index.help.ts +814 -0
- package/src/cli/commands/memory/index.ts +5 -27
- package/src/cli/commands/memory/items.ts +257 -404
- package/src/cli/commands/memory/memory-retrospective.ts +31 -71
- package/src/cli/commands/memory/memory-v2-compare-render.ts +2 -2
- package/src/cli/commands/memory/memory-v2.ts +435 -646
- package/src/cli/commands/memory/memory-v3.ts +158 -283
- package/src/cli/commands/memory/nodes.ts +154 -249
- package/src/cli/commands/memory/worker.ts +83 -128
- package/src/cli/commands/monitoring.help.ts +57 -0
- package/src/cli/commands/monitoring.ts +17 -41
- package/src/cli/commands/notifications.help.ts +293 -0
- package/src/cli/commands/notifications.ts +420 -657
- package/src/cli/commands/oauth/apps.ts +182 -315
- package/src/cli/commands/oauth/connect.ts +4 -35
- package/src/cli/commands/oauth/disconnect.ts +44 -71
- package/src/cli/commands/oauth/index.help.ts +855 -0
- package/src/cli/commands/oauth/index.ts +5 -31
- package/src/cli/commands/oauth/mode.ts +5 -28
- package/src/cli/commands/oauth/ping.ts +44 -66
- package/src/cli/commands/oauth/providers.ts +413 -772
- package/src/cli/commands/oauth/request.ts +6 -35
- package/src/cli/commands/oauth/shared.ts +1 -1
- package/src/cli/commands/oauth/status.test.ts +6 -6
- package/src/cli/commands/oauth/status.ts +45 -62
- package/src/cli/commands/oauth/token.ts +32 -71
- package/src/cli/commands/pending.help.ts +26 -0
- package/src/cli/commands/pending.ts +77 -78
- package/src/cli/commands/platform/__tests__/connect.test.ts +3 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +4 -4
- package/src/cli/commands/platform/__tests__/status.test.ts +0 -90
- package/src/cli/commands/platform/connect.ts +10 -21
- package/src/cli/commands/platform/disconnect.ts +11 -26
- package/src/cli/commands/platform/index.help.ts +187 -0
- package/src/cli/commands/platform/index.ts +22 -169
- package/src/cli/commands/plugins.help.ts +247 -0
- package/src/cli/commands/plugins.ts +356 -437
- package/src/cli/commands/ps.help.ts +26 -0
- package/src/cli/commands/ps.ts +5 -17
- package/src/cli/commands/routes.help.ts +72 -0
- package/src/cli/commands/routes.ts +78 -125
- package/src/cli/commands/schedules-worker.ts +70 -138
- package/src/cli/commands/schedules.help.ts +514 -0
- package/src/cli/commands/schedules.ts +494 -871
- package/src/cli/commands/sequence.help.ts +183 -0
- package/src/cli/commands/sequence.ts +181 -343
- package/src/cli/commands/skills.help.ts +159 -0
- package/src/cli/commands/skills.ts +230 -368
- package/src/cli/commands/status.help.ts +32 -0
- package/src/cli/commands/status.ts +38 -3
- package/src/cli/commands/stt.help.ts +52 -0
- package/src/cli/commands/stt.ts +9 -47
- package/src/cli/commands/telemetry.help.ts +14 -0
- package/src/cli/commands/telemetry.ts +19 -17
- package/src/cli/commands/tools-run.ts +30 -45
- package/src/cli/commands/tools.help.ts +81 -0
- package/src/cli/commands/tools.ts +43 -83
- package/src/cli/commands/trust.help.ts +43 -0
- package/src/cli/commands/trust.ts +82 -109
- package/src/cli/commands/tts.help.ts +88 -0
- package/src/cli/commands/tts.ts +116 -188
- package/src/cli/commands/ui.help.ts +213 -0
- package/src/cli/commands/ui.ts +363 -380
- package/src/cli/commands/usage.help.ts +147 -0
- package/src/cli/commands/usage.ts +87 -206
- package/src/cli/commands/watchers.help.ts +211 -0
- package/src/cli/commands/watchers.ts +261 -417
- package/src/cli/commands/webhooks.help.ts +95 -0
- package/src/cli/commands/webhooks.ts +44 -115
- package/src/cli/index.help.ts +91 -0
- package/src/cli/lib/__tests__/global-json-option.test.ts +97 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +144 -4
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +96 -132
- package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +65 -0
- package/src/cli/lib/__tests__/plugin-catalog-platform.test.ts +167 -0
- package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +197 -0
- package/src/cli/lib/__tests__/plugin-details.test.ts +349 -240
- package/src/cli/lib/__tests__/plugin-fingerprint.test.ts +31 -0
- package/src/cli/lib/__tests__/plugin-icon-file.test.ts +50 -1
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +94 -0
- package/src/cli/lib/__tests__/plugins-install-offline.test.ts +147 -0
- package/src/cli/lib/__tests__/search-plugins.test.ts +193 -309
- package/src/cli/lib/bundled-marketplace.json +439 -0
- package/src/cli/lib/cli-command-help.ts +83 -10
- package/src/cli/lib/global-json-option.ts +41 -0
- package/src/cli/lib/install-from-github.ts +69 -2
- package/src/cli/lib/plugin-catalog-cache.ts +22 -50
- package/src/cli/lib/plugin-catalog-local.ts +71 -0
- package/src/cli/lib/plugin-catalog-platform.ts +117 -0
- package/src/cli/lib/plugin-catalog-resolve.ts +72 -0
- package/src/cli/lib/plugin-details.ts +100 -34
- package/src/cli/lib/plugin-fingerprint.ts +18 -7
- package/src/cli/lib/plugin-icon-file.ts +38 -26
- package/src/cli/lib/plugin-marketplace.ts +15 -2
- package/src/cli/lib/publish-plugin.ts +3 -3
- package/src/cli/lib/search-plugins.ts +48 -111
- package/src/cli/program.ts +7 -0
- package/src/cli.ts +22 -13
- package/src/config/__tests__/default-profile-catalog.test.ts +8 -12
- package/src/config/__tests__/default-provider.test.ts +0 -21
- package/src/config/__tests__/deployment-context-defaults.test.ts +0 -21
- package/src/config/__tests__/feature-flag-registry-bundled.test.ts +2 -2
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +0 -21
- package/src/config/__tests__/loader-last-known-good.test.ts +0 -21
- package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +0 -21
- package/src/config/__tests__/platform-rehydration.test.ts +125 -0
- package/src/config/__tests__/profile-materialization.test.ts +1 -88
- package/src/config/__tests__/seed-default-provider.test.ts +0 -21
- package/src/config/__tests__/sync-gated-profiles.test.ts +0 -21
- package/src/config/bundled-skills/app-builder/SKILL.md +24 -1
- package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +30 -0
- package/src/config/bundled-skills/contacts/SKILL.md +1 -1
- package/src/config/bundled-skills/contacts/tools/contact-merge.ts +4 -2
- package/src/config/bundled-skills/messaging/TOOLS.json +2 -2
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +28 -20
- package/src/config/bundled-skills/phone-calls/references/CONFIG.md +7 -7
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +3 -3
- package/src/config/bundled-skills/schedule/SKILL.md +0 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +2 -2
- package/src/config/bundled-skills/settings/TOOLS.json +5 -3
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +84 -10
- package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +0 -7
- package/src/config/call-site-defaults.ts +3 -3
- package/src/config/feature-flag-registry.json +15 -63
- package/src/config/llm-resolver.ts +88 -475
- package/src/config/managed-speech-defaults.ts +115 -0
- package/src/config/platform-rehydration.ts +76 -0
- package/src/config/profile-materialization.ts +11 -11
- package/src/config/schema.ts +93 -129
- package/src/config/schemas/__tests__/live-voice.test.ts +24 -6
- package/src/config/schemas/__tests__/stt.test.ts +37 -0
- package/src/config/schemas/live-voice.ts +10 -4
- package/src/config/schemas/llm.ts +51 -15
- package/src/config/schemas/memory-lifecycle.ts +1 -13
- package/src/config/schemas/memory-retrospective.ts +8 -0
- package/src/config/schemas/memory.ts +0 -4
- package/src/config/schemas/stt.ts +33 -6
- package/src/config/schemas/tts.ts +53 -6
- package/src/config/schemas/workspace-git.ts +8 -0
- package/src/contacts/contact-store.ts +3 -58
- package/src/contacts/types.ts +1 -1
- package/src/conversations/__tests__/message-consolidation.test.ts +6 -5
- package/src/conversations/message-consolidation.ts +34 -112
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +64 -7
- package/src/daemon/__tests__/conversation-tool-setup-plugin-scope.test.ts +3 -7
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +8 -6
- package/src/daemon/__tests__/embedding-reconcile.test.ts +0 -11
- package/src/daemon/__tests__/inference-profile-notification.test.ts +5 -11
- package/src/daemon/__tests__/inflight-message-content.test.ts +219 -0
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -27
- package/src/daemon/__tests__/route-conversation-post.test.ts +158 -0
- package/src/daemon/__tests__/wake-conversation-ops-completion.test.ts +0 -6
- package/src/daemon/__tests__/web-search-status-text.test.ts +0 -29
- package/src/daemon/app-source-watcher.ts +17 -23
- package/src/daemon/chat-credential-redaction.ts +1365 -0
- package/src/daemon/conversation-agent-loop-handlers.ts +742 -77
- package/src/daemon/conversation-agent-loop.ts +10 -17
- package/src/daemon/conversation-error.ts +53 -16
- package/src/daemon/conversation-history.ts +6 -12
- package/src/daemon/conversation-messaging.ts +13 -1
- package/src/daemon/conversation-process.ts +16 -11
- package/src/daemon/conversation-runtime-assembly.ts +148 -52
- package/src/daemon/conversation-surfaces.ts +217 -100
- package/src/daemon/conversation-tool-setup.ts +59 -112
- package/src/daemon/conversation-turn-finalize.ts +18 -0
- package/src/daemon/conversation.ts +35 -66
- package/src/daemon/event-loop-watchdog.test.ts +1 -6
- package/src/daemon/external-plugins-bootstrap.ts +20 -74
- package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +0 -7
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +1 -8
- package/src/daemon/handlers/__tests__/config-a2a-invite.test.ts +1 -8
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +1 -8
- package/src/daemon/handlers/__tests__/config-a2a.test.ts +1 -8
- package/src/daemon/handlers/conversation-history.ts +6 -4
- package/src/daemon/handlers/conversations.ts +19 -9
- package/src/daemon/handlers/shared.ts +24 -1
- package/src/daemon/inflight-message-content.ts +228 -0
- package/src/daemon/lifecycle.ts +21 -31
- package/src/daemon/message-protocol.ts +2 -7
- package/src/daemon/message-provenance.ts +17 -8
- package/src/daemon/message-types/conversations.ts +6 -17
- package/src/daemon/message-types/host-ui-snapshot.ts +44 -0
- package/src/daemon/message-types/inbox.ts +3 -46
- package/src/daemon/orphan-reaper.test.ts +1 -6
- package/src/daemon/process-message.ts +9 -0
- package/src/daemon/providers-setup.ts +5 -75
- package/src/daemon/route-conversation-post.ts +158 -0
- package/src/daemon/shutdown-handlers.ts +11 -17
- package/src/daemon/sqlite-corruption-watchdog.test.ts +0 -6
- package/src/documents/document-comments-store.test.ts +1 -7
- package/src/export/__tests__/transcript-formatter.test.ts +8 -8
- package/src/export/formatter.ts +8 -17
- package/src/export/transcript-formatter.ts +4 -1
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +0 -9
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +29 -57
- package/src/home/__tests__/home-content-refresh.test.ts +0 -7
- package/src/home/__tests__/suggested-prompts.test.ts +0 -11
- package/src/ipc/__tests__/contacts-info-ipc.test.ts +12 -10
- package/src/ipc/__tests__/email-ipc.test.ts +90 -0
- package/src/ipc/assistant-server.ts +10 -22
- package/src/ipc/routes/__tests__/guardian-label-ipc-routes.test.ts +74 -0
- package/src/ipc/routes/__tests__/invite-ipc-routes.test.ts +0 -7
- package/src/ipc/routes/guardian-label-ipc-routes.ts +42 -0
- package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -8
- package/src/live-voice/__tests__/live-voice-credential-preflight.test.ts +89 -49
- package/src/live-voice/__tests__/live-voice-integration.test.ts +116 -2
- package/src/live-voice/__tests__/live-voice-resume-registry.test.ts +58 -0
- package/src/live-voice/__tests__/live-voice-resume-turn.test.ts +280 -0
- package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +337 -0
- package/src/live-voice/__tests__/live-voice-tts.test.ts +0 -4
- package/src/live-voice/__tests__/live-voice-vad.test.ts +432 -12
- package/src/live-voice/__tests__/protocol.test.ts +122 -0
- package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -41
- package/src/live-voice/live-voice-credential-preflight.ts +27 -3
- package/src/live-voice/live-voice-resume-registry.ts +54 -0
- package/src/live-voice/live-voice-session.ts +602 -61
- package/src/live-voice/protocol.ts +143 -1
- package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +3 -7
- package/src/messaging/provider-types.ts +9 -0
- package/src/messaging/providers/a2a/__tests__/deliver.test.ts +0 -9
- package/src/messaging/providers/outlook/adapter.ts +17 -2
- package/src/messaging/providers/outlook/client.ts +11 -2
- package/src/messaging/providers/outlook/types.ts +9 -0
- package/src/messaging/providers/slack/__tests__/download.test.ts +1 -8
- package/src/messaging/providers/slack/binding-metadata.test.ts +23 -21
- package/src/messaging/providers/slack/send.test.ts +0 -7
- package/src/messaging/providers/slack/withdraw.test.ts +0 -6
- package/src/messaging/providers/telegram-bot/send.test.ts +0 -7
- package/src/monitoring/__tests__/plugin-source-watch.test.ts +40 -1
- package/src/monitoring/plugin-source-watch.ts +56 -62
- package/src/monitoring/recovery/__tests__/inflight-content.test.ts +166 -0
- package/src/monitoring/recovery/inflight-content.ts +260 -0
- package/src/monitoring/recovery/run-recovery.ts +72 -0
- package/src/monitoring/worker.ts +68 -7
- package/src/notifications/AGENTS.md +1 -1
- package/src/notifications/README.md +4 -4
- package/src/notifications/__tests__/broadcaster.test.ts +4 -17
- package/src/notifications/__tests__/connected-channels.test.ts +11 -8
- package/src/notifications/__tests__/decision-engine.test.ts +0 -7
- package/src/notifications/__tests__/destination-resolver.test.ts +18 -12
- package/src/notifications/__tests__/deterministic-checks.test.ts +1 -9
- package/src/notifications/adapters/macos.ts +3 -5
- package/src/notifications/adapters/platform.ts +1 -1
- package/src/notifications/broadcaster.ts +13 -4
- package/src/notifications/conversation-candidates.ts +21 -28
- package/src/notifications/copy-composer.ts +0 -6
- package/src/notifications/decision-engine.ts +1 -1
- package/src/notifications/{canonical-delivery-recorder.ts → guardian-delivery-recorder.ts} +47 -33
- package/src/notifications/home-feed-side-effect.ts +0 -2
- package/src/notifications/signal.ts +0 -4
- package/src/oauth/byo-connection.test.ts +0 -9
- package/src/oauth/connection-resolver.test.ts +18 -46
- package/src/oauth/seed-providers.ts +6 -0
- package/src/onboarding/__tests__/onboarding-events-store.test.ts +122 -44
- package/src/onboarding/onboarding-events-store.ts +67 -115
- package/src/onboarding/onboarding-research-events-store.test.ts +222 -0
- package/src/onboarding/onboarding-research-events-store.ts +92 -0
- package/src/permissions/checker.test.ts +10 -24
- package/src/permissions/confirmation-guardian-request.test.ts +94 -0
- package/src/permissions/{confirmation-canonical-request.ts → confirmation-guardian-request.ts} +44 -29
- package/src/permissions/gateway-threshold-reader.test.ts +0 -8
- package/src/permissions/prompter.ts +6 -4
- package/src/permissions/question-prompter.test.ts +7 -14
- package/src/persistence/__tests__/bulk-write-gate.test.ts +1 -7
- package/src/persistence/__tests__/conversation-queries-search.test.ts +0 -7
- package/src/persistence/__tests__/main-db-readonly-probe.ts +80 -0
- package/src/persistence/__tests__/main-db-readonly.test.ts +35 -0
- package/src/persistence/__tests__/message-content-file.test.ts +161 -52
- package/src/persistence/__tests__/raw-query-telemetry.test.ts +74 -0
- package/src/persistence/conversation-crud.ts +175 -45
- package/src/persistence/conversation-disk-view.ts +32 -15
- package/src/persistence/conversation-group-migration.test.ts +1 -8
- package/src/persistence/conversation-title-service.ts +59 -22
- package/src/persistence/db-connection.ts +46 -1
- package/src/persistence/db-singleton.ts +7 -1
- package/src/persistence/embeddings/__tests__/messages-lexical-index.test.ts +3 -7
- package/src/persistence/embeddings/messages-lexical-index.ts +11 -0
- package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +0 -7
- package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +0 -6
- package/src/persistence/job-handlers/__tests__/message-lexical.test.ts +0 -7
- package/src/persistence/job-handlers/cleanup.ts +30 -16
- package/src/persistence/job-handlers/message-lexical-backfill.ts +8 -5
- package/src/persistence/job-handlers/message-lexical.ts +2 -2
- package/src/persistence/jobs-store.ts +123 -17
- package/src/persistence/lifecycle-events-store.test.ts +84 -0
- package/src/persistence/lifecycle-events-store.ts +27 -52
- package/src/persistence/llm-request-log-sink-clickhouse.ts +325 -0
- package/src/persistence/llm-request-log-store.ts +185 -106
- package/src/persistence/llm-request-log-writer-types.ts +80 -0
- package/src/persistence/llm-usage-store.ts +5 -2
- package/src/persistence/message-content-file.ts +182 -71
- package/src/persistence/message-content.ts +18 -10
- package/src/persistence/migrations/305-drop-contact-acl-columns.ts +3 -2
- package/src/persistence/migrations/325-create-config-setting-events.ts +40 -0
- package/src/persistence/migrations/326-move-injection-events-to-memory-db.ts +104 -0
- package/src/persistence/migrations/327-create-flush-checkpoints.ts +86 -0
- package/src/persistence/migrations/328-drop-memory-v3-learned-edge-tables.ts +16 -0
- package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.test.ts +179 -0
- package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.ts +119 -0
- package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.test.ts +197 -0
- package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.ts +108 -0
- package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.test.ts +159 -0
- package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.ts +97 -0
- package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.test.ts +219 -0
- package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.ts +128 -0
- package/src/persistence/migrations/333-create-telemetry-events-table.test.ts +66 -0
- package/src/persistence/migrations/333-create-telemetry-events-table.ts +43 -0
- package/src/persistence/migrations/334-backfill-telemetry-events-outbox.test.ts +584 -0
- package/src/persistence/migrations/334-backfill-telemetry-events-outbox.ts +386 -0
- package/src/persistence/migrations/335-collapse-memory-embed-backlog.test.ts +181 -0
- package/src/persistence/migrations/335-collapse-memory-embed-backlog.ts +177 -0
- package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +124 -0
- package/src/persistence/raw-query.ts +27 -1
- package/src/persistence/schema/calls.ts +0 -23
- package/src/persistence/schema/conversation-starters.ts +31 -0
- package/src/persistence/schema/conversations.ts +3 -3
- package/src/persistence/schema/guardian.ts +0 -150
- package/src/persistence/schema/index.ts +1 -0
- package/src/persistence/schema/infrastructure.ts +25 -72
- package/src/persistence/schema/memory-core.ts +0 -25
- package/src/persistence/schema/memory-injection.ts +3 -1
- package/src/persistence/schema/tasks.ts +1 -60
- package/src/persistence/steps.ts +22 -0
- package/src/platform/client.test.ts +110 -0
- package/src/platform/client.ts +24 -4
- package/src/platform/consent-cache.test.ts +5 -18
- package/src/platform/consent-cache.ts +8 -6
- package/src/platform/managed-speech.test.ts +218 -0
- package/src/platform/managed-speech.ts +204 -0
- package/src/plugin-api/conversation-turn.ts +250 -0
- package/src/plugin-api/index.ts +21 -0
- package/src/plugin-api/model-profiles.test.ts +29 -28
- package/src/plugin-api/vision-support.test.ts +25 -38
- package/src/plugin-api/vision-support.ts +26 -17
- package/src/plugins/AGENTS.md +8 -0
- package/src/plugins/__tests__/source-fingerprint.test.ts +41 -0
- package/src/plugins/collect-source-versions.ts +77 -0
- package/src/plugins/defaults/image-recovery/detect.ts +32 -10
- package/src/plugins/defaults/image-recovery/hooks/post-model-call.ts +20 -18
- package/src/plugins/defaults/image-recovery/recover.ts +86 -59
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +1 -8
- package/src/plugins/defaults/memory/__tests__/clear-stale-processing-flags.test.ts +1 -8
- package/src/plugins/defaults/memory/__tests__/conversation-queries.test.ts +1 -8
- package/src/plugins/defaults/memory/__tests__/conversation-row-batch-delete.test.ts +7 -18
- package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +22 -18
- package/src/plugins/defaults/memory/__tests__/embedding-cache.test.ts +0 -6
- package/src/plugins/defaults/memory/__tests__/find-most-recent-retrospective-for.test.ts +1 -8
- package/src/plugins/defaults/memory/__tests__/fork-message-copy.test.ts +7 -18
- package/src/plugins/defaults/memory/__tests__/jobs-store-enqueue-gate.test.ts +29 -39
- package/src/plugins/defaults/memory/__tests__/jobs-worker-memory-disabled.test.ts +11 -26
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +3 -22
- package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +215 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +0 -7
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +114 -16
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-prompt.test.ts +180 -0
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +153 -519
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +0 -7
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +6 -17
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-trigger-check.test.ts +0 -7
- package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -19
- package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +0 -18
- package/src/plugins/defaults/memory/__tests__/shutdown-hook.test.ts +8 -7
- package/src/plugins/defaults/memory/__tests__/table-relocation.test.ts +49 -0
- package/src/{persistence → plugins/defaults/memory}/__tests__/worker-control.test.ts +8 -10
- package/src/plugins/defaults/memory/graph/capability-seed.ts +4 -6
- package/src/plugins/defaults/memory/graph/extraction.ts +5 -1
- package/src/plugins/defaults/memory/graph/graph-search.test.ts +2 -8
- package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +0 -6
- package/src/plugins/defaults/memory/graph/tool-handlers.ts +2 -2
- package/src/plugins/defaults/memory/graph/tools.ts +47 -13
- package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +81 -2
- package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +67 -32
- package/src/plugins/defaults/memory/hooks/shutdown.ts +8 -11
- package/src/plugins/defaults/memory/indexer.ts +2 -1
- package/src/plugins/defaults/memory/job-handlers/backfill.ts +8 -5
- package/src/plugins/defaults/memory/job-handlers/embedding.test.ts +0 -7
- package/src/plugins/defaults/memory/job-handlers/embedding.ts +2 -2
- package/src/plugins/defaults/memory/job-handlers/index-maintenance.ts +7 -2
- package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +73 -8
- package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +5 -3
- package/src/plugins/defaults/memory/jobs/embed-pkb-file.test.ts +0 -13
- package/src/plugins/defaults/memory/jobs-worker.ts +139 -107
- package/src/plugins/defaults/memory/memory-db.ts +27 -0
- package/src/plugins/defaults/memory/memory-retrospective-constants.ts +4 -4
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +56 -180
- package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +216 -0
- package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +122 -202
- package/src/plugins/defaults/memory/message-media.ts +2 -2
- package/src/plugins/defaults/memory/paths.ts +3 -2
- package/src/plugins/defaults/memory/pkb/pkb-index.test.ts +0 -12
- package/src/plugins/defaults/memory/pkb/pkb-reconcile.test.ts +0 -9
- package/src/plugins/defaults/memory/pkb/pkb-search.test.ts +0 -6
- package/src/plugins/defaults/memory/routes/__tests__/memory-v2-simulate-route.test.ts +15 -92
- package/src/plugins/defaults/memory/routes/__tests__/memory-worker-routes.test.ts +201 -0
- package/src/plugins/defaults/memory/routes/memory-item-routes.test.ts +7 -21
- package/src/plugins/defaults/memory/routes/memory-v2-routes.ts +3 -8
- package/src/plugins/defaults/memory/routes/memory-worker-routes.ts +162 -0
- package/src/plugins/defaults/memory/startup.ts +6 -7
- package/src/plugins/defaults/memory/task-memory-cleanup.ts +11 -22
- package/src/plugins/defaults/memory/tools.test.ts +40 -8
- package/src/plugins/defaults/memory/tools.ts +12 -2
- package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +0 -19
- package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +63 -40
- package/src/plugins/defaults/memory/v2/__tests__/cli-command-store.test.ts +61 -130
- package/src/plugins/defaults/memory/v2/__tests__/consolidation-job.test.ts +406 -10
- package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +1 -10
- package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +1 -10
- package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +1 -10
- package/src/plugins/defaults/memory/v2/__tests__/injection-events.test.ts +61 -69
- package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +0 -19
- package/src/plugins/defaults/memory/v2/__tests__/migration.test.ts +11 -10
- package/src/plugins/defaults/memory/v2/__tests__/page-index.test.ts +0 -5
- package/src/plugins/defaults/memory/v2/__tests__/qdrant.test.ts +6 -22
- package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +3 -5
- package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +7 -20
- package/src/plugins/defaults/memory/v2/__tests__/sim.test.ts +0 -24
- package/src/plugins/defaults/memory/v2/__tests__/skill-content.test.ts +17 -11
- package/src/plugins/defaults/memory/v2/__tests__/skill-store.test.ts +0 -16
- package/src/plugins/defaults/memory/v2/__tests__/static-context.test.ts +0 -10
- package/src/plugins/defaults/memory/v2/__tests__/sweep-job.test.ts +0 -6
- package/src/plugins/defaults/memory/v2/backfill-jobs.ts +5 -2
- package/src/plugins/defaults/memory/v2/cli-command-content.ts +43 -12
- package/src/plugins/defaults/memory/v2/cli-command-store.ts +34 -50
- package/src/plugins/defaults/memory/v2/consolidation-job.ts +216 -10
- package/src/plugins/defaults/memory/v2/harness/router-retriever.ts +1 -8
- package/src/plugins/defaults/memory/v2/injection-events.ts +16 -14
- package/src/plugins/defaults/memory/v2/injection.ts +1 -2
- package/src/plugins/defaults/memory/v2/memory-v2-startup.test.ts +0 -5
- package/src/plugins/defaults/memory/v2/migration.ts +55 -24
- package/src/plugins/defaults/memory/v2/prompts/consolidation.ts +4 -0
- package/src/plugins/defaults/memory/v2/router.ts +4 -14
- package/src/plugins/defaults/memory/v2/sweep-job.ts +1 -0
- package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +10 -22
- package/src/plugins/defaults/memory/v3/__tests__/dense.test.ts +0 -5
- package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +18 -20
- package/src/plugins/defaults/memory/v3/__tests__/section-dense-store.test.ts +0 -5
- package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +5 -9
- package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +51 -31
- package/src/plugins/defaults/memory/v3/prune.test.ts +3 -11
- package/src/{persistence → plugins/defaults/memory}/worker-control.ts +12 -21
- package/src/plugins/defaults/memory/worker.ts +19 -2
- package/src/plugins/mtime-cache.ts +166 -70
- package/src/plugins/plugin-tree-walk.ts +41 -4
- package/src/plugins/source-fingerprint.ts +9 -3
- package/src/plugins/surface-import.ts +28 -0
- package/src/plugins/types.ts +9 -23
- package/src/prompts/__tests__/system-prompt.test.ts +0 -28
- package/src/prompts/__tests__/task-progress-hint-section.test.ts +0 -28
- package/src/providers/__tests__/connection-model-compat.test.ts +6 -19
- package/src/providers/__tests__/count-tokens-forwarding.test.ts +1 -21
- package/src/providers/__tests__/dispatch-connection-routing.test.ts +9 -26
- package/src/providers/__tests__/registry-native-web-search.test.ts +4 -10
- package/src/providers/__tests__/retry-callsite.test.ts +240 -235
- package/src/providers/__tests__/satellite-connection-routing.test.ts +11 -36
- package/src/providers/__tests__/vellum-mismatch-routing.test.ts +0 -5
- package/src/providers/anthropic/client.ts +9 -3
- package/src/providers/call-site-routing.ts +7 -3
- package/src/providers/connection-resolution.ts +9 -11
- package/src/providers/content-block-schema.ts +149 -0
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +7 -11
- package/src/providers/inference/__tests__/codex-token-refresh.test.ts +1 -15
- package/src/providers/inference/auth.ts +23 -0
- package/src/providers/inference/backfill.ts +25 -9
- package/src/providers/model-catalog.ts +213 -5
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +54 -0
- package/src/providers/openai/chat-completions-provider.ts +13 -2
- package/src/providers/openai/responses-provider.ts +232 -5
- package/src/providers/openrouter/client.ts +53 -0
- package/src/providers/retry.ts +25 -2
- package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +13 -0
- package/src/providers/speech-to-text/__tests__/resolve.test.ts +211 -74
- package/src/providers/speech-to-text/__tests__/vellum-managed-realtime.test.ts +408 -0
- package/src/providers/speech-to-text/__tests__/vellum-managed.test.ts +121 -0
- package/src/providers/speech-to-text/__tests__/vellum-speech-relay-connection.test.ts +126 -0
- package/src/providers/speech-to-text/deepgram-realtime.ts +167 -37
- package/src/providers/speech-to-text/incremental-batch-stream.ts +413 -0
- package/src/providers/speech-to-text/openai-whisper-stream.ts +16 -363
- package/src/providers/speech-to-text/provider-catalog.ts +26 -1
- package/src/providers/speech-to-text/resolve.ts +74 -13
- package/src/providers/speech-to-text/vellum-managed-realtime.ts +309 -0
- package/src/providers/speech-to-text/vellum-managed.ts +71 -0
- package/src/providers/speech-to-text/vellum-speech-relay-connection.ts +174 -0
- package/src/providers/types.ts +23 -4
- package/src/providers/vellum-model-routing.test.ts +26 -0
- package/src/providers/vellum-model-routing.ts +30 -0
- package/src/runtime/AGENTS.md +1 -1
- package/src/runtime/__tests__/actor-trust-resolver.test.ts +2 -8
- package/src/runtime/__tests__/agent-wake.test.ts +100 -27
- package/src/runtime/__tests__/background-job-runner.test.ts +22 -0
- package/src/runtime/__tests__/guardian-vellum-migration.test.ts +0 -5
- package/src/runtime/__tests__/member-verdict-cache.test.ts +2 -9
- package/src/runtime/__tests__/trust-verdict-consumer.test.ts +22 -5
- package/src/runtime/access-request-helper.ts +84 -60
- package/src/runtime/actor-trust-resolver.ts +2 -2
- package/src/runtime/agent-wake.ts +75 -26
- package/src/runtime/assistant-event-hub.ts +1 -0
- package/src/runtime/auth/__tests__/middleware.test.ts +1 -10
- package/src/runtime/auth/__tests__/route-policy.test.ts +0 -7
- package/src/runtime/auth/__tests__/token-service.test.ts +1 -8
- package/src/runtime/auth/same-actor.ts +2 -1
- package/src/runtime/background-job-runner.ts +22 -0
- package/src/runtime/channel-approval-types.ts +1 -1
- package/src/runtime/channel-reply-delivery.ts +38 -19
- package/src/runtime/confirmation-request-guardian-bridge.ts +45 -39
- package/src/runtime/for-chat-mint-registry.ts +118 -0
- package/src/runtime/guardian-action-service.ts +32 -27
- package/src/runtime/guardian-decision-types.ts +2 -2
- package/src/runtime/guardian-reply-router.ts +80 -98
- package/src/runtime/http-server.ts +61 -41
- package/src/runtime/introduction-policy.ts +2 -2
- package/src/runtime/local-actor-identity.ts +19 -7
- package/src/runtime/pending-interactions.ts +1 -0
- package/src/runtime/reveal-nonce.ts +49 -0
- package/src/runtime/reveal-success-registry.ts +306 -0
- package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/backup-routes.test.ts +195 -125
- package/src/runtime/routes/__tests__/channel-verification-routes.test.ts +4 -1
- package/src/runtime/routes/__tests__/client-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +1 -19
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +1 -8
- package/src/runtime/routes/__tests__/contact-routes-merge-relay.test.ts +186 -0
- package/src/runtime/routes/__tests__/contact-routes-update-channel-relay.test.ts +2 -3
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +5 -27
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +12 -30
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +59 -56
- package/src/runtime/routes/__tests__/conversation-surface-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/default-provider-routes.test.ts +53 -73
- package/src/runtime/routes/__tests__/gateway-status-routes.test.ts +84 -0
- package/src/runtime/routes/__tests__/inference-callsites-routes.test.ts +2 -10
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +58 -90
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +161 -93
- package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +6 -1
- package/src/runtime/routes/__tests__/monitoring-routes.test.ts +0 -8
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +218 -64
- package/src/runtime/routes/__tests__/question-routes.test.ts +2 -4
- package/src/runtime/routes/__tests__/retrospective-routes.test.ts +1 -8
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/schedule-routes-create.test.ts +2 -1
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +16 -56
- package/src/runtime/routes/__tests__/stt-routes.test.ts +0 -9
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +0 -7
- package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -0
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +354 -1
- package/src/runtime/routes/__tests__/tts-routes.test.ts +0 -11
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +163 -10
- package/src/runtime/routes/__tests__/user-routes-cli.test.ts +154 -0
- package/src/runtime/routes/__tests__/wake-conversation-routes.test.ts +0 -7
- package/src/runtime/routes/acp-routes.ts +21 -9
- package/src/runtime/routes/app-management-routes.ts +231 -60
- package/src/runtime/routes/app-routes.ts +130 -83
- package/src/runtime/routes/auth-routes.ts +3 -1
- package/src/runtime/routes/background-wake-routes.ts +0 -1
- package/src/runtime/routes/cache-routes.ts +3 -3
- package/src/runtime/routes/call-routes.ts +5 -1
- package/src/runtime/routes/channel-verification-routes.ts +2 -1
- package/src/runtime/routes/contact-prompt-routes.ts +11 -5
- package/src/runtime/routes/contact-routes.ts +34 -42
- package/src/runtime/routes/conversation-attention-routes.ts +1 -1
- package/src/runtime/routes/conversation-cli-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +4 -4
- package/src/runtime/routes/conversation-routes.ts +111 -72
- package/src/runtime/routes/credential-routes.ts +116 -3
- package/src/runtime/routes/email-routes.ts +17 -1
- package/src/runtime/routes/events-routes.ts +1 -0
- package/src/runtime/routes/gateway-status-routes.ts +69 -0
- package/src/runtime/routes/guardian-action-routes.ts +18 -16
- package/src/runtime/routes/guardian-approval-interception.ts +6 -4
- package/src/runtime/routes/guardian-approval-prompt.ts +7 -5
- package/src/runtime/routes/guardian-expiry-sweep.ts +130 -0
- package/src/runtime/routes/inbound-message-handler.ts +9 -33
- package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +0 -5
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +9 -9
- package/src/runtime/routes/inbound-stages/admission-policy.test.ts +24 -6
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -7
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.test.ts +0 -5
- package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +6 -3
- package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -1
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.test.ts +0 -9
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +4 -1
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +3 -12
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +16 -14
- package/src/runtime/routes/inbound-stages/reaction-intercept.test.ts +8 -2
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +15 -7
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -9
- package/src/runtime/routes/index.ts +5 -5
- package/src/runtime/routes/inference-provider-connection-routes.ts +73 -24
- package/src/runtime/routes/inference-send-routes.ts +1 -1
- package/src/runtime/routes/internal-telemetry-routes.ts +11 -2
- package/src/runtime/routes/oauth-connect-routes.ts +27 -7
- package/src/runtime/routes/platform-routes.ts +4 -14
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +0 -4
- package/src/runtime/routes/playground/__tests__/guard.test.ts +0 -4
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +0 -14
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +0 -21
- package/src/runtime/routes/playground/__tests__/seed-conversation.test.ts +0 -4
- package/src/runtime/routes/playground/__tests__/seeded-conversations.test.ts +16 -18
- package/src/runtime/routes/playground/__tests__/state.test.ts +0 -14
- package/src/runtime/routes/playground/seed-conversation.ts +5 -4
- package/src/runtime/routes/playground/seeded-conversations.ts +3 -2
- package/src/runtime/routes/plugins-routes.ts +163 -25
- package/src/runtime/routes/profiler-routes.ts +2 -5
- package/src/runtime/routes/publish-routes.ts +15 -18
- package/src/runtime/routes/question-routes.ts +8 -4
- package/src/runtime/routes/schedule-routes.ts +20 -78
- package/src/runtime/routes/schedule-worker-routes.ts +16 -84
- package/src/runtime/routes/secret-routes.ts +14 -0
- package/src/runtime/routes/settings-routes.ts +21 -25
- package/src/runtime/routes/subagents-routes.ts +17 -18
- package/src/runtime/routes/surface-action-routes.ts +18 -39
- package/src/runtime/routes/surface-content-routes.ts +59 -1
- package/src/runtime/routes/surface-conversation-resolver.ts +148 -4
- package/src/runtime/routes/telemetry-routes.ts +74 -1
- package/src/runtime/routes/tts-routes.ts +9 -5
- package/src/runtime/routes/ui-snapshot-routes.test.ts +219 -0
- package/src/runtime/routes/ui-snapshot-routes.ts +313 -0
- package/src/runtime/routes/user-route-dispatcher.ts +52 -53
- package/src/runtime/routes/user-route-resolution.ts +141 -0
- package/src/runtime/routes/user-routes-cli.ts +56 -35
- package/src/runtime/routes/user-routes.ts +9 -2
- package/src/runtime/routes/vellum-actor-trust.ts +67 -0
- package/src/runtime/services/__tests__/auto-analysis-guard.test.ts +1 -8
- package/src/runtime/tool-grant-request-helper.ts +34 -30
- package/src/runtime/trust-verdict-consumer.ts +4 -6
- package/src/schedule/__tests__/worker-control.test.ts +3 -3
- package/src/schedule/schedule-store.ts +0 -41
- package/src/schedule/scheduler.ts +38 -257
- package/src/schedule/worker-control.ts +11 -21
- package/src/schedule/worker.ts +18 -5
- package/src/security/__tests__/oauth2-device-code.test.ts +12 -60
- package/src/security/__tests__/provider-key-env-fallback.test.ts +0 -10
- package/src/security/auth-fallback-events-store.ts +34 -72
- package/src/security/secret-scanner.ts +26 -1
- package/src/sequence/engine.ts +15 -6
- package/src/services/published-app-updater.ts +6 -11
- package/src/stt/__tests__/daemon-batch-transcriber.test.ts +24 -4
- package/src/stt/daemon-batch-transcriber.ts +33 -2
- package/src/stt/stt-stream-session.ts +17 -11
- package/src/stt/types.ts +2 -1
- package/src/subagent/manager.ts +4 -3
- package/src/telemetry/AGENTS.md +44 -0
- package/src/telemetry/__tests__/config-setting-events-store.test.ts +63 -0
- package/src/telemetry/__tests__/config-setting-snapshot.test.ts +107 -0
- package/src/telemetry/__tests__/flush-checkpoints.test.ts +56 -0
- package/src/telemetry/__tests__/outbox-test-harness.ts +83 -0
- package/src/telemetry/__tests__/telemetry-event-fixtures.ts +258 -0
- package/src/telemetry/__tests__/watchdog-events-store.test.ts +32 -122
- package/src/telemetry/config-setting-events-store.ts +40 -0
- package/src/telemetry/config-setting-snapshot.ts +135 -0
- package/src/telemetry/flush-checkpoints.ts +70 -0
- package/src/telemetry/skill-loaded-events-store.test.ts +54 -113
- package/src/telemetry/skill-loaded-events-store.ts +21 -77
- package/src/telemetry/telemetry-event-sources.test.ts +211 -0
- package/src/telemetry/telemetry-event-sources.ts +582 -0
- package/src/telemetry/telemetry-events-outbox.test.ts +330 -0
- package/src/telemetry/telemetry-events-outbox.ts +204 -0
- package/src/telemetry/telemetry-main-db.ts +48 -0
- package/src/telemetry/telemetry-wire-source.json +4 -0
- package/src/telemetry/telemetry-wire-validation.test.ts +157 -0
- package/src/telemetry/telemetry-wire-validation.ts +125 -0
- package/src/telemetry/telemetry-wire.generated.ts +433 -0
- package/src/telemetry/tool-executed-events-store.test.ts +0 -8
- package/src/telemetry/tool-executed-events-store.ts +2 -2
- package/src/telemetry/turn-trace-store.test.ts +86 -7
- package/src/telemetry/turn-trace-store.ts +29 -1
- package/src/telemetry/types.test.ts +38 -0
- package/src/telemetry/types.ts +302 -87
- package/src/telemetry/usage-telemetry-reporter.test.ts +921 -364
- package/src/telemetry/usage-telemetry-reporter.ts +235 -722
- package/src/telemetry/watchdog-direct-emit.test.ts +0 -5
- package/src/telemetry/watchdog-direct-emit.ts +7 -1
- package/src/telemetry/watchdog-events-store.ts +11 -70
- package/src/tools/acp/spawn.test.ts +0 -7
- package/src/tools/apps/definitions.ts +1 -7
- package/src/tools/apps/executors.ts +11 -36
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +11 -24
- package/src/tools/browser/__tests__/browser-status.test.ts +47 -33
- package/src/tools/browser/cdp-client/__tests__/cdp-inspect-client.test.ts +1 -11
- package/src/tools/browser/cdp-client/__tests__/factory.test.ts +75 -58
- package/src/tools/browser/cdp-client/__tests__/local-cdp-client.test.ts +0 -10
- package/src/tools/browser/network-recorder.test.ts +0 -11
- package/src/tools/document/document-comment-tool.test.ts +1 -7
- package/src/tools/host-terminal/host-shell.test.ts +0 -32
- package/src/tools/host-terminal/host-shell.ts +6 -2
- package/src/tools/network/__tests__/web-fetch-firecrawl.test.ts +13 -15
- package/src/tools/network/__tests__/web-search-metadata.test.ts +15 -18
- package/src/tools/network/__tests__/web-search.test.ts +39 -50
- package/src/tools/registry.ts +148 -196
- package/src/tools/skills/find-similar-skills.test.ts +0 -7
- package/src/tools/skills/sandbox-runner.ts +5 -2
- package/src/tools/skills/scaffold-managed.ts +105 -12
- package/src/tools/subagent/read.ts +6 -4
- package/src/tools/subagent/spawn.ts +20 -29
- package/src/tools/terminal/safe-env.ts +7 -2
- package/src/tools/terminal/shell.test.ts +4 -8
- package/src/tools/terminal/shell.ts +5 -2
- package/src/tools/tool-approval-handler.ts +39 -23
- package/src/tools/tool-input-summary.ts +2 -1
- package/src/tools/tool-manifest.ts +20 -6
- package/src/tools/tool-profiler.ts +37 -6
- package/src/tools/ui-surface/definitions.ts +1 -7
- package/src/tools/workflows/run-workflow.test.ts +8 -22
- package/src/tts/__tests__/provider-adapters.test.ts +28 -22
- package/src/tts/__tests__/provider-resolution.test.ts +26 -0
- package/src/tts/__tests__/synthesis-stream.test.ts +6 -6
- package/src/tts/__tests__/vellum-provider.test.ts +251 -0
- package/src/tts/provider-catalog.ts +6 -0
- package/src/tts/providers/__tests__/vellum-tts-socket.test.ts +266 -0
- package/src/tts/providers/vellum-provider.ts +220 -0
- package/src/tts/providers/vellum-tts-socket.ts +377 -0
- package/src/tts/synthesize-text.ts +15 -5
- package/src/tts/tts-config-resolver.ts +2 -7
- package/src/tts/types.ts +1 -0
- package/src/usage/attribution.ts +20 -114
- package/src/util/abort-reasons.ts +1 -3
- package/src/util/image-conversion.ts +23 -5
- package/src/util/logger.ts +8 -3
- package/src/{config/bundled-skills/messaging/tools/gmail-mime-helpers.ts → util/mime-type.ts} +4 -1
- package/src/util/platform.ts +0 -60
- package/src/util/pricing.ts +10 -1
- package/src/util/telemetry-db-path.ts +9 -7
- package/src/watcher/__tests__/telemetry.test.ts +41 -11
- package/src/watcher/providers/google-calendar.ts +81 -49
- package/src/watcher/telemetry.ts +22 -5
- package/src/workflows/engine-integration.test.ts +0 -6
- package/src/workflows/engine.test.ts +1 -9
- package/src/workflows/journal-store.test.ts +1 -9
- package/src/workflows/leaf-runner.test.ts +17 -50
- package/src/workflows/library.test.ts +1 -9
- package/src/workflows/run-manager.test.ts +1 -9
- package/src/workspace/git-service.ts +932 -37
- package/src/workspace/provider-commit-message-generator.ts +6 -4
- package/__tests__/permissions/gateway-threshold-reader.test.ts +0 -450
- package/src/__tests__/canonical-guardian-store.test.ts +0 -928
- package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -140
- package/src/__tests__/plugin-route-contribution.test.ts +0 -245
- package/src/__tests__/skill-runtime-path.test.ts +0 -63
- package/src/__tests__/task-compiler.test.ts +0 -317
- package/src/__tests__/task-management-tools.test.ts +0 -1128
- package/src/__tests__/task-scheduler.test.ts +0 -786
- package/src/config/schemas/schedules.ts +0 -35
- package/src/contacts/canonical-guardian-store.ts +0 -902
- package/src/daemon/message-types/work-items.ts +0 -243
- package/src/runtime/routes/__tests__/memory-worker-routes.test.ts +0 -306
- package/src/runtime/routes/__tests__/task-routes.test.ts +0 -644
- package/src/runtime/routes/assets/vellum-design-system.css +0 -1959
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +0 -129
- package/src/runtime/routes/inbound-stages/escalation-intercept.test.ts +0 -158
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +0 -187
- package/src/runtime/routes/memory-worker-routes.ts +0 -227
- package/src/runtime/routes/task-routes.ts +0 -380
- package/src/runtime/routes/work-items-routes.test.ts +0 -75
- package/src/runtime/routes/work-items-routes.ts +0 -881
- package/src/runtime/skill-route-registry.ts +0 -131
- package/src/tasks/SPEC.md +0 -132
- package/src/tasks/task-compiler.ts +0 -194
- package/src/tasks/task-runner.ts +0 -119
- package/src/tasks/task-scheduler.ts +0 -22
- package/src/tasks/task-store.ts +0 -153
- package/src/tasks/tool-sanitizer.ts +0 -38
- package/src/tools/apps/registry.ts +0 -16
- package/src/tools/system/register.ts +0 -9
- package/src/tools/tasks/task-delete.ts +0 -121
- package/src/tools/tasks/task-list.ts +0 -56
- package/src/tools/tasks/task-run.ts +0 -122
- package/src/tools/tasks/task-save.ts +0 -64
- package/src/tools/tasks/work-item-enqueue.ts +0 -300
- package/src/tools/tasks/work-item-list.ts +0 -65
- package/src/tools/tasks/work-item-remove.ts +0 -94
- package/src/tools/tasks/work-item-run.ts +0 -99
- package/src/tools/tasks/work-item-update.ts +0 -166
- package/src/tools/ui-surface/registry.ts +0 -14
- package/src/work-items/resolve-required-tools.test.ts +0 -37
- package/src/work-items/resolve-required-tools.ts +0 -26
- package/src/work-items/work-item-runner.ts +0 -187
- package/src/work-items/work-item-store.ts +0 -416
|
@@ -1,8 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Usage telemetry reporter.
|
|
3
3
|
*
|
|
4
|
-
* Periodically flushes
|
|
5
|
-
* the local SQLite
|
|
4
|
+
* Periodically flushes unreported telemetry events (LLM usage, turns,
|
|
5
|
+
* lifecycle, ...) from the local SQLite databases and POSTs them to the
|
|
6
|
+
* platform telemetry endpoint. Each event type is a
|
|
7
|
+
* {@link TelemetryEventSource}; the reporter is a generic engine over the
|
|
8
|
+
* source list it is constructed with, acknowledging each source after a
|
|
9
|
+
* successful upload in one of two modes: watermark-mode sources advance a
|
|
10
|
+
* compound `(createdAt, id)` cursor in the telemetry DB's
|
|
11
|
+
* `flush_checkpoints` table, and ack-mode sources (those defining `ack`)
|
|
12
|
+
* delete their shipped rows instead.
|
|
13
|
+
*
|
|
14
|
+
* Flushing is split across two processes, each running its own reporter
|
|
15
|
+
* instance over a disjoint source partition: the daemon flushes turn events
|
|
16
|
+
* (their completeness barrier and consented traces read live in-memory
|
|
17
|
+
* conversation state), and the resource monitor process flushes everything
|
|
18
|
+
* else off the daemon's event loop — see `monitoring/worker.ts`. The
|
|
19
|
+
* per-source watermark cursors live in the telemetry DB, which both
|
|
20
|
+
* processes open read-write; each instance only touches its own sources'
|
|
21
|
+
* cursors, so the split shares no flush state.
|
|
6
22
|
*
|
|
7
23
|
* Authenticated-only: events are sent via the managed proxy context
|
|
8
24
|
* (Api-Key header). When no platform credentials are available, or when
|
|
@@ -10,39 +26,27 @@
|
|
|
10
26
|
* flush is skipped and retried next cycle.
|
|
11
27
|
*/
|
|
12
28
|
|
|
13
|
-
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
14
29
|
import { getPlatformOrganizationId, getPlatformUserId } from "../config/env.js";
|
|
15
|
-
import { getConfig } from "../config/loader.js";
|
|
16
|
-
import { queryUnreportedOnboardingEvents } from "../onboarding/onboarding-events-store.js";
|
|
17
|
-
import {
|
|
18
|
-
getMemoryCheckpoint,
|
|
19
|
-
setMemoryCheckpoint,
|
|
20
|
-
} from "../persistence/checkpoints.js";
|
|
21
|
-
import { queryUnreportedLifecycleEvents } from "../persistence/lifecycle-events-store.js";
|
|
22
|
-
import { queryUnreportedUsageEvents } from "../persistence/llm-usage-store.js";
|
|
23
30
|
import { VellumPlatformClient } from "../platform/client.js";
|
|
24
|
-
import {
|
|
25
|
-
getCachedShareAnalytics,
|
|
26
|
-
getCachedShareDiagnostics,
|
|
27
|
-
getCachedShareDiagnosticsVersion,
|
|
28
|
-
} from "../platform/consent-cache.js";
|
|
31
|
+
import { getCachedShareAnalytics } from "../platform/consent-cache.js";
|
|
29
32
|
import { arePlatformFeaturesEnabled } from "../platform/feature-gate.js";
|
|
30
|
-
import { queryUnreportedAuthFallbackEvents } from "../security/auth-fallback-events-store.js";
|
|
31
|
-
import type { UsageAttributionProfileSource } from "../usage/types.js";
|
|
32
33
|
import { getDeviceId } from "../util/device-id.js";
|
|
33
34
|
import { getLogger } from "../util/logger.js";
|
|
34
35
|
import { APP_VERSION } from "../version.js";
|
|
35
36
|
import {
|
|
36
|
-
type
|
|
37
|
-
|
|
38
|
-
} from "./
|
|
39
|
-
import {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
37
|
+
type FlushCheckpointStore,
|
|
38
|
+
telemetryDbFlushCheckpointStore,
|
|
39
|
+
} from "./flush-checkpoints.js";
|
|
40
|
+
import {
|
|
41
|
+
DAEMON_TELEMETRY_EVENT_SOURCES,
|
|
42
|
+
MONITOR_TELEMETRY_EVENT_SOURCES,
|
|
43
|
+
type TelemetryEventSource,
|
|
44
|
+
type TelemetryEventSourceBatch,
|
|
45
|
+
TOOL_EXECUTED_SOURCE_ID,
|
|
46
|
+
watermarkKeysForSource,
|
|
47
|
+
} from "./telemetry-event-sources.js";
|
|
48
|
+
import { useReadOnlyMainDbForTelemetry } from "./telemetry-main-db.js";
|
|
49
|
+
import { validateWireEvents } from "./telemetry-wire-validation.js";
|
|
46
50
|
|
|
47
51
|
const log = getLogger("usage-telemetry");
|
|
48
52
|
|
|
@@ -50,59 +54,11 @@ const log = getLogger("usage-telemetry");
|
|
|
50
54
|
// Constants
|
|
51
55
|
// ---------------------------------------------------------------------------
|
|
52
56
|
|
|
53
|
-
const CHECKPOINT_KEY_WATERMARK = "telemetry:usage:last_reported_at";
|
|
54
|
-
const CHECKPOINT_KEY_WATERMARK_ID = "telemetry:usage:last_reported_id";
|
|
55
|
-
const CHECKPOINT_KEY_TURN_WATERMARK = "telemetry:turns:last_reported_at";
|
|
56
|
-
const CHECKPOINT_KEY_TURN_WATERMARK_ID = "telemetry:turns:last_reported_id";
|
|
57
|
-
const CHECKPOINT_KEY_LIFECYCLE_WATERMARK =
|
|
58
|
-
"telemetry:lifecycle:last_reported_at";
|
|
59
|
-
const CHECKPOINT_KEY_LIFECYCLE_WATERMARK_ID =
|
|
60
|
-
"telemetry:lifecycle:last_reported_id";
|
|
61
|
-
const CHECKPOINT_KEY_ONBOARDING_WATERMARK =
|
|
62
|
-
"telemetry:onboarding:last_reported_at";
|
|
63
|
-
const CHECKPOINT_KEY_ONBOARDING_WATERMARK_ID =
|
|
64
|
-
"telemetry:onboarding:last_reported_id";
|
|
65
|
-
const CHECKPOINT_KEY_AUTH_FALLBACK_WATERMARK =
|
|
66
|
-
"telemetry:auth_fallback:last_reported_at";
|
|
67
|
-
const CHECKPOINT_KEY_AUTH_FALLBACK_WATERMARK_ID =
|
|
68
|
-
"telemetry:auth_fallback:last_reported_id";
|
|
69
|
-
const CHECKPOINT_KEY_TOOL_EXECUTED_WATERMARK =
|
|
70
|
-
"telemetry:tool_executed:last_reported_at";
|
|
71
|
-
const CHECKPOINT_KEY_TOOL_EXECUTED_WATERMARK_ID =
|
|
72
|
-
"telemetry:tool_executed:last_reported_id";
|
|
73
|
-
const CHECKPOINT_KEY_SKILL_LOADED_WATERMARK =
|
|
74
|
-
"telemetry:skill_loaded:last_reported_at";
|
|
75
|
-
const CHECKPOINT_KEY_SKILL_LOADED_WATERMARK_ID =
|
|
76
|
-
"telemetry:skill_loaded:last_reported_id";
|
|
77
|
-
const CHECKPOINT_KEY_WATCHDOG_WATERMARK = "telemetry:watchdog:last_reported_at";
|
|
78
|
-
const CHECKPOINT_KEY_WATCHDOG_WATERMARK_ID =
|
|
79
|
-
"telemetry:watchdog:last_reported_id";
|
|
80
57
|
// Written into the `*_id` watermark checkpoints by the opt-out flush branch.
|
|
81
58
|
// Sorts lexicographically above every real row ID (all event stores generate
|
|
82
59
|
// lowercase v4 UUIDs), so the compound cursor's same-millisecond arm
|
|
83
60
|
// (`createdAt == watermark AND id > afterId`) can never match an opt-out row.
|
|
84
61
|
const OPT_OUT_WATERMARK_ID_SENTINEL = "ffffffff-ffff-ffff-ffff-ffffffffffff";
|
|
85
|
-
// (timestamp, id) checkpoint-key pairs for every event type's compound
|
|
86
|
-
// cursor — keep in sync when adding an event type.
|
|
87
|
-
const WATERMARK_KEY_PAIRS: ReadonlyArray<readonly [string, string]> = [
|
|
88
|
-
[CHECKPOINT_KEY_WATERMARK, CHECKPOINT_KEY_WATERMARK_ID],
|
|
89
|
-
[CHECKPOINT_KEY_TURN_WATERMARK, CHECKPOINT_KEY_TURN_WATERMARK_ID],
|
|
90
|
-
[CHECKPOINT_KEY_LIFECYCLE_WATERMARK, CHECKPOINT_KEY_LIFECYCLE_WATERMARK_ID],
|
|
91
|
-
[CHECKPOINT_KEY_ONBOARDING_WATERMARK, CHECKPOINT_KEY_ONBOARDING_WATERMARK_ID],
|
|
92
|
-
[
|
|
93
|
-
CHECKPOINT_KEY_AUTH_FALLBACK_WATERMARK,
|
|
94
|
-
CHECKPOINT_KEY_AUTH_FALLBACK_WATERMARK_ID,
|
|
95
|
-
],
|
|
96
|
-
[
|
|
97
|
-
CHECKPOINT_KEY_TOOL_EXECUTED_WATERMARK,
|
|
98
|
-
CHECKPOINT_KEY_TOOL_EXECUTED_WATERMARK_ID,
|
|
99
|
-
],
|
|
100
|
-
[
|
|
101
|
-
CHECKPOINT_KEY_SKILL_LOADED_WATERMARK,
|
|
102
|
-
CHECKPOINT_KEY_SKILL_LOADED_WATERMARK_ID,
|
|
103
|
-
],
|
|
104
|
-
[CHECKPOINT_KEY_WATCHDOG_WATERMARK, CHECKPOINT_KEY_WATCHDOG_WATERMARK_ID],
|
|
105
|
-
];
|
|
106
62
|
const REPORT_INTERVAL_MS = 5 * 60 * 1000;
|
|
107
63
|
const INITIAL_FLUSH_DELAY_MS = 30_000; // Delay first flush to let CES handshake complete
|
|
108
64
|
const BATCH_SIZE = 500;
|
|
@@ -119,29 +75,64 @@ export function getUsageTelemetryReporter(): UsageTelemetryReporter | null {
|
|
|
119
75
|
return _instance;
|
|
120
76
|
}
|
|
121
77
|
|
|
78
|
+
function startReporterWithSources(
|
|
79
|
+
sources: readonly TelemetryEventSource[],
|
|
80
|
+
label: string,
|
|
81
|
+
): void {
|
|
82
|
+
if (process.env.VELLUM_DEV === "1") {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (_instance) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
_instance = new UsageTelemetryReporter(sources);
|
|
89
|
+
_instance.start();
|
|
90
|
+
log.info(`${label} telemetry reporter started`);
|
|
91
|
+
}
|
|
92
|
+
|
|
122
93
|
/**
|
|
123
|
-
* Construct and start the singleton
|
|
124
|
-
* (
|
|
94
|
+
* Construct and start the daemon's singleton telemetry reporter, flushing
|
|
95
|
+
* the daemon-owned sources (turn events). No-op in dev mode (VELLUM_DEV=1)
|
|
96
|
+
* and idempotent if already started.
|
|
125
97
|
*
|
|
126
98
|
* Started even when share_analytics consent is opted out: flush() re-checks
|
|
127
|
-
* consent each cycle and, when opted out, sends nothing but advances
|
|
128
|
-
* watermarks (including the final flush in stop()).
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
99
|
+
* consent each cycle and, when opted out, sends nothing but advances its
|
|
100
|
+
* sources' watermarks (including the final flush in stop()). Not gated on DB
|
|
101
|
+
* readiness: getDb() can still work when initializeDb() failed mid-migration,
|
|
102
|
+
* in which case message writes keep producing rows the opt-out branch must
|
|
103
|
+
* keep covered. The reporter is degraded-mode safe — flush() treats DB errors
|
|
104
|
+
* as non-fatal.
|
|
105
|
+
*
|
|
106
|
+
* Also initializes the tool_executed absent-watermark epoch even though that
|
|
107
|
+
* source is flushed by the monitor process: the "no flush has ever advanced
|
|
108
|
+
* it" guard needs the before-any-tool-runs ordering only daemon startup can
|
|
109
|
+
* provide (the monitor boots concurrently with the daemon serving turns).
|
|
138
110
|
*/
|
|
139
111
|
export function startUsageTelemetryReporter(): void {
|
|
140
|
-
if (process.env.VELLUM_DEV === "1")
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
112
|
+
if (process.env.VELLUM_DEV === "1") {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
initToolExecutedWatermarkIfAbsent(telemetryDbFlushCheckpointStore);
|
|
116
|
+
startReporterWithSources(DAEMON_TELEMETRY_EVENT_SOURCES, "Daemon");
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Construct and start the resource monitor process's singleton telemetry
|
|
121
|
+
* reporter, flushing every non-turn source off the daemon's event loop.
|
|
122
|
+
* No-op in dev mode (VELLUM_DEV=1) and idempotent if already started.
|
|
123
|
+
*
|
|
124
|
+
* Switches this process's telemetry main-DB reads to the dedicated
|
|
125
|
+
* read-only connection first: the monitor observes the daemon's main DB
|
|
126
|
+
* (WAL permits cross-process readers) and must never write to it or create
|
|
127
|
+
* it. The caller (monitoring/worker.ts) is responsible for the consent
|
|
128
|
+
* refresh loop the share_analytics gate reads.
|
|
129
|
+
*/
|
|
130
|
+
export function startMonitorUsageTelemetryReporter(): void {
|
|
131
|
+
if (process.env.VELLUM_DEV === "1") {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
useReadOnlyMainDbForTelemetry();
|
|
135
|
+
startReporterWithSources(MONITOR_TELEMETRY_EVENT_SOURCES, "Monitor");
|
|
145
136
|
}
|
|
146
137
|
|
|
147
138
|
/**
|
|
@@ -149,7 +140,9 @@ export function startUsageTelemetryReporter(): void {
|
|
|
149
140
|
* and clear it. No-op when the reporter was never started (e.g. dev mode).
|
|
150
141
|
*/
|
|
151
142
|
export async function stopUsageTelemetryReporter(): Promise<void> {
|
|
152
|
-
if (!_instance)
|
|
143
|
+
if (!_instance) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
153
146
|
try {
|
|
154
147
|
await _instance.stop();
|
|
155
148
|
} finally {
|
|
@@ -157,34 +150,39 @@ export async function stopUsageTelemetryReporter(): Promise<void> {
|
|
|
157
150
|
}
|
|
158
151
|
}
|
|
159
152
|
|
|
160
|
-
// ---------------------------------------------------------------------------
|
|
161
|
-
// Helpers
|
|
162
|
-
// ---------------------------------------------------------------------------
|
|
163
|
-
|
|
164
153
|
/**
|
|
165
|
-
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
*
|
|
154
|
+
* Initialize the tool_executed flush watermark to "now" when absent.
|
|
155
|
+
*
|
|
156
|
+
* `tool_invocations` is an always-on audit table that predates the reporter
|
|
157
|
+
* shipping its rows: an absent watermark means no flush (opted in or out) has
|
|
158
|
+
* ever advanced it, so rows recorded before this build — including any
|
|
159
|
+
* opted-out period under older builds that gated the reporter on the
|
|
160
|
+
* usage-data opt-out — would otherwise ship retroactively. Runs at daemon
|
|
161
|
+
* startup, before any tool can run, so no legitimate row falls behind the
|
|
162
|
+
* epoch; the checkpoint persists immediately so a crash can't leave it absent
|
|
163
|
+
* and re-initialize later. An EXISTING watermark is never touched: opted-out
|
|
164
|
+
* sessions keep it advancing via the opt-out flush branch, and overwriting it
|
|
165
|
+
* would drop a legitimate unshipped backlog. The other sources need no init:
|
|
166
|
+
* their recording is either consent-gated at write time (opt-out rows never
|
|
167
|
+
* exist) or covered by the same watermark discipline from first boot.
|
|
168
|
+
*
|
|
169
|
+
* Best-effort: DB init failures are tolerated at daemon startup (degraded
|
|
170
|
+
* mode), so this never throws — matching flush(), which treats DB errors as
|
|
171
|
+
* non-fatal.
|
|
171
172
|
*/
|
|
172
|
-
function
|
|
173
|
-
|
|
174
|
-
):
|
|
175
|
-
if (!raw) return null;
|
|
173
|
+
export function initToolExecutedWatermarkIfAbsent(
|
|
174
|
+
checkpoints: FlushCheckpointStore,
|
|
175
|
+
): void {
|
|
176
176
|
try {
|
|
177
|
-
const
|
|
178
|
-
if (
|
|
179
|
-
|
|
177
|
+
const key = watermarkKeysForSource(TOOL_EXECUTED_SOURCE_ID).at;
|
|
178
|
+
if (checkpoints.get(key) == null) {
|
|
179
|
+
checkpoints.set(key, String(Date.now()));
|
|
180
180
|
}
|
|
181
|
-
|
|
182
|
-
} catch {
|
|
181
|
+
} catch (err) {
|
|
183
182
|
log.warn(
|
|
184
|
-
{
|
|
185
|
-
"
|
|
183
|
+
{ err },
|
|
184
|
+
"tool_executed watermark init failed — non-fatal; a later run with a working DB re-runs the absent-checkpoint init",
|
|
186
185
|
);
|
|
187
|
-
return null;
|
|
188
186
|
}
|
|
189
187
|
}
|
|
190
188
|
|
|
@@ -196,39 +194,23 @@ export class UsageTelemetryReporter {
|
|
|
196
194
|
private initialFlushTimer: ReturnType<typeof setTimeout> | null = null;
|
|
197
195
|
private timer: ReturnType<typeof setInterval> | null = null;
|
|
198
196
|
private activeFlush: Promise<void> | null = null;
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
//
|
|
212
|
-
//
|
|
213
|
-
//
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
//
|
|
217
|
-
// Best-effort: DB init failures are tolerated at daemon startup (degraded
|
|
218
|
-
// mode), so this must never throw out of the constructor — matching
|
|
219
|
-
// flush(), which treats DB errors as non-fatal.
|
|
220
|
-
try {
|
|
221
|
-
if (getMemoryCheckpoint(CHECKPOINT_KEY_TOOL_EXECUTED_WATERMARK) == null) {
|
|
222
|
-
setMemoryCheckpoint(
|
|
223
|
-
CHECKPOINT_KEY_TOOL_EXECUTED_WATERMARK,
|
|
224
|
-
String(Date.now()),
|
|
225
|
-
);
|
|
226
|
-
}
|
|
227
|
-
} catch (err) {
|
|
228
|
-
log.warn(
|
|
229
|
-
{ err },
|
|
230
|
-
"tool_executed watermark init failed at construction — non-fatal; a later construction with a working DB re-runs the absent-checkpoint init",
|
|
231
|
-
);
|
|
197
|
+
private readonly sources: readonly TelemetryEventSource[];
|
|
198
|
+
private readonly checkpoints: FlushCheckpointStore;
|
|
199
|
+
|
|
200
|
+
constructor(
|
|
201
|
+
sources: readonly TelemetryEventSource[],
|
|
202
|
+
checkpoints: FlushCheckpointStore = telemetryDbFlushCheckpointStore,
|
|
203
|
+
) {
|
|
204
|
+
this.sources = sources;
|
|
205
|
+
this.checkpoints = checkpoints;
|
|
206
|
+
// Backstop for the tool_executed absent-watermark epoch (see
|
|
207
|
+
// initToolExecutedWatermarkIfAbsent) — the authoritative init runs at
|
|
208
|
+
// daemon startup, which alone guarantees the before-any-tool-runs
|
|
209
|
+
// ordering; constructing an instance that flushes the source re-runs the
|
|
210
|
+
// guarded init in case that never happened (e.g. a standalone monitor
|
|
211
|
+
// started out of band).
|
|
212
|
+
if (this.sources.some((s) => s.id === TOOL_EXECUTED_SOURCE_ID)) {
|
|
213
|
+
initToolExecutedWatermarkIfAbsent(this.checkpoints);
|
|
232
214
|
}
|
|
233
215
|
}
|
|
234
216
|
|
|
@@ -267,7 +249,9 @@ export class UsageTelemetryReporter {
|
|
|
267
249
|
}
|
|
268
250
|
|
|
269
251
|
async flush(): Promise<void> {
|
|
270
|
-
if (this.activeFlush)
|
|
252
|
+
if (this.activeFlush) {
|
|
253
|
+
return; // overlap guard
|
|
254
|
+
}
|
|
271
255
|
this.activeFlush = this._doFlush();
|
|
272
256
|
try {
|
|
273
257
|
await this.activeFlush;
|
|
@@ -278,7 +262,9 @@ export class UsageTelemetryReporter {
|
|
|
278
262
|
|
|
279
263
|
private async _doFlush(batchCount = 0): Promise<void> {
|
|
280
264
|
try {
|
|
281
|
-
if (batchCount >= MAX_CONSECUTIVE_BATCHES)
|
|
265
|
+
if (batchCount >= MAX_CONSECUTIVE_BATCHES) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
282
268
|
|
|
283
269
|
// Skip when platform features are disabled (VELLUM_DISABLE_PLATFORM in
|
|
284
270
|
// local mode; the flag is ignored when IS_PLATFORM is set, matching
|
|
@@ -289,6 +275,17 @@ export class UsageTelemetryReporter {
|
|
|
289
275
|
return;
|
|
290
276
|
}
|
|
291
277
|
|
|
278
|
+
// Skip when the flush-checkpoint store (telemetry DB) is unreachable.
|
|
279
|
+
// An unreadable watermark must not be mistaken for cursor 0 — that
|
|
280
|
+
// would requery and re-ship history from the beginning. Nothing is
|
|
281
|
+
// advanced or sent; the cycle retries once the store is back.
|
|
282
|
+
if (!this.checkpoints.isAvailable()) {
|
|
283
|
+
log.warn(
|
|
284
|
+
"Telemetry flush: flush-checkpoint store unavailable — skipping, will retry next cycle",
|
|
285
|
+
);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
|
|
292
289
|
// Respect opt-out: if the platform owner has not granted
|
|
293
290
|
// `share_analytics` consent, skip the flush and advance watermarks so
|
|
294
291
|
// events recorded during the opt-out window are never sent
|
|
@@ -306,205 +303,76 @@ export class UsageTelemetryReporter {
|
|
|
306
303
|
// opted-out tool_invocations rows persist NULL telemetry columns and
|
|
307
304
|
// are unreportable by construction regardless of watermark timing.
|
|
308
305
|
if (!getCachedShareAnalytics()) {
|
|
309
|
-
//
|
|
310
|
-
//
|
|
311
|
-
//
|
|
306
|
+
// Ack-mode sources drop their pending rows outright. Watermark-mode
|
|
307
|
+
// sources advance the timestamp watermarks and pin the ID watermarks
|
|
308
|
+
// to a sentinel that sorts above any real UUID. The sentinel (rather
|
|
309
|
+
// than "") keeps the compound-cursor branch active — a falsy ID would
|
|
312
310
|
// downgrade the query to a timestamp-only `gt(createdAt, watermark)`
|
|
313
311
|
// — while making its same-millisecond arm unsatisfiable, so a row
|
|
314
312
|
// written in the same millisecond as this flush's Date.now() can
|
|
315
313
|
// never ship after a later opt-in. The next opted-in flush that
|
|
316
314
|
// ships events overwrites the sentinel with a real row ID.
|
|
317
315
|
const now = String(Date.now());
|
|
318
|
-
for (const
|
|
319
|
-
|
|
320
|
-
|
|
316
|
+
for (const source of this.sources) {
|
|
317
|
+
if (source.ack) {
|
|
318
|
+
source.ack.discardPending();
|
|
319
|
+
continue;
|
|
320
|
+
}
|
|
321
|
+
const keys = watermarkKeysForSource(source.id);
|
|
322
|
+
this.checkpoints.set(keys.at, now);
|
|
323
|
+
this.checkpoints.set(keys.id, OPT_OUT_WATERMARK_ID_SENTINEL);
|
|
321
324
|
}
|
|
322
325
|
return;
|
|
323
326
|
}
|
|
324
327
|
|
|
325
|
-
// Read
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
);
|
|
343
|
-
const lifecycleWatermarkId =
|
|
344
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_LIFECYCLE_WATERMARK_ID) ?? undefined;
|
|
345
|
-
|
|
346
|
-
// Read onboarding watermark (compound cursor: createdAt + id)
|
|
347
|
-
const onboardingWatermark = Number(
|
|
348
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_ONBOARDING_WATERMARK) ?? "0",
|
|
349
|
-
);
|
|
350
|
-
const onboardingWatermarkId =
|
|
351
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_ONBOARDING_WATERMARK_ID) ??
|
|
352
|
-
undefined;
|
|
353
|
-
|
|
354
|
-
// Read auth-fallback watermark (compound cursor: createdAt + id)
|
|
355
|
-
const authFallbackWatermark = Number(
|
|
356
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_AUTH_FALLBACK_WATERMARK) ?? "0",
|
|
357
|
-
);
|
|
358
|
-
const authFallbackWatermarkId =
|
|
359
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_AUTH_FALLBACK_WATERMARK_ID) ??
|
|
360
|
-
undefined;
|
|
361
|
-
|
|
362
|
-
// Read tool-executed watermark (compound cursor: createdAt + id).
|
|
363
|
-
// An absent checkpoint was initialized to construction time (see the
|
|
364
|
-
// constructor), guarding opt-out windows; the 0 fallback here is a
|
|
365
|
-
// defensive default matching the other event types. Legacy rows are
|
|
366
|
-
// excluded at the query level (see queryUnreportedToolExecutedEvents).
|
|
367
|
-
const toolExecutedWatermark = Number(
|
|
368
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_TOOL_EXECUTED_WATERMARK) ?? "0",
|
|
369
|
-
);
|
|
370
|
-
const toolExecutedWatermarkId =
|
|
371
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_TOOL_EXECUTED_WATERMARK_ID) ??
|
|
372
|
-
undefined;
|
|
373
|
-
|
|
374
|
-
// Read skill-loaded watermark (compound cursor: createdAt + id).
|
|
375
|
-
// Writes are gated on share_analytics consent, so opted-out rows
|
|
376
|
-
// cannot exist and the standard 0 default is safe.
|
|
377
|
-
const skillLoadedWatermark = Number(
|
|
378
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_SKILL_LOADED_WATERMARK) ?? "0",
|
|
379
|
-
);
|
|
380
|
-
const skillLoadedWatermarkId =
|
|
381
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_SKILL_LOADED_WATERMARK_ID) ??
|
|
382
|
-
undefined;
|
|
383
|
-
|
|
384
|
-
// Read watchdog watermark (compound cursor: createdAt + id).
|
|
385
|
-
// Writes are gated on share_analytics consent, so opted-out rows
|
|
386
|
-
// cannot exist and the standard 0 default is safe.
|
|
387
|
-
const watchdogWatermark = Number(
|
|
388
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_WATCHDOG_WATERMARK) ?? "0",
|
|
389
|
-
);
|
|
390
|
-
const watchdogWatermarkId =
|
|
391
|
-
getMemoryCheckpoint(CHECKPOINT_KEY_WATCHDOG_WATERMARK_ID) ?? undefined;
|
|
392
|
-
|
|
393
|
-
// Query unreported events
|
|
394
|
-
const events = queryUnreportedUsageEvents(
|
|
395
|
-
watermark,
|
|
396
|
-
watermarkId,
|
|
397
|
-
BATCH_SIZE,
|
|
398
|
-
);
|
|
399
|
-
const turnEvents = queryUnreportedTurnEvents(
|
|
400
|
-
turnWatermark,
|
|
401
|
-
turnWatermarkId,
|
|
402
|
-
BATCH_SIZE,
|
|
403
|
-
);
|
|
404
|
-
const lifecycleEvents = queryUnreportedLifecycleEvents(
|
|
405
|
-
lifecycleWatermark,
|
|
406
|
-
lifecycleWatermarkId,
|
|
407
|
-
BATCH_SIZE,
|
|
408
|
-
);
|
|
409
|
-
const onboardingEvents = queryUnreportedOnboardingEvents(
|
|
410
|
-
onboardingWatermark,
|
|
411
|
-
onboardingWatermarkId,
|
|
412
|
-
BATCH_SIZE,
|
|
413
|
-
);
|
|
414
|
-
const authFallbackEvents = queryUnreportedAuthFallbackEvents(
|
|
415
|
-
authFallbackWatermark,
|
|
416
|
-
authFallbackWatermarkId,
|
|
417
|
-
BATCH_SIZE,
|
|
418
|
-
);
|
|
419
|
-
const toolExecutedEvents = queryUnreportedToolExecutedEvents(
|
|
420
|
-
toolExecutedWatermark,
|
|
421
|
-
toolExecutedWatermarkId,
|
|
422
|
-
BATCH_SIZE,
|
|
423
|
-
);
|
|
424
|
-
const skillLoadedEvents = queryUnreportedSkillLoadedEvents(
|
|
425
|
-
skillLoadedWatermark,
|
|
426
|
-
skillLoadedWatermarkId,
|
|
427
|
-
BATCH_SIZE,
|
|
428
|
-
);
|
|
429
|
-
const watchdogEvents = queryUnreportedWatchdogEvents(
|
|
430
|
-
watchdogWatermark,
|
|
431
|
-
watchdogWatermarkId,
|
|
432
|
-
BATCH_SIZE,
|
|
433
|
-
);
|
|
328
|
+
// Read each source's watermark (compound cursor: createdAt + id) and
|
|
329
|
+
// collect its reportable batch. Absent checkpoints default to cursor 0
|
|
330
|
+
// — safe for the consent-gated tables (opted-out rows never exist) and
|
|
331
|
+
// for tool_executed, whose absent watermark was initialized at
|
|
332
|
+
// construction (see the constructor).
|
|
333
|
+
const batches: Array<{
|
|
334
|
+
source: TelemetryEventSource;
|
|
335
|
+
batch: TelemetryEventSourceBatch;
|
|
336
|
+
}> = this.sources.map((source) => {
|
|
337
|
+
const keys = watermarkKeysForSource(source.id);
|
|
338
|
+
const afterCreatedAt = Number(this.checkpoints.get(keys.at) ?? "0");
|
|
339
|
+
const afterId = this.checkpoints.get(keys.id) ?? undefined;
|
|
340
|
+
return {
|
|
341
|
+
source,
|
|
342
|
+
batch: source.collect(afterCreatedAt, afterId, BATCH_SIZE),
|
|
343
|
+
};
|
|
344
|
+
});
|
|
434
345
|
|
|
435
|
-
//
|
|
436
|
-
//
|
|
437
|
-
//
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
// So we report only the leading run of complete turns and STOP at the
|
|
447
|
-
// first incomplete (in-flight) one: the turn watermark is a single
|
|
448
|
-
// monotonic `(createdAt, id)` cursor, so a later complete turn cannot be
|
|
449
|
-
// reported past an earlier deferred one without skipping it. The
|
|
450
|
-
// deferred turn (and everything after it) is picked up on a later flush
|
|
451
|
-
// once its response settles.
|
|
452
|
-
//
|
|
453
|
-
// Trace eligibility is composed daemon-side to mirror the platform's
|
|
454
|
-
// authoritative owner-based ingest gate, so traces for ineligible owners
|
|
455
|
-
// never leave the device. Three parts, fail-closed (all must be true):
|
|
456
|
-
// 1. the `trace-collection` LaunchDarkly flag (delivered via the
|
|
457
|
-
// assistant-tagged flag sync, already evaluated server-side for this
|
|
458
|
-
// assistant's owner),
|
|
459
|
-
// 2. the owner's cached `share_diagnostics` consent, and
|
|
460
|
-
// 3. the owner's cached `share_diagnostics_accepted_version` being at or
|
|
461
|
-
// past the disclosing version — the platform applies the identical
|
|
462
|
-
// check, so an old consent never yields a trace here or there.
|
|
463
|
-
const traceEligible =
|
|
464
|
-
isAssistantFeatureFlagEnabled("trace-collection", getConfig()) &&
|
|
465
|
-
getCachedShareDiagnostics() &&
|
|
466
|
-
isDiagnosticsConsentVersionEligible(getCachedShareDiagnosticsVersion());
|
|
467
|
-
let reportableTurnEvents = turnEvents;
|
|
468
|
-
if (turnEvents.length > 0) {
|
|
469
|
-
let barrier = turnEvents.length;
|
|
470
|
-
for (let i = 0; i < turnEvents.length; i++) {
|
|
471
|
-
const t = turnEvents[i];
|
|
472
|
-
if (
|
|
473
|
-
!isTurnSettled({
|
|
474
|
-
conversationId: t.conversationId,
|
|
475
|
-
userMessageId: t.id,
|
|
476
|
-
userMessageCreatedAt: t.createdAt,
|
|
477
|
-
})
|
|
478
|
-
) {
|
|
479
|
-
barrier = i;
|
|
480
|
-
break;
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
if (barrier < turnEvents.length) {
|
|
484
|
-
reportableTurnEvents = turnEvents.slice(0, barrier);
|
|
485
|
-
log.debug(
|
|
346
|
+
// Ack-mode batches must carry a row id per event: without them nothing
|
|
347
|
+
// can be acknowledged post-2xx, so shipping would re-send the same rows
|
|
348
|
+
// on every flush. Exclude such a batch from the POST instead.
|
|
349
|
+
for (const entry of batches) {
|
|
350
|
+
const { source, batch } = entry;
|
|
351
|
+
if (
|
|
352
|
+
source.ack &&
|
|
353
|
+
batch.events.length > 0 &&
|
|
354
|
+
(batch.rowIds ?? []).length !== batch.events.length
|
|
355
|
+
) {
|
|
356
|
+
log.warn(
|
|
486
357
|
{
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
deferredTurns: turnEvents.length - barrier,
|
|
358
|
+
sourceId: source.id,
|
|
359
|
+
eventCount: batch.events.length,
|
|
360
|
+
rowIdCount: batch.rowIds?.length ?? 0,
|
|
491
361
|
},
|
|
492
|
-
"
|
|
362
|
+
"Telemetry flush: ack-mode batch missing/mismatched rowIds — excluding from POST",
|
|
493
363
|
);
|
|
364
|
+
entry.batch = {
|
|
365
|
+
events: [],
|
|
366
|
+
rowIds: [],
|
|
367
|
+
lastCursor: null,
|
|
368
|
+
fullBatch: false,
|
|
369
|
+
};
|
|
494
370
|
}
|
|
495
371
|
}
|
|
496
372
|
|
|
497
|
-
if (
|
|
498
|
-
events.length === 0 &&
|
|
499
|
-
reportableTurnEvents.length === 0 &&
|
|
500
|
-
lifecycleEvents.length === 0 &&
|
|
501
|
-
onboardingEvents.length === 0 &&
|
|
502
|
-
authFallbackEvents.length === 0 &&
|
|
503
|
-
toolExecutedEvents.length === 0 &&
|
|
504
|
-
skillLoadedEvents.length === 0 &&
|
|
505
|
-
watchdogEvents.length === 0
|
|
506
|
-
)
|
|
373
|
+
if (batches.every(({ batch }) => batch.events.length === 0)) {
|
|
507
374
|
return;
|
|
375
|
+
}
|
|
508
376
|
|
|
509
377
|
// Resolve auth context. We send authenticated-only: if no platform
|
|
510
378
|
// credentials are available yet, skip without advancing watermarks so the
|
|
@@ -512,290 +380,35 @@ export class UsageTelemetryReporter {
|
|
|
512
380
|
const client = await VellumPlatformClient.create();
|
|
513
381
|
if (!client) {
|
|
514
382
|
log.debug(
|
|
515
|
-
{
|
|
383
|
+
{
|
|
384
|
+
pendingEventCount: batches.reduce(
|
|
385
|
+
(total, { batch }) => total + batch.events.length,
|
|
386
|
+
0,
|
|
387
|
+
),
|
|
388
|
+
},
|
|
516
389
|
"Telemetry flush: no platform credentials — skipping, will retry next cycle",
|
|
517
390
|
);
|
|
518
391
|
return;
|
|
519
392
|
}
|
|
520
393
|
log.debug(
|
|
521
394
|
{
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
skillLoadedCount: skillLoadedEvents.length,
|
|
529
|
-
watchdogCount: watchdogEvents.length,
|
|
395
|
+
counts: Object.fromEntries(
|
|
396
|
+
batches.map(({ source, batch }) => [
|
|
397
|
+
source.id,
|
|
398
|
+
batch.events.length,
|
|
399
|
+
]),
|
|
400
|
+
),
|
|
530
401
|
},
|
|
531
402
|
"Telemetry flush: resolved auth context",
|
|
532
403
|
);
|
|
533
404
|
|
|
534
|
-
// Build payload
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
// are nullable on the wire: `conversation_id` is null for
|
|
542
|
-
// LLM calls not tied to a conversation (memory consolidation,
|
|
543
|
-
// background work), and the other two cascade from that.
|
|
544
|
-
conversation_id: e.conversationId,
|
|
545
|
-
conversation_type: e.conversationType,
|
|
546
|
-
turn_index: e.turnIndex,
|
|
547
|
-
provider: e.provider,
|
|
548
|
-
model: e.model,
|
|
549
|
-
input_tokens: e.inputTokens,
|
|
550
|
-
output_tokens: e.outputTokens,
|
|
551
|
-
cache_creation_input_tokens: e.cacheCreationInputTokens ?? null,
|
|
552
|
-
cache_read_input_tokens: e.cacheReadInputTokens ?? null,
|
|
553
|
-
llm_call_count: e.llmCallCount,
|
|
554
|
-
raw_usage: e.rawUsage,
|
|
555
|
-
actor: e.actor,
|
|
556
|
-
llm_call_site: e.callSite,
|
|
557
|
-
inference_profile: e.inferenceProfile,
|
|
558
|
-
inference_profile_source: e.inferenceProfileSource,
|
|
559
|
-
cost: e.estimatedCostUsd ?? null,
|
|
560
|
-
recorded_at: e.createdAt,
|
|
561
|
-
// Record-time version when present; otherwise the running
|
|
562
|
-
// binary's `APP_VERSION` (a legacy row from before
|
|
563
|
-
// migration 267 ran). We deliberately don't emit explicit
|
|
564
|
-
// `null` — under the platform contract a present-but-null
|
|
565
|
-
// per-event value would override the envelope, and we'd
|
|
566
|
-
// rather have a concrete version than no version.
|
|
567
|
-
assistant_version: e.assistantVersion ?? APP_VERSION,
|
|
568
|
-
}),
|
|
569
|
-
),
|
|
570
|
-
...reportableTurnEvents.map((e): TelemetryEvent => {
|
|
571
|
-
// Per-turn trace collection gate. `traceEligible` (computed above)
|
|
572
|
-
// requires the `trace-collection` flag AND the owner's cached
|
|
573
|
-
// `share_diagnostics` consent AND an eligible accepted consent
|
|
574
|
-
// version. Fail-closed: when any is off the trace is omitted and the
|
|
575
|
-
// trace-free turn row flushes as before. The
|
|
576
|
-
// `share_analytics` gate above already passed, so this is an
|
|
577
|
-
// additional, independent gate specific to trace PII. Every turn
|
|
578
|
-
// reaching here is settled (the completeness barrier dropped any
|
|
579
|
-
// in-flight turns), so the trace is never a partial mid-turn snapshot.
|
|
580
|
-
const trace = traceEligible
|
|
581
|
-
? assembleBoundedTurnTrace({
|
|
582
|
-
conversationId: e.conversationId,
|
|
583
|
-
userMessageId: e.id,
|
|
584
|
-
userMessageCreatedAt: e.createdAt,
|
|
585
|
-
})
|
|
586
|
-
: null;
|
|
587
|
-
// `messages.metadata.client` is a nested JSON object extracted
|
|
588
|
-
// via `json_extract`; sqlite returns it as a text representation.
|
|
589
|
-
// Parse defensively — a corrupted blob in the JSON column should
|
|
590
|
-
// not block the whole batch flush.
|
|
591
|
-
let client: TurnTelemetryClientInfo | null = null;
|
|
592
|
-
if (e.clientMetadata) {
|
|
593
|
-
try {
|
|
594
|
-
const parsed = JSON.parse(e.clientMetadata) as unknown;
|
|
595
|
-
if (
|
|
596
|
-
parsed &&
|
|
597
|
-
typeof parsed === "object" &&
|
|
598
|
-
!Array.isArray(parsed)
|
|
599
|
-
) {
|
|
600
|
-
client = parsed as TurnTelemetryClientInfo;
|
|
601
|
-
}
|
|
602
|
-
} catch {
|
|
603
|
-
// Malformed client JSON — emit null rather than fail the
|
|
604
|
-
// batch. Logged once below for visibility.
|
|
605
|
-
log.warn(
|
|
606
|
-
{ turnId: e.id, conversationId: e.conversationId },
|
|
607
|
-
"Telemetry turn: failed to parse messages.metadata.client; emitting null",
|
|
608
|
-
);
|
|
609
|
-
}
|
|
610
|
-
}
|
|
611
|
-
// Narrow the raw metadata projection to the wire union — only
|
|
612
|
-
// `stampTurnOutcome` writes the key, but the JSON column is
|
|
613
|
-
// uncontrolled, so an unexpected value is dropped rather than
|
|
614
|
-
// shipped.
|
|
615
|
-
const outcome =
|
|
616
|
-
e.outcome === "batched" ||
|
|
617
|
-
e.outcome === "failed" ||
|
|
618
|
-
e.outcome === "cancelled"
|
|
619
|
-
? e.outcome
|
|
620
|
-
: null;
|
|
621
|
-
return {
|
|
622
|
-
type: "turn",
|
|
623
|
-
daemon_event_id: e.id,
|
|
624
|
-
recorded_at: e.createdAt,
|
|
625
|
-
conversation_id: e.conversationId,
|
|
626
|
-
conversation_type: e.conversationType,
|
|
627
|
-
turn_index: e.turnIndex,
|
|
628
|
-
interface_id: e.interfaceId,
|
|
629
|
-
channel_id: e.channelId,
|
|
630
|
-
client,
|
|
631
|
-
// Outcome stamps are omit-when-absent: a normally-replied turn's
|
|
632
|
-
// wire shape is byte-identical to a pre-outcome turn event.
|
|
633
|
-
...(outcome ? { outcome } : {}),
|
|
634
|
-
...(outcome === "batched" && e.batchedInto
|
|
635
|
-
? { batched_into: e.batchedInto }
|
|
636
|
-
: {}),
|
|
637
|
-
...(outcome === "failed" && e.failureCode
|
|
638
|
-
? { failure_code: e.failureCode }
|
|
639
|
-
: {}),
|
|
640
|
-
// Only attach `trace` when consent is on AND a bounded trace was
|
|
641
|
-
// assembled. Omitting the key entirely when there's no trace keeps
|
|
642
|
-
// the wire shape byte-identical to pre-trace turn events for the
|
|
643
|
-
// common (no-consent) path.
|
|
644
|
-
...(trace ? { trace } : {}),
|
|
645
|
-
// Turn events derive from `messages` + `conversations`
|
|
646
|
-
// rather than a dedicated table. Adding `assistant_version`
|
|
647
|
-
// to `messages` is a separate (larger) migration; until
|
|
648
|
-
// then we stamp the running binary's `APP_VERSION` so the
|
|
649
|
-
// wire value is concrete (matches what the envelope would
|
|
650
|
-
// have provided, but per-event so it survives the platform
|
|
651
|
-
// contract that treats present per-event values as winning
|
|
652
|
-
// over the envelope). Same upload-time attribution risk
|
|
653
|
-
// for turn events as before this PR — lifecycle, onboarding
|
|
654
|
-
// and turn events all still rely on the envelope; only
|
|
655
|
-
// llm_usage is record-time accurate in this PR.
|
|
656
|
-
assistant_version: APP_VERSION,
|
|
657
|
-
};
|
|
658
|
-
}),
|
|
659
|
-
...lifecycleEvents.map(
|
|
660
|
-
(e): TelemetryEvent => ({
|
|
661
|
-
type: "lifecycle",
|
|
662
|
-
daemon_event_id: e.id,
|
|
663
|
-
event_name: e.eventName,
|
|
664
|
-
recorded_at: e.createdAt,
|
|
665
|
-
// Lifecycle events fall back to the envelope `assistant_version`
|
|
666
|
-
// — same upload-time attribution risk as before this PR. Adding
|
|
667
|
-
// the record-time column to `lifecycle_events` (#18112) is a
|
|
668
|
-
// separate follow-up that mirrors what this PR does for
|
|
669
|
-
// `llm_usage_events`.
|
|
670
|
-
assistant_version: APP_VERSION,
|
|
671
|
-
}),
|
|
672
|
-
),
|
|
673
|
-
...onboardingEvents.map(
|
|
674
|
-
(e): TelemetryEvent => ({
|
|
675
|
-
type: "onboarding",
|
|
676
|
-
// Wire-only override for activation rows: a deterministic id keyed
|
|
677
|
-
// on funnel_version/session/step lets dbt collapse a moment that
|
|
678
|
-
// fires more than once. Key on the ROW's stored `funnelVersion`
|
|
679
|
-
// (not the binary's current constant) so rows recorded under an
|
|
680
|
-
// older version — flushed offline or after an upgrade — keep a
|
|
681
|
-
// stable id and still collapse with already-ingested rows. The
|
|
682
|
-
// SQLite watermark cursor still uses `e.id`/`e.createdAt`, so this
|
|
683
|
-
// override is checkpoint-safe.
|
|
684
|
-
daemon_event_id:
|
|
685
|
-
e.sessionId && e.stepName && e.funnelVersion
|
|
686
|
-
? buildActivationDaemonEventId(
|
|
687
|
-
e.sessionId,
|
|
688
|
-
e.stepName as ActivationStepName,
|
|
689
|
-
e.funnelVersion,
|
|
690
|
-
)
|
|
691
|
-
: e.id,
|
|
692
|
-
recorded_at: e.createdAt,
|
|
693
|
-
screen: e.screen,
|
|
694
|
-
...(e.toolsJson ? { tools: JSON.parse(e.toolsJson) } : {}),
|
|
695
|
-
...(e.tasksJson ? { tasks: JSON.parse(e.tasksJson) } : {}),
|
|
696
|
-
...(e.tone ? { tone: e.tone } : {}),
|
|
697
|
-
...(e.googleConnected != null
|
|
698
|
-
? { google_connected: e.googleConnected }
|
|
699
|
-
: {}),
|
|
700
|
-
...(e.googleScopesJson
|
|
701
|
-
? { google_scopes: JSON.parse(e.googleScopesJson) }
|
|
702
|
-
: {}),
|
|
703
|
-
...(e.abVariant ? { ab_variant: e.abVariant } : {}),
|
|
704
|
-
// Activation funnel fields — only present on activation rows.
|
|
705
|
-
...(e.sessionId ? { session_id: e.sessionId } : {}),
|
|
706
|
-
...(e.stepName ? { step_name: e.stepName } : {}),
|
|
707
|
-
...(e.stepIndex != null ? { step_index: e.stepIndex } : {}),
|
|
708
|
-
...(e.completedAt ? { completed_at: e.completedAt } : {}),
|
|
709
|
-
...(e.funnelVersion ? { funnel_version: e.funnelVersion } : {}),
|
|
710
|
-
// Onboarding events fall back to the envelope `assistant_version`,
|
|
711
|
-
// so events recorded under an older build are attributed to the
|
|
712
|
-
// version running at upload time. Adding a record-time column to
|
|
713
|
-
// `onboarding_events` (mirroring `llm_usage_events`) is a known
|
|
714
|
-
// follow-up.
|
|
715
|
-
assistant_version: APP_VERSION,
|
|
716
|
-
}),
|
|
717
|
-
),
|
|
718
|
-
...authFallbackEvents.map(
|
|
719
|
-
(e): TelemetryEvent => ({
|
|
720
|
-
type: "auth_fallback",
|
|
721
|
-
daemon_event_id: e.id,
|
|
722
|
-
recorded_at: e.createdAt,
|
|
723
|
-
guard: e.guard,
|
|
724
|
-
path: e.path,
|
|
725
|
-
failure_kind: e.failureKind,
|
|
726
|
-
count: e.count,
|
|
727
|
-
window_start: e.windowStart,
|
|
728
|
-
window_end: e.windowEnd,
|
|
729
|
-
// Aggregated counts forwarded by the gateway carry no record-time
|
|
730
|
-
// binary version; stamp the running binary's `APP_VERSION` so the
|
|
731
|
-
// wire value is concrete rather than an explicit null that would
|
|
732
|
-
// override the envelope under the platform's per-event-wins
|
|
733
|
-
// contract.
|
|
734
|
-
assistant_version: APP_VERSION,
|
|
735
|
-
}),
|
|
736
|
-
),
|
|
737
|
-
...toolExecutedEvents.map(
|
|
738
|
-
(e): TelemetryEvent => ({
|
|
739
|
-
type: "tool_executed",
|
|
740
|
-
daemon_event_id: e.id,
|
|
741
|
-
recorded_at: e.createdAt,
|
|
742
|
-
tool_name: e.toolName,
|
|
743
|
-
// The store filters out permission-denied rows, so the only
|
|
744
|
-
// non-success decision that reaches here is "error".
|
|
745
|
-
status: e.decision === "error" ? "errored" : "fulfilled",
|
|
746
|
-
duration_ms: e.durationMs,
|
|
747
|
-
arg_bytes: e.argBytes,
|
|
748
|
-
result_bytes: e.resultBytes,
|
|
749
|
-
conversation_id: e.conversationId,
|
|
750
|
-
provider: e.provider,
|
|
751
|
-
model: e.model,
|
|
752
|
-
inference_profile: e.inferenceProfile,
|
|
753
|
-
inference_profile_source:
|
|
754
|
-
e.inferenceProfileSource as UsageAttributionProfileSource | null,
|
|
755
|
-
// `tool_invocations` has no record-time version column — stamp
|
|
756
|
-
// the running binary's `APP_VERSION` so the wire value is
|
|
757
|
-
// concrete rather than an explicit null that would override the
|
|
758
|
-
// envelope under the platform's per-event-wins contract.
|
|
759
|
-
assistant_version: APP_VERSION,
|
|
760
|
-
}),
|
|
761
|
-
),
|
|
762
|
-
...skillLoadedEvents.map(
|
|
763
|
-
(e): TelemetryEvent => ({
|
|
764
|
-
type: "skill_loaded",
|
|
765
|
-
daemon_event_id: e.id,
|
|
766
|
-
recorded_at: e.createdAt,
|
|
767
|
-
skill_name: e.skillName,
|
|
768
|
-
skill_updated_at: e.skillUpdatedAt,
|
|
769
|
-
conversation_id: e.conversationId,
|
|
770
|
-
provider: e.provider,
|
|
771
|
-
model: e.model,
|
|
772
|
-
inference_profile: e.inferenceProfile,
|
|
773
|
-
inference_profile_source:
|
|
774
|
-
e.inferenceProfileSource as UsageAttributionProfileSource | null,
|
|
775
|
-
// `skill_loaded_events` has no record-time version column — same
|
|
776
|
-
// upload-time APP_VERSION stamping as the other non-llm_usage
|
|
777
|
-
// event types.
|
|
778
|
-
assistant_version: APP_VERSION,
|
|
779
|
-
}),
|
|
780
|
-
),
|
|
781
|
-
...watchdogEvents.map(
|
|
782
|
-
(e): TelemetryEvent => ({
|
|
783
|
-
type: "watchdog",
|
|
784
|
-
daemon_event_id: e.id,
|
|
785
|
-
recorded_at: e.createdAt,
|
|
786
|
-
check_name: e.checkName,
|
|
787
|
-
value: e.value,
|
|
788
|
-
// `detail` is stored as JSON text; parse defensively so a
|
|
789
|
-
// corrupted blob never fails the batch flush. A parse failure
|
|
790
|
-
// emits null rather than dropping the event.
|
|
791
|
-
detail: parseWatchdogDetail(e.detail),
|
|
792
|
-
// `watchdog_events` has no record-time version column — same
|
|
793
|
-
// upload-time APP_VERSION stamping as the other non-llm_usage
|
|
794
|
-
// event types.
|
|
795
|
-
assistant_version: APP_VERSION,
|
|
796
|
-
}),
|
|
797
|
-
),
|
|
798
|
-
];
|
|
405
|
+
// Build payload — sources in construction order, each source's events
|
|
406
|
+
// in cursor order.
|
|
407
|
+
const typedEvents = batches.flatMap(({ batch }) => batch.events);
|
|
408
|
+
|
|
409
|
+
// Pre-flush wire validation — observability only: warns about events
|
|
410
|
+
// the server would silently drop; the batch is POSTed unchanged.
|
|
411
|
+
validateWireEvents(typedEvents, log);
|
|
799
412
|
|
|
800
413
|
const organizationId = getPlatformOrganizationId() || undefined;
|
|
801
414
|
const userId = getPlatformUserId() || undefined;
|
|
@@ -828,123 +441,23 @@ export class UsageTelemetryReporter {
|
|
|
828
441
|
}
|
|
829
442
|
await resp.text(); // consume body to release connection
|
|
830
443
|
|
|
831
|
-
//
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
if (reportableTurnEvents.length > 0) {
|
|
845
|
-
const lastTurn = reportableTurnEvents[reportableTurnEvents.length - 1];
|
|
846
|
-
setMemoryCheckpoint(
|
|
847
|
-
CHECKPOINT_KEY_TURN_WATERMARK,
|
|
848
|
-
String(lastTurn.createdAt),
|
|
849
|
-
);
|
|
850
|
-
setMemoryCheckpoint(CHECKPOINT_KEY_TURN_WATERMARK_ID, lastTurn.id);
|
|
851
|
-
}
|
|
852
|
-
|
|
853
|
-
// Advance lifecycle watermark (compound cursor)
|
|
854
|
-
if (lifecycleEvents.length > 0) {
|
|
855
|
-
const lastLifecycle = lifecycleEvents[lifecycleEvents.length - 1];
|
|
856
|
-
setMemoryCheckpoint(
|
|
857
|
-
CHECKPOINT_KEY_LIFECYCLE_WATERMARK,
|
|
858
|
-
String(lastLifecycle.createdAt),
|
|
859
|
-
);
|
|
860
|
-
setMemoryCheckpoint(
|
|
861
|
-
CHECKPOINT_KEY_LIFECYCLE_WATERMARK_ID,
|
|
862
|
-
lastLifecycle.id,
|
|
863
|
-
);
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
// Advance onboarding watermark (compound cursor)
|
|
867
|
-
if (onboardingEvents.length > 0) {
|
|
868
|
-
const lastOnboarding = onboardingEvents[onboardingEvents.length - 1];
|
|
869
|
-
setMemoryCheckpoint(
|
|
870
|
-
CHECKPOINT_KEY_ONBOARDING_WATERMARK,
|
|
871
|
-
String(lastOnboarding.createdAt),
|
|
872
|
-
);
|
|
873
|
-
setMemoryCheckpoint(
|
|
874
|
-
CHECKPOINT_KEY_ONBOARDING_WATERMARK_ID,
|
|
875
|
-
lastOnboarding.id,
|
|
876
|
-
);
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
// Advance auth-fallback watermark (compound cursor)
|
|
880
|
-
if (authFallbackEvents.length > 0) {
|
|
881
|
-
const lastAuthFallback =
|
|
882
|
-
authFallbackEvents[authFallbackEvents.length - 1];
|
|
883
|
-
setMemoryCheckpoint(
|
|
884
|
-
CHECKPOINT_KEY_AUTH_FALLBACK_WATERMARK,
|
|
885
|
-
String(lastAuthFallback.createdAt),
|
|
886
|
-
);
|
|
887
|
-
setMemoryCheckpoint(
|
|
888
|
-
CHECKPOINT_KEY_AUTH_FALLBACK_WATERMARK_ID,
|
|
889
|
-
lastAuthFallback.id,
|
|
890
|
-
);
|
|
891
|
-
}
|
|
892
|
-
|
|
893
|
-
// Advance tool-executed watermark (compound cursor)
|
|
894
|
-
if (toolExecutedEvents.length > 0) {
|
|
895
|
-
const lastToolExecuted =
|
|
896
|
-
toolExecutedEvents[toolExecutedEvents.length - 1];
|
|
897
|
-
setMemoryCheckpoint(
|
|
898
|
-
CHECKPOINT_KEY_TOOL_EXECUTED_WATERMARK,
|
|
899
|
-
String(lastToolExecuted.createdAt),
|
|
900
|
-
);
|
|
901
|
-
setMemoryCheckpoint(
|
|
902
|
-
CHECKPOINT_KEY_TOOL_EXECUTED_WATERMARK_ID,
|
|
903
|
-
lastToolExecuted.id,
|
|
904
|
-
);
|
|
905
|
-
}
|
|
906
|
-
|
|
907
|
-
// Advance skill-loaded watermark (compound cursor)
|
|
908
|
-
if (skillLoadedEvents.length > 0) {
|
|
909
|
-
const lastSkillLoaded = skillLoadedEvents[skillLoadedEvents.length - 1];
|
|
910
|
-
setMemoryCheckpoint(
|
|
911
|
-
CHECKPOINT_KEY_SKILL_LOADED_WATERMARK,
|
|
912
|
-
String(lastSkillLoaded.createdAt),
|
|
913
|
-
);
|
|
914
|
-
setMemoryCheckpoint(
|
|
915
|
-
CHECKPOINT_KEY_SKILL_LOADED_WATERMARK_ID,
|
|
916
|
-
lastSkillLoaded.id,
|
|
917
|
-
);
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
// Advance watchdog watermark (compound cursor)
|
|
921
|
-
if (watchdogEvents.length > 0) {
|
|
922
|
-
const lastWatchdog = watchdogEvents[watchdogEvents.length - 1];
|
|
923
|
-
setMemoryCheckpoint(
|
|
924
|
-
CHECKPOINT_KEY_WATCHDOG_WATERMARK,
|
|
925
|
-
String(lastWatchdog.createdAt),
|
|
926
|
-
);
|
|
927
|
-
setMemoryCheckpoint(
|
|
928
|
-
CHECKPOINT_KEY_WATCHDOG_WATERMARK_ID,
|
|
929
|
-
lastWatchdog.id,
|
|
930
|
-
);
|
|
444
|
+
// Acknowledge each source's shipped rows: ack-mode sources delete them
|
|
445
|
+
// (never touching flush_checkpoints), watermark-mode sources advance
|
|
446
|
+
// their compound cursor to the last reported row.
|
|
447
|
+
for (const { source, batch } of batches) {
|
|
448
|
+
if (source.ack) {
|
|
449
|
+
if (batch.events.length > 0) {
|
|
450
|
+
source.ack.acknowledge(batch.rowIds ?? []);
|
|
451
|
+
}
|
|
452
|
+
} else if (batch.lastCursor) {
|
|
453
|
+
const keys = watermarkKeysForSource(source.id);
|
|
454
|
+
this.checkpoints.set(keys.at, String(batch.lastCursor.createdAt));
|
|
455
|
+
this.checkpoints.set(keys.id, batch.lastCursor.id);
|
|
456
|
+
}
|
|
931
457
|
}
|
|
932
458
|
|
|
933
|
-
// If
|
|
934
|
-
|
|
935
|
-
// the batch, the deferred turns must wait for a later flush (by which
|
|
936
|
-
// point they've settled) rather than being re-queried and re-deferred in
|
|
937
|
-
// a tight recursion.
|
|
938
|
-
if (
|
|
939
|
-
events.length === BATCH_SIZE ||
|
|
940
|
-
reportableTurnEvents.length === BATCH_SIZE ||
|
|
941
|
-
lifecycleEvents.length === BATCH_SIZE ||
|
|
942
|
-
onboardingEvents.length === BATCH_SIZE ||
|
|
943
|
-
authFallbackEvents.length === BATCH_SIZE ||
|
|
944
|
-
toolExecutedEvents.length === BATCH_SIZE ||
|
|
945
|
-
skillLoadedEvents.length === BATCH_SIZE ||
|
|
946
|
-
watchdogEvents.length === BATCH_SIZE
|
|
947
|
-
) {
|
|
459
|
+
// If any source produced a full batch, there may be more — recurse.
|
|
460
|
+
if (batches.some(({ batch }) => batch.fullBatch)) {
|
|
948
461
|
await this._doFlush(batchCount + 1);
|
|
949
462
|
}
|
|
950
463
|
} catch (err) {
|