@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
@@ -3,7 +3,7 @@ import { join } from "node:path";
3
3
 
4
4
  import { z } from "zod";
5
5
 
6
- import { getDataDir } from "../util/platform.js";
6
+ import { getDataDir } from "../util/layout.js";
7
7
 
8
8
  const HATCHED_SIDECAR_FILENAME = "hatched.json";
9
9
  const HatchedSidecarSchema = z.object({
@@ -67,7 +67,7 @@ export const unifyLlmCallSiteConfigsMigration: WorkspaceMigration = {
67
67
  // Idempotency: skip only when `llm.default` is present AND no legacy
68
68
  // source key remains on disk. The `&& !hasLegacyData` clause matters
69
69
  // because `AssistantConfigSchema` wires `llm: LLMSchema.default(LLMSchema
70
- // .parse({}))`, which makes `loadConfig()` inject a full schema-default
70
+ // .parse({}))`, which makes `getConfig()` inject a full schema-default
71
71
  // `llm.default` block to disk on first daemon boot under the new schema.
72
72
  // If that boot happened before this migration was added (or before the
73
73
  // daemon binary that includes it landed on the user's machine),
@@ -454,7 +454,7 @@ function readTemperature(value: unknown): number | undefined {
454
454
  * cover the `services.inference` and top-level legacy locations; their
455
455
  * presence proves migration 039 hasn't yet stripped them, which means we
456
456
  * MUST re-process even if `llm.default` already exists (it may have been
457
- * injected by `loadConfig()`'s schema-default backfill rather than by a
457
+ * injected by `getConfig()`'s schema-default backfill rather than by a
458
458
  * previous run of this migration).
459
459
  */
460
460
  function hasLegacyLlmDefaultSource(config: Record<string, unknown>): boolean {
@@ -21,7 +21,7 @@ import type { WorkspaceMigration } from "./types.js";
21
21
  * overwriting any user-defined overrides.
22
22
  * 2. **Fresh install** (config.json absent): write a minimal starter
23
23
  * config with just the callSite seeds, using the default provider
24
- * (anthropic — same as the schema default). `loadConfig()` runs
24
+ * (anthropic — same as the schema default). `getConfig()` runs
25
25
  * after migrations and applies schema defaults only to the
26
26
  * in-memory config (disk is left untouched), so our seeded
27
27
  * callSites are preserved verbatim.
@@ -11,7 +11,7 @@ import type { WorkspaceMigration } from "./types.js";
11
11
  * 1. **Existing workspace** (config.json present): merge the seed into
12
12
  * `llm.callSites` without overwriting a user-defined override.
13
13
  * 2. **Fresh install** (config.json absent): write a minimal starter
14
- * config with just this seed. `loadConfig()` runs after migrations
14
+ * config with just this seed. `getConfig()` runs after migrations
15
15
  * and applies schema defaults to the in-memory config without
16
16
  * rewriting disk, so the seeded callSite is preserved as-is.
17
17
  *
@@ -21,7 +21,7 @@ import type { WorkspaceMigration } from "./types.js";
21
21
  * 1. Existing workspace (config.json present): merge the seed into
22
22
  * `llm.callSites` without overwriting a user-defined override.
23
23
  * 2. Fresh install (config.json absent): write a minimal starter
24
- * config carrying just the seed; `loadConfig()` applies schema
24
+ * config carrying just the seed; `getConfig()` applies schema
25
25
  * defaults to the in-memory config after migrations run.
26
26
  *
27
27
  * Skipped when:
@@ -94,14 +94,12 @@ import { backfillLeafIdsMigration } from "./093-backfill-leaf-ids.js";
94
94
  import { seedAvatarManifestMigration } from "./094-seed-avatar-manifest.js";
95
95
  import { bumpHeartbeatInterval30mTo60mMigration } from "./095-bump-heartbeat-interval-30m-to-60m.js";
96
96
  import { reduceQualityProfileEffortMigration } from "./096-reduce-quality-profile-effort.js";
97
- import { enableAdaptiveThinkingCloudProfilesMigration } from "./097-enable-adaptive-thinking-managed-profiles.js";
98
97
  import { removeStaleUpdatesBulletinFileMigration } from "./098-remove-stale-updates-bulletin-file.js";
99
98
  import { disableCacheOneShotCallsitesMigration } from "./099-disable-cache-one-shot-callsites.js";
100
99
  import { upgradeQualityProfileToFable5Migration } from "./100-upgrade-quality-profile-to-fable-5.js";
101
100
  import { upgradeBalancedEconomyToMinimaxM3Migration } from "./101-upgrade-balanced-economy-to-minimax-m3.js";
102
101
  import { preserveHeartbeatEnabledForExistingWorkspacesMigration } from "./102-preserve-heartbeat-enabled-for-existing-workspaces.js";
103
102
  import { upgradeQualityProfileToOpus48Migration } from "./103-upgrade-quality-profile-to-opus-4-8.js";
104
- import { recheckAdaptiveThinkingModelImpliedAnthropicMigration } from "./104-recheck-adaptive-thinking-model-implied-anthropic.js";
105
103
  import { enableMemoryV3LiveForNewWorkspacesMigration } from "./105-enable-memory-v3-live-for-new-workspaces.js";
106
104
  import { dropCollectUsageDataMigration } from "./106-drop-collect-usage-data.js";
107
105
  import { dropSendDiagnosticsMigration } from "./107-drop-send-diagnostics.js";
@@ -264,14 +262,12 @@ export const WORKSPACE_MIGRATIONS: WorkspaceMigration[] = [
264
262
  seedAvatarManifestMigration,
265
263
  bumpHeartbeatInterval30mTo60mMigration,
266
264
  reduceQualityProfileEffortMigration,
267
- enableAdaptiveThinkingCloudProfilesMigration,
268
265
  removeStaleUpdatesBulletinFileMigration,
269
266
  disableCacheOneShotCallsitesMigration,
270
267
  upgradeQualityProfileToFable5Migration,
271
268
  upgradeBalancedEconomyToMinimaxM3Migration,
272
269
  preserveHeartbeatEnabledForExistingWorkspacesMigration,
273
270
  upgradeQualityProfileToOpus48Migration,
274
- recheckAdaptiveThinkingModelImpliedAnthropicMigration,
275
271
  enableMemoryV3LiveForNewWorkspacesMigration,
276
272
  dropCollectUsageDataMigration,
277
273
  dropSendDiagnosticsMigration,
@@ -13,8 +13,8 @@ import { existsSync, readFileSync } from "node:fs";
13
13
 
14
14
  import { syncIdentityNameToPlatform } from "../cloud/sync-identity.js";
15
15
  import { parseIdentityFields } from "../daemon/handlers/identity.js";
16
+ import { getWorkspacePromptPath } from "../util/layout.js";
16
17
  import { getLogger } from "../util/logger.js";
17
- import { getWorkspacePromptPath } from "../util/platform.js";
18
18
  import { getEnrichmentService } from "./commit-message-enrichment-service.js";
19
19
  import {
20
20
  type CommitContext,
@@ -1,324 +0,0 @@
1
- # Activation Funnel Telemetry — Runbook + Analytics Handoff
2
-
3
- > **Linear:** event emission ticket — gates rollout and dashboard tickets.
4
- > **Funnel version:** `activation_v1_2026_06`
5
- > **LD flag:** `experiment-activation-flow-2026-06-03`
6
- > **Cohort arm tag:** `ab_variant = "variant-a"` (treatment); `control` = the no-rail arm.
7
-
8
- This doc is the single executable reference for the activation-rail funnel
9
- telemetry: what it measures, how it flows, the event vocabulary, the dedup
10
- contract, the local smoke-test runbook, the BigQuery verification query, and the
11
- canonical handoff blurb for the dashboard work. It is meant to be runnable by
12
- another engineer without reading the implementation.
13
-
14
- ---
15
-
16
- ## 1. Overview — what it measures and how it flows
17
-
18
- The activation funnel measures how far a new user gets on their first run of the
19
- **activation rail** (the onboarding experience driven by
20
- `BOOTSTRAP-ACTIVATION-RAIL.md`). It emits five milestone ("funnel") events per
21
- session into the **existing onboarding telemetry substrate** — no new event type,
22
- no new ingest endpoint, no new BigQuery table.
23
-
24
- The north-star "≥5 user messages within 24h per LD variant" metric is **not** a
25
- materialized activation event. It is computed downstream by joining the existing
26
- per-user-message `turn` telemetry events (`turn_index` per conversation) to the
27
- platform's `flag_assignment_raw` cohort-assignment table — so a dedicated event
28
- and a custom daemon turn-counting hook are not needed.
29
-
30
- Flow, end to end:
31
-
32
- 1. **Daemon records** an activation event into the SQLite `telemetry_events`
33
- outbox — the row stores the record-time wire payload, including the
34
- deterministic activation `daemon_event_id` (§3) — via
35
- `recordActivationEvent()` in
36
- `assistant/src/onboarding/onboarding-events-store.ts`:
37
- - emission is **deterministic, tied to a `ui_show` surface** — there is no
38
- model-facing tool. The model tags the surface it is already rendering for a
39
- rail move with an optional `activation_moment` parameter on `ui_show` (the
40
- param is present in ui_show's schema only for activation-rail
41
- conversations — `injectActivationMomentParam` in
42
- `tools/ui-surface/channel-variants.ts`, applied at tool resolution when
43
- `isActivationSession` is true); the
44
- daemon captures that tag on the surface's server-side state and records the
45
- milestone (gated on `isActivationSession`). **Timing is per-moment**
46
- (`ACTIVATION_MOMENT_EMIT_AT` in `activation-funnel.ts`): most moments record
47
- when the user **commits** the surface (clicks an action / submits /
48
- selects) via `handleSurfaceAction()`; the one exception is
49
- `first_wow_executed`, which records at **render time** in
50
- `surfaceProxyResolver` — the Run result/`work_result` surface is often
51
- display-only and may never be committed, so a commit-time emit would never
52
- fire (and deferring it to a later click would conflate "executed" with
53
- "interacted"). Show-timing tags are recorded immediately and not stored, so
54
- the commit path never double-emits. The token→step-name map and the
55
- show/commit timing both live in
56
- `assistant/src/telemetry/activation-funnel.ts`;
57
- - emission is best-effort (wrapped in try/catch) and never blocks or alters
58
- the surface-action flow;
59
- - `recordActivationEvent` respects the cloud `share_analytics` consent gate
60
- via `getRawShareAnalytics()`: only a confirmed opt-out (`false`) drops the
61
- event; an `"unknown"` state (cold cache, no platform session) records and
62
- lets the flush/ingest gates enforce consent before anything ships.
63
- 2. **Reporter flushes** every ~5 min: `usage-telemetry-reporter.ts`
64
- (`REPORT_INTERVAL_MS = 5 * 60 * 1000`, with a one-time
65
- `INITIAL_FLUSH_DELAY_MS = 30_000` after startup) POSTs queued onboarding
66
- rows to `/v1/telemetry/ingest/` as `type: "onboarding"` events — the stored
67
- record-time payloads as-is — and deletes the rows after a successful upload.
68
- 3. **Platform ingests** the onboarding events and writes GCS NDJSON.
69
- 4. **BigQuery** exposes them via the external table
70
- `mycadet-prod.telemetry.onboarding_raw`, which already carries the
71
- `session_id / step_name / step_index / completed_at / funnel_version /
72
- ab_variant` columns. The existing dbt model dedups on `daemon_event_id`
73
- (earliest-wins).
74
-
75
- No platform / dbt / terraform change is required — the activation events ride the
76
- `type: "onboarding"` substrate that already exists end to end.
77
-
78
- ---
79
-
80
- ## 2. Event vocabulary
81
-
82
- The single source of truth is `assistant/src/telemetry/activation-funnel.ts`
83
- (`ACTIVATION_STEPS`). `funnel_version = "activation_v1_2026_06"`
84
- (`ACTIVATION_FUNNEL_VERSION`). `ab_variant = "variant-a"`
85
- (`ACTIVATION_AB_VARIANT`, the treatment arm).
86
-
87
- Each step is recorded when the user commits the `ui_show` surface the model
88
- tagged with the corresponding `activation_moment` token (see §1). The
89
- token→step-name map is the `moment_*` column below.
90
-
91
- | step_index | step_name | `activation_moment` token | Recorded on commit of |
92
- | ---------- | --------------------------------- | ------------------------- | --------------------------------------------------------------- |
93
- | 1 | `activation_moment_1_complete` | `moment_1` | Port-summary card OR no-port intake `choice` surface |
94
- | 2 | `activation_moment_2_complete` | `moment_2` | Propose offer surface (the `ui_show` offer card/choice) |
95
- | 3 | `activation_moment_3_complete` | `moment_3` | task-selection surface |
96
- | 4 | `activation_first_wow_executed` | `first_wow_executed` | Run result surface (e.g. `work_result`) |
97
- | 5 | `activation_first_wow_interacted` | `first_wow_interacted` | user clicks an action on the tagged result surface (see §1, §4) |
98
-
99
- All five steps are recorded deterministically on surface commit. The north star
100
- (≥5 user messages) is derived downstream from the existing `turn` telemetry, not
101
- a materialized activation event (see §1).
102
-
103
- On the wire, each onboarding event also sets `screen = step_name` (to satisfy
104
- the cloud's legacy-path validation), and `completed_at` is the ISO-8601
105
- record time.
106
-
107
- ---
108
-
109
- ## 3. Dedup contract
110
-
111
- Activation rows carry a **deterministic** `daemon_event_id`:
112
-
113
- ```
114
- daemon_event_id = `${funnel_version}:${session_id}:${step_name}`
115
- ```
116
-
117
- Built by `buildActivationDaemonEventId()` in
118
- `assistant/src/telemetry/activation-funnel.ts`. The store freezes the id into
119
- the outbox payload **at record time**, keyed on the **funnel version the row was
120
- recorded under**, NOT whatever constant the binary that later flushes it carries.
121
- This keeps the id stable across a version bump so rows queued offline / flushed
122
- after an upgrade still collapse with already-ingested rows from the same session.
123
-
124
- A moment that fires more than once (e.g. a model double-emit) therefore lands
125
- with the same `daemon_event_id` and is collapsed downstream by the existing dbt
126
- earliest-wins dedup on `daemon_event_id`. For boolean "moment complete"
127
- semantics, earliest-wins is correct.
128
-
129
- **Flush safety:** each outbox row keeps its own random row `id`, and the reporter
130
- acknowledges (deletes) shipped rows by that row id, NOT by `daemon_event_id`. The
131
- deterministic id lives only in the wire payload, so it never affects flush
132
- bookkeeping.
133
-
134
- ---
135
-
136
- ## 4. Cohort scoping
137
-
138
- Events only emit for conversations explicitly marked as **activation-rail
139
- sessions**:
140
-
141
- - The marker lives in the `activation_sessions` table
142
- (`assistant/src/memory/activation-session-store.ts`,
143
- `markActivationSession` / `isActivationSession`).
144
- - It is set in `assistant/src/prompts/system-prompt.ts` **only when the
145
- `BOOTSTRAP-ACTIVATION-RAIL.md` template is actually active** (i.e.
146
- `bootstrapTemplate === ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE`), which the web
147
- prechat context selects only for users whose
148
- `experiment-activation-flow-2026-06-03` cohort puts them on the rail. (It is
149
- also set up-front in `conversation.ts` `setOnboardingContext` so the marker is
150
- available before the first turn's tool resolution.)
151
- - Emission is **gated on the marker at commit time**: when a tagged `ui_show`
152
- surface is committed, the daemon records the milestone only if
153
- `isActivationSession(conversationId)` is true. A stray `activation_moment` tag
154
- in a normal chat is therefore ignored and never pollutes the funnel. (`moment_4`
155
- / `first_wow_interacted` deduping is handled the same way as any other moment —
156
- see the dedup contract in §3 — and the per-surface tag is cleared after the
157
- first record so a single surface commit emits at most once.)
158
-
159
- The activation **session id is the daemon `conversation_id`** of the rail
160
- conversation. That same value is `session_id` on every activation event.
161
-
162
- ---
163
-
164
- ## 5. Local smoke-test runbook
165
-
166
- Goal: drive one dev session through the activation cohort, emit all five events,
167
- flush, and verify rows in BigQuery. Executable by another engineer.
168
-
169
- ### 5.1 Put the dev user in the activation cohort
170
-
171
- The rail is gated by the LD flag `experiment-activation-flow-2026-06-03`. Two
172
- options:
173
-
174
- - **In-app feature-flags override (fastest):** open the in-app Feature Flags
175
- panel and force `experiment-activation-flow-2026-06-03` ON for the dev user.
176
- - **LaunchDarkly targeting:** target the dev user for the flag in the LD
177
- dashboard (per the LD-flag-two-repo convention, targeting is dashboard-side).
178
-
179
- When the flag is ON, the web prechat context selects
180
- `BOOTSTRAP-ACTIVATION-RAIL.md` as the bootstrap template, and the daemon marks
181
- the conversation in `activation_sessions` on first build of the system prompt.
182
-
183
- ### 5.2 Confirm share_analytics consent is on — and pick the right daemon mode
184
-
185
- Two distinct concerns: whether record-time rows reach SQLite (consent gate), and
186
- whether those rows reach BigQuery (flush gate, dev-disabled).
187
-
188
- 1. `recordActivationEvent` no-ops only on a confirmed `share_analytics` opt-out
189
- (it reads `getRawShareAnalytics()`); an `"unknown"` state records, but the
190
- flush defers until consent resolves. So for rows to actually SHIP, the dev
191
- session must be signed in to
192
- the cloud with `share_analytics` consent enabled, or no rows reach
193
- SQLite. The consent cache is refreshed by `startConsentRefresh()` in
194
- `assistant/src/daemon/lifecycle.ts`, which runs **regardless of dev mode** — so
195
- a dev session signed in with `share_analytics` consent enabled writes
196
- record-time rows to SQLite, where they can be inspected directly.
197
- 2. **Dev mode disables the flush entirely.** When the daemon runs in dev mode
198
- (`CADET_DEV=1`), `assistant/src/daemon/lifecycle.ts` never starts the
199
- `UsageTelemetryReporter` — rows accumulate in SQLite (consent permitting) but
200
- are never POSTed, and the "wait/restart for flush" steps below will never reach
201
- BigQuery. For an end-to-end smoke test, run the daemon **outside dev mode** (so
202
- the reporter starts), or explicitly invoke the reporter's `flush()` via a dev
203
- hook. The SQLite rows can be inspected directly in dev mode, but the BigQuery
204
- verification (§6) requires a real flush.
205
-
206
- ### 5.3 Start a fresh activation conversation and capture its id
207
-
208
- Start a brand-new conversation with the flag ON (it must be the rail bootstrap, so
209
- start it from the web prechat flow / activation entry, not an existing chat).
210
- Note its `conversation_id` — this is the `session_id` you will query on.
211
-
212
- If multiple daemons are running, kill ALL `daemon/main.ts` processes, remove
213
- `~/.cadet/cadet.sock`, and start fresh, so the conversation is served by a known
214
- daemon writing to a known SQLite DB.
215
-
216
- ### 5.4 Drive the rail through all five model moments
217
-
218
- Work the conversation through the rail moves so the model tags each surface and
219
- you commit it (the model tags surfaces via `ui_show`'s `activation_moment`
220
- parameter; which surface maps to which moment is documented in
221
- `BOOTSTRAP-ACTIVATION-RAIL.md` and §2). Each milestone records when YOU commit
222
- the tagged surface:
223
-
224
- 1. Commit the Port-summary card / no-port intake `choice` → `activation_moment_1_complete`.
225
- 2. Commit the Propose offer surface → `activation_moment_2_complete`.
226
- 3. Commit the task-selection surface → `activation_moment_3_complete`.
227
- 4. Commit the Run result surface → `activation_first_wow_executed`.
228
- 5. Click an action on the result surface → `activation_first_wow_interacted`.
229
-
230
- ### 5.5 Force / await a telemetry flush
231
-
232
- The reporter flushes on a schedule: a first flush ~30s after startup
233
- (`INITIAL_FLUSH_DELAY_MS`) and then every ~5 min (`REPORT_INTERVAL_MS`). Either:
234
-
235
- - **Wait** for the next scheduled flush (≤ ~5 min), or
236
- - **Restart the daemon** to take the ~30s post-startup flush, or
237
- - call the reporter's `flush()` path directly if you have a dev hook into the
238
- running daemon.
239
-
240
- A successful flush POSTs the unreported onboarding rows to
241
- `/v1/telemetry/ingest/` as `type: "onboarding"` events.
242
-
243
- ### 5.6 Verify in BigQuery
244
-
245
- Wait for the cloud → GCS NDJSON → BigQuery pipeline to land the events, then
246
- run the query in §6.
247
-
248
- ---
249
-
250
- ## 6. BigQuery verification query
251
-
252
- ```sql
253
- SELECT step_name, step_index, COUNT(*) AS n
254
- FROM `mycadet-prod.telemetry.onboarding_raw`
255
- WHERE funnel_version = 'activation_v1_2026_06'
256
- AND session_id = '<dev conversation id>'
257
- GROUP BY 1, 2
258
- ORDER BY 2;
259
- ```
260
-
261
- **Expected:** all five `activation_*` step names for the one session, step_index
262
- 1–5, each with `n = 1`:
263
-
264
- ```
265
- activation_moment_1_complete | 1 | 1
266
- activation_moment_2_complete | 2 | 1
267
- activation_moment_3_complete | 3 | 1
268
- activation_first_wow_executed | 4 | 1
269
- activation_first_wow_interacted | 5 | 1
270
- ```
271
-
272
- A missing row means that milestone never emitted (re-drive that rail move); an
273
- `n > 1` before dbt dedup is harmless (the deterministic `daemon_event_id`
274
- collapses it earliest-wins).
275
-
276
- ---
277
-
278
- ## 7. Canonical handoff blurb (paste-ready for the final PR description)
279
-
280
- > **Activation funnel telemetry — handoff for dashboard ticket.** The activation rail
281
- > now emits five milestone funnel events into the existing onboarding telemetry
282
- > substrate (`type: "onboarding"` → `/v1/telemetry/ingest/` → GCS NDJSON →
283
- > `mycadet-prod.telemetry.onboarding_raw`), so no new event type, ingest
284
- > endpoint, or BigQuery table is involved. Cohort is gated by the LaunchDarkly
285
- > flag **`experiment-activation-flow-2026-06-03`**; only rail (treatment)
286
- > conversations emit. Every event carries **`funnel_version =
287
- "activation_v1_2026_06"`** and **`ab_variant`** tagged `"variant-a"` for
288
- > treatment (`"control"` is the no-rail arm, measured for now from generic `turn`
289
- > events). The event vocabulary (step_name → step_index): `activation_moment_1_complete`
290
- > (1), `activation_moment_2_complete` (2), `activation_moment_3_complete` (3),
291
- > `activation_first_wow_executed` (4), `activation_first_wow_interacted` (5).
292
- > `session_id` is the rail conversation's id. The **north star** ("≥5 user
293
- > messages within 24h per LD variant") is **not** a funnel event — compute it
294
- > downstream by joining the existing `turn` telemetry events (`turn_index` per
295
- > conversation) to the cloud's `flag_assignment_raw` cohort-assignment table.
296
- > **Dedup contract:** each row's `daemon_event_id` is deterministic,
297
- > `${funnel_version}:${session_id}:${step_name}`, keyed on the row's stored
298
- > `funnel_version`; the existing dbt earliest-wins dedup on `daemon_event_id`
299
- > collapses any repeated moment to a single row. Build funnel conversion as a
300
- > step_index 1→5 progression per `session_id`, filtered to `funnel_version =
301
- 'activation_v1_2026_06'`.
302
-
303
- ---
304
-
305
- ## 8. Notes
306
-
307
- - **"naming check" (resolved).** Events fire **deterministically on
308
- the real user commit of a `ui_show` surface, not every text turn**. The model
309
- passively tags the surface for a rail move with `activation_moment`; the daemon
310
- records the milestone in `handleSurfaceAction` when the user commits that
311
- surface (firing conditions / surface→moment mapping documented in
312
- `BOOTSTRAP-ACTIVATION-RAIL.md`). This removes the standalone
313
- `emit_activation_event` tool (and its cohort preactivation) entirely and ties
314
- emission to a genuine user action, resolving the naming-check open
315
- interpretation.
316
- - **Stream B (multivariate cohort flag conversion) is NOT in this work.** It is
317
- gated on the cloud team's in-flight string-flag serving — until the cloud
318
- can serve string/multivariate flags, flipping
319
- `experiment-activation-flow-2026-06-03` boolean→multivariate client-side would
320
- silently disable the live allowlisted rail. Until then, `ab_variant` is the
321
- constant `"variant-a"` (only treatment runs the rail), and the **control side**
322
- of the comparison is measured from generic `turn` events split by the
323
- platform's experiment exposure mapping. Once Stream B lands, the daemon tags the
324
- real assigned arm and the cross-cohort comparison works with zero rework.
@@ -1,154 +0,0 @@
1
- import { lstatSync, readdirSync, readFileSync, realpathSync } from "node:fs";
2
- import { join, relative, resolve, sep } from "node:path";
3
-
4
- import {
5
- AGENT_PLUGINS_MCP_SCHEMA_URL,
6
- SpecMcpDocumentSchema,
7
- SpecMcpServerSchema,
8
- } from "../src/mcp/spec-schema.js";
9
- import {
10
- readPluginManifest,
11
- STANDARD_PLUGIN_MANIFEST,
12
- } from "../src/util/plugin-manifest.js";
13
-
14
- export interface BundledPackageFile {
15
- path: string;
16
- contentBase64: string;
17
- }
18
-
19
- export interface BundledPackage {
20
- version: string;
21
- files: BundledPackageFile[];
22
- }
23
-
24
- /** Validate and embed every local source in the canonical marketplace. */
25
- export function buildBundledPluginPackages(
26
- repoRoot: string,
27
- ): Record<string, BundledPackage> {
28
- const marketplacePath = join(repoRoot, "plugins", "marketplace.json");
29
- const manifest = JSON.parse(readFileSync(marketplacePath, "utf8")) as {
30
- plugins?: unknown;
31
- };
32
- if (!Array.isArray(manifest.plugins)) {
33
- throw new Error("plugins/marketplace.json is missing its plugins array");
34
- }
35
-
36
- const pluginsRoot = realpathSync(join(repoRoot, "plugins"));
37
- const packages: Record<string, BundledPackage> = {};
38
- for (const rawEntry of manifest.plugins) {
39
- if (typeof rawEntry !== "object" || rawEntry === null) {
40
- continue;
41
- }
42
- const entry = rawEntry as Record<string, unknown>;
43
- const rawSource = entry.source;
44
- if (typeof rawSource !== "object" || rawSource === null) {
45
- continue;
46
- }
47
- const source = rawSource as Record<string, unknown>;
48
- if (source.source !== "local") {
49
- continue;
50
- }
51
- if (
52
- typeof entry.name !== "string" ||
53
- typeof source.path !== "string" ||
54
- typeof source.version !== "string"
55
- ) {
56
- throw new Error(
57
- "local marketplace entries require name, path, and version",
58
- );
59
- }
60
-
61
- const pathSegments = source.path.split("/");
62
- if (
63
- !source.path.startsWith("plugins/") ||
64
- source.path.includes("\\") ||
65
- pathSegments.some(
66
- (segment) => segment === "" || segment === "." || segment === "..",
67
- )
68
- ) {
69
- throw new Error(
70
- `local marketplace package path is not canonical: ${source.path}`,
71
- );
72
- }
73
- let packageRoot = resolve(repoRoot);
74
- for (const segment of pathSegments) {
75
- packageRoot = join(packageRoot, segment);
76
- if (lstatSync(packageRoot).isSymbolicLink()) {
77
- throw new Error(
78
- `local marketplace package path may not contain symlinks: ${source.path}`,
79
- );
80
- }
81
- }
82
- const packageRealpath = realpathSync(packageRoot);
83
- const relativeToPlugins = relative(pluginsRoot, packageRealpath);
84
- if (
85
- relativeToPlugins === "" ||
86
- relativeToPlugins === ".." ||
87
- relativeToPlugins.startsWith(`..${sep}`)
88
- ) {
89
- throw new Error(
90
- `local marketplace package escapes plugins/: ${source.path}`,
91
- );
92
- }
93
-
94
- const pluginManifest = readPluginManifest(packageRealpath);
95
- if (
96
- pluginManifest.source !== STANDARD_PLUGIN_MANIFEST ||
97
- pluginManifest.name !== entry.name ||
98
- pluginManifest.version !== source.version
99
- ) {
100
- throw new Error(
101
- `local marketplace package ${source.path} must match entry name and version`,
102
- );
103
- }
104
- const rawMcp = JSON.parse(
105
- readFileSync(join(packageRealpath, "mcp.json"), "utf8"),
106
- ) as unknown;
107
- const mcp = SpecMcpDocumentSchema.parse(rawMcp);
108
- if (mcp.$schema !== AGENT_PLUGINS_MCP_SCHEMA_URL) {
109
- throw new Error(
110
- `local marketplace package ${source.path} must use the Agent Plugins MCP schema`,
111
- );
112
- }
113
- if (Object.keys(mcp.mcpServers).length === 0) {
114
- throw new Error(
115
- `local marketplace package ${source.path} must declare an MCP server`,
116
- );
117
- }
118
- for (const server of Object.values(mcp.mcpServers)) {
119
- SpecMcpServerSchema.parse(server);
120
- }
121
-
122
- const files: BundledPackageFile[] = [];
123
- const visit = (directory: string): void => {
124
- for (const child of readdirSync(directory, { withFileTypes: true })) {
125
- const childPath = join(directory, child.name);
126
- if (child.isSymbolicLink() || lstatSync(childPath).isSymbolicLink()) {
127
- throw new Error(
128
- `local marketplace packages may not contain symlinks: ${source.path}/${child.name}`,
129
- );
130
- }
131
- if (child.isDirectory()) {
132
- visit(childPath);
133
- continue;
134
- }
135
- if (!child.isFile()) {
136
- throw new Error(
137
- `local marketplace package contains an unsupported entry: ${childPath}`,
138
- );
139
- }
140
- files.push({
141
- path: relative(packageRealpath, childPath).split(sep).join("/"),
142
- contentBase64: readFileSync(childPath).toString("base64"),
143
- });
144
- }
145
- };
146
- visit(packageRealpath);
147
- files.sort((a, b) => a.path.localeCompare(b.path));
148
- if (packages[source.path]) {
149
- throw new Error(`duplicate local marketplace package: ${source.path}`);
150
- }
151
- packages[source.path] = { version: source.version, files };
152
- }
153
- return packages;
154
- }
@@ -1,29 +0,0 @@
1
- #!/usr/bin/env bun
2
-
3
- import { writeFileSync } from "node:fs";
4
- import { join, resolve } from "node:path";
5
-
6
- import { buildBundledPluginPackages } from "./bundled-plugin-packages.js";
7
-
8
- const repoRoot = resolve(import.meta.dir, "../..");
9
- const output = {
10
- version: 1,
11
- packages: buildBundledPluginPackages(repoRoot),
12
- };
13
-
14
- if (process.argv.includes("--check")) {
15
- console.log("✓ Local marketplace packages are valid");
16
- } else {
17
- writeFileSync(
18
- join(
19
- repoRoot,
20
- "assistant",
21
- "src",
22
- "cli",
23
- "lib",
24
- "bundled-plugin-packages.json",
25
- ),
26
- `${JSON.stringify(output, null, 2)}\n`,
27
- );
28
- console.log("✓ Generated bundled local plugin packages");
29
- }