@mycadet/assistant 0.12.9 → 0.12.10

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 (651) hide show
  1. package/Dockerfile +0 -8
  2. package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +1 -1
  3. package/openapi.yaml +62 -910
  4. package/package.json +3 -7
  5. package/scripts/build-test-fixtures.ts +1 -1
  6. package/scripts/generate-openapi.ts +22 -6
  7. package/scripts/postinstall.ts +4 -10
  8. package/scripts/run-tests.ts +0 -21
  9. package/src/__tests__/adaptive-thinking-repair.test.ts +19 -57
  10. package/src/__tests__/agent-loop.test.ts +0 -76
  11. package/src/__tests__/anthropic-provider.test.ts +6 -6
  12. package/src/__tests__/assert-not-live-db.ts +1 -1
  13. package/src/__tests__/assistant-id-boundary-guard.test.ts +3 -3
  14. package/src/__tests__/attachments-store-heic-normalize.test.ts +1 -1
  15. package/src/__tests__/attachments-store.test.ts +1 -1
  16. package/src/__tests__/audit-log-rotation.test.ts +1 -1
  17. package/src/__tests__/btw-routes.test.ts +1 -1
  18. package/src/__tests__/byok-default-profile-ensure.test.ts +21 -27
  19. package/src/__tests__/call-conversation-messages.test.ts +0 -5
  20. package/src/__tests__/call-recovery.test.ts +2 -7
  21. package/src/__tests__/call-routes-http.test.ts +0 -12
  22. package/src/__tests__/call-store.test.ts +2 -7
  23. package/src/__tests__/catalog-files.test.ts +7 -5
  24. package/src/__tests__/checker.test.ts +1 -1
  25. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +4 -4
  26. package/src/__tests__/cloud-client-verify-credential.test.ts +0 -4
  27. package/src/__tests__/cloud-credential-catalog-cli.test.ts +14 -14
  28. package/src/__tests__/cloud-profile-guard.test.ts +48 -401
  29. package/src/__tests__/compaction-events.test.ts +2 -2
  30. package/src/__tests__/config-loader-backfill.test.ts +74 -163
  31. package/src/__tests__/config-loader-cloud-defaults.test.ts +11 -11
  32. package/src/__tests__/config-loader-corrupt.test.ts +10 -10
  33. package/src/__tests__/config-loader-quarantine-notice.test.ts +7 -7
  34. package/src/__tests__/config-loader-validation-reset-notice.test.ts +11 -11
  35. package/src/__tests__/config-schema.test.ts +26 -27
  36. package/src/__tests__/config-set-route.test.ts +2 -6
  37. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +28 -300
  38. package/src/__tests__/conversation-agent-loop-overflow.test.ts +39 -246
  39. package/src/__tests__/conversation-agent-loop.test.ts +2 -58
  40. package/src/__tests__/conversation-clear-safety.test.ts +0 -30
  41. package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
  42. package/src/__tests__/conversation-queue.test.ts +1 -1
  43. package/src/__tests__/conversation-runtime-assembly.test.ts +1 -1
  44. package/src/__tests__/conversation-skill-tools.test.ts +4 -444
  45. package/src/__tests__/conversation-slash-commands.test.ts +1 -1
  46. package/src/__tests__/conversation-store.test.ts +1 -84
  47. package/src/__tests__/conversation-surface-state.test.ts +0 -16
  48. package/src/__tests__/credential-health-service.test.ts +14 -1
  49. package/src/__tests__/credential-record-retire.test.ts +1 -1
  50. package/src/__tests__/credential-record-write-through.test.ts +1 -1
  51. package/src/__tests__/credential-security-invariants.test.ts +0 -145
  52. package/src/__tests__/custom-profile-ensure.test.ts +1 -1
  53. package/src/__tests__/default-profile-catalog-fallback.test.ts +5 -15
  54. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -2
  55. package/src/__tests__/dictation-profile-store.test.ts +6 -6
  56. package/src/__tests__/disk-usage.test.ts +28 -164
  57. package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -1
  58. package/src/__tests__/embedding-cloud-proxy-selection.test.ts +1 -1
  59. package/src/__tests__/emit-event-signal.test.ts +1 -1
  60. package/src/__tests__/gateway-client-cloud-outbound.test.ts +3 -3
  61. package/src/__tests__/gateway-only-enforcement.test.ts +1 -1
  62. package/src/__tests__/guardian-dispatch.test.ts +0 -13
  63. package/src/__tests__/helpers/seed-app.ts +1 -1
  64. package/src/__tests__/host-cu-routes-targeted.test.ts +1 -1
  65. package/src/__tests__/host-shell-tool.test.ts +1 -1
  66. package/src/__tests__/identity-routes.test.ts +1 -1
  67. package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
  68. package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
  69. package/src/__tests__/injector-chain.test.ts +1 -1
  70. package/src/__tests__/injector-config-quarantine-notice.test.ts +1 -1
  71. package/src/__tests__/injector-config-validation-reset-notice.test.ts +1 -1
  72. package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
  73. package/src/__tests__/{platform.test.ts → layout.test.ts} +1 -1
  74. package/src/__tests__/list-all-apps.test.ts +1 -1
  75. package/src/__tests__/live-workspace-guard.test.ts +2 -2
  76. package/src/__tests__/llm-resolver-override-or-default.test.ts +5 -6
  77. package/src/__tests__/llm-resolver.test.ts +7 -7
  78. package/src/__tests__/llm-schema-fallback-profile.test.ts +9 -10
  79. package/src/__tests__/llm-usage-store.test.ts +0 -495
  80. package/src/__tests__/log-export-routes.test.ts +1 -1
  81. package/src/__tests__/mcp-config-secret-boundary.test.ts +12 -53
  82. package/src/__tests__/mcp-list-plugin-servers.test.ts +1 -1
  83. package/src/__tests__/memory-config-file-parity.test.ts +1 -1
  84. package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
  85. package/src/__tests__/messages-read-boundary-guard.test.ts +0 -2
  86. package/src/__tests__/notification-guardian-path.test.ts +0 -7
  87. package/src/__tests__/onboarding-persona-write.test.ts +1 -1
  88. package/src/__tests__/openai-provider.test.ts +8 -8
  89. package/src/__tests__/path-policy.test.ts +1 -1
  90. package/src/__tests__/persona-resolver.test.ts +1 -1
  91. package/src/__tests__/plugin-app-serve-routes.test.ts +1 -1
  92. package/src/__tests__/plugin-effective-enabled-set.test.ts +1 -1
  93. package/src/__tests__/plugin-import-boundary-guard.test.ts +4 -6
  94. package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -3
  95. package/src/__tests__/provider-cloud-proxy-integration.test.ts +1 -5
  96. package/src/__tests__/provider-connections-backfill.test.ts +10 -10
  97. package/src/__tests__/prune-old-conversations-job.test.ts +6 -31
  98. package/src/__tests__/resolve-app.test.ts +1 -1
  99. package/src/__tests__/run-due-schedules.test.ts +1 -1
  100. package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -53
  101. package/src/__tests__/schedule-routes.test.ts +1 -1
  102. package/src/__tests__/schedule-store.test.ts +1 -1
  103. package/src/__tests__/secret-routes-cloud-proxy.test.ts +1 -1
  104. package/src/__tests__/skill-load-plugin-scope.test.ts +1 -1
  105. package/src/__tests__/surface-completion-compaction-boundary.test.ts +1 -1
  106. package/src/__tests__/tool-approval-handler.test.ts +1 -1
  107. package/src/__tests__/tool-audit.test.ts +5 -235
  108. package/src/__tests__/tool-executor-lifecycle-events.test.ts +54 -114
  109. package/src/__tests__/tools-get-route.test.ts +1 -1
  110. package/src/__tests__/turn-outcome-read.test.ts +1 -1
  111. package/src/__tests__/twilio-routes.test.ts +0 -1
  112. package/src/__tests__/usage-attribution.test.ts +0 -31
  113. package/src/__tests__/verification-control-plane-policy.test.ts +3 -10
  114. package/src/__tests__/visible-app-context.test.ts +1 -1
  115. package/src/__tests__/voice-ingress-preflight.test.ts +1 -1
  116. package/src/__tests__/workspace-git-service.test.ts +1 -1
  117. package/src/__tests__/workspace-greetings.test.ts +1 -1
  118. package/src/acp/__tests__/helpers/acp-config-stub.ts +1 -1
  119. package/src/activation/progress-store.ts +1 -1
  120. package/src/activation/turn-hooks.ts +1 -1
  121. package/src/agent/loop.ts +0 -51
  122. package/src/apps/app-store.ts +1 -1
  123. package/src/avatar/__tests__/avatar-store.test.ts +2 -172
  124. package/src/avatar/accent-backfill.ts +1 -1
  125. package/src/avatar/avatar-manifest.ts +1 -1
  126. package/src/avatar/avatar-store.ts +10 -69
  127. package/src/avatar/ensure-raster.ts +1 -1
  128. package/src/avatar/identity-avatar.ts +1 -1
  129. package/src/avatar/sync-avatar.ts +1 -1
  130. package/src/avatar/traits-png-sync.ts +1 -1
  131. package/src/bundler/compiler-tools.ts +1 -1
  132. package/src/bundler/package-resolver.ts +1 -1
  133. package/src/calls/__tests__/call-controller.test.ts +25 -27
  134. package/src/calls/active-call-lease.ts +1 -1
  135. package/src/calls/call-controller.ts +3 -3
  136. package/src/calls/call-domain.ts +4 -8
  137. package/src/calls/call-store.ts +2 -76
  138. package/src/calls/resolve-call-tts-provider.ts +3 -3
  139. package/src/calls/twilio-config.ts +3 -3
  140. package/src/calls/twilio-rest.ts +2 -2
  141. package/src/calls/voice-ingress-preflight.ts +2 -2
  142. package/src/cli/bundled-modules.ts +0 -2
  143. package/src/cli/commands/__tests__/apps.test.ts +1 -1
  144. package/src/cli/commands/__tests__/plugins.test.ts +9 -66
  145. package/src/cli/commands/__tests__/ps.test.ts +67 -0
  146. package/src/cli/commands/auth.help.ts +2 -2
  147. package/src/cli/commands/avatar.ts +1 -1
  148. package/src/cli/commands/changelog.ts +1 -1
  149. package/src/cli/commands/cloud/__tests__/subscription.test.ts +2 -2
  150. package/src/cli/commands/cloud/index.help.ts +1 -1
  151. package/src/cli/commands/cloud/index.ts +2 -2
  152. package/src/cli/commands/db/refresh.ts +1 -1
  153. package/src/cli/commands/db/repair-step-conversation-backfill.ts +1 -1
  154. package/src/cli/commands/db/repair.ts +1 -1
  155. package/src/cli/commands/db/status.ts +1 -1
  156. package/src/cli/commands/inference-profiles.ts +1 -12
  157. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +1 -116
  158. package/src/cli/commands/memory/index.help.ts +1 -43
  159. package/src/cli/commands/memory/memory-v3.ts +0 -64
  160. package/src/cli/commands/plugins.ts +54 -205
  161. package/src/cli/commands/ps.ts +5 -2
  162. package/src/cli/commands/status.ts +1 -1
  163. package/src/cli/index.help.ts +0 -2
  164. package/src/cli/lib/__tests__/inspect-plugin.test.ts +36 -66
  165. package/src/cli/lib/__tests__/install-from-cloud.test.ts +1 -1
  166. package/src/cli/lib/__tests__/install-from-github.test.ts +41 -117
  167. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +2 -185
  168. package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +36 -66
  169. package/src/cli/lib/__tests__/plugin-catalog-visibility.test.ts +4 -6
  170. package/src/cli/lib/__tests__/plugin-details.test.ts +113 -96
  171. package/src/cli/lib/__tests__/search-plugins.test.ts +9 -16
  172. package/src/cli/lib/__tests__/uninstall-plugin.test.ts +1 -1
  173. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +38 -15
  174. package/src/cli/lib/diff-plugin.ts +1 -1
  175. package/src/cli/lib/inspect-plugin.ts +13 -97
  176. package/src/cli/lib/install-from-cloud.ts +1 -1
  177. package/src/cli/lib/install-from-github.ts +75 -154
  178. package/src/cli/lib/install-plugin-dependencies.ts +1 -1
  179. package/src/cli/lib/list-installed-plugins.ts +1 -1
  180. package/src/cli/lib/open-browser.ts +1 -1
  181. package/src/cli/lib/plugin-catalog-cache.ts +8 -51
  182. package/src/cli/lib/plugin-catalog-resolve.ts +3 -22
  183. package/src/cli/lib/plugin-details.ts +5 -27
  184. package/src/cli/lib/plugin-marketplace.ts +18 -266
  185. package/src/cli/lib/search-plugins.ts +23 -43
  186. package/src/cli/lib/toggle-plugin.ts +1 -1
  187. package/src/cli/lib/uninstall-plugin.ts +1 -1
  188. package/src/cli/lib/upgrade-plugin.ts +3 -49
  189. package/src/cli/program.ts +1 -3
  190. package/src/cli.ts +1 -1
  191. package/src/cloud/client.ts +0 -6
  192. package/src/cloud/consent-cache.test.ts +22 -201
  193. package/src/cloud/consent-cache.ts +16 -111
  194. package/src/cloud/sync-identity.ts +1 -1
  195. package/src/config/__tests__/chat-settings.test.ts +1 -1
  196. package/src/config/__tests__/cloud-identity.test.ts +15 -2
  197. package/src/config/__tests__/default-plugin-skill-discovery.test.ts +1 -1
  198. package/src/config/__tests__/default-profile-catalog.test.ts +12 -51
  199. package/src/config/__tests__/deployment-context-defaults.test.ts +13 -13
  200. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +4 -4
  201. package/src/config/__tests__/loader-last-known-good.test.ts +9 -9
  202. package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +7 -7
  203. package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +1 -1
  204. package/src/config/__tests__/profile-materialization.test.ts +2 -4
  205. package/src/config/__tests__/sync-gated-profiles.test.ts +1 -106
  206. package/src/config/acp-agent-write.ts +1 -1
  207. package/src/config/bundled-skills/settings/tools/open-system-settings.test.ts +1 -1
  208. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
  209. package/src/config/call-site-defaults.ts +0 -6
  210. package/src/config/cloud-identity.ts +12 -5
  211. package/src/config/composer-preferences.ts +1 -1
  212. package/src/config/default-profile-catalog.ts +8 -75
  213. package/src/config/default-profile-names.ts +2 -25
  214. package/src/config/env-registry.ts +1 -14
  215. package/src/config/env.ts +8 -6
  216. package/src/config/llm-resolver.ts +1 -2
  217. package/src/config/loader.ts +13 -17
  218. package/src/config/profile-materialization.ts +1 -1
  219. package/src/config/schema.ts +1 -7
  220. package/src/config/schemas/call-site-catalog.ts +0 -7
  221. package/src/config/schemas/llm.ts +22 -27
  222. package/src/config/seed-inference-profiles.ts +16 -17
  223. package/src/config/skills.ts +2 -2
  224. package/src/config/sync-gated-profiles.ts +6 -24
  225. package/src/credential-health/credential-health-service.ts +10 -3
  226. package/src/daemon/approval-generators.ts +3 -3
  227. package/src/daemon/config-watcher.ts +2 -2
  228. package/src/daemon/conversation-agent-loop-handlers.ts +0 -18
  229. package/src/daemon/conversation-agent-loop.ts +6 -97
  230. package/src/daemon/conversation-process.ts +1 -1
  231. package/src/daemon/conversation-skill-tools.ts +4 -72
  232. package/src/daemon/conversation-store.ts +1 -1
  233. package/src/daemon/conversation-surface-state.ts +0 -33
  234. package/src/daemon/conversation-surfaces.ts +1 -86
  235. package/src/daemon/conversation-tool-setup.test.ts +1 -1
  236. package/src/daemon/conversation-tool-setup.ts +0 -23
  237. package/src/daemon/conversation.ts +3 -5
  238. package/src/daemon/daemon-control.ts +3 -3
  239. package/src/daemon/dictation-profile-store.ts +3 -3
  240. package/src/daemon/event-loop-watchdog.test.ts +2 -198
  241. package/src/daemon/event-loop-watchdog.ts +0 -185
  242. package/src/daemon/external-plugins-bootstrap.ts +1 -1
  243. package/src/daemon/first-greeting.ts +1 -1
  244. package/src/daemon/handlers/skills.ts +1 -1
  245. package/src/daemon/host-app-control-proxy.ts +1 -1
  246. package/src/daemon/host-cu-proxy.ts +2 -2
  247. package/src/daemon/identity-helpers.ts +1 -1
  248. package/src/daemon/lifecycle.ts +11 -15
  249. package/src/daemon/main.ts +1 -1
  250. package/src/daemon/now-scratchpad.ts +1 -1
  251. package/src/daemon/process-message.ts +4 -4
  252. package/src/daemon/profiler-run-store.ts +2 -2
  253. package/src/daemon/providers-setup.ts +2 -2
  254. package/src/daemon/shutdown-handlers.ts +0 -10
  255. package/src/daemon/sqlite-corruption-watchdog.test.ts +2 -142
  256. package/src/daemon/sqlite-corruption-watchdog.ts +17 -81
  257. package/src/daemon/tool-side-effects.ts +1 -1
  258. package/src/desktop/desktop-session-manager.ts +1 -1
  259. package/src/desktop/desktop-wallpaper-renderer.ts +1 -1
  260. package/src/heartbeat/heartbeat-service.ts +1 -1
  261. package/src/home/feed-writer.ts +1 -1
  262. package/src/home/home-greeting-cache.ts +1 -1
  263. package/src/home/relationship-state-writer.ts +2 -2
  264. package/src/hooks/__tests__/hook-live-reload.test.ts +1 -1
  265. package/src/hooks/hook-loader.ts +2 -2
  266. package/src/inbound/__tests__/oauth-callback-url.test.ts +2 -2
  267. package/src/inbound/oauth-callback-url.ts +3 -3
  268. package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
  269. package/src/ipc/socket-path.ts +1 -1
  270. package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
  271. package/src/live-voice/__tests__/live-voice-vad.test.ts +1 -1
  272. package/src/live-voice/live-voice-session.ts +3 -66
  273. package/src/mcp/__tests__/effective-config.test.ts +1 -1
  274. package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +2 -2
  275. package/src/mcp/__tests__/mcp-oauth-provider.test.ts +2 -3
  276. package/src/mcp/__tests__/reload-signal-emission.test.ts +1 -1
  277. package/src/mcp/__tests__/reload-signal.test.ts +1 -1
  278. package/src/mcp/__tests__/workspace-mcp-config.test.ts +19 -21
  279. package/src/mcp/reload-signal.ts +1 -1
  280. package/src/mcp/workspace-mcp-config.ts +1 -23
  281. package/src/messaging/draft-store.ts +1 -1
  282. package/src/monitoring/__tests__/active-conversations.test.ts +1 -1
  283. package/src/monitoring/__tests__/page-cache.test.ts +1 -1
  284. package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
  285. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +1 -1
  286. package/src/monitoring/active-conversations.ts +1 -1
  287. package/src/monitoring/control.ts +1 -1
  288. package/src/monitoring/daemon-boot-time.ts +1 -1
  289. package/src/monitoring/daemon-heartbeat.ts +1 -1
  290. package/src/monitoring/page-cache.ts +1 -1
  291. package/src/monitoring/plugin-auto-update.ts +1 -7
  292. package/src/monitoring/plugin-source-watch.ts +1 -1
  293. package/src/monitoring/recovery/db.ts +1 -1
  294. package/src/monitoring/recovery/inflight-content.ts +1 -1
  295. package/src/monitoring/resource-sampler.ts +3 -14
  296. package/src/monitoring/stall-capture.ts +1 -1
  297. package/src/monitoring/worker.ts +9 -76
  298. package/src/monitoring/workspace-git-heartbeat.ts +1 -1
  299. package/src/oauth/connect-orchestrator.ts +4 -4
  300. package/src/permissions/checker.ts +1 -1
  301. package/src/permissions/workspace-policy.ts +1 -1
  302. package/src/persistence/__tests__/main-db-readonly-probe.ts +27 -52
  303. package/src/persistence/__tests__/message-content-file.test.ts +1 -1
  304. package/src/persistence/__tests__/slow-sync-log.test.ts +0 -2
  305. package/src/persistence/attachments-store.ts +1 -1
  306. package/src/persistence/conversation-crud.ts +1 -38
  307. package/src/persistence/conversation-directories.ts +1 -1
  308. package/src/persistence/conversation-types.ts +0 -8
  309. package/src/persistence/db-async-query.ts +1 -1
  310. package/src/persistence/db-connection.ts +11 -1
  311. package/src/persistence/db-init.ts +1 -1
  312. package/src/persistence/db-maintenance.ts +1 -1
  313. package/src/persistence/embeddings/__tests__/embedding-local-lifecycle.test.ts +1 -1
  314. package/src/persistence/embeddings/embedding-local.ts +4 -4
  315. package/src/persistence/embeddings/embedding-runtime-manager.ts +1 -1
  316. package/src/persistence/embeddings/qdrant-client.ts +1 -1
  317. package/src/persistence/embeddings/qdrant-manager.ts +1 -1
  318. package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +1 -1
  319. package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +1 -1
  320. package/src/persistence/job-handlers/cleanup.ts +8 -17
  321. package/src/persistence/llm-usage-store.ts +2 -229
  322. package/src/persistence/message-content-file.ts +1 -1
  323. package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +1 -1
  324. package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +1 -1
  325. package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
  326. package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
  327. package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.test.ts +13 -0
  328. package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.test.ts +13 -0
  329. package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.test.ts +13 -0
  330. package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.test.ts +13 -0
  331. package/src/persistence/migrations/333-create-telemetry-events-table.test.ts +7 -4
  332. package/src/persistence/migrations/334-backfill-telemetry-events-outbox.test.ts +13 -0
  333. package/src/persistence/migrations/387-drop-telemetry-tables.ts +51 -0
  334. package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +9 -1
  335. package/src/persistence/migrations/__tests__/387-drop-telemetry-tables.test.ts +79 -0
  336. package/src/persistence/migrations/helpers/relocation.ts +1 -1
  337. package/src/persistence/migrations/run-migrations.ts +1 -1
  338. package/src/persistence/migrations/validate-migration-state.ts +1 -1
  339. package/src/persistence/raw-query.ts +1 -29
  340. package/src/persistence/slow-sync-log.ts +0 -23
  341. package/src/persistence/steps.ts +2 -0
  342. package/src/{telemetry → persistence}/tool-audit.ts +6 -121
  343. package/src/plugin-api/index.ts +1 -1
  344. package/src/plugin-api/plugin-name-env.ts +1 -1
  345. package/src/plugins/__tests__/installed-plugin-dirs.test.ts +1 -1
  346. package/src/plugins/collect-source-versions.ts +1 -1
  347. package/src/plugins/defaults/channel/package.json +1 -1
  348. package/src/plugins/defaults/cloud-hosted/package.json +1 -1
  349. package/src/plugins/defaults/compaction/package.json +1 -1
  350. package/src/plugins/defaults/documents/package.json +1 -1
  351. package/src/plugins/defaults/empty-response/package.json +1 -1
  352. package/src/plugins/defaults/exploration-drift/package.json +1 -1
  353. package/src/plugins/defaults/image-fallback/package.json +1 -1
  354. package/src/plugins/defaults/image-recovery/package.json +1 -1
  355. package/src/plugins/defaults/max-tokens-continue/package.json +1 -1
  356. package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +1 -1
  357. package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +1 -1
  358. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +0 -82
  359. package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +0 -41
  360. package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -2
  361. package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -52
  362. package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +0 -18
  363. package/src/plugins/defaults/memory/package.json +1 -1
  364. package/src/plugins/defaults/memory/paths.ts +4 -4
  365. package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
  366. package/src/plugins/defaults/memory/src/memory-v2-routes.ts +5 -5
  367. package/src/plugins/defaults/memory/src/memory-v3-routes.ts +0 -207
  368. package/src/plugins/defaults/memory/src/memory-worker-routes.ts +1 -1
  369. package/src/plugins/defaults/memory/startup.ts +1 -22
  370. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +2 -253
  371. package/src/plugins/defaults/memory/v3/orchestrate.ts +5 -129
  372. package/src/plugins/defaults/memory/worker-control.ts +1 -1
  373. package/src/plugins/defaults/memory/worker.ts +2 -2
  374. package/src/plugins/defaults/session/package.json +1 -1
  375. package/src/plugins/defaults/surface-completion-nudge/package.json +1 -1
  376. package/src/plugins/defaults/task-progress/package.json +1 -1
  377. package/src/plugins/defaults/task-progress-nudge/package.json +1 -1
  378. package/src/plugins/defaults/title-generate/package.json +1 -1
  379. package/src/plugins/defaults/tool-error/package.json +1 -1
  380. package/src/plugins/defaults/tool-result-truncate/package.json +1 -1
  381. package/src/plugins/defaults/turn-context/package.json +1 -1
  382. package/src/plugins/defaults/workspace/injectors.ts +1 -1
  383. package/src/plugins/defaults/workspace/package.json +1 -1
  384. package/src/plugins/disabled-state.ts +1 -1
  385. package/src/plugins/ensure-plugin-api-shim.ts +1 -1
  386. package/src/plugins/ensure-shared-dep-links.ts +1 -1
  387. package/src/plugins/installed-plugin-dirs.ts +1 -1
  388. package/src/plugins/mcp-servers.ts +7 -9
  389. package/src/plugins/mtime-cache.ts +2 -2
  390. package/src/plugins/source-versions.ts +1 -1
  391. package/src/prompts/bootstrap-cleanup.ts +1 -1
  392. package/src/prompts/persona-resolver.ts +1 -1
  393. package/src/prompts/sections.ts +2 -2
  394. package/src/prompts/system-prompt.ts +10 -42
  395. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +0 -37
  396. package/src/providers/__tests__/cadet-connection-routing.test.ts +2 -2
  397. package/src/providers/cadet/client.ts +1 -1
  398. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -1
  399. package/src/providers/inference/adapter-factory.ts +1 -1
  400. package/src/providers/inference/backfill.ts +3 -10
  401. package/src/providers/inference/profile-probe.ts +1 -1
  402. package/src/providers/retry.ts +0 -2
  403. package/src/providers/types.ts +0 -7
  404. package/src/providers/usage-tracking.ts +1 -1
  405. package/src/routes/__tests__/route-host.test.ts +1 -1
  406. package/src/routes/control.ts +1 -1
  407. package/src/routes/route-host-client.ts +1 -1
  408. package/src/routes/worker.ts +2 -2
  409. package/src/runtime/agent-wake.ts +1 -1
  410. package/src/runtime/assistant-stream-state.ts +1 -1
  411. package/src/runtime/auth/token-service.ts +1 -1
  412. package/src/runtime/background-job-runner.ts +1 -1
  413. package/src/runtime/middleware/twilio-validation.ts +2 -2
  414. package/src/runtime/routes/__tests__/app-pin-routes.test.ts +1 -1
  415. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +1 -1
  416. package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +3 -33
  417. package/src/runtime/routes/__tests__/cloud-credits-routes.test.ts +5 -4
  418. package/src/runtime/routes/__tests__/cloud-invoice-routes.test.ts +4 -3
  419. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +59 -287
  420. package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +1 -1
  421. package/src/runtime/routes/__tests__/deprecated-route-context.test.ts +15 -62
  422. package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +105 -12
  423. package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
  424. package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
  425. package/src/runtime/routes/__tests__/plugins-routes.test.ts +47 -211
  426. package/src/runtime/routes/__tests__/route-host-worker-routes.test.ts +1 -1
  427. package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +1 -1
  428. package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +1 -1
  429. package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +1 -1
  430. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -1
  431. package/src/runtime/routes/__tests__/user-routes-cli.test.ts +1 -1
  432. package/src/runtime/routes/__tests__/user-routes-notices.test.ts +1 -1
  433. package/src/runtime/routes/__tests__/user-routes-request.test.ts +1 -1
  434. package/src/runtime/routes/app-management-routes.ts +1 -1
  435. package/src/runtime/routes/attachment-routes.ts +1 -1
  436. package/src/runtime/routes/audit-routes.ts +1 -1
  437. package/src/runtime/routes/avatar-routes.ts +3 -10
  438. package/src/runtime/routes/cloud-routes.ts +3 -3
  439. package/src/runtime/routes/content-source-routes.ts +1 -1
  440. package/src/runtime/routes/conversation-query-routes.ts +60 -621
  441. package/src/runtime/routes/conversation-routes.ts +1 -38
  442. package/src/runtime/routes/debug-routes.ts +1 -1
  443. package/src/runtime/routes/deprecated-route-context.ts +5 -61
  444. package/src/runtime/routes/heartbeat-routes.ts +1 -1
  445. package/src/runtime/routes/identity-routes.ts +1 -1
  446. package/src/runtime/routes/index.ts +0 -6
  447. package/src/runtime/routes/inference-profile-session-handler.ts +3 -3
  448. package/src/runtime/routes/inference-profiles-routes.ts +48 -21
  449. package/src/runtime/routes/inference-provider-connection-routes.ts +0 -1
  450. package/src/runtime/routes/llm-call-sites-routes.ts +3 -3
  451. package/src/runtime/routes/log-export/__tests__/installed-inventory.test.ts +1 -1
  452. package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
  453. package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +1 -1
  454. package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
  455. package/src/runtime/routes/log-export-routes.ts +17 -15
  456. package/src/runtime/routes/migration-rollback-routes.ts +1 -1
  457. package/src/runtime/routes/migration-routes.ts +2 -3
  458. package/src/runtime/routes/monitoring-routes.ts +2 -2
  459. package/src/runtime/routes/oauth-providers.ts +5 -5
  460. package/src/runtime/routes/plugins-routes.ts +38 -163
  461. package/src/runtime/routes/profiler-routes.ts +1 -1
  462. package/src/runtime/routes/route-host-worker-routes.ts +1 -1
  463. package/src/runtime/routes/sanity-routes.ts +1 -1
  464. package/src/runtime/routes/schedule-routes.ts +1 -1
  465. package/src/runtime/routes/schedule-worker-routes.ts +1 -1
  466. package/src/runtime/routes/settings-routes.ts +1 -1
  467. package/src/runtime/routes/sounds-config-routes.ts +1 -1
  468. package/src/runtime/routes/surface-conversation-resolver.ts +1 -7
  469. package/src/runtime/routes/user-route-dispatcher.ts +1 -3
  470. package/src/runtime/routes/user-route-import.ts +1 -1
  471. package/src/runtime/routes/user-route-resolution.ts +1 -1
  472. package/src/runtime/routes/user-routes-cli.ts +1 -1
  473. package/src/runtime/routes/workspace-commit-routes.ts +1 -1
  474. package/src/runtime/routes/workspace-greetings.ts +1 -1
  475. package/src/runtime/routes/workspace-routes.ts +1 -1
  476. package/src/runtime/routes/workspace-utils.ts +1 -1
  477. package/src/runtime/sync/resource-sync-events.ts +1 -1
  478. package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +1 -1
  479. package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1 -1
  480. package/src/schedule/plugin-schedule-availability.ts +1 -1
  481. package/src/schedule/plugin-schedule-declarations.ts +1 -1
  482. package/src/schedule/run-script.ts +1 -1
  483. package/src/schedule/scheduler.ts +1 -11
  484. package/src/schedule/worker-control.ts +1 -1
  485. package/src/schedule/worker.ts +3 -3
  486. package/src/security/oauth2.ts +2 -2
  487. package/src/security/secret-allowlist.ts +1 -1
  488. package/src/signals/cancel.ts +1 -1
  489. package/src/signals/conversation-undo.ts +1 -1
  490. package/src/signals/emit-event.ts +1 -1
  491. package/src/signals/event-stream.ts +1 -1
  492. package/src/signals/user-message.ts +1 -1
  493. package/src/skills/catalog-install.ts +2 -1
  494. package/src/skills/clawhub.ts +1 -1
  495. package/src/skills/cloud-store.ts +1 -1
  496. package/src/skills/path-classifier.ts +1 -1
  497. package/src/skills/skill-history.ts +1 -1
  498. package/src/skills/skillssh-registry.ts +1 -1
  499. package/src/skills/uninstall.ts +1 -1
  500. package/src/skills/workspace-skill-md-signature.ts +1 -1
  501. package/src/subagent/manager.ts +1 -1
  502. package/src/theme/workspace-theme.ts +1 -1
  503. package/src/tools/browser/auth-cache.ts +1 -1
  504. package/src/tools/browser/browser-manager.ts +1 -1
  505. package/src/tools/browser/runtime-check.ts +1 -1
  506. package/src/tools/executor.ts +4 -4
  507. package/src/tools/filesystem/write.ts +1 -1
  508. package/src/tools/permission-checker.ts +2 -51
  509. package/src/tools/run-standalone.ts +1 -1
  510. package/src/tools/skills/format-input-schema.ts +1 -1
  511. package/src/tools/skills/load.ts +1 -1
  512. package/src/tools/skills/scaffold-cloud.ts +0 -32
  513. package/src/tools/terminal/safe-env.ts +1 -2
  514. package/src/tools/terminal/sanitized-bash.ts +1 -1
  515. package/src/tools/terminal/shell.ts +1 -1
  516. package/src/tools/tool-approval-handler.ts +4 -1
  517. package/src/tools/workflows/manage-workflows.ts +2 -2
  518. package/src/tools/workflows/run-workflow.test.ts +1 -1
  519. package/src/tools/workspace-tools/loader.ts +1 -1
  520. package/src/tts/synthesis-stream.ts +2 -2
  521. package/src/usage/attribution.ts +1 -11
  522. package/src/util/browser.ts +1 -1
  523. package/src/util/bun-runtime.ts +2 -1
  524. package/src/util/device-id.ts +1 -1
  525. package/src/util/disk-usage.ts +4 -139
  526. package/src/util/layout.ts +3 -3
  527. package/src/util/logger.ts +1 -1
  528. package/src/util/logs-db-path.ts +1 -1
  529. package/src/util/memory-db-path.ts +1 -1
  530. package/src/util/{platform.ts → os.ts} +5 -30
  531. package/src/util/process-tree.ts +19 -0
  532. package/src/util/sqlite3-runtime.ts +1 -1
  533. package/src/util/telemetry-db-path.ts +1 -1
  534. package/src/watcher/__tests__/engine.test.ts +0 -23
  535. package/src/watcher/engine.ts +0 -7
  536. package/src/windows-compiled-cli.ts +0 -4
  537. package/src/windows-compiled-worker-entry.ts +0 -6
  538. package/src/workflows/leaf-runner.test.ts +1 -1
  539. package/src/workflows/leaf-runner.ts +1 -1
  540. package/src/workflows/library.ts +1 -1
  541. package/src/workspace/adaptive-thinking-repair.ts +5 -24
  542. package/src/workspace/byok-default-profile-ensure.ts +24 -26
  543. package/src/workspace/custom-profile-ensure.ts +2 -2
  544. package/src/workspace/git-service.ts +1 -1
  545. package/src/workspace/hatched-date.ts +1 -1
  546. package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +2 -2
  547. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
  548. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +1 -1
  549. package/src/workspace/migrations/077-seed-memory-router-callsite.ts +1 -1
  550. package/src/workspace/migrations/registry.ts +0 -4
  551. package/src/workspace/turn-commit.ts +1 -1
  552. package/docs/activation-funnel-telemetry.md +0 -324
  553. package/scripts/bundled-plugin-packages.ts +0 -154
  554. package/scripts/generate-bundled-plugin-packages.ts +0 -29
  555. package/src/__tests__/activation-early-marking.test.ts +0 -114
  556. package/src/__tests__/auth-fallback-events-store.test.ts +0 -99
  557. package/src/__tests__/config-get-vision-flag.test.ts +0 -139
  558. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -400
  559. package/src/__tests__/internal-telemetry-routes.test.ts +0 -213
  560. package/src/__tests__/telemetry-routes.test.ts +0 -182
  561. package/src/__tests__/turn-events-store.test.ts +0 -376
  562. package/src/__tests__/ui-channel-variants.test.ts +0 -53
  563. package/src/avatar/__tests__/avatar-changed-telemetry.test.ts +0 -217
  564. package/src/avatar/avatar-changed-telemetry.ts +0 -128
  565. package/src/calls/__tests__/call-funnel-telemetry.test.ts +0 -204
  566. package/src/cli/commands/telemetry.help.ts +0 -27
  567. package/src/cli/commands/telemetry.ts +0 -83
  568. package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +0 -251
  569. package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +0 -113
  570. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +0 -384
  571. package/src/cli/lib/__tests__/plugin-pin-history.test.ts +0 -164
  572. package/src/cli/lib/__tests__/plugins-install-offline.test.ts +0 -228
  573. package/src/cli/lib/bundled-marketplace.json +0 -1575
  574. package/src/cli/lib/bundled-plugin-packages.json +0 -827
  575. package/src/cli/lib/bundled-plugin-packages.ts +0 -87
  576. package/src/cli/lib/plugin-catalog-local.ts +0 -94
  577. package/src/cli/lib/plugin-pin-history.ts +0 -276
  578. package/src/cloud/feature-gate.ts +0 -8
  579. package/src/config/__tests__/cloud-rehydration.test.ts +0 -180
  580. package/src/config/cloud-rehydration.ts +0 -35
  581. package/src/daemon/__tests__/auto-profile-router.test.ts +0 -380
  582. package/src/daemon/auto-profile-router.ts +0 -428
  583. package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +0 -391
  584. package/src/monitoring/__tests__/db-integrity-sample.test.ts +0 -113
  585. package/src/monitoring/__tests__/oom-kill-reporter.test.ts +0 -374
  586. package/src/monitoring/db-integrity-check.ts +0 -163
  587. package/src/monitoring/db-integrity-sample.ts +0 -176
  588. package/src/monitoring/oom-kill-reporter.ts +0 -469
  589. package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -158
  590. package/src/onboarding/onboarding-events-store.ts +0 -296
  591. package/src/persistence/__tests__/raw-query-telemetry.test.ts +0 -76
  592. package/src/persistence/lifecycle-events-store.test.ts +0 -134
  593. package/src/persistence/lifecycle-events-store.ts +0 -110
  594. package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +0 -76
  595. package/src/plugins/defaults/memory/activation-session-store.ts +0 -50
  596. package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +0 -281
  597. package/src/runtime/routes/auto-profile-routes.ts +0 -83
  598. package/src/runtime/routes/internal-telemetry-routes.ts +0 -142
  599. package/src/runtime/routes/telemetry-routes.ts +0 -274
  600. package/src/security/auth-fallback-events-store.ts +0 -57
  601. package/src/telemetry/__tests__/activation-funnel.test.ts +0 -95
  602. package/src/telemetry/__tests__/config-setting-events-store.test.ts +0 -63
  603. package/src/telemetry/__tests__/config-setting-snapshot.test.ts +0 -143
  604. package/src/telemetry/__tests__/flush-checkpoints.test.ts +0 -56
  605. package/src/telemetry/__tests__/live-voice-funnel.test.ts +0 -174
  606. package/src/telemetry/__tests__/outbox-test-harness.ts +0 -85
  607. package/src/telemetry/__tests__/phone-call-funnel.test.ts +0 -72
  608. package/src/telemetry/__tests__/telemetry-event-fixtures.ts +0 -282
  609. package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -71
  610. package/src/telemetry/activation-funnel.ts +0 -172
  611. package/src/telemetry/config-setting-events-store.ts +0 -40
  612. package/src/telemetry/config-setting-snapshot.ts +0 -170
  613. package/src/telemetry/flush-checkpoints.ts +0 -70
  614. package/src/telemetry/live-voice-funnel.ts +0 -185
  615. package/src/telemetry/memory-corpus-size.test.ts +0 -120
  616. package/src/telemetry/memory-corpus-size.ts +0 -184
  617. package/src/telemetry/memory-tier-reporter.test.ts +0 -195
  618. package/src/telemetry/memory-tier-reporter.ts +0 -130
  619. package/src/telemetry/phone-call-funnel.ts +0 -144
  620. package/src/telemetry/skill-loaded-events-store.test.ts +0 -93
  621. package/src/telemetry/skill-loaded-events-store.ts +0 -39
  622. package/src/telemetry/telemetry-event-sources.test.ts +0 -223
  623. package/src/telemetry/telemetry-event-sources.ts +0 -597
  624. package/src/telemetry/telemetry-events-outbox.test.ts +0 -375
  625. package/src/telemetry/telemetry-events-outbox.ts +0 -237
  626. package/src/telemetry/telemetry-main-db.ts +0 -48
  627. package/src/telemetry/telemetry-wire-source.json +0 -4
  628. package/src/telemetry/telemetry-wire-validation.test.ts +0 -157
  629. package/src/telemetry/telemetry-wire-validation.ts +0 -162
  630. package/src/telemetry/telemetry-wire.generated.ts +0 -483
  631. package/src/telemetry/tool-executed-events-store.test.ts +0 -210
  632. package/src/telemetry/tool-executed-events-store.ts +0 -102
  633. package/src/telemetry/trace-collection-policy.test.ts +0 -28
  634. package/src/telemetry/trace-collection-policy.ts +0 -30
  635. package/src/telemetry/turn-events-store.ts +0 -216
  636. package/src/telemetry/turn-trace-store.test.ts +0 -884
  637. package/src/telemetry/turn-trace-store.ts +0 -399
  638. package/src/telemetry/types.test.ts +0 -38
  639. package/src/telemetry/types.ts +0 -780
  640. package/src/telemetry/usage-telemetry-reporter.test.ts +0 -3445
  641. package/src/telemetry/usage-telemetry-reporter.ts +0 -566
  642. package/src/telemetry/watchdog-direct-emit.test.ts +0 -112
  643. package/src/telemetry/watchdog-direct-emit.ts +0 -104
  644. package/src/telemetry/watchdog-events-store.ts +0 -31
  645. package/src/tools/ui-surface/channel-variants.ts +0 -52
  646. package/src/watcher/__tests__/telemetry.test.ts +0 -178
  647. package/src/watcher/telemetry.ts +0 -93
  648. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +0 -165
  649. package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +0 -151
  650. /package/src/{telemetry → persistence}/tool-usage-store.ts +0 -0
  651. /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