@mycadet/assistant 0.12.9 → 0.12.10

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