@mycadet/assistant 0.12.9 → 0.12.10

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