@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,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { desc, eq } from "drizzle-orm";
|
|
2
2
|
import { v4 as uuid } from "uuid";
|
|
3
3
|
|
|
4
|
-
import { getTelemetryMainDb } from "../telemetry/telemetry-main-db.js";
|
|
5
4
|
import type {
|
|
6
5
|
PricingResult,
|
|
7
6
|
UsageEvent,
|
|
@@ -10,10 +9,7 @@ import type {
|
|
|
10
9
|
import { APP_VERSION } from "../version.js";
|
|
11
10
|
import { getDb } from "./db-connection.js";
|
|
12
11
|
import { rawAll } from "./raw-query.js";
|
|
13
|
-
import {
|
|
14
|
-
realUserTurnContentFilter,
|
|
15
|
-
realUserTurnContentFilterSql,
|
|
16
|
-
} from "./real-user-turn-filter.js";
|
|
12
|
+
import { realUserTurnContentFilterSql } from "./real-user-turn-filter.js";
|
|
17
13
|
import {
|
|
18
14
|
buildScheduleAttributionSubquery,
|
|
19
15
|
buildScheduleRunWindowExists,
|
|
@@ -211,229 +207,6 @@ export function listUsageEvents(options?: { limit?: number }): UsageEvent[] {
|
|
|
211
207
|
return rows.map(rowToUsageEvent);
|
|
212
208
|
}
|
|
213
209
|
|
|
214
|
-
/**
|
|
215
|
-
* Telemetry-flavoured `UsageEvent`: the persisted columns plus the two
|
|
216
|
-
* JOIN-computed conversation-level fields the reporter needs to emit
|
|
217
|
-
* for analytics (`avg turns per conversation`, `tokens on first turn`,
|
|
218
|
-
* foreground/background split on llm_usage rows themselves).
|
|
219
|
-
*
|
|
220
|
-
* Lives next to the query that produces it so the shape stays in lockstep
|
|
221
|
-
* with the SELECT; broader `UsageEvent` consumers stay untouched.
|
|
222
|
-
*/
|
|
223
|
-
export interface UnreportedUsageEvent extends UsageEvent {
|
|
224
|
-
/**
|
|
225
|
-
* Type of the parent conversation (`"standard"` / `"background"` /
|
|
226
|
-
* `"scheduled"`). Sourced from the value captured at record time
|
|
227
|
-
* (survives deletion of the parent conversation before flush), with a
|
|
228
|
-
* JOIN to `conversations` as the fallback for rows persisted before
|
|
229
|
-
* migration 353. Null when the LLM call has no `conversationId`
|
|
230
|
-
* (memory consolidation, background embedding work, etc.).
|
|
231
|
-
*/
|
|
232
|
-
conversationType: string | null;
|
|
233
|
-
/**
|
|
234
|
-
* 1-indexed position of the user turn this LLM call belongs to within
|
|
235
|
-
* the parent conversation, counting only real user turns (tool-result
|
|
236
|
-
* rows persisted with role="user" are excluded — same filter as the
|
|
237
|
-
* turn-event eligibility predicate). Computed as the count of user
|
|
238
|
-
* messages with `created_at <= this LLM call's created_at` in the
|
|
239
|
-
* parent conversation. Null when there's no parent conversation, or
|
|
240
|
-
* when the LLM call fired before any user turn (rare — covers seed
|
|
241
|
-
* agent starts).
|
|
242
|
-
*/
|
|
243
|
-
turnIndex: number | null;
|
|
244
|
-
/**
|
|
245
|
-
* Id of the conversation that spawned this LLM call's conversation:
|
|
246
|
-
* `parent_conversation_id` (subagent spawns), falling back to
|
|
247
|
-
* `fork_parent_conversation_id` for background forks (retrospectives).
|
|
248
|
-
* User-initiated forks are excluded — they are standard conversations
|
|
249
|
-
* whose usage belongs to themselves. Null when the conversation was
|
|
250
|
-
* not spawned by another conversation, or when the LLM call has no
|
|
251
|
-
* `conversationId` at all.
|
|
252
|
-
*/
|
|
253
|
-
parentConversationId: string | null;
|
|
254
|
-
/**
|
|
255
|
-
* 1-indexed position of the parent-conversation user turn this LLM
|
|
256
|
-
* call's conversation branched from. Computed as the count of real user
|
|
257
|
-
* turns in the parent conversation (same eligibility filter as
|
|
258
|
-
* `turnIndex`) up to the child conversation's creation for subagent
|
|
259
|
-
* spawns, or up to the fork boundary message for retrospective forks
|
|
260
|
-
* (which can fork from a turn much earlier than their creation time).
|
|
261
|
-
* Null when there's no parent conversation.
|
|
262
|
-
*/
|
|
263
|
-
parentTurnIndex: number | null;
|
|
264
|
-
/**
|
|
265
|
-
* Role of the subagent that owns this LLM call's conversation, from
|
|
266
|
-
* `SUBAGENT_ROLE_REGISTRY`. Null for every LLM call that did not run inside
|
|
267
|
-
* a subagent conversation, and for subagent conversations created before
|
|
268
|
-
* migration 362 whose `subagents` row had already been disposed.
|
|
269
|
-
*/
|
|
270
|
-
subagentRole: string | null;
|
|
271
|
-
/**
|
|
272
|
-
* How that subagent was spawned, one of the modes described on
|
|
273
|
-
* `SubagentSpawnMode` in `subagent/types.ts`. Orthogonal to `subagentRole`:
|
|
274
|
-
* the role selects the child's capabilities, the spawn mode selects its
|
|
275
|
-
* context inheritance and lifecycle. Null under the same conditions as
|
|
276
|
-
* `subagentRole`.
|
|
277
|
-
*/
|
|
278
|
-
subagentSpawnMode: string | null;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
export function queryUnreportedUsageEvents(
|
|
282
|
-
afterCreatedAt: number,
|
|
283
|
-
afterId: string | undefined,
|
|
284
|
-
limit: number,
|
|
285
|
-
): UnreportedUsageEvent[] {
|
|
286
|
-
const db = getTelemetryMainDb();
|
|
287
|
-
// Spawn linkage: `parent_conversation_id` (subagent spawns) with a
|
|
288
|
-
// fallback to `fork_parent_conversation_id` (retrospective forks — one
|
|
289
|
-
// hop up the fork chain is the intended attribution). The fallback is
|
|
290
|
-
// gated to background conversations: user-initiated forks also stamp
|
|
291
|
-
// `fork_parent_conversation_id` but are first-class standard
|
|
292
|
-
// conversations whose usage belongs to themselves, not the source turn.
|
|
293
|
-
// Null when the LEFT JOIN below misses or the conversation has no
|
|
294
|
-
// parent.
|
|
295
|
-
const parentIdSql = sql<string | null>`COALESCE(
|
|
296
|
-
${conversations.parentConversationId},
|
|
297
|
-
CASE WHEN ${conversations.conversationType} = 'background'
|
|
298
|
-
THEN ${conversations.forkParentConversationId}
|
|
299
|
-
END
|
|
300
|
-
)`;
|
|
301
|
-
// Cutoff for the parent-turn count. Subagent spawns attribute to the
|
|
302
|
-
// parent turn in flight at child creation. Retrospective forks can
|
|
303
|
-
// branch from a turn far earlier than the fork's creation time, so
|
|
304
|
-
// they anchor on the fork boundary message instead; child creation is
|
|
305
|
-
// the fallback when the boundary message is absent.
|
|
306
|
-
// The turn-index subqueries below count user-role rows only. User rows are
|
|
307
|
-
// always written finalized (only assistant turns stream), so no completeness
|
|
308
|
-
// predicate is needed; do not copy this shape for assistant-row counts.
|
|
309
|
-
const parentTurnCutoffSql = sql<number>`CASE
|
|
310
|
-
WHEN ${conversations.parentConversationId} IS NOT NULL THEN ${conversations.createdAt}
|
|
311
|
-
ELSE COALESCE(
|
|
312
|
-
(SELECT mb.created_at FROM messages AS mb
|
|
313
|
-
WHERE mb.id = ${conversations.forkParentMessageId}),
|
|
314
|
-
${conversations.createdAt}
|
|
315
|
-
)
|
|
316
|
-
END`;
|
|
317
|
-
// `conversationType` prefers the value stamped on the row at record
|
|
318
|
-
// time (migration 353) — the parent conversation may have been deleted
|
|
319
|
-
// before this flush (retrospective fork GC, user deletion) — and falls
|
|
320
|
-
// back to a LEFT JOIN against `conversations` for pre-353 rows. LEFT
|
|
321
|
-
// JOIN because `llm_usage_events.conversationId` is nullable — calls
|
|
322
|
-
// that aren't tied to a conversation (memory consolidation, etc.)
|
|
323
|
-
// still need to flush through telemetry.
|
|
324
|
-
//
|
|
325
|
-
// `turnIndex` is a correlated subquery counting real user turns in
|
|
326
|
-
// the same conversation up to and including this LLM call's
|
|
327
|
-
// `created_at`. The filter mirrors `queryUnreportedTurnEvents` so the
|
|
328
|
-
// two indexes stay aligned: an LLM call fired during processing of
|
|
329
|
-
// turn N reports `turn_index = N`, matching what the turn event
|
|
330
|
-
// stream emitted for the triggering user message.
|
|
331
|
-
const rows = db
|
|
332
|
-
.select({
|
|
333
|
-
id: llmUsageEvents.id,
|
|
334
|
-
createdAt: llmUsageEvents.createdAt,
|
|
335
|
-
conversationId: llmUsageEvents.conversationId,
|
|
336
|
-
runId: llmUsageEvents.runId,
|
|
337
|
-
cronRunId: llmUsageEvents.cronRunId,
|
|
338
|
-
requestId: llmUsageEvents.requestId,
|
|
339
|
-
actor: llmUsageEvents.actor,
|
|
340
|
-
callSite: llmUsageEvents.callSite,
|
|
341
|
-
inferenceProfile: llmUsageEvents.inferenceProfile,
|
|
342
|
-
inferenceProfileSource: llmUsageEvents.inferenceProfileSource,
|
|
343
|
-
provider: llmUsageEvents.provider,
|
|
344
|
-
model: llmUsageEvents.model,
|
|
345
|
-
inputTokens: llmUsageEvents.inputTokens,
|
|
346
|
-
outputTokens: llmUsageEvents.outputTokens,
|
|
347
|
-
cacheCreationInputTokens: llmUsageEvents.cacheCreationInputTokens,
|
|
348
|
-
cacheReadInputTokens: llmUsageEvents.cacheReadInputTokens,
|
|
349
|
-
rawUsage: llmUsageEvents.rawUsage,
|
|
350
|
-
estimatedCostUsd: llmUsageEvents.estimatedCostUsd,
|
|
351
|
-
pricingStatus: llmUsageEvents.pricingStatus,
|
|
352
|
-
assistantVersion: llmUsageEvents.assistantVersion,
|
|
353
|
-
llmCallCount: llmUsageEvents.llmCallCount,
|
|
354
|
-
conversationType: sql<
|
|
355
|
-
string | null
|
|
356
|
-
>`COALESCE(${llmUsageEvents.conversationType}, ${conversations.conversationType})`.as(
|
|
357
|
-
"resolved_conversation_type",
|
|
358
|
-
),
|
|
359
|
-
// Null when conversationId is null (no parent conversation).
|
|
360
|
-
// Otherwise the count of eligible user turns up to and including
|
|
361
|
-
// this LLM call's createdAt. The COALESCE guard returns null
|
|
362
|
-
// (rather than 0) for the "no user turn yet" edge case so the
|
|
363
|
-
// analytics layer can distinguish "before-first-turn" LLM calls.
|
|
364
|
-
turnIndex: sql<number | null>`(
|
|
365
|
-
CASE WHEN ${llmUsageEvents.conversationId} IS NULL THEN NULL
|
|
366
|
-
ELSE (
|
|
367
|
-
SELECT COUNT(*) FROM messages AS m2
|
|
368
|
-
WHERE m2.conversation_id = ${llmUsageEvents.conversationId}
|
|
369
|
-
AND m2.role = 'user'
|
|
370
|
-
AND ${realUserTurnContentFilter("m2")}
|
|
371
|
-
AND m2.created_at <= ${llmUsageEvents.createdAt}
|
|
372
|
-
)
|
|
373
|
-
END
|
|
374
|
-
)`.as("turn_index"),
|
|
375
|
-
parentConversationId: parentIdSql.as("parent_conversation_id"),
|
|
376
|
-
// The parent turn this child conversation branched from: count of
|
|
377
|
-
// the PARENT conversation's real user turns with `created_at <=`
|
|
378
|
-
// the cutoff (child creation for subagent spawns, fork boundary
|
|
379
|
-
// message for retrospective forks). Same eligibility filter as
|
|
380
|
-
// `turnIndex` above.
|
|
381
|
-
// Stamped on the conversation row at spawn (migration 362) rather than
|
|
382
|
-
// joined from `subagents`, whose rows are deleted on dispose while this
|
|
383
|
-
// watermark query can trail far behind after an ingest outage.
|
|
384
|
-
subagentRole: conversations.subagentRole,
|
|
385
|
-
subagentSpawnMode: conversations.subagentSpawnMode,
|
|
386
|
-
parentTurnIndex: sql<number | null>`(
|
|
387
|
-
CASE WHEN ${parentIdSql} IS NULL THEN NULL
|
|
388
|
-
ELSE (
|
|
389
|
-
SELECT COUNT(*) FROM messages AS m3
|
|
390
|
-
WHERE m3.conversation_id = ${parentIdSql}
|
|
391
|
-
AND m3.role = 'user'
|
|
392
|
-
AND ${realUserTurnContentFilter("m3")}
|
|
393
|
-
AND m3.created_at <= ${parentTurnCutoffSql}
|
|
394
|
-
)
|
|
395
|
-
END
|
|
396
|
-
)`.as("parent_turn_index"),
|
|
397
|
-
})
|
|
398
|
-
.from(llmUsageEvents)
|
|
399
|
-
.leftJoin(
|
|
400
|
-
conversations,
|
|
401
|
-
eq(llmUsageEvents.conversationId, conversations.id),
|
|
402
|
-
)
|
|
403
|
-
.where(
|
|
404
|
-
afterId
|
|
405
|
-
? or(
|
|
406
|
-
gt(llmUsageEvents.createdAt, afterCreatedAt),
|
|
407
|
-
and(
|
|
408
|
-
eq(llmUsageEvents.createdAt, afterCreatedAt),
|
|
409
|
-
gt(llmUsageEvents.id, afterId),
|
|
410
|
-
),
|
|
411
|
-
)
|
|
412
|
-
: gt(llmUsageEvents.createdAt, afterCreatedAt),
|
|
413
|
-
)
|
|
414
|
-
.orderBy(asc(llmUsageEvents.createdAt), asc(llmUsageEvents.id))
|
|
415
|
-
.limit(limit)
|
|
416
|
-
.all();
|
|
417
|
-
return rows.map((row) => ({
|
|
418
|
-
...rowToUsageEvent(row),
|
|
419
|
-
conversationType: row.conversationType,
|
|
420
|
-
// SQLite returns COUNT(*) as 0 when no rows match; the CASE in the
|
|
421
|
-
// subquery already collapses the no-conversation case to NULL.
|
|
422
|
-
// Convert the integer column to `number | null` for the typed
|
|
423
|
-
// return value.
|
|
424
|
-
turnIndex: row.turnIndex === null ? null : Number(row.turnIndex),
|
|
425
|
-
parentConversationId: row.parentConversationId,
|
|
426
|
-
parentTurnIndex:
|
|
427
|
-
row.parentTurnIndex === null ? null : Number(row.parentTurnIndex),
|
|
428
|
-
subagentRole: row.subagentRole,
|
|
429
|
-
subagentSpawnMode: row.subagentSpawnMode,
|
|
430
|
-
}));
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
// ---------------------------------------------------------------------------
|
|
434
|
-
// Aggregation — time-range queries for the usage dashboard
|
|
435
|
-
// ---------------------------------------------------------------------------
|
|
436
|
-
|
|
437
210
|
export type UsageAggregationFilter = ScheduleAttributionFilter;
|
|
438
211
|
|
|
439
212
|
/** Aggregate totals across a time range. */
|
|
@@ -34,8 +34,8 @@ import { z } from "zod";
|
|
|
34
34
|
|
|
35
35
|
import { contentBlockSchema } from "../providers/content-block-schema.js";
|
|
36
36
|
import type { ContentBlock } from "../providers/types.js";
|
|
37
|
+
import { getWorkspaceDir } from "../util/layout.js";
|
|
37
38
|
import { getLogger } from "../util/logger.js";
|
|
38
|
-
import { getWorkspaceDir } from "../util/platform.js";
|
|
39
39
|
|
|
40
40
|
const log = getLogger("message-content-file");
|
|
41
41
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getConfig } from "../../config/loader.js";
|
|
2
|
+
import { getDbPath } from "../../util/layout.js";
|
|
2
3
|
import { getLogger } from "../../util/logger.js";
|
|
3
|
-
import { getDbPath } from "../../util/platform.js";
|
|
4
4
|
import { runAsyncSqlite } from "../db-async-query.js";
|
|
5
5
|
import type { DrizzleDb } from "../db-connection.js";
|
|
6
6
|
import { getSqliteFrom } from "../db-connection.js";
|
|
@@ -3,8 +3,8 @@ import {
|
|
|
3
3
|
PLACEHOLDER_BLOCKS_OMITTED,
|
|
4
4
|
PLACEHOLDER_EMPTY_TURN,
|
|
5
5
|
} from "../../providers/placeholder-sentinels.js";
|
|
6
|
+
import { getDbPath } from "../../util/layout.js";
|
|
6
7
|
import { getLogger } from "../../util/logger.js";
|
|
7
|
-
import { getDbPath } from "../../util/platform.js";
|
|
8
8
|
import { runAsyncSqlite } from "../db-async-query.js";
|
|
9
9
|
import type { DrizzleDb } from "../db-connection.js";
|
|
10
10
|
import { getSqliteFrom } from "../db-connection.js";
|
|
@@ -4,7 +4,7 @@ import { afterEach, describe, expect, test } from "bun:test";
|
|
|
4
4
|
|
|
5
5
|
import { drizzle } from "drizzle-orm/bun-sqlite";
|
|
6
6
|
|
|
7
|
-
import { getWorkspaceConfigPath } from "../../util/
|
|
7
|
+
import { getWorkspaceConfigPath } from "../../util/layout.js";
|
|
8
8
|
import * as schema from "../schema.js";
|
|
9
9
|
import { migrateRewriteBalancedEconomyProfilePins } from "./296-rewrite-balanced-economy-profile-pins.js";
|
|
10
10
|
|
|
@@ -4,7 +4,7 @@ import { afterEach, describe, expect, test } from "bun:test";
|
|
|
4
4
|
|
|
5
5
|
import { drizzle } from "drizzle-orm/bun-sqlite";
|
|
6
6
|
|
|
7
|
-
import { getWorkspaceConfigPath } from "../../util/
|
|
7
|
+
import { getWorkspaceConfigPath } from "../../util/layout.js";
|
|
8
8
|
import * as schema from "../schema.js";
|
|
9
9
|
import { migrateRewriteFrontierProfilePins } from "./306-rewrite-frontier-profile-pins.js";
|
|
10
10
|
|
|
@@ -23,6 +23,19 @@ const { migrateBackfillTelemetryEventsOutbox } =
|
|
|
23
23
|
|
|
24
24
|
await initializeDb();
|
|
25
25
|
|
|
26
|
+
// Migration 387 (the usage-telemetry removal) deletes the telemetry DB file
|
|
27
|
+
// at the end of the chain, so after `initializeDb()` the telemetry-side
|
|
28
|
+
// schema no longer exists. These tests drive the move + backfill steps
|
|
29
|
+
// directly, so re-create the two tables they touch first — both owning
|
|
30
|
+
// steps are idempotent CREATE IF NOT EXISTS on the lazily re-opened
|
|
31
|
+
// telemetry file.
|
|
32
|
+
const { migrateCreateTelemetryEventsTable } =
|
|
33
|
+
await import("./333-create-telemetry-events-table.js");
|
|
34
|
+
const { createFlushCheckpointsTable } =
|
|
35
|
+
await import("./327-create-flush-checkpoints.js");
|
|
36
|
+
migrateCreateTelemetryEventsTable(getDb());
|
|
37
|
+
createFlushCheckpointsTable(getDb());
|
|
38
|
+
|
|
26
39
|
const SOURCE_COLUMNS = `
|
|
27
40
|
id TEXT PRIMARY KEY, created_at INTEGER NOT NULL, screen TEXT NOT NULL,
|
|
28
41
|
tools_json TEXT, tasks_json TEXT, tone TEXT, google_connected INTEGER,
|
|
@@ -23,6 +23,19 @@ const { migrateBackfillTelemetryEventsOutbox } =
|
|
|
23
23
|
|
|
24
24
|
await initializeDb();
|
|
25
25
|
|
|
26
|
+
// Migration 387 (the usage-telemetry removal) deletes the telemetry DB file
|
|
27
|
+
// at the end of the chain, so after `initializeDb()` the telemetry-side
|
|
28
|
+
// schema no longer exists. These tests drive the move + backfill steps
|
|
29
|
+
// directly, so re-create the two tables they touch first — both owning
|
|
30
|
+
// steps are idempotent CREATE IF NOT EXISTS on the lazily re-opened
|
|
31
|
+
// telemetry file.
|
|
32
|
+
const { migrateCreateTelemetryEventsTable } =
|
|
33
|
+
await import("./333-create-telemetry-events-table.js");
|
|
34
|
+
const { createFlushCheckpointsTable } =
|
|
35
|
+
await import("./327-create-flush-checkpoints.js");
|
|
36
|
+
migrateCreateTelemetryEventsTable(getDb());
|
|
37
|
+
createFlushCheckpointsTable(getDb());
|
|
38
|
+
|
|
26
39
|
const SOURCE_COLUMNS = `
|
|
27
40
|
id TEXT PRIMARY KEY, created_at INTEGER NOT NULL, guard TEXT NOT NULL,
|
|
28
41
|
path TEXT NOT NULL, failure_kind TEXT NOT NULL, count INTEGER NOT NULL,
|
|
@@ -23,6 +23,19 @@ const { migrateBackfillTelemetryEventsOutbox } =
|
|
|
23
23
|
|
|
24
24
|
await initializeDb();
|
|
25
25
|
|
|
26
|
+
// Migration 387 (the usage-telemetry removal) deletes the telemetry DB file
|
|
27
|
+
// at the end of the chain, so after `initializeDb()` the telemetry-side
|
|
28
|
+
// schema no longer exists. These tests drive the move + backfill steps
|
|
29
|
+
// directly, so re-create the two tables they touch first — both owning
|
|
30
|
+
// steps are idempotent CREATE IF NOT EXISTS on the lazily re-opened
|
|
31
|
+
// telemetry file.
|
|
32
|
+
const { migrateCreateTelemetryEventsTable } =
|
|
33
|
+
await import("./333-create-telemetry-events-table.js");
|
|
34
|
+
const { createFlushCheckpointsTable } =
|
|
35
|
+
await import("./327-create-flush-checkpoints.js");
|
|
36
|
+
migrateCreateTelemetryEventsTable(getDb());
|
|
37
|
+
createFlushCheckpointsTable(getDb());
|
|
38
|
+
|
|
26
39
|
/** Backfilled outbox rows for the lifecycle source, in `(created_at, id)` order. */
|
|
27
40
|
function outboxLifecycleRows(): Array<{
|
|
28
41
|
id: string;
|
|
@@ -24,6 +24,19 @@ const { migrateBackfillTelemetryEventsOutbox } =
|
|
|
24
24
|
|
|
25
25
|
await initializeDb();
|
|
26
26
|
|
|
27
|
+
// Migration 387 (the usage-telemetry removal) deletes the telemetry DB file
|
|
28
|
+
// at the end of the chain, so after `initializeDb()` the telemetry-side
|
|
29
|
+
// schema no longer exists. These tests drive the move + backfill steps
|
|
30
|
+
// directly, so re-create the two tables they touch first — both owning
|
|
31
|
+
// steps are idempotent CREATE IF NOT EXISTS on the lazily re-opened
|
|
32
|
+
// telemetry file.
|
|
33
|
+
const { migrateCreateTelemetryEventsTable } =
|
|
34
|
+
await import("./333-create-telemetry-events-table.js");
|
|
35
|
+
const { createFlushCheckpointsTable } =
|
|
36
|
+
await import("./327-create-flush-checkpoints.js");
|
|
37
|
+
migrateCreateTelemetryEventsTable(getDb());
|
|
38
|
+
createFlushCheckpointsTable(getDb());
|
|
39
|
+
|
|
27
40
|
const SOURCE_COLUMNS = `
|
|
28
41
|
id TEXT PRIMARY KEY, created_at INTEGER NOT NULL, conversation_id TEXT,
|
|
29
42
|
skill_name TEXT NOT NULL, skill_updated_at TEXT, provider TEXT, model TEXT,
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
* Tests for migration 333: creating the generic `telemetry_events` outbox
|
|
3
3
|
* table on the dedicated telemetry database (`assistant-telemetry.db`).
|
|
4
4
|
*
|
|
5
|
-
* Runs against real workspace databases
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Runs against real workspace databases. Migration 387 (the usage-telemetry
|
|
6
|
+
* removal) deletes the telemetry DB file at the end of the chain, so the
|
|
7
|
+
* tests re-drive the idempotent step themselves and assert the resulting
|
|
8
|
+
* telemetry-side schema and that re-running it is idempotent.
|
|
8
9
|
*/
|
|
9
10
|
import { describe, expect, test } from "bun:test";
|
|
10
11
|
|
|
@@ -32,7 +33,9 @@ function telemetryIndexNames(): string[] {
|
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
describe("migration 333: create telemetry_events on the telemetry DB", () => {
|
|
35
|
-
test("
|
|
36
|
+
test("the step creates the table with both indexes", () => {
|
|
37
|
+
migrateCreateTelemetryEventsTable(getDb());
|
|
38
|
+
|
|
36
39
|
expect(telemetryTableExists("telemetry_events")).toBe(true);
|
|
37
40
|
const indexes = telemetryIndexNames();
|
|
38
41
|
expect(indexes).toContain("idx_telemetry_events_name_created_at_id");
|
|
@@ -20,6 +20,19 @@ const { APP_VERSION } = await import("../../version.js");
|
|
|
20
20
|
|
|
21
21
|
await initializeDb();
|
|
22
22
|
|
|
23
|
+
// Migration 387 (the usage-telemetry removal) deletes the telemetry DB file
|
|
24
|
+
// at the end of the chain, so after `initializeDb()` the outbox and
|
|
25
|
+
// checkpoint tables no longer exist. The tests recreate the legacy tables
|
|
26
|
+
// and drive this step directly, so re-create the two tables it touches
|
|
27
|
+
// first — both owning steps are idempotent CREATE IF NOT EXISTS on the
|
|
28
|
+
// lazily re-opened telemetry file.
|
|
29
|
+
const { migrateCreateTelemetryEventsTable } =
|
|
30
|
+
await import("./333-create-telemetry-events-table.js");
|
|
31
|
+
const { createFlushCheckpointsTable } =
|
|
32
|
+
await import("./327-create-flush-checkpoints.js");
|
|
33
|
+
migrateCreateTelemetryEventsTable(getDb());
|
|
34
|
+
createFlushCheckpointsTable(getDb());
|
|
35
|
+
|
|
23
36
|
const OPT_OUT_SENTINEL = "ffffffff-ffff-ffff-ffff-ffffffffffff";
|
|
24
37
|
|
|
25
38
|
const LEGACY_TABLES: Record<string, string> = {
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
2
|
+
|
|
3
|
+
import { getTelemetryDbPath } from "../../util/telemetry-db-path.js";
|
|
4
|
+
import { closeTelemetryDb, type DrizzleDb } from "../db-connection.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Delete the dedicated telemetry database (`assistant-telemetry.db`, plus its
|
|
8
|
+
* `-wal` and `-shm` siblings).
|
|
9
|
+
*
|
|
10
|
+
* The usage-telemetry pipeline (reporter, event sources, outbox, traces, and
|
|
11
|
+
* every store that fed it) is gone — nothing reads or writes this database
|
|
12
|
+
* anymore. It held:
|
|
13
|
+
*
|
|
14
|
+
* - `watchdog_events` (migration 301)
|
|
15
|
+
* - `config_setting_events` (325)
|
|
16
|
+
* - `flush_checkpoints` (327) — the reporter's watermark cursors
|
|
17
|
+
* - `onboarding_events` (moved here by 329)
|
|
18
|
+
* - `auth_fallback_events` (moved here by 330)
|
|
19
|
+
* - `lifecycle_events` (moved here by 331)
|
|
20
|
+
* - `skill_loaded_events` (moved here by 332)
|
|
21
|
+
* - `telemetry_events` — the generic outbox (333)
|
|
22
|
+
*
|
|
23
|
+
* Deleting the FILES rather than DROP TABLE: a dropped table leaves its
|
|
24
|
+
* payloads recoverable in the file's freelist and WAL pages, and this
|
|
25
|
+
* database's last contents include the consented turn traces — unlinking is
|
|
26
|
+
* what actually destroys them on disk.
|
|
27
|
+
*
|
|
28
|
+
* Skipped entirely on a fresh install (no telemetry DB file): there is
|
|
29
|
+
* nothing to delete. The live connection is closed first so platforms that
|
|
30
|
+
* lock open files can complete the unlink; a failed unlink is logged and
|
|
31
|
+
* leaves the file in place, where it is inert — nothing opens it after this
|
|
32
|
+
* migration (the export route's checkpoint list no longer includes it).
|
|
33
|
+
*
|
|
34
|
+
* The `mainDb` parameter is accepted to satisfy the migration-step signature but
|
|
35
|
+
* is not used — this migration operates exclusively on the telemetry DB.
|
|
36
|
+
*/
|
|
37
|
+
export function migrateDropTelemetryTables(_mainDb: DrizzleDb): void {
|
|
38
|
+
closeTelemetryDb();
|
|
39
|
+
const base = getTelemetryDbPath();
|
|
40
|
+
for (const file of [base, `${base}-wal`, `${base}-shm`]) {
|
|
41
|
+
try {
|
|
42
|
+
if (existsSync(file)) {
|
|
43
|
+
unlinkSync(file);
|
|
44
|
+
}
|
|
45
|
+
} catch (error) {
|
|
46
|
+
console.warn(
|
|
47
|
+
`[migrate-387] could not delete ${file}: ${error instanceof Error ? error.message : String(error)} — leaving the inert file in place.`,
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -15,6 +15,12 @@ const { createFlushCheckpointsTable } =
|
|
|
15
15
|
|
|
16
16
|
await initializeDb();
|
|
17
17
|
|
|
18
|
+
// Migration 387 (the usage-telemetry removal) deletes the telemetry DB file
|
|
19
|
+
// at the end of the chain, so after `initializeDb()` the telemetry-side
|
|
20
|
+
// schema no longer exists. Re-drive the idempotent step so the tests
|
|
21
|
+
// exercise it against a live telemetry file.
|
|
22
|
+
createFlushCheckpointsTable(getDb());
|
|
23
|
+
|
|
18
24
|
function telemetrySqlite() {
|
|
19
25
|
const db = getTelemetrySqlite();
|
|
20
26
|
if (!db) {
|
|
@@ -53,7 +59,9 @@ describe("migration 327 — flush_checkpoints on the telemetry database", () =>
|
|
|
53
59
|
.run();
|
|
54
60
|
});
|
|
55
61
|
|
|
56
|
-
test("
|
|
62
|
+
test("the step creates the table on the telemetry DB", () => {
|
|
63
|
+
createFlushCheckpointsTable(getDb());
|
|
64
|
+
|
|
57
65
|
const row = telemetrySqlite()
|
|
58
66
|
.query(
|
|
59
67
|
`SELECT name FROM sqlite_master WHERE type='table' AND name='flush_checkpoints'`,
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import {
|
|
2
|
+
existsSync,
|
|
3
|
+
mkdirSync,
|
|
4
|
+
rmSync,
|
|
5
|
+
unlinkSync,
|
|
6
|
+
writeFileSync,
|
|
7
|
+
} from "node:fs";
|
|
8
|
+
import { dirname } from "node:path";
|
|
9
|
+
import { Database } from "bun:sqlite";
|
|
10
|
+
import { beforeEach, describe, expect, test } from "bun:test";
|
|
11
|
+
|
|
12
|
+
import { drizzle } from "drizzle-orm/bun-sqlite";
|
|
13
|
+
|
|
14
|
+
// The migration resolves its target through this helper at call time — seed
|
|
15
|
+
// the file at the SAME resolved path so the assertions and the migration can't
|
|
16
|
+
// disagree about which file is the telemetry DB.
|
|
17
|
+
import { getTelemetryDbPath } from "../../../util/telemetry-db-path.js";
|
|
18
|
+
import * as schema from "../../schema.js";
|
|
19
|
+
import { migrateDropTelemetryTables } from "../387-drop-telemetry-tables.js";
|
|
20
|
+
|
|
21
|
+
function createTestDb() {
|
|
22
|
+
const sqlite = new Database(":memory:");
|
|
23
|
+
return drizzle(sqlite, { schema });
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function seededFiles(): string[] {
|
|
27
|
+
const base = getTelemetryDbPath();
|
|
28
|
+
return [base, `${base}-wal`, `${base}-shm`];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function seedTelemetryDb(): void {
|
|
32
|
+
const path = getTelemetryDbPath();
|
|
33
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
34
|
+
rmSync(path, { force: true });
|
|
35
|
+
const raw = new Database(path);
|
|
36
|
+
raw.exec(`
|
|
37
|
+
CREATE TABLE IF NOT EXISTS telemetry_events (
|
|
38
|
+
id TEXT PRIMARY KEY, name TEXT NOT NULL, created_at INTEGER NOT NULL,
|
|
39
|
+
conversation_id TEXT, payload TEXT NOT NULL
|
|
40
|
+
);
|
|
41
|
+
CREATE TABLE IF NOT EXISTS flush_checkpoints (
|
|
42
|
+
key TEXT PRIMARY KEY, value TEXT NOT NULL
|
|
43
|
+
);
|
|
44
|
+
`);
|
|
45
|
+
raw.close();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
describe("migrateDropTelemetryTables", () => {
|
|
49
|
+
beforeEach(() => {
|
|
50
|
+
// Never let one case's seeded files leak into the next.
|
|
51
|
+
for (const file of seededFiles()) {
|
|
52
|
+
if (existsSync(file)) {
|
|
53
|
+
unlinkSync(file);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
test("no telemetry DB file → no-op (fresh installs never create one)", () => {
|
|
59
|
+
const db = createTestDb();
|
|
60
|
+
migrateDropTelemetryTables(db);
|
|
61
|
+
expect(existsSync(getTelemetryDbPath())).toBe(false);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test("deletes the telemetry database file and its -wal/-shm siblings", () => {
|
|
65
|
+
seedTelemetryDb();
|
|
66
|
+
// Siblings as sqlite leaves them after a WAL-mode session — the migration
|
|
67
|
+
// must sweep all three, since a DROP-less delete that only removed the
|
|
68
|
+
// base file would still leave trace payloads in the WAL.
|
|
69
|
+
writeFileSync(`${getTelemetryDbPath()}-wal`, "wal-bytes");
|
|
70
|
+
writeFileSync(`${getTelemetryDbPath()}-shm`, "shm-bytes");
|
|
71
|
+
|
|
72
|
+
const db = createTestDb();
|
|
73
|
+
migrateDropTelemetryTables(db);
|
|
74
|
+
|
|
75
|
+
for (const file of seededFiles()) {
|
|
76
|
+
expect(existsSync(file)).toBe(false);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Database } from "bun:sqlite";
|
|
2
2
|
|
|
3
|
+
import { getDbPath } from "../../../util/layout.js";
|
|
3
4
|
import { getLogger } from "../../../util/logger.js";
|
|
4
|
-
import { getDbPath } from "../../../util/platform.js";
|
|
5
5
|
import {
|
|
6
6
|
parseChangesFromStdout,
|
|
7
7
|
runAsyncSqlite,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IntegrityError } from "../../util/errors.js";
|
|
2
|
+
import { getDbPath } from "../../util/layout.js";
|
|
2
3
|
import { getLogger } from "../../util/logger.js";
|
|
3
|
-
import { getDbPath } from "../../util/platform.js";
|
|
4
4
|
import { type DrizzleDb, getSqliteFrom } from "../db-connection.js";
|
|
5
5
|
import {
|
|
6
6
|
getStepName,
|
|
@@ -29,12 +29,7 @@
|
|
|
29
29
|
|
|
30
30
|
import type { Database, SQLQueryBindings } from "bun:sqlite";
|
|
31
31
|
|
|
32
|
-
import {
|
|
33
|
-
getLogsSqlite,
|
|
34
|
-
getMemorySqlite,
|
|
35
|
-
getSqlite,
|
|
36
|
-
getTelemetrySqlite,
|
|
37
|
-
} from "./db-connection.js";
|
|
32
|
+
import { getLogsSqlite, getMemorySqlite, getSqlite } from "./db-connection.js";
|
|
38
33
|
|
|
39
34
|
type SqlParam = SQLQueryBindings;
|
|
40
35
|
|
|
@@ -129,15 +124,6 @@ function logsSqlite(): Database {
|
|
|
129
124
|
return sqlite;
|
|
130
125
|
}
|
|
131
126
|
|
|
132
|
-
/** The telemetry connection, or a thrown error when it cannot be opened. */
|
|
133
|
-
function telemetrySqlite(): Database {
|
|
134
|
-
const sqlite = getTelemetrySqlite();
|
|
135
|
-
if (!sqlite) {
|
|
136
|
-
throw new Error("telemetry database unavailable");
|
|
137
|
-
}
|
|
138
|
-
return sqlite;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
127
|
/** {@link rawGet} against the memory connection. */
|
|
142
128
|
export function rawMemoryGet<T>(
|
|
143
129
|
label: string,
|
|
@@ -198,20 +184,6 @@ export function rawLogsRun(
|
|
|
198
184
|
return (sqlite.query("SELECT changes() AS c").get() as { c: number }).c;
|
|
199
185
|
}
|
|
200
186
|
|
|
201
|
-
/** {@link rawRun} against the telemetry connection. */
|
|
202
|
-
export function rawTelemetryRun(
|
|
203
|
-
label: string,
|
|
204
|
-
sql: string,
|
|
205
|
-
...params: SqlParam[]
|
|
206
|
-
): number {
|
|
207
|
-
const sqlite = telemetrySqlite();
|
|
208
|
-
sqlite
|
|
209
|
-
.label(label)
|
|
210
|
-
.query(sql)
|
|
211
|
-
.run(...params);
|
|
212
|
-
return (sqlite.query("SELECT changes() AS c").get() as { c: number }).c;
|
|
213
|
-
}
|
|
214
|
-
|
|
215
187
|
/**
|
|
216
188
|
* Delete all rows from the given tables in a single transaction.
|
|
217
189
|
*
|