@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
@@ -67,21 +67,18 @@ function makeDefaultRawConfig(): Record<string, unknown> {
67
67
  llm: {
68
68
  profiles: {
69
69
  "quality-optimized": {
70
- provider: "anthropic",
71
- model: "claude-sonnet",
72
- source: "managed",
70
+ provider: "cadet",
71
+ model: "claude-sonnet-4-6",
73
72
  },
74
73
  balanced: {
75
- provider: "anthropic",
76
- model: "claude-sonnet",
77
- source: "managed",
74
+ provider: "cadet",
75
+ model: "claude-sonnet-4-6",
78
76
  },
79
77
  "cost-optimized": {
80
- provider: "anthropic",
81
- model: "claude-haiku",
82
- source: "managed",
78
+ provider: "cadet",
79
+ model: "claude-sonnet-4-6",
83
80
  },
84
- "my-custom": { provider: "openai", model: "gpt-4o", source: "user" },
81
+ "my-custom": { provider: "openai", model: "gpt-4o" },
85
82
  },
86
83
  },
87
84
  };
@@ -141,6 +138,42 @@ function savedProfile(name: string): Record<string, unknown> {
141
138
  >;
142
139
  }
143
140
 
141
+ describe("partial default-provider config", () => {
142
+ for (const provider of ["cadet", "chatgpt"]) {
143
+ test(`timezone PATCH accepts a model-less ${provider} default`, async () => {
144
+ seedRawConfig({ llm: { default: { provider } } });
145
+ await patchRoute.handler({
146
+ body: { ui: { userTimezone: "America/New_York" } },
147
+ });
148
+ const saved = committedRaw() as {
149
+ ui: { userTimezone: string };
150
+ llm: { default: { provider: string; model?: string } };
151
+ };
152
+ expect(saved.ui.userTimezone).toBe("America/New_York");
153
+ expect(saved.llm.default).toEqual({ provider });
154
+ expectOneCommitCycle();
155
+ });
156
+ test(`PATCH can select ${provider} as default without a model`, async () => {
157
+ seedRawConfig({});
158
+ await patchRoute.handler({ body: { llm: { default: { provider } } } });
159
+ expect(
160
+ (committedRaw() as { llm: { default: { provider: string } } }).llm
161
+ .default,
162
+ ).toEqual({ provider });
163
+ });
164
+ }
165
+ test("Zod rejects a default model with the wrong type", async () => {
166
+ await expect(
167
+ patchRoute.handler({
168
+ body: {
169
+ llm: { default: { provider: "cadet", model: 42 } },
170
+ },
171
+ }),
172
+ ).rejects.toThrow(/model|expected string/i);
173
+ expectNothingCommitted();
174
+ });
175
+ });
176
+
144
177
  // ---------------------------------------------------------------------------
145
178
  // PUT /v1/config/llm/profiles/:name — replace inference profile
146
179
  // ---------------------------------------------------------------------------
@@ -213,13 +246,13 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
213
246
  ).toBeUndefined();
214
247
  });
215
248
 
216
- test("rejects a routing identity with an unroutable model at the write choke point", async () => {
249
+ test("Zod rejects invalid fields in a replacement profile", async () => {
217
250
  await expect(
218
251
  replaceRoute.handler({
219
252
  pathParams: { name: "my-custom" },
220
- body: { provider: "cadet", model: "not-a-real-model" },
253
+ body: { provider: "cadet", model: "claude-opus-4-8", maxTokens: 0 },
221
254
  }),
222
- ).rejects.toThrow(/not served by the Cadet Cloud route/);
255
+ ).rejects.toThrow(/expected number to be >0/);
223
256
  expect(committedRaw()).toBeNull();
224
257
  });
225
258
 
@@ -246,10 +279,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
246
279
  llm: {
247
280
  profiles: {
248
281
  balanced: {
249
- provider: "anthropic",
250
- model: "claude-sonnet",
282
+ provider: "cadet",
283
+ model: "claude-sonnet-4-6",
251
284
  label: "My Custom Name",
252
- source: "managed",
253
285
  },
254
286
  },
255
287
  },
@@ -319,10 +351,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
319
351
  llm: {
320
352
  profiles: {
321
353
  "quality-optimized": {
322
- provider: "anthropic",
323
- model: "claude-opus",
354
+ provider: "cadet",
355
+ model: "claude-sonnet-4-6",
324
356
  status: "disabled",
325
- source: "managed",
326
357
  },
327
358
  },
328
359
  },
@@ -334,8 +365,8 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
334
365
  expect(result).toEqual({ ok: true });
335
366
  const profile = savedProfile("quality-optimized");
336
367
  expect("status" in profile).toBe(false);
337
- expect(profile.provider).toBe("anthropic");
338
- expect(profile.model).toBe("claude-opus");
368
+ expect(profile.provider).toBe("cadet");
369
+ expect(profile.model).toBe("claude-sonnet-4-6");
339
370
  });
340
371
 
341
372
  test("PUT { label: null, status: null } on managed os-beta is rejected (label is frozen)", async () => {
@@ -343,11 +374,10 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
343
374
  llm: {
344
375
  profiles: {
345
376
  "os-beta": {
346
- provider: "together",
377
+ provider: "cadet",
347
378
  model: "zai-org/GLM-5.2",
348
379
  label: "OS Beta (Custom)",
349
380
  status: "disabled",
350
- source: "managed",
351
381
  },
352
382
  },
353
383
  },
@@ -368,10 +398,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
368
398
  llm: {
369
399
  profiles: {
370
400
  "os-beta": {
371
- provider: "together",
401
+ provider: "cadet",
372
402
  model: "zai-org/GLM-5.2",
373
403
  label: "Custom Label",
374
- source: "managed",
375
404
  },
376
405
  },
377
406
  },
@@ -392,9 +421,8 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
392
421
  llm: {
393
422
  profiles: {
394
423
  "os-beta": {
395
- provider: "together",
424
+ provider: "cadet",
396
425
  model: "zai-org/GLM-5.2",
397
- source: "managed",
398
426
  },
399
427
  },
400
428
  },
@@ -413,10 +441,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
413
441
  llm: {
414
442
  profiles: {
415
443
  "os-beta": {
416
- provider: "together",
444
+ provider: "cadet",
417
445
  model: "zai-org/GLM-5.2",
418
446
  topP: 0.7,
419
- source: "managed",
420
447
  },
421
448
  },
422
449
  },
@@ -435,10 +462,9 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
435
462
  llm: {
436
463
  profiles: {
437
464
  "os-beta": {
438
- provider: "together",
439
- model: "zai-org/GLM-5.2",
465
+ provider: "cadet",
466
+ model: "claude-sonnet-4-6",
440
467
  status: "disabled",
441
- source: "managed",
442
468
  },
443
469
  },
444
470
  },
@@ -451,8 +477,8 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
451
477
  expectOneCommitCycle();
452
478
  const profile = savedProfile("os-beta");
453
479
  expect(profile.status).toBe("active");
454
- expect(profile.provider).toBe("together");
455
- expect(profile.model).toBe("zai-org/GLM-5.2");
480
+ expect(profile.provider).toBe("cadet");
481
+ expect(profile.model).toBe("claude-sonnet-4-6");
456
482
  });
457
483
 
458
484
  test("allows edits to a user-owned profile sharing a cloud name (os-beta)", async () => {
@@ -461,8 +487,7 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
461
487
  profiles: {
462
488
  "os-beta": {
463
489
  provider: "anthropic",
464
- model: "claude-sonnet",
465
- source: "user",
490
+ model: "gpt-4o",
466
491
  },
467
492
  },
468
493
  },
@@ -482,9 +507,8 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
482
507
  llm: {
483
508
  profiles: {
484
509
  "os-beta": {
485
- provider: "fireworks",
510
+ provider: "cadet",
486
511
  model: "accounts/fireworks/models/glm-5p2",
487
- source: "managed",
488
512
  },
489
513
  },
490
514
  },
@@ -532,30 +556,6 @@ describe("PUT /v1/config/llm/profiles/:name — cloud profile guard", () => {
532
556
  // ---------------------------------------------------------------------------
533
557
 
534
558
  describe("PATCH /v1/config — cloud profile deletion guard", () => {
535
- test("rejects deletion of quality-optimized via null with descriptive message", async () => {
536
- await expect(
537
- patchRoute.handler({
538
- body: { llm: { profiles: { "quality-optimized": null } } },
539
- }),
540
- ).rejects.toThrow('Cannot delete cloud profile "quality-optimized".');
541
- });
542
-
543
- test("rejects deletion of balanced via null", async () => {
544
- await expect(
545
- patchRoute.handler({
546
- body: { llm: { profiles: { balanced: null } } },
547
- }),
548
- ).rejects.toThrow(BadRequestError);
549
- });
550
-
551
- test("rejects deletion of cost-optimized via null", async () => {
552
- await expect(
553
- patchRoute.handler({
554
- body: { llm: { profiles: { "cost-optimized": null } } },
555
- }),
556
- ).rejects.toThrow(BadRequestError);
557
- });
558
-
559
559
  test("allows deletion of custom-balanced via null (user-owned)", async () => {
560
560
  const result = await patchRoute.handler({
561
561
  body: { llm: { profiles: { "custom-balanced": null } } },
@@ -616,9 +616,8 @@ describe("PATCH /v1/config — cloud profile deletion guard", () => {
616
616
  llm: {
617
617
  profiles: {
618
618
  "os-beta": {
619
- provider: "anthropic",
620
- model: "claude-sonnet",
621
- source: "user",
619
+ provider: "cadet",
620
+ model: "claude-sonnet-4-6",
622
621
  },
623
622
  },
624
623
  },
@@ -628,33 +627,6 @@ describe("PATCH /v1/config — cloud profile deletion guard", () => {
628
627
  });
629
628
  expect(result).toHaveProperty("llm");
630
629
  });
631
-
632
- test("rejects deletion of a cloud os-beta profile", async () => {
633
- seedRawConfig({
634
- llm: {
635
- profiles: {
636
- "os-beta": {
637
- provider: "fireworks",
638
- model: "accounts/fireworks/models/glm-5p2",
639
- source: "managed",
640
- },
641
- },
642
- },
643
- });
644
- await expect(
645
- patchRoute.handler({
646
- body: { llm: { profiles: { "os-beta": null } } },
647
- }),
648
- ).rejects.toThrow('Cannot delete cloud profile "os-beta".');
649
- });
650
-
651
- test("rejects nulling the entire profiles map", async () => {
652
- await expect(
653
- patchRoute.handler({
654
- body: { llm: { profiles: null } },
655
- }),
656
- ).rejects.toThrow("Cannot null llm.profiles");
657
- });
658
630
  });
659
631
 
660
632
  // ---------------------------------------------------------------------------
@@ -664,93 +636,10 @@ describe("PATCH /v1/config — cloud profile deletion guard", () => {
664
636
  // os-beta) is read-only to every config-write route while its on-disk entry
665
637
  // is managed-source; the only writable transition is re-enabling a disabled
666
638
  // profile. A user-owned entry sharing a cloud name is not locked. Enforced
667
- // by `assertInvariantProfilesPreserved` at the commitConfigWrite choke
668
639
  // point, so PATCH, SET, and PUT are all covered by the same checks.
669
640
  // ---------------------------------------------------------------------------
670
641
 
671
642
  describe("cloud-profile invariant guard — rejected writes", () => {
672
- test("PATCH disabling balanced is rejected (active → disabled)", async () => {
673
- await expect(
674
- patchRoute.handler({
675
- body: { llm: { profiles: { balanced: { status: "disabled" } } } },
676
- }),
677
- ).rejects.toThrow('Cannot disable cloud profile "balanced".');
678
- expectNothingCommitted();
679
- });
680
-
681
- test("PATCH setting a label on balanced is rejected", async () => {
682
- await expect(
683
- patchRoute.handler({
684
- body: { llm: { profiles: { balanced: { label: "X" } } } },
685
- }),
686
- ).rejects.toThrow(
687
- 'Cannot edit cloud profile "balanced" fields [label]. ' +
688
- "Cloud profiles are read-only; duplicate to a custom profile to customize.",
689
- );
690
- expectNothingCommitted();
691
- });
692
-
693
- test("PATCH { label: null } on balanced is rejected when a label exists", async () => {
694
- (rawConfig as Record<string, any>).llm.profiles.balanced.label = "Balanced";
695
- seedRawConfig(rawConfig);
696
- await expect(
697
- patchRoute.handler({
698
- body: { llm: { profiles: { balanced: { label: null } } } },
699
- }),
700
- ).rejects.toThrow('Cannot edit cloud profile "balanced" fields [label]');
701
- expectNothingCommitted();
702
- });
703
-
704
- test("PATCH { topP: 0.8 } on balanced is rejected", async () => {
705
- await expect(
706
- patchRoute.handler({
707
- body: { llm: { profiles: { balanced: { topP: 0.8 } } } },
708
- }),
709
- ).rejects.toThrow('Cannot edit cloud profile "balanced" fields [topP]');
710
- expectNothingCommitted();
711
- });
712
-
713
- test("PATCH { topP: null } on balanced is rejected when an on-disk override exists", async () => {
714
- (rawConfig as Record<string, any>).llm.profiles.balanced.topP = 0.7;
715
- seedRawConfig(rawConfig);
716
- await expect(
717
- patchRoute.handler({
718
- body: { llm: { profiles: { balanced: { topP: null } } } },
719
- }),
720
- ).rejects.toThrow('Cannot edit cloud profile "balanced" fields [topP]');
721
- expectNothingCommitted();
722
- });
723
-
724
- test("PATCH disabling a cloud-source os-beta is rejected (active → disabled)", async () => {
725
- (rawConfig as Record<string, any>).llm.profiles["os-beta"] = {
726
- provider: "together",
727
- model: "zai-org/GLM-5.2",
728
- source: "managed",
729
- };
730
- seedRawConfig(rawConfig);
731
- await expect(
732
- patchRoute.handler({
733
- body: { llm: { profiles: { "os-beta": { status: "disabled" } } } },
734
- }),
735
- ).rejects.toThrow('Cannot disable cloud profile "os-beta".');
736
- expectNothingCommitted();
737
- });
738
-
739
- test("SET llm.profiles.os-beta.label is rejected on a cloud-source entry", async () => {
740
- (rawConfig as Record<string, any>).llm.profiles["os-beta"] = {
741
- provider: "together",
742
- model: "zai-org/GLM-5.2",
743
- source: "managed",
744
- };
745
- seedRawConfig(rawConfig);
746
- await expect(
747
- setRoute.handler({
748
- body: { path: "llm.profiles.os-beta.label", value: "My OS Beta" },
749
- }),
750
- ).rejects.toThrow('Cannot edit cloud profile "os-beta" fields [label]');
751
- expectNothingCommitted();
752
- });
753
-
754
643
  test("PATCH overwriting balanced with a string is rejected", async () => {
755
644
  await expect(
756
645
  patchRoute.handler({
@@ -785,22 +674,6 @@ describe("cloud-profile invariant guard — rejected writes", () => {
785
674
  expectNothingCommitted();
786
675
  });
787
676
 
788
- test("SET llm.profiles.balanced.status = 'disabled' is rejected", async () => {
789
- await expect(
790
- setRoute.handler({
791
- body: { path: "llm.profiles.balanced.status", value: "disabled" },
792
- }),
793
- ).rejects.toThrow('Cannot disable cloud profile "balanced".');
794
- expectNothingCommitted();
795
- });
796
-
797
- test("SET llm = {} is rejected (would drop all defaults)", async () => {
798
- await expect(
799
- setRoute.handler({ body: { path: "llm", value: {} } }),
800
- ).rejects.toThrow(/Cannot delete or replace cloud profile/);
801
- expectNothingCommitted();
802
- });
803
-
804
677
  test("PATCH { status: 'weird' } on balanced is rejected (junk status)", async () => {
805
678
  await expect(
806
679
  patchRoute.handler({
@@ -905,8 +778,7 @@ describe("default-profile invariant guard — allowed writes", () => {
905
778
  test("PUT full edits on a user-sourced os-beta entry are allowed (invariance is source-gated)", async () => {
906
779
  (rawConfig as Record<string, any>).llm.profiles["os-beta"] = {
907
780
  provider: "anthropic",
908
- model: "claude-sonnet",
909
- source: "user",
781
+ model: "claude-sonnet-4-6",
910
782
  };
911
783
  seedRawConfig(rawConfig);
912
784
  const result = await replaceRoute.handler({
@@ -997,8 +869,8 @@ describe("wire-only profile keys are stripped from writes", () => {
997
869
  const profile = savedProfile("balanced");
998
870
  expect("invariant" in profile).toBe(false);
999
871
  expect("supportsVision" in profile).toBe(false);
1000
- expect(profile.provider).toBe("anthropic");
1001
- expect(profile.model).toBe("claude-sonnet");
872
+ expect(profile.provider).toBe("cadet");
873
+ expect(profile.model).toBe("claude-sonnet-4-6");
1002
874
  });
1003
875
 
1004
876
  test("SET of a wire-only leaf path never persists the key", async () => {
@@ -1035,8 +907,8 @@ describe("wire-only profile keys are stripped from writes", () => {
1035
907
  expect(profile.status).toBe("active");
1036
908
  expect("supportsVision" in profile).toBe(false);
1037
909
  expect("invariant" in profile).toBe(false);
1038
- expect(profile.provider).toBe("anthropic");
1039
- expect(profile.model).toBe("claude-sonnet");
910
+ expect(profile.provider).toBe("cadet");
911
+ expect(profile.model).toBe("claude-sonnet-4-6");
1040
912
  });
1041
913
 
1042
914
  test("pure no-op SET round-trip with stale on-disk supportsVision succeeds", async () => {
@@ -1053,8 +925,8 @@ describe("wire-only profile keys are stripped from writes", () => {
1053
925
  const profile = savedProfile("balanced");
1054
926
  expect("supportsVision" in profile).toBe(false);
1055
927
  expect("invariant" in profile).toBe(false);
1056
- expect(profile.provider).toBe("anthropic");
1057
- expect(profile.model).toBe("claude-sonnet");
928
+ expect(profile.provider).toBe("cadet");
929
+ expect(profile.model).toBe("claude-sonnet-4-6");
1058
930
  });
1059
931
 
1060
932
  test("PATCH re-enable carrying wire keys succeeds when the on-disk entry has stale supportsVision", async () => {
@@ -1108,99 +980,18 @@ describe("wire-only profile keys are stripped from writes", () => {
1108
980
  const getRoute = ROUTES.find((r) => r.operationId === "config_get")!;
1109
981
 
1110
982
  describe("code-owned default profiles — wire view and write normalization", () => {
1111
- test("GET materializes catalog bodies over thin stubs (wire-only)", async () => {
983
+ test("GET serves thin stubs verbatim — materialization lives on the profiles API", async () => {
1112
984
  seedRawConfig({
1113
985
  llm: {
1114
- profiles: { balanced: { source: "managed", status: "disabled" } },
986
+ profiles: { balanced: { status: "disabled" } },
1115
987
  },
1116
988
  });
1117
989
  const response = (await getRoute.handler({})) as Record<string, any>;
1118
990
  const wireBalanced = response.llm.profiles.balanced;
1119
- expect(wireBalanced.model).toBe("accounts/fireworks/models/glm-5p3-flash");
1120
- expect(wireBalanced.provider).toBe("cadet");
1121
- expect(wireBalanced.provider_connection).toBeUndefined();
1122
- expect(wireBalanced.status).toBe("disabled");
1123
- expect(wireBalanced.invariant).toBe(true);
1124
- // Absent defaults are materialized too — the catalog owns their content.
1125
- expect(response.llm.profiles["quality-optimized"].model).toBeDefined();
1126
- });
1127
-
1128
- test("GET → PATCH round-trip of the wire view is accepted and keeps disk stubs thin", async () => {
1129
- seedRawConfig({
1130
- llm: {
1131
- profiles: {
1132
- balanced: { source: "managed", status: "disabled" },
1133
- "my-custom": { provider: "openai", model: "gpt-4o", source: "user" },
1134
- },
1135
- },
1136
- });
1137
- const response = (await getRoute.handler({})) as Record<string, any>;
1138
- const result = await patchRoute.handler({
1139
- body: { llm: { profiles: response.llm.profiles } },
1140
- });
1141
- expect(result).toHaveProperty("llm");
1142
- expectOneCommitCycle();
1143
- expect(savedProfile("balanced")).toEqual({
1144
- source: "managed",
1145
- status: "disabled",
1146
- });
1147
- // Echoes of absent defaults reduce to a no-op managed stub.
1148
- expect(savedProfile("quality-optimized")).toEqual({ source: "managed" });
1149
- expect(savedProfile("my-custom")).toEqual({
1150
- provider: "openai",
1151
- model: "gpt-4o",
1152
- source: "user",
1153
- });
1154
- });
1155
-
1156
- test("creating a new profile under a default name is rejected", async () => {
1157
- seedRawConfig({ llm: { profiles: {} } });
1158
- await expect(
1159
- patchRoute.handler({
1160
- body: {
1161
- llm: {
1162
- profiles: {
1163
- balanced: { source: "user", provider: "openai", model: "gpt-4o" },
1164
- },
1165
- },
1166
- },
1167
- }),
1168
- ).rejects.toThrow(
1169
- 'Cannot create profile "balanced" — the name is reserved for a code-defined default profile.',
1170
- );
1171
- expectNothingCommitted();
1172
- });
1173
-
1174
- test("writing content to an absent default name is rejected", async () => {
1175
- seedRawConfig({ llm: { profiles: {} } });
1176
- await expect(
1177
- patchRoute.handler({
1178
- body: {
1179
- llm: {
1180
- profiles: {
1181
- "cost-optimized": { source: "managed", model: "gpt-4o" },
1182
- },
1183
- },
1184
- },
1185
- }),
1186
- ).rejects.toThrow(
1187
- 'Cannot edit cloud profile "cost-optimized" fields [model].',
1188
- );
1189
- expectNothingCommitted();
1190
- });
1191
-
1192
- test("disabling an absent default via a generic write is rejected", async () => {
1193
- seedRawConfig({ llm: { profiles: {} } });
1194
- await expect(
1195
- patchRoute.handler({
1196
- body: {
1197
- llm: {
1198
- profiles: { balanced: { source: "managed", status: "disabled" } },
1199
- },
1200
- },
1201
- }),
1202
- ).rejects.toThrow('Cannot disable cloud profile "balanced".');
1203
- expectNothingCommitted();
991
+ expect(wireBalanced).toEqual({ status: "disabled" });
992
+ // Catalog-only defaults (no on-disk stub) do not appear at all — the
993
+ // profiles API's list serves their resolved bodies.
994
+ expect(response.llm.profiles["quality-optimized"]).toBeUndefined();
1204
995
  });
1205
996
 
1206
997
  test("PUT status re-enable on an absent always-available default creates a thin managed stub", async () => {
@@ -1211,7 +1002,6 @@ describe("code-owned default profiles — wire view and write normalization", ()
1211
1002
  });
1212
1003
  expect(result).toEqual({ ok: true });
1213
1004
  expect(savedProfile("balanced")).toEqual({
1214
- source: "managed",
1215
1005
  status: "active",
1216
1006
  });
1217
1007
  });
@@ -1251,25 +1041,19 @@ describe("code-owned default profiles — BYO default provider wire view", () =>
1251
1041
  // intent × provider matrix that actually dispatches — not the cadet
1252
1042
  // column — and the write path must echo-strip against that same view or an
1253
1043
  // honest GET → write round-trip is rejected.
1254
- test("GET materializes the default provider's column for default profiles", async () => {
1044
+ test("GET serves no catalog-only defaults — the profiles API materializes the column", async () => {
1255
1045
  seedRawConfig({
1256
1046
  llm: { default: { provider: "anthropic" }, profiles: {} },
1257
1047
  });
1258
1048
  const response = (await getRoute.handler({})) as Record<string, any>;
1259
- const wireBalanced = response.llm.profiles.balanced;
1260
- expect(wireBalanced.provider).toBe("anthropic");
1261
- expect(wireBalanced.model).toBe("claude-sonnet-4-6");
1262
- expect(wireBalanced.provider_connection).toBe("anthropic-personal");
1263
- expect(response.llm.profiles["quality-optimized"].provider).toBe(
1264
- "anthropic",
1265
- );
1049
+ expect(response.llm.profiles).toEqual({});
1266
1050
  });
1267
1051
 
1268
- test("GET → PATCH round-trip of the BYO wire view is accepted and keeps disk stubs thin", async () => {
1052
+ test("GET → PATCH round-trip of the raw profiles is accepted on a BYO install too", async () => {
1269
1053
  seedRawConfig({
1270
1054
  llm: {
1271
1055
  default: { provider: "anthropic" },
1272
- profiles: { balanced: { source: "managed", status: "disabled" } },
1056
+ profiles: { balanced: { status: "disabled" } },
1273
1057
  },
1274
1058
  });
1275
1059
  const response = (await getRoute.handler({})) as Record<string, any>;
@@ -1279,14 +1063,13 @@ describe("code-owned default profiles — BYO default provider wire view", () =>
1279
1063
  expect(result).toHaveProperty("llm");
1280
1064
  expectOneCommitCycle();
1281
1065
  expect(savedProfile("balanced")).toEqual({
1282
- source: "managed",
1283
1066
  status: "disabled",
1284
1067
  });
1285
- // Echoes of absent defaults reduce to a no-op managed stub.
1286
- expect(savedProfile("quality-optimized")).toEqual({ source: "managed" });
1068
+ // No absent-default echoes exist to reduce — nothing else is written.
1069
+ expect(savedProfile("quality-optimized")).toBeUndefined();
1287
1070
  });
1288
1071
 
1289
- test("GET → SET llm round-trip of the BYO wire view is accepted", async () => {
1072
+ test("GET → SET llm round-trip of the raw view is accepted and writes no stubs", async () => {
1290
1073
  seedRawConfig({
1291
1074
  llm: { default: { provider: "anthropic" }, profiles: {} },
1292
1075
  });
@@ -1295,109 +1078,9 @@ describe("code-owned default profiles — BYO default provider wire view", () =>
1295
1078
  body: { path: "llm", value: response.llm },
1296
1079
  });
1297
1080
  expect(result).toHaveProperty("ok");
1298
- expect(savedProfile("balanced")).toEqual({ source: "managed" });
1299
- });
1300
- });
1301
-
1302
- describe("code-owned default profiles — leaf SET source stamping", () => {
1303
- test("a leaf SET creating a cloud entry stamps the cloud marker", async () => {
1304
- seedRawConfig({ llm: { profiles: {} } });
1305
- const result = await setRoute.handler({
1306
- body: { path: "llm.profiles.balanced.status", value: "active" },
1307
- });
1308
- expect(result).toEqual({ ok: true });
1309
- expect(savedProfile("balanced")).toEqual({
1310
- source: "managed",
1311
- status: "active",
1312
- });
1313
- });
1314
-
1315
- test("a leaf SET on an existing user shadow does not stamp it managed", async () => {
1316
- seedRawConfig({
1317
- llm: {
1318
- profiles: {
1319
- balanced: { source: "user", provider: "openai", model: "gpt-4o" },
1320
- },
1321
- },
1322
- });
1323
- const result = await setRoute.handler({
1324
- body: { path: "llm.profiles.balanced.model", value: "gpt-5.4" },
1325
- });
1326
- expect(result).toEqual({ ok: true });
1327
- // Write normalization completes the changed user entry; the guard's
1328
- // concern is only that `source` stays user-owned.
1329
- expect(savedProfile("balanced")).toMatchObject({
1330
- source: "user",
1331
- provider: "openai",
1332
- model: "gpt-5.4",
1333
- });
1334
- expect(savedProfile("balanced").source).toBe("user");
1335
- });
1336
-
1337
- test("a leaf SET writing content to an absent default is rejected", async () => {
1338
- seedRawConfig({ llm: { profiles: {} } });
1339
- await expect(
1340
- setRoute.handler({
1341
- body: { path: "llm.profiles.balanced.model", value: "gpt-4o" },
1342
- }),
1343
- ).rejects.toThrow(BadRequestError);
1344
- expectNothingCommitted();
1345
- });
1346
- });
1347
-
1348
- describe("code-owned default profiles — echoes over stale on-disk bodies", () => {
1349
- // An overlay can persist a cloud entry whose content differs from the
1350
- // catalog; GET serves catalog content, so a client echo carries values
1351
- // that match neither nothing — they match the wire view. The round-trip
1352
- // must still be a no-op.
1353
- const staleBody = {
1354
- source: "managed",
1355
- provider: "anthropic",
1356
- model: "claude-sonnet",
1357
- maxTokens: 16000,
1358
- };
1359
-
1360
- test("GET → PATCH round-trip over a stale managed body is accepted and changes nothing", async () => {
1361
- seedRawConfig({
1362
- llm: { profiles: { balanced: structuredClone(staleBody) } },
1363
- });
1364
- const response = (await getRoute.handler({})) as Record<string, any>;
1365
- // The wire view serves catalog content, not the stale body.
1366
- expect(response.llm.profiles.balanced.model).toBe(
1367
- "accounts/fireworks/models/glm-5p3-flash",
1368
- );
1369
- const result = await patchRoute.handler({
1370
- body: { llm: { profiles: response.llm.profiles } },
1371
- });
1372
- expect(result).toHaveProperty("llm");
1373
- expectOneCommitCycle();
1374
- expect(savedProfile("balanced")).toEqual(staleBody);
1375
- });
1376
-
1377
- test("GET → SET llm round-trip over a stale managed body is accepted and changes nothing", async () => {
1378
- seedRawConfig({
1379
- llm: { profiles: { balanced: structuredClone(staleBody) } },
1380
- });
1381
- const response = (await getRoute.handler({})) as Record<string, any>;
1382
- const result = await setRoute.handler({
1383
- body: { path: "llm.profiles", value: response.llm.profiles },
1384
- });
1385
- expect(result).toEqual({ ok: true });
1386
- expect(savedProfile("balanced")).toEqual(staleBody);
1387
- });
1388
-
1389
- test("a genuine content edit over a stale managed body is still rejected", async () => {
1390
- seedRawConfig({
1391
- llm: { profiles: { balanced: structuredClone(staleBody) } },
1392
- });
1393
- await expect(
1394
- patchRoute.handler({
1395
- body: {
1396
- llm: { profiles: { balanced: { model: "some-other-model" } } },
1397
- },
1398
- }),
1399
- ).rejects.toThrow(BadRequestError);
1400
- expectNothingCommitted();
1081
+ // The raw response carries no materialized catalog bodies, so the
1082
+ // catalog-only default stays catalog-only.
1083
+ expect(savedProfile("balanced")).toBeUndefined();
1401
1084
  });
1402
1085
  });
1403
1086