@mycadet/assistant 0.12.9 → 0.12.10

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