@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
@@ -8,33 +8,9 @@
8
8
  * a wrapped connection hits corruption. The direct emit itself (opt-out gate,
9
9
  * POST payload) is covered in `../telemetry/watchdog-direct-emit.test.ts`.
10
10
  */
11
- import { mkdtempSync, writeFileSync } from "node:fs";
12
- import { tmpdir } from "node:os";
13
- import { join } from "node:path";
14
- import { Database } from "bun:sqlite";
15
- import { beforeEach, describe, expect, mock, test } from "bun:test";
11
+ import { describe, expect, test } from "bun:test";
16
12
 
17
- // Capture direct emits instead of POSTing them.
18
- const emitCalls: Array<{ checkName: string; detail: Record<string, unknown> }> =
19
- [];
20
- mock.module("../telemetry/watchdog-direct-emit.js", () => ({
21
- emitWatchdogEventDirect: (
22
- checkName: string,
23
- detail: Record<string, unknown>,
24
- ) => {
25
- emitCalls.push({ checkName, detail });
26
- return Promise.resolve();
27
- },
28
- }));
29
-
30
- import { wrapSqliteForSlowQueryLogging } from "../persistence/slow-query-log.js";
31
- import {
32
- flushCorruptionEmitsForTesting,
33
- isSqliteCorruptionError,
34
- observeSqliteStatementError,
35
- resetSqliteCorruptionWatchdogForTesting,
36
- SQLITE_CORRUPTED_CHECK_NAME,
37
- } from "./sqlite-corruption-watchdog.js";
13
+ import { isSqliteCorruptionError } from "./sqlite-corruption-watchdog.js";
38
14
 
39
15
  /** A synthetic `bun:sqlite`-style error carrying a `code`. */
40
16
  function sqliteError(code: string, message: string): Error {
@@ -86,119 +62,3 @@ describe("isSqliteCorruptionError", () => {
86
62
  );
87
63
  });
88
64
  });
89
-
90
- describe("observeSqliteStatementError", () => {
91
- beforeEach(() => {
92
- emitCalls.length = 0;
93
- resetSqliteCorruptionWatchdogForTesting();
94
- });
95
-
96
- test("a corruption error emits sqlite_corrupted with detail", async () => {
97
- observeSqliteStatementError(
98
- sqliteError("SQLITE_CORRUPT", "database disk image is malformed"),
99
- {
100
- sql: "SELECT * FROM messages WHERE id = ?",
101
- database: "main",
102
- label: "load-history",
103
- },
104
- );
105
- await flushCorruptionEmitsForTesting();
106
-
107
- expect(emitCalls).toHaveLength(1);
108
- expect(emitCalls[0].checkName).toBe(SQLITE_CORRUPTED_CHECK_NAME);
109
- expect(emitCalls[0].checkName).toBe("sqlite_corrupted");
110
- expect(emitCalls[0].detail).toMatchObject({
111
- database: "main",
112
- error: "database disk image is malformed",
113
- sql: "SELECT * FROM messages WHERE id = ?",
114
- label: "load-history",
115
- });
116
- });
117
-
118
- test('falls back to "unknown" when the connection carried no database tag', async () => {
119
- observeSqliteStatementError(new Error("file is not a database"), {
120
- sql: "SELECT 1",
121
- });
122
- await flushCorruptionEmitsForTesting();
123
-
124
- expect(emitCalls).toHaveLength(1);
125
- expect(emitCalls[0].detail.database).toBe("unknown");
126
- });
127
-
128
- test("a transient / unrelated error emits nothing", async () => {
129
- observeSqliteStatementError(sqliteError("SQLITE_BUSY", "locked"), {
130
- sql: "INSERT ...",
131
- database: "main",
132
- });
133
- observeSqliteStatementError(
134
- sqliteError("SQLITE_CONSTRAINT", "UNIQUE constraint failed"),
135
- { sql: "INSERT ...", database: "main" },
136
- );
137
- observeSqliteStatementError(new Error("no such table: foo"), {
138
- sql: "SELECT ...",
139
- database: "main",
140
- });
141
- await flushCorruptionEmitsForTesting();
142
-
143
- expect(emitCalls).toHaveLength(0);
144
- });
145
-
146
- test("debounces repeated corruption on the same database", async () => {
147
- const err = sqliteError(
148
- "SQLITE_CORRUPT",
149
- "database disk image is malformed",
150
- );
151
- observeSqliteStatementError(err, { sql: "SELECT 1", database: "main" });
152
- observeSqliteStatementError(err, { sql: "SELECT 2", database: "main" });
153
- observeSqliteStatementError(err, { sql: "SELECT 3", database: "main" });
154
- await flushCorruptionEmitsForTesting();
155
- // One report for `main` within the cooldown window...
156
- expect(emitCalls).toHaveLength(1);
157
-
158
- // ...but a distinct database is still free to report.
159
- observeSqliteStatementError(err, { sql: "SELECT 1", database: "memory" });
160
- await flushCorruptionEmitsForTesting();
161
- expect(emitCalls).toHaveLength(2);
162
- });
163
- });
164
-
165
- describe("wired into the slow-query wrapper", () => {
166
- beforeEach(() => {
167
- emitCalls.length = 0;
168
- resetSqliteCorruptionWatchdogForTesting();
169
- });
170
-
171
- test("a wrapped connection hitting a corrupt-header file emits, and the error still propagates", async () => {
172
- // A garbage file throws SQLITE_NOTADB while `.query()` compiles the SQL —
173
- // the wrapper's create-time seam surfaces it straight to the watchdog, and
174
- // names the file from the connection's own `filename` (no key plumbing).
175
- const dir = mkdtempSync(join(tmpdir(), "sqlite-corruption-wd-"));
176
- const garbagePath = join(dir, "not-a.db");
177
- writeFileSync(
178
- garbagePath,
179
- Buffer.from("this is definitely not a sqlite db"),
180
- );
181
-
182
- const db = new Database(garbagePath);
183
- wrapSqliteForSlowQueryLogging(db);
184
-
185
- // The original SQLite error must still propagate unchanged.
186
- expect(() => db.query("SELECT name FROM sqlite_master").all()).toThrow();
187
- await flushCorruptionEmitsForTesting();
188
-
189
- expect(emitCalls).toHaveLength(1);
190
- expect(emitCalls[0].checkName).toBe("sqlite_corrupted");
191
- expect(emitCalls[0].detail.database).toBe("not-a.db");
192
- });
193
-
194
- test("a wrapped connection running healthy queries emits nothing", async () => {
195
- const db = new Database(":memory:");
196
- wrapSqliteForSlowQueryLogging(db);
197
- db.exec("CREATE TABLE t (id INTEGER PRIMARY KEY)");
198
- db.query("INSERT INTO t (id) VALUES (1)").run();
199
- db.query("SELECT * FROM t").all();
200
- await flushCorruptionEmitsForTesting();
201
-
202
- expect(emitCalls).toHaveLength(0);
203
- });
204
- });
@@ -1,62 +1,29 @@
1
1
  /**
2
2
  * SQLite corruption watchdog.
3
3
  *
4
- * The daemon keeps all of its state — conversations, schedules, memory,
5
- * telemetry — in `bun:sqlite` files. When one of those files is damaged (a
6
- * torn write, a truncated file, bad disk media) SQLite surfaces it as a
7
- * `SQLITE_CORRUPT` / `SQLITE_NOTADB` error ("database disk image is malformed"
8
- * / "file is not a database") on the next statement that touches the damaged
9
- * page. Left unobserved, that damage is only noticed when a user hits a broken
10
- * feature; the cloud has no fleet-wide view of how often it happens.
4
+ * The daemon keeps all of its state — conversations, schedules, memory — in
5
+ * `bun:sqlite` files. When one of those files is damaged (a torn write, a
6
+ * truncated file, bad disk media) SQLite surfaces it as a `SQLITE_CORRUPT` /
7
+ * `SQLITE_NOTADB` error ("database disk image is malformed" / "file is not a
8
+ * database") on the next statement that touches the damaged page. Left
9
+ * unobserved, that damage is only noticed when a user hits a broken feature.
11
10
  *
12
- * This watchdog makes corruption observable. It emits a `watchdog` telemetry
13
- * event with `check_name = "sqlite_corrupted"` — the same stream the event-loop
14
- * watchdog uses — but POSTs it *directly* to the cloud ingest rather than
15
- * through the SQLite-backed watchdog buffer: a check that fires because SQLite
16
- * is unusable must not depend on writing to SQLite, and going direct keeps this
17
- * module out of the `db-connection` import graph. The direct path still honors
18
- * the `share_analytics` opt-out (see {@link emitWatchdogEventDirect}). The
19
- * platform's already-merged `watchdog__sqlite_corruption_daily` admin query
20
- * filters `check_name` to this exact string, so it is the cross-repo contract
21
- * and must stay stable.
11
+ * This watchdog makes corruption observable locally: it logs an operator-facing
12
+ * error the moment any statement hits a damaged page.
22
13
  *
23
14
  * Detection is per-statement: the shared slow-query wrapper — which already
24
- * wraps every `bun:sqlite` connection (main, logs, memory, telemetry — Drizzle
25
- * and raw) — hands every failed statement to {@link observeSqliteStatementError}.
26
- * So corruption is caught on *any* failing query or write, read or write, the
15
+ * wraps every `bun:sqlite` connection (main, logs, memory — Drizzle and raw) —
16
+ * hands every failed statement to {@link observeSqliteStatementError}. So
17
+ * corruption is caught on *any* failing query or write, read or write, the
27
18
  * moment the workload actually hits the damaged page — no dedicated scan
28
19
  * needed. Non-corruption errors (constraint violations, syntax errors,
29
20
  * transient `SQLITE_BUSY`) are ignored.
30
- *
31
- * Reports are debounced per-database (a corrupt file throws on every
32
- * subsequent statement) — see {@link REPORT_COOLDOWN_MS}.
33
21
  */
34
22
 
35
23
  import { getLogger } from "../util/logger.js";
36
24
 
37
25
  const log = getLogger("sqlite-corruption-watchdog");
38
26
 
39
- /**
40
- * Check name emitted for SQLite corruption events. The cloud's
41
- * `watchdog__sqlite_corruption_daily` admin query filters `check_name` to
42
- * this exact string — it is the cross-repo contract, keep it stable.
43
- */
44
- export const SQLITE_CORRUPTED_CHECK_NAME = "sqlite_corrupted";
45
-
46
- /**
47
- * Minimum spacing between reports for a single database. Corruption is sticky:
48
- * once a file is malformed every subsequent statement against it throws the
49
- * same way, so without a cooldown a single damaged DB hit in a tight loop
50
- * would emit a flood of identical events. Keyed per database so damage to one
51
- * file never suppresses the first report for another.
52
- */
53
- const REPORT_COOLDOWN_MS = 60_000;
54
-
55
- const lastReportAtByDatabase = new Map<string, number>();
56
-
57
- /** The most recent in-flight direct emit, so tests can await it. */
58
- let pendingEmit: Promise<unknown> = Promise.resolve();
59
-
60
27
  /**
61
28
  * Whether an error is SQLite reporting structural corruption — the
62
29
  * `SQLITE_CORRUPT` / `SQLITE_NOTADB` families, by extended result code or by
@@ -81,34 +48,13 @@ export function isSqliteCorruptionError(err: unknown): boolean {
81
48
  }
82
49
 
83
50
  /**
84
- * Report a corruption detection: debounce per database and emit the
85
- * `sqlite_corrupted` telemetry event directly (opt-out gated inside
86
- * {@link emitWatchdogEventDirect}). The direct emit is lazy-imported so the
87
- * platform/telemetry stack only loads on the rare corruption path — and so this
88
- * module never pulls `db-connection` into its static import graph. Fire-and-
89
- * forget: the observer runs on a query hot path, so nothing here throws or
90
- * blocks on the POST.
51
+ * Report a corruption detection as an operator-facing error log. Fire-and-
52
+ * forget by construction (logging never throws).
91
53
  */
92
54
  function reportCorruption(
93
55
  detail: Record<string, unknown> & { database: string },
94
56
  ): void {
95
- const now = Date.now();
96
- const last =
97
- lastReportAtByDatabase.get(detail.database) ?? Number.NEGATIVE_INFINITY;
98
- if (now - last < REPORT_COOLDOWN_MS) {
99
- return;
100
- }
101
- lastReportAtByDatabase.set(detail.database, now);
102
-
103
57
  log.error(detail, "SQLite corruption detected");
104
-
105
- pendingEmit = import("../telemetry/watchdog-direct-emit.js")
106
- .then(({ emitWatchdogEventDirect }) =>
107
- emitWatchdogEventDirect(SQLITE_CORRUPTED_CHECK_NAME, detail),
108
- )
109
- .catch(() => {
110
- // Best-effort; never let a telemetry failure escape the query path.
111
- });
112
58
  }
113
59
 
114
60
  /** Context handed to {@link observeSqliteStatementError} for a failed execution. */
@@ -126,10 +72,10 @@ export interface StatementErrorContext {
126
72
  }
127
73
 
128
74
  /**
129
- * Called by the slow-query wrapper for every failed statement: fires the
130
- * corruption event for `SQLITE_CORRUPT` / `SQLITE_NOTADB` errors and ignores
131
- * everything else (constraint/syntax errors, transient `SQLITE_BUSY` /
132
- * `SQLITE_IOERR` contention). The wrapper calls this directly, so there is no
75
+ * Called by the slow-query wrapper for every failed statement: logs corruption
76
+ * for `SQLITE_CORRUPT` / `SQLITE_NOTADB` errors and ignores everything else
77
+ * (constraint/syntax errors, transient `SQLITE_BUSY` / `SQLITE_IOERR`
78
+ * contention). The wrapper calls this directly, so there is no
133
79
  * observer registration or start/stop lifecycle — a corrupt file reports the
134
80
  * moment a statement hits it.
135
81
  */
@@ -147,13 +93,3 @@ export function observeSqliteStatementError(
147
93
  ...(context.label ? { label: context.label } : {}),
148
94
  });
149
95
  }
150
-
151
- /** Test-only: clear the per-database debounce state between cases. */
152
- export function resetSqliteCorruptionWatchdogForTesting(): void {
153
- lastReportAtByDatabase.clear();
154
- }
155
-
156
- /** Test-only: await the most recent fire-and-forget direct emit. */
157
- export function flushCorruptionEmitsForTesting(): Promise<unknown> {
158
- return pendingEmit;
159
- }
@@ -20,8 +20,8 @@ import { getConceptsDir } from "../plugins/defaults/memory/substrate/page-store.
20
20
  import { broadcastMessage } from "../runtime/assistant-event-hub.js";
21
21
  import { publishDocumentsChanged } from "../runtime/sync/resource-sync-events.js";
22
22
  import type { ToolExecutionResult } from "../tools/types.js";
23
+ import { getWorkspaceDir } from "../util/layout.js";
23
24
  import { getLogger } from "../util/logger.js";
24
- import { getWorkspaceDir } from "../util/platform.js";
25
25
  import {
26
26
  broadcastAppFilesChanged,
27
27
  notifyAppSurfacesChanged,
@@ -14,9 +14,9 @@ import { join } from "node:path";
14
14
  import { getIsContainerized } from "../config/env-registry.js";
15
15
  import { connectCdpWsTransport } from "../tools/browser/cdp-client/cdp-inspect/ws-transport.js";
16
16
  import { terminateProcessTree } from "../util/host-process.js";
17
+ import { getDataDir, getWorkspaceDir } from "../util/layout.js";
17
18
  import { getLogger } from "../util/logger.js";
18
19
  import { CHILD_OOM_SCORE_ADJ, withOomScoreAdj } from "../util/oom-priority.js";
19
- import { getDataDir, getWorkspaceDir } from "../util/platform.js";
20
20
  import { sleep } from "../util/retry.js";
21
21
  import { DesktopBrowserClient } from "./desktop-browser-client.js";
22
22
  import {
@@ -8,8 +8,8 @@ import { renderCharacterPng } from "../avatar/png-renderer.js";
8
8
  import { getResvg, isResvgAvailable } from "../avatar/resvg-lazy.js";
9
9
  import { isTemplatePlaceholder } from "../daemon/handlers/identity.js";
10
10
  import { getAssistantName } from "../daemon/identity-helpers.js";
11
+ import { getAvatarImagePath } from "../util/layout.js";
11
12
  import { getLogger } from "../util/logger.js";
12
- import { getAvatarImagePath } from "../util/platform.js";
13
13
  import { escapeXmlContent } from "../util/xml.js";
14
14
 
15
15
  function wallpaperWordmark(
@@ -27,8 +27,8 @@ import {
27
27
  resolveScheduleTimezone,
28
28
  } from "../schedule/schedule-timezone.js";
29
29
  import { readTextFileSync } from "../util/fs.js";
30
+ import { getWorkspaceDir, getWorkspacePromptPath } from "../util/layout.js";
30
31
  import { getLogger } from "../util/logger.js";
31
- import { getWorkspaceDir, getWorkspacePromptPath } from "../util/platform.js";
32
32
  import { stripCommentLines } from "../util/strip-comment-lines.js";
33
33
  import {
34
34
  completeHeartbeatRun,
@@ -42,8 +42,8 @@ import {
42
42
  isPendingGuardianFeedItem,
43
43
  } from "../api/responses/home.js";
44
44
  import { broadcastMessage } from "../runtime/assistant-event-hub.js";
45
+ import { getDataDir } from "../util/layout.js";
45
46
  import { getLogger } from "../util/logger.js";
46
- import { getDataDir } from "../util/platform.js";
47
47
  import {
48
48
  type FeedItem,
49
49
  type FeedItemStatus,
@@ -18,7 +18,7 @@ import {
18
18
  setMemoryCheckpoint,
19
19
  } from "../persistence/checkpoints.js";
20
20
  import { resolveGuardianPersona } from "../prompts/persona-resolver.js";
21
- import { getWorkspacePromptPath } from "../util/platform.js";
21
+ import { getWorkspacePromptPath } from "../util/layout.js";
22
22
 
23
23
  // ---------------------------------------------------------------------------
24
24
  // Constants
@@ -26,12 +26,12 @@ import { countConversations as countConversationsDb } from "../persistence/conve
26
26
  import { resolveGuardianPersonaPath } from "../prompts/persona-resolver.js";
27
27
  import { broadcastMessage } from "../runtime/assistant-event-hub.js";
28
28
  import type { OnboardingContext } from "../types/onboarding-context.js";
29
- import { getLogger } from "../util/logger.js";
30
29
  import {
31
30
  getDataDir,
32
31
  getWorkspaceDir,
33
32
  getWorkspacePromptPath,
34
- } from "../util/platform.js";
33
+ } from "../util/layout.js";
34
+ import { getLogger } from "../util/logger.js";
35
35
  import { resolveAndPersistHatchedAt } from "../workspace/hatched-date.js";
36
36
  import { computeProgressPercent, computeTier } from "./progress-formula.js";
37
37
  import {
@@ -30,7 +30,7 @@ import { afterAll, beforeEach, describe, expect, test } from "bun:test";
30
30
 
31
31
  import { evictModule } from "../../plugins/surface-import.js";
32
32
  import type { HookEntry } from "../../plugins/types.js";
33
- import { getWorkspacePluginsDir } from "../../util/platform.js";
33
+ import { getWorkspacePluginsDir } from "../../util/layout.js";
34
34
  import {
35
35
  collectUserHookEntries,
36
36
  evictHooksForOwner,
@@ -69,12 +69,12 @@ import {
69
69
  withTimeout,
70
70
  } from "../plugins/surface-import.js";
71
71
  import type { HookEntry } from "../plugins/types.js";
72
- import { getLogger } from "../util/logger.js";
73
72
  import {
74
73
  getWorkspaceDir,
75
74
  getWorkspaceHooksDir,
76
75
  getWorkspacePluginsDir,
77
- } from "../util/platform.js";
76
+ } from "../util/layout.js";
77
+ import { getLogger } from "../util/logger.js";
78
78
  import { APP_VERSION } from "../version.js";
79
79
 
80
80
  const log = getLogger("hook-loader");
@@ -26,7 +26,7 @@ mock.module("../public-ingress-urls.js", () => ({
26
26
  }));
27
27
 
28
28
  mock.module("../../config/loader.js", () => ({
29
- loadConfig: () => ({}),
29
+ getConfig: () => ({}),
30
30
  }));
31
31
 
32
32
  const {
@@ -51,7 +51,7 @@ describe("resolveMcpOAuthClientMetadataUrl", () => {
51
51
  test("returns undefined for a callback served somewhere else", () => {
52
52
  expect(
53
53
  resolveMcpOAuthClientMetadataUrl(
54
- "https://platform.example/v1/gateway/callbacks/assistant-123/webhooks/oauth/callback",
54
+ "https://test-cloud.mycadet.ai/v1/gateway/callbacks/assistant-123/webhooks/oauth/callback",
55
55
  ),
56
56
  ).toBeUndefined();
57
57
  });
@@ -16,7 +16,7 @@
16
16
  * for plugin ingress.
17
17
  */
18
18
 
19
- import { loadConfig } from "../config/loader.js";
19
+ import { getConfig } from "../config/loader.js";
20
20
  import { resolveCallbackUrl } from "./cloud-callback-registration.js";
21
21
  import {
22
22
  getMcpOAuthClientMetadataUrl,
@@ -57,7 +57,7 @@ const OAUTH_REGISTRATION_TYPE = "oauth";
57
57
  */
58
58
  export async function resolveOauthCallbackUrl(): Promise<string> {
59
59
  return resolveCallbackUrl(
60
- () => getOAuthCallbackUrl(loadConfig()),
60
+ () => getOAuthCallbackUrl(getConfig()),
61
61
  OAUTH_CALLBACK_PATH,
62
62
  OAUTH_REGISTRATION_TYPE,
63
63
  );
@@ -77,7 +77,7 @@ export function resolveMcpOAuthClientMetadataUrl(
77
77
  redirectUrl: string,
78
78
  ): string | undefined {
79
79
  try {
80
- const config = loadConfig();
80
+ const config = getConfig();
81
81
  if (getOAuthCallbackUrl(config) !== redirectUrl) {
82
82
  return undefined;
83
83
  }
@@ -12,7 +12,7 @@ import { join } from "node:path";
12
12
  import { afterEach, beforeEach, describe, expect, test } from "bun:test";
13
13
 
14
14
  import { initializeDb } from "../../persistence/db-init.js";
15
- import { getWorkspaceDir } from "../../util/platform.js";
15
+ import { getWorkspaceDir } from "../../util/layout.js";
16
16
  import { AssistantIpcServer } from "../assistant-server.js";
17
17
  import { cliIpcCall } from "../cli-client.js";
18
18
 
@@ -1,6 +1,6 @@
1
1
  import { resolveIpcEndpoint } from "@mycadet/ipc-server-utils";
2
2
 
3
- import { getWorkspaceDir } from "../util/platform.js";
3
+ import { getWorkspaceDir } from "../util/layout.js";
4
4
 
5
5
  export function resolveIpcSocketPath(socketName: string): {
6
6
  path: string;
@@ -13,7 +13,7 @@ import {
13
13
  import { getDb } from "../../persistence/db-connection.js";
14
14
  import { initializeDb } from "../../persistence/db-init.js";
15
15
  import { rawAll, rawGet, rawRun } from "../../persistence/raw-query.js";
16
- import { getWorkspaceDir } from "../../util/platform.js";
16
+ import { getWorkspaceDir } from "../../util/layout.js";
17
17
  import type { LiveVoiceAudioArtifactMetadata } from "../live-voice-archive.js";
18
18
  import {
19
19
  archiveLiveVoiceAssistantResponseAudio,
@@ -30,7 +30,7 @@ import {
30
30
  unregisterSkillTools,
31
31
  } from "../../tools/registry.js";
32
32
  import { finalizeTool } from "../../tools/tool-defaults.js";
33
- import { getWorkspaceSkillsDir } from "../../util/platform.js";
33
+ import { getWorkspaceSkillsDir } from "../../util/layout.js";
34
34
  import type { LiveVoiceContinuationJudge } from "../continuation-judge.js";
35
35
  import type { LiveVoiceContinuationLabeler } from "../continuation-label.js";
36
36
  import type { LiveVoiceAudioArchiveResult } from "../live-voice-archive.js";
@@ -75,10 +75,6 @@ import type {
75
75
  } from "../daemon/conversation-mode-session.js";
76
76
  import { isRefusedInReadOnlyPass } from "../daemon/conversation-tool-setup.js";
77
77
  import type { TrustContext } from "../daemon/trust-context-types.js";
78
- import {
79
- recordLiveVoiceSessionEnded,
80
- recordLiveVoiceSessionStarted,
81
- } from "../onboarding/onboarding-events-store.js";
82
78
  import { isInstalledStaticSkillLoad } from "../permissions/checker.js";
83
79
  import {
84
80
  attachmentExists,
@@ -113,11 +109,6 @@ import type {
113
109
  } from "../stt/types.js";
114
110
  import { getSubagentManager } from "../subagent/index.js";
115
111
  import type { SubagentParentNotification } from "../subagent/parent-notification.js";
116
- import {
117
- liveVoiceEndScreen,
118
- liveVoiceSilenceReason,
119
- liveVoiceStartScreen,
120
- } from "../telemetry/live-voice-funnel.js";
121
112
  import { getTool, getToolOwner } from "../tools/registry.js";
122
113
  import { resolveSkillExecuteInvocation } from "../tools/skills/resolve-execute-invocation.js";
123
114
  import {
@@ -1250,13 +1241,8 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
1250
1241
  * teardown has already destroyed by then: `state` has moved on, the current
1251
1242
  * utterance is gone, and the turn detector is disposed.
1252
1243
  *
1253
- * A quarter of sessions end with no turn at all, and these three booleans are
1254
- * what separate a microphone that never opened from one that was muted from a
1255
- * user who simply left. See `telemetry/live-voice-funnel.ts`.
1244
+ * A quarter of sessions end with no turn at all.
1256
1245
  */
1257
- private reachedActive = false;
1258
- private receivedAudio = false;
1259
- private detectedSpeech = false;
1260
1246
  private dispatchedTurn = false;
1261
1247
  // Loudest server-VAD chunk not attributed to assistant playback, on the
1262
1248
  // gate's own scale. Logged with a silent session's end so `no_speech` can
@@ -1591,18 +1577,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
1591
1577
  return;
1592
1578
  }
1593
1579
 
1594
- // Before the preflight, not after: a session rejected for missing
1595
- // credentials is precisely the one the failure rate needs to count, and
1596
- // recording the start only once `ready` goes out would hide every such
1597
- // session from both the numerator and the denominator.
1598
- recordLiveVoiceSessionStarted({
1599
- sessionId: this.context.sessionId,
1600
- screen: liveVoiceStartScreen(
1601
- this.context.startFrame.client,
1602
- this.context.startFrame.entry,
1603
- ),
1604
- });
1605
-
1606
1580
  if (this.resolveCredentialReadiness) {
1607
1581
  const readiness = await this.resolveCredentialReadiness();
1608
1582
  if (readiness.status === "not-ready") {
@@ -1644,7 +1618,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
1644
1618
  // through the pending/pre-roll paths and flushes on arm. An arm failure
1645
1619
  // surfaces as a non-recoverable error frame instead of a start rejection.
1646
1620
  this.state = "active";
1647
- this.reachedActive = true;
1648
1621
  if (this.turnDetector) {
1649
1622
  this.logInputDiagnostic("voice_input_started");
1650
1623
  }
@@ -2140,33 +2113,7 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
2140
2113
  });
2141
2114
  }
2142
2115
 
2143
- // Recorded first, and independently of `shouldEmitSessionEndMetrics`
2144
- // below: that flag governs the client-facing `metrics` frame, and a
2145
- // failed session (which suppresses the frame) is the one whose end
2146
- // telemetry matters most. Session duration downstream is this row's
2147
- // `recorded_at` minus the started row's, so it must be written before the
2148
- // teardown below, which waits for the active turn and can run long.
2149
- const failed = this.state === "failed";
2150
- // Only a session that never dispatched a turn gets a silence reason; for
2151
- // every other session the question is meaningless.
2152
- const silenceReason = this.dispatchedTurn
2153
- ? null
2154
- : liveVoiceSilenceReason({
2155
- reachedActive: this.reachedActive,
2156
- audioInput: this.audioInput,
2157
- receivedAudio: this.receivedAudio,
2158
- detectedSpeech: this.detectedSpeech,
2159
- });
2160
- recordLiveVoiceSessionEnded({
2161
- sessionId: this.context.sessionId,
2162
- screen: liveVoiceEndScreen(
2163
- reason,
2164
- failed ? this.failureCode : null,
2165
- silenceReason,
2166
- ),
2167
- outcome: failed ? "failed" : "completed",
2168
- });
2169
- if (silenceReason !== null) {
2116
+ if (!this.dispatchedTurn) {
2170
2117
  // The levels behind a silent session, on the gate's scale, since the
2171
2118
  // end event carries only the classification. A peak below `speechGate`
2172
2119
  // on a `no_speech` session is a microphone the gate could not hear.
@@ -2174,7 +2121,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
2174
2121
  {
2175
2122
  sessionId: this.context.sessionId,
2176
2123
  reason,
2177
- silenceReason,
2178
2124
  peakChunkAmplitude: Math.round(this.peakChunkAmplitude),
2179
2125
  noiseFloor:
2180
2126
  this.roomNoiseFloor.floor === null
@@ -2527,12 +2473,10 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
2527
2473
  // early returns below. The question it answers is "did the microphone ever
2528
2474
  // open", which a chunk arriving at all settles regardless of what the
2529
2475
  // session then does with it.
2530
- this.receivedAudio = true;
2531
2476
  // A text-only session armed no transcriber, so there is nothing downstream
2532
2477
  // to route this into. Dropped rather than errored: the client was told on
2533
2478
  // `ready` that the microphone leg is dead, and a client still streaming is
2534
- // one that has not caught up, not one to end the session over. The flag
2535
- // above is still set, so telemetry keeps seeing that the mic did open.
2479
+ // one that has not caught up, not one to end the session over.
2536
2480
  if (!this.audioInput) {
2537
2481
  return;
2538
2482
  }
@@ -2554,10 +2498,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
2554
2498
  // The chunk belongs to an utterance the user is still holding the button
2555
2499
  // for, whether or not the transcriber has produced any text for it yet.
2556
2500
  utterance.manualAudioCaptured = true;
2557
- // Manual sessions have no VAD, so the user holding the talk button is
2558
- // the only speech signal available. Without this every abandoned manual
2559
- // session would be misfiled as `no_turn` instead of `no_speech`.
2560
- this.detectedSpeech = true;
2561
2501
  this.collectUserAudio(utterance, chunk);
2562
2502
  if (utterance.phase === "pending") {
2563
2503
  // The transcriber is still arming (session start overlaps the STT
@@ -2798,7 +2738,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
2798
2738
  // resets it.
2799
2739
  if (hasSpeech || this.vadPreRollHasSpeech) {
2800
2740
  utterance.speechRouted = true;
2801
- this.detectedSpeech = true;
2802
2741
  }
2803
2742
  for (const preRollChunk of this.takeVadPreRoll()) {
2804
2743
  await this.routeVadAudio(utterance, preRollChunk);
@@ -3110,7 +3049,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
3110
3049
  if (preRollHadSpeech) {
3111
3050
  utterance.preDialBargeInGuard = preRollBargeInGuard;
3112
3051
  utterance.speechRouted = true;
3113
- this.detectedSpeech = true;
3114
3052
  }
3115
3053
  }
3116
3054
 
@@ -4917,7 +4855,6 @@ export class LiveVoiceSession implements LiveVoiceSessionContract {
4917
4855
  }
4918
4856
  if (this.providerTurnStartActive) {
4919
4857
  utterance.speechRouted = true;
4920
- this.detectedSpeech = true;
4921
4858
  this.markSpeechStart(utterance);
4922
4859
  this.handleSpeechStart("provider");
4923
4860
  }
@@ -20,7 +20,7 @@ import { join } from "node:path";
20
20
  import { beforeEach, describe, expect, test } from "bun:test";
21
21
 
22
22
  import type { McpConfig } from "../../config/schemas/mcp.js";
23
- import { getWorkspacePluginsDir } from "../../util/platform.js";
23
+ import { getWorkspacePluginsDir } from "../../util/layout.js";
24
24
  import {
25
25
  buildEffectiveMcpConfig,
26
26
  pluginMcpServersChangedSinceLastBuild,