@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,170 +0,0 @@
1
- import { getRawShareAnalytics } from "../cloud/consent-cache.js";
2
- import { getConfigReadOnly } from "../config/loader.js";
3
- import type { AssistantConfig } from "../config/schema.js";
4
- import { getLogger } from "../util/logger.js";
5
- import { recordConfigSettingEvent } from "./config-setting-events-store.js";
6
-
7
- const log = getLogger("config-setting-snapshot");
8
-
9
- /**
10
- * How often the config snapshot re-records the tracked settings. The snapshot
11
- * memoizes per key, so a steady-state tick records nothing; the cadence
12
- * exists so the first opted-in tick (consent resolves asynchronously after
13
- * boot) lands and a live config edit is captured within one window. Hourly is
14
- * ample — these values change rarely and every boot re-asserts them.
15
- */
16
- const CONFIG_SNAPSHOT_INTERVAL_MS = 60 * 60 * 1000;
17
-
18
- /**
19
- * The explicit allowlist of settings reported as `config_setting` telemetry,
20
- * as `(config_key, config_value)` pairs. Keys are dotted config paths; values
21
- * are the effective (defaults-applied) values rendered as strings. Add only
22
- * non-sensitive settings — never free-form config content, paths, or
23
- * credentials.
24
- *
25
- * Optional chaining is defensive: the effective config always carries these
26
- * fields, but a partial config (a mocked config in tests) skips the key
27
- * rather than recording a bogus value or throwing out of the emitter.
28
- */
29
- function trackedConfigSettings(
30
- config: AssistantConfig,
31
- ): ReadonlyArray<readonly [string, string]> {
32
- const pairs: ReadonlyArray<readonly [string, boolean | undefined]> = [
33
- ["memory.enabled", config.memory?.enabled],
34
- ["memory.v2.enabled", config.memory?.v2?.enabled],
35
- ["memory.v3.live", config.memory?.v3?.live],
36
- ];
37
- return pairs
38
- .filter((pair): pair is readonly [string, boolean] => pair[1] != null)
39
- .map(([key, value]) => [key, String(value)] as const);
40
- }
41
-
42
- /**
43
- * Per-process memo of the last value recorded for each tracked key, so a
44
- * repeated snapshot only persists a row when the effective value actually
45
- * changed. Process-scoped on purpose: a restart re-records the current
46
- * values, giving downstream consumers a fresh per-boot assertion of each
47
- * setting.
48
- */
49
- const lastRecorded = new Map<string, string>();
50
-
51
- /**
52
- * Record a `config_setting` event for every tracked setting whose effective
53
- * value differs from what this process last recorded.
54
- *
55
- * Consent-gated with a memo reset on opt-out. While `share_analytics` is a
56
- * confirmed opt-out, nothing is recorded and the memo is cleared: the
57
- * reporter's opt-out flush discards any config_setting rows still pending
58
- * upload, so a memo entry from before the opt-out no longer corresponds to a
59
- * delivered row. Clearing it means a later re-opt-in (in the same process,
60
- * unchanged config) re-records the full current snapshot rather than skipping
61
- * memoized keys — consumers that expect a complete snapshot after re-opt-in
62
- * stay correct. An UNKNOWN consent state skips entirely (no record, no memo,
63
- * no clear): unlike outbox events, a snapshot is re-derivable state, so
64
- * deferring it loses nothing — while recording it would either memoize a row
65
- * a later opt-out purge invalidates, or (without the memo) double-record on
66
- * every boot.
67
- *
68
- * Retry-friendly when opted in: `recordConfigSettingEvent` returns false when
69
- * the telemetry DB is momentarily unavailable, and the memo is only advanced
70
- * on a real persist, so a caller that re-invokes this each cycle records the
71
- * snapshot on its first cycle with a resolvable DB, then stays quiet until a
72
- * value changes. Never throws — a storage failure is logged and the key
73
- * retries on the next invocation.
74
- */
75
- export function recordConfigSettingSnapshot(config: AssistantConfig): void {
76
- const consent = getRawShareAnalytics();
77
- if (consent === "unknown") {
78
- return;
79
- }
80
- if (consent === false) {
81
- lastRecorded.clear();
82
- return;
83
- }
84
- for (const [configKey, configValue] of trackedConfigSettings(config)) {
85
- if (lastRecorded.get(configKey) === configValue) {
86
- continue;
87
- }
88
- try {
89
- if (recordConfigSettingEvent({ configKey, configValue })) {
90
- lastRecorded.set(configKey, configValue);
91
- }
92
- } catch (err) {
93
- log.warn(
94
- { err, configKey },
95
- "Failed to record config_setting telemetry event — will retry on the next snapshot",
96
- );
97
- }
98
- }
99
- }
100
-
101
- let snapshotTimer: ReturnType<typeof setInterval> | null = null;
102
- let bootRetryTimer: ReturnType<typeof setTimeout> | null = null;
103
-
104
- // The boot-time snapshot races the first consent refresh (fire-and-forget in
105
- // the monitor's startup), so consent is usually still "unknown" on the first
106
- // call and the snapshot is skipped. Retry on a short timer until consent
107
- // resolves rather than waiting a full hourly interval for the per-boot
108
- // assertion.
109
- const BOOT_RETRY_INTERVAL_MS = 60_000;
110
-
111
- function recordSnapshotFromConfig(): void {
112
- try {
113
- // `getConfigReadOnly()` re-reads config.json on change (capturing live
114
- // edits) and never writes to disk — safe for the monitor process.
115
- recordConfigSettingSnapshot(getConfigReadOnly());
116
- } catch (err) {
117
- log.warn({ err }, "Config-setting snapshot failed (non-fatal)");
118
- }
119
- }
120
-
121
- function recordBootSnapshotOnceConsentKnown(): void {
122
- if (getRawShareAnalytics() === "unknown") {
123
- bootRetryTimer = setTimeout(
124
- recordBootSnapshotOnceConsentKnown,
125
- BOOT_RETRY_INTERVAL_MS,
126
- );
127
- bootRetryTimer.unref?.();
128
- return;
129
- }
130
- bootRetryTimer = null;
131
- recordSnapshotFromConfig();
132
- }
133
-
134
- /**
135
- * Start the config-setting snapshot loop in the resource monitor process:
136
- * record the tracked settings once at boot, then hourly. No-op in dev mode
137
- * (CADET_DEV=1) and idempotent if already started. Mirrors
138
- * {@link import("./usage-telemetry-reporter.js").startMonitorUsageTelemetryReporter}
139
- * — the snapshot feeds the same config_setting pipeline the monitor flushes.
140
- */
141
- export function startConfigSnapshotReporter(): void {
142
- if (process.env.CADET_DEV === "1") {
143
- return;
144
- }
145
- if (snapshotTimer) {
146
- return;
147
- }
148
- recordBootSnapshotOnceConsentKnown();
149
- snapshotTimer = setInterval(
150
- recordSnapshotFromConfig,
151
- CONFIG_SNAPSHOT_INTERVAL_MS,
152
- );
153
- }
154
-
155
- /** Stop the config-setting snapshot loop. Idempotent. */
156
- export function stopConfigSnapshotReporter(): void {
157
- if (snapshotTimer) {
158
- clearInterval(snapshotTimer);
159
- snapshotTimer = null;
160
- }
161
- if (bootRetryTimer) {
162
- clearTimeout(bootRetryTimer);
163
- bootRetryTimer = null;
164
- }
165
- }
166
-
167
- /** Test-only: clear the per-process last-recorded memo. */
168
- export function resetConfigSettingSnapshotForTesting(): void {
169
- lastRecorded.clear();
170
- }
@@ -1,70 +0,0 @@
1
- import { eq } from "drizzle-orm";
2
-
3
- import { getTelemetryDb } from "../persistence/db-connection.js";
4
- import { flushCheckpoints } from "../persistence/schema/index.js";
5
-
6
- /**
7
- * Telemetry flush state — the per-event-type watermark cursors the usage
8
- * telemetry reporter advances after each successful upload. Backed by the
9
- * `flush_checkpoints` table on the dedicated telemetry database
10
- * (`assistant-telemetry.db`); the main DB's `memory_checkpoints` ledger is
11
- * reserved for DB-migration checkpoints.
12
- *
13
- * Reads and writes throw when the table is missing (migrations not yet run)
14
- * and are no-op/null when the telemetry DB cannot be opened at all. Callers
15
- * that must not mistake an unreadable store for "no watermark" (which would
16
- * re-ship history from cursor 0) should gate on
17
- * {@link isFlushCheckpointStoreAvailable} first.
18
- */
19
-
20
- /** True when the telemetry DB connection is open. */
21
- export function isFlushCheckpointStoreAvailable(): boolean {
22
- return getTelemetryDb() != null;
23
- }
24
-
25
- export function getFlushCheckpoint(key: string): string | null {
26
- const db = getTelemetryDb();
27
- if (!db) {
28
- return null;
29
- }
30
- const row = db
31
- .select({ value: flushCheckpoints.value })
32
- .from(flushCheckpoints)
33
- .where(eq(flushCheckpoints.key, key))
34
- .get();
35
- return row?.value ?? null;
36
- }
37
-
38
- export function setFlushCheckpoint(key: string, value: string): void {
39
- const db = getTelemetryDb();
40
- if (!db) {
41
- return;
42
- }
43
- const now = Date.now();
44
- db.insert(flushCheckpoints)
45
- .values({ key, value, updatedAt: now })
46
- .onConflictDoUpdate({
47
- target: flushCheckpoints.key,
48
- set: { value, updatedAt: now },
49
- })
50
- .run();
51
- }
52
-
53
- /**
54
- * Watermark storage seam for the usage telemetry reporter. The reporter
55
- * takes this as a constructor dependency (defaulting to
56
- * {@link telemetryDbFlushCheckpointStore}) so tests can substitute an
57
- * in-memory fake without process-global module mocking.
58
- */
59
- export interface FlushCheckpointStore {
60
- isAvailable(): boolean;
61
- get(key: string): string | null;
62
- set(key: string, value: string): void;
63
- }
64
-
65
- /** The production store, backed by the telemetry DB's `flush_checkpoints`. */
66
- export const telemetryDbFlushCheckpointStore: FlushCheckpointStore = {
67
- isAvailable: isFlushCheckpointStoreAvailable,
68
- get: getFlushCheckpoint,
69
- set: setFlushCheckpoint,
70
- };
@@ -1,185 +0,0 @@
1
- /**
2
- * Live-voice session telemetry vocabulary: the single source of truth for the
3
- * step names, funnel version, and end-reason values the live-voice session
4
- * emitter uses.
5
- *
6
- * Rides the existing onboarding telemetry substrate (`type: "onboarding"`),
7
- * exactly as `activation-funnel.ts` does: the backend stores `step_name` and
8
- * `funnel_version` as open strings, so this funnel needs no platform serializer
9
- * and no wire-contract change.
10
- *
11
- * **Duration is not a field.** The onboarding event shape carries no numeric
12
- * slot for it, so the two events below are keyed by the live-voice `sessionId`
13
- * in `session_id` and the warehouse subtracts their `recorded_at` stamps. That
14
- * yields exact percentiles rather than the bucketed-string dimension the tips
15
- * and tour funnels pack into `screen`.
16
- *
17
- * **Turn count is not a field either.** It comes from the `turn` telemetry
18
- * events voice turns already produce, which carry this session's id in their
19
- * `client` bag (see `voice-session-bridge.ts`), so a turn count is a count of
20
- * those rows rather than a number restated here.
21
- *
22
- * A session that starts and never ends is **censored, not infinite**: a daemon
23
- * crash or kill emits no end event, so downstream duration math must drop
24
- * unmatched `started` rows instead of treating them as open-ended sessions.
25
- */
26
-
27
- import type { ClientOs } from "../channels/types.js";
28
- import type { LiveVoiceSessionCloseReason } from "../live-voice/live-voice-session-manager.js";
29
- import type { LiveVoiceProtocolErrorCode } from "../live-voice/protocol.js";
30
-
31
- /** Funnel version stamped on every live-voice session event. */
32
- export const LIVE_VOICE_FUNNEL_VERSION = "live_voice_v1_2026_08";
33
-
34
- /**
35
- * Live-voice session funnel steps. `stepName` is the wire value; `stepIndex`
36
- * is the ordinal position.
37
- *
38
- * `sessionStarted` fires for every *attempted* session, before the credential
39
- * preflight that can reject it. A session that fails to connect is exactly the
40
- * one worth counting, and gating the start event on `ready` would hide it from
41
- * the failure rate entirely.
42
- */
43
- export const LIVE_VOICE_STEPS = {
44
- sessionStarted: { stepName: "live_voice_session_started", stepIndex: 0 },
45
- sessionEnded: { stepName: "live_voice_session_ended", stepIndex: 1 },
46
- } as const;
47
-
48
- export type LiveVoiceStepName =
49
- (typeof LIVE_VOICE_STEPS)[keyof typeof LIVE_VOICE_STEPS]["stepName"];
50
-
51
- /**
52
- * How a session ended, stamped as `outcome`.
53
- *
54
- * `failed` means the session died on an error: a credential preflight
55
- * rejection before `ready`, or an utterance-arm failure after it. Everything
56
- * else, including a dropped socket, is `completed`: the session ran and then
57
- * stopped, and the close reason on `screen` says how.
58
- */
59
- export type LiveVoiceSessionOutcome = "completed" | "failed";
60
-
61
- /**
62
- * How far a session that produced NO turn actually got.
63
- *
64
- * A quarter of live-voice sessions end without a single turn, at a median of a
65
- * few seconds. That is the closest thing the telemetry has to a "voice didn't
66
- * work for me" rate, and a bare connect/close row cannot separate a denied
67
- * microphone from a muted one from someone deliberately backing out. Those have
68
- * completely different fixes, so the reason is what makes the rate actionable.
69
- *
70
- * The values are ordered by how far the session got, and each one narrows the
71
- * cause to a different layer:
72
- *
73
- * - `no_ready` never reached `active`: died in the credential preflight or
74
- * the transport, before the user could have said anything.
75
- * - `text_only` opened without a speech-to-text leg because the client could
76
- * type, and then the user never typed. Ranked ahead of the audio
77
- * signals because they cannot mean anything here: no microphone
78
- * was ever expected, so scoring such a session `no_audio` would
79
- * read as a failure the session does not have.
80
- * - `no_audio` reached `active` but not one audio chunk ever arrived, so the
81
- * microphone never opened. Permission denial looks like this.
82
- * - `no_speech` audio arrived but the detector never classified any of it as
83
- * speech: a muted or dead mic, or a genuinely silent user.
84
- * - `no_turn` speech was detected but no turn was ever dispatched, so the
85
- * utterance was abandoned, aborted, or failed to arm.
86
- */
87
- export type LiveVoiceSilenceReason =
88
- | "no_ready"
89
- | "text_only"
90
- | "no_audio"
91
- | "no_speech"
92
- | "no_turn";
93
-
94
- /**
95
- * Classify a zero-turn session from what the session observed. Call only when
96
- * the session really produced no turn: every branch here asserts silence, so a
97
- * session that did dispatch a turn would be mislabelled by the last one.
98
- */
99
- export function liveVoiceSilenceReason(signals: {
100
- reachedActive: boolean;
101
- audioInput: boolean;
102
- receivedAudio: boolean;
103
- detectedSpeech: boolean;
104
- }): LiveVoiceSilenceReason {
105
- if (!signals.reachedActive) {
106
- return "no_ready";
107
- }
108
- if (!signals.audioInput) {
109
- return "text_only";
110
- }
111
- if (!signals.receivedAudio) {
112
- return "no_audio";
113
- }
114
- if (!signals.detectedSpeech) {
115
- return "no_speech";
116
- }
117
- return "no_turn";
118
- }
119
-
120
- /**
121
- * The half of a start stamp that stands in for a dimension the client did not
122
- * send: an older client, or one that sends no identity at all.
123
- */
124
- const LIVE_VOICE_UNATTRIBUTED = "unknown";
125
-
126
- /**
127
- * The `screen` dimension for a started session: the client it started on and
128
- * the control it started from, as `started_<client>:<entry>`.
129
- *
130
- * Both halves come off the start frame verbatim (`client` is a `ClientOs`;
131
- * `entry` is the client's own token, see `protocol.ts`). Both are always
132
- * present, with {@link LIVE_VOICE_UNATTRIBUTED} standing in for a missing one,
133
- * so a query can split the stamp on its colon without a null branch per half.
134
- *
135
- * The client rides the started row and not only the turn rows because a
136
- * quarter of sessions never produce a turn, and those are the ones the client
137
- * dimension is most needed on: "voice did nothing for me" is a per-client
138
- * question. Until now those sessions had no client at all (the admin
139
- * dashboard's `(no turns)` bucket); this stamp gives every session one.
140
- *
141
- * The entry is what separates the macOS app's three ways in from each other:
142
- * the same `client` covers the chat's voice button, the companion's Talk and
143
- * the voice key, and only the entry says which one the user reached for.
144
- */
145
- export function liveVoiceStartScreen(
146
- client?: ClientOs | null,
147
- entry?: string | null,
148
- ): string {
149
- return `started_${client ?? LIVE_VOICE_UNATTRIBUTED}:${entry ?? LIVE_VOICE_UNATTRIBUTED}`;
150
- }
151
-
152
- /**
153
- * The `screen` dimension for an ended session: how it closed, plus a detail
154
- * half. That detail is the protocol error code when a failure closed it, or the
155
- * silence classification when the session produced no turn at all.
156
- *
157
- * Every part is the daemon's own vocabulary verbatim
158
- * (`LiveVoiceSessionCloseReason`, `LiveVoiceProtocolErrorCode`,
159
- * {@link LiveVoiceSilenceReason}) rather than a mapping, so a rename on any of
160
- * them surfaces here as a compile error instead of a silently-empty dashboard
161
- * facet. The longest combination this can produce is well inside the wire
162
- * field's 64-char bound.
163
- *
164
- * A failure code wins over a silence reason when both apply: a session that
165
- * died on an error is explained by the error, and the silence is a consequence
166
- * of it rather than a separate finding.
167
- *
168
- * The silence value carries a `silent_` prefix on purpose. It shares the detail
169
- * slot with failure codes, and the admin dashboard currently renders that slot
170
- * in a column labelled "failure code", so the value has to read correctly even
171
- * where the column header is wrong, until that panel learns the difference.
172
- */
173
- export function liveVoiceEndScreen(
174
- reason: LiveVoiceSessionCloseReason,
175
- failureCode?: LiveVoiceProtocolErrorCode | null,
176
- silenceReason?: LiveVoiceSilenceReason | null,
177
- ): string {
178
- if (failureCode) {
179
- return `ended_${reason}:${failureCode}`;
180
- }
181
- if (silenceReason) {
182
- return `ended_${reason}:silent_${silenceReason}`;
183
- }
184
- return `ended_${reason}`;
185
- }
@@ -1,120 +0,0 @@
1
- import { mkdirSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { beforeEach, describe, expect, test } from "bun:test";
4
-
5
- let workspaceDir = "";
6
-
7
- import {
8
- measureMarkdownTree,
9
- measureMemoryCorpusSize,
10
- } from "./memory-corpus-size.js";
11
-
12
- // Captured at module scope: the preload cleans up its env var between suites.
13
- const PRELOAD_WS = process.env.CADET_WORKSPACE_DIR!;
14
-
15
- function write(relativePath: string, contents: string): void {
16
- const full = join(workspaceDir, relativePath);
17
- mkdirSync(join(full, ".."), { recursive: true });
18
- writeFileSync(full, contents, "utf8");
19
- }
20
-
21
- describe("measureMemoryCorpusSize", () => {
22
- beforeEach(() => {
23
- // The preload owns CADET_WORKSPACE_DIR; give this test a clean one.
24
- workspaceDir = PRELOAD_WS;
25
- rmSync(workspaceDir, { recursive: true, force: true });
26
- mkdirSync(workspaceDir, { recursive: true });
27
- });
28
-
29
- test("an empty workspace measures as all zeros", () => {
30
- expect(measureMemoryCorpusSize()).toEqual({
31
- concept_pages: 0,
32
- concept_bytes: 0,
33
- pkb_files: 0,
34
- pkb_bytes: 0,
35
- buffer_lines: 0,
36
- });
37
- });
38
-
39
- test("counts concept pages recursively and totals their bytes", () => {
40
- write("memory/concepts/alice.md", "12345"); // 5 bytes
41
- write("memory/concepts/people/bob.md", "1234567890"); // 10 bytes
42
- write("memory/concepts/people/nested/carol.md", "12345"); // 5 bytes
43
-
44
- const size = measureMemoryCorpusSize();
45
-
46
- expect(size.concept_pages).toBe(3);
47
- expect(size.concept_bytes).toBe(20);
48
- });
49
-
50
- test("counts the PKB tree independently of concept pages", () => {
51
- write("memory/concepts/alice.md", "12345");
52
- write("pkb/essentials.md", "1234567890");
53
- write("pkb/archive/2026-01-01.md", "12345");
54
-
55
- const size = measureMemoryCorpusSize();
56
-
57
- expect(size.concept_pages).toBe(1);
58
- expect(size.pkb_files).toBe(2);
59
- expect(size.pkb_bytes).toBe(15);
60
- });
61
-
62
- test("ignores non-markdown files", () => {
63
- write("memory/concepts/alice.md", "12345");
64
- write("memory/concepts/notes.txt", "ignored");
65
- write("memory/concepts/.DS_Store", "ignored");
66
-
67
- expect(measureMemoryCorpusSize().concept_pages).toBe(1);
68
- });
69
-
70
- test("buffer_lines counts non-empty lines only", () => {
71
- write("memory/buffer.md", "- one\n\n- two\n \n- three\n");
72
-
73
- expect(measureMemoryCorpusSize().buffer_lines).toBe(3);
74
- });
75
-
76
- test("an absent buffer reads as zero rather than failing", () => {
77
- write("memory/concepts/alice.md", "12345");
78
-
79
- expect(measureMemoryCorpusSize().buffer_lines).toBe(0);
80
- });
81
-
82
- test("the traversal ceiling counts every entry, not just markdown", () => {
83
- // The regression this guards: a ceiling that only counted `.md` matches
84
- // would not bound this walk at all, because nothing in the root is
85
- // Markdown.
86
- //
87
- // The page sits one level down so the assertion does not depend on
88
- // readdir order. The root holds 11 entries (10 noise files + the subdir),
89
- // so a limit of 5 is exhausted while still scanning the root and the walk
90
- // returns before it ever descends — whichever order those 11 come back in.
91
- const dir = join(workspaceDir, "noise");
92
- mkdirSync(join(dir, "sub"), { recursive: true });
93
- for (let i = 0; i < 10; i++) {
94
- writeFileSync(join(dir, `placeholder-${i}.txt`), "x", "utf8");
95
- }
96
- writeFileSync(join(dir, "sub", "page.md"), "12345", "utf8");
97
-
98
- expect(measureMarkdownTree(dir, 5)).toEqual({ files: 0, bytes: 0 });
99
- // Unbounded, the same tree yields the one page it contains.
100
- expect(measureMarkdownTree(dir)).toEqual({ files: 1, bytes: 5 });
101
- });
102
-
103
- test("does not follow symlinked directories", () => {
104
- // A link back to an ancestor would otherwise walk forever. Dirents carry
105
- // lstat semantics, so the link is skipped rather than recursed into.
106
- write("memory/concepts/alice.md", "12345");
107
- mkdirSync(join(workspaceDir, "outside"), { recursive: true });
108
- writeFileSync(join(workspaceDir, "outside", "extra.md"), "12345", "utf8");
109
- symlinkSync(
110
- join(workspaceDir, "outside"),
111
- join(workspaceDir, "memory", "concepts", "linked"),
112
- "dir",
113
- );
114
-
115
- const size = measureMemoryCorpusSize();
116
-
117
- expect(size.concept_pages).toBe(1);
118
- expect(size.concept_bytes).toBe(5);
119
- });
120
- });