@mycadet/assistant 0.12.9 → 0.12.11

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