@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
@@ -10,7 +10,6 @@ import {
10
10
  getUsageTotals,
11
11
  listRunConversationIds,
12
12
  listUsageEvents,
13
- queryUnreportedUsageEvents,
14
13
  recordUsageEvent,
15
14
  } from "../persistence/llm-usage-store.js";
16
15
  import type { PricingResult, UsageEventInput } from "../usage/types.js";
@@ -1668,497 +1667,3 @@ describe("getUsageGroupedSeries", () => {
1668
1667
  });
1669
1668
  });
1670
1669
  });
1671
-
1672
- // ---------------------------------------------------------------------------
1673
- // queryUnreportedUsageEvents tests
1674
- // ---------------------------------------------------------------------------
1675
-
1676
- describe("queryUnreportedUsageEvents", () => {
1677
- beforeEach(() => {
1678
- const db = getDb();
1679
- // Order matters: clear `llm_usage_events` (no FK), then `messages`
1680
- // (FK to conversations cascades, but be explicit), then
1681
- // `conversations`. The conversation-level metadata tests below
1682
- // depend on a clean conversations + messages slate so JOINs are
1683
- // deterministic.
1684
- db.run(`DELETE FROM llm_usage_events`);
1685
- db.run(`DELETE FROM messages`);
1686
- db.run(`DELETE FROM conversations`);
1687
- });
1688
-
1689
- test("returns events with createdAt strictly greater than afterCreatedAt in ascending order", () => {
1690
- insertEventAt(1000, { model: "model-a" });
1691
- insertEventAt(2000, { model: "model-b" });
1692
- insertEventAt(3000, { model: "model-c" });
1693
-
1694
- // afterCreatedAt = 1000 should exclude the event at exactly 1000
1695
- const events = queryUnreportedUsageEvents(1000, undefined, 100);
1696
- expect(events).toHaveLength(2);
1697
- expect(events[0].model).toBe("model-b");
1698
- expect(events[0].createdAt).toBe(2000);
1699
- expect(events[1].model).toBe("model-c");
1700
- expect(events[1].createdAt).toBe(3000);
1701
- });
1702
-
1703
- test("respects the limit parameter", () => {
1704
- insertEventAt(1000, { model: "model-a" });
1705
- insertEventAt(2000, { model: "model-b" });
1706
- insertEventAt(3000, { model: "model-c" });
1707
-
1708
- const events = queryUnreportedUsageEvents(0, undefined, 2);
1709
- expect(events).toHaveLength(2);
1710
- // Should return the earliest two due to ASC ordering
1711
- expect(events[0].model).toBe("model-a");
1712
- expect(events[1].model).toBe("model-b");
1713
- });
1714
-
1715
- test("returns attribution fields for unreported usage events", () => {
1716
- insertEventAt(1000, {
1717
- callSite: "mainAgent",
1718
- inferenceProfile: "balanced",
1719
- inferenceProfileSource: "active",
1720
- });
1721
-
1722
- const events = queryUnreportedUsageEvents(0, undefined, 100);
1723
- expect(events).toHaveLength(1);
1724
- expect(events[0].callSite).toBe("mainAgent");
1725
- expect(events[0].inferenceProfile).toBe("balanced");
1726
- expect(events[0].inferenceProfileSource).toBe("active");
1727
- });
1728
-
1729
- test("returns empty array when no events match", () => {
1730
- insertEventAt(1000, { model: "model-a" });
1731
-
1732
- const events = queryUnreportedUsageEvents(2000, undefined, 100);
1733
- expect(events).toHaveLength(0);
1734
- });
1735
-
1736
- test("returns empty array when table is empty", () => {
1737
- const events = queryUnreportedUsageEvents(0, undefined, 100);
1738
- expect(events).toHaveLength(0);
1739
- });
1740
-
1741
- // -------------------------------------------------------------------------
1742
- // Conversation-level metadata (conversationType + turnIndex).
1743
- // `conversationType` is stamped on the row at record time (so it survives
1744
- // deletion of the parent conversation before flush) with a JOIN fallback
1745
- // for pre-migration rows; `turnIndex` is JOIN-computed at telemetry-query
1746
- // time.
1747
- // -------------------------------------------------------------------------
1748
-
1749
- test("conversationType resolves from the conversations table", () => {
1750
- const db = getDb();
1751
- const now = Date.now();
1752
- db.run(
1753
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-std', 'standard', ${now}, ${now})`,
1754
- );
1755
- db.run(
1756
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-bg', 'background', ${now}, ${now})`,
1757
- );
1758
-
1759
- insertEventAt(1000, { conversationId: "conv-std" });
1760
- insertEventAt(2000, { conversationId: "conv-bg" });
1761
- insertEventAt(3000, { conversationId: null });
1762
-
1763
- const events = queryUnreportedUsageEvents(0, undefined, 100);
1764
- expect(events).toHaveLength(3);
1765
- expect(events[0].conversationType).toBe("standard");
1766
- expect(events[1].conversationType).toBe("background");
1767
- // LLM calls without a parent conversation get null — LEFT JOIN, not INNER.
1768
- expect(events[2].conversationType).toBeNull();
1769
- });
1770
-
1771
- test("conversationType is stamped on the row at record time", () => {
1772
- const db = getDb();
1773
- const now = Date.now();
1774
- db.run(
1775
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-stamp', 'background', ${now}, ${now})`,
1776
- );
1777
-
1778
- const event = recordUsageEvent(
1779
- makeInput({ conversationId: "conv-stamp" }),
1780
- pricedResult,
1781
- );
1782
-
1783
- const row = getSqlite()
1784
- .query("SELECT conversation_type FROM llm_usage_events WHERE id = ?")
1785
- .get(event.id) as { conversation_type: string | null } | null;
1786
- expect(row?.conversation_type).toBe("background");
1787
- });
1788
-
1789
- test("conversationType survives deletion of the parent conversation before flush", () => {
1790
- // Reproduces the memory-retrospective NULL-label bug: the retrospective
1791
- // runs in a `background` fork conversation whose row is GC'd once a
1792
- // newer run supersedes it (or immediately on wake failure). Usage rows
1793
- // flushed after that deletion carried a conversation_id but a null
1794
- // conversation_type, because the type was derived only via a flush-time
1795
- // JOIN. Same mechanism covers users deleting a standard conversation
1796
- // within the flush window (the mainAgent NULL case).
1797
- const db = getDb();
1798
- const now = Date.now();
1799
- db.run(
1800
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-gone', 'background', ${now}, ${now})`,
1801
- );
1802
- insertEventAt(1000, {
1803
- conversationId: "conv-gone",
1804
- callSite: "memoryRetrospective",
1805
- });
1806
-
1807
- db.run(`DELETE FROM conversations WHERE id = 'conv-gone'`);
1808
-
1809
- const events = queryUnreportedUsageEvents(0, undefined, 100);
1810
- expect(events).toHaveLength(1);
1811
- expect(events[0].conversationId).toBe("conv-gone");
1812
- expect(events[0].conversationType).toBe("background");
1813
- });
1814
-
1815
- test("conversationType falls back to the JOIN for pre-migration rows", () => {
1816
- const db = getDb();
1817
- const now = Date.now();
1818
- db.run(
1819
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-legacy', 'scheduled', ${now}, ${now})`,
1820
- );
1821
- insertEventAt(1000, { conversationId: "conv-legacy" });
1822
- // Simulate a row persisted before migration 353 stamped the column.
1823
- db.run(
1824
- `UPDATE llm_usage_events SET conversation_type = NULL WHERE conversation_id = 'conv-legacy'`,
1825
- );
1826
-
1827
- const events = queryUnreportedUsageEvents(0, undefined, 100);
1828
- expect(events).toHaveLength(1);
1829
- expect(events[0].conversationType).toBe("scheduled");
1830
- });
1831
-
1832
- test("turnIndex counts real user turns up to the LLM call's createdAt", () => {
1833
- const db = getDb();
1834
- const now = Date.now();
1835
- db.run(
1836
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-1', 'standard', ${now}, ${now})`,
1837
- );
1838
- // Two user messages in the conversation.
1839
- db.run(
1840
- `INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('m1', 'conv-1', 'user', 'hello', 1000)`,
1841
- );
1842
- db.run(
1843
- `INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('m2', 'conv-1', 'user', 'follow up', 3000)`,
1844
- );
1845
-
1846
- // Three LLM calls across the timeline:
1847
- // - mid-turn-1 (between m1 and m2)
1848
- // - exactly at m2's createdAt (still counts m2: `created_at <= e.created_at`)
1849
- // - after m2
1850
- insertEventAt(2000, { conversationId: "conv-1" });
1851
- insertEventAt(3000, { conversationId: "conv-1" });
1852
- insertEventAt(4000, { conversationId: "conv-1" });
1853
-
1854
- const events = queryUnreportedUsageEvents(0, undefined, 100);
1855
- expect(events).toHaveLength(3);
1856
- expect(events[0].turnIndex).toBe(1);
1857
- expect(events[1].turnIndex).toBe(2);
1858
- expect(events[2].turnIndex).toBe(2);
1859
- });
1860
-
1861
- test("turnIndex is null when the LLM call has no conversationId", () => {
1862
- insertEventAt(1000, { conversationId: null });
1863
-
1864
- const events = queryUnreportedUsageEvents(0, undefined, 100);
1865
- expect(events).toHaveLength(1);
1866
- expect(events[0].conversationId).toBeNull();
1867
- expect(events[0].turnIndex).toBeNull();
1868
- });
1869
-
1870
- test("turnIndex skips tool_result rows when counting", () => {
1871
- const db = getDb();
1872
- const now = Date.now();
1873
- db.run(
1874
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-tr', 'standard', ${now}, ${now})`,
1875
- );
1876
- // One real user turn, then a tool_result row (which should be
1877
- // ignored), then the LLM call. Expected turn_index = 1.
1878
- db.run(
1879
- `INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('real-1', 'conv-tr', 'user', 'real text', 1000)`,
1880
- );
1881
- db.run(
1882
- `INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('tool-1', 'conv-tr', 'user', '[{"type":"tool_result","tool_use_id":"x","content":""}]', 1500)`,
1883
- );
1884
- insertEventAt(2000, { conversationId: "conv-tr" });
1885
-
1886
- const events = queryUnreportedUsageEvents(0, undefined, 100);
1887
- expect(events).toHaveLength(1);
1888
- expect(events[0].turnIndex).toBe(1);
1889
- });
1890
-
1891
- test("turnIndex is 0 when the LLM call fires before any user message", () => {
1892
- const db = getDb();
1893
- const now = Date.now();
1894
- db.run(
1895
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-early', 'standard', ${now}, ${now})`,
1896
- );
1897
- // LLM call fires at t=1000; first user message is at t=2000.
1898
- insertEventAt(1000, { conversationId: "conv-early" });
1899
- db.run(
1900
- `INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('later', 'conv-early', 'user', 'hi', 2000)`,
1901
- );
1902
-
1903
- const events = queryUnreportedUsageEvents(0, undefined, 100);
1904
- expect(events).toHaveLength(1);
1905
- // Conversation exists but no user turn has fired yet. The CASE
1906
- // short-circuits only on null conversationId, so we get a real 0.
1907
- // Analytics can treat 0 as "pre-first-turn" if needed.
1908
- expect(events[0].turnIndex).toBe(0);
1909
- });
1910
-
1911
- // -------------------------------------------------------------------------
1912
- // Parent linkage (parentConversationId + parentTurnIndex): subagent spawns
1913
- // stamp `parent_conversation_id` on their background conversation; the
1914
- // query resolves it (with a fork-parent fallback) so the reporter can
1915
- // attribute the child's usage to the parent turn in flight at spawn.
1916
- // -------------------------------------------------------------------------
1917
-
1918
- test("parentConversationId links a subagent conversation and parentTurnIndex counts the parent turn in flight at spawn", () => {
1919
- const db = getDb();
1920
- // Parent user turns at t=1000 and t=3000; the child conversation is
1921
- // created at t=2000, i.e. while the parent's turn 1 is in flight.
1922
- db.run(
1923
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('parent-1', 'standard', 500, 500)`,
1924
- );
1925
- db.run(
1926
- `INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('p1', 'parent-1', 'user', 'first', 1000)`,
1927
- );
1928
- db.run(
1929
- `INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('p2', 'parent-1', 'user', 'second', 3000)`,
1930
- );
1931
- db.run(
1932
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at, parent_conversation_id) VALUES ('child-1', 'background', 2000, 2000, 'parent-1')`,
1933
- );
1934
- // The usage event fires after the parent's turn 2, but attribution is
1935
- // anchored to the child's creation time, not the event time.
1936
- insertEventAt(5000, { conversationId: "child-1" });
1937
-
1938
- const events = queryUnreportedUsageEvents(0, undefined, 100);
1939
- expect(events).toHaveLength(1);
1940
- expect(events[0].parentConversationId).toBe("parent-1");
1941
- expect(events[0].parentTurnIndex).toBe(1);
1942
- });
1943
-
1944
- test("parent linkage falls back to fork_parent_conversation_id (retrospective forks)", () => {
1945
- const db = getDb();
1946
- db.run(
1947
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('source-1', 'standard', 500, 500)`,
1948
- );
1949
- db.run(
1950
- `INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('s1', 'source-1', 'user', 'hello', 1000)`,
1951
- );
1952
- db.run(
1953
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at, fork_parent_conversation_id) VALUES ('retro-1', 'background', 2000, 2000, 'source-1')`,
1954
- );
1955
- insertEventAt(3000, { conversationId: "retro-1" });
1956
-
1957
- const events = queryUnreportedUsageEvents(0, undefined, 100);
1958
- expect(events).toHaveLength(1);
1959
- expect(events[0].parentConversationId).toBe("source-1");
1960
- expect(events[0].parentTurnIndex).toBe(1);
1961
- });
1962
-
1963
- test("fork parentTurnIndex anchors on the fork boundary message, not fork creation time", () => {
1964
- const db = getDb();
1965
- // Source conversation with turns at t=1000 and t=3000. The fork
1966
- // branches from the FIRST turn (boundary message s1) but is created
1967
- // at t=5000, after turn 2 exists — attribution must report turn 1.
1968
- db.run(
1969
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('source-2', 'standard', 500, 500)`,
1970
- );
1971
- db.run(
1972
- `INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('s2a', 'source-2', 'user', 'first', 1000)`,
1973
- );
1974
- db.run(
1975
- `INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('s2b', 'source-2', 'user', 'second', 3000)`,
1976
- );
1977
- db.run(
1978
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at, fork_parent_conversation_id, fork_parent_message_id) VALUES ('retro-2', 'background', 5000, 5000, 'source-2', 's2a')`,
1979
- );
1980
- insertEventAt(6000, { conversationId: "retro-2" });
1981
-
1982
- const events = queryUnreportedUsageEvents(0, undefined, 100);
1983
- expect(events).toHaveLength(1);
1984
- expect(events[0].parentConversationId).toBe("source-2");
1985
- expect(events[0].parentTurnIndex).toBe(1);
1986
- });
1987
-
1988
- test("user-initiated forks (standard type) do not inherit fork parent attribution", () => {
1989
- const db = getDb();
1990
- // A user forks a conversation: the fork stamps
1991
- // fork_parent_conversation_id but is a first-class standard
1992
- // conversation — its usage must not fold into the source turn.
1993
- db.run(
1994
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('source-3', 'standard', 500, 500)`,
1995
- );
1996
- db.run(
1997
- `INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES ('s3', 'source-3', 'user', 'hello', 1000)`,
1998
- );
1999
- db.run(
2000
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at, fork_parent_conversation_id, fork_parent_message_id) VALUES ('user-fork-1', 'standard', 2000, 2000, 'source-3', 's3')`,
2001
- );
2002
- insertEventAt(3000, { conversationId: "user-fork-1" });
2003
-
2004
- const events = queryUnreportedUsageEvents(0, undefined, 100);
2005
- expect(events).toHaveLength(1);
2006
- expect(events[0].parentConversationId).toBeNull();
2007
- expect(events[0].parentTurnIndex).toBeNull();
2008
- });
2009
-
2010
- test("parent fields are null for parentless conversations and no-conversation events", () => {
2011
- const db = getDb();
2012
- const now = Date.now();
2013
- db.run(
2014
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-solo', 'background', ${now}, ${now})`,
2015
- );
2016
- insertEventAt(1000, { conversationId: "conv-solo" });
2017
- insertEventAt(2000, { conversationId: null });
2018
-
2019
- const events = queryUnreportedUsageEvents(0, undefined, 100);
2020
- expect(events).toHaveLength(2);
2021
- expect(events[0].parentConversationId).toBeNull();
2022
- expect(events[0].parentTurnIndex).toBeNull();
2023
- expect(events[1].parentConversationId).toBeNull();
2024
- expect(events[1].parentTurnIndex).toBeNull();
2025
- });
2026
-
2027
- // -------------------------------------------------------------------------
2028
- // Delegated-work decomposition (subagentRole + subagentSpawnMode). Every
2029
- // subagent variety emits under `llm_call_site = "subagentSpawn"`, so these
2030
- // two orthogonal columns, stamped on the conversation row at spawn, are
2031
- // what make advisor consults, forks and regular spawns separable.
2032
- // -------------------------------------------------------------------------
2033
-
2034
- test("surfaces subagentRole and subagentSpawnMode from the child conversation", () => {
2035
- const db = getDb();
2036
- db.run(
2037
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at, parent_conversation_id, subagent_role, subagent_spawn_mode) VALUES ('advisor-child', 'background', 1000, 1000, 'parent-1', 'advisor', 'advisor_consult')`,
2038
- );
2039
- insertEventAt(2000, { conversationId: "advisor-child" });
2040
-
2041
- const events = queryUnreportedUsageEvents(0, undefined, 100);
2042
- expect(events).toHaveLength(1);
2043
- expect(events[0].subagentRole).toBe("advisor");
2044
- expect(events[0].subagentSpawnMode).toBe("advisor_consult");
2045
- });
2046
-
2047
- test("role and spawn mode are independent: a general subagent can be regular or forked", () => {
2048
- const db = getDb();
2049
- db.run(
2050
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at, subagent_role, subagent_spawn_mode) VALUES ('plain-child', 'background', 1000, 1000, 'general', 'regular')`,
2051
- );
2052
- db.run(
2053
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at, subagent_role, subagent_spawn_mode) VALUES ('forked-child', 'background', 1000, 1000, 'general', 'fork')`,
2054
- );
2055
- insertEventAt(2000, { conversationId: "plain-child" });
2056
- insertEventAt(3000, { conversationId: "forked-child" });
2057
-
2058
- const events = queryUnreportedUsageEvents(0, undefined, 100);
2059
- expect(events).toHaveLength(2);
2060
- expect(events[0].subagentRole).toBe("general");
2061
- expect(events[0].subagentSpawnMode).toBe("regular");
2062
- expect(events[1].subagentRole).toBe("general");
2063
- expect(events[1].subagentSpawnMode).toBe("fork");
2064
- });
2065
-
2066
- test("subagent fields are null for ordinary conversations and no-conversation events", () => {
2067
- const db = getDb();
2068
- db.run(
2069
- `INSERT INTO conversations (id, conversation_type, created_at, updated_at) VALUES ('conv-plain', 'standard', 500, 500)`,
2070
- );
2071
- insertEventAt(1000, { conversationId: "conv-plain" });
2072
- insertEventAt(2000, { conversationId: null });
2073
-
2074
- const events = queryUnreportedUsageEvents(0, undefined, 100);
2075
- expect(events).toHaveLength(2);
2076
- expect(events[0].subagentRole).toBeNull();
2077
- expect(events[0].subagentSpawnMode).toBeNull();
2078
- expect(events[1].subagentRole).toBeNull();
2079
- expect(events[1].subagentSpawnMode).toBeNull();
2080
- });
2081
-
2082
- test("surfaces llmCallCount on unreported events", () => {
2083
- insertEventAt(1000, { llmCallCount: 4 });
2084
- insertEventAt(2000, {});
2085
-
2086
- const events = queryUnreportedUsageEvents(0, undefined, 100);
2087
- expect(events).toHaveLength(2);
2088
- expect(events[0].llmCallCount).toBe(4);
2089
- // recordUsageEvent defaults llmCallCount to 1 when unset.
2090
- expect(events[1].llmCallCount).toBe(1);
2091
- });
2092
-
2093
- test("surfaces raw_usage on unreported events", () => {
2094
- // The telemetry reporter consumes `queryUnreportedUsageEvents` output
2095
- // directly and forwards it to BigQuery. If the SELECT projection
2096
- // drops the `raw_usage` column, every provider-specific detail
2097
- // (Anthropic TTL breakdown, OpenAI prompt-token details, etc.)
2098
- // vanishes silently — covered here so a refactor of the projection
2099
- // can't regress the wire shape.
2100
- const rawUsage = {
2101
- input_tokens: 1500,
2102
- output_tokens: 600,
2103
- cache_creation_input_tokens: 800,
2104
- cache_creation: {
2105
- ephemeral_5m_input_tokens: 300,
2106
- ephemeral_1h_input_tokens: 500,
2107
- },
2108
- };
2109
- insertEventAt(1000, {
2110
- cacheCreationInputTokens: 800,
2111
- rawUsage,
2112
- });
2113
-
2114
- const events = queryUnreportedUsageEvents(0, undefined, 100);
2115
- expect(events).toHaveLength(1);
2116
- expect(events[0].cacheCreationInputTokens).toBe(800);
2117
- expect(events[0].rawUsage).toEqual(rawUsage);
2118
- });
2119
- });
2120
-
2121
- // ---------------------------------------------------------------------------
2122
- // Record-time assistantVersion stamping (May 2026 telemetry honesty fix)
2123
- //
2124
- // Events buffered while the assistant is offline must remember the binary
2125
- // that was running when they were recorded, not the one that finally
2126
- // uploads them. recordUsageEvent stamps APP_VERSION at insert time and the
2127
- // query must return it so the reporter can put it on the wire.
2128
- // ---------------------------------------------------------------------------
2129
-
2130
- describe("recordUsageEvent — assistantVersion stamping", () => {
2131
- beforeEach(() => {
2132
- const db = getDb();
2133
- db.run(`DELETE FROM llm_usage_events`);
2134
- });
2135
-
2136
- test("stamps APP_VERSION on the returned event", async () => {
2137
- const { APP_VERSION } = await import("../version.js");
2138
- const event = recordUsageEvent(makeInput(), pricedResult);
2139
- expect(event.assistantVersion).toBe(APP_VERSION);
2140
- });
2141
-
2142
- test("persists assistantVersion and queryUnreportedUsageEvents returns it", async () => {
2143
- const { APP_VERSION } = await import("../version.js");
2144
- insertEventAt(1000);
2145
- const [event] = queryUnreportedUsageEvents(0, undefined, 100);
2146
- expect(event).toBeDefined();
2147
- expect(event.assistantVersion).toBe(APP_VERSION);
2148
- });
2149
-
2150
- test("legacy rows (null assistant_version column) round-trip as null", () => {
2151
- // Simulate a row that was persisted before migration 267 ran by
2152
- // inserting one through recordUsageEvent and then nulling the
2153
- // column out. This mirrors what production rows look like before
2154
- // the migration backfills `null`s; the reporter must accept them
2155
- // and let the cloud fall back to the envelope's version.
2156
- insertEventAt(1000);
2157
- const db = getDb();
2158
- db.run(`UPDATE llm_usage_events SET assistant_version = NULL`);
2159
-
2160
- const [event] = queryUnreportedUsageEvents(0, undefined, 100);
2161
- expect(event).toBeDefined();
2162
- expect(event.assistantVersion).toBeNull();
2163
- });
2164
- });
@@ -19,7 +19,7 @@ import { initializeDb } from "../persistence/db-init.js";
19
19
  import { llmUsageEvents } from "../persistence/schema/index.js";
20
20
  import { assistantEventHub } from "../runtime/assistant-event-hub.js";
21
21
  import { ROUTES } from "../runtime/routes/log-export-routes.js";
22
- import { getLogsDir } from "../util/platform.js";
22
+ import { getLogsDir } from "../util/layout.js";
23
23
 
24
24
  await initializeDb();
25
25
 
@@ -101,20 +101,13 @@ const configGetRoute = findRoute("config_get");
101
101
  const configPatchRoute = findRoute("config_patch");
102
102
  const configSetRoute = findRoute("config_set");
103
103
 
104
- function withoutWireProfiles(
105
- result: Record<string, unknown>,
106
- ): Record<string, unknown> {
107
- const { llm: _llm, ...rest } = result;
108
- return rest;
109
- }
110
-
111
104
  describe("MCP config secret boundary", () => {
112
105
  beforeEach(() => {
113
106
  seedRawConfig({});
114
107
  rmSync(mcpJsonPath(), { force: true });
115
108
  });
116
109
 
117
- test("config_get omits MCP headers from the mcp.json overlay", () => {
110
+ test("config_get serves no mcp subtree — workspace mcp.json headers never reach the config wire", () => {
118
111
  seedWorkspaceMcp({
119
112
  mcpServers: {
120
113
  remote: {
@@ -132,16 +125,10 @@ describe("MCP config secret boundary", () => {
132
125
 
133
126
  expect(JSON.stringify(result)).not.toContain("mcp-secret");
134
127
  expect(JSON.stringify(result)).not.toContain("mcp-api-secret");
135
- const mcp = result.mcp as {
136
- servers: { remote: { transport: Record<string, unknown> } };
137
- };
138
- expect(mcp.servers.remote.transport).toEqual({
139
- type: "streamable-http",
140
- url: "https://mcp.example.com",
141
- });
128
+ expect(result.mcp).toBeUndefined();
142
129
  });
143
130
 
144
- test("config_get ignores leftover config.json mcp so its headers cannot leak", () => {
131
+ test("config_get drops leftover config.json mcp so its headers cannot leak", () => {
145
132
  seedRawConfig({
146
133
  mcp: {
147
134
  servers: {
@@ -159,12 +146,10 @@ describe("MCP config secret boundary", () => {
159
146
  const result = configGetRoute.handler({}) as Record<string, unknown>;
160
147
 
161
148
  expect(JSON.stringify(result)).not.toContain("leftover-secret");
162
- expect(
163
- (result.mcp as { servers: Record<string, unknown> }).servers,
164
- ).toEqual({});
149
+ expect(result.mcp).toBeUndefined();
165
150
  });
166
151
 
167
- test("config_get preserves an MCP server named headers", () => {
152
+ test("config_get ignores workspace mcp.json even when a server is named headers", () => {
168
153
  seedWorkspaceMcp({
169
154
  mcpServers: {
170
155
  headers: {
@@ -176,19 +161,10 @@ describe("MCP config secret boundary", () => {
176
161
 
177
162
  const result = configGetRoute.handler({}) as Record<string, unknown>;
178
163
 
179
- expect(withoutWireProfiles(result).mcp).toEqual({
180
- servers: {
181
- headers: {
182
- transport: {
183
- type: "streamable-http",
184
- url: "https://mcp.example.com",
185
- },
186
- },
187
- },
188
- });
164
+ expect(result.mcp).toBeUndefined();
189
165
  });
190
166
 
191
- test("config_get preserves non-credential headers env vars", () => {
167
+ test("config_get ignores workspace mcp.json env vars (the MCP API serves them)", () => {
192
168
  seedWorkspaceMcp({
193
169
  mcpServers: {
194
170
  local: {
@@ -203,20 +179,7 @@ describe("MCP config secret boundary", () => {
203
179
 
204
180
  const result = configGetRoute.handler({}) as Record<string, unknown>;
205
181
 
206
- expect(withoutWireProfiles(result).mcp).toEqual({
207
- servers: {
208
- local: {
209
- transport: {
210
- type: "stdio",
211
- command: "npx",
212
- args: [],
213
- env: {
214
- headers: "not-a-transport-header",
215
- },
216
- },
217
- },
218
- },
219
- });
182
+ expect(result.mcp).toBeUndefined();
220
183
  });
221
184
 
222
185
  test("config_patch strips MCP transport headers so generic writes cannot persist plaintext credentials", async () => {
@@ -237,12 +200,10 @@ describe("MCP config secret boundary", () => {
237
200
  });
238
201
 
239
202
  // `mcp` is not an AssistantConfigSchema key: the write's schema parse
240
- // strips it, so the secret never reaches disk — and the response's
241
- // projected workspace view carries no such server either.
203
+ // strips it, so the secret never reaches disk — and the response
204
+ // echoes no such subtree either.
242
205
  expect(committedRaw()?.mcp).toBeUndefined();
243
- expect(
244
- (result as { mcp: { servers: Record<string, unknown> } }).mcp.servers,
245
- ).toEqual({});
206
+ expect(result).not.toHaveProperty("mcp");
246
207
  });
247
208
 
248
209
  test("config_patch strips mcp so a full-config round trip cannot write it back", async () => {
@@ -262,9 +223,7 @@ describe("MCP config secret boundary", () => {
262
223
  });
263
224
 
264
225
  expect(committedRaw()?.mcp).toBeUndefined();
265
- expect(
266
- (result as { mcp: { servers: Record<string, unknown> } }).mcp.servers,
267
- ).toEqual({});
226
+ expect(result).not.toHaveProperty("mcp");
268
227
  });
269
228
 
270
229
  test("config_set drops MCP server writes", async () => {
@@ -75,7 +75,7 @@ setWorkspaceMcp({
75
75
  },
76
76
  });
77
77
 
78
- const { getWorkspacePluginsDir } = await import("../util/platform.js");
78
+ const { getWorkspacePluginsDir } = await import("../util/layout.js");
79
79
  const { ROUTES } = await import("../runtime/routes/mcp-auth-routes.js");
80
80
 
81
81
  const listHandler = ROUTES.find(
@@ -15,7 +15,7 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
15
15
 
16
16
  import { getConfig } from "../config/loader.js";
17
17
  import { getMemoryConfig } from "../plugins/defaults/memory/config.js";
18
- import { getWorkspaceConfigPath } from "../util/platform.js";
18
+ import { getWorkspaceConfigPath } from "../util/layout.js";
19
19
 
20
20
  const configPath = getWorkspaceConfigPath();
21
21
  const savedIsPlatform = process.env.IS_CLOUD;
@@ -29,7 +29,7 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
29
29
  import { memoryInjectors } from "../plugins/defaults/memory/injectors.js";
30
30
  import type { Injector, TurnContext } from "../plugins/types.js";
31
31
  import type { Message } from "../providers/types.js";
32
- import { getWorkspacePromptPath } from "../util/platform.js";
32
+ import { getWorkspacePromptPath } from "../util/layout.js";
33
33
 
34
34
  function findInjector(name: string): Injector {
35
35
  const injector = memoryInjectors.find((i) => i.name === name);
@@ -65,8 +65,6 @@ const BASELINE: Readonly<Record<string, number>> = {
65
65
  "src/runtime/pre-first-message-gate.ts": 1,
66
66
  "src/runtime/routes/log-export-routes.ts": 1,
67
67
  "src/runtime/routes/surface-conversation-resolver.ts": 2,
68
- "src/telemetry/turn-events-store.ts": 2,
69
- "src/telemetry/turn-trace-store.ts": 2,
70
68
  "src/workspace/migrations/rebuild-conversation-disk-view.ts": 1,
71
69
  };
72
70