@mycadet/assistant 0.12.9 → 0.12.10
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/Dockerfile +0 -8
- package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +1 -1
- package/openapi.yaml +62 -910
- package/package.json +3 -7
- package/scripts/build-test-fixtures.ts +1 -1
- package/scripts/generate-openapi.ts +22 -6
- package/scripts/postinstall.ts +4 -10
- package/scripts/run-tests.ts +0 -21
- package/src/__tests__/adaptive-thinking-repair.test.ts +19 -57
- package/src/__tests__/agent-loop.test.ts +0 -76
- package/src/__tests__/anthropic-provider.test.ts +6 -6
- package/src/__tests__/assert-not-live-db.ts +1 -1
- package/src/__tests__/assistant-id-boundary-guard.test.ts +3 -3
- package/src/__tests__/attachments-store-heic-normalize.test.ts +1 -1
- package/src/__tests__/attachments-store.test.ts +1 -1
- package/src/__tests__/audit-log-rotation.test.ts +1 -1
- package/src/__tests__/btw-routes.test.ts +1 -1
- package/src/__tests__/byok-default-profile-ensure.test.ts +21 -27
- package/src/__tests__/call-conversation-messages.test.ts +0 -5
- package/src/__tests__/call-recovery.test.ts +2 -7
- package/src/__tests__/call-routes-http.test.ts +0 -12
- package/src/__tests__/call-store.test.ts +2 -7
- package/src/__tests__/catalog-files.test.ts +7 -5
- package/src/__tests__/checker.test.ts +1 -1
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +4 -4
- package/src/__tests__/cloud-client-verify-credential.test.ts +0 -4
- package/src/__tests__/cloud-credential-catalog-cli.test.ts +14 -14
- package/src/__tests__/cloud-profile-guard.test.ts +48 -401
- package/src/__tests__/compaction-events.test.ts +2 -2
- package/src/__tests__/config-loader-backfill.test.ts +74 -163
- package/src/__tests__/config-loader-cloud-defaults.test.ts +11 -11
- package/src/__tests__/config-loader-corrupt.test.ts +10 -10
- package/src/__tests__/config-loader-quarantine-notice.test.ts +7 -7
- package/src/__tests__/config-loader-validation-reset-notice.test.ts +11 -11
- package/src/__tests__/config-schema.test.ts +26 -27
- package/src/__tests__/config-set-route.test.ts +2 -6
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +28 -300
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +39 -246
- package/src/__tests__/conversation-agent-loop.test.ts +2 -58
- package/src/__tests__/conversation-clear-safety.test.ts +0 -30
- package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
- package/src/__tests__/conversation-queue.test.ts +1 -1
- package/src/__tests__/conversation-runtime-assembly.test.ts +1 -1
- package/src/__tests__/conversation-skill-tools.test.ts +4 -444
- package/src/__tests__/conversation-slash-commands.test.ts +1 -1
- package/src/__tests__/conversation-store.test.ts +1 -84
- package/src/__tests__/conversation-surface-state.test.ts +0 -16
- package/src/__tests__/credential-health-service.test.ts +14 -1
- package/src/__tests__/credential-record-retire.test.ts +1 -1
- package/src/__tests__/credential-record-write-through.test.ts +1 -1
- package/src/__tests__/credential-security-invariants.test.ts +0 -145
- package/src/__tests__/custom-profile-ensure.test.ts +1 -1
- package/src/__tests__/default-profile-catalog-fallback.test.ts +5 -15
- package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -2
- package/src/__tests__/dictation-profile-store.test.ts +6 -6
- package/src/__tests__/disk-usage.test.ts +28 -164
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -1
- package/src/__tests__/embedding-cloud-proxy-selection.test.ts +1 -1
- package/src/__tests__/emit-event-signal.test.ts +1 -1
- package/src/__tests__/gateway-client-cloud-outbound.test.ts +3 -3
- package/src/__tests__/gateway-only-enforcement.test.ts +1 -1
- package/src/__tests__/guardian-dispatch.test.ts +0 -13
- package/src/__tests__/helpers/seed-app.ts +1 -1
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -1
- package/src/__tests__/host-shell-tool.test.ts +1 -1
- package/src/__tests__/identity-routes.test.ts +1 -1
- package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
- package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-config-quarantine-notice.test.ts +1 -1
- package/src/__tests__/injector-config-validation-reset-notice.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/{platform.test.ts → layout.test.ts} +1 -1
- package/src/__tests__/list-all-apps.test.ts +1 -1
- package/src/__tests__/live-workspace-guard.test.ts +2 -2
- package/src/__tests__/llm-resolver-override-or-default.test.ts +5 -6
- package/src/__tests__/llm-resolver.test.ts +7 -7
- package/src/__tests__/llm-schema-fallback-profile.test.ts +9 -10
- package/src/__tests__/llm-usage-store.test.ts +0 -495
- package/src/__tests__/log-export-routes.test.ts +1 -1
- package/src/__tests__/mcp-config-secret-boundary.test.ts +12 -53
- package/src/__tests__/mcp-list-plugin-servers.test.ts +1 -1
- package/src/__tests__/memory-config-file-parity.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messages-read-boundary-guard.test.ts +0 -2
- package/src/__tests__/notification-guardian-path.test.ts +0 -7
- package/src/__tests__/onboarding-persona-write.test.ts +1 -1
- package/src/__tests__/openai-provider.test.ts +8 -8
- package/src/__tests__/path-policy.test.ts +1 -1
- package/src/__tests__/persona-resolver.test.ts +1 -1
- package/src/__tests__/plugin-app-serve-routes.test.ts +1 -1
- package/src/__tests__/plugin-effective-enabled-set.test.ts +1 -1
- package/src/__tests__/plugin-import-boundary-guard.test.ts +4 -6
- package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -3
- package/src/__tests__/provider-cloud-proxy-integration.test.ts +1 -5
- package/src/__tests__/provider-connections-backfill.test.ts +10 -10
- package/src/__tests__/prune-old-conversations-job.test.ts +6 -31
- package/src/__tests__/resolve-app.test.ts +1 -1
- package/src/__tests__/run-due-schedules.test.ts +1 -1
- package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -53
- package/src/__tests__/schedule-routes.test.ts +1 -1
- package/src/__tests__/schedule-store.test.ts +1 -1
- package/src/__tests__/secret-routes-cloud-proxy.test.ts +1 -1
- package/src/__tests__/skill-load-plugin-scope.test.ts +1 -1
- package/src/__tests__/surface-completion-compaction-boundary.test.ts +1 -1
- package/src/__tests__/tool-approval-handler.test.ts +1 -1
- package/src/__tests__/tool-audit.test.ts +5 -235
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +54 -114
- package/src/__tests__/tools-get-route.test.ts +1 -1
- package/src/__tests__/turn-outcome-read.test.ts +1 -1
- package/src/__tests__/twilio-routes.test.ts +0 -1
- package/src/__tests__/usage-attribution.test.ts +0 -31
- package/src/__tests__/verification-control-plane-policy.test.ts +3 -10
- package/src/__tests__/visible-app-context.test.ts +1 -1
- package/src/__tests__/voice-ingress-preflight.test.ts +1 -1
- package/src/__tests__/workspace-git-service.test.ts +1 -1
- package/src/__tests__/workspace-greetings.test.ts +1 -1
- package/src/acp/__tests__/helpers/acp-config-stub.ts +1 -1
- package/src/activation/progress-store.ts +1 -1
- package/src/activation/turn-hooks.ts +1 -1
- package/src/agent/loop.ts +0 -51
- package/src/apps/app-store.ts +1 -1
- package/src/avatar/__tests__/avatar-store.test.ts +2 -172
- package/src/avatar/accent-backfill.ts +1 -1
- package/src/avatar/avatar-manifest.ts +1 -1
- package/src/avatar/avatar-store.ts +10 -69
- package/src/avatar/ensure-raster.ts +1 -1
- package/src/avatar/identity-avatar.ts +1 -1
- package/src/avatar/sync-avatar.ts +1 -1
- package/src/avatar/traits-png-sync.ts +1 -1
- package/src/bundler/compiler-tools.ts +1 -1
- package/src/bundler/package-resolver.ts +1 -1
- package/src/calls/__tests__/call-controller.test.ts +25 -27
- package/src/calls/active-call-lease.ts +1 -1
- package/src/calls/call-controller.ts +3 -3
- package/src/calls/call-domain.ts +4 -8
- package/src/calls/call-store.ts +2 -76
- package/src/calls/resolve-call-tts-provider.ts +3 -3
- package/src/calls/twilio-config.ts +3 -3
- package/src/calls/twilio-rest.ts +2 -2
- package/src/calls/voice-ingress-preflight.ts +2 -2
- package/src/cli/bundled-modules.ts +0 -2
- package/src/cli/commands/__tests__/apps.test.ts +1 -1
- package/src/cli/commands/__tests__/plugins.test.ts +9 -66
- package/src/cli/commands/__tests__/ps.test.ts +67 -0
- package/src/cli/commands/auth.help.ts +2 -2
- package/src/cli/commands/avatar.ts +1 -1
- package/src/cli/commands/changelog.ts +1 -1
- package/src/cli/commands/cloud/__tests__/subscription.test.ts +2 -2
- package/src/cli/commands/cloud/index.help.ts +1 -1
- package/src/cli/commands/cloud/index.ts +2 -2
- package/src/cli/commands/db/refresh.ts +1 -1
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +1 -1
- package/src/cli/commands/db/repair.ts +1 -1
- package/src/cli/commands/db/status.ts +1 -1
- package/src/cli/commands/inference-profiles.ts +1 -12
- package/src/cli/commands/memory/__tests__/memory-v3.test.ts +1 -116
- package/src/cli/commands/memory/index.help.ts +1 -43
- package/src/cli/commands/memory/memory-v3.ts +0 -64
- package/src/cli/commands/plugins.ts +54 -205
- package/src/cli/commands/ps.ts +5 -2
- package/src/cli/commands/status.ts +1 -1
- package/src/cli/index.help.ts +0 -2
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +36 -66
- package/src/cli/lib/__tests__/install-from-cloud.test.ts +1 -1
- package/src/cli/lib/__tests__/install-from-github.test.ts +41 -117
- package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +2 -185
- package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +36 -66
- package/src/cli/lib/__tests__/plugin-catalog-visibility.test.ts +4 -6
- package/src/cli/lib/__tests__/plugin-details.test.ts +113 -96
- package/src/cli/lib/__tests__/search-plugins.test.ts +9 -16
- package/src/cli/lib/__tests__/uninstall-plugin.test.ts +1 -1
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +38 -15
- package/src/cli/lib/diff-plugin.ts +1 -1
- package/src/cli/lib/inspect-plugin.ts +13 -97
- package/src/cli/lib/install-from-cloud.ts +1 -1
- package/src/cli/lib/install-from-github.ts +75 -154
- package/src/cli/lib/install-plugin-dependencies.ts +1 -1
- package/src/cli/lib/list-installed-plugins.ts +1 -1
- package/src/cli/lib/open-browser.ts +1 -1
- package/src/cli/lib/plugin-catalog-cache.ts +8 -51
- package/src/cli/lib/plugin-catalog-resolve.ts +3 -22
- package/src/cli/lib/plugin-details.ts +5 -27
- package/src/cli/lib/plugin-marketplace.ts +18 -266
- package/src/cli/lib/search-plugins.ts +23 -43
- package/src/cli/lib/toggle-plugin.ts +1 -1
- package/src/cli/lib/uninstall-plugin.ts +1 -1
- package/src/cli/lib/upgrade-plugin.ts +3 -49
- package/src/cli/program.ts +1 -3
- package/src/cli.ts +1 -1
- package/src/cloud/client.ts +0 -6
- package/src/cloud/consent-cache.test.ts +22 -201
- package/src/cloud/consent-cache.ts +16 -111
- package/src/cloud/sync-identity.ts +1 -1
- package/src/config/__tests__/chat-settings.test.ts +1 -1
- package/src/config/__tests__/cloud-identity.test.ts +15 -2
- package/src/config/__tests__/default-plugin-skill-discovery.test.ts +1 -1
- package/src/config/__tests__/default-profile-catalog.test.ts +12 -51
- package/src/config/__tests__/deployment-context-defaults.test.ts +13 -13
- package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +4 -4
- package/src/config/__tests__/loader-last-known-good.test.ts +9 -9
- package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +7 -7
- package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +1 -1
- package/src/config/__tests__/profile-materialization.test.ts +2 -4
- package/src/config/__tests__/sync-gated-profiles.test.ts +1 -106
- package/src/config/acp-agent-write.ts +1 -1
- package/src/config/bundled-skills/settings/tools/open-system-settings.test.ts +1 -1
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
- package/src/config/call-site-defaults.ts +0 -6
- package/src/config/cloud-identity.ts +12 -5
- package/src/config/composer-preferences.ts +1 -1
- package/src/config/default-profile-catalog.ts +8 -75
- package/src/config/default-profile-names.ts +2 -25
- package/src/config/env-registry.ts +1 -14
- package/src/config/env.ts +8 -6
- package/src/config/llm-resolver.ts +1 -2
- package/src/config/loader.ts +13 -17
- package/src/config/profile-materialization.ts +1 -1
- package/src/config/schema.ts +1 -7
- package/src/config/schemas/call-site-catalog.ts +0 -7
- package/src/config/schemas/llm.ts +22 -27
- package/src/config/seed-inference-profiles.ts +16 -17
- package/src/config/skills.ts +2 -2
- package/src/config/sync-gated-profiles.ts +6 -24
- package/src/credential-health/credential-health-service.ts +10 -3
- package/src/daemon/approval-generators.ts +3 -3
- package/src/daemon/config-watcher.ts +2 -2
- package/src/daemon/conversation-agent-loop-handlers.ts +0 -18
- package/src/daemon/conversation-agent-loop.ts +6 -97
- package/src/daemon/conversation-process.ts +1 -1
- package/src/daemon/conversation-skill-tools.ts +4 -72
- package/src/daemon/conversation-store.ts +1 -1
- package/src/daemon/conversation-surface-state.ts +0 -33
- package/src/daemon/conversation-surfaces.ts +1 -86
- package/src/daemon/conversation-tool-setup.test.ts +1 -1
- package/src/daemon/conversation-tool-setup.ts +0 -23
- package/src/daemon/conversation.ts +3 -5
- package/src/daemon/daemon-control.ts +3 -3
- package/src/daemon/dictation-profile-store.ts +3 -3
- package/src/daemon/event-loop-watchdog.test.ts +2 -198
- package/src/daemon/event-loop-watchdog.ts +0 -185
- package/src/daemon/external-plugins-bootstrap.ts +1 -1
- package/src/daemon/first-greeting.ts +1 -1
- package/src/daemon/handlers/skills.ts +1 -1
- package/src/daemon/host-app-control-proxy.ts +1 -1
- package/src/daemon/host-cu-proxy.ts +2 -2
- package/src/daemon/identity-helpers.ts +1 -1
- package/src/daemon/lifecycle.ts +11 -15
- package/src/daemon/main.ts +1 -1
- package/src/daemon/now-scratchpad.ts +1 -1
- package/src/daemon/process-message.ts +4 -4
- package/src/daemon/profiler-run-store.ts +2 -2
- package/src/daemon/providers-setup.ts +2 -2
- package/src/daemon/shutdown-handlers.ts +0 -10
- package/src/daemon/sqlite-corruption-watchdog.test.ts +2 -142
- package/src/daemon/sqlite-corruption-watchdog.ts +17 -81
- package/src/daemon/tool-side-effects.ts +1 -1
- package/src/desktop/desktop-session-manager.ts +1 -1
- package/src/desktop/desktop-wallpaper-renderer.ts +1 -1
- package/src/heartbeat/heartbeat-service.ts +1 -1
- package/src/home/feed-writer.ts +1 -1
- package/src/home/home-greeting-cache.ts +1 -1
- package/src/home/relationship-state-writer.ts +2 -2
- package/src/hooks/__tests__/hook-live-reload.test.ts +1 -1
- package/src/hooks/hook-loader.ts +2 -2
- package/src/inbound/__tests__/oauth-callback-url.test.ts +2 -2
- package/src/inbound/oauth-callback-url.ts +3 -3
- package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
- package/src/ipc/socket-path.ts +1 -1
- package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
- package/src/live-voice/__tests__/live-voice-vad.test.ts +1 -1
- package/src/live-voice/live-voice-session.ts +3 -66
- package/src/mcp/__tests__/effective-config.test.ts +1 -1
- package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +2 -2
- package/src/mcp/__tests__/mcp-oauth-provider.test.ts +2 -3
- package/src/mcp/__tests__/reload-signal-emission.test.ts +1 -1
- package/src/mcp/__tests__/reload-signal.test.ts +1 -1
- package/src/mcp/__tests__/workspace-mcp-config.test.ts +19 -21
- package/src/mcp/reload-signal.ts +1 -1
- package/src/mcp/workspace-mcp-config.ts +1 -23
- package/src/messaging/draft-store.ts +1 -1
- package/src/monitoring/__tests__/active-conversations.test.ts +1 -1
- package/src/monitoring/__tests__/page-cache.test.ts +1 -1
- package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
- package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +1 -1
- package/src/monitoring/active-conversations.ts +1 -1
- package/src/monitoring/control.ts +1 -1
- package/src/monitoring/daemon-boot-time.ts +1 -1
- package/src/monitoring/daemon-heartbeat.ts +1 -1
- package/src/monitoring/page-cache.ts +1 -1
- package/src/monitoring/plugin-auto-update.ts +1 -7
- package/src/monitoring/plugin-source-watch.ts +1 -1
- package/src/monitoring/recovery/db.ts +1 -1
- package/src/monitoring/recovery/inflight-content.ts +1 -1
- package/src/monitoring/resource-sampler.ts +3 -14
- package/src/monitoring/stall-capture.ts +1 -1
- package/src/monitoring/worker.ts +9 -76
- package/src/monitoring/workspace-git-heartbeat.ts +1 -1
- package/src/oauth/connect-orchestrator.ts +4 -4
- package/src/permissions/checker.ts +1 -1
- package/src/permissions/workspace-policy.ts +1 -1
- package/src/persistence/__tests__/main-db-readonly-probe.ts +27 -52
- package/src/persistence/__tests__/message-content-file.test.ts +1 -1
- package/src/persistence/__tests__/slow-sync-log.test.ts +0 -2
- package/src/persistence/attachments-store.ts +1 -1
- package/src/persistence/conversation-crud.ts +1 -38
- package/src/persistence/conversation-directories.ts +1 -1
- package/src/persistence/conversation-types.ts +0 -8
- package/src/persistence/db-async-query.ts +1 -1
- package/src/persistence/db-connection.ts +11 -1
- package/src/persistence/db-init.ts +1 -1
- package/src/persistence/db-maintenance.ts +1 -1
- package/src/persistence/embeddings/__tests__/embedding-local-lifecycle.test.ts +1 -1
- package/src/persistence/embeddings/embedding-local.ts +4 -4
- package/src/persistence/embeddings/embedding-runtime-manager.ts +1 -1
- package/src/persistence/embeddings/qdrant-client.ts +1 -1
- package/src/persistence/embeddings/qdrant-manager.ts +1 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +1 -1
- package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +1 -1
- package/src/persistence/job-handlers/cleanup.ts +8 -17
- package/src/persistence/llm-usage-store.ts +2 -229
- package/src/persistence/message-content-file.ts +1 -1
- package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +1 -1
- package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +1 -1
- package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
- package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.test.ts +13 -0
- package/src/persistence/migrations/333-create-telemetry-events-table.test.ts +7 -4
- package/src/persistence/migrations/334-backfill-telemetry-events-outbox.test.ts +13 -0
- package/src/persistence/migrations/387-drop-telemetry-tables.ts +51 -0
- package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +9 -1
- package/src/persistence/migrations/__tests__/387-drop-telemetry-tables.test.ts +79 -0
- package/src/persistence/migrations/helpers/relocation.ts +1 -1
- package/src/persistence/migrations/run-migrations.ts +1 -1
- package/src/persistence/migrations/validate-migration-state.ts +1 -1
- package/src/persistence/raw-query.ts +1 -29
- package/src/persistence/slow-sync-log.ts +0 -23
- package/src/persistence/steps.ts +2 -0
- package/src/{telemetry → persistence}/tool-audit.ts +6 -121
- package/src/plugin-api/index.ts +1 -1
- package/src/plugin-api/plugin-name-env.ts +1 -1
- package/src/plugins/__tests__/installed-plugin-dirs.test.ts +1 -1
- package/src/plugins/collect-source-versions.ts +1 -1
- package/src/plugins/defaults/channel/package.json +1 -1
- package/src/plugins/defaults/cloud-hosted/package.json +1 -1
- package/src/plugins/defaults/compaction/package.json +1 -1
- package/src/plugins/defaults/documents/package.json +1 -1
- package/src/plugins/defaults/empty-response/package.json +1 -1
- package/src/plugins/defaults/exploration-drift/package.json +1 -1
- package/src/plugins/defaults/image-fallback/package.json +1 -1
- package/src/plugins/defaults/image-recovery/package.json +1 -1
- package/src/plugins/defaults/max-tokens-continue/package.json +1 -1
- package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +1 -1
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +0 -82
- package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +0 -41
- package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -2
- package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -52
- package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +0 -18
- package/src/plugins/defaults/memory/package.json +1 -1
- package/src/plugins/defaults/memory/paths.ts +4 -4
- package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
- package/src/plugins/defaults/memory/src/memory-v2-routes.ts +5 -5
- package/src/plugins/defaults/memory/src/memory-v3-routes.ts +0 -207
- package/src/plugins/defaults/memory/src/memory-worker-routes.ts +1 -1
- package/src/plugins/defaults/memory/startup.ts +1 -22
- package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +2 -253
- package/src/plugins/defaults/memory/v3/orchestrate.ts +5 -129
- package/src/plugins/defaults/memory/worker-control.ts +1 -1
- package/src/plugins/defaults/memory/worker.ts +2 -2
- package/src/plugins/defaults/session/package.json +1 -1
- package/src/plugins/defaults/surface-completion-nudge/package.json +1 -1
- package/src/plugins/defaults/task-progress/package.json +1 -1
- package/src/plugins/defaults/task-progress-nudge/package.json +1 -1
- package/src/plugins/defaults/title-generate/package.json +1 -1
- package/src/plugins/defaults/tool-error/package.json +1 -1
- package/src/plugins/defaults/tool-result-truncate/package.json +1 -1
- package/src/plugins/defaults/turn-context/package.json +1 -1
- package/src/plugins/defaults/workspace/injectors.ts +1 -1
- package/src/plugins/defaults/workspace/package.json +1 -1
- package/src/plugins/disabled-state.ts +1 -1
- package/src/plugins/ensure-plugin-api-shim.ts +1 -1
- package/src/plugins/ensure-shared-dep-links.ts +1 -1
- package/src/plugins/installed-plugin-dirs.ts +1 -1
- package/src/plugins/mcp-servers.ts +7 -9
- package/src/plugins/mtime-cache.ts +2 -2
- package/src/plugins/source-versions.ts +1 -1
- package/src/prompts/bootstrap-cleanup.ts +1 -1
- package/src/prompts/persona-resolver.ts +1 -1
- package/src/prompts/sections.ts +2 -2
- package/src/prompts/system-prompt.ts +10 -42
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +0 -37
- package/src/providers/__tests__/cadet-connection-routing.test.ts +2 -2
- package/src/providers/cadet/client.ts +1 -1
- package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -1
- package/src/providers/inference/adapter-factory.ts +1 -1
- package/src/providers/inference/backfill.ts +3 -10
- package/src/providers/inference/profile-probe.ts +1 -1
- package/src/providers/retry.ts +0 -2
- package/src/providers/types.ts +0 -7
- package/src/providers/usage-tracking.ts +1 -1
- package/src/routes/__tests__/route-host.test.ts +1 -1
- package/src/routes/control.ts +1 -1
- package/src/routes/route-host-client.ts +1 -1
- package/src/routes/worker.ts +2 -2
- package/src/runtime/agent-wake.ts +1 -1
- package/src/runtime/assistant-stream-state.ts +1 -1
- package/src/runtime/auth/token-service.ts +1 -1
- package/src/runtime/background-job-runner.ts +1 -1
- package/src/runtime/middleware/twilio-validation.ts +2 -2
- package/src/runtime/routes/__tests__/app-pin-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +1 -1
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +3 -33
- package/src/runtime/routes/__tests__/cloud-credits-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/cloud-invoice-routes.test.ts +4 -3
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +59 -287
- package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/deprecated-route-context.test.ts +15 -62
- package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +105 -12
- package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +47 -211
- package/src/runtime/routes/__tests__/route-host-worker-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +1 -1
- package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-cli.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-notices.test.ts +1 -1
- package/src/runtime/routes/__tests__/user-routes-request.test.ts +1 -1
- package/src/runtime/routes/app-management-routes.ts +1 -1
- package/src/runtime/routes/attachment-routes.ts +1 -1
- package/src/runtime/routes/audit-routes.ts +1 -1
- package/src/runtime/routes/avatar-routes.ts +3 -10
- package/src/runtime/routes/cloud-routes.ts +3 -3
- package/src/runtime/routes/content-source-routes.ts +1 -1
- package/src/runtime/routes/conversation-query-routes.ts +60 -621
- package/src/runtime/routes/conversation-routes.ts +1 -38
- package/src/runtime/routes/debug-routes.ts +1 -1
- package/src/runtime/routes/deprecated-route-context.ts +5 -61
- package/src/runtime/routes/heartbeat-routes.ts +1 -1
- package/src/runtime/routes/identity-routes.ts +1 -1
- package/src/runtime/routes/index.ts +0 -6
- package/src/runtime/routes/inference-profile-session-handler.ts +3 -3
- package/src/runtime/routes/inference-profiles-routes.ts +48 -21
- package/src/runtime/routes/inference-provider-connection-routes.ts +0 -1
- package/src/runtime/routes/llm-call-sites-routes.ts +3 -3
- package/src/runtime/routes/log-export/__tests__/installed-inventory.test.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
- package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +1 -1
- package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
- package/src/runtime/routes/log-export-routes.ts +17 -15
- package/src/runtime/routes/migration-rollback-routes.ts +1 -1
- package/src/runtime/routes/migration-routes.ts +2 -3
- package/src/runtime/routes/monitoring-routes.ts +2 -2
- package/src/runtime/routes/oauth-providers.ts +5 -5
- package/src/runtime/routes/plugins-routes.ts +38 -163
- package/src/runtime/routes/profiler-routes.ts +1 -1
- package/src/runtime/routes/route-host-worker-routes.ts +1 -1
- package/src/runtime/routes/sanity-routes.ts +1 -1
- package/src/runtime/routes/schedule-routes.ts +1 -1
- package/src/runtime/routes/schedule-worker-routes.ts +1 -1
- package/src/runtime/routes/settings-routes.ts +1 -1
- package/src/runtime/routes/sounds-config-routes.ts +1 -1
- package/src/runtime/routes/surface-conversation-resolver.ts +1 -7
- package/src/runtime/routes/user-route-dispatcher.ts +1 -3
- package/src/runtime/routes/user-route-import.ts +1 -1
- package/src/runtime/routes/user-route-resolution.ts +1 -1
- package/src/runtime/routes/user-routes-cli.ts +1 -1
- package/src/runtime/routes/workspace-commit-routes.ts +1 -1
- package/src/runtime/routes/workspace-greetings.ts +1 -1
- package/src/runtime/routes/workspace-routes.ts +1 -1
- package/src/runtime/routes/workspace-utils.ts +1 -1
- package/src/runtime/sync/resource-sync-events.ts +1 -1
- package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +1 -1
- package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1 -1
- package/src/schedule/plugin-schedule-availability.ts +1 -1
- package/src/schedule/plugin-schedule-declarations.ts +1 -1
- package/src/schedule/run-script.ts +1 -1
- package/src/schedule/scheduler.ts +1 -11
- package/src/schedule/worker-control.ts +1 -1
- package/src/schedule/worker.ts +3 -3
- package/src/security/oauth2.ts +2 -2
- package/src/security/secret-allowlist.ts +1 -1
- package/src/signals/cancel.ts +1 -1
- package/src/signals/conversation-undo.ts +1 -1
- package/src/signals/emit-event.ts +1 -1
- package/src/signals/event-stream.ts +1 -1
- package/src/signals/user-message.ts +1 -1
- package/src/skills/catalog-install.ts +2 -1
- package/src/skills/clawhub.ts +1 -1
- package/src/skills/cloud-store.ts +1 -1
- package/src/skills/path-classifier.ts +1 -1
- package/src/skills/skill-history.ts +1 -1
- package/src/skills/skillssh-registry.ts +1 -1
- package/src/skills/uninstall.ts +1 -1
- package/src/skills/workspace-skill-md-signature.ts +1 -1
- package/src/subagent/manager.ts +1 -1
- package/src/theme/workspace-theme.ts +1 -1
- package/src/tools/browser/auth-cache.ts +1 -1
- package/src/tools/browser/browser-manager.ts +1 -1
- package/src/tools/browser/runtime-check.ts +1 -1
- package/src/tools/executor.ts +4 -4
- package/src/tools/filesystem/write.ts +1 -1
- package/src/tools/permission-checker.ts +2 -51
- package/src/tools/run-standalone.ts +1 -1
- package/src/tools/skills/format-input-schema.ts +1 -1
- package/src/tools/skills/load.ts +1 -1
- package/src/tools/skills/scaffold-cloud.ts +0 -32
- package/src/tools/terminal/safe-env.ts +1 -2
- package/src/tools/terminal/sanitized-bash.ts +1 -1
- package/src/tools/terminal/shell.ts +1 -1
- package/src/tools/tool-approval-handler.ts +4 -1
- package/src/tools/workflows/manage-workflows.ts +2 -2
- package/src/tools/workflows/run-workflow.test.ts +1 -1
- package/src/tools/workspace-tools/loader.ts +1 -1
- package/src/tts/synthesis-stream.ts +2 -2
- package/src/usage/attribution.ts +1 -11
- package/src/util/browser.ts +1 -1
- package/src/util/bun-runtime.ts +2 -1
- package/src/util/device-id.ts +1 -1
- package/src/util/disk-usage.ts +4 -139
- package/src/util/layout.ts +3 -3
- package/src/util/logger.ts +1 -1
- package/src/util/logs-db-path.ts +1 -1
- package/src/util/memory-db-path.ts +1 -1
- package/src/util/{platform.ts → os.ts} +5 -30
- package/src/util/process-tree.ts +19 -0
- package/src/util/sqlite3-runtime.ts +1 -1
- package/src/util/telemetry-db-path.ts +1 -1
- package/src/watcher/__tests__/engine.test.ts +0 -23
- package/src/watcher/engine.ts +0 -7
- package/src/windows-compiled-cli.ts +0 -4
- package/src/windows-compiled-worker-entry.ts +0 -6
- package/src/workflows/leaf-runner.test.ts +1 -1
- package/src/workflows/leaf-runner.ts +1 -1
- package/src/workflows/library.ts +1 -1
- package/src/workspace/adaptive-thinking-repair.ts +5 -24
- package/src/workspace/byok-default-profile-ensure.ts +24 -26
- package/src/workspace/custom-profile-ensure.ts +2 -2
- package/src/workspace/git-service.ts +1 -1
- package/src/workspace/hatched-date.ts +1 -1
- package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +2 -2
- package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
- package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +1 -1
- package/src/workspace/migrations/077-seed-memory-router-callsite.ts +1 -1
- package/src/workspace/migrations/registry.ts +0 -4
- package/src/workspace/turn-commit.ts +1 -1
- package/docs/activation-funnel-telemetry.md +0 -324
- package/scripts/bundled-plugin-packages.ts +0 -154
- package/scripts/generate-bundled-plugin-packages.ts +0 -29
- package/src/__tests__/activation-early-marking.test.ts +0 -114
- package/src/__tests__/auth-fallback-events-store.test.ts +0 -99
- package/src/__tests__/config-get-vision-flag.test.ts +0 -139
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -400
- package/src/__tests__/internal-telemetry-routes.test.ts +0 -213
- package/src/__tests__/telemetry-routes.test.ts +0 -182
- package/src/__tests__/turn-events-store.test.ts +0 -376
- package/src/__tests__/ui-channel-variants.test.ts +0 -53
- package/src/avatar/__tests__/avatar-changed-telemetry.test.ts +0 -217
- package/src/avatar/avatar-changed-telemetry.ts +0 -128
- package/src/calls/__tests__/call-funnel-telemetry.test.ts +0 -204
- package/src/cli/commands/telemetry.help.ts +0 -27
- package/src/cli/commands/telemetry.ts +0 -83
- package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +0 -251
- package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +0 -113
- package/src/cli/lib/__tests__/plugin-marketplace.test.ts +0 -384
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +0 -164
- package/src/cli/lib/__tests__/plugins-install-offline.test.ts +0 -228
- package/src/cli/lib/bundled-marketplace.json +0 -1575
- package/src/cli/lib/bundled-plugin-packages.json +0 -827
- package/src/cli/lib/bundled-plugin-packages.ts +0 -87
- package/src/cli/lib/plugin-catalog-local.ts +0 -94
- package/src/cli/lib/plugin-pin-history.ts +0 -276
- package/src/cloud/feature-gate.ts +0 -8
- package/src/config/__tests__/cloud-rehydration.test.ts +0 -180
- package/src/config/cloud-rehydration.ts +0 -35
- package/src/daemon/__tests__/auto-profile-router.test.ts +0 -380
- package/src/daemon/auto-profile-router.ts +0 -428
- package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +0 -391
- package/src/monitoring/__tests__/db-integrity-sample.test.ts +0 -113
- package/src/monitoring/__tests__/oom-kill-reporter.test.ts +0 -374
- package/src/monitoring/db-integrity-check.ts +0 -163
- package/src/monitoring/db-integrity-sample.ts +0 -176
- package/src/monitoring/oom-kill-reporter.ts +0 -469
- package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -158
- package/src/onboarding/onboarding-events-store.ts +0 -296
- package/src/persistence/__tests__/raw-query-telemetry.test.ts +0 -76
- package/src/persistence/lifecycle-events-store.test.ts +0 -134
- package/src/persistence/lifecycle-events-store.ts +0 -110
- package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +0 -76
- package/src/plugins/defaults/memory/activation-session-store.ts +0 -50
- package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +0 -281
- package/src/runtime/routes/auto-profile-routes.ts +0 -83
- package/src/runtime/routes/internal-telemetry-routes.ts +0 -142
- package/src/runtime/routes/telemetry-routes.ts +0 -274
- package/src/security/auth-fallback-events-store.ts +0 -57
- package/src/telemetry/__tests__/activation-funnel.test.ts +0 -95
- package/src/telemetry/__tests__/config-setting-events-store.test.ts +0 -63
- package/src/telemetry/__tests__/config-setting-snapshot.test.ts +0 -143
- package/src/telemetry/__tests__/flush-checkpoints.test.ts +0 -56
- package/src/telemetry/__tests__/live-voice-funnel.test.ts +0 -174
- package/src/telemetry/__tests__/outbox-test-harness.ts +0 -85
- package/src/telemetry/__tests__/phone-call-funnel.test.ts +0 -72
- package/src/telemetry/__tests__/telemetry-event-fixtures.ts +0 -282
- package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -71
- package/src/telemetry/activation-funnel.ts +0 -172
- package/src/telemetry/config-setting-events-store.ts +0 -40
- package/src/telemetry/config-setting-snapshot.ts +0 -170
- package/src/telemetry/flush-checkpoints.ts +0 -70
- package/src/telemetry/live-voice-funnel.ts +0 -185
- package/src/telemetry/memory-corpus-size.test.ts +0 -120
- package/src/telemetry/memory-corpus-size.ts +0 -184
- package/src/telemetry/memory-tier-reporter.test.ts +0 -195
- package/src/telemetry/memory-tier-reporter.ts +0 -130
- package/src/telemetry/phone-call-funnel.ts +0 -144
- package/src/telemetry/skill-loaded-events-store.test.ts +0 -93
- package/src/telemetry/skill-loaded-events-store.ts +0 -39
- package/src/telemetry/telemetry-event-sources.test.ts +0 -223
- package/src/telemetry/telemetry-event-sources.ts +0 -597
- package/src/telemetry/telemetry-events-outbox.test.ts +0 -375
- package/src/telemetry/telemetry-events-outbox.ts +0 -237
- package/src/telemetry/telemetry-main-db.ts +0 -48
- package/src/telemetry/telemetry-wire-source.json +0 -4
- package/src/telemetry/telemetry-wire-validation.test.ts +0 -157
- package/src/telemetry/telemetry-wire-validation.ts +0 -162
- package/src/telemetry/telemetry-wire.generated.ts +0 -483
- package/src/telemetry/tool-executed-events-store.test.ts +0 -210
- package/src/telemetry/tool-executed-events-store.ts +0 -102
- package/src/telemetry/trace-collection-policy.test.ts +0 -28
- package/src/telemetry/trace-collection-policy.ts +0 -30
- package/src/telemetry/turn-events-store.ts +0 -216
- package/src/telemetry/turn-trace-store.test.ts +0 -884
- package/src/telemetry/turn-trace-store.ts +0 -399
- package/src/telemetry/types.test.ts +0 -38
- package/src/telemetry/types.ts +0 -780
- package/src/telemetry/usage-telemetry-reporter.test.ts +0 -3445
- package/src/telemetry/usage-telemetry-reporter.ts +0 -566
- package/src/telemetry/watchdog-direct-emit.test.ts +0 -112
- package/src/telemetry/watchdog-direct-emit.ts +0 -104
- package/src/telemetry/watchdog-events-store.ts +0 -31
- package/src/tools/ui-surface/channel-variants.ts +0 -52
- package/src/watcher/__tests__/telemetry.test.ts +0 -178
- package/src/watcher/telemetry.ts +0 -93
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +0 -165
- package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +0 -151
- /package/src/{telemetry → persistence}/tool-usage-store.ts +0 -0
- /package/src/{telemetry → persistence}/turn-outcome.ts +0 -0
|
@@ -1,597 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Per-event-type telemetry sources for the usage telemetry reporter.
|
|
3
|
-
*
|
|
4
|
-
* Each {@link TelemetryEventSource} owns one event type end-to-end: querying
|
|
5
|
-
* unreported rows after a compound `(createdAt, id)` cursor, mapping them to
|
|
6
|
-
* wire events, and deciding which rows are reportable this cycle (the turn
|
|
7
|
-
* source defers in-flight turns). The reporter is a generic engine over a
|
|
8
|
-
* list of sources, so which process flushes which event types is a matter of
|
|
9
|
-
* which sources its reporter instance is constructed with.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import {
|
|
13
|
-
getCachedShareDiagnostics,
|
|
14
|
-
getCachedShareDiagnosticsVersion,
|
|
15
|
-
} from "../cloud/consent-cache.js";
|
|
16
|
-
import { queryUnreportedUsageEvents } from "../persistence/llm-usage-store.js";
|
|
17
|
-
import type { UsageAttributionProfileSource } from "../usage/types.js";
|
|
18
|
-
import { getLogger } from "../util/logger.js";
|
|
19
|
-
import { APP_VERSION } from "../version.js";
|
|
20
|
-
import {
|
|
21
|
-
deleteTelemetryOutboxEvents,
|
|
22
|
-
discardPendingTelemetryOutboxEvents,
|
|
23
|
-
queryDistinctOutboxEventNames,
|
|
24
|
-
queryTelemetryOutboxBatch,
|
|
25
|
-
} from "./telemetry-events-outbox.js";
|
|
26
|
-
import { queryUnreportedToolExecutedEvents } from "./tool-executed-events-store.js";
|
|
27
|
-
import { isDiagnosticsConsentVersionEligible } from "./trace-collection-policy.js";
|
|
28
|
-
import { queryUnreportedTurnEvents } from "./turn-events-store.js";
|
|
29
|
-
import { assembleBoundedTurnTrace, isTurnSettled } from "./turn-trace-store.js";
|
|
30
|
-
import type {
|
|
31
|
-
OutboxTelemetryEventName,
|
|
32
|
-
TelemetryEvent,
|
|
33
|
-
TurnTelemetryClientInfo,
|
|
34
|
-
} from "./types.js";
|
|
35
|
-
import { OUTBOX_TELEMETRY_EVENT_NAMES } from "./types.js";
|
|
36
|
-
|
|
37
|
-
const log = getLogger("usage-telemetry");
|
|
38
|
-
|
|
39
|
-
/** Compound `(createdAt, id)` position of a reported row. */
|
|
40
|
-
export interface TelemetryCursor {
|
|
41
|
-
createdAt: number;
|
|
42
|
-
id: string;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** One flush cycle's worth of reportable events from a single source. */
|
|
46
|
-
export interface TelemetryEventSourceBatch {
|
|
47
|
-
/** Wire events for the rows reportable this cycle, in cursor order. */
|
|
48
|
-
events: TelemetryEvent[];
|
|
49
|
-
/**
|
|
50
|
-
* Row ids backing `events`, set by ack-mode sources so the reporter can
|
|
51
|
-
* acknowledge (delete) exactly the shipped rows. These are ROW ids, not
|
|
52
|
-
* wire `daemon_event_id`s — the onboarding source overrides
|
|
53
|
-
* `daemon_event_id` for activation rows, so the two can differ.
|
|
54
|
-
*/
|
|
55
|
-
rowIds?: string[];
|
|
56
|
-
/** Cursor of the last reportable row; null when nothing is reportable. */
|
|
57
|
-
lastCursor: TelemetryCursor | null;
|
|
58
|
-
/**
|
|
59
|
-
* True when this source may have more rows immediately behind the batch
|
|
60
|
-
* (drives the reporter's recurse-after-success). Sources that defer rows
|
|
61
|
-
* (the turn completeness barrier) key this off the REPORTED count so a
|
|
62
|
-
* truncated batch waits for a later flush instead of re-querying and
|
|
63
|
-
* re-deferring in a tight recursion.
|
|
64
|
-
*/
|
|
65
|
-
fullBatch: boolean;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/** One event type's query + wire mapping, keyed by its watermark namespace. */
|
|
69
|
-
export interface TelemetryEventSource {
|
|
70
|
-
/**
|
|
71
|
-
* Stable source id — the watermark key namespace. The reporter persists
|
|
72
|
-
* this source's cursor under `telemetry:<id>:last_reported_{at,id}` in the
|
|
73
|
-
* telemetry DB's `flush_checkpoints` table, so ids must never change once
|
|
74
|
-
* shipped.
|
|
75
|
-
*/
|
|
76
|
-
id: string;
|
|
77
|
-
/** Query rows after the compound cursor and map them to wire events. */
|
|
78
|
-
collect(
|
|
79
|
-
afterCreatedAt: number,
|
|
80
|
-
afterId: string | undefined,
|
|
81
|
-
limit: number,
|
|
82
|
-
): TelemetryEventSourceBatch;
|
|
83
|
-
/**
|
|
84
|
-
* Delete-on-flush mode. Both operations are required together: `acknowledge`
|
|
85
|
-
* deletes the rows behind {@link TelemetryEventSourceBatch.rowIds} after a
|
|
86
|
-
* 2xx from the ingest endpoint, and `discardPending` drops all pending rows
|
|
87
|
-
* on an opted-out flush (watermark writes are meaningless for ack-mode
|
|
88
|
-
* sources, so they never touch `flush_checkpoints`).
|
|
89
|
-
*/
|
|
90
|
-
ack?: {
|
|
91
|
-
acknowledge(rowIds: string[]): void;
|
|
92
|
-
discardPending(): void;
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/** The `flush_checkpoints` keys holding a source's compound cursor. */
|
|
97
|
-
export function watermarkKeysForSource(sourceId: string): {
|
|
98
|
-
at: string;
|
|
99
|
-
id: string;
|
|
100
|
-
} {
|
|
101
|
-
return {
|
|
102
|
-
at: `telemetry:${sourceId}:last_reported_at`,
|
|
103
|
-
id: `telemetry:${sourceId}:last_reported_id`,
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Build a source for the common case: every queried row is reportable, the
|
|
109
|
-
* cursor advances to the last queried row, and a full query batch signals
|
|
110
|
-
* more rows behind it.
|
|
111
|
-
*/
|
|
112
|
-
function simpleSource<Row extends { id: string; createdAt: number }>(
|
|
113
|
-
id: string,
|
|
114
|
-
query: (
|
|
115
|
-
afterCreatedAt: number,
|
|
116
|
-
afterId: string | undefined,
|
|
117
|
-
limit: number,
|
|
118
|
-
) => Row[],
|
|
119
|
-
toEvent: (row: Row) => TelemetryEvent,
|
|
120
|
-
): TelemetryEventSource {
|
|
121
|
-
return {
|
|
122
|
-
id,
|
|
123
|
-
collect(afterCreatedAt, afterId, limit) {
|
|
124
|
-
const rows = query(afterCreatedAt, afterId, limit);
|
|
125
|
-
const last = rows.length > 0 ? rows[rows.length - 1] : null;
|
|
126
|
-
return {
|
|
127
|
-
events: rows.map(toEvent),
|
|
128
|
-
lastCursor: last ? { createdAt: last.createdAt, id: last.id } : null,
|
|
129
|
-
fullBatch: rows.length === limit,
|
|
130
|
-
};
|
|
131
|
-
},
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Query one outbox event name and parse each stored payload into its wire
|
|
137
|
-
* event, accumulating into `events`/`rowIds`. A row whose payload does not
|
|
138
|
-
* parse to an object is collected into `corruptIds` for immediate purge: an
|
|
139
|
-
* early empty-batch return in the reporter would otherwise strand it at the
|
|
140
|
-
* head of the queue forever. Shared by {@link outboxSource} and the
|
|
141
|
-
* orphan-drain source.
|
|
142
|
-
*/
|
|
143
|
-
function collectOutboxName(
|
|
144
|
-
name: string,
|
|
145
|
-
limit: number,
|
|
146
|
-
into: { events: TelemetryEvent[]; rowIds: string[]; corruptIds: string[] },
|
|
147
|
-
): { queried: number } {
|
|
148
|
-
const rows = queryTelemetryOutboxBatch(name, limit);
|
|
149
|
-
for (const row of rows) {
|
|
150
|
-
let event: TelemetryEvent | null = null;
|
|
151
|
-
try {
|
|
152
|
-
const parsed = JSON.parse(row.payload) as unknown;
|
|
153
|
-
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
154
|
-
event = parsed as TelemetryEvent;
|
|
155
|
-
}
|
|
156
|
-
} catch {
|
|
157
|
-
// Fall through to the purge below.
|
|
158
|
-
}
|
|
159
|
-
if (event) {
|
|
160
|
-
into.events.push(event);
|
|
161
|
-
into.rowIds.push(row.id);
|
|
162
|
-
} else {
|
|
163
|
-
into.corruptIds.push(row.id);
|
|
164
|
-
log.warn(
|
|
165
|
-
{ name, rowId: row.id, payloadLength: row.payload.length },
|
|
166
|
-
"Telemetry outbox: unparseable payload — purging row",
|
|
167
|
-
);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
return { queried: rows.length };
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Build an ack-mode source over the generic `telemetry_events` outbox for one
|
|
175
|
-
* event name. `collect` ignores the cursor args — acknowledged rows are
|
|
176
|
-
* deleted, so the head of the queue is always the next batch.
|
|
177
|
-
*/
|
|
178
|
-
export function outboxSource(
|
|
179
|
-
name: OutboxTelemetryEventName,
|
|
180
|
-
): TelemetryEventSource {
|
|
181
|
-
return {
|
|
182
|
-
id: name,
|
|
183
|
-
collect(_afterCreatedAt, _afterId, limit) {
|
|
184
|
-
const acc = {
|
|
185
|
-
events: [] as TelemetryEvent[],
|
|
186
|
-
rowIds: [] as string[],
|
|
187
|
-
corruptIds: [] as string[],
|
|
188
|
-
};
|
|
189
|
-
const { queried } = collectOutboxName(name, limit, acc);
|
|
190
|
-
if (acc.corruptIds.length > 0) {
|
|
191
|
-
deleteTelemetryOutboxEvents(acc.corruptIds);
|
|
192
|
-
}
|
|
193
|
-
return {
|
|
194
|
-
events: acc.events,
|
|
195
|
-
rowIds: acc.rowIds,
|
|
196
|
-
lastCursor: null,
|
|
197
|
-
fullBatch: queried === limit,
|
|
198
|
-
};
|
|
199
|
-
},
|
|
200
|
-
ack: {
|
|
201
|
-
acknowledge: (rowIds) => deleteTelemetryOutboxEvents(rowIds),
|
|
202
|
-
discardPending: () => discardPendingTelemetryOutboxEvents(name),
|
|
203
|
-
},
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/** Source id of the synthetic orphan-drain source (not a wire event type). */
|
|
208
|
-
export const ORPHAN_OUTBOX_DRAIN_SOURCE_ID = "__orphan_outbox_drain";
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Synthetic ack-mode source that drains outbox rows whose `name` is no longer a
|
|
212
|
-
* current outbox event type — e.g. rows recorded before the cloud removed or
|
|
213
|
-
* renamed a type, still pending on a client that has since upgraded. The
|
|
214
|
-
* derived per-type sources ({@link OUTBOX_TELEMETRY_EVENT_NAMES}) never query
|
|
215
|
-
* those names, so without this the rows would sit in the outbox forever.
|
|
216
|
-
*
|
|
217
|
-
* Draining is send-then-ack: the cloud skips an unknown event type but still
|
|
218
|
-
* returns 2xx, after which the row is deleted. This is safe against a stale
|
|
219
|
-
* local wire copy — a name merely missing from a lagging wire still ships and
|
|
220
|
-
* lands rather than being purged and lost — and rides `share_analytics` like
|
|
221
|
-
* every other outbox event (no outbox type is diagnostics-gated at flush).
|
|
222
|
-
*/
|
|
223
|
-
export function orphanOutboxDrainSource(): TelemetryEventSource {
|
|
224
|
-
const known = new Set<string>(OUTBOX_TELEMETRY_EVENT_NAMES);
|
|
225
|
-
const orphanNames = (): string[] =>
|
|
226
|
-
queryDistinctOutboxEventNames().filter((name) => !known.has(name));
|
|
227
|
-
return {
|
|
228
|
-
id: ORPHAN_OUTBOX_DRAIN_SOURCE_ID,
|
|
229
|
-
collect(_afterCreatedAt, _afterId, limit) {
|
|
230
|
-
const acc = {
|
|
231
|
-
events: [] as TelemetryEvent[],
|
|
232
|
-
rowIds: [] as string[],
|
|
233
|
-
corruptIds: [] as string[],
|
|
234
|
-
};
|
|
235
|
-
for (const name of orphanNames()) {
|
|
236
|
-
if (acc.events.length >= limit) {
|
|
237
|
-
break;
|
|
238
|
-
}
|
|
239
|
-
collectOutboxName(name, limit - acc.events.length, acc);
|
|
240
|
-
}
|
|
241
|
-
if (acc.corruptIds.length > 0) {
|
|
242
|
-
deleteTelemetryOutboxEvents(acc.corruptIds);
|
|
243
|
-
}
|
|
244
|
-
return {
|
|
245
|
-
events: acc.events,
|
|
246
|
-
rowIds: acc.rowIds,
|
|
247
|
-
lastCursor: null,
|
|
248
|
-
// Conservative: never signals more-behind, so orphan draining spreads
|
|
249
|
-
// across flush cycles instead of monopolizing one. Rare by nature.
|
|
250
|
-
fullBatch: false,
|
|
251
|
-
};
|
|
252
|
-
},
|
|
253
|
-
ack: {
|
|
254
|
-
acknowledge: (rowIds) => deleteTelemetryOutboxEvents(rowIds),
|
|
255
|
-
discardPending: () => {
|
|
256
|
-
for (const name of orphanNames()) {
|
|
257
|
-
discardPendingTelemetryOutboxEvents(name);
|
|
258
|
-
}
|
|
259
|
-
},
|
|
260
|
-
},
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
// ---------------------------------------------------------------------------
|
|
265
|
-
// Sources
|
|
266
|
-
// ---------------------------------------------------------------------------
|
|
267
|
-
|
|
268
|
-
const usageSource = simpleSource(
|
|
269
|
-
"usage",
|
|
270
|
-
(afterCreatedAt, afterId, limit) =>
|
|
271
|
-
queryUnreportedUsageEvents(afterCreatedAt, afterId, limit),
|
|
272
|
-
(e): TelemetryEvent => ({
|
|
273
|
-
type: "llm_usage",
|
|
274
|
-
daemon_event_id: e.id,
|
|
275
|
-
// Conversation-level metadata for analytics joins. All three
|
|
276
|
-
// are nullable on the wire: `conversation_id` is null for
|
|
277
|
-
// LLM calls not tied to a conversation (memory consolidation,
|
|
278
|
-
// background work), and the other two cascade from that.
|
|
279
|
-
conversation_id: e.conversationId,
|
|
280
|
-
conversation_type: e.conversationType,
|
|
281
|
-
turn_index: e.turnIndex,
|
|
282
|
-
parent_conversation_id: e.parentConversationId,
|
|
283
|
-
parent_turn_index: e.parentTurnIndex,
|
|
284
|
-
// Delegated-work decomposition. Every subagent variety shares
|
|
285
|
-
// `llm_call_site = "subagentSpawn"`; these two orthogonal dimensions are
|
|
286
|
-
// what make advisor consults, forks, and regular spawns separable. Null
|
|
287
|
-
// for the vast majority of calls, which are not delegated at all.
|
|
288
|
-
subagent_role: e.subagentRole,
|
|
289
|
-
subagent_spawn_mode: e.subagentSpawnMode,
|
|
290
|
-
provider: e.provider,
|
|
291
|
-
model: e.model,
|
|
292
|
-
input_tokens: e.inputTokens,
|
|
293
|
-
output_tokens: e.outputTokens,
|
|
294
|
-
cache_creation_input_tokens: e.cacheCreationInputTokens ?? null,
|
|
295
|
-
cache_read_input_tokens: e.cacheReadInputTokens ?? null,
|
|
296
|
-
llm_call_count: e.llmCallCount,
|
|
297
|
-
raw_usage: e.rawUsage,
|
|
298
|
-
actor: e.actor,
|
|
299
|
-
llm_call_site: e.callSite,
|
|
300
|
-
inference_profile: e.inferenceProfile,
|
|
301
|
-
inference_profile_source: e.inferenceProfileSource,
|
|
302
|
-
cost: e.estimatedCostUsd ?? null,
|
|
303
|
-
recorded_at: e.createdAt,
|
|
304
|
-
// Record-time version when present; otherwise the running
|
|
305
|
-
// binary's `APP_VERSION` (a legacy row from before
|
|
306
|
-
// migration 267 ran). We deliberately don't emit explicit
|
|
307
|
-
// `null` — under the cloud contract a present-but-null
|
|
308
|
-
// per-event value would override the envelope, and we'd
|
|
309
|
-
// rather have a concrete version than no version.
|
|
310
|
-
assistant_version: e.assistantVersion ?? APP_VERSION,
|
|
311
|
-
}),
|
|
312
|
-
);
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Turn source. Unlike the simple sources it enforces the turn completeness
|
|
316
|
-
* barrier and attaches consented traces, both of which need the daemon's
|
|
317
|
-
* live in-memory conversation state (`isProcessing()`, cached system prompt,
|
|
318
|
-
* registered tool definitions) — so this source must run in the daemon
|
|
319
|
-
* process.
|
|
320
|
-
*/
|
|
321
|
-
const turnSource: TelemetryEventSource = {
|
|
322
|
-
id: "turns",
|
|
323
|
-
collect(afterCreatedAt, afterId, limit) {
|
|
324
|
-
const turnEvents = queryUnreportedTurnEvents(
|
|
325
|
-
afterCreatedAt,
|
|
326
|
-
afterId,
|
|
327
|
-
limit,
|
|
328
|
-
);
|
|
329
|
-
|
|
330
|
-
// Turn completeness barrier (every turn event).
|
|
331
|
-
//
|
|
332
|
-
// A turn event must only be sent once that turn is COMPLETE, for two
|
|
333
|
-
// reasons sharing the same failure mode (the watermark advances on ship,
|
|
334
|
-
// so anything captured early is frozen forever):
|
|
335
|
-
// - the consented `trace` would capture a partial mid-reply
|
|
336
|
-
// transcript, and
|
|
337
|
-
// - the `outcome` stamp (`messages.metadata.turnOutcome`, written by
|
|
338
|
-
// the agent loop / drainBatch while the conversation is still
|
|
339
|
-
// processing) would be missed, permanently mislabeling a
|
|
340
|
-
// failed/cancelled/batched turn as normally-replied.
|
|
341
|
-
// So we report only the leading run of complete turns and STOP at the
|
|
342
|
-
// first incomplete (in-flight) one: the turn watermark is a single
|
|
343
|
-
// monotonic `(createdAt, id)` cursor, so a later complete turn cannot be
|
|
344
|
-
// reported past an earlier deferred one without skipping it. The
|
|
345
|
-
// deferred turn (and everything after it) is picked up on a later flush
|
|
346
|
-
// once its response settles.
|
|
347
|
-
//
|
|
348
|
-
// Trace eligibility is composed daemon-side to mirror the cloud's
|
|
349
|
-
// authoritative owner-based ingest gate, so traces for ineligible owners
|
|
350
|
-
// never leave the device. Two parts, fail-closed (both must be true):
|
|
351
|
-
// 1. the owner's cached `share_diagnostics` consent, and
|
|
352
|
-
// 2. the owner's cached `share_diagnostics_accepted_version` being at or
|
|
353
|
-
// past the disclosing version — the cloud applies the identical
|
|
354
|
-
// check, so an old consent never yields a trace here or there.
|
|
355
|
-
const traceEligible =
|
|
356
|
-
getCachedShareDiagnostics() &&
|
|
357
|
-
isDiagnosticsConsentVersionEligible(getCachedShareDiagnosticsVersion());
|
|
358
|
-
let reportableTurnEvents = turnEvents;
|
|
359
|
-
if (turnEvents.length > 0) {
|
|
360
|
-
let barrier = turnEvents.length;
|
|
361
|
-
for (let i = 0; i < turnEvents.length; i++) {
|
|
362
|
-
const t = turnEvents[i];
|
|
363
|
-
if (
|
|
364
|
-
!isTurnSettled({
|
|
365
|
-
conversationId: t.conversationId,
|
|
366
|
-
userMessageId: t.id,
|
|
367
|
-
userMessageCreatedAt: t.createdAt,
|
|
368
|
-
})
|
|
369
|
-
) {
|
|
370
|
-
barrier = i;
|
|
371
|
-
break;
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
if (barrier < turnEvents.length) {
|
|
375
|
-
reportableTurnEvents = turnEvents.slice(0, barrier);
|
|
376
|
-
log.debug(
|
|
377
|
-
{
|
|
378
|
-
deferredTurnId: turnEvents[barrier].id,
|
|
379
|
-
deferredConversationId: turnEvents[barrier].conversationId,
|
|
380
|
-
reportedTurns: barrier,
|
|
381
|
-
deferredTurns: turnEvents.length - barrier,
|
|
382
|
-
},
|
|
383
|
-
"Deferring in-progress turn(s) from telemetry until complete",
|
|
384
|
-
);
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
const events = reportableTurnEvents.map((e): TelemetryEvent => {
|
|
389
|
-
// Per-turn trace collection gate. `traceEligible` (computed above)
|
|
390
|
-
// requires the owner's cached `share_diagnostics` consent AND an
|
|
391
|
-
// eligible accepted consent version. Fail-closed: when either is off
|
|
392
|
-
// the trace is omitted and the trace-free turn row flushes as before. The
|
|
393
|
-
// `share_analytics` gate in the reporter already passed, so this is an
|
|
394
|
-
// additional, independent gate specific to trace PII. Every turn
|
|
395
|
-
// reaching here is settled (the completeness barrier dropped any
|
|
396
|
-
// in-flight turns), so the trace is never a partial mid-turn snapshot.
|
|
397
|
-
const trace = traceEligible
|
|
398
|
-
? assembleBoundedTurnTrace({
|
|
399
|
-
conversationId: e.conversationId,
|
|
400
|
-
userMessageId: e.id,
|
|
401
|
-
userMessageCreatedAt: e.createdAt,
|
|
402
|
-
})
|
|
403
|
-
: null;
|
|
404
|
-
// `messages.metadata.client` is a nested JSON object extracted
|
|
405
|
-
// via `json_extract`; sqlite returns it as a text representation.
|
|
406
|
-
// Parse defensively — a corrupted blob in the JSON column should
|
|
407
|
-
// not block the whole batch flush.
|
|
408
|
-
let client: TurnTelemetryClientInfo | null = null;
|
|
409
|
-
if (e.clientMetadata) {
|
|
410
|
-
try {
|
|
411
|
-
const parsed = JSON.parse(e.clientMetadata) as unknown;
|
|
412
|
-
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
413
|
-
client = parsed as TurnTelemetryClientInfo;
|
|
414
|
-
}
|
|
415
|
-
} catch {
|
|
416
|
-
// Malformed client JSON — emit null rather than fail the
|
|
417
|
-
// batch. Logged once below for visibility.
|
|
418
|
-
log.warn(
|
|
419
|
-
{ turnId: e.id, conversationId: e.conversationId },
|
|
420
|
-
"Telemetry turn: failed to parse messages.metadata.client; emitting null",
|
|
421
|
-
);
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
// Narrow the raw metadata projection to the wire union — only
|
|
425
|
-
// `stampTurnOutcome` writes the key, but the JSON column is
|
|
426
|
-
// uncontrolled, so an unexpected value is dropped rather than
|
|
427
|
-
// shipped.
|
|
428
|
-
const outcome =
|
|
429
|
-
e.outcome === "batched" ||
|
|
430
|
-
e.outcome === "failed" ||
|
|
431
|
-
e.outcome === "cancelled"
|
|
432
|
-
? e.outcome
|
|
433
|
-
: null;
|
|
434
|
-
return {
|
|
435
|
-
type: "turn",
|
|
436
|
-
daemon_event_id: e.id,
|
|
437
|
-
recorded_at: e.createdAt,
|
|
438
|
-
conversation_id: e.conversationId,
|
|
439
|
-
conversation_type: e.conversationType,
|
|
440
|
-
turn_index: e.turnIndex,
|
|
441
|
-
interface_id: e.interfaceId,
|
|
442
|
-
channel_id: e.channelId,
|
|
443
|
-
client,
|
|
444
|
-
// Outcome stamps are omit-when-absent: a normally-replied turn's
|
|
445
|
-
// wire shape is byte-identical to a pre-outcome turn event.
|
|
446
|
-
...(outcome ? { outcome } : {}),
|
|
447
|
-
...(outcome === "batched" && e.batchedInto
|
|
448
|
-
? { batched_into: e.batchedInto }
|
|
449
|
-
: {}),
|
|
450
|
-
...(outcome === "failed" && e.failureCode
|
|
451
|
-
? { failure_code: e.failureCode }
|
|
452
|
-
: {}),
|
|
453
|
-
// Scripted-turn marker. Tri-state, so this is an explicit null check
|
|
454
|
-
// and NOT `...(e.scripted ? ...)`: a truthiness test would drop every
|
|
455
|
-
// `false` and turn "the user typed this" into "unknown", which is the
|
|
456
|
-
// measurement gap the field exists to close. `false` must reach the
|
|
457
|
-
// wire as a real value; only a genuinely unknown origin (a row
|
|
458
|
-
// persisted before the marker existed) omits the key.
|
|
459
|
-
...(e.scripted == null ? {} : { scripted: e.scripted }),
|
|
460
|
-
// Only attach `trace` when consent is on AND a bounded trace was
|
|
461
|
-
// assembled. Omitting the key entirely when there's no trace keeps
|
|
462
|
-
// the wire shape byte-identical to pre-trace turn events for the
|
|
463
|
-
// common (no-consent) path.
|
|
464
|
-
...(trace ? { trace } : {}),
|
|
465
|
-
// Turn events derive from `messages` + `conversations`
|
|
466
|
-
// rather than a dedicated table. Adding `assistant_version`
|
|
467
|
-
// to `messages` is a separate (larger) migration; until
|
|
468
|
-
// then we stamp the running binary's `APP_VERSION` so the
|
|
469
|
-
// wire value is concrete (matches what the envelope would
|
|
470
|
-
// have provided, but per-event so it survives the cloud
|
|
471
|
-
// contract that treats present per-event values as winning
|
|
472
|
-
// over the envelope).
|
|
473
|
-
assistant_version: APP_VERSION,
|
|
474
|
-
};
|
|
475
|
-
});
|
|
476
|
-
|
|
477
|
-
const last =
|
|
478
|
-
reportableTurnEvents.length > 0
|
|
479
|
-
? reportableTurnEvents[reportableTurnEvents.length - 1]
|
|
480
|
-
: null;
|
|
481
|
-
return {
|
|
482
|
-
events,
|
|
483
|
-
// The cursor advances only to the last REPORTED turn. Deferred
|
|
484
|
-
// (in-flight) turns sit beyond it and are re-evaluated on a later
|
|
485
|
-
// flush, so the watermark never skips them.
|
|
486
|
-
lastCursor: last ? { createdAt: last.createdAt, id: last.id } : null,
|
|
487
|
-
// Keyed off the REPORTED count: when the completeness barrier
|
|
488
|
-
// truncates the batch, the deferred turns must wait for a later flush
|
|
489
|
-
// (by which point they've settled) rather than being re-queried and
|
|
490
|
-
// re-deferred in a tight recursion.
|
|
491
|
-
fullBatch: reportableTurnEvents.length === limit,
|
|
492
|
-
};
|
|
493
|
-
},
|
|
494
|
-
};
|
|
495
|
-
|
|
496
|
-
const toolExecutedSource = simpleSource(
|
|
497
|
-
"tool_executed",
|
|
498
|
-
(afterCreatedAt, afterId, limit) =>
|
|
499
|
-
queryUnreportedToolExecutedEvents(afterCreatedAt, afterId, limit),
|
|
500
|
-
(e): TelemetryEvent => ({
|
|
501
|
-
type: "tool_executed",
|
|
502
|
-
daemon_event_id: e.id,
|
|
503
|
-
recorded_at: e.createdAt,
|
|
504
|
-
tool_name: e.toolName,
|
|
505
|
-
// The store filters out permission-denied rows, so the only
|
|
506
|
-
// non-success decision that reaches here is "error".
|
|
507
|
-
status: e.decision === "error" ? "errored" : "fulfilled",
|
|
508
|
-
duration_ms: e.durationMs,
|
|
509
|
-
arg_bytes: e.argBytes,
|
|
510
|
-
result_bytes: e.resultBytes,
|
|
511
|
-
conversation_id: e.conversationId,
|
|
512
|
-
provider: e.provider,
|
|
513
|
-
model: e.model,
|
|
514
|
-
inference_profile: e.inferenceProfile,
|
|
515
|
-
inference_profile_source:
|
|
516
|
-
e.inferenceProfileSource as UsageAttributionProfileSource | null,
|
|
517
|
-
// `tool_invocations` has no record-time version column — stamp
|
|
518
|
-
// the running binary's `APP_VERSION` so the wire value is
|
|
519
|
-
// concrete rather than an explicit null that would override the
|
|
520
|
-
// envelope under the cloud's per-event-wins contract.
|
|
521
|
-
assistant_version: APP_VERSION,
|
|
522
|
-
}),
|
|
523
|
-
);
|
|
524
|
-
|
|
525
|
-
/**
|
|
526
|
-
* Watermark key namespace of the tool_executed source — referenced by the
|
|
527
|
-
* absent-watermark init that runs at daemon startup.
|
|
528
|
-
*/
|
|
529
|
-
export const TOOL_EXECUTED_SOURCE_ID = toolExecutedSource.id;
|
|
530
|
-
|
|
531
|
-
/**
|
|
532
|
-
* Watermark-flushed sources — the high-volume events on their own SQLite
|
|
533
|
-
* tables (`WATERMARK_TELEMETRY_EVENT_NAMES`), read forward by a `(createdAt,
|
|
534
|
-
* id)` cursor rather than the generic outbox.
|
|
535
|
-
*/
|
|
536
|
-
const WATERMARK_TELEMETRY_EVENT_SOURCES: readonly TelemetryEventSource[] = [
|
|
537
|
-
usageSource,
|
|
538
|
-
turnSource,
|
|
539
|
-
toolExecutedSource,
|
|
540
|
-
];
|
|
541
|
-
|
|
542
|
-
/**
|
|
543
|
-
* Per-outbox-event flush-source override. The default for every outbox event is
|
|
544
|
-
* the plain {@link outboxSource}; list only the exceptions here. A new outbox
|
|
545
|
-
* event type therefore needs no edit — it flushes through `outboxSource`
|
|
546
|
-
* automatically. There are currently no exceptions: every outbox event,
|
|
547
|
-
* including `onboarding_research`, flushes through the default source and is
|
|
548
|
-
* gated only by the `share_analytics` consent enforced at record time.
|
|
549
|
-
*/
|
|
550
|
-
const OUTBOX_SOURCE_FACTORY: Partial<
|
|
551
|
-
Record<
|
|
552
|
-
OutboxTelemetryEventName,
|
|
553
|
-
(name: OutboxTelemetryEventName) => TelemetryEventSource
|
|
554
|
-
>
|
|
555
|
-
> = {};
|
|
556
|
-
|
|
557
|
-
/**
|
|
558
|
-
* Every telemetry event source, in payload order (watermark sources first, then
|
|
559
|
-
* outbox events in wire-contract order). Derived from the wire contract via
|
|
560
|
-
* {@link OUTBOX_TELEMETRY_EVENT_NAMES}, so a new event type gets a flush source
|
|
561
|
-
* with no edit here. Intra-batch ordering is not load-bearing downstream
|
|
562
|
-
* (events are typed and deduped on `daemon_event_id`, not positional). This is
|
|
563
|
-
* the test/reference list; production reporters run the daemon/monitor
|
|
564
|
-
* partitions below.
|
|
565
|
-
*/
|
|
566
|
-
export const ALL_TELEMETRY_EVENT_SOURCES: readonly TelemetryEventSource[] = [
|
|
567
|
-
...WATERMARK_TELEMETRY_EVENT_SOURCES,
|
|
568
|
-
...OUTBOX_TELEMETRY_EVENT_NAMES.map((name) =>
|
|
569
|
-
(OUTBOX_SOURCE_FACTORY[name] ?? outboxSource)(name),
|
|
570
|
-
),
|
|
571
|
-
// Not a wire event type — drains rows for types the wire no longer declares.
|
|
572
|
-
orphanOutboxDrainSource(),
|
|
573
|
-
];
|
|
574
|
-
|
|
575
|
-
/**
|
|
576
|
-
* Sources flushed by the daemon's reporter. Turns only: the completeness
|
|
577
|
-
* barrier (`isProcessing()`) and consented trace assembly (cached system
|
|
578
|
-
* prompt, registered tool definitions) read the daemon's live in-memory
|
|
579
|
-
* conversation state, so this source cannot leave the daemon process.
|
|
580
|
-
*/
|
|
581
|
-
export const DAEMON_TELEMETRY_EVENT_SOURCES: readonly TelemetryEventSource[] = [
|
|
582
|
-
turnSource,
|
|
583
|
-
];
|
|
584
|
-
|
|
585
|
-
/**
|
|
586
|
-
* Sources flushed by the resource monitor process's reporter. Everything
|
|
587
|
-
* except turns: pure durable-table projections over the main and telemetry
|
|
588
|
-
* databases, which the monitor reads cross-process (main DB read-only via
|
|
589
|
-
* WAL; telemetry DB read-write, since the monitor owns flush state).
|
|
590
|
-
* Together with {@link DAEMON_TELEMETRY_EVENT_SOURCES} this partitions
|
|
591
|
-
* {@link ALL_TELEMETRY_EVENT_SOURCES} — every source is flushed by exactly
|
|
592
|
-
* one process.
|
|
593
|
-
*/
|
|
594
|
-
export const MONITOR_TELEMETRY_EVENT_SOURCES: readonly TelemetryEventSource[] =
|
|
595
|
-
ALL_TELEMETRY_EVENT_SOURCES.filter(
|
|
596
|
-
(source) => !DAEMON_TELEMETRY_EVENT_SOURCES.includes(source),
|
|
597
|
-
);
|