@mycadet/assistant 0.12.9 → 0.12.11
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/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
- package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
- package/node_modules/@mycadet/ces-client/src/http-credentials.ts +18 -1
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
- package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
- package/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
- package/node_modules/@mycadet/service-contracts/src/ingress.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 +87 -404
- 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 +25 -32
- 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 +72 -298
- 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 +49 -706
- 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,375 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, test } from "bun:test";
|
|
2
|
-
|
|
3
|
-
import { getTelemetryDb } from "../persistence/db-connection.js";
|
|
4
|
-
import { telemetryEvents } from "../persistence/schema/index.js";
|
|
5
|
-
import { APP_VERSION } from "../version.js";
|
|
6
|
-
import {
|
|
7
|
-
resetOutboxTable,
|
|
8
|
-
setShareAnalytics,
|
|
9
|
-
withTelemetryDbUnavailable,
|
|
10
|
-
} from "./__tests__/outbox-test-harness.js";
|
|
11
|
-
import {
|
|
12
|
-
deleteTelemetryOutboxEvents,
|
|
13
|
-
deleteTelemetryOutboxEventsBefore,
|
|
14
|
-
discardPendingTelemetryOutboxEvents,
|
|
15
|
-
insertTelemetryOutboxEvent,
|
|
16
|
-
insertTelemetryOutboxEvents,
|
|
17
|
-
queryTelemetryOutboxBatch,
|
|
18
|
-
recordTelemetryEvent,
|
|
19
|
-
} from "./telemetry-events-outbox.js";
|
|
20
|
-
import type { LifecycleTelemetryEvent } from "./types.js";
|
|
21
|
-
|
|
22
|
-
function lifecycleEvent(
|
|
23
|
-
id: string,
|
|
24
|
-
createdAt: number,
|
|
25
|
-
): LifecycleTelemetryEvent {
|
|
26
|
-
return {
|
|
27
|
-
type: "lifecycle",
|
|
28
|
-
daemon_event_id: id,
|
|
29
|
-
event_name: "app_open",
|
|
30
|
-
recorded_at: createdAt,
|
|
31
|
-
assistant_version: "1.2.3",
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function insert(
|
|
36
|
-
id: string,
|
|
37
|
-
createdAt: number,
|
|
38
|
-
name = "lifecycle",
|
|
39
|
-
conversationId?: string | null,
|
|
40
|
-
): boolean {
|
|
41
|
-
return insertTelemetryOutboxEvent({
|
|
42
|
-
id,
|
|
43
|
-
name,
|
|
44
|
-
createdAt,
|
|
45
|
-
conversationId,
|
|
46
|
-
event: lifecycleEvent(id, createdAt),
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function allIds(): string[] {
|
|
51
|
-
return queryTelemetryOutboxBatch("lifecycle", 10_000).map((r) => r.id);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
describe("telemetry-events-outbox", () => {
|
|
55
|
-
beforeEach(() => {
|
|
56
|
-
setShareAnalytics(true);
|
|
57
|
-
resetOutboxTable();
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
test("insert + query round-trips the wire payload", () => {
|
|
61
|
-
expect(insert("evt-1", 1000)).toBe(true);
|
|
62
|
-
|
|
63
|
-
const rows = queryTelemetryOutboxBatch("lifecycle", 10);
|
|
64
|
-
expect(rows).toHaveLength(1);
|
|
65
|
-
expect(rows[0]).toMatchObject({ id: "evt-1", createdAt: 1000 });
|
|
66
|
-
expect(JSON.parse(rows[0]!.payload)).toEqual(lifecycleEvent("evt-1", 1000));
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test("batch insert lands every row", () => {
|
|
70
|
-
const inserted = insertTelemetryOutboxEvents([
|
|
71
|
-
{
|
|
72
|
-
id: "evt-1",
|
|
73
|
-
name: "lifecycle",
|
|
74
|
-
createdAt: 1000,
|
|
75
|
-
event: lifecycleEvent("evt-1", 1000),
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
id: "evt-2",
|
|
79
|
-
name: "lifecycle",
|
|
80
|
-
createdAt: 2000,
|
|
81
|
-
event: lifecycleEvent("evt-2", 2000),
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
id: "evt-3",
|
|
85
|
-
name: "lifecycle",
|
|
86
|
-
createdAt: 3000,
|
|
87
|
-
event: lifecycleEvent("evt-3", 3000),
|
|
88
|
-
},
|
|
89
|
-
]);
|
|
90
|
-
expect(inserted).toBe(true);
|
|
91
|
-
expect(allIds()).toEqual(["evt-1", "evt-2", "evt-3"]);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
test("batch insert is all-or-nothing on a mid-batch failure", () => {
|
|
95
|
-
insert("evt-dup", 500);
|
|
96
|
-
|
|
97
|
-
expect(() =>
|
|
98
|
-
insertTelemetryOutboxEvents([
|
|
99
|
-
{
|
|
100
|
-
id: "evt-new-1",
|
|
101
|
-
name: "lifecycle",
|
|
102
|
-
createdAt: 1000,
|
|
103
|
-
event: lifecycleEvent("evt-new-1", 1000),
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
id: "evt-dup",
|
|
107
|
-
name: "lifecycle",
|
|
108
|
-
createdAt: 2000,
|
|
109
|
-
event: lifecycleEvent("evt-dup", 2000),
|
|
110
|
-
},
|
|
111
|
-
{
|
|
112
|
-
id: "evt-new-2",
|
|
113
|
-
name: "lifecycle",
|
|
114
|
-
createdAt: 3000,
|
|
115
|
-
event: lifecycleEvent("evt-new-2", 3000),
|
|
116
|
-
},
|
|
117
|
-
]),
|
|
118
|
-
).toThrow();
|
|
119
|
-
|
|
120
|
-
// The primary-key conflict aborts the whole statement — no partial batch.
|
|
121
|
-
expect(allIds()).toEqual(["evt-dup"]);
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
test("batch insert returns false when the telemetry DB is unavailable", () => {
|
|
125
|
-
withTelemetryDbUnavailable(() => {
|
|
126
|
-
expect(
|
|
127
|
-
insertTelemetryOutboxEvents([
|
|
128
|
-
{
|
|
129
|
-
id: "evt-1",
|
|
130
|
-
name: "lifecycle",
|
|
131
|
-
createdAt: 1000,
|
|
132
|
-
event: lifecycleEvent("evt-1", 1000),
|
|
133
|
-
},
|
|
134
|
-
]),
|
|
135
|
-
).toBe(false);
|
|
136
|
-
});
|
|
137
|
-
expect(allIds()).toEqual([]);
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
test("empty batch is a successful no-op", () => {
|
|
141
|
-
expect(insertTelemetryOutboxEvents([])).toBe(true);
|
|
142
|
-
expect(allIds()).toEqual([]);
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
test("conversation_id persists in its dedicated column", () => {
|
|
146
|
-
insert("evt-conv", 1000, "lifecycle", "conv-1");
|
|
147
|
-
insert("evt-null", 2000, "lifecycle");
|
|
148
|
-
|
|
149
|
-
const rows = getTelemetryDb()!
|
|
150
|
-
.select({
|
|
151
|
-
id: telemetryEvents.id,
|
|
152
|
-
conversationId: telemetryEvents.conversationId,
|
|
153
|
-
})
|
|
154
|
-
.from(telemetryEvents)
|
|
155
|
-
.all()
|
|
156
|
-
.sort((a, b) => a.id.localeCompare(b.id));
|
|
157
|
-
expect(rows).toEqual([
|
|
158
|
-
{ id: "evt-conv", conversationId: "conv-1" },
|
|
159
|
-
{ id: "evt-null", conversationId: null },
|
|
160
|
-
]);
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
test("orders by (created_at, id) with id as tiebreaker", () => {
|
|
164
|
-
insert("evt-b", 2000);
|
|
165
|
-
insert("evt-c", 1000);
|
|
166
|
-
insert("evt-a", 1000);
|
|
167
|
-
|
|
168
|
-
expect(allIds()).toEqual(["evt-a", "evt-c", "evt-b"]);
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
test("honors the limit", () => {
|
|
172
|
-
insert("evt-1", 1000);
|
|
173
|
-
insert("evt-2", 2000);
|
|
174
|
-
insert("evt-3", 3000);
|
|
175
|
-
|
|
176
|
-
const rows = queryTelemetryOutboxBatch("lifecycle", 2);
|
|
177
|
-
expect(rows.map((r) => r.id)).toEqual(["evt-1", "evt-2"]);
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
test("queries are isolated per event name", () => {
|
|
181
|
-
insert("evt-life", 1000, "lifecycle");
|
|
182
|
-
insert("evt-watch", 1000, "watchdog");
|
|
183
|
-
|
|
184
|
-
expect(allIds()).toEqual(["evt-life"]);
|
|
185
|
-
expect(queryTelemetryOutboxBatch("watchdog", 10).map((r) => r.id)).toEqual([
|
|
186
|
-
"evt-watch",
|
|
187
|
-
]);
|
|
188
|
-
expect(queryTelemetryOutboxBatch("onboarding", 10)).toEqual([]);
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
test("deletes rows by id", () => {
|
|
192
|
-
insert("evt-1", 1000);
|
|
193
|
-
insert("evt-2", 2000);
|
|
194
|
-
insert("evt-3", 3000);
|
|
195
|
-
|
|
196
|
-
deleteTelemetryOutboxEvents(["evt-1", "evt-3"]);
|
|
197
|
-
|
|
198
|
-
expect(allIds()).toEqual(["evt-2"]);
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
test("delete with an empty id list is a no-op", () => {
|
|
202
|
-
insert("evt-1", 1000);
|
|
203
|
-
|
|
204
|
-
deleteTelemetryOutboxEvents([]);
|
|
205
|
-
|
|
206
|
-
expect(allIds()).toEqual(["evt-1"]);
|
|
207
|
-
});
|
|
208
|
-
|
|
209
|
-
test("deletes more than one chunk of ids", () => {
|
|
210
|
-
const ids: string[] = [];
|
|
211
|
-
for (let i = 0; i < 501; i++) {
|
|
212
|
-
const id = `evt-${String(i).padStart(4, "0")}`;
|
|
213
|
-
ids.push(id);
|
|
214
|
-
insert(id, i);
|
|
215
|
-
}
|
|
216
|
-
insert("evt-keep", 9999);
|
|
217
|
-
|
|
218
|
-
deleteTelemetryOutboxEvents(ids);
|
|
219
|
-
|
|
220
|
-
expect(allIds()).toEqual(["evt-keep"]);
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
test("recordTelemetryEvent stamps the base fields", () => {
|
|
224
|
-
const fields = {
|
|
225
|
-
check_name: "db_size",
|
|
226
|
-
value: 42,
|
|
227
|
-
detail: { table: "messages" },
|
|
228
|
-
};
|
|
229
|
-
const recorded = recordTelemetryEvent("watchdog", fields);
|
|
230
|
-
expect(recorded).not.toBeNull();
|
|
231
|
-
|
|
232
|
-
const rows = queryTelemetryOutboxBatch("watchdog", 10);
|
|
233
|
-
expect(rows).toHaveLength(1);
|
|
234
|
-
expect(rows[0]!.id).toBe(recorded!.id);
|
|
235
|
-
expect(JSON.parse(rows[0]!.payload)).toEqual({
|
|
236
|
-
type: "watchdog",
|
|
237
|
-
daemon_event_id: recorded!.id,
|
|
238
|
-
recorded_at: recorded!.createdAt,
|
|
239
|
-
assistant_version: APP_VERSION,
|
|
240
|
-
...fields,
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
test("recordTelemetryEvent stamps win over base keys smuggled in via a widened fields value", () => {
|
|
245
|
-
// A variable (not a literal) skips excess-property checking, so base
|
|
246
|
-
// keys can reach the helper structurally. The stamps must still win.
|
|
247
|
-
const widened = {
|
|
248
|
-
check_name: "db_size",
|
|
249
|
-
value: null,
|
|
250
|
-
detail: null,
|
|
251
|
-
daemon_event_id: "spoofed-id",
|
|
252
|
-
recorded_at: 1,
|
|
253
|
-
assistant_version: "0.0.0-spoof",
|
|
254
|
-
};
|
|
255
|
-
const recorded = recordTelemetryEvent("watchdog", widened);
|
|
256
|
-
expect(recorded).not.toBeNull();
|
|
257
|
-
|
|
258
|
-
const payload = JSON.parse(
|
|
259
|
-
queryTelemetryOutboxBatch("watchdog", 10)[0]!.payload,
|
|
260
|
-
) as Record<string, unknown>;
|
|
261
|
-
expect(payload.daemon_event_id).toBe(recorded!.id);
|
|
262
|
-
expect(payload.recorded_at).toBe(recorded!.createdAt);
|
|
263
|
-
expect(payload.assistant_version).toBe(APP_VERSION);
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
test("recordTelemetryEvent persists conversation_id in its column", () => {
|
|
267
|
-
const withConv = recordTelemetryEvent(
|
|
268
|
-
"watchdog",
|
|
269
|
-
{ check_name: "c1", value: null, detail: null },
|
|
270
|
-
{ conversationId: "conv-1" },
|
|
271
|
-
);
|
|
272
|
-
const withoutConv = recordTelemetryEvent("watchdog", {
|
|
273
|
-
check_name: "c2",
|
|
274
|
-
value: null,
|
|
275
|
-
detail: null,
|
|
276
|
-
});
|
|
277
|
-
|
|
278
|
-
const rows = getTelemetryDb()!
|
|
279
|
-
.select({
|
|
280
|
-
id: telemetryEvents.id,
|
|
281
|
-
conversationId: telemetryEvents.conversationId,
|
|
282
|
-
})
|
|
283
|
-
.from(telemetryEvents)
|
|
284
|
-
.all();
|
|
285
|
-
expect(rows).toHaveLength(2);
|
|
286
|
-
expect(rows.find((r) => r.id === withConv!.id)!.conversationId).toBe(
|
|
287
|
-
"conv-1",
|
|
288
|
-
);
|
|
289
|
-
expect(rows.find((r) => r.id === withoutConv!.id)!.conversationId).toBe(
|
|
290
|
-
null,
|
|
291
|
-
);
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
test("recordTelemetryEvent honors a confirmed share_analytics opt-out", () => {
|
|
295
|
-
setShareAnalytics(false);
|
|
296
|
-
expect(
|
|
297
|
-
recordTelemetryEvent("watchdog", {
|
|
298
|
-
check_name: "c",
|
|
299
|
-
value: null,
|
|
300
|
-
detail: null,
|
|
301
|
-
}),
|
|
302
|
-
).toBeNull();
|
|
303
|
-
expect(queryTelemetryOutboxBatch("watchdog", 10)).toEqual([]);
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
test("recordTelemetryEvent records while consent is unknown (cold cache)", () => {
|
|
307
|
-
setShareAnalytics("unknown");
|
|
308
|
-
const recorded = recordTelemetryEvent("watchdog", {
|
|
309
|
-
check_name: "c",
|
|
310
|
-
value: null,
|
|
311
|
-
detail: null,
|
|
312
|
-
});
|
|
313
|
-
expect(recorded).not.toBeNull();
|
|
314
|
-
expect(queryTelemetryOutboxBatch("watchdog", 10).map((r) => r.id)).toEqual([
|
|
315
|
-
recorded!.id,
|
|
316
|
-
]);
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
test("recordTelemetryEvent returns null when the telemetry DB is unavailable", () => {
|
|
320
|
-
withTelemetryDbUnavailable(() => {
|
|
321
|
-
expect(
|
|
322
|
-
recordTelemetryEvent("watchdog", {
|
|
323
|
-
check_name: "c",
|
|
324
|
-
value: null,
|
|
325
|
-
detail: null,
|
|
326
|
-
}),
|
|
327
|
-
).toBeNull();
|
|
328
|
-
});
|
|
329
|
-
expect(queryTelemetryOutboxBatch("watchdog", 10)).toEqual([]);
|
|
330
|
-
});
|
|
331
|
-
|
|
332
|
-
test("prune deletes rows strictly older than the cutoff across every name and returns the count", () => {
|
|
333
|
-
insert("evt-old-life", 1000, "lifecycle");
|
|
334
|
-
insert("evt-old-watch", 1500, "watchdog");
|
|
335
|
-
insert("evt-at-cutoff", 2000, "lifecycle");
|
|
336
|
-
insert("evt-fresh", 3000, "lifecycle");
|
|
337
|
-
|
|
338
|
-
expect(deleteTelemetryOutboxEventsBefore(2000)).toBe(2);
|
|
339
|
-
|
|
340
|
-
// Strictly-before semantics: the row AT the cutoff is retained.
|
|
341
|
-
expect(allIds()).toEqual(["evt-at-cutoff", "evt-fresh"]);
|
|
342
|
-
expect(queryTelemetryOutboxBatch("watchdog", 10)).toEqual([]);
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
test("prune with nothing expired deletes nothing and returns 0", () => {
|
|
346
|
-
insert("evt-1", 5000);
|
|
347
|
-
|
|
348
|
-
expect(deleteTelemetryOutboxEventsBefore(5000)).toBe(0);
|
|
349
|
-
|
|
350
|
-
expect(allIds()).toEqual(["evt-1"]);
|
|
351
|
-
});
|
|
352
|
-
|
|
353
|
-
test("prune returns 0 when the telemetry DB is unavailable", () => {
|
|
354
|
-
insert("evt-1", 1000);
|
|
355
|
-
|
|
356
|
-
withTelemetryDbUnavailable(() => {
|
|
357
|
-
expect(deleteTelemetryOutboxEventsBefore(2000)).toBe(0);
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
expect(allIds()).toEqual(["evt-1"]);
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
test("discards all pending rows for one name only", () => {
|
|
364
|
-
insert("evt-1", 1000, "lifecycle");
|
|
365
|
-
insert("evt-2", 2000, "lifecycle");
|
|
366
|
-
insert("evt-other", 1000, "watchdog");
|
|
367
|
-
|
|
368
|
-
discardPendingTelemetryOutboxEvents("lifecycle");
|
|
369
|
-
|
|
370
|
-
expect(allIds()).toEqual([]);
|
|
371
|
-
expect(queryTelemetryOutboxBatch("watchdog", 10).map((r) => r.id)).toEqual([
|
|
372
|
-
"evt-other",
|
|
373
|
-
]);
|
|
374
|
-
});
|
|
375
|
-
});
|
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generic `telemetry_events` outbox on the dedicated telemetry database
|
|
3
|
-
* (`assistant-telemetry.db`). Rows carry the full wire `TelemetryEvent` built
|
|
4
|
-
* at record time and are deleted after a successful flush.
|
|
5
|
-
* `recordTelemetryOutboxEvent` is the consent-owning record layer; the
|
|
6
|
-
* storage seam functions carry no consent logic — their call sites own
|
|
7
|
-
* gating.
|
|
8
|
-
*/
|
|
9
|
-
import { asc, eq, inArray } from "drizzle-orm";
|
|
10
|
-
import { v4 as uuid } from "uuid";
|
|
11
|
-
|
|
12
|
-
import { getRawShareAnalytics } from "../cloud/consent-cache.js";
|
|
13
|
-
import { getSqliteFrom, getTelemetryDb } from "../persistence/db-connection.js";
|
|
14
|
-
import { telemetryEvents } from "../persistence/schema/index.js";
|
|
15
|
-
import { APP_VERSION } from "../version.js";
|
|
16
|
-
import type {
|
|
17
|
-
OutboxTelemetryEventName,
|
|
18
|
-
OutboxTelemetryEventOf,
|
|
19
|
-
TelemetryEvent,
|
|
20
|
-
TelemetryEventBase,
|
|
21
|
-
} from "./types.js";
|
|
22
|
-
|
|
23
|
-
/** Ids per DELETE chunk — stays under SQLite's bound-variable limit. */
|
|
24
|
-
const DELETE_CHUNK_SIZE = 500;
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Max age of a pending outbox row. The reporter prunes older rows at the
|
|
28
|
-
* start of every flush cycle, in every consent state — this is what bounds
|
|
29
|
-
* the unknown-consent buffering (a permanently-unknown state never resolves,
|
|
30
|
-
* and a row this stale is worthless telemetry anyway).
|
|
31
|
-
*/
|
|
32
|
-
export const OUTBOX_MAX_ROW_AGE_MS = 30 * 24 * 60 * 60 * 1000;
|
|
33
|
-
|
|
34
|
-
/** One pending outbox row; `payload` is the wire `TelemetryEvent` JSON. */
|
|
35
|
-
export interface TelemetryOutboxRow {
|
|
36
|
-
id: string;
|
|
37
|
-
createdAt: number;
|
|
38
|
-
payload: string;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** One pending telemetry event to insert; `event` is the wire payload. */
|
|
42
|
-
export interface TelemetryOutboxInsert {
|
|
43
|
-
id: string;
|
|
44
|
-
name: string;
|
|
45
|
-
createdAt: number;
|
|
46
|
-
conversationId?: string | null;
|
|
47
|
-
event: TelemetryEvent;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Insert a batch of pending telemetry events as one multi-row INSERT —
|
|
52
|
-
* all-or-nothing, so a mid-batch failure never leaves a partial batch
|
|
53
|
-
* committed. Returns false when the telemetry DB is unavailable (degraded
|
|
54
|
-
* mode), true once every row is inserted (or the batch is empty).
|
|
55
|
-
*/
|
|
56
|
-
export function insertTelemetryOutboxEvents(
|
|
57
|
-
rows: TelemetryOutboxInsert[],
|
|
58
|
-
): boolean {
|
|
59
|
-
const db = getTelemetryDb();
|
|
60
|
-
if (!db) {
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
if (rows.length === 0) {
|
|
64
|
-
return true;
|
|
65
|
-
}
|
|
66
|
-
db.insert(telemetryEvents)
|
|
67
|
-
.values(
|
|
68
|
-
rows.map((row) => ({
|
|
69
|
-
id: row.id,
|
|
70
|
-
name: row.name,
|
|
71
|
-
createdAt: row.createdAt,
|
|
72
|
-
conversationId: row.conversationId ?? null,
|
|
73
|
-
payload: JSON.stringify(row.event),
|
|
74
|
-
})),
|
|
75
|
-
)
|
|
76
|
-
.run();
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Insert one pending telemetry event. Returns false when the telemetry DB is
|
|
82
|
-
* unavailable (degraded mode), true once the row is inserted.
|
|
83
|
-
*/
|
|
84
|
-
export function insertTelemetryOutboxEvent(
|
|
85
|
-
row: TelemetryOutboxInsert,
|
|
86
|
-
): boolean {
|
|
87
|
-
return insertTelemetryOutboxEvents([row]);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Lower-level record escape hatch: for payloads that need the record-time
|
|
92
|
-
* `(id, createdAt)` inside type-specific fields (onboarding's activation
|
|
93
|
-
* `daemon_event_id` override and `completed_at`). Drops only on a confirmed
|
|
94
|
-
* `share_analytics` opt-out — the record-time drop is a privacy courtesy for
|
|
95
|
-
* known opt-outs. While consent is unknown (cold cache, no platform session)
|
|
96
|
-
* the event is recorded: dropping on an unresolved state would permanently
|
|
97
|
-
* destroy data, and consent is enforced again at flush time. Unknown-state
|
|
98
|
-
* buffering is bounded — the reporter prunes rows older than
|
|
99
|
-
* {@link OUTBOX_MAX_ROW_AGE_MS} each flush cycle. Generates the
|
|
100
|
-
* outbox row identity, builds the wire payload via `buildEvent` (which owns
|
|
101
|
-
* all stamping), and inserts. Returns the generated row identity, or null
|
|
102
|
-
* when dropped for the opt-out or when the telemetry DB is unavailable
|
|
103
|
-
* (degraded mode). Prefer `recordTelemetryEvent` when the payload doesn't
|
|
104
|
-
* need them.
|
|
105
|
-
*/
|
|
106
|
-
export function recordTelemetryOutboxEvent(
|
|
107
|
-
name: string,
|
|
108
|
-
buildEvent: (id: string, createdAt: number) => TelemetryEvent,
|
|
109
|
-
opts?: { conversationId?: string | null },
|
|
110
|
-
): { id: string; createdAt: number } | null {
|
|
111
|
-
if (getRawShareAnalytics() === false) {
|
|
112
|
-
return null;
|
|
113
|
-
}
|
|
114
|
-
const id = uuid();
|
|
115
|
-
const createdAt = Date.now();
|
|
116
|
-
const inserted = insertTelemetryOutboxEvent({
|
|
117
|
-
id,
|
|
118
|
-
name,
|
|
119
|
-
createdAt,
|
|
120
|
-
conversationId: opts?.conversationId ?? null,
|
|
121
|
-
event: buildEvent(id, createdAt),
|
|
122
|
-
});
|
|
123
|
-
return inserted ? { id, createdAt } : null;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Preferred record API for outbox events whose payload does not depend on
|
|
128
|
-
* the record-time `(id, createdAt)`: stamps the `TelemetryEventBase` fields
|
|
129
|
-
* (record-time `assistant_version` included) and inherits
|
|
130
|
-
* `recordTelemetryOutboxEvent`'s consent gate and degraded-mode `null`.
|
|
131
|
-
*/
|
|
132
|
-
export function recordTelemetryEvent<N extends OutboxTelemetryEventName>(
|
|
133
|
-
name: N,
|
|
134
|
-
fields: Omit<OutboxTelemetryEventOf<N>, keyof TelemetryEventBase>,
|
|
135
|
-
opts?: { conversationId?: string | null },
|
|
136
|
-
): { id: string; createdAt: number } | null {
|
|
137
|
-
return recordTelemetryOutboxEvent(
|
|
138
|
-
name,
|
|
139
|
-
(id, createdAt) =>
|
|
140
|
-
// Cast: TS cannot re-associate the `Omit<...>` spread with the stamped
|
|
141
|
-
// base fields across a generic; `fields`' type guarantees the shape.
|
|
142
|
-
// Base fields are stamped after the spread so a widened `fields` value
|
|
143
|
-
// carrying base keys can never override them.
|
|
144
|
-
({
|
|
145
|
-
...fields,
|
|
146
|
-
type: name,
|
|
147
|
-
daemon_event_id: id,
|
|
148
|
-
recorded_at: createdAt,
|
|
149
|
-
assistant_version: APP_VERSION,
|
|
150
|
-
}) as OutboxTelemetryEventOf<N>,
|
|
151
|
-
opts,
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Read the oldest pending rows for one event name in `(created_at, id)`
|
|
157
|
-
* order. Empty when the telemetry DB is unavailable.
|
|
158
|
-
*/
|
|
159
|
-
export function queryTelemetryOutboxBatch(
|
|
160
|
-
name: string,
|
|
161
|
-
limit: number,
|
|
162
|
-
): TelemetryOutboxRow[] {
|
|
163
|
-
const db = getTelemetryDb();
|
|
164
|
-
if (!db) {
|
|
165
|
-
return [];
|
|
166
|
-
}
|
|
167
|
-
return db
|
|
168
|
-
.select({
|
|
169
|
-
id: telemetryEvents.id,
|
|
170
|
-
createdAt: telemetryEvents.createdAt,
|
|
171
|
-
payload: telemetryEvents.payload,
|
|
172
|
-
})
|
|
173
|
-
.from(telemetryEvents)
|
|
174
|
-
.where(eq(telemetryEvents.name, name))
|
|
175
|
-
.orderBy(asc(telemetryEvents.createdAt), asc(telemetryEvents.id))
|
|
176
|
-
.limit(limit)
|
|
177
|
-
.all();
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/** Delete flushed rows by id, in chunks. No-op when db null or ids empty. */
|
|
181
|
-
export function deleteTelemetryOutboxEvents(ids: string[]): void {
|
|
182
|
-
const db = getTelemetryDb();
|
|
183
|
-
if (!db || ids.length === 0) {
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
for (let i = 0; i < ids.length; i += DELETE_CHUNK_SIZE) {
|
|
187
|
-
db.delete(telemetryEvents)
|
|
188
|
-
.where(inArray(telemetryEvents.id, ids.slice(i, i + DELETE_CHUNK_SIZE)))
|
|
189
|
-
.run();
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Delete rows recorded before `cutoffCreatedAt`, across every event name
|
|
195
|
-
* (age-bound prune). Returns the deleted row count; 0 when the telemetry DB
|
|
196
|
-
* is unavailable.
|
|
197
|
-
*/
|
|
198
|
-
export function deleteTelemetryOutboxEventsBefore(
|
|
199
|
-
cutoffCreatedAt: number,
|
|
200
|
-
): number {
|
|
201
|
-
const db = getTelemetryDb();
|
|
202
|
-
if (!db) {
|
|
203
|
-
return 0;
|
|
204
|
-
}
|
|
205
|
-
// Raw statement: drizzle's bun-sqlite `.run()` is typed void, and the
|
|
206
|
-
// prune's only output is the changed-row count.
|
|
207
|
-
return getSqliteFrom(db)
|
|
208
|
-
.prepare("DELETE FROM telemetry_events WHERE created_at < ?")
|
|
209
|
-
.run(cutoffCreatedAt).changes;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/** Drop all pending rows for one event name (telemetry opt-out). */
|
|
213
|
-
export function discardPendingTelemetryOutboxEvents(name: string): void {
|
|
214
|
-
const db = getTelemetryDb();
|
|
215
|
-
if (!db) {
|
|
216
|
-
return;
|
|
217
|
-
}
|
|
218
|
-
db.delete(telemetryEvents).where(eq(telemetryEvents.name, name)).run();
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
/**
|
|
222
|
-
* Distinct event names with at least one pending row in the outbox. Used by the
|
|
223
|
-
* orphan-drain source to find rows whose type is no longer in the wire contract
|
|
224
|
-
* (e.g. recorded before the cloud removed/renamed a type) so they can be
|
|
225
|
-
* flushed instead of stranded. Empty when the telemetry DB is unavailable.
|
|
226
|
-
*/
|
|
227
|
-
export function queryDistinctOutboxEventNames(): string[] {
|
|
228
|
-
const db = getTelemetryDb();
|
|
229
|
-
if (!db) {
|
|
230
|
-
return [];
|
|
231
|
-
}
|
|
232
|
-
return db
|
|
233
|
-
.selectDistinct({ name: telemetryEvents.name })
|
|
234
|
-
.from(telemetryEvents)
|
|
235
|
-
.all()
|
|
236
|
-
.map((row) => row.name);
|
|
237
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type DrizzleDb,
|
|
3
|
-
getDb,
|
|
4
|
-
getMainDbReadOnly,
|
|
5
|
-
} from "../persistence/db-connection.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Main-DB resolution for the telemetry stores' unreported-event queries.
|
|
9
|
-
*
|
|
10
|
-
* The queries run in two processes with different postures: the daemon owns
|
|
11
|
-
* the main DB's read-write connection, while the resource monitor process
|
|
12
|
-
* observes the daemon's main DB through a dedicated read-only connection
|
|
13
|
-
* (WAL permits cross-process readers; the daemon stays the sole writer, and
|
|
14
|
-
* an accidental monitor-side write fails loudly). The monitor opts into the
|
|
15
|
-
* read-only posture once at startup; everything else resolves to the normal
|
|
16
|
-
* read-write connection.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
let readOnlyPosture = false;
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Switch this process's telemetry main-DB reads to the dedicated read-only
|
|
23
|
-
* connection. Called once at resource monitor startup, before the first
|
|
24
|
-
* flush; never unset — the posture is process-scoped by design.
|
|
25
|
-
*/
|
|
26
|
-
export function useReadOnlyMainDbForTelemetry(): void {
|
|
27
|
-
readOnlyPosture = true;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* The main-DB connection for telemetry queries: `getDb()`'s read-write
|
|
32
|
-
* connection in the daemon, the dedicated read-only connection in the
|
|
33
|
-
* resource monitor. Throws when the read-only connection cannot be opened
|
|
34
|
-
* (e.g. a fresh install where the daemon has not created the file yet) —
|
|
35
|
-
* the reporter's flush treats that as non-fatal and retries next cycle.
|
|
36
|
-
*/
|
|
37
|
-
export function getTelemetryMainDb(): DrizzleDb {
|
|
38
|
-
if (!readOnlyPosture) {
|
|
39
|
-
return getDb();
|
|
40
|
-
}
|
|
41
|
-
const db = getMainDbReadOnly();
|
|
42
|
-
if (!db) {
|
|
43
|
-
throw new Error(
|
|
44
|
-
"read-only main DB connection unavailable — retried next flush cycle",
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
return db;
|
|
48
|
-
}
|