@mycadet/assistant 0.12.9 → 0.12.11

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