@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,104 +0,0 @@
1
- /**
2
- * Direct (unbuffered) emit of a single `watchdog` telemetry event.
3
- *
4
- * The usual watchdog path persists to the SQLite `telemetry_events` outbox and
5
- * lets {@link ./usage-telemetry-reporter} batch and upload it later. That
6
- * durable buffer is the right default — it survives restarts and dedupes on
7
- * `daemon_event_id`. But it is the wrong tool for a check that fires *because*
8
- * SQLite is unusable: recording a corruption event into SQLite can hit the very
9
- * damage it is reporting, and the store's `recordWatchdogEvent` drags the whole
10
- * `db-connection` graph in behind it.
11
- *
12
- * This helper POSTs the event straight to the cloud ingest instead. It is
13
- * best-effort: opt-out, missing credentials (early boot, before the CES
14
- * handshake), platform-disabled, and HTTP failures all no-op. No retry — a lost
15
- * event is acceptable for a rare, high-signal check. Deduped downstream on
16
- * `daemon_event_id` like every other telemetry event.
17
- */
18
-
19
- import { v4 as uuid } from "uuid";
20
-
21
- import { CadetCloudClient } from "../cloud/client.js";
22
- import { getRawShareAnalytics } from "../cloud/consent-cache.js";
23
- import { areCloudFeaturesEnabled } from "../cloud/feature-gate.js";
24
- import { getCloudOrganizationId, getCloudUserId } from "../config/env.js";
25
- import { getDeviceId } from "../util/device-id.js";
26
- import { getLogger } from "../util/logger.js";
27
- import { APP_VERSION } from "../version.js";
28
- import { validateWireEvents } from "./telemetry-wire-validation.js";
29
- import type { WatchdogTelemetryEvent } from "./types.js";
30
-
31
- const log = getLogger("watchdog-direct-emit");
32
-
33
- /** Platform telemetry ingest endpoint (same one the batched reporter POSTs to). */
34
- const TELEMETRY_INGEST_PATH = "/v1/telemetry/ingest/";
35
-
36
- /**
37
- * POST one `watchdog` event directly to the cloud, bypassing the SQLite
38
- * buffer. Honors a confirmed `share_analytics` opt-out and the
39
- * platform-features gate. An unknown consent state emits: this path reports
40
- * SQLite corruption and has no outbox to defer into, and platform ingest
41
- * re-gates on consent authoritatively server-side. Never throws — the caller
42
- * is on a query hot path.
43
- */
44
- export async function emitWatchdogEventDirect(
45
- checkName: string,
46
- detail: Record<string, unknown> | null,
47
- value: number | null = null,
48
- ): Promise<void> {
49
- try {
50
- // Drop only on a confirmed opt-out; unknown emits (no buffer to defer
51
- // into, and platform ingest re-gates on consent server-side).
52
- if (getRawShareAnalytics() === false) {
53
- return;
54
- }
55
- if (!areCloudFeaturesEnabled()) {
56
- return;
57
- }
58
-
59
- // Authenticated-only. Null before the CES handshake resolves credentials;
60
- // the event is simply dropped (no durable backlog to retry from).
61
- const client = await CadetCloudClient.create();
62
- if (!client) {
63
- return;
64
- }
65
-
66
- const event: WatchdogTelemetryEvent = {
67
- type: "watchdog",
68
- daemon_event_id: uuid(),
69
- recorded_at: Date.now(),
70
- check_name: checkName,
71
- value,
72
- detail,
73
- assistant_version: APP_VERSION,
74
- };
75
-
76
- // Pre-flush wire validation — observability only: warns when the server
77
- // would silently drop the event; the POST proceeds unchanged.
78
- validateWireEvents([event], log);
79
-
80
- const organizationId = getCloudOrganizationId() || undefined;
81
- const userId = getCloudUserId() || undefined;
82
- const resp = await client.fetch(TELEMETRY_INGEST_PATH, {
83
- method: "POST",
84
- headers: { "Content-Type": "application/json" },
85
- body: JSON.stringify({
86
- device_id: getDeviceId(),
87
- assistant_version: APP_VERSION,
88
- ...(organizationId ? { organization_id: organizationId } : {}),
89
- ...(userId ? { user_id: userId } : {}),
90
- events: [event],
91
- }),
92
- });
93
- // Consume the body to release the connection, mirroring the reporter.
94
- await resp.text();
95
- if (!resp.ok) {
96
- log.warn(
97
- { status: resp.status, checkName },
98
- "Direct watchdog telemetry POST failed (non-fatal)",
99
- );
100
- }
101
- } catch (err) {
102
- log.warn({ err, checkName }, "Direct watchdog telemetry emit failed");
103
- }
104
- }
@@ -1,31 +0,0 @@
1
- import { recordTelemetryEvent } from "./telemetry-events-outbox.js";
2
-
3
- /**
4
- * Input for one `watchdog` telemetry event. Metadata only — never conversation
5
- * content. `value` and `detail` are optional; omitting both yields the minimal
6
- * event (check_name only). `detail` is an open JSON bag carried verbatim in
7
- * the event payload.
8
- */
9
- export interface WatchdogEventRecord {
10
- checkName: string;
11
- /** Measured magnitude (block ms, idle ms, ...). Null when the check carries no scalar. */
12
- value?: number | null;
13
- /** Open JSON bag for extra fields (reason codes, secondary numbers, ...). */
14
- detail?: Record<string, unknown> | null;
15
- }
16
-
17
- /**
18
- * Record a `watchdog` telemetry event for a watchdog check firing, enqueued
19
- * on the `telemetry_events` outbox. Consent gating and degraded-mode behavior
20
- * are `recordTelemetryEvent`'s, as is the return value: the queued outbox
21
- * row, or null when the event was dropped (opt-out) or could not be stored.
22
- */
23
- export function recordWatchdogEvent(
24
- record: WatchdogEventRecord,
25
- ): { id: string; createdAt: number } | null {
26
- return recordTelemetryEvent("watchdog", {
27
- check_name: record.checkName,
28
- value: record.value ?? null,
29
- detail: record.detail ?? null,
30
- });
31
- }
@@ -1,52 +0,0 @@
1
- /**
2
- * Conversation-stable wire projections of the UI surface tool definitions.
3
- *
4
- * `ui_show`, `ui_update`, and `ui_dismiss` keep one definition across every
5
- * channel and across live vs clientless turns. Channel renderers enforce the
6
- * surfaces they can display at execution. Clientless calls persist surface
7
- * content for the next capable client that opens the conversation.
8
- *
9
- * `activation_moment` is the remaining schema projection. It applies only to
10
- * activation-rail conversations, whose marker is written before the first
11
- * tool resolution, so the extra property is stable for that conversation's
12
- * lifetime. It must not vary by channel or turn presence.
13
- */
14
-
15
- import type { ToolDefinition } from "../../providers/types.js";
16
- import { ACTIVATION_MOMENT_PARAMS } from "../../telemetry/activation-funnel.js";
17
-
18
- const ACTIVATION_MOMENT_PROPERTY = {
19
- type: "string",
20
- enum: ACTIVATION_MOMENT_PARAMS,
21
- description:
22
- "Activation-rail telemetry tag. Set this when this surface IS one of the activation funnel moments; the milestone is recorded automatically when the user commits the surface. Omit for all non-activation surfaces.",
23
- };
24
-
25
- /**
26
- * Add the optional `activation_moment` param to ui_show's schema. Applied
27
- * only for activation-rail conversations (`isActivationSession`). The rail
28
- * bootstrap prompt instructs the tagging, and the daemon's emit path reads
29
- * the tag from tool input independently of this schema.
30
- */
31
- export function injectActivationMomentParam(
32
- definitions: ToolDefinition[],
33
- ): ToolDefinition[] {
34
- return definitions.map((def) => {
35
- if (def.name !== "ui_show") {
36
- return def;
37
- }
38
- const schema = def.input_schema as {
39
- properties?: Record<string, unknown>;
40
- };
41
- return {
42
- ...def,
43
- input_schema: {
44
- ...schema,
45
- properties: {
46
- ...schema.properties,
47
- activation_moment: ACTIVATION_MOMENT_PROPERTY,
48
- },
49
- },
50
- };
51
- });
52
- }
@@ -1,178 +0,0 @@
1
- /**
2
- * Tests for watcher usage telemetry.
3
- *
4
- * Strategy: stub the checkpoint store, lifecycle-event store, and
5
- * watcher store via `mock.module()` so we can drive the inventory
6
- * throttle and event naming without touching the DB.
7
- */
8
-
9
- import { beforeEach, describe, expect, mock, test } from "bun:test";
10
-
11
- import type { ConsentState } from "../../cloud/consent-cache.js";
12
- import type { LifecycleEvent } from "../../persistence/lifecycle-events-store.js";
13
-
14
- const checkpoints = new Map<string, string>();
15
- const recordedEvents: string[] = [];
16
- let fakeEnabledWatchers: Array<{ providerId: string }> = [];
17
- let shareAnalytics: ConsentState = true;
18
- const recordAndReturnEvent = (name: string): LifecycleEvent => {
19
- recordedEvents.push(name);
20
- return { id: "evt-1", eventName: name, createdAt: 0 };
21
- };
22
- let recordImpl: (name: string) => LifecycleEvent | null = recordAndReturnEvent;
23
-
24
- mock.module("../../persistence/checkpoints.js", () => ({
25
- getMemoryCheckpoint: (key: string) => checkpoints.get(key) ?? null,
26
- setMemoryCheckpoint: (key: string, value: string) => {
27
- checkpoints.set(key, value);
28
- },
29
- }));
30
-
31
- mock.module("../../persistence/lifecycle-events-store.js", () => ({
32
- recordLifecycleEvent: (name: string) => recordImpl(name),
33
- }));
34
-
35
- mock.module("../../cloud/consent-cache.js", () => ({
36
- getRawShareAnalytics: () => shareAnalytics,
37
- }));
38
-
39
- mock.module("../watcher-store.js", () => ({
40
- listWatchers: () => fakeEnabledWatchers,
41
- }));
42
-
43
- const {
44
- recordWatcherInventoryIfDue,
45
- recordWatcherLlmProcessed,
46
- WATCHER_INVENTORY_INTERVAL_MS,
47
- } = await import("../telemetry.js");
48
-
49
- const INVENTORY_KEY = "telemetry:watchers:inventory_last_recorded";
50
- // Realistic epoch base: an absent checkpoint reads as 0, so `now` must be
51
- // at least one interval past the epoch for the inventory to be due.
52
- const BASE = 1_700_000_000_000;
53
-
54
- beforeEach(() => {
55
- checkpoints.clear();
56
- recordedEvents.length = 0;
57
- fakeEnabledWatchers = [];
58
- shareAnalytics = true;
59
- recordImpl = recordAndReturnEvent;
60
- });
61
-
62
- describe("recordWatcherInventoryIfDue", () => {
63
- test("records one event per enabled watcher when due", () => {
64
- fakeEnabledWatchers = [
65
- { providerId: "gmail" },
66
- { providerId: "linear" },
67
- { providerId: "gmail" },
68
- ];
69
-
70
- recordWatcherInventoryIfDue(BASE);
71
-
72
- expect(recordedEvents).toEqual([
73
- "watcher_enabled:gmail",
74
- "watcher_enabled:linear",
75
- "watcher_enabled:gmail",
76
- ]);
77
- expect(checkpoints.get(INVENTORY_KEY)).toBe(String(BASE));
78
- });
79
-
80
- test("skips when the last inventory is within the interval", () => {
81
- fakeEnabledWatchers = [{ providerId: "gmail" }];
82
- checkpoints.set(INVENTORY_KEY, String(BASE));
83
-
84
- recordWatcherInventoryIfDue(BASE + WATCHER_INVENTORY_INTERVAL_MS - 1);
85
-
86
- expect(recordedEvents).toEqual([]);
87
- expect(checkpoints.get(INVENTORY_KEY)).toBe(String(BASE));
88
- });
89
-
90
- test("records again once the interval has elapsed", () => {
91
- fakeEnabledWatchers = [{ providerId: "github" }];
92
- checkpoints.set(INVENTORY_KEY, String(BASE));
93
-
94
- recordWatcherInventoryIfDue(BASE + WATCHER_INVENTORY_INTERVAL_MS);
95
-
96
- expect(recordedEvents).toEqual(["watcher_enabled:github"]);
97
- });
98
-
99
- test("advances the checkpoint even when no watchers are enabled", () => {
100
- recordWatcherInventoryIfDue(BASE + 1);
101
-
102
- expect(recordedEvents).toEqual([]);
103
- expect(checkpoints.get(INVENTORY_KEY)).toBe(String(BASE + 1));
104
- });
105
-
106
- test("swallows storage errors and leaves the checkpoint for retry", () => {
107
- fakeEnabledWatchers = [{ providerId: "gmail" }];
108
- recordImpl = () => {
109
- throw new Error("db unavailable");
110
- };
111
-
112
- expect(() => recordWatcherInventoryIfDue(BASE + 2)).not.toThrow();
113
- // Checkpoint must not advance on failure: the next tick retries
114
- // instead of skipping a day of inventory.
115
- expect(checkpoints.get(INVENTORY_KEY)).toBeUndefined();
116
-
117
- recordImpl = recordAndReturnEvent;
118
- recordWatcherInventoryIfDue(BASE + 3);
119
-
120
- expect(recordedEvents).toEqual(["watcher_enabled:gmail"]);
121
- expect(checkpoints.get(INVENTORY_KEY)).toBe(String(BASE + 3));
122
- });
123
-
124
- test("leaves the checkpoint for retry when the telemetry DB is unavailable with consent on", () => {
125
- fakeEnabledWatchers = [{ providerId: "gmail" }];
126
- // Degraded mode: consent granted but the store reports nothing recorded.
127
- recordImpl = () => null;
128
-
129
- recordWatcherInventoryIfDue(BASE + 2);
130
- expect(checkpoints.get(INVENTORY_KEY)).toBeUndefined();
131
-
132
- recordImpl = recordAndReturnEvent;
133
- recordWatcherInventoryIfDue(BASE + 3);
134
-
135
- expect(recordedEvents).toEqual(["watcher_enabled:gmail"]);
136
- expect(checkpoints.get(INVENTORY_KEY)).toBe(String(BASE + 3));
137
- });
138
-
139
- test("advances the checkpoint when consent is a confirmed opt-out", () => {
140
- fakeEnabledWatchers = [{ providerId: "gmail" }];
141
- shareAnalytics = false;
142
- // Confirmed-opt-out skip: the store records nothing and returns null.
143
- recordImpl = () => null;
144
-
145
- recordWatcherInventoryIfDue(BASE + 4);
146
-
147
- expect(recordedEvents).toEqual([]);
148
- expect(checkpoints.get(INVENTORY_KEY)).toBe(String(BASE + 4));
149
- });
150
-
151
- test("leaves the checkpoint for retry when the store returns null while consent is unknown", () => {
152
- fakeEnabledWatchers = [{ providerId: "gmail" }];
153
- shareAnalytics = "unknown";
154
- // Unknown consent never drops at record time, so a null here means the
155
- // telemetry DB is unavailable — retry, don't skip a day.
156
- recordImpl = () => null;
157
-
158
- recordWatcherInventoryIfDue(BASE + 4);
159
-
160
- expect(checkpoints.get(INVENTORY_KEY)).toBeUndefined();
161
- });
162
- });
163
-
164
- describe("recordWatcherLlmProcessed", () => {
165
- test("embeds provider and conversation id in the event name", () => {
166
- recordWatcherLlmProcessed("linear", "conv-123");
167
-
168
- expect(recordedEvents).toEqual(["watcher_llm_processed:linear:conv-123"]);
169
- });
170
-
171
- test("swallows storage errors", () => {
172
- recordImpl = () => {
173
- throw new Error("db unavailable");
174
- };
175
-
176
- expect(() => recordWatcherLlmProcessed("gmail", "conv-456")).not.toThrow();
177
- });
178
- });
@@ -1,93 +0,0 @@
1
- /**
2
- * Watcher usage telemetry — lifecycle-event breadcrumbs that let fleet
3
- * analytics answer "is anyone using watchers, and what do they cost?"
4
- * ahead of the planned watcher → skills-and-schedules migration.
5
- *
6
- * Both event shapes ship through the existing lifecycle-event telemetry
7
- * pipeline, so they inherit its platform `share_analytics` consent gate and
8
- * need no wire-contract or platform-side changes:
9
- *
10
- * - `watcher_enabled:<providerId>` — one per enabled watcher, at most
11
- * once per 24h per daemon. Counts devices that have watchers
12
- * configured, including ones whose providers rarely produce events.
13
- * - `watcher_llm_processed:<providerId>:<conversationId>` — one per
14
- * watcher tick that ran an LLM background job. The conversation id is
15
- * embedded so analytics can join against `llm_usage` events for exact
16
- * cost attribution.
17
- *
18
- * Telemetry must never break the polling loop, so every entry point
19
- * swallows storage errors.
20
- */
21
-
22
- import { getRawShareAnalytics } from "../cloud/consent-cache.js";
23
- import {
24
- getMemoryCheckpoint,
25
- setMemoryCheckpoint,
26
- } from "../persistence/checkpoints.js";
27
- import { recordLifecycleEvent } from "../persistence/lifecycle-events-store.js";
28
- import { getLogger } from "../util/logger.js";
29
- import { listWatchers } from "./watcher-store.js";
30
-
31
- const log = getLogger("watcher-telemetry");
32
-
33
- const INVENTORY_CHECKPOINT_KEY = "telemetry:watchers:inventory_last_recorded";
34
- export const WATCHER_INVENTORY_INTERVAL_MS = 24 * 60 * 60 * 1000;
35
-
36
- let warnedInventoryDbUnavailable = false;
37
-
38
- /**
39
- * Record one `watcher_enabled:<providerId>` lifecycle event per enabled
40
- * watcher, at most once per 24h. Called from every watcher tick; the
41
- * checkpoint advances only after the events are recorded, so a transient
42
- * storage failure (a throw, or a degraded-mode `null` while consent is not
43
- * a confirmed opt-out) retries on the next tick instead of skipping a day.
44
- * A confirmed-opt-out `null` is a deliberate skip and still advances. Retries
45
- * can duplicate events for watchers recorded before the failure point —
46
- * an acceptable overcount for best-effort telemetry, where losing a full
47
- * day's inventory would not be.
48
- */
49
- export function recordWatcherInventoryIfDue(now: number): void {
50
- try {
51
- const last = Number(getMemoryCheckpoint(INVENTORY_CHECKPOINT_KEY) ?? "0");
52
- if (now - last < WATCHER_INVENTORY_INTERVAL_MS) {
53
- return;
54
- }
55
- for (const watcher of listWatchers({ enabledOnly: true })) {
56
- const recorded = recordLifecycleEvent(
57
- `watcher_enabled:${watcher.providerId}`,
58
- );
59
- if (recorded === null && getRawShareAnalytics() !== false) {
60
- if (!warnedInventoryDbUnavailable) {
61
- warnedInventoryDbUnavailable = true;
62
- log.warn(
63
- "Telemetry DB unavailable; watcher inventory retries next tick",
64
- );
65
- }
66
- return;
67
- }
68
- }
69
- warnedInventoryDbUnavailable = false;
70
- setMemoryCheckpoint(INVENTORY_CHECKPOINT_KEY, String(now));
71
- } catch (err) {
72
- log.warn({ err }, "Failed to record watcher inventory telemetry");
73
- }
74
- }
75
-
76
- /**
77
- * Record a `watcher_llm_processed:<providerId>:<conversationId>`
78
- * lifecycle event for a watcher tick that bootstrapped an LLM background
79
- * job. Recorded whenever a conversation was created — even if the job
80
- * later failed — because tokens may already have been spent.
81
- */
82
- export function recordWatcherLlmProcessed(
83
- providerId: string,
84
- conversationId: string,
85
- ): void {
86
- try {
87
- recordLifecycleEvent(
88
- `watcher_llm_processed:${providerId}:${conversationId}`,
89
- );
90
- } catch (err) {
91
- log.warn({ err }, "Failed to record watcher LLM-processed telemetry");
92
- }
93
- }
@@ -1,165 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync } from "node:fs";
2
- import { join } from "node:path";
3
-
4
- import type { WorkspaceMigration } from "./types.js";
5
-
6
- // Enable adaptive thinking on the cloud "balanced" and "quality-optimized"
7
- // profiles for existing platform instances.
8
- //
9
- // The assistant-side seed defaults (MANAGED_PROFILE_TEMPLATES in
10
- // seed-inference-profiles.ts) already ship thinking: { enabled: true,
11
- // streamThinking: true } for both profiles, which normalizes to
12
- // { type: "adaptive" } on the wire. Off-platform (BYOK) instances pick this
13
- // up on every boot because the seeder overwrites cloud profiles. On-platform
14
- // instances preserve existing profiles (the cloud overlay is authoritative),
15
- // so instances that were hatched before thinking was enabled in the templates
16
- // are stuck with thinking disabled or absent.
17
- //
18
- // This migration patches the on-disk config for both profiles, adding
19
- // thinking: { enabled: true, streamThinking: true } where it's missing or
20
- // explicitly disabled. It skips profiles that:
21
- // - Don't exist (no profile to patch)
22
- // - Already have thinking enabled (idempotent)
23
- // - Are source: "user" (user-created profiles are untouched)
24
- // - Have a non-managed, non-absent source (unknown origin)
25
- // - Resolve to a non-Anthropic provider (adaptive thinking is
26
- // Anthropic-specific). Effective provider is the profile's explicit
27
- // `provider`; otherwise the provider implied by a known Claude `model`
28
- // (mirroring the resolver's withImpliedProviders); otherwise
29
- // llm.default.provider — with a completely absent llm.default.provider
30
- // treated as Anthropic, matching migration 052's own `?? "anthropic"`
31
- // default. This keeps the legacy non-Anthropic empty `{}` shells seeded by
32
- // migration 052 off the repair while still patching profiles that pin a
33
- // known Claude model under a non-Anthropic default.
34
- //
35
- // Note: the live startup path re-runs the same repair after the cloud
36
- // overlay merge — see assistant/src/workspace/adaptive-thinking-repair.ts.
37
- // This file keeps its own frozen copy of the logic because migration modules
38
- // are self-contained snapshots and must never be imported by other code.
39
-
40
- const ADAPTIVE_THINKING = { enabled: true, streamThinking: true } as const;
41
- const TARGET_PROFILES = ["balanced", "quality-optimized"] as const;
42
-
43
- export const enableAdaptiveThinkingCloudProfilesMigration: WorkspaceMigration =
44
- {
45
- id: "097-enable-adaptive-thinking-managed-profiles",
46
- description:
47
- "Enable adaptive thinking on managed balanced and quality-optimized profiles",
48
- run(workspaceDir: string): void {
49
- const configPath = join(workspaceDir, "config.json");
50
- if (!existsSync(configPath)) {
51
- return;
52
- }
53
-
54
- let config: Record<string, unknown>;
55
- try {
56
- const raw = JSON.parse(readFileSync(configPath, "utf-8"));
57
- if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
58
- return;
59
- }
60
- config = raw as Record<string, unknown>;
61
- } catch {
62
- return;
63
- }
64
-
65
- const llm = readObject(config.llm);
66
- if (llm === null) {
67
- return;
68
- }
69
-
70
- const profiles = readObject(llm.profiles);
71
- if (profiles === null) {
72
- return;
73
- }
74
-
75
- // Profiles without an explicit provider and without a model-implied
76
- // provider inherit llm.default.provider at resolution time; an absent
77
- // llm.default.provider resolves to Anthropic.
78
- const defaultBlock = readObject(llm.default);
79
- const defaultProvider =
80
- typeof defaultBlock?.provider === "string"
81
- ? defaultBlock.provider
82
- : "anthropic";
83
-
84
- let changed = false;
85
-
86
- for (const name of TARGET_PROFILES) {
87
- const profile = readObject(profiles[name]);
88
- if (profile === null) {
89
- continue;
90
- }
91
-
92
- // Only patch managed Anthropic profiles.
93
- // Legacy profiles created before the `source` metadata field was
94
- // introduced have source=undefined. Treat these as managed when the
95
- // profile name is one of the canonical managed names (which
96
- // TARGET_PROFILES already guarantees) and the effective provider is
97
- // Anthropic. Effective provider is the explicit `provider`, else the
98
- // provider implied by a known Claude `model`, else the inherited
99
- // llm.default.provider. Explicit `source: "user"` profiles are always
100
- // skipped.
101
- if (profile.source === "user") {
102
- continue;
103
- }
104
- if (profile.source !== undefined && profile.source !== "managed") {
105
- continue;
106
- }
107
- const effectiveProvider = resolveEffectiveProvider(
108
- profile,
109
- defaultProvider,
110
- );
111
- if (effectiveProvider !== "anthropic") {
112
- continue;
113
- }
114
-
115
- // Skip if thinking is already enabled.
116
- const thinking = readObject(profile.thinking);
117
- if (thinking !== null && thinking.enabled === true) {
118
- continue;
119
- }
120
-
121
- profile.thinking = { ...ADAPTIVE_THINKING };
122
- profiles[name] = profile;
123
- changed = true;
124
- }
125
-
126
- if (changed) {
127
- llm.profiles = profiles;
128
- config.llm = llm;
129
- writeFileSync(configPath, JSON.stringify(config, null, 2) + "\n");
130
- }
131
- },
132
- down(_workspaceDir: string): void {
133
- // Forward-only.
134
- },
135
- };
136
-
137
- // Inline, conservative mirror of the resolver's catalog-based provider
138
- // implication. Migration modules are frozen, self-contained snapshots and must
139
- // not import the live model catalog. Anthropic's catalog model ids are bare
140
- // `claude-*` ids (the slash-prefixed `anthropic/claude-*` ids belong to
141
- // OpenRouter), so a profile pinning a `claude-*` model with no slash counts as
142
- // Anthropic.
143
- function resolveEffectiveProvider(
144
- profile: Record<string, unknown>,
145
- defaultProvider: string,
146
- ): string {
147
- if (typeof profile.provider === "string") {
148
- return profile.provider;
149
- }
150
- if (
151
- typeof profile.model === "string" &&
152
- profile.model.startsWith("claude-") &&
153
- !profile.model.includes("/")
154
- ) {
155
- return "anthropic";
156
- }
157
- return defaultProvider;
158
- }
159
-
160
- function readObject(value: unknown): Record<string, unknown> | null {
161
- if (value === null || typeof value !== "object" || Array.isArray(value)) {
162
- return null;
163
- }
164
- return value as Record<string, unknown>;
165
- }