@mycadet/assistant 0.12.9 → 0.12.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (651) hide show
  1. package/Dockerfile +0 -8
  2. package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +1 -1
  3. package/openapi.yaml +62 -910
  4. package/package.json +3 -7
  5. package/scripts/build-test-fixtures.ts +1 -1
  6. package/scripts/generate-openapi.ts +22 -6
  7. package/scripts/postinstall.ts +4 -10
  8. package/scripts/run-tests.ts +0 -21
  9. package/src/__tests__/adaptive-thinking-repair.test.ts +19 -57
  10. package/src/__tests__/agent-loop.test.ts +0 -76
  11. package/src/__tests__/anthropic-provider.test.ts +6 -6
  12. package/src/__tests__/assert-not-live-db.ts +1 -1
  13. package/src/__tests__/assistant-id-boundary-guard.test.ts +3 -3
  14. package/src/__tests__/attachments-store-heic-normalize.test.ts +1 -1
  15. package/src/__tests__/attachments-store.test.ts +1 -1
  16. package/src/__tests__/audit-log-rotation.test.ts +1 -1
  17. package/src/__tests__/btw-routes.test.ts +1 -1
  18. package/src/__tests__/byok-default-profile-ensure.test.ts +21 -27
  19. package/src/__tests__/call-conversation-messages.test.ts +0 -5
  20. package/src/__tests__/call-recovery.test.ts +2 -7
  21. package/src/__tests__/call-routes-http.test.ts +0 -12
  22. package/src/__tests__/call-store.test.ts +2 -7
  23. package/src/__tests__/catalog-files.test.ts +7 -5
  24. package/src/__tests__/checker.test.ts +1 -1
  25. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +4 -4
  26. package/src/__tests__/cloud-client-verify-credential.test.ts +0 -4
  27. package/src/__tests__/cloud-credential-catalog-cli.test.ts +14 -14
  28. package/src/__tests__/cloud-profile-guard.test.ts +48 -401
  29. package/src/__tests__/compaction-events.test.ts +2 -2
  30. package/src/__tests__/config-loader-backfill.test.ts +74 -163
  31. package/src/__tests__/config-loader-cloud-defaults.test.ts +11 -11
  32. package/src/__tests__/config-loader-corrupt.test.ts +10 -10
  33. package/src/__tests__/config-loader-quarantine-notice.test.ts +7 -7
  34. package/src/__tests__/config-loader-validation-reset-notice.test.ts +11 -11
  35. package/src/__tests__/config-schema.test.ts +26 -27
  36. package/src/__tests__/config-set-route.test.ts +2 -6
  37. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +28 -300
  38. package/src/__tests__/conversation-agent-loop-overflow.test.ts +39 -246
  39. package/src/__tests__/conversation-agent-loop.test.ts +2 -58
  40. package/src/__tests__/conversation-clear-safety.test.ts +0 -30
  41. package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
  42. package/src/__tests__/conversation-queue.test.ts +1 -1
  43. package/src/__tests__/conversation-runtime-assembly.test.ts +1 -1
  44. package/src/__tests__/conversation-skill-tools.test.ts +4 -444
  45. package/src/__tests__/conversation-slash-commands.test.ts +1 -1
  46. package/src/__tests__/conversation-store.test.ts +1 -84
  47. package/src/__tests__/conversation-surface-state.test.ts +0 -16
  48. package/src/__tests__/credential-health-service.test.ts +14 -1
  49. package/src/__tests__/credential-record-retire.test.ts +1 -1
  50. package/src/__tests__/credential-record-write-through.test.ts +1 -1
  51. package/src/__tests__/credential-security-invariants.test.ts +0 -145
  52. package/src/__tests__/custom-profile-ensure.test.ts +1 -1
  53. package/src/__tests__/default-profile-catalog-fallback.test.ts +5 -15
  54. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -2
  55. package/src/__tests__/dictation-profile-store.test.ts +6 -6
  56. package/src/__tests__/disk-usage.test.ts +28 -164
  57. package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -1
  58. package/src/__tests__/embedding-cloud-proxy-selection.test.ts +1 -1
  59. package/src/__tests__/emit-event-signal.test.ts +1 -1
  60. package/src/__tests__/gateway-client-cloud-outbound.test.ts +3 -3
  61. package/src/__tests__/gateway-only-enforcement.test.ts +1 -1
  62. package/src/__tests__/guardian-dispatch.test.ts +0 -13
  63. package/src/__tests__/helpers/seed-app.ts +1 -1
  64. package/src/__tests__/host-cu-routes-targeted.test.ts +1 -1
  65. package/src/__tests__/host-shell-tool.test.ts +1 -1
  66. package/src/__tests__/identity-routes.test.ts +1 -1
  67. package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
  68. package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
  69. package/src/__tests__/injector-chain.test.ts +1 -1
  70. package/src/__tests__/injector-config-quarantine-notice.test.ts +1 -1
  71. package/src/__tests__/injector-config-validation-reset-notice.test.ts +1 -1
  72. package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
  73. package/src/__tests__/{platform.test.ts → layout.test.ts} +1 -1
  74. package/src/__tests__/list-all-apps.test.ts +1 -1
  75. package/src/__tests__/live-workspace-guard.test.ts +2 -2
  76. package/src/__tests__/llm-resolver-override-or-default.test.ts +5 -6
  77. package/src/__tests__/llm-resolver.test.ts +7 -7
  78. package/src/__tests__/llm-schema-fallback-profile.test.ts +9 -10
  79. package/src/__tests__/llm-usage-store.test.ts +0 -495
  80. package/src/__tests__/log-export-routes.test.ts +1 -1
  81. package/src/__tests__/mcp-config-secret-boundary.test.ts +12 -53
  82. package/src/__tests__/mcp-list-plugin-servers.test.ts +1 -1
  83. package/src/__tests__/memory-config-file-parity.test.ts +1 -1
  84. package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
  85. package/src/__tests__/messages-read-boundary-guard.test.ts +0 -2
  86. package/src/__tests__/notification-guardian-path.test.ts +0 -7
  87. package/src/__tests__/onboarding-persona-write.test.ts +1 -1
  88. package/src/__tests__/openai-provider.test.ts +8 -8
  89. package/src/__tests__/path-policy.test.ts +1 -1
  90. package/src/__tests__/persona-resolver.test.ts +1 -1
  91. package/src/__tests__/plugin-app-serve-routes.test.ts +1 -1
  92. package/src/__tests__/plugin-effective-enabled-set.test.ts +1 -1
  93. package/src/__tests__/plugin-import-boundary-guard.test.ts +4 -6
  94. package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -3
  95. package/src/__tests__/provider-cloud-proxy-integration.test.ts +1 -5
  96. package/src/__tests__/provider-connections-backfill.test.ts +10 -10
  97. package/src/__tests__/prune-old-conversations-job.test.ts +6 -31
  98. package/src/__tests__/resolve-app.test.ts +1 -1
  99. package/src/__tests__/run-due-schedules.test.ts +1 -1
  100. package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -53
  101. package/src/__tests__/schedule-routes.test.ts +1 -1
  102. package/src/__tests__/schedule-store.test.ts +1 -1
  103. package/src/__tests__/secret-routes-cloud-proxy.test.ts +1 -1
  104. package/src/__tests__/skill-load-plugin-scope.test.ts +1 -1
  105. package/src/__tests__/surface-completion-compaction-boundary.test.ts +1 -1
  106. package/src/__tests__/tool-approval-handler.test.ts +1 -1
  107. package/src/__tests__/tool-audit.test.ts +5 -235
  108. package/src/__tests__/tool-executor-lifecycle-events.test.ts +54 -114
  109. package/src/__tests__/tools-get-route.test.ts +1 -1
  110. package/src/__tests__/turn-outcome-read.test.ts +1 -1
  111. package/src/__tests__/twilio-routes.test.ts +0 -1
  112. package/src/__tests__/usage-attribution.test.ts +0 -31
  113. package/src/__tests__/verification-control-plane-policy.test.ts +3 -10
  114. package/src/__tests__/visible-app-context.test.ts +1 -1
  115. package/src/__tests__/voice-ingress-preflight.test.ts +1 -1
  116. package/src/__tests__/workspace-git-service.test.ts +1 -1
  117. package/src/__tests__/workspace-greetings.test.ts +1 -1
  118. package/src/acp/__tests__/helpers/acp-config-stub.ts +1 -1
  119. package/src/activation/progress-store.ts +1 -1
  120. package/src/activation/turn-hooks.ts +1 -1
  121. package/src/agent/loop.ts +0 -51
  122. package/src/apps/app-store.ts +1 -1
  123. package/src/avatar/__tests__/avatar-store.test.ts +2 -172
  124. package/src/avatar/accent-backfill.ts +1 -1
  125. package/src/avatar/avatar-manifest.ts +1 -1
  126. package/src/avatar/avatar-store.ts +10 -69
  127. package/src/avatar/ensure-raster.ts +1 -1
  128. package/src/avatar/identity-avatar.ts +1 -1
  129. package/src/avatar/sync-avatar.ts +1 -1
  130. package/src/avatar/traits-png-sync.ts +1 -1
  131. package/src/bundler/compiler-tools.ts +1 -1
  132. package/src/bundler/package-resolver.ts +1 -1
  133. package/src/calls/__tests__/call-controller.test.ts +25 -27
  134. package/src/calls/active-call-lease.ts +1 -1
  135. package/src/calls/call-controller.ts +3 -3
  136. package/src/calls/call-domain.ts +4 -8
  137. package/src/calls/call-store.ts +2 -76
  138. package/src/calls/resolve-call-tts-provider.ts +3 -3
  139. package/src/calls/twilio-config.ts +3 -3
  140. package/src/calls/twilio-rest.ts +2 -2
  141. package/src/calls/voice-ingress-preflight.ts +2 -2
  142. package/src/cli/bundled-modules.ts +0 -2
  143. package/src/cli/commands/__tests__/apps.test.ts +1 -1
  144. package/src/cli/commands/__tests__/plugins.test.ts +9 -66
  145. package/src/cli/commands/__tests__/ps.test.ts +67 -0
  146. package/src/cli/commands/auth.help.ts +2 -2
  147. package/src/cli/commands/avatar.ts +1 -1
  148. package/src/cli/commands/changelog.ts +1 -1
  149. package/src/cli/commands/cloud/__tests__/subscription.test.ts +2 -2
  150. package/src/cli/commands/cloud/index.help.ts +1 -1
  151. package/src/cli/commands/cloud/index.ts +2 -2
  152. package/src/cli/commands/db/refresh.ts +1 -1
  153. package/src/cli/commands/db/repair-step-conversation-backfill.ts +1 -1
  154. package/src/cli/commands/db/repair.ts +1 -1
  155. package/src/cli/commands/db/status.ts +1 -1
  156. package/src/cli/commands/inference-profiles.ts +1 -12
  157. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +1 -116
  158. package/src/cli/commands/memory/index.help.ts +1 -43
  159. package/src/cli/commands/memory/memory-v3.ts +0 -64
  160. package/src/cli/commands/plugins.ts +54 -205
  161. package/src/cli/commands/ps.ts +5 -2
  162. package/src/cli/commands/status.ts +1 -1
  163. package/src/cli/index.help.ts +0 -2
  164. package/src/cli/lib/__tests__/inspect-plugin.test.ts +36 -66
  165. package/src/cli/lib/__tests__/install-from-cloud.test.ts +1 -1
  166. package/src/cli/lib/__tests__/install-from-github.test.ts +41 -117
  167. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +2 -185
  168. package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +36 -66
  169. package/src/cli/lib/__tests__/plugin-catalog-visibility.test.ts +4 -6
  170. package/src/cli/lib/__tests__/plugin-details.test.ts +113 -96
  171. package/src/cli/lib/__tests__/search-plugins.test.ts +9 -16
  172. package/src/cli/lib/__tests__/uninstall-plugin.test.ts +1 -1
  173. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +38 -15
  174. package/src/cli/lib/diff-plugin.ts +1 -1
  175. package/src/cli/lib/inspect-plugin.ts +13 -97
  176. package/src/cli/lib/install-from-cloud.ts +1 -1
  177. package/src/cli/lib/install-from-github.ts +75 -154
  178. package/src/cli/lib/install-plugin-dependencies.ts +1 -1
  179. package/src/cli/lib/list-installed-plugins.ts +1 -1
  180. package/src/cli/lib/open-browser.ts +1 -1
  181. package/src/cli/lib/plugin-catalog-cache.ts +8 -51
  182. package/src/cli/lib/plugin-catalog-resolve.ts +3 -22
  183. package/src/cli/lib/plugin-details.ts +5 -27
  184. package/src/cli/lib/plugin-marketplace.ts +18 -266
  185. package/src/cli/lib/search-plugins.ts +23 -43
  186. package/src/cli/lib/toggle-plugin.ts +1 -1
  187. package/src/cli/lib/uninstall-plugin.ts +1 -1
  188. package/src/cli/lib/upgrade-plugin.ts +3 -49
  189. package/src/cli/program.ts +1 -3
  190. package/src/cli.ts +1 -1
  191. package/src/cloud/client.ts +0 -6
  192. package/src/cloud/consent-cache.test.ts +22 -201
  193. package/src/cloud/consent-cache.ts +16 -111
  194. package/src/cloud/sync-identity.ts +1 -1
  195. package/src/config/__tests__/chat-settings.test.ts +1 -1
  196. package/src/config/__tests__/cloud-identity.test.ts +15 -2
  197. package/src/config/__tests__/default-plugin-skill-discovery.test.ts +1 -1
  198. package/src/config/__tests__/default-profile-catalog.test.ts +12 -51
  199. package/src/config/__tests__/deployment-context-defaults.test.ts +13 -13
  200. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +4 -4
  201. package/src/config/__tests__/loader-last-known-good.test.ts +9 -9
  202. package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +7 -7
  203. package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +1 -1
  204. package/src/config/__tests__/profile-materialization.test.ts +2 -4
  205. package/src/config/__tests__/sync-gated-profiles.test.ts +1 -106
  206. package/src/config/acp-agent-write.ts +1 -1
  207. package/src/config/bundled-skills/settings/tools/open-system-settings.test.ts +1 -1
  208. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
  209. package/src/config/call-site-defaults.ts +0 -6
  210. package/src/config/cloud-identity.ts +12 -5
  211. package/src/config/composer-preferences.ts +1 -1
  212. package/src/config/default-profile-catalog.ts +8 -75
  213. package/src/config/default-profile-names.ts +2 -25
  214. package/src/config/env-registry.ts +1 -14
  215. package/src/config/env.ts +8 -6
  216. package/src/config/llm-resolver.ts +1 -2
  217. package/src/config/loader.ts +13 -17
  218. package/src/config/profile-materialization.ts +1 -1
  219. package/src/config/schema.ts +1 -7
  220. package/src/config/schemas/call-site-catalog.ts +0 -7
  221. package/src/config/schemas/llm.ts +22 -27
  222. package/src/config/seed-inference-profiles.ts +16 -17
  223. package/src/config/skills.ts +2 -2
  224. package/src/config/sync-gated-profiles.ts +6 -24
  225. package/src/credential-health/credential-health-service.ts +10 -3
  226. package/src/daemon/approval-generators.ts +3 -3
  227. package/src/daemon/config-watcher.ts +2 -2
  228. package/src/daemon/conversation-agent-loop-handlers.ts +0 -18
  229. package/src/daemon/conversation-agent-loop.ts +6 -97
  230. package/src/daemon/conversation-process.ts +1 -1
  231. package/src/daemon/conversation-skill-tools.ts +4 -72
  232. package/src/daemon/conversation-store.ts +1 -1
  233. package/src/daemon/conversation-surface-state.ts +0 -33
  234. package/src/daemon/conversation-surfaces.ts +1 -86
  235. package/src/daemon/conversation-tool-setup.test.ts +1 -1
  236. package/src/daemon/conversation-tool-setup.ts +0 -23
  237. package/src/daemon/conversation.ts +3 -5
  238. package/src/daemon/daemon-control.ts +3 -3
  239. package/src/daemon/dictation-profile-store.ts +3 -3
  240. package/src/daemon/event-loop-watchdog.test.ts +2 -198
  241. package/src/daemon/event-loop-watchdog.ts +0 -185
  242. package/src/daemon/external-plugins-bootstrap.ts +1 -1
  243. package/src/daemon/first-greeting.ts +1 -1
  244. package/src/daemon/handlers/skills.ts +1 -1
  245. package/src/daemon/host-app-control-proxy.ts +1 -1
  246. package/src/daemon/host-cu-proxy.ts +2 -2
  247. package/src/daemon/identity-helpers.ts +1 -1
  248. package/src/daemon/lifecycle.ts +11 -15
  249. package/src/daemon/main.ts +1 -1
  250. package/src/daemon/now-scratchpad.ts +1 -1
  251. package/src/daemon/process-message.ts +4 -4
  252. package/src/daemon/profiler-run-store.ts +2 -2
  253. package/src/daemon/providers-setup.ts +2 -2
  254. package/src/daemon/shutdown-handlers.ts +0 -10
  255. package/src/daemon/sqlite-corruption-watchdog.test.ts +2 -142
  256. package/src/daemon/sqlite-corruption-watchdog.ts +17 -81
  257. package/src/daemon/tool-side-effects.ts +1 -1
  258. package/src/desktop/desktop-session-manager.ts +1 -1
  259. package/src/desktop/desktop-wallpaper-renderer.ts +1 -1
  260. package/src/heartbeat/heartbeat-service.ts +1 -1
  261. package/src/home/feed-writer.ts +1 -1
  262. package/src/home/home-greeting-cache.ts +1 -1
  263. package/src/home/relationship-state-writer.ts +2 -2
  264. package/src/hooks/__tests__/hook-live-reload.test.ts +1 -1
  265. package/src/hooks/hook-loader.ts +2 -2
  266. package/src/inbound/__tests__/oauth-callback-url.test.ts +2 -2
  267. package/src/inbound/oauth-callback-url.ts +3 -3
  268. package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
  269. package/src/ipc/socket-path.ts +1 -1
  270. package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
  271. package/src/live-voice/__tests__/live-voice-vad.test.ts +1 -1
  272. package/src/live-voice/live-voice-session.ts +3 -66
  273. package/src/mcp/__tests__/effective-config.test.ts +1 -1
  274. package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +2 -2
  275. package/src/mcp/__tests__/mcp-oauth-provider.test.ts +2 -3
  276. package/src/mcp/__tests__/reload-signal-emission.test.ts +1 -1
  277. package/src/mcp/__tests__/reload-signal.test.ts +1 -1
  278. package/src/mcp/__tests__/workspace-mcp-config.test.ts +19 -21
  279. package/src/mcp/reload-signal.ts +1 -1
  280. package/src/mcp/workspace-mcp-config.ts +1 -23
  281. package/src/messaging/draft-store.ts +1 -1
  282. package/src/monitoring/__tests__/active-conversations.test.ts +1 -1
  283. package/src/monitoring/__tests__/page-cache.test.ts +1 -1
  284. package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
  285. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +1 -1
  286. package/src/monitoring/active-conversations.ts +1 -1
  287. package/src/monitoring/control.ts +1 -1
  288. package/src/monitoring/daemon-boot-time.ts +1 -1
  289. package/src/monitoring/daemon-heartbeat.ts +1 -1
  290. package/src/monitoring/page-cache.ts +1 -1
  291. package/src/monitoring/plugin-auto-update.ts +1 -7
  292. package/src/monitoring/plugin-source-watch.ts +1 -1
  293. package/src/monitoring/recovery/db.ts +1 -1
  294. package/src/monitoring/recovery/inflight-content.ts +1 -1
  295. package/src/monitoring/resource-sampler.ts +3 -14
  296. package/src/monitoring/stall-capture.ts +1 -1
  297. package/src/monitoring/worker.ts +9 -76
  298. package/src/monitoring/workspace-git-heartbeat.ts +1 -1
  299. package/src/oauth/connect-orchestrator.ts +4 -4
  300. package/src/permissions/checker.ts +1 -1
  301. package/src/permissions/workspace-policy.ts +1 -1
  302. package/src/persistence/__tests__/main-db-readonly-probe.ts +27 -52
  303. package/src/persistence/__tests__/message-content-file.test.ts +1 -1
  304. package/src/persistence/__tests__/slow-sync-log.test.ts +0 -2
  305. package/src/persistence/attachments-store.ts +1 -1
  306. package/src/persistence/conversation-crud.ts +1 -38
  307. package/src/persistence/conversation-directories.ts +1 -1
  308. package/src/persistence/conversation-types.ts +0 -8
  309. package/src/persistence/db-async-query.ts +1 -1
  310. package/src/persistence/db-connection.ts +11 -1
  311. package/src/persistence/db-init.ts +1 -1
  312. package/src/persistence/db-maintenance.ts +1 -1
  313. package/src/persistence/embeddings/__tests__/embedding-local-lifecycle.test.ts +1 -1
  314. package/src/persistence/embeddings/embedding-local.ts +4 -4
  315. package/src/persistence/embeddings/embedding-runtime-manager.ts +1 -1
  316. package/src/persistence/embeddings/qdrant-client.ts +1 -1
  317. package/src/persistence/embeddings/qdrant-manager.ts +1 -1
  318. package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +1 -1
  319. package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +1 -1
  320. package/src/persistence/job-handlers/cleanup.ts +8 -17
  321. package/src/persistence/llm-usage-store.ts +2 -229
  322. package/src/persistence/message-content-file.ts +1 -1
  323. package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +1 -1
  324. package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +1 -1
  325. package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
  326. package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
  327. package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.test.ts +13 -0
  328. package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.test.ts +13 -0
  329. package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.test.ts +13 -0
  330. package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.test.ts +13 -0
  331. package/src/persistence/migrations/333-create-telemetry-events-table.test.ts +7 -4
  332. package/src/persistence/migrations/334-backfill-telemetry-events-outbox.test.ts +13 -0
  333. package/src/persistence/migrations/387-drop-telemetry-tables.ts +51 -0
  334. package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +9 -1
  335. package/src/persistence/migrations/__tests__/387-drop-telemetry-tables.test.ts +79 -0
  336. package/src/persistence/migrations/helpers/relocation.ts +1 -1
  337. package/src/persistence/migrations/run-migrations.ts +1 -1
  338. package/src/persistence/migrations/validate-migration-state.ts +1 -1
  339. package/src/persistence/raw-query.ts +1 -29
  340. package/src/persistence/slow-sync-log.ts +0 -23
  341. package/src/persistence/steps.ts +2 -0
  342. package/src/{telemetry → persistence}/tool-audit.ts +6 -121
  343. package/src/plugin-api/index.ts +1 -1
  344. package/src/plugin-api/plugin-name-env.ts +1 -1
  345. package/src/plugins/__tests__/installed-plugin-dirs.test.ts +1 -1
  346. package/src/plugins/collect-source-versions.ts +1 -1
  347. package/src/plugins/defaults/channel/package.json +1 -1
  348. package/src/plugins/defaults/cloud-hosted/package.json +1 -1
  349. package/src/plugins/defaults/compaction/package.json +1 -1
  350. package/src/plugins/defaults/documents/package.json +1 -1
  351. package/src/plugins/defaults/empty-response/package.json +1 -1
  352. package/src/plugins/defaults/exploration-drift/package.json +1 -1
  353. package/src/plugins/defaults/image-fallback/package.json +1 -1
  354. package/src/plugins/defaults/image-recovery/package.json +1 -1
  355. package/src/plugins/defaults/max-tokens-continue/package.json +1 -1
  356. package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +1 -1
  357. package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +1 -1
  358. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +0 -82
  359. package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +0 -41
  360. package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -2
  361. package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -52
  362. package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +0 -18
  363. package/src/plugins/defaults/memory/package.json +1 -1
  364. package/src/plugins/defaults/memory/paths.ts +4 -4
  365. package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
  366. package/src/plugins/defaults/memory/src/memory-v2-routes.ts +5 -5
  367. package/src/plugins/defaults/memory/src/memory-v3-routes.ts +0 -207
  368. package/src/plugins/defaults/memory/src/memory-worker-routes.ts +1 -1
  369. package/src/plugins/defaults/memory/startup.ts +1 -22
  370. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +2 -253
  371. package/src/plugins/defaults/memory/v3/orchestrate.ts +5 -129
  372. package/src/plugins/defaults/memory/worker-control.ts +1 -1
  373. package/src/plugins/defaults/memory/worker.ts +2 -2
  374. package/src/plugins/defaults/session/package.json +1 -1
  375. package/src/plugins/defaults/surface-completion-nudge/package.json +1 -1
  376. package/src/plugins/defaults/task-progress/package.json +1 -1
  377. package/src/plugins/defaults/task-progress-nudge/package.json +1 -1
  378. package/src/plugins/defaults/title-generate/package.json +1 -1
  379. package/src/plugins/defaults/tool-error/package.json +1 -1
  380. package/src/plugins/defaults/tool-result-truncate/package.json +1 -1
  381. package/src/plugins/defaults/turn-context/package.json +1 -1
  382. package/src/plugins/defaults/workspace/injectors.ts +1 -1
  383. package/src/plugins/defaults/workspace/package.json +1 -1
  384. package/src/plugins/disabled-state.ts +1 -1
  385. package/src/plugins/ensure-plugin-api-shim.ts +1 -1
  386. package/src/plugins/ensure-shared-dep-links.ts +1 -1
  387. package/src/plugins/installed-plugin-dirs.ts +1 -1
  388. package/src/plugins/mcp-servers.ts +7 -9
  389. package/src/plugins/mtime-cache.ts +2 -2
  390. package/src/plugins/source-versions.ts +1 -1
  391. package/src/prompts/bootstrap-cleanup.ts +1 -1
  392. package/src/prompts/persona-resolver.ts +1 -1
  393. package/src/prompts/sections.ts +2 -2
  394. package/src/prompts/system-prompt.ts +10 -42
  395. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +0 -37
  396. package/src/providers/__tests__/cadet-connection-routing.test.ts +2 -2
  397. package/src/providers/cadet/client.ts +1 -1
  398. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -1
  399. package/src/providers/inference/adapter-factory.ts +1 -1
  400. package/src/providers/inference/backfill.ts +3 -10
  401. package/src/providers/inference/profile-probe.ts +1 -1
  402. package/src/providers/retry.ts +0 -2
  403. package/src/providers/types.ts +0 -7
  404. package/src/providers/usage-tracking.ts +1 -1
  405. package/src/routes/__tests__/route-host.test.ts +1 -1
  406. package/src/routes/control.ts +1 -1
  407. package/src/routes/route-host-client.ts +1 -1
  408. package/src/routes/worker.ts +2 -2
  409. package/src/runtime/agent-wake.ts +1 -1
  410. package/src/runtime/assistant-stream-state.ts +1 -1
  411. package/src/runtime/auth/token-service.ts +1 -1
  412. package/src/runtime/background-job-runner.ts +1 -1
  413. package/src/runtime/middleware/twilio-validation.ts +2 -2
  414. package/src/runtime/routes/__tests__/app-pin-routes.test.ts +1 -1
  415. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +1 -1
  416. package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +3 -33
  417. package/src/runtime/routes/__tests__/cloud-credits-routes.test.ts +5 -4
  418. package/src/runtime/routes/__tests__/cloud-invoice-routes.test.ts +4 -3
  419. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +59 -287
  420. package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +1 -1
  421. package/src/runtime/routes/__tests__/deprecated-route-context.test.ts +15 -62
  422. package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +105 -12
  423. package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
  424. package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
  425. package/src/runtime/routes/__tests__/plugins-routes.test.ts +47 -211
  426. package/src/runtime/routes/__tests__/route-host-worker-routes.test.ts +1 -1
  427. package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +1 -1
  428. package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +1 -1
  429. package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +1 -1
  430. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -1
  431. package/src/runtime/routes/__tests__/user-routes-cli.test.ts +1 -1
  432. package/src/runtime/routes/__tests__/user-routes-notices.test.ts +1 -1
  433. package/src/runtime/routes/__tests__/user-routes-request.test.ts +1 -1
  434. package/src/runtime/routes/app-management-routes.ts +1 -1
  435. package/src/runtime/routes/attachment-routes.ts +1 -1
  436. package/src/runtime/routes/audit-routes.ts +1 -1
  437. package/src/runtime/routes/avatar-routes.ts +3 -10
  438. package/src/runtime/routes/cloud-routes.ts +3 -3
  439. package/src/runtime/routes/content-source-routes.ts +1 -1
  440. package/src/runtime/routes/conversation-query-routes.ts +60 -621
  441. package/src/runtime/routes/conversation-routes.ts +1 -38
  442. package/src/runtime/routes/debug-routes.ts +1 -1
  443. package/src/runtime/routes/deprecated-route-context.ts +5 -61
  444. package/src/runtime/routes/heartbeat-routes.ts +1 -1
  445. package/src/runtime/routes/identity-routes.ts +1 -1
  446. package/src/runtime/routes/index.ts +0 -6
  447. package/src/runtime/routes/inference-profile-session-handler.ts +3 -3
  448. package/src/runtime/routes/inference-profiles-routes.ts +48 -21
  449. package/src/runtime/routes/inference-provider-connection-routes.ts +0 -1
  450. package/src/runtime/routes/llm-call-sites-routes.ts +3 -3
  451. package/src/runtime/routes/log-export/__tests__/installed-inventory.test.ts +1 -1
  452. package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
  453. package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +1 -1
  454. package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
  455. package/src/runtime/routes/log-export-routes.ts +17 -15
  456. package/src/runtime/routes/migration-rollback-routes.ts +1 -1
  457. package/src/runtime/routes/migration-routes.ts +2 -3
  458. package/src/runtime/routes/monitoring-routes.ts +2 -2
  459. package/src/runtime/routes/oauth-providers.ts +5 -5
  460. package/src/runtime/routes/plugins-routes.ts +38 -163
  461. package/src/runtime/routes/profiler-routes.ts +1 -1
  462. package/src/runtime/routes/route-host-worker-routes.ts +1 -1
  463. package/src/runtime/routes/sanity-routes.ts +1 -1
  464. package/src/runtime/routes/schedule-routes.ts +1 -1
  465. package/src/runtime/routes/schedule-worker-routes.ts +1 -1
  466. package/src/runtime/routes/settings-routes.ts +1 -1
  467. package/src/runtime/routes/sounds-config-routes.ts +1 -1
  468. package/src/runtime/routes/surface-conversation-resolver.ts +1 -7
  469. package/src/runtime/routes/user-route-dispatcher.ts +1 -3
  470. package/src/runtime/routes/user-route-import.ts +1 -1
  471. package/src/runtime/routes/user-route-resolution.ts +1 -1
  472. package/src/runtime/routes/user-routes-cli.ts +1 -1
  473. package/src/runtime/routes/workspace-commit-routes.ts +1 -1
  474. package/src/runtime/routes/workspace-greetings.ts +1 -1
  475. package/src/runtime/routes/workspace-routes.ts +1 -1
  476. package/src/runtime/routes/workspace-utils.ts +1 -1
  477. package/src/runtime/sync/resource-sync-events.ts +1 -1
  478. package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +1 -1
  479. package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1 -1
  480. package/src/schedule/plugin-schedule-availability.ts +1 -1
  481. package/src/schedule/plugin-schedule-declarations.ts +1 -1
  482. package/src/schedule/run-script.ts +1 -1
  483. package/src/schedule/scheduler.ts +1 -11
  484. package/src/schedule/worker-control.ts +1 -1
  485. package/src/schedule/worker.ts +3 -3
  486. package/src/security/oauth2.ts +2 -2
  487. package/src/security/secret-allowlist.ts +1 -1
  488. package/src/signals/cancel.ts +1 -1
  489. package/src/signals/conversation-undo.ts +1 -1
  490. package/src/signals/emit-event.ts +1 -1
  491. package/src/signals/event-stream.ts +1 -1
  492. package/src/signals/user-message.ts +1 -1
  493. package/src/skills/catalog-install.ts +2 -1
  494. package/src/skills/clawhub.ts +1 -1
  495. package/src/skills/cloud-store.ts +1 -1
  496. package/src/skills/path-classifier.ts +1 -1
  497. package/src/skills/skill-history.ts +1 -1
  498. package/src/skills/skillssh-registry.ts +1 -1
  499. package/src/skills/uninstall.ts +1 -1
  500. package/src/skills/workspace-skill-md-signature.ts +1 -1
  501. package/src/subagent/manager.ts +1 -1
  502. package/src/theme/workspace-theme.ts +1 -1
  503. package/src/tools/browser/auth-cache.ts +1 -1
  504. package/src/tools/browser/browser-manager.ts +1 -1
  505. package/src/tools/browser/runtime-check.ts +1 -1
  506. package/src/tools/executor.ts +4 -4
  507. package/src/tools/filesystem/write.ts +1 -1
  508. package/src/tools/permission-checker.ts +2 -51
  509. package/src/tools/run-standalone.ts +1 -1
  510. package/src/tools/skills/format-input-schema.ts +1 -1
  511. package/src/tools/skills/load.ts +1 -1
  512. package/src/tools/skills/scaffold-cloud.ts +0 -32
  513. package/src/tools/terminal/safe-env.ts +1 -2
  514. package/src/tools/terminal/sanitized-bash.ts +1 -1
  515. package/src/tools/terminal/shell.ts +1 -1
  516. package/src/tools/tool-approval-handler.ts +4 -1
  517. package/src/tools/workflows/manage-workflows.ts +2 -2
  518. package/src/tools/workflows/run-workflow.test.ts +1 -1
  519. package/src/tools/workspace-tools/loader.ts +1 -1
  520. package/src/tts/synthesis-stream.ts +2 -2
  521. package/src/usage/attribution.ts +1 -11
  522. package/src/util/browser.ts +1 -1
  523. package/src/util/bun-runtime.ts +2 -1
  524. package/src/util/device-id.ts +1 -1
  525. package/src/util/disk-usage.ts +4 -139
  526. package/src/util/layout.ts +3 -3
  527. package/src/util/logger.ts +1 -1
  528. package/src/util/logs-db-path.ts +1 -1
  529. package/src/util/memory-db-path.ts +1 -1
  530. package/src/util/{platform.ts → os.ts} +5 -30
  531. package/src/util/process-tree.ts +19 -0
  532. package/src/util/sqlite3-runtime.ts +1 -1
  533. package/src/util/telemetry-db-path.ts +1 -1
  534. package/src/watcher/__tests__/engine.test.ts +0 -23
  535. package/src/watcher/engine.ts +0 -7
  536. package/src/windows-compiled-cli.ts +0 -4
  537. package/src/windows-compiled-worker-entry.ts +0 -6
  538. package/src/workflows/leaf-runner.test.ts +1 -1
  539. package/src/workflows/leaf-runner.ts +1 -1
  540. package/src/workflows/library.ts +1 -1
  541. package/src/workspace/adaptive-thinking-repair.ts +5 -24
  542. package/src/workspace/byok-default-profile-ensure.ts +24 -26
  543. package/src/workspace/custom-profile-ensure.ts +2 -2
  544. package/src/workspace/git-service.ts +1 -1
  545. package/src/workspace/hatched-date.ts +1 -1
  546. package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +2 -2
  547. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
  548. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +1 -1
  549. package/src/workspace/migrations/077-seed-memory-router-callsite.ts +1 -1
  550. package/src/workspace/migrations/registry.ts +0 -4
  551. package/src/workspace/turn-commit.ts +1 -1
  552. package/docs/activation-funnel-telemetry.md +0 -324
  553. package/scripts/bundled-plugin-packages.ts +0 -154
  554. package/scripts/generate-bundled-plugin-packages.ts +0 -29
  555. package/src/__tests__/activation-early-marking.test.ts +0 -114
  556. package/src/__tests__/auth-fallback-events-store.test.ts +0 -99
  557. package/src/__tests__/config-get-vision-flag.test.ts +0 -139
  558. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -400
  559. package/src/__tests__/internal-telemetry-routes.test.ts +0 -213
  560. package/src/__tests__/telemetry-routes.test.ts +0 -182
  561. package/src/__tests__/turn-events-store.test.ts +0 -376
  562. package/src/__tests__/ui-channel-variants.test.ts +0 -53
  563. package/src/avatar/__tests__/avatar-changed-telemetry.test.ts +0 -217
  564. package/src/avatar/avatar-changed-telemetry.ts +0 -128
  565. package/src/calls/__tests__/call-funnel-telemetry.test.ts +0 -204
  566. package/src/cli/commands/telemetry.help.ts +0 -27
  567. package/src/cli/commands/telemetry.ts +0 -83
  568. package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +0 -251
  569. package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +0 -113
  570. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +0 -384
  571. package/src/cli/lib/__tests__/plugin-pin-history.test.ts +0 -164
  572. package/src/cli/lib/__tests__/plugins-install-offline.test.ts +0 -228
  573. package/src/cli/lib/bundled-marketplace.json +0 -1575
  574. package/src/cli/lib/bundled-plugin-packages.json +0 -827
  575. package/src/cli/lib/bundled-plugin-packages.ts +0 -87
  576. package/src/cli/lib/plugin-catalog-local.ts +0 -94
  577. package/src/cli/lib/plugin-pin-history.ts +0 -276
  578. package/src/cloud/feature-gate.ts +0 -8
  579. package/src/config/__tests__/cloud-rehydration.test.ts +0 -180
  580. package/src/config/cloud-rehydration.ts +0 -35
  581. package/src/daemon/__tests__/auto-profile-router.test.ts +0 -380
  582. package/src/daemon/auto-profile-router.ts +0 -428
  583. package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +0 -391
  584. package/src/monitoring/__tests__/db-integrity-sample.test.ts +0 -113
  585. package/src/monitoring/__tests__/oom-kill-reporter.test.ts +0 -374
  586. package/src/monitoring/db-integrity-check.ts +0 -163
  587. package/src/monitoring/db-integrity-sample.ts +0 -176
  588. package/src/monitoring/oom-kill-reporter.ts +0 -469
  589. package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -158
  590. package/src/onboarding/onboarding-events-store.ts +0 -296
  591. package/src/persistence/__tests__/raw-query-telemetry.test.ts +0 -76
  592. package/src/persistence/lifecycle-events-store.test.ts +0 -134
  593. package/src/persistence/lifecycle-events-store.ts +0 -110
  594. package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +0 -76
  595. package/src/plugins/defaults/memory/activation-session-store.ts +0 -50
  596. package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +0 -281
  597. package/src/runtime/routes/auto-profile-routes.ts +0 -83
  598. package/src/runtime/routes/internal-telemetry-routes.ts +0 -142
  599. package/src/runtime/routes/telemetry-routes.ts +0 -274
  600. package/src/security/auth-fallback-events-store.ts +0 -57
  601. package/src/telemetry/__tests__/activation-funnel.test.ts +0 -95
  602. package/src/telemetry/__tests__/config-setting-events-store.test.ts +0 -63
  603. package/src/telemetry/__tests__/config-setting-snapshot.test.ts +0 -143
  604. package/src/telemetry/__tests__/flush-checkpoints.test.ts +0 -56
  605. package/src/telemetry/__tests__/live-voice-funnel.test.ts +0 -174
  606. package/src/telemetry/__tests__/outbox-test-harness.ts +0 -85
  607. package/src/telemetry/__tests__/phone-call-funnel.test.ts +0 -72
  608. package/src/telemetry/__tests__/telemetry-event-fixtures.ts +0 -282
  609. package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -71
  610. package/src/telemetry/activation-funnel.ts +0 -172
  611. package/src/telemetry/config-setting-events-store.ts +0 -40
  612. package/src/telemetry/config-setting-snapshot.ts +0 -170
  613. package/src/telemetry/flush-checkpoints.ts +0 -70
  614. package/src/telemetry/live-voice-funnel.ts +0 -185
  615. package/src/telemetry/memory-corpus-size.test.ts +0 -120
  616. package/src/telemetry/memory-corpus-size.ts +0 -184
  617. package/src/telemetry/memory-tier-reporter.test.ts +0 -195
  618. package/src/telemetry/memory-tier-reporter.ts +0 -130
  619. package/src/telemetry/phone-call-funnel.ts +0 -144
  620. package/src/telemetry/skill-loaded-events-store.test.ts +0 -93
  621. package/src/telemetry/skill-loaded-events-store.ts +0 -39
  622. package/src/telemetry/telemetry-event-sources.test.ts +0 -223
  623. package/src/telemetry/telemetry-event-sources.ts +0 -597
  624. package/src/telemetry/telemetry-events-outbox.test.ts +0 -375
  625. package/src/telemetry/telemetry-events-outbox.ts +0 -237
  626. package/src/telemetry/telemetry-main-db.ts +0 -48
  627. package/src/telemetry/telemetry-wire-source.json +0 -4
  628. package/src/telemetry/telemetry-wire-validation.test.ts +0 -157
  629. package/src/telemetry/telemetry-wire-validation.ts +0 -162
  630. package/src/telemetry/telemetry-wire.generated.ts +0 -483
  631. package/src/telemetry/tool-executed-events-store.test.ts +0 -210
  632. package/src/telemetry/tool-executed-events-store.ts +0 -102
  633. package/src/telemetry/trace-collection-policy.test.ts +0 -28
  634. package/src/telemetry/trace-collection-policy.ts +0 -30
  635. package/src/telemetry/turn-events-store.ts +0 -216
  636. package/src/telemetry/turn-trace-store.test.ts +0 -884
  637. package/src/telemetry/turn-trace-store.ts +0 -399
  638. package/src/telemetry/types.test.ts +0 -38
  639. package/src/telemetry/types.ts +0 -780
  640. package/src/telemetry/usage-telemetry-reporter.test.ts +0 -3445
  641. package/src/telemetry/usage-telemetry-reporter.ts +0 -566
  642. package/src/telemetry/watchdog-direct-emit.test.ts +0 -112
  643. package/src/telemetry/watchdog-direct-emit.ts +0 -104
  644. package/src/telemetry/watchdog-events-store.ts +0 -31
  645. package/src/tools/ui-surface/channel-variants.ts +0 -52
  646. package/src/watcher/__tests__/telemetry.test.ts +0 -178
  647. package/src/watcher/telemetry.ts +0 -93
  648. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +0 -165
  649. package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +0 -151
  650. /package/src/{telemetry → persistence}/tool-usage-store.ts +0 -0
  651. /package/src/{telemetry → persistence}/turn-outcome.ts +0 -0
@@ -1,7 +1,6 @@
1
- import { and, asc, desc, eq, gt, or, sql } from "drizzle-orm";
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/platform.js";
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/platform.js";
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 (`initializeDb()` already ran the
6
- * step once), so the tests assert the resulting telemetry-side schema and
7
- * that re-running the step is idempotent.
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("initializeDb created the table with both indexes", () => {
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("after init, the table exists on the telemetry DB", () => {
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,5 +1,5 @@
1
+ import { getDbPath } from "../../util/layout.js";
1
2
  import { getLogger } from "../../util/logger.js";
2
- import { getDbPath } from "../../util/platform.js";
3
3
  import { type DrizzleDb, getSqliteFrom } from "../db-connection.js";
4
4
 
5
5
  const log = getLogger("db-init");
@@ -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
  *