@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,5 +1,6 @@
1
1
  import { beforeEach, describe, expect, mock, test } from "bun:test";
2
2
 
3
+ import { setCloudAssistantId } from "../config/env.js";
3
4
  import { useFaultableSecureKeyMap } from "./helpers/secure-keys.js";
4
5
 
5
6
  // ── Mutable state for mocks ──────────────────────────────────────────
@@ -266,6 +267,7 @@ describe("credential-health-service", () => {
266
267
  managedPingOutcome = { kind: "status", status: 200 };
267
268
  assistantKeyVerdict = "valid";
268
269
  cloudClientAvailable = true;
270
+ setCloudAssistantId(undefined);
269
271
  });
270
272
 
271
273
  test("returns empty report when no providers exist", async () => {
@@ -780,13 +782,20 @@ describe("credential-health-service", () => {
780
782
  // carries the repair.
781
783
  const assistantKeyResult = checkAssistantApiKey;
782
784
 
783
- test("is missing_token when no key is stored, connected or not", async () => {
785
+ test("is not reported when the workspace was never connected", async () => {
786
+ expect(await assistantKeyResult()).toBeNull();
787
+ });
788
+
789
+ test("is missing_token when a cloud identity exists without a key", async () => {
790
+ setCloudAssistantId("11111111-2222-4333-8444-555555555555");
791
+
784
792
  const result = await assistantKeyResult();
785
793
  expect(result!.status).toBe("missing_token");
786
794
  expect(result!.canAutoRecover).toBe(true);
787
795
  });
788
796
 
789
797
  test("is healthy when the cloud accepts the stored key", async () => {
798
+ setCloudAssistantId("11111111-2222-4333-8444-555555555555");
790
799
  secureKeyValues.set(KEY, "stored-key");
791
800
  assistantKeyVerdict = "valid";
792
801
 
@@ -794,6 +803,7 @@ describe("credential-health-service", () => {
794
803
  });
795
804
 
796
805
  test("is revoked when the cloud rejects the stored key", async () => {
806
+ setCloudAssistantId("11111111-2222-4333-8444-555555555555");
797
807
  secureKeyValues.set(KEY, "stored-key");
798
808
  assistantKeyVerdict = "rejected";
799
809
 
@@ -809,6 +819,7 @@ describe("credential-health-service", () => {
809
819
  // error, transport failure) must degrade to `unreachable`, which the
810
820
  // heartbeat drops before notifying.
811
821
  test("an unsettled platform answer is unreachable, never revoked", async () => {
822
+ setCloudAssistantId("11111111-2222-4333-8444-555555555555");
812
823
  secureKeyValues.set(KEY, "stored-key");
813
824
  assistantKeyVerdict = "unknown";
814
825
 
@@ -816,12 +827,14 @@ describe("credential-health-service", () => {
816
827
  });
817
828
 
818
829
  test("an unreadable credential store is unreachable, never revoked", async () => {
830
+ setCloudAssistantId("11111111-2222-4333-8444-555555555555");
819
831
  markUnreachable(KEY);
820
832
 
821
833
  expect((await assistantKeyResult())!.status).toBe("unreachable");
822
834
  });
823
835
 
824
836
  test("is unreachable when the cloud client cannot be built", async () => {
837
+ setCloudAssistantId("11111111-2222-4333-8444-555555555555");
825
838
  secureKeyValues.set(KEY, "stored-key");
826
839
  cloudClientAvailable = false;
827
840
 
@@ -21,7 +21,7 @@ import {
21
21
  setCredentialRecordBackend,
22
22
  upsertCredentialMetadata,
23
23
  } from "../tools/credentials/metadata-store.js";
24
- import { getDataDir } from "../util/platform.js";
24
+ import { getDataDir } from "../util/layout.js";
25
25
 
26
26
  function leftoverPath(): string {
27
27
  return join(getDataDir(), "credentials", "metadata.json");
@@ -11,7 +11,7 @@ import {
11
11
  setCredentialRecordBackend,
12
12
  upsertCredentialMetadata,
13
13
  } from "../tools/credentials/metadata-store.js";
14
- import { getDataDir } from "../util/platform.js";
14
+ import { getDataDir } from "../util/layout.js";
15
15
 
16
16
  function makeBackend(): CredentialRecordBackend & {
17
17
  store: Map<string, CredentialRecord>;
@@ -142,151 +142,6 @@ describe("Invariant 2: no generic plaintext secret read API", () => {
142
142
  );
143
143
  expect(browserSrc).not.toContain("getCredentialValue");
144
144
  });
145
-
146
- test("secure-keys is only imported by authorized modules", () => {
147
- // Hard boundary: only these production files may import from secure-keys.
148
- // Any new import must be reviewed for secret-leak risk and added here.
149
- const ALLOWED_IMPORTERS = new Set([
150
- "credential-execution/prompted-credential.ts", // shared prompt-action persistence (stores secret via setSecureKeyAsync)
151
- "daemon/chat-credential-redaction.ts", // chat sentinel enrichment — scoped read ONLY of credentials a `credentials reveal` command in the same turn already printed to stdout; value byte-compared at persist and discarded, never persisted or logged
152
-
153
- "tools/credentials/broker.ts", // brokered credential access
154
- "tools/network/web-search.ts", // web search API key lookup
155
- "tools/network/web-fetch.ts", // web fetch provider (Firecrawl) API key lookup
156
- "daemon/handlers/config-telegram.ts", // Telegram bot token management
157
- "daemon/handlers/config-vercel.ts", // Vercel API token management
158
- "runtime/routes/integrations/twilio.ts", // Twilio credential management (HTTP control-plane)
159
- "security/token-manager.ts", // OAuth token refresh flow
160
- "tools/network/script-proxy/session-manager.ts", // proxy credential injection at runtime
161
- "calls/call-domain.ts", // caller identity resolution (user phone number lookup)
162
- "calls/twilio-config.ts", // call infrastructure credential lookup
163
- "calls/twilio-provider.ts", // call infrastructure credential lookup
164
- "calls/twilio-rest.ts", // Twilio REST API credential lookup
165
- "calls/fish-audio-client.ts", // Fish Audio TTS API key lookup
166
- "runtime/channel-invite-transports/telegram.ts", // Telegram invite transport bot token lookup
167
- "cli/lib/daemon-credential-client.ts", // CLI-to-daemon credential routing intermediary
168
- "messaging/providers/telegram-bot/adapter.ts", // Telegram bot token lookup for connectivity check
169
- "messaging/providers/slack/api.ts", // Slack Web API client (bot token for direct sends)
170
- "messaging/providers/telegram-bot/api.ts", // Telegram Bot API client (bot token for direct sends)
171
- "messaging/providers/discord/api.ts", // Discord REST client (bot token for direct sends)
172
- "runtime/channel-readiness-service.ts", // channel readiness probes for Telegram connectivity
173
- "telegram/webhook-health.ts", // Telegram webhook health sweep — reads bot_token to call getWebhookInfo (Bot API authenticates via the token in the URL path) and checks webhook_secret for existence only; neither value is logged, persisted, or returned
174
- "messaging/providers/whatsapp/adapter.ts", // WhatsApp credential lookup for connectivity check
175
- "messaging/providers/whatsapp/api.ts", // WhatsApp Cloud API client (bot token for direct sends)
176
- "messaging/providers/slack/adapter.ts", // Slack bot token lookup for Socket Mode connectivity check
177
- "credential-health/credential-health-service.ts", // proactive credential health monitoring
178
- "providers/inference/credential-slot-repair.ts", // boot repair: copies the shared openai-compatible slot value into per-connection slots (get/set of provider API keys only; values never logged or returned)
179
- "runtime/routes/inference-provider-connection-routes.ts", // connection delete removes its dedicated per-connection key slot (deleteSecureKeyAsync only; no reads)
180
- "daemon/handlers/config-slack-channel.ts", // Slack channel config credential management
181
- "daemon/handlers/config-discord-channel.ts", // Discord channel bot token management
182
- "providers/cloud-proxy/context.ts", // cloud proxy API key lookup for provider initialization
183
- "cloud/client.ts", // cloud client credential store fallback for standalone CLI auth
184
- "mcp/mcp-header-store.ts", // MCP static auth header persistence (credential store CRUD + legacy migration)
185
- "mcp/mcp-oauth-provider.ts", // MCP OAuth token/client/discovery persistence
186
- "messaging/providers/slack/auth.ts", // canonical Slack auth resolver (bot/user token lookup for adapter + routes)
187
- "mcp/client.ts", // MCP client cached-token lookup
188
- "oauth/token-persistence.ts", // OAuth token persistence (set/delete tokens)
189
- "oauth/credential-token-resolver.ts", // centralized access-token key resolution for OAuth and manual-token providers
190
- "oauth/connection-resolver.ts", // resolve OAuthConnection from oauth-store (access_token lookup)
191
- "runtime/routes/secret-routes.ts", // HTTP secret management routes (set/delete secrets)
192
- "acp/acp-claude-oauth.ts", // Connect Claude OAuth token vault-store helper (stores access token plus broker-owned refresh/expiry companions via setSecureKeyAsync)
193
- "runtime/routes/acp-claude-auth-routes.ts", // Connect Claude Code daemon OAuth flow (stores OAuth token in vault)
194
- "runtime/routes/migration-routes.ts", // migration import credential restore
195
- "daemon/conversation-messaging.ts", // credential storage during session messaging
196
- "runtime/routes/settings-routes.ts", // settings routes OAuth credential lookup (client_secret)
197
- "oauth/oauth-store.ts", // OAuth provider disconnect (delete stored tokens)
198
- "oauth/manual-token-connection.ts", // manual-token provider backfill (credential store existence check)
199
- "workspace/provider-commit-message-generator.ts", // commit message generation provider key lookup
200
- "cli/commands/image-generation.ts", // CLI image-generation command API key lookup
201
- "config/bundled-skills/image-studio/tools/media-generate-image.ts", // image generation tool API key lookup
202
- "config/bundled-skills/media-processing/tools/analyze-keyframes.ts", // keyframe analysis tool API key lookup
203
- "providers/registry.ts", // provider registry API key lookup for initialization
204
- "providers/inference/resolve-auth.ts", // provider_connection auth resolver (api_key path reads vault, mirrors registry.ts)
205
- "providers/inference/codex-token-refresh.ts", // Codex OAuth token refresh (reads/writes access_token, refresh_token, expires_at)
206
- "providers/inference/service-account-token.ts", // Google service-account JWT exchange (reads service-account JSON, writes token_cache blob)
207
- "providers/inference/chatgpt-subscription-credentials.ts", // ChatGPT subscription sign-in token storage, shared by the daemon routes and the CLI (setSecureKeyAsync only; no reads)
208
- "providers/provider-availability.ts", // provider availability API key check
209
- "media/image-credentials.ts", // shared image-gen credential resolver (provider API key lookup)
210
- "persistence/embeddings/embedding-backend.ts", // embedding backend API key lookup
211
- "persistence/llm-request-log-source-clickhouse.ts", // ClickHouse read source — lazy lookup of clickhouse:url + clickhouse:password + cadet:platform_assistant_id for self-scoped mirror reads
212
- "persistence/llm-request-log-sink-clickhouse.ts", // ClickHouse write sink — lazy lookup of clickhouse:url + clickhouse:password + cadet:platform_assistant_id for self-scoped log writes
213
- "persistence/compaction-log-store-clickhouse.ts", // ClickHouse compaction log writer — lazy lookup of clickhouse:url + clickhouse:password + cadet:platform_assistant_id for self-scoped event writes
214
- "config/cloud-identity.ts", // assistant API key lookup for platform identity validate
215
- "config/cloud-rehydration.ts", // startup rehydration of platform base URL from the credential store and ids from platform validate
216
- "workspace/migrations/006-services-config.ts", // services config migration reads provider API keys
217
- "workspace/migrations/018-rekey-compound-credential-keys.ts", // re-key compound credential storage keys
218
- "daemon/conversation-process.ts", // masked provider key display
219
- "daemon/handlers/config-model.ts", // masked provider key display
220
- "providers/speech-to-text/resolve.ts", // STT provider API key lookup
221
- "calls/telephony-tts-capability.ts", // TTS provider API key availability check (presence only)
222
- "credential-execution/ces-runtime.ts", // CES runtime owns the daemon CES connection (setCesClient/onCesClientChanged/reconnect wiring at startup)
223
- "runtime/routes/credential-prompt-routes.ts", // Route for secure credential prompt (stores secret via setSecureKeyAsync)
224
- "runtime/routes/credential-routes.ts", // CLI credential management routes (CLI-migrated to IPC)
225
- "runtime/routes/sanity-routes.ts", // Sanity connect/discover routes (reads stored api_token from credential store)
226
- "runtime/routes/cloud-routes.ts", // CLI platform connect/disconnect/status routes (CLI-migrated to IPC)
227
- "runtime/routes/roadmap-routes.ts", // signs public-roadmap calls with the assistant API key (outbound Authorization header only; the value never reaches a response, a log, or the CLI process)
228
- "inbound/cloud-callback-registration.ts", // managed API key lookup for callback registration
229
- "tts/providers/elevenlabs-provider.ts", // ElevenLabs TTS API key lookup
230
- "tts/providers/deepgram-provider.ts", // Deepgram TTS API key lookup
231
- "tts/providers/xai-provider.ts", // xAI TTS API key lookup
232
- "credential-health/credential-health-service.ts", // credential health check reads access tokens for liveness pings
233
- "cli/commands/keys.ts", // CLI provider key management
234
- "cli/commands/oauth/connect.ts", // CLI OAuth connect stored-secret verification
235
- "runtime/routes/identity-routes.ts", // health/readyz endpoint checks CES connectivity via getCesClient
236
- "tools/executor.ts", // CES approval bridge resolves the CES RPC client via getCesClient
237
- "tools/network/web-fetch.ts", // Firecrawl /scrape BYOK fetch provider API key lookup (firecrawl provider key)
238
- "workspace/default-provider-ensure.ts", // legacy anthropic echo disambiguation (vault key presence check)
239
- "providers/inference/connection-availability.ts", // shared (provider, connection) availability status (credential presence check only; value never leaves the helper)
240
- "plugin-api/resolve-credential.ts", // plugin-facing resolveCredential: reveal-equivalent plaintext read, scoped to the in-context plugin's own service
241
- "tools/credentials/store.ts", // shared credential write path (setSecureKeyAsync only; no reads) behind credentials/set and plugin-facing storeCredential
242
- "email/byo-email-credential.ts", // BYO email provider configuration check (credential presence only; value never leaves the helper)
243
- ]);
244
-
245
- const thisDir = dirname(fileURLToPath(import.meta.url));
246
- const srcDir = resolve(thisDir, "..");
247
- // eslint-disable-next-line @typescript-eslint/no-require-imports
248
- const { readdirSync, statSync } = require("node:fs");
249
-
250
- // Recursively collect all .ts files in src/ (excluding __tests__)
251
- function collectTsFiles(dir: string, files: string[] = []): string[] {
252
- for (const entry of readdirSync(dir)) {
253
- const full = join(dir, entry);
254
- if (entry === "__tests__" || entry === "node_modules") {
255
- continue;
256
- }
257
- const s = statSync(full);
258
- if (s.isDirectory()) {
259
- collectTsFiles(full, files);
260
- } else if (
261
- entry.endsWith(".ts") &&
262
- !entry.endsWith(".d.ts") &&
263
- !entry.endsWith(".test.ts")
264
- ) {
265
- files.push(full);
266
- }
267
- }
268
- return files;
269
- }
270
-
271
- const allFiles = collectTsFiles(srcDir);
272
- const unauthorizedImporters: string[] = [];
273
-
274
- for (const filePath of allFiles) {
275
- const content = readFileSync(filePath, "utf-8");
276
- // Check for any import from the secure-keys module (static import, dynamic import(), or require())
277
- if (
278
- content.match(/from\s+['"].*secure-keys/) ||
279
- content.match(/(?:import|require)\s*\(\s*['"].*secure-keys/)
280
- ) {
281
- const relative = filePath.slice(srcDir.length + 1);
282
- if (!ALLOWED_IMPORTERS.has(relative)) {
283
- unauthorizedImporters.push(relative);
284
- }
285
- }
286
- }
287
-
288
- expect(unauthorizedImporters).toEqual([]);
289
- });
290
145
  });
291
146
 
292
147
  // ---------------------------------------------------------------------------
@@ -110,7 +110,7 @@ describe("ensureCompleteCustomProfiles", () => {
110
110
  llm: {
111
111
  default: distinctiveDefault,
112
112
  profiles: {
113
- balanced: { source: "managed", status: "disabled" },
113
+ balanced: { provider: "cadet", status: "disabled" },
114
114
  ab: {
115
115
  source: "user",
116
116
  mix: [
@@ -25,7 +25,6 @@ import {
25
25
  getEffectiveProfile,
26
26
  getEffectiveProfiles,
27
27
  getEffectiveProfilesForProvider,
28
- INVARIANT_PROFILE_NAMES,
29
28
  MANAGED_PROFILE_NAMES,
30
29
  MANAGED_PROFILE_TEMPLATES,
31
30
  PROFILE_IMPLS,
@@ -51,7 +50,6 @@ describe("fallbackProfile pointers on the cadet column", () => {
51
50
  const backup = CODE_DEFAULT_PROFILE_ENTRIES[FALLBACK_PROFILE_BY_KEY[key]];
52
51
  expect(backup).toBeDefined();
53
52
  expect(backup.provider).toBe("cadet");
54
- expect(backup.source).toBe("managed");
55
53
  // Single hop: a backup never declares a fallback of its own.
56
54
  expect(backup.fallbackProfile).toBeUndefined();
57
55
  }
@@ -106,7 +104,6 @@ describe("managed-column-only scoping", () => {
106
104
  for (const key of BACKUP_PROFILE_KEYS) {
107
105
  expect(effective[key]).toBeDefined();
108
106
  expect(effective[key]?.provider).toBe("cadet");
109
- expect(effective[key]?.source).toBe("managed");
110
107
  }
111
108
  // The seeder inserts missing managed keys in MANAGED_PROFILE_TEMPLATES
112
109
  // order, which is what places backups after the primaries in
@@ -161,13 +158,13 @@ describe("managed-column-only scoping", () => {
161
158
  test("a persisted managed stub does not resurrect a backup off the cloud column", () => {
162
159
  // A `config get` -> `config set` round-trip on a cloud install can
163
160
  // leave a thin managed stub for a backup in `llm.profiles`
164
- // (`normalizeCloudProfileWrites`). The stub is the workspace's slot for
161
+ // The stub is the workspace's slot for
165
162
  // a code-owned body, not a profile, so once the column has no body behind
166
163
  // it the name must stop being listed rather than resolve to a
167
164
  // providerless entry the pickers would offer and `LLMSchema` would
168
165
  // reject.
169
166
  const workspace: Record<string, ProfileEntry> = {
170
- "balanced-backup": { source: "managed" },
167
+ "balanced-backup": { provider: "cadet" },
171
168
  };
172
169
  for (const provider of ["anthropic", "chatgpt"] as const) {
173
170
  const effective = getEffectiveProfilesForProvider(
@@ -196,7 +193,6 @@ describe("managed-column-only scoping", () => {
196
193
  // that name and keeps its own body.
197
194
  const workspace: Record<string, ProfileEntry> = {
198
195
  "balanced-backup": {
199
- source: "user",
200
196
  provider: "anthropic",
201
197
  model: "claude-opus-4-7",
202
198
  },
@@ -237,15 +233,14 @@ describe("effective-profile machinery", () => {
237
233
  // label/status/topP whitelist from a cloud stub, and not a user-owned
238
234
  // shadow. Disabling a backup through a hand-edited config would strand
239
235
  // the primary's fallback exactly when it is needed.
240
- for (const source of ["managed", "user"] as const) {
236
+ {
241
237
  const workspace: Record<string, ProfileEntry> = {
242
238
  "balanced-backup": {
243
- source,
239
+ provider: "cadet",
244
240
  label: "My Backup",
245
241
  status: "disabled",
246
242
  topP: 0.7,
247
243
  // Stale content drift on disk must lose to the code default body.
248
- provider: "anthropic",
249
244
  model: "claude-sonnet-4-6",
250
245
  maxTokens: 1,
251
246
  },
@@ -261,14 +256,9 @@ describe("effective-profile machinery", () => {
261
256
  }
262
257
  });
263
258
 
264
- test("backup profiles are delete-protected like the other managed defaults", () => {
265
- // Membership in these sets is what wires the route-level deletion
266
- // rejection (`rejectCloudProfileDeletion`, `handleCreateProfile`) and
267
- // the commitConfigWrite invariant guard
268
- // (`assertInvariantProfilesPreserved`).
259
+ test("backup names are reserved like the other managed defaults", () => {
269
260
  for (const key of BACKUP_PROFILE_KEYS) {
270
261
  expect(MANAGED_PROFILE_NAMES.has(key)).toBe(true);
271
- expect(INVARIANT_PROFILE_NAMES.has(key)).toBe(true);
272
262
  }
273
263
  });
274
264
  });
@@ -150,7 +150,6 @@ describe("Call session mode metadata", () => {
150
150
 
151
151
  const { conversationId } = getOrCreateConversation("test-conv-mode");
152
152
  const session = createCallSession({
153
- direction: "inbound",
154
153
  conversationId,
155
154
  provider: "twilio",
156
155
  fromNumber: "+15551234567",
@@ -179,7 +178,6 @@ describe("Call session mode metadata", () => {
179
178
  "test-conv-mode-default",
180
179
  );
181
180
  const session = createCallSession({
182
- direction: "inbound",
183
181
  conversationId,
184
182
  provider: "twilio",
185
183
  fromNumber: "+15551234567",
@@ -4,7 +4,7 @@ import { join } from "node:path";
4
4
  import { afterEach, beforeEach, describe, expect, test } from "bun:test";
5
5
 
6
6
  import {
7
- loadConfig,
7
+ getConfig,
8
8
  resetCache,
9
9
  resolveProfile,
10
10
  setStorePathOverride,
@@ -34,17 +34,17 @@ function writeConfig(config: unknown): void {
34
34
  writeFileSync(testFilePath, JSON.stringify(config, null, 2));
35
35
  }
36
36
 
37
- describe("loadConfig", () => {
37
+ describe("getConfig", () => {
38
38
  test("returns default config when file is missing or malformed", () => {
39
39
  // Missing file
40
- let config = loadConfig();
40
+ let config = getConfig();
41
41
  expect(config.profiles).toHaveLength(1);
42
42
  expect(config.profiles[0].id).toBe("general");
43
43
 
44
44
  // Malformed JSON
45
45
  resetCache();
46
46
  writeFileSync(testFilePath, "not json");
47
- config = loadConfig();
47
+ config = getConfig();
48
48
  expect(config.profiles[0].id).toBe("general");
49
49
  });
50
50
 
@@ -57,7 +57,7 @@ describe("loadConfig", () => {
57
57
  { id: "casual", name: "Casual" },
58
58
  ],
59
59
  });
60
- const config = loadConfig();
60
+ const config = getConfig();
61
61
  expect(config.profiles).toHaveLength(2);
62
62
  expect(config.defaultProfileId).toBe("work");
63
63
  });
@@ -81,7 +81,7 @@ describe("loadConfig", () => {
81
81
  },
82
82
  ],
83
83
  });
84
- const config = loadConfig();
84
+ const config = getConfig();
85
85
  expect(config.profiles[0].stylePrompt!.length).toBe(2000);
86
86
  expect(config.profiles[0].dictionary).toHaveLength(1);
87
87
  expect(config.profiles[0].snippets).toHaveLength(1);
@@ -1,40 +1,10 @@
1
- import { execFile } from "node:child_process";
2
- import {
3
- existsSync,
4
- mkdtempSync,
5
- rmSync,
6
- statfsSync,
7
- writeFileSync,
8
- } from "node:fs";
9
- import { join } from "node:path";
10
- import { promisify } from "node:util";
1
+ import { statfsSync } from "node:fs";
11
2
  import { afterAll, beforeEach, describe, expect, test } from "bun:test";
12
3
 
13
- // Captured at module scope: the preload cleans up its env var between suites.
14
4
  const PRELOAD_WS = process.env.CADET_WORKSPACE_DIR!;
15
-
16
5
  const MIB = 1024 * 1024;
17
6
  const round2 = (b: number) => Math.round((b / MIB) * 100) / 100;
18
7
 
19
- const execFileAsync = promisify(execFile);
20
-
21
- /** Same measurement the module under test performs, done for real. */
22
- async function duBytes(paths: string[]): Promise<number> {
23
- const existing = paths.filter((p) => existsSync(p));
24
- if (existing.length === 0) {
25
- return 0;
26
- }
27
- const { stdout } = await execFileAsync("du", ["-sb", ...existing]);
28
- let total = 0;
29
- for (const line of stdout.trim().split("\n")) {
30
- const size = parseInt(line.split("\t")[0], 10);
31
- if (!isNaN(size) && size > 0) {
32
- total += size;
33
- }
34
- }
35
- return total;
36
- }
37
-
38
8
  interface StatfsSnapshot {
39
9
  total: number;
40
10
  free: number;
@@ -81,171 +51,65 @@ function expectWithinStatfsWindow(
81
51
  expect(usage.usedMb).toBeLessThanOrEqual(usedHi);
82
52
  }
83
53
 
84
- const { __resetDiskUsageCacheForTests, getDiskUsageInfo, parseK8sMemoryBytes } =
54
+ const { getDiskUsageInfo, parseK8sMemoryBytes } =
85
55
  await import("../util/disk-usage.js");
86
56
 
87
- // Env knobs the sampler reads at call time; no module mocking needed.
88
57
  const ENV_VARS = [
89
58
  "CADET_MINIKUBE_STORAGE_SIZE",
90
59
  "IS_CONTAINERIZED",
91
60
  "IS_CLOUD",
92
61
  ] as const;
93
62
 
94
- afterAll(() => {
95
- for (const v of ENV_VARS) {
96
- delete process.env[v];
63
+ function clearEnvironment(): void {
64
+ for (const name of ENV_VARS) {
65
+ delete process.env[name];
97
66
  }
98
- });
67
+ process.env.CADET_WORKSPACE_DIR = PRELOAD_WS;
68
+ }
99
69
 
100
- // `du -sb` of an empty directory is 0, which the sampler treats as
101
- // unmeasurable — seed real bytes so the du-backed branches have data.
102
- const PAYLOAD = join(PRELOAD_WS, "bulk.bin");
70
+ afterAll(clearEnvironment);
103
71
 
104
- describe("disk usage sampler", () => {
105
- beforeEach(() => {
106
- for (const v of ENV_VARS) {
107
- delete process.env[v];
108
- }
109
- process.env.CADET_WORKSPACE_DIR = PRELOAD_WS;
110
- writeFileSync(PAYLOAD, Buffer.alloc(512 * 1024));
111
- __resetDiskUsageCacheForTests();
112
- });
72
+ async function expectFilesystemUsage(): Promise<void> {
73
+ const before = statfsSnapshot(PRELOAD_WS);
74
+ const usage = await getDiskUsageInfo();
75
+ const after = statfsSnapshot(PRELOAD_WS);
76
+ expect(usage).not.toBeNull();
77
+ expectWithinStatfsWindow(usage!, PRELOAD_WS, before, after);
78
+ }
113
79
 
114
- test("reports real statfs usage", async () => {
115
- const before = statfsSnapshot(PRELOAD_WS);
116
- const usage = await getDiskUsageInfo();
117
- const after = statfsSnapshot(PRELOAD_WS);
80
+ describe("disk usage sampler", () => {
81
+ beforeEach(clearEnvironment);
118
82
 
119
- expect(usage).not.toBeNull();
120
- expectWithinStatfsWindow(usage!, PRELOAD_WS, before, after);
121
- });
83
+ test("reports real filesystem usage", expectFilesystemUsage);
122
84
 
123
85
  test("falls back to root when the workspace path does not exist", async () => {
124
86
  process.env.CADET_WORKSPACE_DIR = "/tmp/does-not-exist-disk-usage-test";
125
87
  try {
126
- const usage = await getDiskUsageInfo();
127
- expect(usage?.path).toBe("/");
88
+ expect((await getDiskUsageInfo())?.path).toBe("/");
128
89
  } finally {
129
- // Restore rather than delete: the sampler reads the workspace at call
130
- // time and later tests still need the preload's workspace.
131
90
  process.env.CADET_WORKSPACE_DIR = PRELOAD_WS;
132
91
  }
133
92
  });
134
93
 
135
- test("uses PVC capacity and du usage when the host filesystem is larger", async () => {
136
- // A 1MiB PVC is always smaller than the real host filesystem, so the
137
- // hostPath detection fires and capacity is the quota, usage is `du`.
94
+ test("reports the backing filesystem rather than a minikube quota", async () => {
138
95
  process.env.CADET_MINIKUBE_STORAGE_SIZE = "1Mi";
139
-
140
- const before = statfsSnapshot(PRELOAD_WS);
141
- const usage = await getDiskUsageInfo();
142
- const after = statfsSnapshot(PRELOAD_WS);
143
-
144
- // totalMb === 1 is the fixed-cap branch signature (the sampler's du ran).
145
- // A failed du spawn under CI load is a legal statfs fallback — asserted
146
- // with the window instead of failing the run.
147
- if (usage!.totalMb === 1) {
148
- // The 512KiB payload must show up in the measurement.
149
- expect(usage!.usedMb).toBeGreaterThanOrEqual(0.49);
150
- expect(
151
- Math.abs(usage!.freeMb - Math.max(0, 1 - usage!.usedMb)),
152
- ).toBeLessThanOrEqual(0.02);
153
- } else {
154
- expectWithinStatfsWindow(usage!, PRELOAD_WS, before, after);
155
- }
96
+ await expectFilesystemUsage();
156
97
  });
157
98
 
158
- test("adds /data to du usage when it exists separately", async () => {
159
- process.env.CADET_MINIKUBE_STORAGE_SIZE = "1Mi";
160
- const workspaceOnly = round2(await duBytes([PRELOAD_WS]));
161
-
162
- const before = statfsSnapshot(PRELOAD_WS);
163
- const usage = await getDiskUsageInfo();
164
- const after = statfsSnapshot(PRELOAD_WS);
165
-
166
- if (usage!.totalMb !== 1) {
167
- // Sampler's du spawn failed under load → legal statfs fallback.
168
- expectWithinStatfsWindow(usage!, PRELOAD_WS, before, after);
169
- return;
170
- }
171
- // The impl's path set is workspace + /data (when /data exists). It can
172
- // only be >= the workspace-only floor; equality holds on machines
173
- // without /data.
174
- expect(usage!.usedMb).toBeGreaterThanOrEqual(workspaceOnly);
175
- });
176
-
177
- test("a PVC at least as large as the filesystem reports statfs directly", async () => {
178
- // 1TiB is larger than any test filesystem: the hostPath detection must
179
- // NOT fire, so the sampler trusts statfs instead of `du`.
180
- process.env.CADET_MINIKUBE_STORAGE_SIZE = "1Ti";
181
- const before = statfsSnapshot(PRELOAD_WS);
182
- const usage = await getDiskUsageInfo();
183
- const after = statfsSnapshot(PRELOAD_WS);
184
-
185
- expect(usage).not.toBeNull();
186
- expectWithinStatfsWindow(usage!, PRELOAD_WS, before, after);
187
- });
188
-
189
- test("measures workspace du usage on a local Docker hatch", async () => {
99
+ test("reports the backing filesystem for local Docker volumes", async () => {
190
100
  process.env.IS_CONTAINERIZED = "1";
191
-
192
- const before = statfsSnapshot(PRELOAD_WS);
193
- const usage = await getDiskUsageInfo();
194
- const after = statfsSnapshot(PRELOAD_WS);
195
-
196
- expect(usage).not.toBeNull();
197
- expect(usage!.path).toBe(PRELOAD_WS);
198
- // The 512KiB payload must show up whether usage came from du or (if the
199
- // du spawn failed under load) the statfs fallback — both exceed it.
200
- expect(usage!.usedMb).toBeGreaterThanOrEqual(0.49);
201
- // host-free consistency: capacity is usage + free in both branches.
202
- expect(
203
- Math.abs(usage!.totalMb - (usage!.usedMb + usage!.freeMb)),
204
- ).toBeLessThanOrEqual(0.02);
205
- // Free space is the host's own statfs number in both branches.
206
- expect(usage!.freeMb).toBeGreaterThanOrEqual(
207
- round2(Math.min(before.free, after.free)) - 0.01,
208
- );
209
- expect(usage!.freeMb).toBeLessThanOrEqual(
210
- round2(Math.max(before.free, after.free)) + 0.01,
211
- );
101
+ await expectFilesystemUsage();
212
102
  });
213
103
 
214
- test("does not use du for cloud-managed containerized instances", async () => {
104
+ test("reports filesystem usage for cloud-managed containers", async () => {
215
105
  process.env.IS_CONTAINERIZED = "1";
216
106
  process.env.IS_CLOUD = "1";
217
- const before = statfsSnapshot(PRELOAD_WS);
218
- const usage = await getDiskUsageInfo();
219
- const after = statfsSnapshot(PRELOAD_WS);
220
-
221
- // CSI-backed PVCs report the volume accurately: pure statfs numbers.
222
- expect(usage).not.toBeNull();
223
- expectWithinStatfsWindow(usage!, PRELOAD_WS, before, after);
224
- });
225
-
226
- test("falls back to statfs when du has nothing to measure", async () => {
227
- // An empty workspace du's to 0, which the sampler cannot report as usage.
228
- const emptyWs = mkdtempSync(join("/tmp", "disk-usage-empty-"));
229
- process.env.IS_CONTAINERIZED = "1";
230
- process.env.CADET_WORKSPACE_DIR = emptyWs;
231
- try {
232
- const before = statfsSnapshot(emptyWs);
233
- const usage = await getDiskUsageInfo();
234
- const after = statfsSnapshot(emptyWs);
235
-
236
- expect(usage).not.toBeNull();
237
- expectWithinStatfsWindow(usage!, emptyWs, before, after);
238
- } finally {
239
- process.env.CADET_WORKSPACE_DIR = PRELOAD_WS;
240
- rmSync(emptyWs, { recursive: true, force: true });
241
- }
107
+ await expectFilesystemUsage();
242
108
  });
243
109
 
244
110
  test("returns null for malformed Kubernetes memory strings", () => {
245
- expect(parseK8sMemoryBytes("")).toBeNull();
246
- expect(parseK8sMemoryBytes("abc")).toBeNull();
247
- expect(parseK8sMemoryBytes("12Zi")).toBeNull();
248
- expect(parseK8sMemoryBytes("-1Gi")).toBeNull();
249
- expect(parseK8sMemoryBytes("0Gi")).toBeNull();
111
+ for (const value of ["", "abc", "12Zi", "-1Gi", "0Gi"]) {
112
+ expect(parseK8sMemoryBytes(value)).toBeNull();
113
+ }
250
114
  });
251
115
  });
@@ -23,7 +23,7 @@ const {
23
23
  _resetSigningKeyForTesting,
24
24
  } = await import("../runtime/auth/token-service.js");
25
25
  const { CURRENT_POLICY_EPOCH } = await import("../runtime/auth/policy.js");
26
- const { getDeprecatedDir } = await import("../util/platform.js");
26
+ const { getDeprecatedDir } = await import("../util/layout.js");
27
27
 
28
28
  const VALID_HEX_KEY = "ab".repeat(32); // 64 hex chars = 32 bytes
29
29