@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,17 +1,15 @@
1
1
  /**
2
2
  * Tests for {@link getPluginDetails}.
3
3
  *
4
- * At the default ref, the catalog entry is resolved from the gated plugin
5
- * catalog (the same source search and install-by-name use): these tests run
6
- * with platform features disabled (`CADET_DISABLE_CLOUD`) so the catalog is
7
- * the bundled manifest — real plugin names / pinned SHAs, zero network. An
8
- * explicit historical `ref` instead reads the GitHub `plugins/marketplace.json`
9
- * at that revision (a git lookup, matching pin history / inspect). GitHub is
10
- * replaced with an
4
+ * At the default ref, the catalog entry is resolved from the mocked cloud
5
+ * plugin catalog (the same source search and install-by-name use) — real
6
+ * plugin names / pinned SHAs, zero network. An explicit historical `ref`
7
+ * instead reads the GitHub `plugins/marketplace.json` at that revision (a git
8
+ * lookup, matching pin history / inspect). GitHub is replaced with an
11
9
  * in-memory Contents API fixture passed via the `fetch` dependency, and the
12
10
  * installed-copy path is exercised against a real temp directory passed via
13
- * `workspacePluginsDir` — no globals are monkey-patched. The fixture answers two
14
- * URL shapes:
11
+ * `workspacePluginsDir` — no globals are monkey-patched. The fixture answers
12
+ * two URL shapes:
15
13
  * - directory listings (`/contents/<path>` → entry array or 404),
16
14
  * - raw file downloads (a listing entry's `download_url`).
17
15
  *
@@ -27,12 +25,13 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
27
25
 
28
26
  import type { FetchLike } from "../fetch-like.js";
29
27
  import { invalidatePluginCatalogCache } from "../plugin-catalog-cache.js";
30
- import { readBundledPluginCatalog } from "../plugin-catalog-local.js";
31
28
  import {
32
29
  getPluginDetails,
33
30
  PluginDetailsNotFoundError,
34
31
  } from "../plugin-details.js";
32
+ import type { MarketplaceEntry } from "../plugin-marketplace.js";
35
33
  import {
34
+ marketplaceMatch,
36
35
  PluginCatalogUnavailableError,
37
36
  type PluginSearchMatch,
38
37
  } from "../search-plugins.js";
@@ -75,6 +74,24 @@ function makeFetch(config: FixtureConfig): FetchLike {
75
74
  return new Response(config.raw[url], { status: 200 });
76
75
  }
77
76
 
77
+ if (url.includes("/v1/plugins")) {
78
+ return new Response(
79
+ JSON.stringify({
80
+ plugins: CATALOG_FIXTURES.map((e) => ({
81
+ name: e.name,
82
+ ...(e.source.source === "github"
83
+ ? { repo: e.source.repo, ref: e.source.ref }
84
+ : {}),
85
+ description: e.description,
86
+ category: e.category,
87
+ homepage: e.homepage,
88
+ license: e.license,
89
+ })),
90
+ }),
91
+ { status: 200, headers: { "content-type": "application/json" } },
92
+ );
93
+ }
94
+
78
95
  if (url.includes("/contents")) {
79
96
  const key = listingKey(url);
80
97
  const entries = config.listings?.[key];
@@ -107,16 +124,64 @@ function splitOnce(s: string, sep: string): [string, string] {
107
124
  return [s.slice(0, i), s.slice(i + sep.length)];
108
125
  }
109
126
 
110
- /** The bundled catalog entry for {@link name} — the source under test. */
127
+ /**
128
+ * Catalog fixture rows served to the mocked cloud catalog — the source under
129
+ * test. Former bundled-catalog entries, now exercised through the platform
130
+ * fetch path.
131
+ */
132
+ const CATALOG_FIXTURES: MarketplaceEntry[] = [
133
+ {
134
+ name: "caveman",
135
+ source: {
136
+ source: "github",
137
+ repo: "JuliusBrussee/caveman",
138
+ ref: "63a91ecadbf4c4719a4602a5abb00883f9966034",
139
+ },
140
+ description:
141
+ "Ultra-compressed communication mode that strips filler words to cut token usage.",
142
+ category: "productivity",
143
+ homepage: "https://github.com/JuliusBrussee/caveman",
144
+ license: "MIT",
145
+ },
146
+ {
147
+ name: "simple-memory",
148
+ source: {
149
+ source: "github",
150
+ repo: "vargasjr-dev/simple-memory",
151
+ ref: "ed09a4c01bf18e4ac8859faee94cb65c7cbd1ca3",
152
+ },
153
+ description:
154
+ "Reference memory plugin that exercises the full plugin API with low-cost variants of Cadet's memory defaults.",
155
+ category: "memory",
156
+ homepage: "https://github.com/vargasjr-dev/simple-memory",
157
+ license: "MIT",
158
+ },
159
+ {
160
+ name: "dynamic-notch",
161
+ source: {
162
+ source: "github",
163
+ repo: "AnitaKirkovska/dynamic-notch",
164
+ ref: "9729c3685d60d00d1de73a183b03122b9fa1f8f4",
165
+ },
166
+ description:
167
+ "Put your Cadet assistant inside your MacBook's notch: click to chat, hold Ctrl+Option to talk, and get a floating task bulb while it works, with live-streamed replies and per-sentence voice.",
168
+ category: "interface",
169
+ homepage: "https://github.com/AnitaKirkovska/dynamic-notch",
170
+ license: "MIT",
171
+ },
172
+ ];
173
+
174
+ /** The catalog fixture entry for {@link name} — the source under test. */
111
175
  function bundledMatch(name: string): PluginSearchMatch & {
112
176
  source: Extract<PluginSearchMatch["source"], { kind: "github" }>;
113
177
  } {
114
- const match = readBundledPluginCatalog().matches.find((m) => m.name === name);
115
- if (!match) {
116
- throw new Error(`bundled catalog has no entry for "${name}"`);
178
+ const entry = CATALOG_FIXTURES.find((e) => e.name === name);
179
+ if (!entry) {
180
+ throw new Error(`catalog fixture has no entry for "${name}"`);
117
181
  }
182
+ const match = marketplaceMatch(entry);
118
183
  if (match.source.kind !== "github") {
119
- throw new Error(`bundled catalog entry "${name}" is not GitHub-backed`);
184
+ throw new Error(`catalog fixture entry "${name}" is not GitHub-backed`);
120
185
  }
121
186
  return match as PluginSearchMatch & {
122
187
  source: Extract<PluginSearchMatch["source"], { kind: "github" }>;
@@ -142,34 +207,16 @@ function sha16(buf: Buffer): string {
142
207
  return createHash("sha256").update(buf).digest("hex").slice(0, 16);
143
208
  }
144
209
 
145
- const ORIGINAL_ENV = {
146
- IS_CLOUD: process.env.IS_CLOUD,
147
- CADET_DISABLE_CLOUD: process.env.CADET_DISABLE_CLOUD,
148
- };
149
-
150
- function restoreEnv(): void {
151
- for (const [key, value] of Object.entries(ORIGINAL_ENV)) {
152
- if (value === undefined) {
153
- delete process.env[key];
154
- } else {
155
- process.env[key] = value;
156
- }
157
- }
158
- }
159
-
160
210
  let workspace: string;
161
211
 
162
- describe("getPluginDetails (bundled catalog, offline)", () => {
212
+ describe("getPluginDetails (mocked cloud catalog)", () => {
163
213
  beforeEach(() => {
164
214
  workspace = mkdtempSync(join(tmpdir(), "plugin-details-"));
165
215
  invalidatePluginCatalogCache();
166
- process.env.CADET_DISABLE_CLOUD = "true";
167
- delete process.env.IS_CLOUD;
168
216
  });
169
217
 
170
218
  afterEach(() => {
171
219
  rmSync(workspace, { recursive: true, force: true });
172
- restoreEnv();
173
220
  });
174
221
 
175
222
  test("resolves an external plugin: catalog metadata + repo README/package.json", async () => {
@@ -234,6 +281,23 @@ describe("getPluginDetails (bundled catalog, offline)", () => {
234
281
  if (url === "raw://caveman/readme") {
235
282
  return new Response("# Caveman", { status: 200 });
236
283
  }
284
+ if (url.includes("/v1/plugins")) {
285
+ return new Response(
286
+ JSON.stringify({
287
+ plugins: CATALOG_FIXTURES.map((e) => ({
288
+ name: e.name,
289
+ ...(e.source.source === "github"
290
+ ? { repo: e.source.repo, ref: e.source.ref }
291
+ : {}),
292
+ description: e.description,
293
+ category: e.category,
294
+ homepage: e.homepage,
295
+ license: e.license,
296
+ })),
297
+ }),
298
+ { status: 200, headers: { "content-type": "application/json" } },
299
+ );
300
+ }
237
301
  return new Response("unexpected url: " + url, { status: 500 });
238
302
  }) as FetchLike;
239
303
 
@@ -465,68 +529,24 @@ describe("getPluginDetails (bundled catalog, offline)", () => {
465
529
  expect(details.source).toEqual(caveman.source);
466
530
  });
467
531
 
468
- test("resolves an explicit historical ref via the GitHub marketplace, not the gated catalog", async () => {
469
- // GIVEN an explicit historical ref and a name absent from the gated catalog
532
+ test("an explicit historical ref no longer resolves — the catalog has no history", async () => {
533
+ // The retired local marketplace manifest could be read at any git ref;
534
+ // the cloud catalog has no revisions, so a historical ref resolves to
535
+ // nothing and a not-installed plugin 404s.
470
536
  const historicalRef = "a".repeat(40);
471
- const historicalRepo = "octo/time-machine";
472
- const marketplaceRefs: string[] = [];
473
- const fetch = (async (input: RequestInfo | URL) => {
474
- const url = typeof input === "string" ? input : input.toString();
475
- // The marketplace manifest, read at the requested historical ref
476
- if (url.includes("/contents/plugins/marketplace.json")) {
477
- marketplaceRefs.push(new URL(url).searchParams.get("ref") ?? "");
478
- return new Response(
479
- JSON.stringify({
480
- name: "cadet",
481
- plugins: [
482
- {
483
- name: "time-traveler",
484
- source: {
485
- source: "github",
486
- repo: historicalRepo,
487
- ref: "b".repeat(40),
488
- },
489
- description: "historical description",
490
- homepage: "https://historical.example.com",
491
- license: "MIT",
492
- },
493
- ],
494
- }),
495
- { status: 200 },
496
- );
497
- }
498
- // The entry's own external repo, read at its pinned source ref
499
- if (url.includes("/contents") && url.includes(historicalRepo)) {
500
- return new Response(
501
- JSON.stringify([fileEntry("README.md", "raw://hist/readme")]),
502
- { status: 200, headers: { "content-type": "application/json" } },
503
- );
504
- }
505
- if (url === "raw://hist/readme") {
506
- return new Response("# Time Traveler (historical)", { status: 200 });
507
- }
508
- return new Response("unexpected url: " + url, { status: 500 });
537
+ let fetchCalls = 0;
538
+ const fetch = (async () => {
539
+ fetchCalls += 1;
540
+ return new Response("unexpected request", { status: 500 });
509
541
  }) as FetchLike;
510
542
 
511
- // WHEN we resolve the detail view at the historical ref
512
- const details = await getPluginDetails(
513
- { name: "time-traveler", ref: historicalRef },
514
- { fetch, workspacePluginsDir: workspace },
515
- );
516
-
517
- // THEN the marketplace manifest was read at the requested historical ref
518
- expect(marketplaceRefs).toContain(historicalRef);
519
- // AND source + metadata come from that historical entry, not the gated catalog
520
- expect(details.source).toEqual({
521
- kind: "github",
522
- repo: historicalRepo,
523
- ref: "b".repeat(40),
524
- });
525
- expect(details.description).toBe("historical description");
526
- expect(details.homepage).toBe("https://historical.example.com");
527
- expect(details.license).toBe("MIT");
528
- expect(details.readme).toContain("historical");
529
- expect(details.ref).toBe(historicalRef);
543
+ await expect(
544
+ getPluginDetails(
545
+ { name: "time-traveler", ref: historicalRef },
546
+ { fetch, workspacePluginsDir: workspace },
547
+ ),
548
+ ).rejects.toBeInstanceOf(PluginDetailsNotFoundError);
549
+ expect(fetchCalls).toBe(0);
530
550
  });
531
551
 
532
552
  test("hides a gated integration at an explicit historical ref", async () => {
@@ -738,14 +758,11 @@ describe("getPluginDetails (catalog unavailable, platform enabled)", () => {
738
758
  beforeEach(() => {
739
759
  workspace = mkdtempSync(join(tmpdir(), "plugin-details-"));
740
760
  invalidatePluginCatalogCache();
741
- delete process.env.IS_CLOUD;
742
- delete process.env.CADET_DISABLE_CLOUD;
743
761
  });
744
762
 
745
763
  afterEach(() => {
746
764
  rmSync(workspace, { recursive: true, force: true });
747
765
  invalidatePluginCatalogCache();
748
- restoreEnv();
749
766
  });
750
767
 
751
768
  test("an installed copy still renders from disk when the catalog is down", async () => {
@@ -8,7 +8,6 @@
8
8
 
9
9
  import { describe, expect, test } from "bun:test";
10
10
 
11
- import { buildBundledPluginCatalog } from "../plugin-catalog-local.js";
12
11
  import type { MarketplaceEntry } from "../plugin-marketplace.js";
13
12
  import {
14
13
  assertValidSearchPattern,
@@ -58,13 +57,7 @@ function entry(
58
57
  /** Build a resolved {@link PluginCatalog} from raw entries the way the catalog
59
58
  * sources do (dedupe by name, project, sort), reusing the real projection. */
60
59
  function catalog(entries: MarketplaceEntry[], ref = "main"): PluginCatalog {
61
- return {
62
- ...buildBundledPluginCatalog({
63
- name: "mycadet",
64
- plugins: entries,
65
- }),
66
- ref,
67
- };
60
+ return { ref, matches: projectMarketplaceEntries(entries) };
68
61
  }
69
62
 
70
63
  describe("filterPluginCatalog", () => {
@@ -151,13 +144,13 @@ describe("assertValidSearchPattern", () => {
151
144
  });
152
145
 
153
146
  describe("marketplaceMatch", () => {
154
- test("projects a bundled MCP package and its integration metadata", () => {
147
+ test("projects an MCP package's integration metadata", () => {
155
148
  const match = marketplaceMatch({
156
149
  name: "fathom",
157
150
  source: {
158
- source: "local",
159
- path: "plugins/mcp-catalog/fathom",
160
- version: "1.0.0",
151
+ source: "github",
152
+ repo: "acme/fathom",
153
+ ref: SHA_A,
161
154
  },
162
155
  integration: {
163
156
  kind: "mcp",
@@ -172,12 +165,12 @@ describe("marketplaceMatch", () => {
172
165
 
173
166
  expect(match).toMatchObject({
174
167
  name: "fathom",
175
- path: "local:plugins/mcp-catalog/fathom@1.0.0",
168
+ path: `github:acme/fathom@${SHA_A}`,
176
169
  integration: { kind: "mcp", logo: "fathom.png" },
177
170
  source: {
178
- kind: "local",
179
- path: "plugins/mcp-catalog/fathom",
180
- version: "1.0.0",
171
+ kind: "github",
172
+ repo: "acme/fathom",
173
+ ref: SHA_A,
181
174
  },
182
175
  });
183
176
  });
@@ -43,7 +43,7 @@ mock.module("../../../mcp/mcp-oauth-provider.js", () => ({
43
43
  }));
44
44
 
45
45
  import { resetHookCacheForTests } from "../../../hooks/hook-loader.js";
46
- import { getWorkspacePluginsDir } from "../../../util/platform.js";
46
+ import { getWorkspacePluginsDir } from "../../../util/layout.js";
47
47
  import { InvalidPluginNameError } from "../install-from-github.js";
48
48
  const { PluginNotInstalledError, uninstallPlugin } =
49
49
  await import("../uninstall-plugin.js");
@@ -28,6 +28,7 @@ import {
28
28
  PluginNotFoundError,
29
29
  PluginSourceUnavailableError,
30
30
  } from "../install-from-github.js";
31
+ import { invalidatePluginCatalogCache } from "../plugin-catalog-cache.js";
31
32
  import { computeFingerprint } from "../plugin-fingerprint.js";
32
33
  import { PluginNotInstalledError } from "../uninstall-plugin.js";
33
34
  import {
@@ -40,7 +41,7 @@ import {
40
41
  const SHA_A = "a".repeat(40);
41
42
  const SHA_B = "b".repeat(40);
42
43
  const CANON_REPO = "vargasjr-dev/mycadet";
43
- const MANIFEST_URL = `https://api.github.com/repos/${CANON_REPO}/contents/plugins/marketplace.json`;
44
+ const CATALOG_URL = "https://test-cloud.mycadet.ai/v1/plugins/";
44
45
  const CONTENTS = `https://api.github.com/repos/${CANON_REPO}/contents/`;
45
46
 
46
47
  /** A marketplace manifest pinning `name` to `ref`. */
@@ -60,11 +61,11 @@ function manifestWith(name: string, ref: string): unknown {
60
61
  }
61
62
 
62
63
  /**
63
- * Build a `fetch` that serves the marketplace manifest and answers the GitHub
64
- * Contents API listing (used by the adapter-stub lookup) with a 404, so the
65
- * clone is treated as a raw external tree. `manifest: undefined` answers the
66
- * manifest with 404; `manifestStatus` overrides the manifest status to
67
- * simulate a transient marketplace failure.
64
+ * Build a `fetch` that serves the plugin catalog (a manifest flattened into
65
+ * cloud rows) and answers the GitHub Contents API listing (used by the
66
+ * adapter-stub lookup) with a 404, so the clone is treated as a raw external
67
+ * tree. `manifest: undefined` serves an empty catalog; `manifestStatus`
68
+ * overrides the catalog status to simulate a transient failure.
68
69
  */
69
70
  function makeFetch(opts: {
70
71
  manifest?: unknown;
@@ -73,16 +74,33 @@ function makeFetch(opts: {
73
74
  }): FetchLike {
74
75
  return (async (input: RequestInfo | URL) => {
75
76
  const url = typeof input === "string" ? input : input.toString();
76
- if (url.startsWith(MANIFEST_URL)) {
77
+ if (url.startsWith(CATALOG_URL)) {
77
78
  if (opts.manifestStatus !== undefined && opts.manifestStatus !== 200) {
78
- return new Response("manifest unavailable", {
79
+ return new Response("catalog unavailable", {
79
80
  status: opts.manifestStatus,
80
81
  });
81
82
  }
82
83
  if (opts.manifest === undefined) {
83
- return new Response("not found", { status: 404 });
84
+ return new Response(JSON.stringify({ plugins: [] }), { status: 200 });
84
85
  }
85
- return new Response(JSON.stringify(opts.manifest), { status: 200 });
86
+ const manifest = opts.manifest as {
87
+ plugins?: Array<{
88
+ name: string;
89
+ source?: { source: string; repo?: string; ref?: string };
90
+ description?: string;
91
+ category?: string;
92
+ license?: string;
93
+ }>;
94
+ };
95
+ const rows = (manifest.plugins ?? []).map((entry) => ({
96
+ name: entry.name,
97
+ ...(entry.source?.repo ? { repo: entry.source.repo } : {}),
98
+ ...(entry.source?.ref ? { ref: entry.source.ref } : {}),
99
+ description: entry.description,
100
+ category: entry.category,
101
+ license: entry.license,
102
+ }));
103
+ return new Response(JSON.stringify({ plugins: rows }), { status: 200 });
86
104
  }
87
105
  // The remote commit date `inspect` resolves to surface the human-readable
88
106
  // "to" timestamp; absent it 404s and the timestamp degrades to null.
@@ -230,6 +248,9 @@ beforeEach(() => {
230
248
  ws = mkdtempSync(join(tmpdir(), "upgrade-plugin-"));
231
249
  pluginsDir = join(ws, "plugins");
232
250
  mkdirSync(pluginsDir, { recursive: true });
251
+ invalidatePluginCatalogCache();
252
+ delete process.env.CADET_DISABLE_CLOUD;
253
+ delete process.env.IS_CLOUD;
233
254
  });
234
255
 
235
256
  afterEach(() => {
@@ -285,15 +306,15 @@ describe("upgradePlugin", () => {
285
306
  expect(result.toTimestamp).toBe("2026-06-05T08:12:24.000Z");
286
307
  });
287
308
 
288
- test("a dry run resolves the target timestamp from the marketplace pin", async () => {
289
- // GIVEN an installed copy and a marketplace pin whose commit GitHub dates
309
+ test("a dry run previews the target pin without a timestamp", async () => {
310
+ // GIVEN an installed copy and a marketplace pin that has advanced — the
311
+ // cloud catalog carries no commit dates, so the target timestamp is null
290
312
  installCopy(pluginsDir, "level-up", {
291
313
  commit: SHA_A,
292
314
  committedAt: "2026-06-01T12:34:56.000Z",
293
315
  });
294
316
  const fetch = makeFetch({
295
317
  manifest: manifestWith("level-up", SHA_B),
296
- remoteCommitDate: "2026-06-05T08:12:24.000Z",
297
318
  });
298
319
 
299
320
  // WHEN a dry-run upgrade is performed (git must never run)
@@ -302,9 +323,9 @@ describe("upgradePlugin", () => {
302
323
  { fetch, runGit: unusedGitRunner, workspacePluginsDir: pluginsDir },
303
324
  );
304
325
 
305
- // THEN the preview shows the timestamp move resolved without a clone
326
+ // THEN the preview shows the recorded timestamp and a null target one
306
327
  expect(result.fromTimestamp).toBe("2026-06-01T12:34:56.000Z");
307
- expect(result.toTimestamp).toBe("2026-06-05T08:12:24.000Z");
328
+ expect(result.toTimestamp).toBeNull();
308
329
  });
309
330
 
310
331
  test("is a no-op when the installed commit already equals the pin", async () => {
@@ -498,6 +519,7 @@ describe("upgradePlugin", () => {
498
519
  },
499
520
  );
500
521
  expect(dry.outcome).toBe("would-upgrade");
522
+ invalidatePluginCatalogCache();
501
523
 
502
524
  // No-op: the install already sits at the pin.
503
525
  const noop = await upgradePlugin(
@@ -1245,6 +1267,7 @@ describe("upgradePlugin confirmStaged consent gate", () => {
1245
1267
  },
1246
1268
  );
1247
1269
  expect(dry.outcome).toBe("would-upgrade");
1270
+ invalidatePluginCatalogCache();
1248
1271
 
1249
1272
  const noop = await upgradePlugin(
1250
1273
  { name: "level-up" },
@@ -39,7 +39,7 @@ import { join } from "node:path";
39
39
  import { createTwoFilesPatch } from "diff";
40
40
 
41
41
  import { PRESERVED_ENTRIES } from "../../plugins/plugin-tree-walk.js";
42
- import { getWorkspacePluginsDir } from "../../util/platform.js";
42
+ import { getWorkspacePluginsDir } from "../../util/layout.js";
43
43
  import type { FetchLike } from "./fetch-like.js";
44
44
  import {
45
45
  type GitRunner,
@@ -29,25 +29,18 @@ import {
29
29
  type InstalledPluginInfo,
30
30
  readInstalledPlugin,
31
31
  } from "./list-installed-plugins.js";
32
- import {
33
- areCloudFeaturesEnabled,
34
- readBundledLocalPluginCatalog,
35
- } from "./plugin-catalog-local.js";
32
+ import { getPluginCatalog } from "./plugin-catalog-cache.js";
36
33
  import { isPluginCatalogEntryVisible } from "./plugin-catalog-visibility.js";
37
34
  import { DEFAULT_PLUGIN_REF } from "./plugin-constants.js";
38
35
  import {
39
36
  compareFingerprint,
40
37
  type FingerprintComparison,
41
38
  } from "./plugin-fingerprint.js";
42
- import {
43
- fetchMarketplaceEntries,
44
- type MarketplaceEntry,
45
- } from "./plugin-marketplace.js";
46
39
  import {
47
40
  detectPluginSurfaces,
48
41
  type PluginSurfaces,
49
42
  } from "./plugin-surfaces.js";
50
- import type { PluginCatalog, PluginSearchMatch } from "./search-plugins.js";
43
+ import type { PluginSearchMatch } from "./search-plugins.js";
51
44
  import { USER_AGENT } from "./user-agent.js";
52
45
 
53
46
  /** Full commit SHA (40 hex SHA-1 or 64 hex SHA-256). */
@@ -118,8 +111,6 @@ export interface PluginLocalInfo {
118
111
 
119
112
  /** The marketplace's current pin and advertised metadata for a plugin. */
120
113
  export interface PluginRemoteInfo {
121
- /** Present for a package embedded in the assistant distribution. */
122
- readonly kind?: "local";
123
114
  /** `owner/repo` of the external plugin repository. */
124
115
  readonly repo: string;
125
116
  /** Repo-relative directory holding the plugin root; `""` = repo root. */
@@ -138,8 +129,6 @@ export interface PluginRemoteInfo {
138
129
  readonly category: string | null;
139
130
  /** Ref of the canonical repo the marketplace manifest was read from. */
140
131
  readonly marketplaceRef: string;
141
- /** Bundled package version. Present when {@link kind} is `local`. */
142
- readonly version?: string;
143
132
  }
144
133
 
145
134
  /** Resolved inspection of a single plugin. */
@@ -186,8 +175,6 @@ export interface InspectPluginDeps {
186
175
  readonly fetch: FetchLike;
187
176
  /** Override the workspace plugins directory. Falls back to the live workspace. */
188
177
  readonly workspacePluginsDir?: string;
189
- /** Override the embedded local-package catalog for focused tests. */
190
- readonly localCatalog?: PluginCatalog;
191
178
  }
192
179
 
193
180
  function readLocal(
@@ -221,58 +208,20 @@ function readLocal(
221
208
  };
222
209
  }
223
210
 
224
- function readRemote(
225
- entry: MarketplaceEntry,
226
- marketplaceRef: string,
227
- committedAt: string | null,
228
- ): PluginRemoteInfo {
229
- if (entry.source.source === "local") {
230
- return {
231
- kind: "local",
232
- repo: "",
233
- path: entry.source.path,
234
- commit: entry.source.version,
235
- committedAt: null,
236
- description: entry.description ?? null,
237
- homepage: entry.homepage ?? null,
238
- license: entry.license ?? null,
239
- category: entry.category ?? null,
240
- marketplaceRef,
241
- version: entry.source.version,
242
- };
243
- }
244
- return {
245
- repo: entry.source.repo,
246
- path: entry.source.path ?? "",
247
- commit: entry.source.ref,
248
- committedAt,
249
- description: entry.description ?? null,
250
- homepage: entry.homepage ?? null,
251
- license: entry.license ?? null,
252
- category: entry.category ?? null,
253
- marketplaceRef,
254
- };
255
- }
256
-
257
- function readLocalPackageRemote(
211
+ function readCatalogRemote(
258
212
  match: PluginSearchMatch,
259
213
  marketplaceRef: string,
260
- ): PluginRemoteInfo | null {
261
- if (match.source.kind !== "local") {
262
- return null;
263
- }
214
+ ): PluginRemoteInfo {
264
215
  return {
265
- kind: "local",
266
- repo: "",
267
- path: match.source.path,
268
- commit: match.source.version,
216
+ repo: match.source.repo,
217
+ path: match.source.path ?? "",
218
+ commit: match.source.ref,
269
219
  committedAt: null,
270
220
  description: match.description ?? null,
271
221
  homepage: match.homepage ?? null,
272
222
  license: match.license ?? null,
273
223
  category: match.category,
274
224
  marketplaceRef,
275
- version: match.source.version,
276
225
  };
277
226
  }
278
227
 
@@ -346,38 +295,13 @@ export async function inspectPlugin(
346
295
 
347
296
  let remote: PluginRemoteInfo | null = null;
348
297
  let remoteError: string | null = null;
349
- const installedLocalSource = local?.source?.kind === "local";
350
- const useBundledLocalCatalog =
351
- installedLocalSource || (!installed && !areCloudFeaturesEnabled());
352
298
  try {
353
- if (useBundledLocalCatalog) {
354
- const catalog = deps.localCatalog ?? readBundledLocalPluginCatalog();
355
- const match = catalog.matches.find(
356
- (candidate) =>
357
- candidate.name === name &&
358
- candidate.source.kind === "local" &&
359
- (!installedLocalSource ||
360
- candidate.source.path === local.source?.path),
361
- );
362
- remote = match ? readLocalPackageRemote(match, catalog.ref) : null;
363
- }
364
- if (!remote && !installedLocalSource) {
365
- const entries = await fetchMarketplaceEntries(
366
- { fetch: deps.fetch },
367
- { ref: marketplaceRef },
368
- );
369
- const match = entries.find((entry) => entry.name === name);
370
- if (match) {
371
- const committedAt =
372
- match.source.source === "github"
373
- ? await fetchCommitDate(
374
- match.source.repo,
375
- match.source.ref,
376
- deps.fetch,
377
- )
378
- : null;
379
- remote = readRemote(match, marketplaceRef, committedAt);
380
- }
299
+ const catalog = await getPluginCatalog(marketplaceRef, {
300
+ fetch: deps.fetch,
301
+ });
302
+ const match = catalog.matches.find((candidate) => candidate.name === name);
303
+ if (match) {
304
+ remote = readCatalogRemote(match, marketplaceRef);
381
305
  }
382
306
  } catch (err) {
383
307
  remoteError = err instanceof Error ? err.message : String(err);
@@ -408,14 +332,6 @@ function classify(
408
332
  if (!remote) {
409
333
  return "not-in-marketplace";
410
334
  }
411
- if (remote.kind === "local") {
412
- if (local?.source?.kind !== "local") {
413
- return "unknown-provenance";
414
- }
415
- return local.source.version === remote.version
416
- ? "up-to-date"
417
- : "update-available";
418
- }
419
335
  if (!local?.commit) {
420
336
  return "unknown-provenance";
421
337
  }