@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,77 +1,49 @@
1
1
  /**
2
2
  * The deprecated `/x/*` route context is a compatibility shim: each field
3
- * delegates to a `@mycadet/plugin-api` call and records a one-per-route
4
- * deprecation-usage telemetry signal. These tests mock the three collaborators
5
- * (`publishEvent`, `runConversationTurn`, `recordWatchdogEvent`) and assert the
6
- * delegation, the telemetry payload, and the fire-once dedup.
3
+ * delegates to a `@mycadet/plugin-api` call. These tests mock the two
4
+ * collaborators (`publishEvent`, `runConversationTurn`) and assert the
5
+ * delegation.
7
6
  */
8
7
 
9
- import { beforeEach, describe, expect, mock, test } from "bun:test";
8
+ import { describe, expect, mock, test } from "bun:test";
10
9
 
11
10
  const publishCalls: Array<{ event: unknown; options: unknown }> = [];
12
11
  const turnCalls: Array<{ conversationId?: string; content: unknown }> = [];
13
- const watchdogCalls: Array<{
14
- checkName: string;
15
- detail?: Record<string, unknown> | null;
16
- }> = [];
17
12
 
18
13
  mock.module("../../../plugin-api/publish-event.js", () => ({
19
- publishEvent: async (event: unknown, options: unknown) => {
14
+ publishEvent: (event: unknown, options?: unknown) => {
20
15
  publishCalls.push({ event, options });
21
16
  },
22
17
  }));
23
18
  mock.module("../../../plugin-api/conversation-turn.js", () => ({
24
- runConversationTurn: async (opts: {
19
+ runConversationTurn: async (input: {
25
20
  conversationId?: string;
26
21
  content: unknown;
27
22
  }) => {
28
- turnCalls.push(opts);
29
- return {
30
- content: [],
31
- userMessageId: "user-msg-1",
32
- conversationId: opts.conversationId ?? "generated",
33
- };
34
- },
35
- }));
36
- mock.module("../../../telemetry/watchdog-events-store.js", () => ({
37
- recordWatchdogEvent: (record: {
38
- checkName: string;
39
- detail?: Record<string, unknown> | null;
40
- }) => {
41
- watchdogCalls.push(record);
23
+ turnCalls.push({
24
+ conversationId: input.conversationId,
25
+ content: input.content,
26
+ });
27
+ return { userMessageId: "user-msg-1" };
42
28
  },
43
29
  }));
44
30
 
45
31
  const { buildDeprecatedRouteContext } =
46
32
  await import("../deprecated-route-context.js");
47
33
 
48
- beforeEach(() => {
49
- publishCalls.length = 0;
50
- turnCalls.length = 0;
51
- watchdogCalls.length = 0;
52
- });
53
-
54
34
  describe("deprecated route context shim", () => {
55
- test("assistantEventHub.publish forwards to publishEvent and records a signal", async () => {
56
- const ctx = buildDeprecatedRouteContext("route-publish");
35
+ test("assistantEventHub.publish forwards to publishEvent", async () => {
36
+ const ctx = buildDeprecatedRouteContext();
57
37
  const event = { id: "e1" } as never;
58
38
  const options = { excludeClientId: "tab-1" } as never;
59
39
 
60
40
  await ctx.assistantEventHub.publish(event, options);
61
41
 
62
42
  expect(publishCalls).toEqual([{ event, options }]);
63
- expect(watchdogCalls).toHaveLength(1);
64
- expect(watchdogCalls[0].checkName).toBe("deprecated_api_use");
65
- expect(watchdogCalls[0].detail).toEqual({
66
- surface: "custom_route",
67
- api: "context.assistantEventHub.publish",
68
- replacement: "plugin-api:publishEvent",
69
- route_path: "route-publish",
70
- });
71
43
  });
72
44
 
73
45
  test("conversations.postMessage runs a turn and returns its user message id", async () => {
74
- const ctx = buildDeprecatedRouteContext("route-post");
46
+ const ctx = buildDeprecatedRouteContext();
75
47
 
76
48
  const result = await ctx.conversations.postMessage("conv-1", "hello there");
77
49
 
@@ -82,29 +54,10 @@ describe("deprecated route context shim", () => {
82
54
  content: [{ type: "text", text: "hello there" }],
83
55
  },
84
56
  ]);
85
- expect(watchdogCalls).toHaveLength(1);
86
- expect(watchdogCalls[0].detail).toEqual({
87
- surface: "custom_route",
88
- api: "context.conversations.postMessage",
89
- replacement: "plugin-api:runConversationTurn",
90
- route_path: "route-post",
91
- });
92
- });
93
-
94
- test("records the deprecation signal once per route + api (dedup)", async () => {
95
- const ctx = buildDeprecatedRouteContext("route-dedup");
96
-
97
- await ctx.assistantEventHub.publish({} as never);
98
- await ctx.assistantEventHub.publish({} as never);
99
- await ctx.assistantEventHub.publish({} as never);
100
-
101
- // Three calls, but only the first records a telemetry signal.
102
- expect(publishCalls).toHaveLength(3);
103
- expect(watchdogCalls).toHaveLength(1);
104
57
  });
105
58
 
106
59
  test("the context and its members are frozen", () => {
107
- const ctx = buildDeprecatedRouteContext("route-frozen");
60
+ const ctx = buildDeprecatedRouteContext();
108
61
  expect(Object.isFrozen(ctx)).toBe(true);
109
62
  expect(Object.isFrozen(ctx.assistantEventHub)).toBe(true);
110
63
  expect(Object.isFrozen(ctx.conversations)).toBe(true);
@@ -38,7 +38,7 @@ let managedProxyEnabled = true;
38
38
  mock.module("../../../providers/cloud-proxy/context.js", () => ({
39
39
  resolveCloudProxyContext: async () => ({
40
40
  enabled: managedProxyEnabled,
41
- cloudBaseUrl: "https://platform.example",
41
+ cloudBaseUrl: "https://test-cloud.mycadet.ai",
42
42
  assistantApiKey: managedProxyEnabled ? "key" : "",
43
43
  }),
44
44
  }));
@@ -556,9 +556,8 @@ describe("PATCH inference/profiles/:name (update) validation", () => {
556
556
  setConfig("llm", {
557
557
  profiles: {
558
558
  balanced: {
559
- source: "managed",
560
- provider: "fireworks",
561
- model: "accounts/fireworks/models/glm-5p2",
559
+ provider: "cadet",
560
+ model: "claude-sonnet-4-6",
562
561
  },
563
562
  },
564
563
  });
@@ -583,13 +582,6 @@ describe("PATCH inference/profiles/:name (update) validation", () => {
583
582
  // ── delete protection ───────────────────────────────────────────────────────
584
583
 
585
584
  describe("DELETE inference/profiles/:name protection", () => {
586
- test("rejects deleting a cloud default profile", async () => {
587
- setConfig("llm", { profiles: { balanced: { source: "managed" } } });
588
- await expect(
589
- call("inference_profiles_delete", { pathParams: { name: "balanced" } }),
590
- ).rejects.toThrow(/cloud profile/);
591
- });
592
-
593
585
  test("404s an unknown profile", async () => {
594
586
  setConfig("llm", { profiles: {} });
595
587
  await expect(
@@ -757,7 +749,7 @@ describe("GET inference/profiles honors the llm.default blob", () => {
757
749
  setConfig("llm", {
758
750
  profiles: {
759
751
  "zed-custom": { source: "user", provider: "anthropic" },
760
- auto: { source: "managed" },
752
+ auto: { source: "cloud" },
761
753
  "alpha-custom": { source: "user", provider: "anthropic" },
762
754
  },
763
755
  profileOrder: ["auto", "balanced", "zed-custom"],
@@ -793,6 +785,107 @@ describe("GET inference/profiles honors the llm.default blob", () => {
793
785
  });
794
786
  });
795
787
 
788
+ // ── resolved vision capability on the list ────────────────────────────────────
789
+
790
+ describe("GET inference/profiles resolves supportsVision per entry", () => {
791
+ type Listed = { profiles: Array<{ name: string; supportsVision?: boolean }> };
792
+
793
+ test("a vision-capable (provider, model) carries supportsVision: true", async () => {
794
+ setConfig("llm", {
795
+ profiles: {
796
+ vision: {
797
+ source: "user",
798
+ provider: "anthropic",
799
+ model: "claude-fable-5-1",
800
+ },
801
+ },
802
+ });
803
+
804
+ const listed = (await call("inference_profiles_list", {})) as Listed;
805
+ const entry = listed.profiles.find((p) => p.name === "vision");
806
+ expect(entry?.supportsVision).toBe(true);
807
+ });
808
+
809
+ test("the entry's inputModalities.image override beats the catalog", async () => {
810
+ setConfig("llm", {
811
+ profiles: {
812
+ gated: {
813
+ source: "user",
814
+ provider: "anthropic",
815
+ model: "claude-fable-5-1",
816
+ inputModalities: { image: { enabled: false } },
817
+ },
818
+ },
819
+ });
820
+
821
+ const listed = (await call("inference_profiles_list", {})) as Listed;
822
+ const entry = listed.profiles.find((p) => p.name === "gated");
823
+ expect(entry?.supportsVision).toBe(false);
824
+ });
825
+
826
+ test("an override can enable image on a catalog-non-vision model", async () => {
827
+ setConfig("llm", {
828
+ profiles: {
829
+ forced: {
830
+ source: "user",
831
+ provider: "ollama",
832
+ model: "llama3.2",
833
+ inputModalities: { image: { enabled: true, supported: true } },
834
+ },
835
+ },
836
+ });
837
+
838
+ const listed = (await call("inference_profiles_list", {})) as Listed;
839
+ const entry = listed.profiles.find((p) => p.name === "forced");
840
+ expect(entry?.supportsVision).toBe(true);
841
+ });
842
+
843
+ test("profiles without a provider or model stay unflagged", async () => {
844
+ setConfig("llm", {
845
+ profiles: {
846
+ sparse: { source: "cloud" },
847
+ },
848
+ });
849
+
850
+ const listed = (await call("inference_profiles_list", {})) as Listed;
851
+ const entry = listed.profiles.find((p) => p.name === "sparse");
852
+ expect(entry).toBeDefined();
853
+ expect(entry).not.toHaveProperty("supportsVision");
854
+ });
855
+
856
+ test("mix profiles carry their arms so pickers can judge dispatchability", async () => {
857
+ setConfig("llm", {
858
+ profiles: {
859
+ "arm-a": {
860
+ source: "user",
861
+ provider: "anthropic",
862
+ model: "claude-fable-5-1",
863
+ },
864
+ "arm-b": { source: "user", provider: "ollama", model: "llama3.2" },
865
+ blend: {
866
+ source: "user",
867
+ mix: [
868
+ { profile: "arm-a", weight: 1 },
869
+ { profile: "arm-b", weight: 1 },
870
+ ],
871
+ },
872
+ },
873
+ });
874
+
875
+ const listed = (await call("inference_profiles_list", {})) as {
876
+ profiles: Array<{
877
+ name: string;
878
+ mix?: Array<{ profile: string; weight: number }>;
879
+ }>;
880
+ };
881
+ const entry = listed.profiles.find((p) => p.name === "blend");
882
+ expect(entry?.mix).toEqual([
883
+ { profile: "arm-a", weight: 1 },
884
+ { profile: "arm-b", weight: 1 },
885
+ ]);
886
+ });
887
+ });
888
+
796
889
  // ── active-profile setter validation (Finding 3) ──────────────────────────────
797
890
 
798
891
  describe("POST inference/profiles/:name/validate billing guards", () => {
@@ -86,7 +86,7 @@ describe("integrations_ingress_status route", () => {
86
86
  test("reports unconfigured for a cloud-hosted assistant", async () => {
87
87
  ingressConfig = {
88
88
  ...ingressConfig,
89
- publicBaseUrl: "https://platform.example.com/gateway/callbacks/a-1",
89
+ publicBaseUrl: "https://test-cloud.mycadet.ai/gateway/callbacks/a-1",
90
90
  managedCallbacks: true,
91
91
  };
92
92
  lastTunnel = { provider: "tailscale", publicBaseUrl: TUNNEL_URL };
@@ -14,7 +14,7 @@
14
14
  import { beforeEach, describe, expect, mock, test } from "bun:test";
15
15
 
16
16
  import type { ResourceSample } from "../../../monitoring/resource-sample-types.js";
17
- import { getMonitoringPidPath } from "../../../util/platform.js";
17
+ import { getMonitoringPidPath } from "../../../util/layout.js";
18
18
 
19
19
  class FakeSpawnError extends Error {}
20
20
 
@@ -83,16 +83,11 @@ import {
83
83
  sanitizePluginName,
84
84
  } from "../../../cli/lib/install-from-github.js";
85
85
  import type { InstalledPluginInfo } from "../../../cli/lib/list-installed-plugins.js";
86
- import { DEFAULT_PIN_HISTORY_LIMIT } from "../../../cli/lib/plugin-constants.js";
87
86
  import {
88
87
  type PluginDetails,
89
88
  PluginDetailsNotFoundError,
90
89
  type PluginDetailsOptions,
91
90
  } from "../../../cli/lib/plugin-details.js";
92
- import {
93
- type PluginPinHistoryEntry,
94
- PluginPinHistoryError,
95
- } from "../../../cli/lib/plugin-pin-history.js";
96
91
  import type {
97
92
  PluginCatalog,
98
93
  PluginSearchMatch,
@@ -284,27 +279,6 @@ mock.module("../../../cli/lib/diff-plugin.js", () => ({
284
279
  diffPlugin: diffSpy,
285
280
  }));
286
281
 
287
- // Mock the pin-history lib: the GitHub commit-history walk is covered by
288
- // plugin-pin-history.test.ts; the routes only forward the name, validate a pin
289
- // against the resolved history, and map errors.
290
- const listPinHistorySpy = mock(
291
- async (..._args: unknown[]): Promise<PluginPinHistoryEntry[]> => {
292
- throw new Error("listPinHistorySpy default impl not configured");
293
- },
294
- );
295
- const resolvePinSpy = mock(
296
- async (..._args: unknown[]): Promise<PluginPinHistoryEntry | null> => {
297
- throw new Error("resolvePinSpy default impl not configured");
298
- },
299
- );
300
-
301
- mock.module("../../../cli/lib/plugin-pin-history.js", () => ({
302
- DEFAULT_PIN_HISTORY_LIMIT,
303
- PluginPinHistoryError,
304
- listPinHistory: listPinHistorySpy,
305
- resolvePinToMarketplaceCommit: resolvePinSpy,
306
- }));
307
-
308
282
  // Mock the toggle-plugin lib. `enablePlugin` / `disablePlugin` flip a
309
283
  // `.disabled` sentinel on disk in production; here we spy on them so the
310
284
  // route's broadcast + error mapping is the wiring under test. The error
@@ -381,7 +355,7 @@ mock.module("../../../skills/categories-cache.js", () => ({
381
355
  getLocalCategorySlugs: () => SKILLS_CATEGORY_SLUGS,
382
356
  }));
383
357
 
384
- import { getWorkspacePluginsDir } from "../../../util/platform.js";
358
+ import { getWorkspacePluginsDir } from "../../../util/layout.js";
385
359
  import {
386
360
  BadRequestError,
387
361
  ConflictError,
@@ -416,7 +390,6 @@ const uninstallHandler = findHandler("plugins_uninstall");
416
390
  const getHandler = findHandler("plugins_get");
417
391
  const installHandler = findHandler("plugins_install");
418
392
  const inspectHandler = findHandler("plugins_inspect");
419
- const versionsHandler = findHandler("plugins_versions");
420
393
  const upgradeHandler = findHandler("plugins_upgrade");
421
394
  const diffHandler = findHandler("plugins_diff");
422
395
  const enableHandler = findHandler("plugins_enable");
@@ -1084,12 +1057,12 @@ describe("GET /v1/plugins/search", () => {
1084
1057
  expect("icon" in byName.get("plain-plugin")!).toBe(false);
1085
1058
  });
1086
1059
 
1087
- test("preserves a bundled MCP package source and integration metadata", async () => {
1060
+ test("preserves MCP integration metadata from the catalog entry", async () => {
1088
1061
  getCatalogSpy.mockImplementation(async (ref) =>
1089
1062
  catalog(ref, [
1090
1063
  {
1091
1064
  name: "fathom",
1092
- path: "local:plugins/mcp-catalog/fathom@1.0.0",
1065
+ path: `github:acme/fathom@${CAVEMAN_PIN}`,
1093
1066
  description: "Search meeting transcripts.",
1094
1067
  category: null,
1095
1068
  integration: {
@@ -1105,9 +1078,9 @@ describe("GET /v1/plugins/search", () => {
1105
1078
  logo: "fathom.png",
1106
1079
  },
1107
1080
  source: {
1108
- kind: "local",
1109
- path: "plugins/mcp-catalog/fathom",
1110
- version: "1.0.0",
1081
+ kind: "github",
1082
+ repo: "acme/fathom",
1083
+ ref: CAVEMAN_PIN,
1111
1084
  },
1112
1085
  },
1113
1086
  ]),
@@ -1118,7 +1091,7 @@ describe("GET /v1/plugins/search", () => {
1118
1091
  expect(result.matches).toEqual([
1119
1092
  {
1120
1093
  name: "fathom",
1121
- path: "local:plugins/mcp-catalog/fathom@1.0.0",
1094
+ path: `github:acme/fathom@${CAVEMAN_PIN}`,
1122
1095
  description: "Search meeting transcripts.",
1123
1096
  category: null,
1124
1097
  integration: {
@@ -1134,9 +1107,9 @@ describe("GET /v1/plugins/search", () => {
1134
1107
  logo: "fathom.png",
1135
1108
  },
1136
1109
  source: {
1137
- kind: "local",
1138
- path: "plugins/mcp-catalog/fathom",
1139
- version: "1.0.0",
1110
+ kind: "github",
1111
+ repo: "acme/fathom",
1112
+ ref: CAVEMAN_PIN,
1140
1113
  },
1141
1114
  },
1142
1115
  ]);
@@ -1613,7 +1586,6 @@ function trustedInstallResult(opts: InstallPluginOptions): InstallPluginResult {
1613
1586
  describe("POST /v1/plugins/install", () => {
1614
1587
  beforeEach(() => {
1615
1588
  installSpy.mockReset();
1616
- resolvePinSpy.mockReset();
1617
1589
  broadcastMessageSpy.mockReset();
1618
1590
  getCatalogSpy.mockReset();
1619
1591
  // Default: the gated catalog resolves `caveman` to its bundled full-SHA pin.
@@ -1623,91 +1595,36 @@ describe("POST /v1/plugins/install", () => {
1623
1595
  });
1624
1596
 
1625
1597
  test("no-pin install resolves from the gated catalog and installs via trustedSource", async () => {
1626
- // The default (no-pin) path reads the same gated catalog `search`
1627
- // advertises and installs from a trusted pre-resolved source — no direct
1598
+ // The default (no-pin) path reads the same catalog `search` advertises
1599
+ // and installs from a trusted pre-resolved source — no direct
1628
1600
  // `plugins/marketplace.json` fetch (the pin/marketplace path is untouched).
1629
- const prev = process.env.CADET_DISABLE_CLOUD;
1630
- process.env.CADET_DISABLE_CLOUD = "true";
1631
- try {
1632
- installSpy.mockImplementation(async (opts) => trustedInstallResult(opts));
1633
-
1634
- const result = await invokeInstall({
1635
- body: { name: "caveman", force: true },
1636
- });
1637
-
1638
- // Resolved through the gated catalog, not the pin/marketplace path.
1639
- expect(getCatalogSpy).toHaveBeenCalledTimes(1);
1640
- expect(resolvePinSpy).not.toHaveBeenCalled();
1641
- // installPlugin receives the pre-resolved trusted coordinates (owner/repo
1642
- // split from the catalog `repo`, `rootPath` from its path, the full-SHA
1643
- // pin as `ref`) — no caller-supplied `ref`.
1644
- expect(installSpy.mock.calls[0]?.[0]).toEqual({
1645
- name: "caveman",
1646
- force: true,
1647
- trustedSource: {
1648
- owner: "JuliusBrussee",
1649
- repo: "caveman",
1650
- rootPath: "",
1651
- ref: CAVEMAN_PIN,
1652
- },
1653
- });
1654
- expect(result).toEqual({
1655
- ok: true,
1656
- name: "caveman",
1657
- target: "/workspace/.cadet/plugins/caveman",
1658
- fileCount: 7,
1659
- ref: CAVEMAN_PIN,
1660
- });
1661
- } finally {
1662
- if (prev === undefined) {
1663
- delete process.env.CADET_DISABLE_CLOUD;
1664
- } else {
1665
- process.env.CADET_DISABLE_CLOUD = prev;
1666
- }
1667
- }
1668
- });
1669
-
1670
- test("installs a bundled package from the exact catalog source", async () => {
1671
- getCatalogSpy.mockImplementation(async (ref) =>
1672
- catalog(ref, [
1673
- {
1674
- name: "fathom",
1675
- path: "local:plugins/mcp-catalog/fathom@1.0.0",
1676
- category: null,
1677
- source: {
1678
- kind: "local",
1679
- path: "plugins/mcp-catalog/fathom",
1680
- version: "1.0.0",
1681
- },
1682
- },
1683
- ]),
1684
- );
1685
- installSpy.mockImplementation(async (opts) => ({
1686
- name: opts.name,
1687
- target: `/workspace/.cadet/plugins/${opts.name}`,
1688
- fileCount: 2,
1689
- ref: "1.0.0",
1690
- commit: null,
1691
- committedAt: null,
1692
- }));
1601
+ installSpy.mockImplementation(async (opts) => trustedInstallResult(opts));
1693
1602
 
1694
- const result = await invokeInstall({ body: { name: "fathom" } });
1603
+ const result = await invokeInstall({
1604
+ body: { name: "caveman", force: true },
1605
+ });
1695
1606
 
1607
+ // Resolved through the catalog, not the pin/marketplace path.
1608
+ expect(getCatalogSpy).toHaveBeenCalledTimes(1);
1609
+ // installPlugin receives the pre-resolved trusted coordinates (owner/repo
1610
+ // split from the catalog `repo`, `rootPath` from its path, the full-SHA
1611
+ // pin as `ref`) — no caller-supplied `ref`.
1696
1612
  expect(installSpy.mock.calls[0]?.[0]).toEqual({
1697
- name: "fathom",
1698
- force: undefined,
1613
+ name: "caveman",
1614
+ force: true,
1699
1615
  trustedSource: {
1700
- kind: "local",
1701
- path: "plugins/mcp-catalog/fathom",
1702
- version: "1.0.0",
1616
+ owner: "JuliusBrussee",
1617
+ repo: "caveman",
1618
+ rootPath: "",
1619
+ ref: CAVEMAN_PIN,
1703
1620
  },
1704
1621
  });
1705
1622
  expect(result).toEqual({
1706
1623
  ok: true,
1707
- name: "fathom",
1708
- target: "/workspace/.cadet/plugins/fathom",
1709
- fileCount: 2,
1710
- ref: "1.0.0",
1624
+ name: "caveman",
1625
+ target: "/workspace/.cadet/plugins/caveman",
1626
+ fileCount: 7,
1627
+ ref: CAVEMAN_PIN,
1711
1628
  });
1712
1629
  });
1713
1630
 
@@ -1873,121 +1790,40 @@ describe("POST /v1/plugins/install", () => {
1873
1790
  expect((caught as Error).message).toContain("ECONNRESET");
1874
1791
  });
1875
1792
 
1876
- test("a reviewed pin installs from the marketplace commit that introduced it", async () => {
1877
- // GIVEN a pin that resolves to a marketplace commit in the reviewed history
1878
- resolvePinSpy.mockImplementation(async () => ({
1879
- pin: "a".repeat(40),
1880
- marketplaceCommit: "f".repeat(40),
1881
- promotedAt: "2026-06-01T00:00:00.000Z",
1882
- current: false,
1883
- }));
1884
- installSpy.mockImplementation(async (opts) => ({
1885
- name: opts.name,
1886
- target: `/workspace/.cadet/plugins/${opts.name}`,
1887
- fileCount: 7,
1888
- ref: opts.ref ?? "main",
1889
- commit: "a".repeat(40),
1890
- committedAt: null,
1891
- }));
1793
+ test("a pin matching the catalog's current ref installs via trustedSource", async () => {
1794
+ // The only reviewed revision is the one the live catalog pins now; a
1795
+ // matching pin installs the same trusted coordinates as the no-pin path.
1796
+ installSpy.mockImplementation(async (opts) => trustedInstallResult(opts));
1892
1797
 
1893
1798
  const result = await invokeInstall({
1894
- body: { name: "caveman", pin: "a".repeat(40) },
1799
+ body: { name: "caveman", pin: CAVEMAN_PIN },
1895
1800
  });
1896
1801
 
1897
- // THEN the install reads the manifest at the resolving marketplace commit,
1898
- // not the default branch, and the gated catalog resolver is bypassed — the
1899
- // pin path stays on the reviewed pin-history/GitHub route.
1900
- expect(getCatalogSpy).not.toHaveBeenCalled();
1901
1802
  expect(installSpy.mock.calls[0]?.[0]).toEqual({
1902
1803
  name: "caveman",
1903
- ref: "f".repeat(40),
1904
1804
  force: undefined,
1805
+ trustedSource: {
1806
+ owner: "JuliusBrussee",
1807
+ repo: "caveman",
1808
+ rootPath: "",
1809
+ ref: CAVEMAN_PIN,
1810
+ },
1905
1811
  });
1906
- expect(result.ref).toBe("f".repeat(40));
1812
+ expect(result.ref).toBe(CAVEMAN_PIN);
1907
1813
  });
1908
1814
 
1909
- test("an unreviewed pin is refused as a BadRequest before installing", async () => {
1910
- resolvePinSpy.mockImplementation(async () => null);
1911
-
1815
+ test("a pin that is not the catalog's current ref is refused as BadRequest", async () => {
1912
1816
  await expect(
1913
1817
  invokeInstall({ body: { name: "caveman", pin: "b".repeat(40) } }),
1914
1818
  ).rejects.toBeInstanceOf(BadRequestError);
1915
1819
  expect(installSpy).not.toHaveBeenCalled();
1916
1820
  });
1917
1821
 
1918
- test("a pin-history read failure surfaces as ServiceUnavailable (503)", async () => {
1919
- resolvePinSpy.mockImplementation(async () => {
1920
- throw new PluginPinHistoryError("HTTP 403");
1921
- });
1922
-
1822
+ test("a pin for an unknown plugin is refused as BadRequest", async () => {
1923
1823
  await expect(
1924
- invokeInstall({ body: { name: "caveman", pin: "c".repeat(40) } }),
1925
- ).rejects.toBeInstanceOf(ServiceUnavailableError);
1926
- expect(installSpy).not.toHaveBeenCalled();
1927
- });
1928
- });
1929
-
1930
- describe("GET /v1/plugins/:name/versions", () => {
1931
- beforeEach(() => {
1932
- listPinHistorySpy.mockReset();
1933
- });
1934
-
1935
- test("returns the resolved pin history", async () => {
1936
- const history: PluginPinHistoryEntry[] = [
1937
- {
1938
- pin: "c".repeat(40),
1939
- marketplaceCommit: "3".repeat(40),
1940
- promotedAt: "2026-06-10T00:00:00.000Z",
1941
- current: true,
1942
- },
1943
- {
1944
- pin: "a".repeat(40),
1945
- marketplaceCommit: "1".repeat(40),
1946
- promotedAt: "2026-06-01T00:00:00.000Z",
1947
- current: false,
1948
- },
1949
- ];
1950
- listPinHistorySpy.mockImplementation(async () => history);
1951
-
1952
- const result = await versionsHandler({ pathParams: { name: "level-up" } });
1953
- expect(result).toEqual(history);
1954
- });
1955
-
1956
- test("forwards a positive limit to the lib", async () => {
1957
- listPinHistorySpy.mockImplementation(async () => []);
1958
- await versionsHandler({
1959
- pathParams: { name: "level-up" },
1960
- queryParams: { limit: "3" },
1961
- });
1962
- expect(listPinHistorySpy.mock.calls[0]?.[2]).toEqual({ limit: 3 });
1963
- });
1964
-
1965
- test("rejects a non-positive limit as BadRequest before calling the lib", async () => {
1966
- await expect(
1967
- versionsHandler({
1968
- pathParams: { name: "level-up" },
1969
- queryParams: { limit: "0" },
1970
- }),
1824
+ invokeInstall({ body: { name: "ghost", pin: "b".repeat(40) } }),
1971
1825
  ).rejects.toBeInstanceOf(BadRequestError);
1972
- expect(listPinHistorySpy).not.toHaveBeenCalled();
1973
- });
1974
-
1975
- test("InvalidPluginNameError → BadRequestError (400)", async () => {
1976
- listPinHistorySpy.mockImplementation(async () => {
1977
- throw new InvalidPluginNameError("../escape");
1978
- });
1979
- await expect(
1980
- versionsHandler({ pathParams: { name: "../escape" } }),
1981
- ).rejects.toBeInstanceOf(BadRequestError);
1982
- });
1983
-
1984
- test("PluginPinHistoryError → ServiceUnavailableError (503)", async () => {
1985
- listPinHistorySpy.mockImplementation(async () => {
1986
- throw new PluginPinHistoryError("HTTP 429");
1987
- });
1988
- await expect(
1989
- versionsHandler({ pathParams: { name: "level-up" } }),
1990
- ).rejects.toBeInstanceOf(ServiceUnavailableError);
1826
+ expect(installSpy).not.toHaveBeenCalled();
1991
1827
  });
1992
1828
  });
1993
1829
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  import { beforeEach, describe, expect, mock, test } from "bun:test";
12
12
 
13
- import { getProcPidPath } from "../../../util/platform.js";
13
+ import { getProcPidPath } from "../../../util/layout.js";
14
14
 
15
15
  class FakeSpawnError extends Error {}
16
16