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