@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
@@ -23,7 +23,7 @@ mock.module(
23
23
  );
24
24
 
25
25
  // ── Config ──────────────────────────────────────────────────────────
26
- // These tests run against the real config loader. `loadConfig()` returns the
26
+ // These tests run against the real config loader. `getConfig()` returns the
27
27
  // loader's live cached object, so tests set TTS/ingress fields by mutating it
28
28
  // in place; `beforeEach` restores the fields the tests touch. The workspace
29
29
  // config file itself is seeded once below (memory off, ingress base URL).
@@ -58,7 +58,7 @@ mock.module("../../config/cloud-speech-defaults.js", () => ({
58
58
  resolveEffectiveSpeechProviders: async (config?: {
59
59
  services: { stt: { provider: string }; tts: { provider: string } };
60
60
  }) => {
61
- const services = (config ?? loadConfig()).services;
61
+ const services = (config ?? getConfig()).services;
62
62
  return { stt: services.stt.provider, tts: services.tts.provider };
63
63
  },
64
64
  }));
@@ -230,7 +230,7 @@ registerTestTtsProviders();
230
230
  import { resetDbForTesting } from "../../__tests__/db-test-helpers.js";
231
231
  import { createGuardianBinding } from "../../__tests__/helpers/create-guardian-binding.js";
232
232
  import { setConfig } from "../../__tests__/helpers/set-config.js";
233
- import { loadConfig } from "../../config/loader.js";
233
+ import { getConfig } from "../../config/loader.js";
234
234
  import type {
235
235
  VoiceFrontModelConfig,
236
236
  VoiceProgressConfig,
@@ -432,7 +432,6 @@ function setupController(
432
432
  ) {
433
433
  ensureConversation("conv-ctrl-test");
434
434
  const session = createCallSession({
435
- direction: "inbound",
436
435
  conversationId: "conv-ctrl-test",
437
436
  provider: "twilio",
438
437
  fromNumber: "+15551111111",
@@ -484,7 +483,6 @@ function setupControllerWithOrigin(task?: string) {
484
483
  ensureConversation("conv-ctrl-voice");
485
484
  ensureConversation("conv-ctrl-origin");
486
485
  const session = createCallSession({
487
- direction: "inbound",
488
486
  conversationId: "conv-ctrl-voice",
489
487
  provider: "twilio",
490
488
  fromNumber: "+15551111111",
@@ -519,7 +517,7 @@ describe("call-controller", () => {
519
517
  mockEndCallListenWindowMs = 0;
520
518
  mockEndCallDrainMaxWaitMs = 15_000;
521
519
  // Reset TTS config to defaults so per-test mutations don't leak.
522
- const cfg = loadConfig();
520
+ const cfg = getConfig();
523
521
  cfg.services.tts.provider = "elevenlabs";
524
522
  cfg.services.tts.providers["fish-audio"].referenceId = "";
525
523
  cfg.ingress.publicBaseUrl = "https://generic.example.com";
@@ -2966,7 +2964,7 @@ describe("call-controller", () => {
2966
2964
  });
2967
2965
 
2968
2966
  test("synthesized provider: if synthesis fails before first chunk, falls back to text-token speech without sending play URL", async () => {
2969
- const cfg = loadConfig();
2967
+ const cfg = getConfig();
2970
2968
  cfg.services.tts.provider = "fish-audio";
2971
2969
  cfg.services.tts.providers["fish-audio"].referenceId = "fish-ref-123";
2972
2970
 
@@ -3016,7 +3014,7 @@ describe("call-controller", () => {
3016
3014
  });
3017
3015
 
3018
3016
  test("synthesized provider: a superseded run does not emit native fallback text", async () => {
3019
- const cfg = loadConfig();
3017
+ const cfg = getConfig();
3020
3018
  cfg.services.tts.provider = "fish-audio";
3021
3019
  cfg.services.tts.providers["fish-audio"].referenceId = "fish-ref-123";
3022
3020
 
@@ -3075,7 +3073,7 @@ describe("call-controller", () => {
3075
3073
  });
3076
3074
 
3077
3075
  test("synthesized provider: play URL uses public base URL", async () => {
3078
- const cfg = loadConfig();
3076
+ const cfg = getConfig();
3079
3077
  cfg.ingress.publicBaseUrl = "https://twilio.example.com/";
3080
3078
  cfg.services.tts.provider = "fish-audio";
3081
3079
  cfg.services.tts.providers["fish-audio"].referenceId = "fish-ref-123";
@@ -3119,7 +3117,7 @@ describe("call-controller", () => {
3119
3117
  });
3120
3118
 
3121
3119
  test("synthesized provider: stays 'processing' during synthesis latency until the play URL is sent", async () => {
3122
- const cfg = loadConfig();
3120
+ const cfg = getConfig();
3123
3121
  cfg.services.tts.provider = "fish-audio";
3124
3122
  cfg.services.tts.providers["fish-audio"].referenceId = "fish-ref-123";
3125
3123
 
@@ -3175,7 +3173,7 @@ describe("call-controller", () => {
3175
3173
  });
3176
3174
 
3177
3175
  test("synthesized provider: a superseded turn does not send a stale play URL", async () => {
3178
- const cfg = loadConfig();
3176
+ const cfg = getConfig();
3179
3177
  cfg.services.tts.provider = "fish-audio";
3180
3178
  cfg.services.tts.providers["fish-audio"].referenceId = "fish-ref-123";
3181
3179
 
@@ -3226,7 +3224,7 @@ describe("call-controller", () => {
3226
3224
  });
3227
3225
 
3228
3226
  test("synthesized provider: a turn error cancels the queued synthesis chain so no stale speech follows the recovery prompt", async () => {
3229
- const cfg = loadConfig();
3227
+ const cfg = getConfig();
3230
3228
  cfg.services.tts.provider = "fish-audio";
3231
3229
  cfg.services.tts.providers["fish-audio"].referenceId = "fish-ref-123";
3232
3230
 
@@ -3328,7 +3326,7 @@ describe("call-controller", () => {
3328
3326
  });
3329
3327
 
3330
3328
  test("Deepgram selected path resolves useSynthesizedPath to true", async () => {
3331
- const cfg = loadConfig();
3329
+ const cfg = getConfig();
3332
3330
  cfg.services.tts.provider = "deepgram";
3333
3331
 
3334
3332
  const result = await resolveCallTtsProvider();
@@ -3338,7 +3336,7 @@ describe("call-controller", () => {
3338
3336
  });
3339
3337
 
3340
3338
  test("Deepgram synthesis failure does NOT fall back to native token TTS", async () => {
3341
- const cfg = loadConfig();
3339
+ const cfg = getConfig();
3342
3340
  cfg.services.tts.provider = "deepgram";
3343
3341
 
3344
3342
  _resetTtsProviderOverridesForTests();
@@ -3386,7 +3384,7 @@ describe("call-controller", () => {
3386
3384
  });
3387
3385
 
3388
3386
  test("Fish Audio synthesis failure still falls back to native token TTS (unchanged behavior)", async () => {
3389
- const cfg = loadConfig();
3387
+ const cfg = getConfig();
3390
3388
  cfg.services.tts.provider = "fish-audio";
3391
3389
  cfg.services.tts.providers["fish-audio"].referenceId = "fish-ref-abc";
3392
3390
 
@@ -3439,7 +3437,7 @@ describe("call-controller", () => {
3439
3437
  onChunk: (chunk: Buffer) => void,
3440
3438
  ) => Promise<void>;
3441
3439
  }): { synthesizedTexts: string[] } {
3442
- const cfg = loadConfig();
3440
+ const cfg = getConfig();
3443
3441
  cfg.services.tts.provider = "fish-audio";
3444
3442
  cfg.services.tts.providers["fish-audio"].referenceId = "fish-ref-123";
3445
3443
 
@@ -3548,7 +3546,7 @@ describe("call-controller", () => {
3548
3546
  function registerDeepgramRequestRecorder(): {
3549
3547
  requests: Array<{ voiceId?: string; language?: string }>;
3550
3548
  } {
3551
- const cfg = loadConfig();
3549
+ const cfg = getConfig();
3552
3550
  cfg.services.tts.provider = "deepgram";
3553
3551
 
3554
3552
  _resetTtsProviderOverridesForTests();
@@ -3572,7 +3570,7 @@ describe("call-controller", () => {
3572
3570
  }
3573
3571
 
3574
3572
  test("synthesized provider: a configured languageVoices entry for the call language rides the request as voiceId", async () => {
3575
- const cfg = loadConfig();
3573
+ const cfg = getConfig();
3576
3574
  cfg.services.tts.providers.deepgram.languageVoices = {
3577
3575
  hi: "aura-2-hindi-voice",
3578
3576
  };
@@ -3598,7 +3596,7 @@ describe("call-controller", () => {
3598
3596
  });
3599
3597
 
3600
3598
  test("synthesized provider: no voiceId when languageVoices has no entry for the call language", async () => {
3601
- const cfg = loadConfig();
3599
+ const cfg = getConfig();
3602
3600
  cfg.services.tts.providers.deepgram.languageVoices = {
3603
3601
  hi: "aura-2-hindi-voice",
3604
3602
  };
@@ -3996,7 +3994,7 @@ describe("call-controller", () => {
3996
3994
  fishTexts: string[];
3997
3995
  fallbackTexts: string[];
3998
3996
  } {
3999
- const cfg = loadConfig();
3997
+ const cfg = getConfig();
4000
3998
  cfg.services.tts.provider = "fish-audio";
4001
3999
  cfg.services.tts.providers["fish-audio"].referenceId = "fish-ref-123";
4002
4000
 
@@ -4186,7 +4184,7 @@ describe("call-controller", () => {
4186
4184
  test("returns fallback when the configured provider is not in the catalog", async () => {
4187
4185
  // The schema enum rejects unknown providers, so this state can only be
4188
4186
  // produced by mutating the loader's cached config directly.
4189
- const cfg = loadConfig();
4187
+ const cfg = getConfig();
4190
4188
  (cfg.services.tts as { provider: string }).provider =
4191
4189
  "not-a-real-provider";
4192
4190
 
@@ -4197,7 +4195,7 @@ describe("call-controller", () => {
4197
4195
  });
4198
4196
 
4199
4197
  test("degrades fish-audio synthesized path when referenceId is missing", async () => {
4200
- const cfg = loadConfig();
4198
+ const cfg = getConfig();
4201
4199
  cfg.services.tts.provider = "fish-audio";
4202
4200
  cfg.services.tts.providers["fish-audio"].referenceId = "";
4203
4201
 
@@ -4226,7 +4224,7 @@ describe("call-controller", () => {
4226
4224
  });
4227
4225
 
4228
4226
  test("returns synthesized path with deepgram provider", async () => {
4229
- const cfg = loadConfig();
4227
+ const cfg = getConfig();
4230
4228
  cfg.services.tts.provider = "deepgram";
4231
4229
 
4232
4230
  const result = await resolveCallTtsProvider();
@@ -4239,7 +4237,7 @@ describe("call-controller", () => {
4239
4237
  test("Deepgram does not apply fish-audio referenceId gate", async () => {
4240
4238
  // Deepgram has no referenceId requirement. Verify the fish-audio
4241
4239
  // config gate does not apply to deepgram resolution.
4242
- const cfg = loadConfig();
4240
+ const cfg = getConfig();
4243
4241
  cfg.services.tts.provider = "deepgram";
4244
4242
  // fish-audio referenceId left empty — should not affect deepgram.
4245
4243
  cfg.services.tts.providers["fish-audio"].referenceId = "";
@@ -5163,7 +5161,7 @@ describe("call-controller", () => {
5163
5161
  function endpointingConfig(
5164
5162
  overrides: Partial<VoiceFrontModelConfig> = {},
5165
5163
  ): VoiceFrontModelConfig {
5166
- return { ...loadConfig().voice.frontModel, ...overrides };
5164
+ return { ...getConfig().voice.frontModel, ...overrides };
5167
5165
  }
5168
5166
 
5169
5167
  /**
@@ -5306,7 +5304,7 @@ describe("call-controller", () => {
5306
5304
  // A provider that has gone quiet past its commit window plus the
5307
5305
  // margin is gone, not slow, so the interim text is the only record of
5308
5306
  // what the caller said.
5309
- loadConfig().calls.voice.utteranceEndMs = 5;
5307
+ getConfig().calls.voice.utteranceEndMs = 5;
5310
5308
  const { controller } = setupController(undefined, {
5311
5309
  frontModelConfig: endpointingConfig({ endpointExtensionMs: 20 }),
5312
5310
  });
@@ -5323,7 +5321,7 @@ describe("call-controller", () => {
5323
5321
 
5324
5322
  test("interim words re-arm the replay so it fires only once the caller stops", async () => {
5325
5323
  const { legs } = mockHoldingBridge();
5326
- loadConfig().calls.voice.utteranceEndMs = 5;
5324
+ getConfig().calls.voice.utteranceEndMs = 5;
5327
5325
  const { controller } = setupController(undefined, {
5328
5326
  frontModelConfig: endpointingConfig({ endpointExtensionMs: 60 }),
5329
5327
  });
@@ -9,8 +9,8 @@ import {
9
9
  } from "node:fs";
10
10
  import { dirname, join } from "node:path";
11
11
 
12
+ import { getWorkspaceDir } from "../util/layout.js";
12
13
  import { getLogger } from "../util/logger.js";
13
- import { getWorkspaceDir } from "../util/platform.js";
14
14
  import { isTerminalState } from "./call-state-machine.js";
15
15
  import type { CallSession } from "./types.js";
16
16
 
@@ -17,7 +17,7 @@ import {
17
17
  getRequestByPendingQuestionOrNull,
18
18
  listGuardianRequestDeliveriesOrEmpty,
19
19
  } from "../channels/gateway-guardian-requests.js";
20
- import { loadConfig } from "../config/loader.js";
20
+ import { getConfig } from "../config/loader.js";
21
21
  import type {
22
22
  VoiceFrontModelConfig,
23
23
  VoiceProgressConfig,
@@ -365,7 +365,7 @@ export class CallController {
365
365
  opts?.resolveSynthesisLanguage ??
366
366
  (() => resolveTelephonySynthesisLanguage());
367
367
  this.frontModelConfig =
368
- opts?.frontModelConfig ?? loadConfig().voice.frontModel;
368
+ opts?.frontModelConfig ?? getConfig().voice.frontModel;
369
369
  this.progressConfig =
370
370
  opts?.progressConfig ?? this.frontModelConfig.progress;
371
371
  this.progressNarrator =
@@ -936,7 +936,7 @@ export class CallController {
936
936
  }
937
937
  return Math.max(
938
938
  extensionMs,
939
- loadConfig().calls.voice.utteranceEndMs +
939
+ getConfig().calls.voice.utteranceEndMs +
940
940
  PROVIDER_FINAL_FALLBACK_MARGIN_MS,
941
941
  );
942
942
  }
@@ -6,7 +6,7 @@
6
6
  */
7
7
 
8
8
  import { revokeScopedApprovalGrantsForContext } from "../approvals/scoped-approval-grants.js";
9
- import { loadConfig } from "../config/loader.js";
9
+ import { getConfig } from "../config/loader.js";
10
10
  import { VALID_CALLER_IDENTITY_MODES } from "../config/schema.js";
11
11
  import type { AssistantConfig } from "../config/types.js";
12
12
  import { resolveCallbackUrl } from "../inbound/cloud-callback-registration.js";
@@ -299,7 +299,6 @@ export async function createInboundVoiceSession(
299
299
  const session = createCallSession({
300
300
  conversationId: voiceConversationId,
301
301
  provider: "twilio",
302
- direction: "inbound",
303
302
  fromNumber,
304
303
  toNumber,
305
304
  });
@@ -402,7 +401,7 @@ export async function startCall(
402
401
  let sessionId: string | null = null;
403
402
 
404
403
  try {
405
- const config = loadConfig();
404
+ const config = getConfig();
406
405
 
407
406
  // Resolve which phone number to use as caller ID
408
407
  const identityResult = await resolveCallerIdentity(
@@ -439,7 +438,6 @@ export async function startCall(
439
438
  signal?.throwIfAborted();
440
439
 
441
440
  const session = createCallSession({
442
- direction: "outbound",
443
441
  conversationId,
444
442
  provider: "twilio",
445
443
  fromNumber,
@@ -950,7 +948,7 @@ export async function startVerificationCall(
950
948
  let sessionId: string | null = null;
951
949
 
952
950
  try {
953
- const config = loadConfig();
951
+ const config = getConfig();
954
952
  const provider = new TwilioVoiceProvider();
955
953
 
956
954
  // Resolve the assistant's Twilio number as the caller ID
@@ -978,7 +976,6 @@ export async function startVerificationCall(
978
976
  });
979
977
 
980
978
  const session = createCallSession({
981
- direction: "outbound",
982
979
  conversationId,
983
980
  provider: "twilio",
984
981
  fromNumber: identityResult.fromNumber,
@@ -1083,7 +1080,7 @@ export async function startInviteCall(
1083
1080
  let sessionId: string | null = null;
1084
1081
 
1085
1082
  try {
1086
- const config = loadConfig();
1083
+ const config = getConfig();
1087
1084
  const provider = new TwilioVoiceProvider();
1088
1085
 
1089
1086
  // Resolve the assistant's Twilio number as the caller ID
@@ -1112,7 +1109,6 @@ export async function startInviteCall(
1112
1109
  });
1113
1110
 
1114
1111
  const session = createCallSession({
1115
- direction: "outbound",
1116
1112
  conversationId,
1117
1113
  provider: "twilio",
1118
1114
  fromNumber: identityResult.fromNumber,
@@ -1,10 +1,6 @@
1
- import { and, desc, eq, like, notInArray, or } from "drizzle-orm";
1
+ import { and, desc, eq, notInArray, or } from "drizzle-orm";
2
2
  import { v4 as uuid } from "uuid";
3
3
 
4
- import {
5
- recordPhoneCallEnded,
6
- recordPhoneCallStarted,
7
- } from "../onboarding/onboarding-events-store.js";
8
4
  import { getDb } from "../persistence/db-connection.js";
9
5
  import { rawChanges, rawRun } from "../persistence/raw-query.js";
10
6
  import {
@@ -12,16 +8,10 @@ import {
12
8
  callPendingQuestions,
13
9
  callSessions,
14
10
  } from "../persistence/schema/index.js";
15
- import {
16
- type PhoneCallDirection,
17
- phoneCallEndScreen,
18
- phoneCallSilenceReason,
19
- phoneCallStartScreen,
20
- } from "../telemetry/phone-call-funnel.js";
21
11
  import { getLogger } from "../util/logger.js";
22
12
  import { cast, createRowMapper } from "../util/row-mapper.js";
23
13
  import { syncActiveCallLeaseFromSession } from "./active-call-lease.js";
24
- import { isTerminalState, validateTransition } from "./call-state-machine.js";
14
+ import { validateTransition } from "./call-state-machine.js";
25
15
  import type {
26
16
  CallEvent,
27
17
  CallEventType,
@@ -95,12 +85,6 @@ export function createCallSession(opts: {
95
85
  provider: string;
96
86
  fromNumber: string;
97
87
  toNumber: string;
98
- /**
99
- * Which way the call is being placed, for the funnel stamp. Stated rather
100
- * than derived: a verification or invite call carries no task and is still
101
- * outbound, so task presence is not a direction.
102
- */
103
- direction: PhoneCallDirection;
104
88
  task?: string;
105
89
  callMode?: string;
106
90
  verificationSessionId?: string;
@@ -138,14 +122,6 @@ export function createCallSession(opts: {
138
122
  updatedAt: now,
139
123
  };
140
124
  db.insert(callSessions).values(row).run();
141
- // The call is attempted the moment its row exists, which is before the
142
- // provider dials: a call that never connects is exactly the one the funnel
143
- // needs to count. An outbound attempt the ingress preflight rejects never
144
- // reaches here; see `telemetry/phone-call-funnel.ts`.
145
- recordPhoneCallStarted({
146
- callSessionId: row.id,
147
- screen: phoneCallStartScreen(opts.direction, row.callMode),
148
- });
149
125
  return { ...row, skipDisclosure };
150
126
  }
151
127
 
@@ -248,13 +224,6 @@ export function updateCallSession(
248
224
  .where(eq(callSessions.id, id))
249
225
  .run();
250
226
 
251
- // Terminal states are immutable and the validator above rejects any write
252
- // that follows one, so the first terminal transition to get here is the only
253
- // one: the ended event needs no separate once-only latch.
254
- if (updates.status && isTerminalState(updates.status)) {
255
- recordCallEndedEvent(id, updates.status);
256
- }
257
-
258
227
  opts?.beforeLeaseSync?.();
259
228
 
260
229
  if (shouldSyncActiveLease) {
@@ -269,35 +238,6 @@ export function updateCallSession(
269
238
  }
270
239
  }
271
240
 
272
- // ── Recovery queries ─────────────────────────────────────────────────
273
-
274
- /**
275
- * Whether the call's own event log holds an event of this type. Existence
276
- * only: the row itself is never read.
277
- */
278
- function hasCallEvent(
279
- id: string,
280
- eventType: CallEventType,
281
- payloadContains?: string,
282
- ): boolean {
283
- const db = getDb();
284
- const row = db
285
- .select({ id: callEvents.id })
286
- .from(callEvents)
287
- .where(
288
- and(
289
- eq(callEvents.callSessionId, id),
290
- eq(callEvents.eventType, eventType),
291
- ...(payloadContains
292
- ? [like(callEvents.payloadJson, `%${payloadContains}%`)]
293
- : []),
294
- ),
295
- )
296
- .limit(1)
297
- .get();
298
- return row !== undefined;
299
- }
300
-
301
241
  /**
302
242
  * Emit the call's funnel end event, classifying a call that never took a
303
243
  * caller turn by how far it got. Both signals come from the call's own event
@@ -310,20 +250,6 @@ function hasCallEvent(
310
250
  * an event type of its own would be the real fix, but that vocabulary is read
311
251
  * by other consumers and is not this change's to alter.
312
252
  */
313
- function recordCallEndedEvent(id: string, status: CallStatus): void {
314
- const spoke = hasCallEvent(id, "caller_spoke", '"transcript"');
315
- const silence = spoke
316
- ? null
317
- : phoneCallSilenceReason({
318
- connected: hasCallEvent(id, "call_connected"),
319
- });
320
-
321
- recordPhoneCallEnded({
322
- callSessionId: id,
323
- screen: phoneCallEndScreen(status, silence),
324
- outcome: status === "failed" ? "failed" : "completed",
325
- });
326
- }
327
253
 
328
254
  /**
329
255
  * Returns all call sessions that are in a non-terminal state
@@ -8,7 +8,7 @@
8
8
  */
9
9
 
10
10
  import { resolveEffectiveSpeechProviders } from "../config/cloud-speech-defaults.js";
11
- import { loadConfig } from "../config/loader.js";
11
+ import { getConfig } from "../config/loader.js";
12
12
  import {
13
13
  getCatalogProvider,
14
14
  getTtsProvider,
@@ -101,7 +101,7 @@ export async function resolveCallTtsProvider(
101
101
  options?: ResolveCallTtsOptions,
102
102
  ): Promise<ResolvedCallTts> {
103
103
  try {
104
- const config = loadConfig();
104
+ const config = getConfig();
105
105
  const effectiveProviderId = await effectiveTtsProviderId(config);
106
106
  const resolved = resolveTtsConfig(config, effectiveProviderId);
107
107
 
@@ -192,7 +192,7 @@ export async function resolveCallTtsProvider(
192
192
  * silent native path.
193
193
  */
194
194
  async function effectiveTtsProviderId(
195
- config: ReturnType<typeof loadConfig>,
195
+ config: ReturnType<typeof getConfig>,
196
196
  ): Promise<TtsProviderId | undefined> {
197
197
  try {
198
198
  const { tts } = await resolveEffectiveSpeechProviders(config);
@@ -1,4 +1,4 @@
1
- import { loadConfig } from "../config/loader.js";
1
+ import { getConfig } from "../config/loader.js";
2
2
  import { credentialKey } from "../security/credential-key.js";
3
3
  import { getSecureKeyAsync } from "../security/secure-keys.js";
4
4
  import { ConfigError } from "../util/errors.js";
@@ -23,7 +23,7 @@ export interface TwilioConfig {
23
23
  */
24
24
  export function resolveTwilioPhoneNumber(): string {
25
25
  try {
26
- const config = loadConfig();
26
+ const config = getConfig();
27
27
  if (config.twilio?.phoneNumber) {
28
28
  return config.twilio.phoneNumber;
29
29
  }
@@ -35,7 +35,7 @@ export function resolveTwilioPhoneNumber(): string {
35
35
  }
36
36
 
37
37
  export async function getTwilioConfig(): Promise<TwilioConfig> {
38
- const accountSid = loadConfig().twilio?.accountSid || "";
38
+ const accountSid = getConfig().twilio?.accountSid || "";
39
39
  const authToken =
40
40
  (await getSecureKeyAsync(credentialKey("twilio", "auth_token"))) || "";
41
41
  const phoneNumber = resolveTwilioPhoneNumber();
@@ -15,7 +15,7 @@ import {
15
15
  updatePhoneNumberWebhooks as updateTwilioPhoneNumberWebhooks,
16
16
  } from "@mycadet/twilio-client";
17
17
 
18
- import { loadConfig } from "../config/loader.js";
18
+ import { getConfig } from "../config/loader.js";
19
19
  import { credentialKey } from "../security/credential-key.js";
20
20
  import { getSecureKeyAsync } from "../security/secure-keys.js";
21
21
  import { ConfigError, ProviderError } from "../util/errors.js";
@@ -28,7 +28,7 @@ export interface TwilioCredentials {
28
28
  /** Resolve the Twilio Account SID from config. */
29
29
  function resolveAccountSid(): string | undefined {
30
30
  try {
31
- const config = loadConfig();
31
+ const config = getConfig();
32
32
  return config.twilio?.accountSid || undefined;
33
33
  } catch {
34
34
  // Config may not be available during early startup
@@ -1,5 +1,5 @@
1
1
  import { getIsCloud } from "../config/env-registry.js";
2
- import { loadConfig } from "../config/loader.js";
2
+ import { getConfig } from "../config/loader.js";
3
3
  import type { AssistantConfig } from "../config/types.js";
4
4
  import { getPublicBaseUrl } from "../inbound/public-ingress-urls.js";
5
5
  import { resolveTelephonyCredentialReadiness } from "./telephony-credential-preflight.js";
@@ -31,7 +31,7 @@ function fail(error: string): VoiceIngressPreflightFailure {
31
31
  }
32
32
 
33
33
  export async function preflightVoiceIngress(): Promise<VoiceIngressPreflightResult> {
34
- const ingressConfig = loadConfig();
34
+ const ingressConfig = getConfig();
35
35
 
36
36
  // The daemon performs both STT and TTS on the media-stream transport —
37
37
  // in every deployment mode, cloud-hosted included — so credential
@@ -2,13 +2,11 @@ export interface BundledCliModules {
2
2
  configEnv: typeof import("../config/env.js");
3
3
  providerSecretCatalog: typeof import("../providers/provider-secret-catalog.js");
4
4
  pluginCatalogCache: typeof import("./lib/plugin-catalog-cache.js");
5
- pluginCatalogLocal: typeof import("./lib/plugin-catalog-local.js");
6
5
  pluginDiff: typeof import("./lib/diff-plugin.js");
7
6
  pluginInspect: typeof import("./lib/inspect-plugin.js");
8
7
  pluginInstallGitHub: typeof import("./lib/install-from-github.js");
9
8
  pluginInstallPlatform: typeof import("./lib/install-from-cloud.js");
10
9
  pluginInstalled: typeof import("./lib/list-installed-plugins.js");
11
- pluginPinHistory: typeof import("./lib/plugin-pin-history.js");
12
10
  pluginSearch: typeof import("./lib/search-plugins.js");
13
11
  pluginSurfaces: typeof import("./lib/plugin-surfaces.js");
14
12
  pluginUninstall: typeof import("./lib/uninstall-plugin.js");
@@ -10,7 +10,7 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
10
10
  import { mockIpc } from "../../../__tests__/requests-mock.js";
11
11
  import { createApp, getAppDirPath } from "../../../apps/app-store.js";
12
12
  import { writeAppSourceFingerprint } from "../../../apps/source-fingerprint.js";
13
- import { getWorkspacePluginsDir } from "../../../util/platform.js";
13
+ import { getWorkspacePluginsDir } from "../../../util/layout.js";
14
14
  import { runCliCommand } from "./cli-test-harness.js";
15
15
 
16
16
  const ipc = await mockIpc("cli");
@@ -450,45 +450,21 @@ describe("plugins install - declared-schedules consent", () => {
450
450
  expect(r.exitCode).toBe(0);
451
451
  });
452
452
 
453
- test("a bundled-catalog install (platform disabled) is gated too", async () => {
454
- process.env.CADET_DISABLE_CLOUD = "true";
453
+ test("a name install absent from the catalog refuses before anything runs", async () => {
454
+ // A name needs the cloud catalog to resolve; an unclaimed name refuses
455
+ // before any install machinery runs.
455
456
  stageFixture = writeScheduleFixture;
456
457
  confirmResults = ["confirmed"];
457
458
 
458
459
  const r = await runCommand(["plugins", "install", "caveman"]);
459
460
 
460
461
  expect(platformInstallCalls.length).toBe(0);
461
- expect(installPluginCalls.length).toBe(1);
462
- expect(installPluginCalls[0]!.trustedSource).toBeDefined();
463
- expect(confirmCalls.length).toBe(1);
464
- expect(r.stdout).toContain('Plugin "caveman" declares 2 schedules:');
465
- expect(r.exitCode).toBe(0);
466
- });
467
-
468
- test("a local catalog source bypasses the cloud installer", async () => {
469
- catalogMatches = [
470
- {
471
- name: "fathom",
472
- path: "local:plugins/mcp-catalog/fathom@1.0.0",
473
- category: "productivity",
474
- source: {
475
- kind: "local",
476
- path: "plugins/mcp-catalog/fathom",
477
- version: "1.0.0",
478
- },
479
- },
480
- ];
481
-
482
- const r = await runCommand(["plugins", "install", "fathom"]);
483
-
484
- expect(platformInstallCalls).toHaveLength(0);
485
- expect(installPluginCalls).toHaveLength(1);
486
- expect(installPluginCalls[0]?.trustedSource).toEqual({
487
- kind: "local",
488
- path: "plugins/mcp-catalog/fathom",
489
- version: "1.0.0",
490
- });
491
- expect(r.exitCode).toBe(0);
462
+ expect(installPluginCalls.length).toBe(0);
463
+ expect(confirmCalls.length).toBe(0);
464
+ expect(r.stdout + r.stderr).toContain(
465
+ 'Plugin "caveman" is not in the marketplace catalog.',
466
+ );
467
+ expect(r.exitCode).toBe(1);
492
468
  });
493
469
 
494
470
  test("falls back to the cloud installer when catalog discovery fails", async () => {
@@ -781,39 +757,6 @@ describe("plugins inspect - schedules surface", () => {
781
757
  expect(r.stdout).toContain("weekly RRULE:FREQ=WEEKLY;BYDAY=MO (execute)");
782
758
  expect(r.exitCode).toBe(0);
783
759
  });
784
-
785
- test("renders a bundled package location without a GitHub URL", async () => {
786
- inspectResult = {
787
- ...inspectionWithSurfaces({
788
- skills: [],
789
- hooks: [],
790
- tools: [],
791
- schedules: [],
792
- }),
793
- installed: false,
794
- status: "not-installed",
795
- local: null,
796
- remote: {
797
- kind: "local",
798
- repo: "",
799
- path: "plugins/mcp-catalog/fathom",
800
- commit: "1.0.0",
801
- committedAt: null,
802
- description: null,
803
- homepage: null,
804
- license: null,
805
- category: "productivity",
806
- marketplaceRef: "main",
807
- version: "1.0.0",
808
- },
809
- };
810
-
811
- const r = await runCommand(["plugins", "inspect", "fathom"]);
812
-
813
- expect(r.stdout).toContain("bundled:plugins/mcp-catalog/fathom");
814
- expect(r.stdout).not.toContain("https://github.com//");
815
- expect(r.exitCode).toBe(0);
816
- });
817
760
  });
818
761
 
819
762
  describe("plugins install - setup skill hint", () => {