@mycadet/assistant 0.12.9 → 0.12.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (651) hide show
  1. package/Dockerfile +0 -8
  2. package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +1 -1
  3. package/openapi.yaml +62 -910
  4. package/package.json +3 -7
  5. package/scripts/build-test-fixtures.ts +1 -1
  6. package/scripts/generate-openapi.ts +22 -6
  7. package/scripts/postinstall.ts +4 -10
  8. package/scripts/run-tests.ts +0 -21
  9. package/src/__tests__/adaptive-thinking-repair.test.ts +19 -57
  10. package/src/__tests__/agent-loop.test.ts +0 -76
  11. package/src/__tests__/anthropic-provider.test.ts +6 -6
  12. package/src/__tests__/assert-not-live-db.ts +1 -1
  13. package/src/__tests__/assistant-id-boundary-guard.test.ts +3 -3
  14. package/src/__tests__/attachments-store-heic-normalize.test.ts +1 -1
  15. package/src/__tests__/attachments-store.test.ts +1 -1
  16. package/src/__tests__/audit-log-rotation.test.ts +1 -1
  17. package/src/__tests__/btw-routes.test.ts +1 -1
  18. package/src/__tests__/byok-default-profile-ensure.test.ts +21 -27
  19. package/src/__tests__/call-conversation-messages.test.ts +0 -5
  20. package/src/__tests__/call-recovery.test.ts +2 -7
  21. package/src/__tests__/call-routes-http.test.ts +0 -12
  22. package/src/__tests__/call-store.test.ts +2 -7
  23. package/src/__tests__/catalog-files.test.ts +7 -5
  24. package/src/__tests__/checker.test.ts +1 -1
  25. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +4 -4
  26. package/src/__tests__/cloud-client-verify-credential.test.ts +0 -4
  27. package/src/__tests__/cloud-credential-catalog-cli.test.ts +14 -14
  28. package/src/__tests__/cloud-profile-guard.test.ts +48 -401
  29. package/src/__tests__/compaction-events.test.ts +2 -2
  30. package/src/__tests__/config-loader-backfill.test.ts +74 -163
  31. package/src/__tests__/config-loader-cloud-defaults.test.ts +11 -11
  32. package/src/__tests__/config-loader-corrupt.test.ts +10 -10
  33. package/src/__tests__/config-loader-quarantine-notice.test.ts +7 -7
  34. package/src/__tests__/config-loader-validation-reset-notice.test.ts +11 -11
  35. package/src/__tests__/config-schema.test.ts +26 -27
  36. package/src/__tests__/config-set-route.test.ts +2 -6
  37. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +28 -300
  38. package/src/__tests__/conversation-agent-loop-overflow.test.ts +39 -246
  39. package/src/__tests__/conversation-agent-loop.test.ts +2 -58
  40. package/src/__tests__/conversation-clear-safety.test.ts +0 -30
  41. package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
  42. package/src/__tests__/conversation-queue.test.ts +1 -1
  43. package/src/__tests__/conversation-runtime-assembly.test.ts +1 -1
  44. package/src/__tests__/conversation-skill-tools.test.ts +4 -444
  45. package/src/__tests__/conversation-slash-commands.test.ts +1 -1
  46. package/src/__tests__/conversation-store.test.ts +1 -84
  47. package/src/__tests__/conversation-surface-state.test.ts +0 -16
  48. package/src/__tests__/credential-health-service.test.ts +14 -1
  49. package/src/__tests__/credential-record-retire.test.ts +1 -1
  50. package/src/__tests__/credential-record-write-through.test.ts +1 -1
  51. package/src/__tests__/credential-security-invariants.test.ts +0 -145
  52. package/src/__tests__/custom-profile-ensure.test.ts +1 -1
  53. package/src/__tests__/default-profile-catalog-fallback.test.ts +5 -15
  54. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -2
  55. package/src/__tests__/dictation-profile-store.test.ts +6 -6
  56. package/src/__tests__/disk-usage.test.ts +28 -164
  57. package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -1
  58. package/src/__tests__/embedding-cloud-proxy-selection.test.ts +1 -1
  59. package/src/__tests__/emit-event-signal.test.ts +1 -1
  60. package/src/__tests__/gateway-client-cloud-outbound.test.ts +3 -3
  61. package/src/__tests__/gateway-only-enforcement.test.ts +1 -1
  62. package/src/__tests__/guardian-dispatch.test.ts +0 -13
  63. package/src/__tests__/helpers/seed-app.ts +1 -1
  64. package/src/__tests__/host-cu-routes-targeted.test.ts +1 -1
  65. package/src/__tests__/host-shell-tool.test.ts +1 -1
  66. package/src/__tests__/identity-routes.test.ts +1 -1
  67. package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
  68. package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
  69. package/src/__tests__/injector-chain.test.ts +1 -1
  70. package/src/__tests__/injector-config-quarantine-notice.test.ts +1 -1
  71. package/src/__tests__/injector-config-validation-reset-notice.test.ts +1 -1
  72. package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
  73. package/src/__tests__/{platform.test.ts → layout.test.ts} +1 -1
  74. package/src/__tests__/list-all-apps.test.ts +1 -1
  75. package/src/__tests__/live-workspace-guard.test.ts +2 -2
  76. package/src/__tests__/llm-resolver-override-or-default.test.ts +5 -6
  77. package/src/__tests__/llm-resolver.test.ts +7 -7
  78. package/src/__tests__/llm-schema-fallback-profile.test.ts +9 -10
  79. package/src/__tests__/llm-usage-store.test.ts +0 -495
  80. package/src/__tests__/log-export-routes.test.ts +1 -1
  81. package/src/__tests__/mcp-config-secret-boundary.test.ts +12 -53
  82. package/src/__tests__/mcp-list-plugin-servers.test.ts +1 -1
  83. package/src/__tests__/memory-config-file-parity.test.ts +1 -1
  84. package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
  85. package/src/__tests__/messages-read-boundary-guard.test.ts +0 -2
  86. package/src/__tests__/notification-guardian-path.test.ts +0 -7
  87. package/src/__tests__/onboarding-persona-write.test.ts +1 -1
  88. package/src/__tests__/openai-provider.test.ts +8 -8
  89. package/src/__tests__/path-policy.test.ts +1 -1
  90. package/src/__tests__/persona-resolver.test.ts +1 -1
  91. package/src/__tests__/plugin-app-serve-routes.test.ts +1 -1
  92. package/src/__tests__/plugin-effective-enabled-set.test.ts +1 -1
  93. package/src/__tests__/plugin-import-boundary-guard.test.ts +4 -6
  94. package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -3
  95. package/src/__tests__/provider-cloud-proxy-integration.test.ts +1 -5
  96. package/src/__tests__/provider-connections-backfill.test.ts +10 -10
  97. package/src/__tests__/prune-old-conversations-job.test.ts +6 -31
  98. package/src/__tests__/resolve-app.test.ts +1 -1
  99. package/src/__tests__/run-due-schedules.test.ts +1 -1
  100. package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -53
  101. package/src/__tests__/schedule-routes.test.ts +1 -1
  102. package/src/__tests__/schedule-store.test.ts +1 -1
  103. package/src/__tests__/secret-routes-cloud-proxy.test.ts +1 -1
  104. package/src/__tests__/skill-load-plugin-scope.test.ts +1 -1
  105. package/src/__tests__/surface-completion-compaction-boundary.test.ts +1 -1
  106. package/src/__tests__/tool-approval-handler.test.ts +1 -1
  107. package/src/__tests__/tool-audit.test.ts +5 -235
  108. package/src/__tests__/tool-executor-lifecycle-events.test.ts +54 -114
  109. package/src/__tests__/tools-get-route.test.ts +1 -1
  110. package/src/__tests__/turn-outcome-read.test.ts +1 -1
  111. package/src/__tests__/twilio-routes.test.ts +0 -1
  112. package/src/__tests__/usage-attribution.test.ts +0 -31
  113. package/src/__tests__/verification-control-plane-policy.test.ts +3 -10
  114. package/src/__tests__/visible-app-context.test.ts +1 -1
  115. package/src/__tests__/voice-ingress-preflight.test.ts +1 -1
  116. package/src/__tests__/workspace-git-service.test.ts +1 -1
  117. package/src/__tests__/workspace-greetings.test.ts +1 -1
  118. package/src/acp/__tests__/helpers/acp-config-stub.ts +1 -1
  119. package/src/activation/progress-store.ts +1 -1
  120. package/src/activation/turn-hooks.ts +1 -1
  121. package/src/agent/loop.ts +0 -51
  122. package/src/apps/app-store.ts +1 -1
  123. package/src/avatar/__tests__/avatar-store.test.ts +2 -172
  124. package/src/avatar/accent-backfill.ts +1 -1
  125. package/src/avatar/avatar-manifest.ts +1 -1
  126. package/src/avatar/avatar-store.ts +10 -69
  127. package/src/avatar/ensure-raster.ts +1 -1
  128. package/src/avatar/identity-avatar.ts +1 -1
  129. package/src/avatar/sync-avatar.ts +1 -1
  130. package/src/avatar/traits-png-sync.ts +1 -1
  131. package/src/bundler/compiler-tools.ts +1 -1
  132. package/src/bundler/package-resolver.ts +1 -1
  133. package/src/calls/__tests__/call-controller.test.ts +25 -27
  134. package/src/calls/active-call-lease.ts +1 -1
  135. package/src/calls/call-controller.ts +3 -3
  136. package/src/calls/call-domain.ts +4 -8
  137. package/src/calls/call-store.ts +2 -76
  138. package/src/calls/resolve-call-tts-provider.ts +3 -3
  139. package/src/calls/twilio-config.ts +3 -3
  140. package/src/calls/twilio-rest.ts +2 -2
  141. package/src/calls/voice-ingress-preflight.ts +2 -2
  142. package/src/cli/bundled-modules.ts +0 -2
  143. package/src/cli/commands/__tests__/apps.test.ts +1 -1
  144. package/src/cli/commands/__tests__/plugins.test.ts +9 -66
  145. package/src/cli/commands/__tests__/ps.test.ts +67 -0
  146. package/src/cli/commands/auth.help.ts +2 -2
  147. package/src/cli/commands/avatar.ts +1 -1
  148. package/src/cli/commands/changelog.ts +1 -1
  149. package/src/cli/commands/cloud/__tests__/subscription.test.ts +2 -2
  150. package/src/cli/commands/cloud/index.help.ts +1 -1
  151. package/src/cli/commands/cloud/index.ts +2 -2
  152. package/src/cli/commands/db/refresh.ts +1 -1
  153. package/src/cli/commands/db/repair-step-conversation-backfill.ts +1 -1
  154. package/src/cli/commands/db/repair.ts +1 -1
  155. package/src/cli/commands/db/status.ts +1 -1
  156. package/src/cli/commands/inference-profiles.ts +1 -12
  157. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +1 -116
  158. package/src/cli/commands/memory/index.help.ts +1 -43
  159. package/src/cli/commands/memory/memory-v3.ts +0 -64
  160. package/src/cli/commands/plugins.ts +54 -205
  161. package/src/cli/commands/ps.ts +5 -2
  162. package/src/cli/commands/status.ts +1 -1
  163. package/src/cli/index.help.ts +0 -2
  164. package/src/cli/lib/__tests__/inspect-plugin.test.ts +36 -66
  165. package/src/cli/lib/__tests__/install-from-cloud.test.ts +1 -1
  166. package/src/cli/lib/__tests__/install-from-github.test.ts +41 -117
  167. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +2 -185
  168. package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +36 -66
  169. package/src/cli/lib/__tests__/plugin-catalog-visibility.test.ts +4 -6
  170. package/src/cli/lib/__tests__/plugin-details.test.ts +113 -96
  171. package/src/cli/lib/__tests__/search-plugins.test.ts +9 -16
  172. package/src/cli/lib/__tests__/uninstall-plugin.test.ts +1 -1
  173. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +38 -15
  174. package/src/cli/lib/diff-plugin.ts +1 -1
  175. package/src/cli/lib/inspect-plugin.ts +13 -97
  176. package/src/cli/lib/install-from-cloud.ts +1 -1
  177. package/src/cli/lib/install-from-github.ts +75 -154
  178. package/src/cli/lib/install-plugin-dependencies.ts +1 -1
  179. package/src/cli/lib/list-installed-plugins.ts +1 -1
  180. package/src/cli/lib/open-browser.ts +1 -1
  181. package/src/cli/lib/plugin-catalog-cache.ts +8 -51
  182. package/src/cli/lib/plugin-catalog-resolve.ts +3 -22
  183. package/src/cli/lib/plugin-details.ts +5 -27
  184. package/src/cli/lib/plugin-marketplace.ts +18 -266
  185. package/src/cli/lib/search-plugins.ts +23 -43
  186. package/src/cli/lib/toggle-plugin.ts +1 -1
  187. package/src/cli/lib/uninstall-plugin.ts +1 -1
  188. package/src/cli/lib/upgrade-plugin.ts +3 -49
  189. package/src/cli/program.ts +1 -3
  190. package/src/cli.ts +1 -1
  191. package/src/cloud/client.ts +0 -6
  192. package/src/cloud/consent-cache.test.ts +22 -201
  193. package/src/cloud/consent-cache.ts +16 -111
  194. package/src/cloud/sync-identity.ts +1 -1
  195. package/src/config/__tests__/chat-settings.test.ts +1 -1
  196. package/src/config/__tests__/cloud-identity.test.ts +15 -2
  197. package/src/config/__tests__/default-plugin-skill-discovery.test.ts +1 -1
  198. package/src/config/__tests__/default-profile-catalog.test.ts +12 -51
  199. package/src/config/__tests__/deployment-context-defaults.test.ts +13 -13
  200. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +4 -4
  201. package/src/config/__tests__/loader-last-known-good.test.ts +9 -9
  202. package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +7 -7
  203. package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +1 -1
  204. package/src/config/__tests__/profile-materialization.test.ts +2 -4
  205. package/src/config/__tests__/sync-gated-profiles.test.ts +1 -106
  206. package/src/config/acp-agent-write.ts +1 -1
  207. package/src/config/bundled-skills/settings/tools/open-system-settings.test.ts +1 -1
  208. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
  209. package/src/config/call-site-defaults.ts +0 -6
  210. package/src/config/cloud-identity.ts +12 -5
  211. package/src/config/composer-preferences.ts +1 -1
  212. package/src/config/default-profile-catalog.ts +8 -75
  213. package/src/config/default-profile-names.ts +2 -25
  214. package/src/config/env-registry.ts +1 -14
  215. package/src/config/env.ts +8 -6
  216. package/src/config/llm-resolver.ts +1 -2
  217. package/src/config/loader.ts +13 -17
  218. package/src/config/profile-materialization.ts +1 -1
  219. package/src/config/schema.ts +1 -7
  220. package/src/config/schemas/call-site-catalog.ts +0 -7
  221. package/src/config/schemas/llm.ts +22 -27
  222. package/src/config/seed-inference-profiles.ts +16 -17
  223. package/src/config/skills.ts +2 -2
  224. package/src/config/sync-gated-profiles.ts +6 -24
  225. package/src/credential-health/credential-health-service.ts +10 -3
  226. package/src/daemon/approval-generators.ts +3 -3
  227. package/src/daemon/config-watcher.ts +2 -2
  228. package/src/daemon/conversation-agent-loop-handlers.ts +0 -18
  229. package/src/daemon/conversation-agent-loop.ts +6 -97
  230. package/src/daemon/conversation-process.ts +1 -1
  231. package/src/daemon/conversation-skill-tools.ts +4 -72
  232. package/src/daemon/conversation-store.ts +1 -1
  233. package/src/daemon/conversation-surface-state.ts +0 -33
  234. package/src/daemon/conversation-surfaces.ts +1 -86
  235. package/src/daemon/conversation-tool-setup.test.ts +1 -1
  236. package/src/daemon/conversation-tool-setup.ts +0 -23
  237. package/src/daemon/conversation.ts +3 -5
  238. package/src/daemon/daemon-control.ts +3 -3
  239. package/src/daemon/dictation-profile-store.ts +3 -3
  240. package/src/daemon/event-loop-watchdog.test.ts +2 -198
  241. package/src/daemon/event-loop-watchdog.ts +0 -185
  242. package/src/daemon/external-plugins-bootstrap.ts +1 -1
  243. package/src/daemon/first-greeting.ts +1 -1
  244. package/src/daemon/handlers/skills.ts +1 -1
  245. package/src/daemon/host-app-control-proxy.ts +1 -1
  246. package/src/daemon/host-cu-proxy.ts +2 -2
  247. package/src/daemon/identity-helpers.ts +1 -1
  248. package/src/daemon/lifecycle.ts +11 -15
  249. package/src/daemon/main.ts +1 -1
  250. package/src/daemon/now-scratchpad.ts +1 -1
  251. package/src/daemon/process-message.ts +4 -4
  252. package/src/daemon/profiler-run-store.ts +2 -2
  253. package/src/daemon/providers-setup.ts +2 -2
  254. package/src/daemon/shutdown-handlers.ts +0 -10
  255. package/src/daemon/sqlite-corruption-watchdog.test.ts +2 -142
  256. package/src/daemon/sqlite-corruption-watchdog.ts +17 -81
  257. package/src/daemon/tool-side-effects.ts +1 -1
  258. package/src/desktop/desktop-session-manager.ts +1 -1
  259. package/src/desktop/desktop-wallpaper-renderer.ts +1 -1
  260. package/src/heartbeat/heartbeat-service.ts +1 -1
  261. package/src/home/feed-writer.ts +1 -1
  262. package/src/home/home-greeting-cache.ts +1 -1
  263. package/src/home/relationship-state-writer.ts +2 -2
  264. package/src/hooks/__tests__/hook-live-reload.test.ts +1 -1
  265. package/src/hooks/hook-loader.ts +2 -2
  266. package/src/inbound/__tests__/oauth-callback-url.test.ts +2 -2
  267. package/src/inbound/oauth-callback-url.ts +3 -3
  268. package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
  269. package/src/ipc/socket-path.ts +1 -1
  270. package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
  271. package/src/live-voice/__tests__/live-voice-vad.test.ts +1 -1
  272. package/src/live-voice/live-voice-session.ts +3 -66
  273. package/src/mcp/__tests__/effective-config.test.ts +1 -1
  274. package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +2 -2
  275. package/src/mcp/__tests__/mcp-oauth-provider.test.ts +2 -3
  276. package/src/mcp/__tests__/reload-signal-emission.test.ts +1 -1
  277. package/src/mcp/__tests__/reload-signal.test.ts +1 -1
  278. package/src/mcp/__tests__/workspace-mcp-config.test.ts +19 -21
  279. package/src/mcp/reload-signal.ts +1 -1
  280. package/src/mcp/workspace-mcp-config.ts +1 -23
  281. package/src/messaging/draft-store.ts +1 -1
  282. package/src/monitoring/__tests__/active-conversations.test.ts +1 -1
  283. package/src/monitoring/__tests__/page-cache.test.ts +1 -1
  284. package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
  285. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +1 -1
  286. package/src/monitoring/active-conversations.ts +1 -1
  287. package/src/monitoring/control.ts +1 -1
  288. package/src/monitoring/daemon-boot-time.ts +1 -1
  289. package/src/monitoring/daemon-heartbeat.ts +1 -1
  290. package/src/monitoring/page-cache.ts +1 -1
  291. package/src/monitoring/plugin-auto-update.ts +1 -7
  292. package/src/monitoring/plugin-source-watch.ts +1 -1
  293. package/src/monitoring/recovery/db.ts +1 -1
  294. package/src/monitoring/recovery/inflight-content.ts +1 -1
  295. package/src/monitoring/resource-sampler.ts +3 -14
  296. package/src/monitoring/stall-capture.ts +1 -1
  297. package/src/monitoring/worker.ts +9 -76
  298. package/src/monitoring/workspace-git-heartbeat.ts +1 -1
  299. package/src/oauth/connect-orchestrator.ts +4 -4
  300. package/src/permissions/checker.ts +1 -1
  301. package/src/permissions/workspace-policy.ts +1 -1
  302. package/src/persistence/__tests__/main-db-readonly-probe.ts +27 -52
  303. package/src/persistence/__tests__/message-content-file.test.ts +1 -1
  304. package/src/persistence/__tests__/slow-sync-log.test.ts +0 -2
  305. package/src/persistence/attachments-store.ts +1 -1
  306. package/src/persistence/conversation-crud.ts +1 -38
  307. package/src/persistence/conversation-directories.ts +1 -1
  308. package/src/persistence/conversation-types.ts +0 -8
  309. package/src/persistence/db-async-query.ts +1 -1
  310. package/src/persistence/db-connection.ts +11 -1
  311. package/src/persistence/db-init.ts +1 -1
  312. package/src/persistence/db-maintenance.ts +1 -1
  313. package/src/persistence/embeddings/__tests__/embedding-local-lifecycle.test.ts +1 -1
  314. package/src/persistence/embeddings/embedding-local.ts +4 -4
  315. package/src/persistence/embeddings/embedding-runtime-manager.ts +1 -1
  316. package/src/persistence/embeddings/qdrant-client.ts +1 -1
  317. package/src/persistence/embeddings/qdrant-manager.ts +1 -1
  318. package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +1 -1
  319. package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +1 -1
  320. package/src/persistence/job-handlers/cleanup.ts +8 -17
  321. package/src/persistence/llm-usage-store.ts +2 -229
  322. package/src/persistence/message-content-file.ts +1 -1
  323. package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +1 -1
  324. package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +1 -1
  325. package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
  326. package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
  327. package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.test.ts +13 -0
  328. package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.test.ts +13 -0
  329. package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.test.ts +13 -0
  330. package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.test.ts +13 -0
  331. package/src/persistence/migrations/333-create-telemetry-events-table.test.ts +7 -4
  332. package/src/persistence/migrations/334-backfill-telemetry-events-outbox.test.ts +13 -0
  333. package/src/persistence/migrations/387-drop-telemetry-tables.ts +51 -0
  334. package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +9 -1
  335. package/src/persistence/migrations/__tests__/387-drop-telemetry-tables.test.ts +79 -0
  336. package/src/persistence/migrations/helpers/relocation.ts +1 -1
  337. package/src/persistence/migrations/run-migrations.ts +1 -1
  338. package/src/persistence/migrations/validate-migration-state.ts +1 -1
  339. package/src/persistence/raw-query.ts +1 -29
  340. package/src/persistence/slow-sync-log.ts +0 -23
  341. package/src/persistence/steps.ts +2 -0
  342. package/src/{telemetry → persistence}/tool-audit.ts +6 -121
  343. package/src/plugin-api/index.ts +1 -1
  344. package/src/plugin-api/plugin-name-env.ts +1 -1
  345. package/src/plugins/__tests__/installed-plugin-dirs.test.ts +1 -1
  346. package/src/plugins/collect-source-versions.ts +1 -1
  347. package/src/plugins/defaults/channel/package.json +1 -1
  348. package/src/plugins/defaults/cloud-hosted/package.json +1 -1
  349. package/src/plugins/defaults/compaction/package.json +1 -1
  350. package/src/plugins/defaults/documents/package.json +1 -1
  351. package/src/plugins/defaults/empty-response/package.json +1 -1
  352. package/src/plugins/defaults/exploration-drift/package.json +1 -1
  353. package/src/plugins/defaults/image-fallback/package.json +1 -1
  354. package/src/plugins/defaults/image-recovery/package.json +1 -1
  355. package/src/plugins/defaults/max-tokens-continue/package.json +1 -1
  356. package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +1 -1
  357. package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +1 -1
  358. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +0 -82
  359. package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +0 -41
  360. package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -2
  361. package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -52
  362. package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +0 -18
  363. package/src/plugins/defaults/memory/package.json +1 -1
  364. package/src/plugins/defaults/memory/paths.ts +4 -4
  365. package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
  366. package/src/plugins/defaults/memory/src/memory-v2-routes.ts +5 -5
  367. package/src/plugins/defaults/memory/src/memory-v3-routes.ts +0 -207
  368. package/src/plugins/defaults/memory/src/memory-worker-routes.ts +1 -1
  369. package/src/plugins/defaults/memory/startup.ts +1 -22
  370. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +2 -253
  371. package/src/plugins/defaults/memory/v3/orchestrate.ts +5 -129
  372. package/src/plugins/defaults/memory/worker-control.ts +1 -1
  373. package/src/plugins/defaults/memory/worker.ts +2 -2
  374. package/src/plugins/defaults/session/package.json +1 -1
  375. package/src/plugins/defaults/surface-completion-nudge/package.json +1 -1
  376. package/src/plugins/defaults/task-progress/package.json +1 -1
  377. package/src/plugins/defaults/task-progress-nudge/package.json +1 -1
  378. package/src/plugins/defaults/title-generate/package.json +1 -1
  379. package/src/plugins/defaults/tool-error/package.json +1 -1
  380. package/src/plugins/defaults/tool-result-truncate/package.json +1 -1
  381. package/src/plugins/defaults/turn-context/package.json +1 -1
  382. package/src/plugins/defaults/workspace/injectors.ts +1 -1
  383. package/src/plugins/defaults/workspace/package.json +1 -1
  384. package/src/plugins/disabled-state.ts +1 -1
  385. package/src/plugins/ensure-plugin-api-shim.ts +1 -1
  386. package/src/plugins/ensure-shared-dep-links.ts +1 -1
  387. package/src/plugins/installed-plugin-dirs.ts +1 -1
  388. package/src/plugins/mcp-servers.ts +7 -9
  389. package/src/plugins/mtime-cache.ts +2 -2
  390. package/src/plugins/source-versions.ts +1 -1
  391. package/src/prompts/bootstrap-cleanup.ts +1 -1
  392. package/src/prompts/persona-resolver.ts +1 -1
  393. package/src/prompts/sections.ts +2 -2
  394. package/src/prompts/system-prompt.ts +10 -42
  395. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +0 -37
  396. package/src/providers/__tests__/cadet-connection-routing.test.ts +2 -2
  397. package/src/providers/cadet/client.ts +1 -1
  398. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -1
  399. package/src/providers/inference/adapter-factory.ts +1 -1
  400. package/src/providers/inference/backfill.ts +3 -10
  401. package/src/providers/inference/profile-probe.ts +1 -1
  402. package/src/providers/retry.ts +0 -2
  403. package/src/providers/types.ts +0 -7
  404. package/src/providers/usage-tracking.ts +1 -1
  405. package/src/routes/__tests__/route-host.test.ts +1 -1
  406. package/src/routes/control.ts +1 -1
  407. package/src/routes/route-host-client.ts +1 -1
  408. package/src/routes/worker.ts +2 -2
  409. package/src/runtime/agent-wake.ts +1 -1
  410. package/src/runtime/assistant-stream-state.ts +1 -1
  411. package/src/runtime/auth/token-service.ts +1 -1
  412. package/src/runtime/background-job-runner.ts +1 -1
  413. package/src/runtime/middleware/twilio-validation.ts +2 -2
  414. package/src/runtime/routes/__tests__/app-pin-routes.test.ts +1 -1
  415. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +1 -1
  416. package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +3 -33
  417. package/src/runtime/routes/__tests__/cloud-credits-routes.test.ts +5 -4
  418. package/src/runtime/routes/__tests__/cloud-invoice-routes.test.ts +4 -3
  419. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +59 -287
  420. package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +1 -1
  421. package/src/runtime/routes/__tests__/deprecated-route-context.test.ts +15 -62
  422. package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +105 -12
  423. package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
  424. package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
  425. package/src/runtime/routes/__tests__/plugins-routes.test.ts +47 -211
  426. package/src/runtime/routes/__tests__/route-host-worker-routes.test.ts +1 -1
  427. package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +1 -1
  428. package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +1 -1
  429. package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +1 -1
  430. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -1
  431. package/src/runtime/routes/__tests__/user-routes-cli.test.ts +1 -1
  432. package/src/runtime/routes/__tests__/user-routes-notices.test.ts +1 -1
  433. package/src/runtime/routes/__tests__/user-routes-request.test.ts +1 -1
  434. package/src/runtime/routes/app-management-routes.ts +1 -1
  435. package/src/runtime/routes/attachment-routes.ts +1 -1
  436. package/src/runtime/routes/audit-routes.ts +1 -1
  437. package/src/runtime/routes/avatar-routes.ts +3 -10
  438. package/src/runtime/routes/cloud-routes.ts +3 -3
  439. package/src/runtime/routes/content-source-routes.ts +1 -1
  440. package/src/runtime/routes/conversation-query-routes.ts +60 -621
  441. package/src/runtime/routes/conversation-routes.ts +1 -38
  442. package/src/runtime/routes/debug-routes.ts +1 -1
  443. package/src/runtime/routes/deprecated-route-context.ts +5 -61
  444. package/src/runtime/routes/heartbeat-routes.ts +1 -1
  445. package/src/runtime/routes/identity-routes.ts +1 -1
  446. package/src/runtime/routes/index.ts +0 -6
  447. package/src/runtime/routes/inference-profile-session-handler.ts +3 -3
  448. package/src/runtime/routes/inference-profiles-routes.ts +48 -21
  449. package/src/runtime/routes/inference-provider-connection-routes.ts +0 -1
  450. package/src/runtime/routes/llm-call-sites-routes.ts +3 -3
  451. package/src/runtime/routes/log-export/__tests__/installed-inventory.test.ts +1 -1
  452. package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
  453. package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +1 -1
  454. package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
  455. package/src/runtime/routes/log-export-routes.ts +17 -15
  456. package/src/runtime/routes/migration-rollback-routes.ts +1 -1
  457. package/src/runtime/routes/migration-routes.ts +2 -3
  458. package/src/runtime/routes/monitoring-routes.ts +2 -2
  459. package/src/runtime/routes/oauth-providers.ts +5 -5
  460. package/src/runtime/routes/plugins-routes.ts +38 -163
  461. package/src/runtime/routes/profiler-routes.ts +1 -1
  462. package/src/runtime/routes/route-host-worker-routes.ts +1 -1
  463. package/src/runtime/routes/sanity-routes.ts +1 -1
  464. package/src/runtime/routes/schedule-routes.ts +1 -1
  465. package/src/runtime/routes/schedule-worker-routes.ts +1 -1
  466. package/src/runtime/routes/settings-routes.ts +1 -1
  467. package/src/runtime/routes/sounds-config-routes.ts +1 -1
  468. package/src/runtime/routes/surface-conversation-resolver.ts +1 -7
  469. package/src/runtime/routes/user-route-dispatcher.ts +1 -3
  470. package/src/runtime/routes/user-route-import.ts +1 -1
  471. package/src/runtime/routes/user-route-resolution.ts +1 -1
  472. package/src/runtime/routes/user-routes-cli.ts +1 -1
  473. package/src/runtime/routes/workspace-commit-routes.ts +1 -1
  474. package/src/runtime/routes/workspace-greetings.ts +1 -1
  475. package/src/runtime/routes/workspace-routes.ts +1 -1
  476. package/src/runtime/routes/workspace-utils.ts +1 -1
  477. package/src/runtime/sync/resource-sync-events.ts +1 -1
  478. package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +1 -1
  479. package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1 -1
  480. package/src/schedule/plugin-schedule-availability.ts +1 -1
  481. package/src/schedule/plugin-schedule-declarations.ts +1 -1
  482. package/src/schedule/run-script.ts +1 -1
  483. package/src/schedule/scheduler.ts +1 -11
  484. package/src/schedule/worker-control.ts +1 -1
  485. package/src/schedule/worker.ts +3 -3
  486. package/src/security/oauth2.ts +2 -2
  487. package/src/security/secret-allowlist.ts +1 -1
  488. package/src/signals/cancel.ts +1 -1
  489. package/src/signals/conversation-undo.ts +1 -1
  490. package/src/signals/emit-event.ts +1 -1
  491. package/src/signals/event-stream.ts +1 -1
  492. package/src/signals/user-message.ts +1 -1
  493. package/src/skills/catalog-install.ts +2 -1
  494. package/src/skills/clawhub.ts +1 -1
  495. package/src/skills/cloud-store.ts +1 -1
  496. package/src/skills/path-classifier.ts +1 -1
  497. package/src/skills/skill-history.ts +1 -1
  498. package/src/skills/skillssh-registry.ts +1 -1
  499. package/src/skills/uninstall.ts +1 -1
  500. package/src/skills/workspace-skill-md-signature.ts +1 -1
  501. package/src/subagent/manager.ts +1 -1
  502. package/src/theme/workspace-theme.ts +1 -1
  503. package/src/tools/browser/auth-cache.ts +1 -1
  504. package/src/tools/browser/browser-manager.ts +1 -1
  505. package/src/tools/browser/runtime-check.ts +1 -1
  506. package/src/tools/executor.ts +4 -4
  507. package/src/tools/filesystem/write.ts +1 -1
  508. package/src/tools/permission-checker.ts +2 -51
  509. package/src/tools/run-standalone.ts +1 -1
  510. package/src/tools/skills/format-input-schema.ts +1 -1
  511. package/src/tools/skills/load.ts +1 -1
  512. package/src/tools/skills/scaffold-cloud.ts +0 -32
  513. package/src/tools/terminal/safe-env.ts +1 -2
  514. package/src/tools/terminal/sanitized-bash.ts +1 -1
  515. package/src/tools/terminal/shell.ts +1 -1
  516. package/src/tools/tool-approval-handler.ts +4 -1
  517. package/src/tools/workflows/manage-workflows.ts +2 -2
  518. package/src/tools/workflows/run-workflow.test.ts +1 -1
  519. package/src/tools/workspace-tools/loader.ts +1 -1
  520. package/src/tts/synthesis-stream.ts +2 -2
  521. package/src/usage/attribution.ts +1 -11
  522. package/src/util/browser.ts +1 -1
  523. package/src/util/bun-runtime.ts +2 -1
  524. package/src/util/device-id.ts +1 -1
  525. package/src/util/disk-usage.ts +4 -139
  526. package/src/util/layout.ts +3 -3
  527. package/src/util/logger.ts +1 -1
  528. package/src/util/logs-db-path.ts +1 -1
  529. package/src/util/memory-db-path.ts +1 -1
  530. package/src/util/{platform.ts → os.ts} +5 -30
  531. package/src/util/process-tree.ts +19 -0
  532. package/src/util/sqlite3-runtime.ts +1 -1
  533. package/src/util/telemetry-db-path.ts +1 -1
  534. package/src/watcher/__tests__/engine.test.ts +0 -23
  535. package/src/watcher/engine.ts +0 -7
  536. package/src/windows-compiled-cli.ts +0 -4
  537. package/src/windows-compiled-worker-entry.ts +0 -6
  538. package/src/workflows/leaf-runner.test.ts +1 -1
  539. package/src/workflows/leaf-runner.ts +1 -1
  540. package/src/workflows/library.ts +1 -1
  541. package/src/workspace/adaptive-thinking-repair.ts +5 -24
  542. package/src/workspace/byok-default-profile-ensure.ts +24 -26
  543. package/src/workspace/custom-profile-ensure.ts +2 -2
  544. package/src/workspace/git-service.ts +1 -1
  545. package/src/workspace/hatched-date.ts +1 -1
  546. package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +2 -2
  547. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
  548. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +1 -1
  549. package/src/workspace/migrations/077-seed-memory-router-callsite.ts +1 -1
  550. package/src/workspace/migrations/registry.ts +0 -4
  551. package/src/workspace/turn-commit.ts +1 -1
  552. package/docs/activation-funnel-telemetry.md +0 -324
  553. package/scripts/bundled-plugin-packages.ts +0 -154
  554. package/scripts/generate-bundled-plugin-packages.ts +0 -29
  555. package/src/__tests__/activation-early-marking.test.ts +0 -114
  556. package/src/__tests__/auth-fallback-events-store.test.ts +0 -99
  557. package/src/__tests__/config-get-vision-flag.test.ts +0 -139
  558. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -400
  559. package/src/__tests__/internal-telemetry-routes.test.ts +0 -213
  560. package/src/__tests__/telemetry-routes.test.ts +0 -182
  561. package/src/__tests__/turn-events-store.test.ts +0 -376
  562. package/src/__tests__/ui-channel-variants.test.ts +0 -53
  563. package/src/avatar/__tests__/avatar-changed-telemetry.test.ts +0 -217
  564. package/src/avatar/avatar-changed-telemetry.ts +0 -128
  565. package/src/calls/__tests__/call-funnel-telemetry.test.ts +0 -204
  566. package/src/cli/commands/telemetry.help.ts +0 -27
  567. package/src/cli/commands/telemetry.ts +0 -83
  568. package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +0 -251
  569. package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +0 -113
  570. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +0 -384
  571. package/src/cli/lib/__tests__/plugin-pin-history.test.ts +0 -164
  572. package/src/cli/lib/__tests__/plugins-install-offline.test.ts +0 -228
  573. package/src/cli/lib/bundled-marketplace.json +0 -1575
  574. package/src/cli/lib/bundled-plugin-packages.json +0 -827
  575. package/src/cli/lib/bundled-plugin-packages.ts +0 -87
  576. package/src/cli/lib/plugin-catalog-local.ts +0 -94
  577. package/src/cli/lib/plugin-pin-history.ts +0 -276
  578. package/src/cloud/feature-gate.ts +0 -8
  579. package/src/config/__tests__/cloud-rehydration.test.ts +0 -180
  580. package/src/config/cloud-rehydration.ts +0 -35
  581. package/src/daemon/__tests__/auto-profile-router.test.ts +0 -380
  582. package/src/daemon/auto-profile-router.ts +0 -428
  583. package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +0 -391
  584. package/src/monitoring/__tests__/db-integrity-sample.test.ts +0 -113
  585. package/src/monitoring/__tests__/oom-kill-reporter.test.ts +0 -374
  586. package/src/monitoring/db-integrity-check.ts +0 -163
  587. package/src/monitoring/db-integrity-sample.ts +0 -176
  588. package/src/monitoring/oom-kill-reporter.ts +0 -469
  589. package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -158
  590. package/src/onboarding/onboarding-events-store.ts +0 -296
  591. package/src/persistence/__tests__/raw-query-telemetry.test.ts +0 -76
  592. package/src/persistence/lifecycle-events-store.test.ts +0 -134
  593. package/src/persistence/lifecycle-events-store.ts +0 -110
  594. package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +0 -76
  595. package/src/plugins/defaults/memory/activation-session-store.ts +0 -50
  596. package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +0 -281
  597. package/src/runtime/routes/auto-profile-routes.ts +0 -83
  598. package/src/runtime/routes/internal-telemetry-routes.ts +0 -142
  599. package/src/runtime/routes/telemetry-routes.ts +0 -274
  600. package/src/security/auth-fallback-events-store.ts +0 -57
  601. package/src/telemetry/__tests__/activation-funnel.test.ts +0 -95
  602. package/src/telemetry/__tests__/config-setting-events-store.test.ts +0 -63
  603. package/src/telemetry/__tests__/config-setting-snapshot.test.ts +0 -143
  604. package/src/telemetry/__tests__/flush-checkpoints.test.ts +0 -56
  605. package/src/telemetry/__tests__/live-voice-funnel.test.ts +0 -174
  606. package/src/telemetry/__tests__/outbox-test-harness.ts +0 -85
  607. package/src/telemetry/__tests__/phone-call-funnel.test.ts +0 -72
  608. package/src/telemetry/__tests__/telemetry-event-fixtures.ts +0 -282
  609. package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -71
  610. package/src/telemetry/activation-funnel.ts +0 -172
  611. package/src/telemetry/config-setting-events-store.ts +0 -40
  612. package/src/telemetry/config-setting-snapshot.ts +0 -170
  613. package/src/telemetry/flush-checkpoints.ts +0 -70
  614. package/src/telemetry/live-voice-funnel.ts +0 -185
  615. package/src/telemetry/memory-corpus-size.test.ts +0 -120
  616. package/src/telemetry/memory-corpus-size.ts +0 -184
  617. package/src/telemetry/memory-tier-reporter.test.ts +0 -195
  618. package/src/telemetry/memory-tier-reporter.ts +0 -130
  619. package/src/telemetry/phone-call-funnel.ts +0 -144
  620. package/src/telemetry/skill-loaded-events-store.test.ts +0 -93
  621. package/src/telemetry/skill-loaded-events-store.ts +0 -39
  622. package/src/telemetry/telemetry-event-sources.test.ts +0 -223
  623. package/src/telemetry/telemetry-event-sources.ts +0 -597
  624. package/src/telemetry/telemetry-events-outbox.test.ts +0 -375
  625. package/src/telemetry/telemetry-events-outbox.ts +0 -237
  626. package/src/telemetry/telemetry-main-db.ts +0 -48
  627. package/src/telemetry/telemetry-wire-source.json +0 -4
  628. package/src/telemetry/telemetry-wire-validation.test.ts +0 -157
  629. package/src/telemetry/telemetry-wire-validation.ts +0 -162
  630. package/src/telemetry/telemetry-wire.generated.ts +0 -483
  631. package/src/telemetry/tool-executed-events-store.test.ts +0 -210
  632. package/src/telemetry/tool-executed-events-store.ts +0 -102
  633. package/src/telemetry/trace-collection-policy.test.ts +0 -28
  634. package/src/telemetry/trace-collection-policy.ts +0 -30
  635. package/src/telemetry/turn-events-store.ts +0 -216
  636. package/src/telemetry/turn-trace-store.test.ts +0 -884
  637. package/src/telemetry/turn-trace-store.ts +0 -399
  638. package/src/telemetry/types.test.ts +0 -38
  639. package/src/telemetry/types.ts +0 -780
  640. package/src/telemetry/usage-telemetry-reporter.test.ts +0 -3445
  641. package/src/telemetry/usage-telemetry-reporter.ts +0 -566
  642. package/src/telemetry/watchdog-direct-emit.test.ts +0 -112
  643. package/src/telemetry/watchdog-direct-emit.ts +0 -104
  644. package/src/telemetry/watchdog-events-store.ts +0 -31
  645. package/src/tools/ui-surface/channel-variants.ts +0 -52
  646. package/src/watcher/__tests__/telemetry.test.ts +0 -178
  647. package/src/watcher/telemetry.ts +0 -93
  648. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +0 -165
  649. package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +0 -151
  650. /package/src/{telemetry → persistence}/tool-usage-store.ts +0 -0
  651. /package/src/{telemetry → persistence}/turn-outcome.ts +0 -0
@@ -1,50 +1,19 @@
1
1
  import { beforeEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
- // Tri-state share_analytics consent consulted when populating the telemetry
4
- // columns: only a confirmed `false` NULLs them.
5
- let shareAnalytics: boolean | "unknown" = true;
6
-
7
- mock.module("../cloud/consent-cache.js", () => ({
8
- getRawShareAnalytics: () => shareAnalytics,
9
- }));
10
-
11
- // Capture the audit rows the terminals would insert, and the lifecycle events
12
- // they would record, without touching the database.
3
+ // Capture the audit rows the terminals would insert, without touching the
4
+ // database.
13
5
  const records: Array<Record<string, unknown>> = [];
14
- const lifecycleEvents: Array<{
15
- eventName: string;
16
- attributes: Record<string, unknown>;
17
- }> = [];
18
- const lifecycleEventNames = (): string[] =>
19
- lifecycleEvents.map((event) => event.eventName);
20
- // Simulates the telemetry store failing (degraded DB) for the one test that
21
- // asserts the terminals swallow it.
22
- let lifecycleRecorderThrows = false;
23
-
24
- mock.module("../telemetry/tool-usage-store.js", () => ({
6
+
7
+ mock.module("../persistence/tool-usage-store.js", () => ({
25
8
  recordToolInvocation: (record: Record<string, unknown>) =>
26
9
  records.push(record),
27
10
  }));
28
11
 
29
- mock.module("../persistence/lifecycle-events-store.js", () => ({
30
- recordLifecycleEvent: (
31
- eventName: string,
32
- attributes: Record<string, unknown> = {},
33
- ) => {
34
- if (lifecycleRecorderThrows) {
35
- throw new Error("telemetry db down");
36
- }
37
- lifecycleEvents.push({ eventName, attributes });
38
- },
39
- }));
40
-
41
12
  import {
42
13
  recordToolDenied,
43
14
  recordToolError,
44
15
  recordToolExecuted,
45
- recordToolPermissionDecided,
46
- recordToolPermissionPrompted,
47
- } from "../telemetry/tool-audit.js";
16
+ } from "../persistence/tool-audit.js";
48
17
  import {
49
18
  OPENAI_PROJECT_KEY_REDACTION_MARKER,
50
19
  SYNTHETIC_OPENAI_PROJECT_KEY,
@@ -64,10 +33,7 @@ const ATTRIBUTION = {
64
33
 
65
34
  describe("tool audit terminals", () => {
66
35
  beforeEach(() => {
67
- shareAnalytics = true;
68
- lifecycleRecorderThrows = false;
69
36
  records.length = 0;
70
- lifecycleEvents.length = 0;
71
37
  });
72
38
 
73
39
  test("records executed rows with truncated output", () => {
@@ -333,87 +299,6 @@ describe("tool audit terminals", () => {
333
299
  );
334
300
  });
335
301
 
336
- test("persists NULL telemetry columns when share_analytics is opted out", () => {
337
- shareAnalytics = false;
338
-
339
- recordToolExecuted({
340
- conversationId: "conv-opt-out",
341
- toolName: "file_read",
342
- input: { path: "/tmp/a" },
343
- resultContent: "ok",
344
- resultBytes: 99,
345
- decision: "allow",
346
- riskLevel: "low",
347
- durationMs: 12,
348
- attribution: ATTRIBUTION,
349
- });
350
- recordToolError({
351
- conversationId: "conv-opt-out",
352
- toolName: "file_read",
353
- input: { path: "/tmp/b" },
354
- errorMessage: "boom",
355
- isExpected: false,
356
- riskLevel: "low",
357
- durationMs: 9,
358
- attribution: ATTRIBUTION,
359
- });
360
-
361
- // Telemetry columns are NULL — the tool_executed projection's
362
- // arg_bytes IS NOT NULL filter makes these rows permanently unreportable.
363
- expect(records).toHaveLength(2);
364
- for (const record of records) {
365
- expect(record.argBytes).toBeNull();
366
- expect(record.resultBytes).toBeNull();
367
- expect(record.provider).toBeNull();
368
- expect(record.model).toBeNull();
369
- expect(record.inferenceProfile).toBeNull();
370
- expect(record.inferenceProfileSource).toBeNull();
371
- }
372
- // The audit row itself is unaffected by the opt-out.
373
- expect(records[0]).toMatchObject({
374
- conversationId: "conv-opt-out",
375
- toolName: "file_read",
376
- input: JSON.stringify({ path: "/tmp/a" }),
377
- result: "ok",
378
- decision: "allow",
379
- durationMs: 12,
380
- });
381
- expect(records[1]).toMatchObject({
382
- result: "error: boom",
383
- decision: "error",
384
- durationMs: 9,
385
- });
386
- });
387
-
388
- test("populates telemetry columns under unknown consent (cold cache)", () => {
389
- // NULL columns are permanently excluded by the projection's
390
- // arg_bytes IS NOT NULL filter, so only a CONFIRMED opt-out may NULL
391
- // them — unknown records, and flush-time consent gating decides later.
392
- shareAnalytics = "unknown";
393
-
394
- recordToolExecuted({
395
- conversationId: "conv-unknown",
396
- toolName: "file_read",
397
- input: { path: "/tmp/a" },
398
- resultContent: "ok",
399
- resultBytes: 99,
400
- decision: "allow",
401
- riskLevel: "low",
402
- durationMs: 12,
403
- attribution: ATTRIBUTION,
404
- });
405
-
406
- expect(records).toHaveLength(1);
407
- expect(records[0]).toMatchObject({
408
- argBytes: Buffer.byteLength(JSON.stringify({ path: "/tmp/a" }), "utf8"),
409
- resultBytes: 99,
410
- provider: "anthropic",
411
- model: "model-a",
412
- inferenceProfile: "balanced",
413
- inferenceProfileSource: "active",
414
- });
415
- });
416
-
417
302
  test("maps attribution onto executed rows and leaves denied rows null", () => {
418
303
  recordToolExecuted({
419
304
  conversationId: "conv-attr",
@@ -463,119 +348,4 @@ describe("tool audit terminals", () => {
463
348
  expect(records[2].argBytes).toBeUndefined();
464
349
  expect(records[2].resultBytes).toBeUndefined();
465
350
  });
466
-
467
- test("audit terminals record no permission lifecycle telemetry", () => {
468
- recordToolExecuted({
469
- conversationId: "conv-prompt",
470
- toolName: "bash",
471
- input: { command: "ls" },
472
- resultContent: "ok",
473
- resultBytes: 2,
474
- decision: "allow",
475
- riskLevel: "high",
476
- durationMs: 3,
477
- attribution: null,
478
- });
479
- recordToolDenied({
480
- conversationId: "conv-prompt",
481
- toolName: "bash",
482
- input: { command: "rm -rf /" },
483
- reason: "Permission denied by user",
484
- riskLevel: "high",
485
- durationMs: 1,
486
- });
487
-
488
- expect(lifecycleEvents).toEqual([]);
489
- });
490
-
491
- test("prompt and decision carry the same grouping dimensions", () => {
492
- const prompt = {
493
- toolName: "bash",
494
- riskLevel: "high",
495
- riskThreshold: "low",
496
- surface: "slack",
497
- conversationId: "conv-prompt",
498
- };
499
-
500
- recordToolPermissionPrompted(prompt);
501
- recordToolPermissionDecided(prompt, "deny");
502
-
503
- expect(lifecycleEventNames()).toEqual([
504
- "permission_prompt:bash",
505
- "permission_decided:bash:deny",
506
- ]);
507
- for (const event of lifecycleEvents) {
508
- expect(event.attributes).toEqual({
509
- toolName: "bash",
510
- riskLevel: "high",
511
- riskThreshold: "low",
512
- surface: "slack",
513
- conversationId: "conv-prompt",
514
- });
515
- }
516
- });
517
-
518
- test("optional grouping dimensions are left unset when unknown", () => {
519
- recordToolPermissionPrompted({ toolName: "file_read", riskLevel: "low" });
520
-
521
- const attributes = lifecycleEvents[0]!.attributes;
522
- expect(attributes.toolName).toBe("file_read");
523
- expect(attributes.riskLevel).toBe("low");
524
- expect(attributes.riskThreshold).toBeUndefined();
525
- expect(attributes.surface).toBeUndefined();
526
- expect(attributes.conversationId).toBeUndefined();
527
- });
528
-
529
- test("records an abandoned decision distinctly from a user denial", () => {
530
- const prompt = { toolName: "bash", riskLevel: "medium" };
531
-
532
- recordToolPermissionPrompted(prompt);
533
- recordToolPermissionDecided(prompt, "abandoned");
534
-
535
- expect(lifecycleEventNames()).toEqual([
536
- "permission_prompt:bash",
537
- "permission_decided:bash:abandoned",
538
- ]);
539
- });
540
-
541
- test("truncates a long tool name to the wire event-name bound", () => {
542
- const toolName = `mcp__${"a".repeat(80)}__run`;
543
- const prompt = { toolName, riskLevel: "high" };
544
-
545
- recordToolPermissionPrompted(prompt);
546
- recordToolPermissionDecided(prompt, "abandoned");
547
-
548
- for (const event of lifecycleEvents) {
549
- expect(event.eventName.length).toBeLessThanOrEqual(64);
550
- // The full name still joins the pair.
551
- expect(event.attributes.toolName).toBe(toolName);
552
- }
553
- expect(lifecycleEvents[1]!.eventName.endsWith(":abandoned")).toBe(true);
554
- });
555
-
556
- test("clamps a tool name past the wire tool_name bound", () => {
557
- // A field over its bound fails validation, and a failed event is acked and
558
- // discarded rather than retried.
559
- const toolName = `mcp__${"a".repeat(300)}__run`;
560
-
561
- recordToolPermissionPrompted({ toolName, riskLevel: "high" });
562
-
563
- expect(lifecycleEvents[0]!.attributes.toolName).toBe(
564
- toolName.slice(0, 255),
565
- );
566
- });
567
-
568
- test("a failing lifecycle recorder never propagates out of the terminals", () => {
569
- lifecycleRecorderThrows = true;
570
-
571
- expect(() =>
572
- recordToolPermissionPrompted({ toolName: "bash", riskLevel: "high" }),
573
- ).not.toThrow();
574
- expect(() =>
575
- recordToolPermissionDecided(
576
- { toolName: "bash", riskLevel: "high" },
577
- "abandoned",
578
- ),
579
- ).not.toThrow();
580
- });
581
351
  });
@@ -16,7 +16,7 @@ let abortDuringCheck: AbortController | null = null;
16
16
  // ── audit-terminal captures ───────────────────────────────
17
17
  // The executor and its permission/approval collaborators no longer emit
18
18
  // lifecycle events through a context callback; they call direct terminal
19
- // functions in `../telemetry/tool-audit.js`. Mock those terminals here
19
+ // functions in `../persistence/tool-audit.js`. Mock those terminals here
20
20
  // (declared before importing the ToolExecutor so the mock intercepts the
21
21
  // executor's static import) and capture each call into an array. Every test
22
22
  // below asserts against these captures instead of an emitted-event stream.
@@ -59,28 +59,19 @@ interface DeniedCapture {
59
59
  durationMs: number;
60
60
  }
61
61
 
62
- interface PromptTelemetryCapture {
63
- toolName: string;
64
- riskLevel: string;
65
- riskThreshold?: string;
66
- surface?: string;
67
- conversationId?: string;
68
- }
69
-
70
62
  const executedCaptures: ExecutedCapture[] = [];
71
63
  const errorCaptures: ErrorCapture[] = [];
72
64
  const deniedCaptures: DeniedCapture[] = [];
73
- const promptedCaptures: PromptTelemetryCapture[] = [];
74
- const decidedCaptures: Array<{
75
- entry: PromptTelemetryCapture;
76
- outcome: string;
65
+ // The permission-prompt telemetry pair (recordToolPermissionPrompted/Decided)
66
+ // died with the telemetry removal; whether a prompt was surfaced is observed
67
+ // through the fake prompter instead (see makePrompter below).
68
+ const promptCalls: Array<{
69
+ toolName: string;
70
+ riskLevel: string;
71
+ conversationId?: string;
77
72
  }> = [];
78
- const promptedToolNames = (): string[] =>
79
- promptedCaptures.map((entry) => entry.toolName);
80
- const decidedOutcomes = (): string[] =>
81
- decidedCaptures.map((decided) => decided.outcome);
82
73
 
83
- mock.module("../telemetry/tool-audit.js", () => ({
74
+ mock.module("../persistence/tool-audit.js", () => ({
84
75
  recordToolExecuted: (entry: ExecutedCapture) => {
85
76
  executedCaptures.push(entry);
86
77
  },
@@ -90,15 +81,6 @@ mock.module("../telemetry/tool-audit.js", () => ({
90
81
  recordToolDenied: (entry: DeniedCapture) => {
91
82
  deniedCaptures.push(entry);
92
83
  },
93
- recordToolPermissionPrompted: (entry: PromptTelemetryCapture) => {
94
- promptedCaptures.push(entry);
95
- },
96
- recordToolPermissionDecided: (
97
- entry: PromptTelemetryCapture,
98
- outcome: string,
99
- ) => {
100
- decidedCaptures.push({ entry, outcome });
101
- },
102
84
  }));
103
85
 
104
86
  // Analytics consent is granted so any consent-gated telemetry path the audit
@@ -156,8 +138,8 @@ mock.module("../persistence/conversation-crud.js", () => ({
156
138
  }));
157
139
 
158
140
  // Mock every export so downstream test files that dynamically import modules
159
- // with a static `from "../telemetry/tool-usage-store.js"` still see all symbols.
160
- mock.module("../telemetry/tool-usage-store.js", () => ({
141
+ // with a static `from "../persistence/tool-usage-store.js"` still see all symbols.
142
+ mock.module("../persistence/tool-usage-store.js", () => ({
161
143
  recordToolInvocation: () => {},
162
144
  getRecentInvocations: () => [],
163
145
  rotateToolInvocations: async () => 0,
@@ -302,7 +284,21 @@ function makePrompter(
302
284
  }>,
303
285
  ) {
304
286
  return {
305
- prompt: promptImpl ?? (async () => ({ decision: promptDecision })),
287
+ prompt: async (
288
+ toolName: string,
289
+ _input: unknown,
290
+ riskLevel: string,
291
+ _allowlistOptions: unknown,
292
+ _scopeOptions: unknown,
293
+ _previewDiff: unknown,
294
+ conversationId?: string,
295
+ ) => {
296
+ // Record that a prompt was actually surfaced (with the risk and
297
+ // conversation the checker resolved) — the telemetry "prompted" half is
298
+ // gone, so the surfaced-prompt observation lives here now.
299
+ promptCalls.push({ toolName, riskLevel, conversationId });
300
+ return promptImpl ? promptImpl() : { decision: promptDecision };
301
+ },
306
302
  resolveConfirmation: () => {},
307
303
  updateSender: () => {},
308
304
  dispose: () => {},
@@ -323,8 +319,7 @@ describe("ToolExecutor audit terminals", () => {
323
319
  executedCaptures.length = 0;
324
320
  errorCaptures.length = 0;
325
321
  deniedCaptures.length = 0;
326
- promptedCaptures.length = 0;
327
- decidedCaptures.length = 0;
322
+ promptCalls.length = 0;
328
323
  });
329
324
 
330
325
  test("records executed terminal for allowed execution", async () => {
@@ -356,7 +351,7 @@ describe("ToolExecutor audit terminals", () => {
356
351
  test("records permission telemetry per-invocation, not from the turn-level flag", async () => {
357
352
  // A prior tool this turn was interactively approved (turn-level
358
353
  // `approvedViaPrompt` already true), but THIS call is auto-approved, so it
359
- // surfaces no prompt and records neither half of the pair.
354
+ // surfaces no prompt and lands directly on the executed terminal.
360
355
  const executor = new ToolExecutor(makePrompter());
361
356
 
362
357
  const result = await executor.execute(
@@ -367,8 +362,7 @@ describe("ToolExecutor audit terminals", () => {
367
362
 
368
363
  expect(result).toMatchObject({ isError: false });
369
364
  expect(executedCaptures).toHaveLength(1);
370
- expect(promptedCaptures).toHaveLength(0);
371
- expect(decidedCaptures).toHaveLength(0);
365
+ expect(promptCalls).toHaveLength(0);
372
366
  });
373
367
 
374
368
  test("records denied terminal when user denies prompt", async () => {
@@ -389,8 +383,7 @@ describe("ToolExecutor audit terminals", () => {
389
383
  expect(result.content).toContain("Permission denied");
390
384
 
391
385
  // A prompt was surfaced, then the user's denial recorded a denied terminal.
392
- expect(promptedToolNames()).toEqual(["bash"]);
393
- expect(decidedOutcomes()).toEqual(["deny"]);
386
+ expect(promptCalls.map((c) => c.toolName)).toEqual(["bash"]);
394
387
  expect(executedCaptures).toHaveLength(0);
395
388
  expect(deniedCaptures).toHaveLength(1);
396
389
  const denied = deniedCaptures[0];
@@ -399,7 +392,7 @@ describe("ToolExecutor audit terminals", () => {
399
392
  expect(denied.reason).toBe("Permission denied by user");
400
393
  });
401
394
 
402
- test("records an allow decision when the user approves the prompt", async () => {
395
+ test("runs the tool when the user approves the prompt", async () => {
403
396
  checkerDecision = "prompt";
404
397
  checkerReason = "medium risk: requires approval";
405
398
  checkerRisk = "medium";
@@ -413,11 +406,12 @@ describe("ToolExecutor audit terminals", () => {
413
406
  makeContext({ forcePromptSideEffects: true }),
414
407
  );
415
408
 
416
- expect(promptedToolNames()).toEqual(["bash"]);
417
- expect(decidedOutcomes()).toEqual(["allow"]);
409
+ expect(promptCalls.map((c) => c.toolName)).toEqual(["bash"]);
410
+ expect(executedCaptures).toHaveLength(1);
411
+ expect(deniedCaptures).toHaveLength(0);
418
412
  });
419
413
 
420
- test("carries risk level and access preset onto both halves of the pair", async () => {
414
+ test("carries risk level and conversation onto the prompt request", async () => {
421
415
  checkerDecision = "prompt";
422
416
  checkerReason = "high risk: requires approval";
423
417
  checkerRisk = "high";
@@ -434,14 +428,10 @@ describe("ToolExecutor audit terminals", () => {
434
428
  const expected = {
435
429
  toolName: "bash",
436
430
  riskLevel: "high",
437
- // The gateway is unreachable under test, so the reader falls back to the
438
- // strict preset. What matters is that the resolved value is recorded.
439
- riskThreshold: "none",
440
- surface: "slack",
441
431
  conversationId: "conversation-1",
442
432
  };
443
- expect(promptedCaptures[0]).toMatchObject(expected);
444
- expect(decidedCaptures[0].entry).toMatchObject(expected);
433
+ expect(promptCalls[0]).toMatchObject(expected);
434
+ expect(deniedCaptures).toHaveLength(1);
445
435
  });
446
436
 
447
437
  // ── abandoned prompts ───────────────────────────────
@@ -470,8 +460,8 @@ describe("ToolExecutor audit terminals", () => {
470
460
  );
471
461
 
472
462
  expect(result.isError).toBe(true);
473
- expect(promptedToolNames()).toEqual(["bash"]);
474
- expect(decidedOutcomes()).toEqual(["abandoned"]);
463
+ expect(promptCalls.map((c) => c.toolName)).toEqual(["bash"]);
464
+ expect(deniedCaptures).toHaveLength(1);
475
465
  },
476
466
  );
477
467
 
@@ -496,14 +486,12 @@ describe("ToolExecutor audit terminals", () => {
496
486
  );
497
487
 
498
488
  expect(result.isError).toBe(true);
499
- // The invocation did reach the prompt branch and was denied there, so the
500
- // empty telemetry below is the guard working, not the branch being skipped.
489
+ // The invocation did reach the prompt branch and was denied there — the
490
+ // deny is the guard working, not the branch being skipped.
501
491
  expect(deniedCaptures).toHaveLength(1);
502
- expect(promptedCaptures).toHaveLength(0);
503
- expect(decidedCaptures).toHaveLength(0);
504
492
  });
505
493
 
506
- test("records an abandoned decision when the prompter is disposed mid-prompt", async () => {
494
+ test("records an error terminal when the prompter is disposed mid-prompt", async () => {
507
495
  checkerDecision = "prompt";
508
496
  checkerReason = "medium risk: requires approval";
509
497
  checkerRisk = "medium";
@@ -521,61 +509,13 @@ describe("ToolExecutor audit terminals", () => {
521
509
  );
522
510
 
523
511
  expect(result.isError).toBe(true);
524
- expect(promptedToolNames()).toEqual(["bash"]);
525
- expect(decidedOutcomes()).toEqual(["abandoned"]);
526
- });
527
-
528
- test("every prompt reconciles against exactly one decision", async () => {
529
- checkerDecision = "prompt";
530
- checkerReason = "medium risk: requires approval";
531
- checkerRisk = "medium";
532
-
533
- // One of each terminal shape a prompted invocation can reach: approved and
534
- // the tool runs, approved and the tool throws, denied, and abandoned.
535
- const runs: Array<() => Promise<unknown>> = [
536
- async () => {
537
- promptDecision = "allow";
538
- toolThrow = null;
539
- return new ToolExecutor(makePrompter()).execute(
540
- "bash",
541
- { command: "ls" },
542
- makeContext({ forcePromptSideEffects: true }),
543
- );
544
- },
545
- async () => {
546
- promptDecision = "allow";
547
- toolThrow = new Error("boom");
548
- return new ToolExecutor(makePrompter()).execute(
549
- "bash",
550
- { command: "ls" },
551
- makeContext({ forcePromptSideEffects: true }),
552
- );
553
- },
554
- async () => {
555
- promptDecision = "deny";
556
- toolThrow = null;
557
- return new ToolExecutor(makePrompter()).execute(
558
- "bash",
559
- { command: "ls" },
560
- makeContext({ forcePromptSideEffects: true }),
561
- );
562
- },
563
- async () =>
564
- new ToolExecutor(
565
- makePrompter(async () => ({ decision: "deny", wasTimeout: true })),
566
- ).execute(
567
- "bash",
568
- { command: "ls" },
569
- makeContext({ forcePromptSideEffects: true }),
570
- ),
571
- ];
572
- for (const run of runs) {
573
- await run();
574
- }
575
-
576
- expect(promptedCaptures).toHaveLength(runs.length);
577
- expect(decidedCaptures).toHaveLength(runs.length);
578
- expect(decidedOutcomes()).toEqual(["allow", "allow", "deny", "abandoned"]);
512
+ expect(promptCalls.map((c) => c.toolName)).toEqual(["bash"]);
513
+ // The prompter rejected rather than resolved: the throw rides the
514
+ // executor's generic error path to an unexpected-error terminal, not a
515
+ // denied one.
516
+ expect(errorCaptures).toHaveLength(1);
517
+ expect(errorCaptures[0].errorMessage).toBe("Prompter disposed");
518
+ expect(errorCaptures[0].isExpected).toBe(false);
579
519
  });
580
520
 
581
521
  test("uses contextual deny messaging when provided by prompter", async () => {
@@ -644,7 +584,7 @@ describe("ToolExecutor audit terminals", () => {
644
584
  isError: true,
645
585
  });
646
586
  // A deterministic deny rule blocks without prompting.
647
- expect(promptedCaptures).toHaveLength(0);
587
+ expect(promptCalls).toHaveLength(0);
648
588
  expect(deniedCaptures).toHaveLength(1);
649
589
  expect(deniedCaptures[0].reason).toBe("Blocked by deny rule: rm *");
650
590
  });
@@ -977,7 +917,7 @@ describe("ToolExecutor audit terminals", () => {
977
917
  );
978
918
 
979
919
  // forcePromptSideEffects promotes the auto-allow to an interactive prompt.
980
- expect(promptedToolNames()).toEqual(["bash"]);
920
+ expect(promptCalls.map((c) => c.toolName)).toEqual(["bash"]);
981
921
  expect(executedCaptures).toHaveLength(1);
982
922
  expect(executedCaptures[0].toolName).toBe("bash");
983
923
  });
@@ -995,8 +935,8 @@ describe("ToolExecutor audit terminals", () => {
995
935
  makeContext({ forcePromptSideEffects: true }),
996
936
  );
997
937
 
998
- // file_read is not a side-effect tool, so no prompt terminal should fire.
999
- expect(promptedCaptures).toHaveLength(0);
938
+ // file_read is not a side-effect tool, so no prompt is surfaced.
939
+ expect(promptCalls).toHaveLength(0);
1000
940
  expect(executedCaptures).toHaveLength(1);
1001
941
  expect(executedCaptures[0].toolName).toBe("file_read");
1002
942
  });
@@ -1022,7 +962,7 @@ describe("ToolExecutor audit terminals", () => {
1022
962
  );
1023
963
 
1024
964
  expect(result).toMatchObject({ content: "ok", isError: false });
1025
- expect(promptedToolNames()).toEqual(["file_edit"]);
965
+ expect(promptCalls.map((c) => c.toolName)).toEqual(["file_edit"]);
1026
966
  expect(executedCaptures).toHaveLength(1);
1027
967
  expect(executedCaptures[0].toolName).toBe("file_edit");
1028
968
  });
@@ -28,7 +28,7 @@ import {
28
28
  registerWorkspaceTools,
29
29
  } from "../tools/registry.js";
30
30
  import type { Tool, ToolContext, ToolExecutionResult } from "../tools/types.js";
31
- import { getWorkspacePluginsDir } from "../util/platform.js";
31
+ import { getWorkspacePluginsDir } from "../util/layout.js";
32
32
 
33
33
  interface ToolListEntry {
34
34
  name: string;
@@ -20,7 +20,7 @@ import { initializeDb } from "../persistence/db-init.js";
20
20
  import {
21
21
  readTurnFailure,
22
22
  stampTurnOutcome,
23
- } from "../telemetry/turn-outcome.js";
23
+ } from "../persistence/turn-outcome.js";
24
24
 
25
25
  await initializeDb();
26
26
 
@@ -364,7 +364,6 @@ function createTestSession(
364
364
  ) {
365
365
  ensureConversation(convId);
366
366
  const session = createCallSession({
367
- direction: "inbound",
368
367
  conversationId: convId,
369
368
  provider: "twilio",
370
369
  fromNumber: "+14155550111",
@@ -109,37 +109,6 @@ describe("resolveUsageAttribution", () => {
109
109
  expectResolvedProviderModelMatchesResolver("mainAgent", "pinned");
110
110
  });
111
111
 
112
- test("reports an override the Auto router chose as the auto source", () => {
113
- setLlmConfig({
114
- profiles: {
115
- active: { provider: "openai", model: "gpt-5.4" },
116
- routed: { provider: "gemini", model: "gemini-3-pro" },
117
- },
118
- activeProfile: "active",
119
- });
120
-
121
- const snapshot = resolveUsageAttribution({
122
- callSite: "mainAgent",
123
- overrideProfile: "routed",
124
- overrideProfileOrigin: "auto",
125
- });
126
-
127
- expect(snapshot).toMatchObject({
128
- appliedProfile: "routed",
129
- profileSource: "auto",
130
- resolvedProvider: "gemini",
131
- resolvedModel: "gemini-3-pro",
132
- });
133
- // The origin only relabels an override that actually won.
134
- expect(
135
- resolveUsageAttribution({
136
- callSite: "mainAgent",
137
- overrideProfile: "missing",
138
- overrideProfileOrigin: "auto",
139
- }).profileSource,
140
- ).toBe("active");
141
- });
142
-
143
112
  test("resolves call-site profile attribution", () => {
144
113
  setLlmConfig({
145
114
  profiles: {
@@ -29,8 +29,8 @@ mock.module("../persistence/conversation-crud.js", () => ({
29
29
  }));
30
30
 
31
31
  // Mock every export so downstream test files that dynamically import modules
32
- // with a static `from "../telemetry/tool-usage-store.js"` still see all symbols.
33
- mock.module("../telemetry/tool-usage-store.js", () => ({
32
+ // with a static `from "../persistence/tool-usage-store.js"` still see all symbols.
33
+ mock.module("../persistence/tool-usage-store.js", () => ({
34
34
  recordToolInvocation: () => {},
35
35
  getRecentInvocations: () => [],
36
36
  rotateToolInvocations: async () => 0,
@@ -42,24 +42,17 @@ const auditCalls = {
42
42
  denied: [] as any[],
43
43
  error: [] as any[],
44
44
  executed: [] as any[],
45
- prompted: [] as any[],
46
- decided: [] as any[],
47
45
  };
48
- mock.module("../telemetry/tool-audit.js", () => ({
46
+ mock.module("../persistence/tool-audit.js", () => ({
49
47
  recordToolDenied: (e: any) => auditCalls.denied.push(e),
50
48
  recordToolError: (e: any) => auditCalls.error.push(e),
51
49
  recordToolExecuted: (e: any) => auditCalls.executed.push(e),
52
- recordToolPermissionPrompted: (e: any) => auditCalls.prompted.push(e),
53
- recordToolPermissionDecided: (e: any, outcome: string) =>
54
- auditCalls.decided.push({ entry: e, outcome }),
55
50
  }));
56
51
 
57
52
  function resetAuditCalls(): void {
58
53
  auditCalls.denied.length = 0;
59
54
  auditCalls.error.length = 0;
60
55
  auditCalls.executed.length = 0;
61
- auditCalls.prompted.length = 0;
62
- auditCalls.decided.length = 0;
63
56
  }
64
57
 
65
58
  mock.module("../tools/registry.js", () => ({