@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
@@ -1,15 +1,6 @@
1
- import { execFile } from "node:child_process";
2
1
  import { existsSync, statfsSync } from "node:fs";
3
- import { promisify } from "node:util";
4
2
 
5
- import {
6
- getIsCloud,
7
- getIsContainerized,
8
- getMinikubeStorageSize,
9
- } from "../config/env-registry.js";
10
- import { getWorkspaceDir } from "./platform.js";
11
-
12
- const execFileAsync = promisify(execFile);
3
+ import { getWorkspaceDir } from "./layout.js";
13
4
 
14
5
  export interface DiskUsageInfo {
15
6
  path: string;
@@ -19,111 +10,10 @@ export interface DiskUsageInfo {
19
10
  }
20
11
 
21
12
  /**
22
- * Measure the on-disk usage of one or more directory paths using `du -sb`.
23
- * Returns the sum of all paths in bytes, or null on failure.
13
+ * Report the filesystem containing the workspace using filesystem counters.
14
+ * Docker named volumes and minikube hostPath volumes report the backing
15
+ * filesystem, including usage outside the workspace and its provisioned quota.
24
16
  */
25
- async function getDirectorySizeBytes(paths: string[]): Promise<number | null> {
26
- try {
27
- const existing = paths.filter((p) => existsSync(p));
28
- if (existing.length === 0) {
29
- return null;
30
- }
31
- const { stdout } = await execFileAsync("du", ["-sb", ...existing], {
32
- timeout: 30_000,
33
- windowsHide: true,
34
- });
35
- let total = 0;
36
- for (const line of stdout.trim().split("\n")) {
37
- const size = parseInt(line.split("\t")[0], 10);
38
- if (!isNaN(size) && size > 0) {
39
- total += size;
40
- }
41
- }
42
- return total > 0 ? total : null;
43
- } catch {
44
- return null;
45
- }
46
- }
47
-
48
- const DU_CACHE_TTL_MS = 60_000;
49
- // Caches the in-flight promise so concurrent callers share one `du` run.
50
- let duCacheValue: Promise<number | null> | null = null;
51
- let duCacheTime = 0;
52
- let duCachePaths: string | null = null;
53
-
54
- function getCachedDirectorySizeBytes(paths: string[]): Promise<number | null> {
55
- const key = paths.join("\0");
56
- const now = Date.now();
57
- if (
58
- duCacheValue !== null &&
59
- duCachePaths === key &&
60
- now - duCacheTime < DU_CACHE_TTL_MS
61
- ) {
62
- return duCacheValue;
63
- }
64
- duCacheValue = getDirectorySizeBytes(paths);
65
- duCacheTime = now;
66
- duCachePaths = key;
67
- return duCacheValue;
68
- }
69
-
70
- export function __resetDiskUsageCacheForTests(): void {
71
- duCacheValue = null;
72
- duCacheTime = 0;
73
- duCachePaths = null;
74
- }
75
-
76
- /**
77
- * How the workspace volume's capacity should be reported when statfsSync
78
- * cannot see the volume directly.
79
- *
80
- * - `fixed-cap`: minikube hostPath PVC — the PVC request is the hard
81
- * capacity, so usage is measured with `du` and free space is whatever
82
- * remains within the quota.
83
- * - `host-free`: local Docker named volume — the volume is backed by the
84
- * host (or Colima VM) filesystem and can grow into its free space, so
85
- * usage is measured with `du` and the effective capacity is current usage
86
- * plus the host's remaining headroom.
87
- * - `none`: statfsSync already reports the volume accurately (bare metal, or
88
- * a cloud-managed instance on a CSI-backed PVC), so use it directly.
89
- */
90
- type WorkspaceVolumeReporting =
91
- | { kind: "none" }
92
- | { kind: "fixed-cap"; totalBytes: number }
93
- | { kind: "host-free" };
94
-
95
- /**
96
- * Decide how to report the workspace volume's capacity. Both minikube
97
- * hostPath PVCs and local Docker named volumes are backed by the host
98
- * filesystem, so statfsSync reports the host's entire disk rather than the
99
- * workspace volume — in both cases we measure actual usage with `du` instead.
100
- */
101
- function classifyWorkspaceVolume(
102
- fsTotalBytes: number,
103
- ): WorkspaceVolumeReporting {
104
- // Minikube mode: the cloud passes the PVC storage size so we can report
105
- // accurate capacity. Detect the hostPath case by comparing filesystem size
106
- // against the PVC size — if the filesystem is larger, statfsSync is seeing
107
- // the host disk and we should measure the directory instead.
108
- const storageSizeRaw = getMinikubeStorageSize();
109
- if (storageSizeRaw) {
110
- const pvcTotalBytes = parseK8sMemoryBytes(storageSizeRaw);
111
- if (pvcTotalBytes !== null && fsTotalBytes > pvcTotalBytes * 1.1) {
112
- return { kind: "fixed-cap", totalBytes: pvcTotalBytes };
113
- }
114
- return { kind: "none" };
115
- }
116
-
117
- // Local Docker hatch: the workspace is a Docker named volume backed by the
118
- // host filesystem. Platform-managed remote instances run on CSI-backed PVCs
119
- // where statfsSync already reports the volume, so they are excluded.
120
- if (getIsContainerized() && !getIsCloud()) {
121
- return { kind: "host-free" };
122
- }
123
-
124
- return { kind: "none" };
125
- }
126
-
127
17
  export async function getDiskUsageInfo(): Promise<DiskUsageInfo | null> {
128
18
  try {
129
19
  const wsDir = getWorkspaceDir();
@@ -134,31 +24,6 @@ export async function getDiskUsageInfo(): Promise<DiskUsageInfo | null> {
134
24
  const bytesToMb = (b: number) =>
135
25
  Math.round((b / (1024 * 1024)) * 100) / 100;
136
26
 
137
- const reporting = classifyWorkspaceVolume(fsTotalBytes);
138
- if (reporting.kind !== "none") {
139
- const volumePaths = [diskPath];
140
- if (diskPath !== "/data" && existsSync("/data")) {
141
- volumePaths.push("/data");
142
- }
143
- const usedBytes = await getCachedDirectorySizeBytes(volumePaths);
144
- if (usedBytes !== null) {
145
- const totalBytes =
146
- reporting.kind === "fixed-cap"
147
- ? reporting.totalBytes
148
- : usedBytes + fsFreeBytes;
149
- const freeBytes =
150
- reporting.kind === "fixed-cap"
151
- ? Math.max(0, reporting.totalBytes - usedBytes)
152
- : fsFreeBytes;
153
- return {
154
- path: diskPath,
155
- totalMb: bytesToMb(totalBytes),
156
- usedMb: bytesToMb(usedBytes),
157
- freeMb: bytesToMb(freeBytes),
158
- };
159
- }
160
- }
161
-
162
27
  return {
163
28
  path: diskPath,
164
29
  totalMb: bytesToMb(fsTotalBytes),
@@ -3,9 +3,9 @@
3
3
  * writes, all rooted at the workspace ($CADET_WORKSPACE_DIR) and its
4
4
  * internal data directory.
5
5
  *
6
- * Extracted from `util/platform.ts` — these are directory-layout concerns,
7
- * not platform-detection concerns. `platform.ts` re-exports this module for
8
- * backward compatibility; new code should import from here directly.
6
+ * Extracted from `util/platform.ts` (now deleted) — these are
7
+ * directory-layout concerns, not platform-detection concerns; the OS
8
+ * detection and PATH helpers live in `./os.js`.
9
9
  */
10
10
 
11
11
  import { chmodSync, existsSync, mkdirSync } from "node:fs";
@@ -15,8 +15,8 @@ import {
15
15
  getDebugStdoutLogs,
16
16
  getIsContainerized,
17
17
  } from "../config/env-registry.js";
18
+ import { getLogsDir } from "./layout.js";
18
19
  import { logSerializers } from "./log-redact.js";
19
- import { getLogsDir } from "./platform.js";
20
20
 
21
21
  const loadModule = createRequire(import.meta.url);
22
22
  let bundledPino: typeof import("pino") | undefined;
@@ -1,6 +1,6 @@
1
1
  import { join } from "node:path";
2
2
 
3
- import { getDataDir } from "./platform.js";
3
+ import { getDataDir } from "./layout.js";
4
4
 
5
5
  /**
6
6
  * Path to the dedicated SQLite file that houses heavy append-only tables
@@ -1,6 +1,6 @@
1
1
  import { join } from "node:path";
2
2
 
3
- import { getDataDir } from "./platform.js";
3
+ import { getDataDir } from "./layout.js";
4
4
 
5
5
  /**
6
6
  * Path to the dedicated SQLite file that houses the high-churn memory
@@ -1,17 +1,15 @@
1
1
  /**
2
- * Platform detection and environment-shaping helpers.
2
+ * Platform detection and host-environment shaping helpers.
3
3
  *
4
- * Directory-layout helpers (every canonical path under the workspace and
5
- * its data dir) live in `util/layout.ts` — they were never platform
6
- * concerns. This module re-exports that module for backward compatibility;
7
- * new code should import layout helpers from `./layout.js` directly.
4
+ * OS detection (`isMacOS`/`isLinux`/`isWindows`/`getPlatformName`), the
5
+ * per-user application-data root, and the PATH-shaping helpers
6
+ * daemon-spawned tools rely on. Directory-layout helpers (every canonical
7
+ * path under the workspace and its data dir) live in `./layout.js`.
8
8
  */
9
9
 
10
10
  import { homedir } from "node:os";
11
11
  import { delimiter, join } from "node:path";
12
12
 
13
- export * from "./layout.js";
14
-
15
13
  export function isMacOS(): boolean {
16
14
  return process.platform === "darwin";
17
15
  }
@@ -88,26 +86,3 @@ export function addToPathEnv(
88
86
  export function getPlatformName(): string {
89
87
  return process.platform;
90
88
  }
91
-
92
- /**
93
- * Normalize an assistant ID to its canonical form for DB operations.
94
- *
95
- * The system uses "self" as the canonical single-tenant identifier
96
- * (see migration 007-assistant-id-to-self). However, the desktop UI
97
- * sends the real assistant ID (e.g., "cadet-true-eel") while the
98
- * inbound call path resolves phone numbers to config keys (typically
99
- * "self"). This function maps the current assistant's ID to "self"
100
- * so both sides use a consistent DB key.
101
- */
102
- export function normalizeAssistantId(assistantId: string): string {
103
- if (assistantId === "self") {
104
- return "self";
105
- }
106
-
107
- const ownName = process.env.CADET_ASSISTANT_NAME;
108
- if (ownName && assistantId === ownName) {
109
- return "self";
110
- }
111
-
112
- return assistantId;
113
- }
@@ -129,6 +129,25 @@ export function deriveName(command: string): string {
129
129
  return argv0;
130
130
  }
131
131
 
132
+ /**
133
+ * Display cap for command-derived labels in `ps` output. `deriveName` can
134
+ * surface a whole argument list when an interpreter runs without a script
135
+ * (`bun x -y @scope/server --stdio …`), and a super-long label pads every
136
+ * row and stretches the whole table. The cap keeps the head (the interpreter
137
+ * or binary) and the tail (the identifying end), collapsing the middle to
138
+ * one ellipsis.
139
+ */
140
+ export const MAX_COMMAND_LABEL_LENGTH = 60;
141
+
142
+ export function truncateCommandLabel(label: string): string {
143
+ if (label.length <= MAX_COMMAND_LABEL_LENGTH) {
144
+ return label;
145
+ }
146
+ const head = 16;
147
+ const tail = MAX_COMMAND_LABEL_LENGTH - head - 1; // 1 char for the ellipsis
148
+ return `${label.slice(0, head)}…${label.slice(-tail)}`;
149
+ }
150
+
132
151
  /**
133
152
  * Redacted command descriptor for a live PID from `/proc/<pid>/cmdline`, or
134
153
  * null when the process is gone or its `/proc` entry is unreadable. Kernel
@@ -24,7 +24,7 @@ import { existsSync } from "node:fs";
24
24
  import { homedir } from "node:os";
25
25
  import { join } from "node:path";
26
26
 
27
- import { isWindows } from "./platform.js";
27
+ import { isWindows } from "./os.js";
28
28
 
29
29
  let cachedSqlite3Path: string | undefined | null;
30
30
 
@@ -1,6 +1,6 @@
1
1
  import { join } from "node:path";
2
2
 
3
- import { getDataDir } from "./platform.js";
3
+ import { getDataDir } from "./layout.js";
4
4
 
5
5
  /**
6
6
  * Path to the dedicated SQLite file that houses the telemetry-only tables:
@@ -123,21 +123,6 @@ mock.module("../../runtime/background-job-runner.js", () => ({
123
123
  },
124
124
  }));
125
125
 
126
- const inventoryCalls: number[] = [];
127
- const llmProcessedCalls: Array<{
128
- providerId: string;
129
- conversationId: string;
130
- }> = [];
131
-
132
- mock.module("../telemetry.js", () => ({
133
- recordWatcherInventoryIfDue: (now: number) => {
134
- inventoryCalls.push(now);
135
- },
136
- recordWatcherLlmProcessed: (providerId: string, conversationId: string) => {
137
- llmProcessedCalls.push({ providerId, conversationId });
138
- },
139
- }));
140
-
141
126
  // Import after mocks are in place.
142
127
  const { runWatchersOnce } = await import("../engine.js");
143
128
 
@@ -189,8 +174,6 @@ beforeEach(() => {
189
174
  setConvCalls.length = 0;
190
175
  dispositionCalls.length = 0;
191
176
  runJobCalls.length = 0;
192
- inventoryCalls.length = 0;
193
- llmProcessedCalls.length = 0;
194
177
  fakeProviderSource = "webhook";
195
178
  insertedEvents.length = 0;
196
179
  fetchedItems = [];
@@ -296,9 +279,6 @@ describe("runWatchersOnce — Phase 2 runBackgroundJob integration", () => {
296
279
  expect(setConvCalls).toEqual([
297
280
  { watcherId: "watcher-1", conversationId: "conv-success" },
298
281
  ]);
299
- expect(llmProcessedCalls).toEqual([
300
- { providerId: "linear", conversationId: "conv-success" },
301
- ]);
302
282
  expect(dispositionCalls).toHaveLength(2);
303
283
  for (const call of dispositionCalls) {
304
284
  expect(call.disposition).toBe("silent");
@@ -344,7 +324,6 @@ describe("runWatchersOnce — Phase 2 runBackgroundJob integration", () => {
344
324
  // which would clobber a valid prior conversation id in the DB.
345
325
  expect(setConvCalls).toEqual([]);
346
326
  // No conversation was bootstrapped, so no usage breadcrumb either.
347
- expect(llmProcessedCalls).toEqual([]);
348
327
  // Failure path still updates event dispositions.
349
328
  expect(dispositionCalls).toHaveLength(1);
350
329
  expect(dispositionCalls[0].disposition).toBe("error");
@@ -358,8 +337,6 @@ describe("runWatchersOnce — Phase 2 runBackgroundJob integration", () => {
358
337
 
359
338
  expect(runJobCalls).toHaveLength(0);
360
339
  expect(setConvCalls).toHaveLength(0);
361
- // Inventory telemetry runs on every tick regardless of pending work.
362
- expect(inventoryCalls).toHaveLength(1);
363
340
  });
364
341
 
365
342
  test("malicious payload reaches the runner only inside assistant-role sandwich.content", async () => {
@@ -25,10 +25,6 @@ import {
25
25
  } from "./constants.js";
26
26
  import { capPayloadForRender, capPayloadForStorage } from "./payload-bounds.js";
27
27
  import { getWatcherProvider } from "./provider-registry.js";
28
- import {
29
- recordWatcherInventoryIfDue,
30
- recordWatcherLlmProcessed,
31
- } from "./telemetry.js";
32
28
  import {
33
29
  claimDueWatchers,
34
30
  completeWatcherPoll,
@@ -229,8 +225,6 @@ export async function runWatchersOnce(
229
225
  const now = Date.now();
230
226
  let processed = 0;
231
227
 
232
- recordWatcherInventoryIfDue(now);
233
-
234
228
  // ── Phase 1: Poll providers for new events ──────────────────────
235
229
  const claimed = claimDueWatchers(now);
236
230
  for (const watcher of claimed) {
@@ -473,7 +467,6 @@ export async function runWatchersOnce(
473
467
  // is empty) — otherwise we'd overwrite a valid prior id with "".
474
468
  if (result.conversationId !== "") {
475
469
  setWatcherConversationId(watcher.id, result.conversationId);
476
- recordWatcherLlmProcessed(watcher.providerId, result.conversationId);
477
470
  }
478
471
 
479
472
  if (result.ok) {
@@ -5,8 +5,6 @@ import * as pluginInstallPlatform from "./cli/lib/install-from-cloud.js";
5
5
  import * as pluginInstallGitHub from "./cli/lib/install-from-github.js";
6
6
  import * as pluginInstalled from "./cli/lib/list-installed-plugins.js";
7
7
  import * as pluginCatalogCache from "./cli/lib/plugin-catalog-cache.js";
8
- import * as pluginCatalogLocal from "./cli/lib/plugin-catalog-local.js";
9
- import * as pluginPinHistory from "./cli/lib/plugin-pin-history.js";
10
8
  import * as pluginSurfaces from "./cli/lib/plugin-surfaces.js";
11
9
  import * as pluginSearch from "./cli/lib/search-plugins.js";
12
10
  import * as pluginUninstall from "./cli/lib/uninstall-plugin.js";
@@ -18,13 +16,11 @@ setBundledCliModules({
18
16
  configEnv,
19
17
  providerSecretCatalog,
20
18
  pluginCatalogCache,
21
- pluginCatalogLocal,
22
19
  pluginDiff,
23
20
  pluginInspect,
24
21
  pluginInstallGitHub,
25
22
  pluginInstallPlatform,
26
23
  pluginInstalled,
27
- pluginPinHistory,
28
24
  pluginSearch,
29
25
  pluginSurfaces,
30
26
  pluginUninstall,
@@ -18,12 +18,6 @@ switch (worker) {
18
18
  await import("./embedded/plugin-api.js");
19
19
  await import("./routes/worker.js");
20
20
  break;
21
- case "db-integrity": {
22
- const { runIntegrityCheck } =
23
- await import("./monitoring/db-integrity-check.js");
24
- console.log(JSON.stringify(runIntegrityCheck(process.argv[3] ?? "")));
25
- break;
26
- }
27
21
  default:
28
22
  throw new Error(`Unknown Windows worker entry: ${worker ?? "missing"}`);
29
23
  }
@@ -136,7 +136,7 @@ import { initializeDb } from "../persistence/db-init.js";
136
136
  import { conversations } from "../persistence/schema/index.js";
137
137
  import { setBroadcastOverrideForTesting } from "../runtime/assistant-event-hub.js";
138
138
  import type { Tool, ToolContext, ToolExecutionResult } from "../tools/types.js";
139
- import { getWorkspaceDir } from "../util/platform.js";
139
+ import { getWorkspaceDir } from "../util/layout.js";
140
140
  import { runLeaf, WorkflowUnknownProfileError } from "./leaf-runner.js";
141
141
 
142
142
  await initializeDb();
@@ -58,8 +58,8 @@ import {
58
58
  import type { Message, ToolDefinition } from "../providers/types.js";
59
59
  import { broadcastMessage } from "../runtime/assistant-event-hub.js";
60
60
  import type { Tool, ToolContext, ToolExecutionResult } from "../tools/types.js";
61
+ import { getWorkspaceDir } from "../util/layout.js";
61
62
  import { getLogger } from "../util/logger.js";
62
- import { getWorkspaceDir } from "../util/platform.js";
63
63
 
64
64
  const log = getLogger("workflow-leaf-runner");
65
65
 
@@ -22,8 +22,8 @@
22
22
  import { existsSync, readdirSync, readFileSync } from "node:fs";
23
23
  import { join } from "node:path";
24
24
 
25
+ import { getWorkspaceWorkflowsDir } from "../util/layout.js";
25
26
  import { getLogger } from "../util/logger.js";
26
- import { getWorkspaceWorkflowsDir } from "../util/platform.js";
27
27
  import { extractWorkflowMeta, type WorkflowMeta } from "./engine.js";
28
28
 
29
29
  const log = getLogger("workflow-library");
@@ -13,22 +13,14 @@ import { getCatalogProviderForModel } from "../providers/model-catalog.js";
13
13
  // up on every boot because the seeder overwrites cloud profiles. On-platform
14
14
  // instances preserve existing profiles (the cloud overlay is authoritative),
15
15
  // so instances that were hatched before thinking was enabled in the templates
16
- // are stuck with thinking disabled or absent.
17
- //
18
- // Workspace migration 097 patches the on-disk config once, but it runs before
19
- // mergeDefaultWorkspaceConfig() which can overwrite the fix with overlay
20
- // profiles that have thinking disabled or absent. lifecycle.ts calls this
21
- // repair again after the overlay merge + profile seeding so the fix sticks.
22
- // The migration keeps its own frozen copy of this logic (migration files are
23
- // self-contained snapshots and must not be imported from).
16
+ // are stuck with thinking disabled or absent. lifecycle.ts calls this repair
17
+ // after the overlay merge + profile seeding so the fix sticks.
24
18
  //
25
19
  // The repair patches both profiles, adding thinking: { enabled: true,
26
20
  // streamThinking: true } where it's missing or explicitly disabled. It skips
27
21
  // profiles that:
28
22
  // - Don't exist (no profile to patch)
29
23
  // - Already have thinking enabled (idempotent)
30
- // - Are source: "user" (user-created profiles are untouched)
31
- // - Have a non-managed, non-absent source (unknown origin)
32
24
  // - Resolve to a non-Anthropic provider (adaptive thinking is
33
25
  // Anthropic-specific). Effective provider is the profile's explicit
34
26
  // `provider`; otherwise the provider implied by a known catalog `model`
@@ -93,20 +85,9 @@ export function repairAdaptiveThinkingOnCloudProfiles(
93
85
  continue;
94
86
  }
95
87
 
96
- // Only patch managed Anthropic profiles.
97
- // Legacy profiles created before the `source` metadata field was introduced
98
- // have source=undefined. Treat these as managed when the profile name is one
99
- // of the canonical managed names (which TARGET_PROFILES already guarantees)
100
- // and the effective provider is Anthropic. Effective provider is the
101
- // explicit `provider`, else the provider implied by a known catalog
102
- // `model`, else the inherited llm.default.provider. Explicit
103
- // `source: "user"` profiles are always skipped.
104
- if (profile.source === "user") {
105
- continue;
106
- }
107
- if (profile.source !== undefined && profile.source !== "managed") {
108
- continue;
109
- }
88
+ // Only patch managed-name entries resolving to Anthropic. Effective
89
+ // provider is the explicit `provider`, else the provider implied by a
90
+ // known catalog `model`, else the inherited llm.default.provider.
110
91
  const effectiveProvider = resolveEffectiveProvider(
111
92
  profile,
112
93
  defaultProvider,
@@ -78,22 +78,20 @@ const HATCH_ERA_PROFILE_KEYS = [
78
78
  type HatchEraProfileKey = (typeof HATCH_ERA_PROFILE_KEYS)[number];
79
79
 
80
80
  /**
81
- * The exact stub shapes BYOK hatching left on each default key: thin (only
82
- * the workspace-owned overlay fields), `source: "managed"`, the frozen
83
- * per-key label, and a `status` of `"disabled"` (seeded at hatch, #30367),
84
- * `"active"` (re-enabled through the guard; safe to delete because the bare
85
- * key resolves active post-conversion), or no `status` key at all (installs
86
- * that already existed when #30367 landed got only the label rewrite;
87
- * migration 126 thinned those bodies to `{ source, label }`). Deletion
88
- * requires the full shape: a thin managed entry differing in any other way
89
- * (a guard-side edit on the bare key, or a non-frozen label or status
90
- * carried off a retired copy by this pass) is user overlay state and stays.
91
- * The carry arm below never writes the frozen label, so a match is always
92
- * hatch-written modulo the status toggle. A managed-source entry with any
93
- * other key (a cloud overlay body) is not a stub and is likewise left
94
- * alone.
81
+ * The exact stub shapes hatching leaves on each default key: thin (only
82
+ * the cadet-provider marker plus workspace-owned overlay fields), the
83
+ * frozen per-key label, and a `status` of `"disabled"` (seeded at hatch,
84
+ * #30367), `"active"` (re-enabled through the guard; safe to delete because
85
+ * the bare key resolves active post-conversion), or no `status` key at all
86
+ * (label-only rewrites). Deletion requires the full shape: a thin managed
87
+ * entry differing in any other way (a guard-side edit on the bare key, or a
88
+ * non-frozen label or status carried off a retired copy by this pass) is
89
+ * user overlay state and stays. The carry arm below never writes the frozen
90
+ * label, so a match is always hatch-written modulo the status toggle. A
91
+ * cadet-provider entry with any other key (a cloud overlay body) is not a
92
+ * stub and is likewise left alone.
95
93
  */
96
- const STUB_ONLY_KEYS = new Set(["source", "status", "label", "thinking"]);
94
+ const STUB_ONLY_KEYS = new Set(["provider", "status", "label", "thinking"]);
97
95
  const HATCH_STUB_LABELS: Record<HatchEraProfileKey, string> = {
98
96
  balanced: "Balanced (Managed)",
99
97
  "quality-optimized": "Quality (Managed)",
@@ -116,7 +114,7 @@ function isHatchStub(
116
114
  entry: Record<string, unknown>,
117
115
  ): boolean {
118
116
  return (
119
- entry.source === "managed" &&
117
+ entry.provider === "cadet" &&
120
118
  Object.keys(entry).every((k) => STUB_ONLY_KEYS.has(k)) &&
121
119
  (!("status" in entry) ||
122
120
  entry.status === "disabled" ||
@@ -332,7 +330,7 @@ export function ensureByokDefaultProfiles(workspaceDir: string): void {
332
330
  const overlay = userOverlayState(entry, key);
333
331
  delete profiles[name];
334
332
  if (overlay !== null && readObject(profiles[key]) === null) {
335
- const stub: Record<string, unknown> = { source: "managed", ...overlay };
333
+ const stub: Record<string, unknown> = { provider: "cadet", ...overlay };
336
334
  // A carried label that reproduces the hatch-stub shape is
337
335
  // indistinguishable from a genuine hatch stub and would be deleted by
338
336
  // the stub arm on the next boot, so the colliding label is never
@@ -370,7 +368,7 @@ export function ensureByokDefaultProfiles(workspaceDir: string): void {
370
368
  repairProfileSelections(llm, profiles, blob, carriedDisables);
371
369
 
372
370
  writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
373
- // The lifecycle call site runs before the first loadConfig() of this boot;
371
+ // The lifecycle call site runs before the first getConfig() of this boot;
374
372
  // this guards callers that read config earlier (and future reordering).
375
373
  invalidateConfigCache();
376
374
  }
@@ -413,13 +411,9 @@ function isKnownUneditedBody(
413
411
  ) {
414
412
  return false;
415
413
  }
416
- // Completion skips managed-source bodies, so a copy from the era whose
417
- // templates wrote `source: "managed"` (#29755 to #29768, 2026-05-05) is
418
- // compared as if user-source to keep both sides normalized identically.
419
414
  const normalizedEntry: Record<string, unknown> = {
420
415
  ...entry,
421
416
  provider: copyProvider,
422
- ...(entry.source === "managed" ? { source: "user" } : {}),
423
417
  };
424
418
  // The conventional personal binding is machinery-written (hatch stamps,
425
419
  // completion re-stamps); normalize it away. Any other binding is user
@@ -485,8 +479,6 @@ function uniformCopyProvider(profiles: Record<string, unknown>): string | null {
485
479
  * retiring the copy cannot switch keys. Any other connection value is a
486
480
  * user edit and never matches.
487
481
  *
488
- * The final hatch-written deviation, `source: "managed"` from the earliest
489
- * templates, is handled by the caller's source normalization.
490
482
  */
491
483
  function hatchBodyVariants(
492
484
  known: Record<string, unknown>,
@@ -653,9 +645,15 @@ function repairProfileSelections(
653
645
  const advisor = llm.advisorProfile;
654
646
  const advisorEntry =
655
647
  typeof advisor === "string" ? effectiveEntry(advisor) : undefined;
648
+ // The workspace view decides ownership: a cadet-provider stub (or an
649
+ // absent entry) is a managed default the write governs; a non-cadet
650
+ // entry is a user shadow whose disable is user intent and stays.
651
+ const advisorWorkspace =
652
+ typeof advisor === "string" ? readObject(profiles[advisor]) : null;
656
653
  const advisorUnusable =
657
654
  advisorEntry === undefined ||
658
- (advisorEntry.source === "managed" && advisorEntry.status === "disabled");
655
+ (advisorEntry.status === "disabled" &&
656
+ (advisorWorkspace === null || advisorWorkspace.provider === "cadet"));
659
657
  if (advisorUnusable) {
660
658
  // A default key whose surviving workspace entry is a disabled managed
661
659
  // stub still dispatches the pure catalog body (`providerAwareEntry` in
@@ -678,7 +676,7 @@ function repairProfileSelections(
678
676
  const workspace = readObject(profiles[key]);
679
677
  return (
680
678
  workspace !== null &&
681
- workspace.source === "managed" &&
679
+ workspace.provider === "cadet" &&
682
680
  resolveDefaultProfileForProvider(undefined, key, defaultBlob)
683
681
  ?.status !== "disabled"
684
682
  );
@@ -23,7 +23,7 @@ const log = getLogger("custom-profile-ensure");
23
23
  // construction. Running
24
24
  // unconditionally each boot also covers configs restored from backups
25
25
  // and entries injected after the migration registry checkpoints — and it
26
- // completes before the first `loadConfig()`, so no resolution ever sees a
26
+ // completes before the first `getConfig()`, so no resolution ever sees a
27
27
  // partial custom profile.
28
28
  //
29
29
  // Idempotent and write-avoidant: entries that are already complete (and mix
@@ -87,7 +87,7 @@ export function ensureCompleteCustomProfiles(workspaceDir: string): void {
87
87
  return;
88
88
  }
89
89
  writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
90
- // The lifecycle call site runs before the first loadConfig() of this boot;
90
+ // The lifecycle call site runs before the first getConfig() of this boot;
91
91
  // this guards callers that read config earlier (and future reordering).
92
92
  invalidateConfigCache();
93
93
  }
@@ -16,7 +16,7 @@ import { trackDaemonActivity } from "../daemon/activity-trail.js";
16
16
  import { isFileUnheld } from "../util/file-use.js";
17
17
  import { getLogger } from "../util/logger.js";
18
18
  import { Mutex } from "../util/mutex.js";
19
- import { addToPathEnv, getExtraToolPathDirs } from "../util/platform.js";
19
+ import { addToPathEnv, getExtraToolPathDirs } from "../util/os.js";
20
20
  import { PromiseGuard } from "../util/promise-guard.js";
21
21
  import {
22
22
  collectDirtyPathsFromPorcelain,