@mycadet/assistant 0.12.9 → 0.12.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (658) hide show
  1. package/Dockerfile +0 -8
  2. package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +1 -1
  3. package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
  4. package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
  5. package/node_modules/@mycadet/ces-client/src/http-credentials.ts +18 -1
  6. package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
  7. package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
  8. package/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
  9. package/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
  10. package/openapi.yaml +62 -910
  11. package/package.json +3 -7
  12. package/scripts/build-test-fixtures.ts +1 -1
  13. package/scripts/generate-openapi.ts +22 -6
  14. package/scripts/postinstall.ts +4 -10
  15. package/scripts/run-tests.ts +0 -21
  16. package/src/__tests__/adaptive-thinking-repair.test.ts +19 -57
  17. package/src/__tests__/agent-loop.test.ts +0 -76
  18. package/src/__tests__/anthropic-provider.test.ts +6 -6
  19. package/src/__tests__/assert-not-live-db.ts +1 -1
  20. package/src/__tests__/assistant-id-boundary-guard.test.ts +3 -3
  21. package/src/__tests__/attachments-store-heic-normalize.test.ts +1 -1
  22. package/src/__tests__/attachments-store.test.ts +1 -1
  23. package/src/__tests__/audit-log-rotation.test.ts +1 -1
  24. package/src/__tests__/btw-routes.test.ts +1 -1
  25. package/src/__tests__/byok-default-profile-ensure.test.ts +21 -27
  26. package/src/__tests__/call-conversation-messages.test.ts +0 -5
  27. package/src/__tests__/call-recovery.test.ts +2 -7
  28. package/src/__tests__/call-routes-http.test.ts +0 -12
  29. package/src/__tests__/call-store.test.ts +2 -7
  30. package/src/__tests__/catalog-files.test.ts +7 -5
  31. package/src/__tests__/checker.test.ts +1 -1
  32. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +4 -4
  33. package/src/__tests__/cloud-client-verify-credential.test.ts +0 -4
  34. package/src/__tests__/cloud-credential-catalog-cli.test.ts +14 -14
  35. package/src/__tests__/cloud-profile-guard.test.ts +87 -404
  36. package/src/__tests__/compaction-events.test.ts +2 -2
  37. package/src/__tests__/config-loader-backfill.test.ts +74 -163
  38. package/src/__tests__/config-loader-cloud-defaults.test.ts +11 -11
  39. package/src/__tests__/config-loader-corrupt.test.ts +10 -10
  40. package/src/__tests__/config-loader-quarantine-notice.test.ts +7 -7
  41. package/src/__tests__/config-loader-validation-reset-notice.test.ts +11 -11
  42. package/src/__tests__/config-schema.test.ts +26 -27
  43. package/src/__tests__/config-set-route.test.ts +2 -6
  44. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +28 -300
  45. package/src/__tests__/conversation-agent-loop-overflow.test.ts +39 -246
  46. package/src/__tests__/conversation-agent-loop.test.ts +2 -58
  47. package/src/__tests__/conversation-clear-safety.test.ts +0 -30
  48. package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
  49. package/src/__tests__/conversation-queue.test.ts +1 -1
  50. package/src/__tests__/conversation-runtime-assembly.test.ts +1 -1
  51. package/src/__tests__/conversation-skill-tools.test.ts +4 -444
  52. package/src/__tests__/conversation-slash-commands.test.ts +1 -1
  53. package/src/__tests__/conversation-store.test.ts +1 -84
  54. package/src/__tests__/conversation-surface-state.test.ts +0 -16
  55. package/src/__tests__/credential-health-service.test.ts +14 -1
  56. package/src/__tests__/credential-record-retire.test.ts +1 -1
  57. package/src/__tests__/credential-record-write-through.test.ts +1 -1
  58. package/src/__tests__/credential-security-invariants.test.ts +0 -145
  59. package/src/__tests__/custom-profile-ensure.test.ts +1 -1
  60. package/src/__tests__/default-profile-catalog-fallback.test.ts +5 -15
  61. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -2
  62. package/src/__tests__/dictation-profile-store.test.ts +6 -6
  63. package/src/__tests__/disk-usage.test.ts +28 -164
  64. package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -1
  65. package/src/__tests__/embedding-cloud-proxy-selection.test.ts +1 -1
  66. package/src/__tests__/emit-event-signal.test.ts +1 -1
  67. package/src/__tests__/gateway-client-cloud-outbound.test.ts +3 -3
  68. package/src/__tests__/gateway-only-enforcement.test.ts +1 -1
  69. package/src/__tests__/guardian-dispatch.test.ts +0 -13
  70. package/src/__tests__/helpers/seed-app.ts +1 -1
  71. package/src/__tests__/host-cu-routes-targeted.test.ts +1 -1
  72. package/src/__tests__/host-shell-tool.test.ts +1 -1
  73. package/src/__tests__/identity-routes.test.ts +1 -1
  74. package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
  75. package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
  76. package/src/__tests__/injector-chain.test.ts +1 -1
  77. package/src/__tests__/injector-config-quarantine-notice.test.ts +1 -1
  78. package/src/__tests__/injector-config-validation-reset-notice.test.ts +1 -1
  79. package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
  80. package/src/__tests__/{platform.test.ts → layout.test.ts} +1 -1
  81. package/src/__tests__/list-all-apps.test.ts +1 -1
  82. package/src/__tests__/live-workspace-guard.test.ts +2 -2
  83. package/src/__tests__/llm-resolver-override-or-default.test.ts +5 -6
  84. package/src/__tests__/llm-resolver.test.ts +7 -7
  85. package/src/__tests__/llm-schema-fallback-profile.test.ts +9 -10
  86. package/src/__tests__/llm-usage-store.test.ts +0 -495
  87. package/src/__tests__/log-export-routes.test.ts +1 -1
  88. package/src/__tests__/mcp-config-secret-boundary.test.ts +12 -53
  89. package/src/__tests__/mcp-list-plugin-servers.test.ts +1 -1
  90. package/src/__tests__/memory-config-file-parity.test.ts +1 -1
  91. package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
  92. package/src/__tests__/messages-read-boundary-guard.test.ts +0 -2
  93. package/src/__tests__/notification-guardian-path.test.ts +0 -7
  94. package/src/__tests__/onboarding-persona-write.test.ts +1 -1
  95. package/src/__tests__/openai-provider.test.ts +8 -8
  96. package/src/__tests__/path-policy.test.ts +1 -1
  97. package/src/__tests__/persona-resolver.test.ts +1 -1
  98. package/src/__tests__/plugin-app-serve-routes.test.ts +1 -1
  99. package/src/__tests__/plugin-effective-enabled-set.test.ts +1 -1
  100. package/src/__tests__/plugin-import-boundary-guard.test.ts +4 -6
  101. package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -3
  102. package/src/__tests__/provider-cloud-proxy-integration.test.ts +1 -5
  103. package/src/__tests__/provider-connections-backfill.test.ts +10 -10
  104. package/src/__tests__/prune-old-conversations-job.test.ts +6 -31
  105. package/src/__tests__/resolve-app.test.ts +1 -1
  106. package/src/__tests__/run-due-schedules.test.ts +1 -1
  107. package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -53
  108. package/src/__tests__/schedule-routes.test.ts +1 -1
  109. package/src/__tests__/schedule-store.test.ts +1 -1
  110. package/src/__tests__/secret-routes-cloud-proxy.test.ts +1 -1
  111. package/src/__tests__/skill-load-plugin-scope.test.ts +1 -1
  112. package/src/__tests__/surface-completion-compaction-boundary.test.ts +1 -1
  113. package/src/__tests__/tool-approval-handler.test.ts +1 -1
  114. package/src/__tests__/tool-audit.test.ts +5 -235
  115. package/src/__tests__/tool-executor-lifecycle-events.test.ts +54 -114
  116. package/src/__tests__/tools-get-route.test.ts +1 -1
  117. package/src/__tests__/turn-outcome-read.test.ts +1 -1
  118. package/src/__tests__/twilio-routes.test.ts +0 -1
  119. package/src/__tests__/usage-attribution.test.ts +0 -31
  120. package/src/__tests__/verification-control-plane-policy.test.ts +3 -10
  121. package/src/__tests__/visible-app-context.test.ts +1 -1
  122. package/src/__tests__/voice-ingress-preflight.test.ts +1 -1
  123. package/src/__tests__/workspace-git-service.test.ts +1 -1
  124. package/src/__tests__/workspace-greetings.test.ts +1 -1
  125. package/src/acp/__tests__/helpers/acp-config-stub.ts +1 -1
  126. package/src/activation/progress-store.ts +1 -1
  127. package/src/activation/turn-hooks.ts +1 -1
  128. package/src/agent/loop.ts +0 -51
  129. package/src/apps/app-store.ts +1 -1
  130. package/src/avatar/__tests__/avatar-store.test.ts +2 -172
  131. package/src/avatar/accent-backfill.ts +1 -1
  132. package/src/avatar/avatar-manifest.ts +1 -1
  133. package/src/avatar/avatar-store.ts +10 -69
  134. package/src/avatar/ensure-raster.ts +1 -1
  135. package/src/avatar/identity-avatar.ts +1 -1
  136. package/src/avatar/sync-avatar.ts +1 -1
  137. package/src/avatar/traits-png-sync.ts +1 -1
  138. package/src/bundler/compiler-tools.ts +1 -1
  139. package/src/bundler/package-resolver.ts +1 -1
  140. package/src/calls/__tests__/call-controller.test.ts +25 -27
  141. package/src/calls/active-call-lease.ts +1 -1
  142. package/src/calls/call-controller.ts +3 -3
  143. package/src/calls/call-domain.ts +4 -8
  144. package/src/calls/call-store.ts +2 -76
  145. package/src/calls/resolve-call-tts-provider.ts +3 -3
  146. package/src/calls/twilio-config.ts +3 -3
  147. package/src/calls/twilio-rest.ts +2 -2
  148. package/src/calls/voice-ingress-preflight.ts +2 -2
  149. package/src/cli/bundled-modules.ts +0 -2
  150. package/src/cli/commands/__tests__/apps.test.ts +1 -1
  151. package/src/cli/commands/__tests__/plugins.test.ts +9 -66
  152. package/src/cli/commands/__tests__/ps.test.ts +67 -0
  153. package/src/cli/commands/auth.help.ts +2 -2
  154. package/src/cli/commands/avatar.ts +1 -1
  155. package/src/cli/commands/changelog.ts +1 -1
  156. package/src/cli/commands/cloud/__tests__/subscription.test.ts +2 -2
  157. package/src/cli/commands/cloud/index.help.ts +1 -1
  158. package/src/cli/commands/cloud/index.ts +2 -2
  159. package/src/cli/commands/db/refresh.ts +1 -1
  160. package/src/cli/commands/db/repair-step-conversation-backfill.ts +1 -1
  161. package/src/cli/commands/db/repair.ts +1 -1
  162. package/src/cli/commands/db/status.ts +1 -1
  163. package/src/cli/commands/inference-profiles.ts +1 -12
  164. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +1 -116
  165. package/src/cli/commands/memory/index.help.ts +1 -43
  166. package/src/cli/commands/memory/memory-v3.ts +0 -64
  167. package/src/cli/commands/plugins.ts +54 -205
  168. package/src/cli/commands/ps.ts +5 -2
  169. package/src/cli/commands/status.ts +1 -1
  170. package/src/cli/index.help.ts +0 -2
  171. package/src/cli/lib/__tests__/inspect-plugin.test.ts +36 -66
  172. package/src/cli/lib/__tests__/install-from-cloud.test.ts +1 -1
  173. package/src/cli/lib/__tests__/install-from-github.test.ts +41 -117
  174. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +2 -185
  175. package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +36 -66
  176. package/src/cli/lib/__tests__/plugin-catalog-visibility.test.ts +4 -6
  177. package/src/cli/lib/__tests__/plugin-details.test.ts +113 -96
  178. package/src/cli/lib/__tests__/search-plugins.test.ts +9 -16
  179. package/src/cli/lib/__tests__/uninstall-plugin.test.ts +1 -1
  180. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +38 -15
  181. package/src/cli/lib/diff-plugin.ts +1 -1
  182. package/src/cli/lib/inspect-plugin.ts +13 -97
  183. package/src/cli/lib/install-from-cloud.ts +1 -1
  184. package/src/cli/lib/install-from-github.ts +75 -154
  185. package/src/cli/lib/install-plugin-dependencies.ts +1 -1
  186. package/src/cli/lib/list-installed-plugins.ts +1 -1
  187. package/src/cli/lib/open-browser.ts +1 -1
  188. package/src/cli/lib/plugin-catalog-cache.ts +8 -51
  189. package/src/cli/lib/plugin-catalog-resolve.ts +3 -22
  190. package/src/cli/lib/plugin-details.ts +5 -27
  191. package/src/cli/lib/plugin-marketplace.ts +18 -266
  192. package/src/cli/lib/search-plugins.ts +23 -43
  193. package/src/cli/lib/toggle-plugin.ts +1 -1
  194. package/src/cli/lib/uninstall-plugin.ts +1 -1
  195. package/src/cli/lib/upgrade-plugin.ts +3 -49
  196. package/src/cli/program.ts +1 -3
  197. package/src/cli.ts +1 -1
  198. package/src/cloud/client.ts +0 -6
  199. package/src/cloud/consent-cache.test.ts +22 -201
  200. package/src/cloud/consent-cache.ts +16 -111
  201. package/src/cloud/sync-identity.ts +1 -1
  202. package/src/config/__tests__/chat-settings.test.ts +1 -1
  203. package/src/config/__tests__/cloud-identity.test.ts +15 -2
  204. package/src/config/__tests__/default-plugin-skill-discovery.test.ts +1 -1
  205. package/src/config/__tests__/default-profile-catalog.test.ts +12 -51
  206. package/src/config/__tests__/deployment-context-defaults.test.ts +13 -13
  207. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +4 -4
  208. package/src/config/__tests__/loader-last-known-good.test.ts +9 -9
  209. package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +7 -7
  210. package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +1 -1
  211. package/src/config/__tests__/profile-materialization.test.ts +2 -4
  212. package/src/config/__tests__/sync-gated-profiles.test.ts +1 -106
  213. package/src/config/acp-agent-write.ts +1 -1
  214. package/src/config/bundled-skills/settings/tools/open-system-settings.test.ts +1 -1
  215. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
  216. package/src/config/call-site-defaults.ts +0 -6
  217. package/src/config/cloud-identity.ts +12 -5
  218. package/src/config/composer-preferences.ts +1 -1
  219. package/src/config/default-profile-catalog.ts +8 -75
  220. package/src/config/default-profile-names.ts +2 -25
  221. package/src/config/env-registry.ts +1 -14
  222. package/src/config/env.ts +8 -6
  223. package/src/config/llm-resolver.ts +1 -2
  224. package/src/config/loader.ts +13 -17
  225. package/src/config/profile-materialization.ts +1 -1
  226. package/src/config/schema.ts +1 -7
  227. package/src/config/schemas/call-site-catalog.ts +0 -7
  228. package/src/config/schemas/llm.ts +25 -32
  229. package/src/config/seed-inference-profiles.ts +16 -17
  230. package/src/config/skills.ts +2 -2
  231. package/src/config/sync-gated-profiles.ts +6 -24
  232. package/src/credential-health/credential-health-service.ts +10 -3
  233. package/src/daemon/approval-generators.ts +3 -3
  234. package/src/daemon/config-watcher.ts +2 -2
  235. package/src/daemon/conversation-agent-loop-handlers.ts +0 -18
  236. package/src/daemon/conversation-agent-loop.ts +6 -97
  237. package/src/daemon/conversation-process.ts +1 -1
  238. package/src/daemon/conversation-skill-tools.ts +4 -72
  239. package/src/daemon/conversation-store.ts +1 -1
  240. package/src/daemon/conversation-surface-state.ts +0 -33
  241. package/src/daemon/conversation-surfaces.ts +1 -86
  242. package/src/daemon/conversation-tool-setup.test.ts +1 -1
  243. package/src/daemon/conversation-tool-setup.ts +0 -23
  244. package/src/daemon/conversation.ts +3 -5
  245. package/src/daemon/daemon-control.ts +3 -3
  246. package/src/daemon/dictation-profile-store.ts +3 -3
  247. package/src/daemon/event-loop-watchdog.test.ts +2 -198
  248. package/src/daemon/event-loop-watchdog.ts +0 -185
  249. package/src/daemon/external-plugins-bootstrap.ts +1 -1
  250. package/src/daemon/first-greeting.ts +1 -1
  251. package/src/daemon/handlers/skills.ts +1 -1
  252. package/src/daemon/host-app-control-proxy.ts +1 -1
  253. package/src/daemon/host-cu-proxy.ts +2 -2
  254. package/src/daemon/identity-helpers.ts +1 -1
  255. package/src/daemon/lifecycle.ts +11 -15
  256. package/src/daemon/main.ts +1 -1
  257. package/src/daemon/now-scratchpad.ts +1 -1
  258. package/src/daemon/process-message.ts +4 -4
  259. package/src/daemon/profiler-run-store.ts +2 -2
  260. package/src/daemon/providers-setup.ts +2 -2
  261. package/src/daemon/shutdown-handlers.ts +0 -10
  262. package/src/daemon/sqlite-corruption-watchdog.test.ts +2 -142
  263. package/src/daemon/sqlite-corruption-watchdog.ts +17 -81
  264. package/src/daemon/tool-side-effects.ts +1 -1
  265. package/src/desktop/desktop-session-manager.ts +1 -1
  266. package/src/desktop/desktop-wallpaper-renderer.ts +1 -1
  267. package/src/heartbeat/heartbeat-service.ts +1 -1
  268. package/src/home/feed-writer.ts +1 -1
  269. package/src/home/home-greeting-cache.ts +1 -1
  270. package/src/home/relationship-state-writer.ts +2 -2
  271. package/src/hooks/__tests__/hook-live-reload.test.ts +1 -1
  272. package/src/hooks/hook-loader.ts +2 -2
  273. package/src/inbound/__tests__/oauth-callback-url.test.ts +2 -2
  274. package/src/inbound/oauth-callback-url.ts +3 -3
  275. package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
  276. package/src/ipc/socket-path.ts +1 -1
  277. package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
  278. package/src/live-voice/__tests__/live-voice-vad.test.ts +1 -1
  279. package/src/live-voice/live-voice-session.ts +3 -66
  280. package/src/mcp/__tests__/effective-config.test.ts +1 -1
  281. package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +2 -2
  282. package/src/mcp/__tests__/mcp-oauth-provider.test.ts +2 -3
  283. package/src/mcp/__tests__/reload-signal-emission.test.ts +1 -1
  284. package/src/mcp/__tests__/reload-signal.test.ts +1 -1
  285. package/src/mcp/__tests__/workspace-mcp-config.test.ts +19 -21
  286. package/src/mcp/reload-signal.ts +1 -1
  287. package/src/mcp/workspace-mcp-config.ts +1 -23
  288. package/src/messaging/draft-store.ts +1 -1
  289. package/src/monitoring/__tests__/active-conversations.test.ts +1 -1
  290. package/src/monitoring/__tests__/page-cache.test.ts +1 -1
  291. package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
  292. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +1 -1
  293. package/src/monitoring/active-conversations.ts +1 -1
  294. package/src/monitoring/control.ts +1 -1
  295. package/src/monitoring/daemon-boot-time.ts +1 -1
  296. package/src/monitoring/daemon-heartbeat.ts +1 -1
  297. package/src/monitoring/page-cache.ts +1 -1
  298. package/src/monitoring/plugin-auto-update.ts +1 -7
  299. package/src/monitoring/plugin-source-watch.ts +1 -1
  300. package/src/monitoring/recovery/db.ts +1 -1
  301. package/src/monitoring/recovery/inflight-content.ts +1 -1
  302. package/src/monitoring/resource-sampler.ts +3 -14
  303. package/src/monitoring/stall-capture.ts +1 -1
  304. package/src/monitoring/worker.ts +9 -76
  305. package/src/monitoring/workspace-git-heartbeat.ts +1 -1
  306. package/src/oauth/connect-orchestrator.ts +4 -4
  307. package/src/permissions/checker.ts +1 -1
  308. package/src/permissions/workspace-policy.ts +1 -1
  309. package/src/persistence/__tests__/main-db-readonly-probe.ts +27 -52
  310. package/src/persistence/__tests__/message-content-file.test.ts +1 -1
  311. package/src/persistence/__tests__/slow-sync-log.test.ts +0 -2
  312. package/src/persistence/attachments-store.ts +1 -1
  313. package/src/persistence/conversation-crud.ts +1 -38
  314. package/src/persistence/conversation-directories.ts +1 -1
  315. package/src/persistence/conversation-types.ts +0 -8
  316. package/src/persistence/db-async-query.ts +1 -1
  317. package/src/persistence/db-connection.ts +11 -1
  318. package/src/persistence/db-init.ts +1 -1
  319. package/src/persistence/db-maintenance.ts +1 -1
  320. package/src/persistence/embeddings/__tests__/embedding-local-lifecycle.test.ts +1 -1
  321. package/src/persistence/embeddings/embedding-local.ts +4 -4
  322. package/src/persistence/embeddings/embedding-runtime-manager.ts +1 -1
  323. package/src/persistence/embeddings/qdrant-client.ts +1 -1
  324. package/src/persistence/embeddings/qdrant-manager.ts +1 -1
  325. package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +1 -1
  326. package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +1 -1
  327. package/src/persistence/job-handlers/cleanup.ts +8 -17
  328. package/src/persistence/llm-usage-store.ts +2 -229
  329. package/src/persistence/message-content-file.ts +1 -1
  330. package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +1 -1
  331. package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +1 -1
  332. package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
  333. package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
  334. package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.test.ts +13 -0
  335. package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.test.ts +13 -0
  336. package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.test.ts +13 -0
  337. package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.test.ts +13 -0
  338. package/src/persistence/migrations/333-create-telemetry-events-table.test.ts +7 -4
  339. package/src/persistence/migrations/334-backfill-telemetry-events-outbox.test.ts +13 -0
  340. package/src/persistence/migrations/387-drop-telemetry-tables.ts +51 -0
  341. package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +9 -1
  342. package/src/persistence/migrations/__tests__/387-drop-telemetry-tables.test.ts +79 -0
  343. package/src/persistence/migrations/helpers/relocation.ts +1 -1
  344. package/src/persistence/migrations/run-migrations.ts +1 -1
  345. package/src/persistence/migrations/validate-migration-state.ts +1 -1
  346. package/src/persistence/raw-query.ts +1 -29
  347. package/src/persistence/slow-sync-log.ts +0 -23
  348. package/src/persistence/steps.ts +2 -0
  349. package/src/{telemetry → persistence}/tool-audit.ts +6 -121
  350. package/src/plugin-api/index.ts +1 -1
  351. package/src/plugin-api/plugin-name-env.ts +1 -1
  352. package/src/plugins/__tests__/installed-plugin-dirs.test.ts +1 -1
  353. package/src/plugins/collect-source-versions.ts +1 -1
  354. package/src/plugins/defaults/channel/package.json +1 -1
  355. package/src/plugins/defaults/cloud-hosted/package.json +1 -1
  356. package/src/plugins/defaults/compaction/package.json +1 -1
  357. package/src/plugins/defaults/documents/package.json +1 -1
  358. package/src/plugins/defaults/empty-response/package.json +1 -1
  359. package/src/plugins/defaults/exploration-drift/package.json +1 -1
  360. package/src/plugins/defaults/image-fallback/package.json +1 -1
  361. package/src/plugins/defaults/image-recovery/package.json +1 -1
  362. package/src/plugins/defaults/max-tokens-continue/package.json +1 -1
  363. package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +1 -1
  364. package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +1 -1
  365. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +0 -82
  366. package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +0 -41
  367. package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -2
  368. package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -52
  369. package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +0 -18
  370. package/src/plugins/defaults/memory/package.json +1 -1
  371. package/src/plugins/defaults/memory/paths.ts +4 -4
  372. package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
  373. package/src/plugins/defaults/memory/src/memory-v2-routes.ts +5 -5
  374. package/src/plugins/defaults/memory/src/memory-v3-routes.ts +0 -207
  375. package/src/plugins/defaults/memory/src/memory-worker-routes.ts +1 -1
  376. package/src/plugins/defaults/memory/startup.ts +1 -22
  377. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +2 -253
  378. package/src/plugins/defaults/memory/v3/orchestrate.ts +5 -129
  379. package/src/plugins/defaults/memory/worker-control.ts +1 -1
  380. package/src/plugins/defaults/memory/worker.ts +2 -2
  381. package/src/plugins/defaults/session/package.json +1 -1
  382. package/src/plugins/defaults/surface-completion-nudge/package.json +1 -1
  383. package/src/plugins/defaults/task-progress/package.json +1 -1
  384. package/src/plugins/defaults/task-progress-nudge/package.json +1 -1
  385. package/src/plugins/defaults/title-generate/package.json +1 -1
  386. package/src/plugins/defaults/tool-error/package.json +1 -1
  387. package/src/plugins/defaults/tool-result-truncate/package.json +1 -1
  388. package/src/plugins/defaults/turn-context/package.json +1 -1
  389. package/src/plugins/defaults/workspace/injectors.ts +1 -1
  390. package/src/plugins/defaults/workspace/package.json +1 -1
  391. package/src/plugins/disabled-state.ts +1 -1
  392. package/src/plugins/ensure-plugin-api-shim.ts +1 -1
  393. package/src/plugins/ensure-shared-dep-links.ts +1 -1
  394. package/src/plugins/installed-plugin-dirs.ts +1 -1
  395. package/src/plugins/mcp-servers.ts +7 -9
  396. package/src/plugins/mtime-cache.ts +2 -2
  397. package/src/plugins/source-versions.ts +1 -1
  398. package/src/prompts/bootstrap-cleanup.ts +1 -1
  399. package/src/prompts/persona-resolver.ts +1 -1
  400. package/src/prompts/sections.ts +2 -2
  401. package/src/prompts/system-prompt.ts +10 -42
  402. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +0 -37
  403. package/src/providers/__tests__/cadet-connection-routing.test.ts +2 -2
  404. package/src/providers/cadet/client.ts +1 -1
  405. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -1
  406. package/src/providers/inference/adapter-factory.ts +1 -1
  407. package/src/providers/inference/backfill.ts +3 -10
  408. package/src/providers/inference/profile-probe.ts +1 -1
  409. package/src/providers/retry.ts +0 -2
  410. package/src/providers/types.ts +0 -7
  411. package/src/providers/usage-tracking.ts +1 -1
  412. package/src/routes/__tests__/route-host.test.ts +1 -1
  413. package/src/routes/control.ts +1 -1
  414. package/src/routes/route-host-client.ts +1 -1
  415. package/src/routes/worker.ts +2 -2
  416. package/src/runtime/agent-wake.ts +1 -1
  417. package/src/runtime/assistant-stream-state.ts +1 -1
  418. package/src/runtime/auth/token-service.ts +1 -1
  419. package/src/runtime/background-job-runner.ts +1 -1
  420. package/src/runtime/middleware/twilio-validation.ts +2 -2
  421. package/src/runtime/routes/__tests__/app-pin-routes.test.ts +1 -1
  422. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +1 -1
  423. package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +3 -33
  424. package/src/runtime/routes/__tests__/cloud-credits-routes.test.ts +5 -4
  425. package/src/runtime/routes/__tests__/cloud-invoice-routes.test.ts +4 -3
  426. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +72 -298
  427. package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +1 -1
  428. package/src/runtime/routes/__tests__/deprecated-route-context.test.ts +15 -62
  429. package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +105 -12
  430. package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
  431. package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
  432. package/src/runtime/routes/__tests__/plugins-routes.test.ts +47 -211
  433. package/src/runtime/routes/__tests__/route-host-worker-routes.test.ts +1 -1
  434. package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +1 -1
  435. package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +1 -1
  436. package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +1 -1
  437. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -1
  438. package/src/runtime/routes/__tests__/user-routes-cli.test.ts +1 -1
  439. package/src/runtime/routes/__tests__/user-routes-notices.test.ts +1 -1
  440. package/src/runtime/routes/__tests__/user-routes-request.test.ts +1 -1
  441. package/src/runtime/routes/app-management-routes.ts +1 -1
  442. package/src/runtime/routes/attachment-routes.ts +1 -1
  443. package/src/runtime/routes/audit-routes.ts +1 -1
  444. package/src/runtime/routes/avatar-routes.ts +3 -10
  445. package/src/runtime/routes/cloud-routes.ts +3 -3
  446. package/src/runtime/routes/content-source-routes.ts +1 -1
  447. package/src/runtime/routes/conversation-query-routes.ts +49 -706
  448. package/src/runtime/routes/conversation-routes.ts +1 -38
  449. package/src/runtime/routes/debug-routes.ts +1 -1
  450. package/src/runtime/routes/deprecated-route-context.ts +5 -61
  451. package/src/runtime/routes/heartbeat-routes.ts +1 -1
  452. package/src/runtime/routes/identity-routes.ts +1 -1
  453. package/src/runtime/routes/index.ts +0 -6
  454. package/src/runtime/routes/inference-profile-session-handler.ts +3 -3
  455. package/src/runtime/routes/inference-profiles-routes.ts +48 -21
  456. package/src/runtime/routes/inference-provider-connection-routes.ts +0 -1
  457. package/src/runtime/routes/llm-call-sites-routes.ts +3 -3
  458. package/src/runtime/routes/log-export/__tests__/installed-inventory.test.ts +1 -1
  459. package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
  460. package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +1 -1
  461. package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
  462. package/src/runtime/routes/log-export-routes.ts +17 -15
  463. package/src/runtime/routes/migration-rollback-routes.ts +1 -1
  464. package/src/runtime/routes/migration-routes.ts +2 -3
  465. package/src/runtime/routes/monitoring-routes.ts +2 -2
  466. package/src/runtime/routes/oauth-providers.ts +5 -5
  467. package/src/runtime/routes/plugins-routes.ts +38 -163
  468. package/src/runtime/routes/profiler-routes.ts +1 -1
  469. package/src/runtime/routes/route-host-worker-routes.ts +1 -1
  470. package/src/runtime/routes/sanity-routes.ts +1 -1
  471. package/src/runtime/routes/schedule-routes.ts +1 -1
  472. package/src/runtime/routes/schedule-worker-routes.ts +1 -1
  473. package/src/runtime/routes/settings-routes.ts +1 -1
  474. package/src/runtime/routes/sounds-config-routes.ts +1 -1
  475. package/src/runtime/routes/surface-conversation-resolver.ts +1 -7
  476. package/src/runtime/routes/user-route-dispatcher.ts +1 -3
  477. package/src/runtime/routes/user-route-import.ts +1 -1
  478. package/src/runtime/routes/user-route-resolution.ts +1 -1
  479. package/src/runtime/routes/user-routes-cli.ts +1 -1
  480. package/src/runtime/routes/workspace-commit-routes.ts +1 -1
  481. package/src/runtime/routes/workspace-greetings.ts +1 -1
  482. package/src/runtime/routes/workspace-routes.ts +1 -1
  483. package/src/runtime/routes/workspace-utils.ts +1 -1
  484. package/src/runtime/sync/resource-sync-events.ts +1 -1
  485. package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +1 -1
  486. package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1 -1
  487. package/src/schedule/plugin-schedule-availability.ts +1 -1
  488. package/src/schedule/plugin-schedule-declarations.ts +1 -1
  489. package/src/schedule/run-script.ts +1 -1
  490. package/src/schedule/scheduler.ts +1 -11
  491. package/src/schedule/worker-control.ts +1 -1
  492. package/src/schedule/worker.ts +3 -3
  493. package/src/security/oauth2.ts +2 -2
  494. package/src/security/secret-allowlist.ts +1 -1
  495. package/src/signals/cancel.ts +1 -1
  496. package/src/signals/conversation-undo.ts +1 -1
  497. package/src/signals/emit-event.ts +1 -1
  498. package/src/signals/event-stream.ts +1 -1
  499. package/src/signals/user-message.ts +1 -1
  500. package/src/skills/catalog-install.ts +2 -1
  501. package/src/skills/clawhub.ts +1 -1
  502. package/src/skills/cloud-store.ts +1 -1
  503. package/src/skills/path-classifier.ts +1 -1
  504. package/src/skills/skill-history.ts +1 -1
  505. package/src/skills/skillssh-registry.ts +1 -1
  506. package/src/skills/uninstall.ts +1 -1
  507. package/src/skills/workspace-skill-md-signature.ts +1 -1
  508. package/src/subagent/manager.ts +1 -1
  509. package/src/theme/workspace-theme.ts +1 -1
  510. package/src/tools/browser/auth-cache.ts +1 -1
  511. package/src/tools/browser/browser-manager.ts +1 -1
  512. package/src/tools/browser/runtime-check.ts +1 -1
  513. package/src/tools/executor.ts +4 -4
  514. package/src/tools/filesystem/write.ts +1 -1
  515. package/src/tools/permission-checker.ts +2 -51
  516. package/src/tools/run-standalone.ts +1 -1
  517. package/src/tools/skills/format-input-schema.ts +1 -1
  518. package/src/tools/skills/load.ts +1 -1
  519. package/src/tools/skills/scaffold-cloud.ts +0 -32
  520. package/src/tools/terminal/safe-env.ts +1 -2
  521. package/src/tools/terminal/sanitized-bash.ts +1 -1
  522. package/src/tools/terminal/shell.ts +1 -1
  523. package/src/tools/tool-approval-handler.ts +4 -1
  524. package/src/tools/workflows/manage-workflows.ts +2 -2
  525. package/src/tools/workflows/run-workflow.test.ts +1 -1
  526. package/src/tools/workspace-tools/loader.ts +1 -1
  527. package/src/tts/synthesis-stream.ts +2 -2
  528. package/src/usage/attribution.ts +1 -11
  529. package/src/util/browser.ts +1 -1
  530. package/src/util/bun-runtime.ts +2 -1
  531. package/src/util/device-id.ts +1 -1
  532. package/src/util/disk-usage.ts +4 -139
  533. package/src/util/layout.ts +3 -3
  534. package/src/util/logger.ts +1 -1
  535. package/src/util/logs-db-path.ts +1 -1
  536. package/src/util/memory-db-path.ts +1 -1
  537. package/src/util/{platform.ts → os.ts} +5 -30
  538. package/src/util/process-tree.ts +19 -0
  539. package/src/util/sqlite3-runtime.ts +1 -1
  540. package/src/util/telemetry-db-path.ts +1 -1
  541. package/src/watcher/__tests__/engine.test.ts +0 -23
  542. package/src/watcher/engine.ts +0 -7
  543. package/src/windows-compiled-cli.ts +0 -4
  544. package/src/windows-compiled-worker-entry.ts +0 -6
  545. package/src/workflows/leaf-runner.test.ts +1 -1
  546. package/src/workflows/leaf-runner.ts +1 -1
  547. package/src/workflows/library.ts +1 -1
  548. package/src/workspace/adaptive-thinking-repair.ts +5 -24
  549. package/src/workspace/byok-default-profile-ensure.ts +24 -26
  550. package/src/workspace/custom-profile-ensure.ts +2 -2
  551. package/src/workspace/git-service.ts +1 -1
  552. package/src/workspace/hatched-date.ts +1 -1
  553. package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +2 -2
  554. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
  555. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +1 -1
  556. package/src/workspace/migrations/077-seed-memory-router-callsite.ts +1 -1
  557. package/src/workspace/migrations/registry.ts +0 -4
  558. package/src/workspace/turn-commit.ts +1 -1
  559. package/docs/activation-funnel-telemetry.md +0 -324
  560. package/scripts/bundled-plugin-packages.ts +0 -154
  561. package/scripts/generate-bundled-plugin-packages.ts +0 -29
  562. package/src/__tests__/activation-early-marking.test.ts +0 -114
  563. package/src/__tests__/auth-fallback-events-store.test.ts +0 -99
  564. package/src/__tests__/config-get-vision-flag.test.ts +0 -139
  565. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -400
  566. package/src/__tests__/internal-telemetry-routes.test.ts +0 -213
  567. package/src/__tests__/telemetry-routes.test.ts +0 -182
  568. package/src/__tests__/turn-events-store.test.ts +0 -376
  569. package/src/__tests__/ui-channel-variants.test.ts +0 -53
  570. package/src/avatar/__tests__/avatar-changed-telemetry.test.ts +0 -217
  571. package/src/avatar/avatar-changed-telemetry.ts +0 -128
  572. package/src/calls/__tests__/call-funnel-telemetry.test.ts +0 -204
  573. package/src/cli/commands/telemetry.help.ts +0 -27
  574. package/src/cli/commands/telemetry.ts +0 -83
  575. package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +0 -251
  576. package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +0 -113
  577. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +0 -384
  578. package/src/cli/lib/__tests__/plugin-pin-history.test.ts +0 -164
  579. package/src/cli/lib/__tests__/plugins-install-offline.test.ts +0 -228
  580. package/src/cli/lib/bundled-marketplace.json +0 -1575
  581. package/src/cli/lib/bundled-plugin-packages.json +0 -827
  582. package/src/cli/lib/bundled-plugin-packages.ts +0 -87
  583. package/src/cli/lib/plugin-catalog-local.ts +0 -94
  584. package/src/cli/lib/plugin-pin-history.ts +0 -276
  585. package/src/cloud/feature-gate.ts +0 -8
  586. package/src/config/__tests__/cloud-rehydration.test.ts +0 -180
  587. package/src/config/cloud-rehydration.ts +0 -35
  588. package/src/daemon/__tests__/auto-profile-router.test.ts +0 -380
  589. package/src/daemon/auto-profile-router.ts +0 -428
  590. package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +0 -391
  591. package/src/monitoring/__tests__/db-integrity-sample.test.ts +0 -113
  592. package/src/monitoring/__tests__/oom-kill-reporter.test.ts +0 -374
  593. package/src/monitoring/db-integrity-check.ts +0 -163
  594. package/src/monitoring/db-integrity-sample.ts +0 -176
  595. package/src/monitoring/oom-kill-reporter.ts +0 -469
  596. package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -158
  597. package/src/onboarding/onboarding-events-store.ts +0 -296
  598. package/src/persistence/__tests__/raw-query-telemetry.test.ts +0 -76
  599. package/src/persistence/lifecycle-events-store.test.ts +0 -134
  600. package/src/persistence/lifecycle-events-store.ts +0 -110
  601. package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +0 -76
  602. package/src/plugins/defaults/memory/activation-session-store.ts +0 -50
  603. package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +0 -281
  604. package/src/runtime/routes/auto-profile-routes.ts +0 -83
  605. package/src/runtime/routes/internal-telemetry-routes.ts +0 -142
  606. package/src/runtime/routes/telemetry-routes.ts +0 -274
  607. package/src/security/auth-fallback-events-store.ts +0 -57
  608. package/src/telemetry/__tests__/activation-funnel.test.ts +0 -95
  609. package/src/telemetry/__tests__/config-setting-events-store.test.ts +0 -63
  610. package/src/telemetry/__tests__/config-setting-snapshot.test.ts +0 -143
  611. package/src/telemetry/__tests__/flush-checkpoints.test.ts +0 -56
  612. package/src/telemetry/__tests__/live-voice-funnel.test.ts +0 -174
  613. package/src/telemetry/__tests__/outbox-test-harness.ts +0 -85
  614. package/src/telemetry/__tests__/phone-call-funnel.test.ts +0 -72
  615. package/src/telemetry/__tests__/telemetry-event-fixtures.ts +0 -282
  616. package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -71
  617. package/src/telemetry/activation-funnel.ts +0 -172
  618. package/src/telemetry/config-setting-events-store.ts +0 -40
  619. package/src/telemetry/config-setting-snapshot.ts +0 -170
  620. package/src/telemetry/flush-checkpoints.ts +0 -70
  621. package/src/telemetry/live-voice-funnel.ts +0 -185
  622. package/src/telemetry/memory-corpus-size.test.ts +0 -120
  623. package/src/telemetry/memory-corpus-size.ts +0 -184
  624. package/src/telemetry/memory-tier-reporter.test.ts +0 -195
  625. package/src/telemetry/memory-tier-reporter.ts +0 -130
  626. package/src/telemetry/phone-call-funnel.ts +0 -144
  627. package/src/telemetry/skill-loaded-events-store.test.ts +0 -93
  628. package/src/telemetry/skill-loaded-events-store.ts +0 -39
  629. package/src/telemetry/telemetry-event-sources.test.ts +0 -223
  630. package/src/telemetry/telemetry-event-sources.ts +0 -597
  631. package/src/telemetry/telemetry-events-outbox.test.ts +0 -375
  632. package/src/telemetry/telemetry-events-outbox.ts +0 -237
  633. package/src/telemetry/telemetry-main-db.ts +0 -48
  634. package/src/telemetry/telemetry-wire-source.json +0 -4
  635. package/src/telemetry/telemetry-wire-validation.test.ts +0 -157
  636. package/src/telemetry/telemetry-wire-validation.ts +0 -162
  637. package/src/telemetry/telemetry-wire.generated.ts +0 -483
  638. package/src/telemetry/tool-executed-events-store.test.ts +0 -210
  639. package/src/telemetry/tool-executed-events-store.ts +0 -102
  640. package/src/telemetry/trace-collection-policy.test.ts +0 -28
  641. package/src/telemetry/trace-collection-policy.ts +0 -30
  642. package/src/telemetry/turn-events-store.ts +0 -216
  643. package/src/telemetry/turn-trace-store.test.ts +0 -884
  644. package/src/telemetry/turn-trace-store.ts +0 -399
  645. package/src/telemetry/types.test.ts +0 -38
  646. package/src/telemetry/types.ts +0 -780
  647. package/src/telemetry/usage-telemetry-reporter.test.ts +0 -3445
  648. package/src/telemetry/usage-telemetry-reporter.ts +0 -566
  649. package/src/telemetry/watchdog-direct-emit.test.ts +0 -112
  650. package/src/telemetry/watchdog-direct-emit.ts +0 -104
  651. package/src/telemetry/watchdog-events-store.ts +0 -31
  652. package/src/tools/ui-surface/channel-variants.ts +0 -52
  653. package/src/watcher/__tests__/telemetry.test.ts +0 -178
  654. package/src/watcher/telemetry.ts +0 -93
  655. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +0 -165
  656. package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +0 -151
  657. /package/src/{telemetry → persistence}/tool-usage-store.ts +0 -0
  658. /package/src/{telemetry → persistence}/turn-outcome.ts +0 -0
@@ -8,7 +8,7 @@ import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
8
8
 
9
9
  import { UnprocessableEntityError } from "../errors.js";
10
10
 
11
- let cloudBaseUrl = "https://platform.test";
11
+ let cloudBaseUrl = "https://test-cloud.mycadet.ai";
12
12
  let authHeader: string | null = "Api-Key test";
13
13
 
14
14
  // Spread the real module: replacing it wholesale breaks unrelated importers
@@ -33,9 +33,10 @@ const creditsHandler = ROUTES.find(
33
33
  (r) => r.operationId === "platform_credits",
34
34
  )!.handler;
35
35
 
36
- const SUMMARY_URL = "https://platform.test/v1/organizations/billing/summary/";
36
+ const SUMMARY_URL =
37
+ "https://test-cloud.mycadet.ai/v1/organizations/billing/summary/";
37
38
  const SUBSCRIPTION_URL =
38
- "https://platform.test/v1/organizations/billing/subscription/";
39
+ "https://test-cloud.mycadet.ai/v1/organizations/billing/subscription/";
39
40
 
40
41
  const FULL_SUMMARY = {
41
42
  settled_balance_usd: "50.00",
@@ -84,7 +85,7 @@ function stubFetch(
84
85
  }
85
86
 
86
87
  beforeEach(() => {
87
- cloudBaseUrl = "https://platform.test";
88
+ cloudBaseUrl = "https://test-cloud.mycadet.ai";
88
89
  authHeader = "Api-Key test";
89
90
  fetchedUrls = [];
90
91
  });
@@ -12,7 +12,7 @@ import {
12
12
  UnprocessableEntityError,
13
13
  } from "../errors.js";
14
14
 
15
- let cloudBaseUrl = "https://platform.test";
15
+ let cloudBaseUrl = "https://test-cloud.mycadet.ai";
16
16
  let authHeader: string | null = "Api-Key test";
17
17
 
18
18
  // Spread the real module: replacing it wholesale breaks unrelated importers
@@ -41,7 +41,8 @@ const getHandler = ROUTES.find(
41
41
  (r) => r.operationId === "platform_invoices_by_id_get",
42
42
  )!.handler;
43
43
 
44
- const INVOICES_URL = "https://platform.test/v1/organizations/billing/invoices/";
44
+ const INVOICES_URL =
45
+ "https://test-cloud.mycadet.ai/v1/organizations/billing/invoices/";
45
46
 
46
47
  function invoice(id: string) {
47
48
  return {
@@ -103,7 +104,7 @@ function jsonResponse(body: unknown, status = 200): Response {
103
104
  }
104
105
 
105
106
  beforeEach(() => {
106
- cloudBaseUrl = "https://platform.test";
107
+ cloudBaseUrl = "https://test-cloud.mycadet.ai";
107
108
  authHeader = "Api-Key test";
108
109
  fetchCalls = [];
109
110
  });
@@ -52,16 +52,13 @@ mock.module("../../../persistence/embeddings/embedding-backend.js", () => ({
52
52
  }));
53
53
 
54
54
  import type { AssistantEventEnvelope } from "../../../api/index.js";
55
- import { BACKUP_PROFILE_KEYS } from "../../../config/default-profile-names.js";
56
55
  import {
57
56
  getConfig,
58
57
  invalidateConfigCache,
59
- loadConfig,
60
58
  loadRawConfig,
61
59
  setNestedValue,
62
60
  } from "../../../config/loader.js";
63
61
  import { AssistantConfigSchema } from "../../../config/schema.js";
64
- import { LLMConfigBase } from "../../../config/schemas/llm.js";
65
62
  import type { ConversationCreateType } from "../../../persistence/conversation-types.js";
66
63
  import {
67
64
  getDb,
@@ -847,49 +844,6 @@ describe("PUT /v1/config/llm/profiles/:name", () => {
847
844
  seedRawConfig();
848
845
  });
849
846
 
850
- describe("fallbackProfile write protection", () => {
851
- beforeEach(() => {
852
- const llm = rawConfigFixture.llm as {
853
- profiles: Record<string, Record<string, unknown>>;
854
- };
855
- llm.profiles.backup = {
856
- provider: "anthropic",
857
- model: "claude-sonnet-4-6",
858
- };
859
- seedRawConfig();
860
- });
861
-
862
- test("rejects a custom fallbackProfile without writing", async () => {
863
- await expect(
864
- replaceProfileRoute.handler({
865
- pathParams: { name: "custom" },
866
- body: {
867
- provider: "anthropic",
868
- model: "claude-sonnet-4-6",
869
- fallbackProfile: "backup",
870
- },
871
- }),
872
- ).rejects.toThrow(/Automatic fallbacks are code-owned/);
873
- expect(persistedProfile("custom").fallbackProfile).toBeUndefined();
874
- expect(initializeProvidersCalls).toBe(0);
875
- });
876
-
877
- test("rejects a custom pointer at a cloud backup name", async () => {
878
- await expect(
879
- replaceProfileRoute.handler({
880
- pathParams: { name: "custom" },
881
- body: {
882
- provider: "anthropic",
883
- model: "claude-sonnet-4-6",
884
- fallbackProfile: "balanced-backup",
885
- },
886
- }),
887
- ).rejects.toThrow(/Automatic fallbacks are code-owned/);
888
- expect(persistedProfile("custom").fallbackProfile).toBeUndefined();
889
- expect(initializeProvidersCalls).toBe(0);
890
- });
891
- });
892
-
893
847
  test("owns contextWindow maxInputTokens while preserving non-UI profile leaves", async () => {
894
848
  const result = await replaceProfileRoute.handler({
895
849
  pathParams: { name: "custom" },
@@ -908,20 +862,14 @@ describe("PUT /v1/config/llm/profiles/:name", () => {
908
862
 
909
863
  expect(savedProfile.provider).toBe("openai");
910
864
  expect(savedProfile.model).toBe("gpt-5.5");
911
- // Write normalization completes the entry against llm.default (schema
912
- // defaults here — the fixture has none), so UI-cleared fields land as
913
- // explicit values instead of inherit-by-absence.
914
- const schemaDefault = LLMConfigBase.parse({});
915
- expect(savedProfile.maxTokens).toBe(schemaDefault.maxTokens);
865
+ // The entry replaces verbatim; contextWindow is route-owned — the
866
+ // non-UI leaves survive the write, the UI-owned maxInputTokens does
867
+ // not (it only lands when the body carries it).
868
+ expect(savedProfile.maxTokens).toBeUndefined();
916
869
  expect(savedProfile.contextWindow).toEqual({
917
- ...schemaDefault.contextWindow,
918
870
  targetBudgetRatio: 0.3,
919
871
  summaryBudgetRatio: 0.08,
920
- overflowRecovery: {
921
- ...schemaDefault.contextWindow.overflowRecovery,
922
- enabled: true,
923
- maxAttempts: 4,
924
- },
872
+ overflowRecovery: { enabled: true, maxAttempts: 4 },
925
873
  });
926
874
  expect(savedProfile.openrouter).toEqual({ only: ["anthropic"] });
927
875
  });
@@ -946,17 +894,13 @@ describe("PUT /v1/config/llm/profiles/:name", () => {
946
894
  }
947
895
  ).profiles.custom;
948
896
 
949
- const schemaDefault = LLMConfigBase.parse({});
897
+ // Only the maxInputTokens override is taken; the non-UI leaves ride
898
+ // from the existing entry.
950
899
  expect(savedProfile.contextWindow).toEqual({
951
- ...schemaDefault.contextWindow,
952
900
  maxInputTokens: 150000,
953
901
  targetBudgetRatio: 0.3,
954
902
  summaryBudgetRatio: 0.08,
955
- overflowRecovery: {
956
- ...schemaDefault.contextWindow.overflowRecovery,
957
- enabled: true,
958
- maxAttempts: 4,
959
- },
903
+ overflowRecovery: { enabled: true, maxAttempts: 4 },
960
904
  });
961
905
  expect(savedProfile.openrouter).toEqual({ only: ["anthropic"] });
962
906
  });
@@ -1138,24 +1082,21 @@ describe("PUT /v1/config/llm/profiles/:name", () => {
1138
1082
 
1139
1083
  describe("cloud profile guard", () => {
1140
1084
  beforeEach(() => {
1141
- // Seed two managed-source profiles alongside the existing custom one.
1142
- // Every cloud profile name (including the flag-gated os-beta) is
1143
- // invariant while its entry is managed-source: fully read-only except
1144
- // the disabled → active status transition.
1085
+ // Seed two managed profiles alongside the existing custom one. A
1086
+ // cadet-provider entry under a managed name is read-only except the
1087
+ // disabled → active status transition (the up-front route check).
1145
1088
  const profiles = (
1146
1089
  rawConfigFixture.llm as { profiles: Record<string, unknown> }
1147
1090
  ).profiles;
1148
1091
  profiles["balanced"] = {
1149
- source: "managed",
1150
- provider: "anthropic",
1092
+ provider: "cadet",
1151
1093
  model: "claude-sonnet-4-6",
1152
1094
  label: "Balanced",
1153
1095
  status: "active",
1154
1096
  };
1155
1097
  profiles["os-beta"] = {
1156
- source: "managed",
1157
- provider: "together",
1158
- model: "zai-org/GLM-5.2",
1098
+ provider: "cadet",
1099
+ model: "claude-sonnet-4-6",
1159
1100
  label: "OS Beta",
1160
1101
  status: "active",
1161
1102
  };
@@ -1208,9 +1149,8 @@ describe("PUT /v1/config/llm/profiles/:name", () => {
1208
1149
 
1209
1150
  expect(savedProfile.status).toBe("active");
1210
1151
  // Seed fields preserved.
1211
- expect(savedProfile.provider).toBe("together");
1212
- expect(savedProfile.model).toBe("zai-org/GLM-5.2");
1213
- expect(savedProfile.source).toBe("managed");
1152
+ expect(savedProfile.provider).toBe("cadet");
1153
+ expect(savedProfile.model).toBe("claude-sonnet-4-6");
1214
1154
  });
1215
1155
 
1216
1156
  // The full commit-time rejection matrix for invariant cloud profiles
@@ -1257,7 +1197,7 @@ describe("PUT /v1/config/llm/profiles/:name", () => {
1257
1197
  (rawConfigFixture.llm as { profiles: Record<string, unknown> }).profiles[
1258
1198
  "balanced"
1259
1199
  ] = {
1260
- source: "managed",
1200
+ source: "cloud",
1261
1201
  provider: "anthropic",
1262
1202
  model: "claude-sonnet-4-6",
1263
1203
  label: "Balanced",
@@ -1336,189 +1276,34 @@ describe("PATCH /v1/config fallbackProfile write protection", () => {
1336
1276
  });
1337
1277
  });
1338
1278
 
1339
- describe("custom profile write normalization (complete overrides)", () => {
1340
- const configPatchRoute = ROUTES.find(
1341
- (r) => r.operationId === "config_patch",
1342
- )!;
1343
- const configSetRoute = ROUTES.find((r) => r.operationId === "config_set")!;
1344
-
1345
- const distinctiveDefault = {
1346
- provider: "anthropic",
1347
- model: "claude-opus-4-8",
1348
- maxTokens: 12345,
1349
- temperature: 0.7,
1350
- logitBias: "suppress-cjk",
1351
- };
1352
-
1279
+ describe("profile writes are schema-canonical", () => {
1353
1280
  beforeEach(() => {
1354
1281
  rawConfigFixture = {
1355
1282
  llm: {
1356
- default: structuredClone(distinctiveDefault),
1283
+ default: { provider: "anthropic", model: "claude-opus-4-8" },
1357
1284
  profiles: {
1358
- partial: { source: "user", model: "claude-haiku-4-5-20251001" },
1359
- },
1360
- },
1361
- };
1362
- seedRawConfig();
1363
- });
1364
-
1365
- const savedProfiles = () =>
1366
- (
1367
- loadRawConfig().llm as {
1368
- profiles: Record<string, Record<string, unknown>>;
1369
- }
1370
- ).profiles;
1371
-
1372
- test("PUT of a partial body stores a complete profile", async () => {
1373
- await replaceProfileRoute.handler({
1374
- pathParams: { name: "mine" },
1375
- body: { model: "claude-haiku-4-5-20251001" },
1376
- });
1377
- const saved = savedProfiles().mine;
1378
- expect(saved.model).toBe("claude-haiku-4-5-20251001");
1379
- expect(saved.provider).toBe("anthropic");
1380
- expect(saved.maxTokens).toBe(12345);
1381
- // Non-null default sampling is baked in; logitBias never is.
1382
- expect(saved.temperature).toBe(0.7);
1383
- expect(saved.logitBias).toBeUndefined();
1384
- expect(saved.thinking).toBeDefined();
1385
- expect(saved.contextWindow).toBeDefined();
1386
- });
1387
-
1388
- test("PATCH creating a partial profile stores it complete", async () => {
1389
- await configPatchRoute.handler({
1390
- body: {
1391
- llm: {
1392
- default: structuredClone(distinctiveDefault),
1393
- profiles: {
1394
- mine: { source: "user", model: "claude-haiku-4-5-20251001" },
1285
+ partial: {
1286
+ model: "claude-haiku-4-5-20251001",
1287
+ futureField: "keep-me",
1395
1288
  },
1396
1289
  },
1397
1290
  },
1398
- });
1399
- const saved = savedProfiles().mine;
1400
- expect(saved.provider).toBe("anthropic");
1401
- expect(saved.maxTokens).toBe(12345);
1402
- expect(saved.temperature).toBe(0.7);
1403
- expect(saved.logitBias).toBeUndefined();
1404
- });
1405
-
1406
- test("SET on a profile leaf completes the whole entry", async () => {
1407
- await configSetRoute.handler({
1408
- body: { path: "llm.profiles.partial.maxTokens", value: 999 },
1409
- });
1410
- const saved = savedProfiles().partial;
1411
- expect(saved.maxTokens).toBe(999);
1412
- expect(saved.provider).toBe("anthropic");
1413
- expect(saved.temperature).toBe(0.7);
1414
- expect(saved.model).toBe("claude-haiku-4-5-20251001");
1415
- });
1416
-
1417
- test("an unrelated write leaves untouched partial profiles byte-identical", async () => {
1418
- await configSetRoute.handler({
1419
- body: { path: "heartbeat.activeHoursStart", value: 9 },
1420
- });
1421
- expect(savedProfiles().partial).toEqual({
1422
- source: "user",
1423
- model: "claude-haiku-4-5-20251001",
1424
- });
1425
- });
1426
-
1427
- test("nested unknown keys survive completion of a touched entry", async () => {
1428
- (
1429
- rawConfigFixture.llm as { profiles: Record<string, unknown> }
1430
- ).profiles.partial = {
1431
- source: "user",
1432
- model: "claude-haiku-4-5-20251001",
1433
- contextWindow: { futureField: "keep-me", maxInputTokens: 111 },
1434
1291
  };
1435
1292
  seedRawConfig();
1436
- await configSetRoute.handler({
1437
- body: { path: "llm.profiles.partial.maxTokens", value: 999 },
1438
- });
1439
- const saved = savedProfiles().partial;
1440
- const contextWindow = saved.contextWindow as Record<string, unknown>;
1441
- // Schema-canonical saves strip keys the schema doesn't know.
1442
- expect(contextWindow.futureField).toBeUndefined();
1443
- expect(contextWindow.maxInputTokens).toBe(111);
1444
- expect(saved.provider).toBe("anthropic");
1445
1293
  });
1446
1294
 
1447
1295
  test("unknown profile keys are stripped by the schema parse", async () => {
1448
- (
1449
- rawConfigFixture.llm as { profiles: Record<string, unknown> }
1450
- ).profiles.partial = {
1451
- source: "user",
1452
- model: "claude-haiku-4-5-20251001",
1453
- futureField: "keep-me",
1454
- };
1455
- seedRawConfig();
1296
+ const configSetRoute = ROUTES.find((r) => r.operationId === "config_set")!;
1456
1297
  await configSetRoute.handler({
1457
1298
  body: { path: "llm.profiles.partial.maxTokens", value: 999 },
1458
1299
  });
1459
- const saved = savedProfiles().partial;
1300
+ const saved = (
1301
+ loadRawConfig().llm as {
1302
+ profiles: Record<string, Record<string, unknown>>;
1303
+ }
1304
+ ).profiles.partial;
1460
1305
  expect(saved.futureField).toBeUndefined();
1461
1306
  expect(saved.maxTokens).toBe(999);
1462
- expect(saved.provider).toBe("anthropic");
1463
- });
1464
-
1465
- test("a bogus managed source on a non-catalog name is normalized and completed", async () => {
1466
- await replaceProfileRoute.handler({
1467
- pathParams: { name: "mine" },
1468
- body: { source: "managed", model: "claude-haiku-4-5-20251001" },
1469
- });
1470
- const saved = savedProfiles().mine;
1471
- expect(saved.source).toBe("user");
1472
- expect(saved.provider).toBe("anthropic");
1473
- expect(saved.maxTokens).toBe(12345);
1474
- });
1475
-
1476
- test("a cloud status re-enable stays a thin stub", async () => {
1477
- (
1478
- rawConfigFixture.llm as { profiles: Record<string, unknown> }
1479
- ).profiles.balanced = { source: "managed", status: "disabled" };
1480
- seedRawConfig();
1481
- await replaceProfileRoute.handler({
1482
- pathParams: { name: "balanced" },
1483
- body: { status: null },
1484
- });
1485
- expect(savedProfiles().balanced).toEqual({ source: "managed" });
1486
- });
1487
-
1488
- test("a mix profile write is not completed", async () => {
1489
- await replaceProfileRoute.handler({
1490
- pathParams: { name: "ab" },
1491
- body: {
1492
- label: "A/B",
1493
- mix: [
1494
- { profile: "balanced", weight: 1 },
1495
- { profile: "cost-optimized", weight: 1 },
1496
- ],
1497
- },
1498
- });
1499
- const saved = savedProfiles().ab;
1500
- expect(saved.mix).toBeDefined();
1501
- expect(saved.provider).toBeUndefined();
1502
- expect(saved.model).toBeUndefined();
1503
- expect(saved.maxTokens).toBeUndefined();
1504
- });
1505
-
1506
- test("re-writing a completed profile is idempotent", async () => {
1507
- // Deterministic connection state: the PUT handler derives a connection
1508
- // for provider-carrying bodies, so both writes must see the same rows.
1509
- getDb().delete(providerConnections).run();
1510
- await replaceProfileRoute.handler({
1511
- pathParams: { name: "mine" },
1512
- body: { provider: "anthropic", model: "claude-haiku-4-5-20251001" },
1513
- });
1514
- const first = structuredClone(savedProfiles().mine);
1515
- rawConfigFixture = structuredClone(loadRawConfig());
1516
- seedRawConfig();
1517
- await replaceProfileRoute.handler({
1518
- pathParams: { name: "mine" },
1519
- body: first as Record<string, unknown>,
1520
- });
1521
- expect(savedProfiles().mine).toEqual(first);
1522
1307
  });
1523
1308
  });
1524
1309
 
@@ -1758,7 +1543,7 @@ describe("sparse services.stt patch provider seeding", () => {
1758
1543
  });
1759
1544
  });
1760
1545
 
1761
- describe("config invariant flag enrichment", () => {
1546
+ describe("config GET serves profiles verbatim", () => {
1762
1547
  const configGetRoute = ROUTES.find((r) => r.operationId === "config_get")!;
1763
1548
  const configPatchRoute = ROUTES.find(
1764
1549
  (r) => r.operationId === "config_patch",
@@ -1775,21 +1560,19 @@ describe("config invariant flag enrichment", () => {
1775
1560
  llm: {
1776
1561
  profiles: {
1777
1562
  balanced: {
1778
- source: "managed",
1563
+ source: "cloud",
1779
1564
  provider: "fireworks",
1780
1565
  model: "accounts/fireworks/models/glm-5p2",
1781
1566
  label: "Balanced",
1782
1567
  status: "active",
1783
1568
  },
1784
1569
  "os-beta": {
1785
- source: "managed",
1570
+ source: "cloud",
1786
1571
  provider: "together",
1787
1572
  model: "zai-org/GLM-5.2",
1788
1573
  label: "OS Beta",
1789
1574
  status: "active",
1790
1575
  },
1791
- // A user-owned profile sharing a cloud name: no invariant flag —
1792
- // the stamp is gated on `source: "managed"` to match the guard.
1793
1576
  "cost-optimized": {
1794
1577
  source: "user",
1795
1578
  provider: "anthropic",
@@ -1805,43 +1588,31 @@ describe("config invariant flag enrichment", () => {
1805
1588
  seedRawConfig();
1806
1589
  });
1807
1590
 
1808
- test("GET /v1/config marks managed-source profiles invariant (incl. os-beta), not user-owned ones", async () => {
1809
- const body = await configGetRoute.handler({});
1810
- const profiles = wireProfiles(body);
1811
-
1812
- expect(profiles.balanced!.invariant).toBe(true);
1813
- expect(profiles["os-beta"]!.invariant).toBe(true);
1814
- expect(profiles["cost-optimized"]!).not.toHaveProperty("invariant");
1815
- expect(profiles.custom!).not.toHaveProperty("invariant");
1816
- });
1817
-
1818
- test("every managed default is invariant on the wire, Fast included", async () => {
1819
- // The clients drive their read-only lock off this flag, so a default that
1820
- // resolves from the catalog with no workspace stub must still carry it.
1821
- const body = await configGetRoute.handler({});
1822
- const profiles = wireProfiles(body);
1823
-
1824
- for (const name of ["balanced", "quality-optimized", "latency-optimized"]) {
1825
- expect(profiles[name]!.invariant).toBe(true);
1826
- }
1827
- });
1828
-
1829
- test("GET /v1/config hides managed backups from the picker catalog", async () => {
1591
+ test("GET /v1/config returns profile entries verbatim — no wire-only flags stamped", async () => {
1592
+ // The response is the raw loaded config: managed-ness reads off the
1593
+ // entry's own `source`, and capabilities come from the profiles API
1594
+ // (`GET inference/profiles`), not from flags stamped here.
1830
1595
  const body = await configGetRoute.handler({});
1831
1596
  const profiles = wireProfiles(body);
1832
1597
 
1833
- for (const name of BACKUP_PROFILE_KEYS) {
1834
- expect(profiles).not.toHaveProperty(name);
1598
+ expect(profiles.balanced!.provider).toBe("fireworks");
1599
+ expect(profiles.balanced!.model).toBe("accounts/fireworks/models/glm-5p2");
1600
+ expect(profiles.custom!.provider).toBe("anthropic");
1601
+ for (const profile of Object.values(profiles)) {
1602
+ expect(profile).not.toHaveProperty("invariant");
1603
+ expect(profile).not.toHaveProperty("supportsVision");
1835
1604
  }
1836
- expect(profiles.balanced).toBeDefined();
1837
1605
  });
1838
1606
 
1839
- test("PATCH /v1/config stamps the flag on the response but never persists it", async () => {
1607
+ test("PATCH /v1/config response serves profiles verbatim and never persists wire-only keys", async () => {
1840
1608
  const body = await configPatchRoute.handler({
1841
1609
  body: { memory: { enabled: true } },
1842
1610
  });
1843
1611
  const profiles = wireProfiles(body);
1844
- expect(profiles.balanced!.invariant).toBe(true);
1612
+ for (const profile of Object.values(profiles)) {
1613
+ expect(profile).not.toHaveProperty("invariant");
1614
+ expect(profile).not.toHaveProperty("supportsVision");
1615
+ }
1845
1616
 
1846
1617
  const savedProfiles = (
1847
1618
  loadRawConfig().llm as { profiles: WireProfiles } | undefined
@@ -1849,11 +1620,12 @@ describe("config invariant flag enrichment", () => {
1849
1620
  expect(savedProfiles).toBeDefined();
1850
1621
  for (const profile of Object.values(savedProfiles!)) {
1851
1622
  expect(profile).not.toHaveProperty("invariant");
1623
+ expect(profile).not.toHaveProperty("supportsVision");
1852
1624
  }
1853
1625
  });
1854
1626
  });
1855
1627
 
1856
- describe("provider membership at the write choke point", () => {
1628
+ describe("provider labels follow the open-string Zod schema", () => {
1857
1629
  const configPatchRoute = ROUTES.find(
1858
1630
  (r) => r.operationId === "config_patch",
1859
1631
  )!;
@@ -1887,21 +1659,23 @@ describe("provider membership at the write choke point", () => {
1887
1659
  expect(llm.profiles?.work?.provider).toBe("anthropic-work");
1888
1660
  });
1889
1661
 
1890
- test("introducing an unknown provider is rejected", async () => {
1662
+ test("a new provider label is accepted by the schema", async () => {
1891
1663
  rawConfigFixture = { llm: {} };
1892
1664
  seedRawConfig();
1893
-
1894
- await expect(
1895
- configPatchRoute.handler({
1896
- body: {
1897
- llm: {
1898
- profiles: {
1899
- rogue: { source: "user", provider: "not-a-provider", model: "m" },
1665
+ await configPatchRoute.handler({
1666
+ body: {
1667
+ llm: {
1668
+ profiles: {
1669
+ work: {
1670
+ source: "user",
1671
+ provider: "anthropic-work",
1672
+ model: "claude-opus-4-8",
1900
1673
  },
1901
1674
  },
1902
1675
  },
1903
- }),
1904
- ).rejects.toThrow(/Invalid provider/);
1676
+ },
1677
+ });
1678
+ expect(persistedProfile("work").provider).toBe("anthropic-work");
1905
1679
  });
1906
1680
  });
1907
1681
 
@@ -2026,7 +1800,7 @@ describe("config writes to a per-agent acp entry", () => {
2026
1800
 
2027
1801
  expect("model" in agentEntry(loadRawConfig())).toBe(false);
2028
1802
  expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
2029
- expect(loadConfig().acp.agents.claude?.model).toBeUndefined();
1803
+ expect(getConfig().acp.agents.claude?.model).toBeUndefined();
2030
1804
  });
2031
1805
 
2032
1806
  test("a nulled per-agent command is dropped on both write paths", async () => {
@@ -2036,7 +1810,7 @@ describe("config writes to a per-agent acp entry", () => {
2036
1810
 
2037
1811
  expect("command" in agentEntry(loadRawConfig())).toBe(false);
2038
1812
  expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
2039
- expect(loadConfig().acp.agents.claude?.command).toBeUndefined();
1813
+ expect(getConfig().acp.agents.claude?.command).toBeUndefined();
2040
1814
 
2041
1815
  seedRawConfig();
2042
1816
  await patchRoute.handler({
@@ -2047,7 +1821,7 @@ describe("config writes to a per-agent acp entry", () => {
2047
1821
  expect("command" in patched).toBe(false);
2048
1822
  expect(patched.model).toBe("opus");
2049
1823
  expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
2050
- expect(loadConfig().acp.agents.claude?.command).toBeUndefined();
1824
+ expect(getConfig().acp.agents.claude?.command).toBeUndefined();
2051
1825
  });
2052
1826
 
2053
1827
  test("a nulled command on an id with no bundled profile is rejected", async () => {
@@ -2078,7 +1852,7 @@ describe("config writes to a per-agent acp entry", () => {
2078
1852
  const entry = agentEntry(loadRawConfig());
2079
1853
  expect("command" in entry).toBe(false);
2080
1854
  expect(AssistantConfigSchema.safeParse(loadRawConfig()).success).toBe(true);
2081
- expect(loadConfig().acp.agents.claude?.model).toBe("sonnet");
1855
+ expect(getConfig().acp.agents.claude?.model).toBe("sonnet");
2082
1856
  });
2083
1857
  });
2084
1858
 
@@ -2233,7 +2007,7 @@ describe("persisted chat settings", () => {
2233
2007
 
2234
2008
  // Nulled leaves reset to the schema default on the canonical save (the
2235
2009
  // read-time recovery had already cleaned the stored nulls).
2236
- expect(loadConfig().conversations.autoArchive).toEqual({
2010
+ expect(getConfig().conversations.autoArchive).toEqual({
2237
2011
  enabled: false,
2238
2012
  afterDays: 7,
2239
2013
  });
@@ -2285,11 +2059,11 @@ describe("persisted chat settings", () => {
2285
2059
  notifications: { newMessageEnabled: false },
2286
2060
  });
2287
2061
  invalidateConfigCache();
2288
- expect(loadConfig().conversations.autoArchive).toEqual({
2062
+ expect(getConfig().conversations.autoArchive).toEqual({
2289
2063
  enabled: true,
2290
2064
  afterDays: 30,
2291
2065
  });
2292
- expect(loadConfig().notifications.newMessageEnabled).toBe(false);
2066
+ expect(getConfig().notifications.newMessageEnabled).toBe(false);
2293
2067
  expect(await getRoute.handler({})).toEqual(result);
2294
2068
  expect(initializeProvidersCalls).toBe(1);
2295
2069
  expect(clearEmbeddingBackendCacheCalls).toBe(1);
@@ -2321,11 +2095,11 @@ describe("persisted chat settings", () => {
2321
2095
  });
2322
2096
  // The nulled leaves restore to the schema defaults on the canonical
2323
2097
  // save; the unknown sibling key (futureOption) doesn't persist.
2324
- expect(loadConfig().conversations.autoArchive).toEqual({
2098
+ expect(getConfig().conversations.autoArchive).toEqual({
2325
2099
  enabled: false,
2326
2100
  afterDays: 7,
2327
2101
  });
2328
- expect(loadConfig().notifications.newMessageEnabled).toBe(true);
2102
+ expect(getConfig().notifications.newMessageEnabled).toBe(true);
2329
2103
  expect(
2330
2104
  "futureOption" in
2331
2105
  (loadRawConfig().conversations as Record<string, unknown>),
@@ -2343,11 +2117,11 @@ describe("persisted chat settings", () => {
2343
2117
  });
2344
2118
  // The nulled subtrees restore to the schema defaults on the canonical
2345
2119
  // save — the same values a fresh read would materialize.
2346
- expect(loadConfig().conversations.autoArchive).toEqual({
2120
+ expect(getConfig().conversations.autoArchive).toEqual({
2347
2121
  enabled: false,
2348
2122
  afterDays: 7,
2349
2123
  });
2350
- expect(loadConfig().notifications.newMessageEnabled).toBe(true);
2124
+ expect(getConfig().notifications.newMessageEnabled).toBe(true);
2351
2125
  });
2352
2126
 
2353
2127
  test.each([
@@ -2429,7 +2203,7 @@ describe("persisted chat settings", () => {
2429
2203
  await setRoute.handler({
2430
2204
  body: { path: "notifications.newMessageEnabled", value: true },
2431
2205
  });
2432
- expect(loadConfig().notifications.newMessageEnabled).toBe(true);
2206
+ expect(getConfig().notifications.newMessageEnabled).toBe(true);
2433
2207
  // Schema-canonical saves strip keys the schema doesn't know.
2434
2208
  expect(
2435
2209
  "futureOption" in
@@ -27,7 +27,7 @@ import {
27
27
  getDefaultPluginRouteRoots,
28
28
  getDefaultPluginRoutesDir,
29
29
  } from "../../../plugins/defaults/main.js";
30
- import { getWorkspacePluginsDir } from "../../../util/platform.js";
30
+ import { getWorkspacePluginsDir } from "../../../util/layout.js";
31
31
  import { UserRouteDispatcher } from "../user-route-dispatcher.js";
32
32
  import {
33
33
  isRouteTestPath,