@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,375 +0,0 @@
1
- import { beforeEach, describe, expect, test } from "bun:test";
2
-
3
- import { getTelemetryDb } from "../persistence/db-connection.js";
4
- import { telemetryEvents } from "../persistence/schema/index.js";
5
- import { APP_VERSION } from "../version.js";
6
- import {
7
- resetOutboxTable,
8
- setShareAnalytics,
9
- withTelemetryDbUnavailable,
10
- } from "./__tests__/outbox-test-harness.js";
11
- import {
12
- deleteTelemetryOutboxEvents,
13
- deleteTelemetryOutboxEventsBefore,
14
- discardPendingTelemetryOutboxEvents,
15
- insertTelemetryOutboxEvent,
16
- insertTelemetryOutboxEvents,
17
- queryTelemetryOutboxBatch,
18
- recordTelemetryEvent,
19
- } from "./telemetry-events-outbox.js";
20
- import type { LifecycleTelemetryEvent } from "./types.js";
21
-
22
- function lifecycleEvent(
23
- id: string,
24
- createdAt: number,
25
- ): LifecycleTelemetryEvent {
26
- return {
27
- type: "lifecycle",
28
- daemon_event_id: id,
29
- event_name: "app_open",
30
- recorded_at: createdAt,
31
- assistant_version: "1.2.3",
32
- };
33
- }
34
-
35
- function insert(
36
- id: string,
37
- createdAt: number,
38
- name = "lifecycle",
39
- conversationId?: string | null,
40
- ): boolean {
41
- return insertTelemetryOutboxEvent({
42
- id,
43
- name,
44
- createdAt,
45
- conversationId,
46
- event: lifecycleEvent(id, createdAt),
47
- });
48
- }
49
-
50
- function allIds(): string[] {
51
- return queryTelemetryOutboxBatch("lifecycle", 10_000).map((r) => r.id);
52
- }
53
-
54
- describe("telemetry-events-outbox", () => {
55
- beforeEach(() => {
56
- setShareAnalytics(true);
57
- resetOutboxTable();
58
- });
59
-
60
- test("insert + query round-trips the wire payload", () => {
61
- expect(insert("evt-1", 1000)).toBe(true);
62
-
63
- const rows = queryTelemetryOutboxBatch("lifecycle", 10);
64
- expect(rows).toHaveLength(1);
65
- expect(rows[0]).toMatchObject({ id: "evt-1", createdAt: 1000 });
66
- expect(JSON.parse(rows[0]!.payload)).toEqual(lifecycleEvent("evt-1", 1000));
67
- });
68
-
69
- test("batch insert lands every row", () => {
70
- const inserted = insertTelemetryOutboxEvents([
71
- {
72
- id: "evt-1",
73
- name: "lifecycle",
74
- createdAt: 1000,
75
- event: lifecycleEvent("evt-1", 1000),
76
- },
77
- {
78
- id: "evt-2",
79
- name: "lifecycle",
80
- createdAt: 2000,
81
- event: lifecycleEvent("evt-2", 2000),
82
- },
83
- {
84
- id: "evt-3",
85
- name: "lifecycle",
86
- createdAt: 3000,
87
- event: lifecycleEvent("evt-3", 3000),
88
- },
89
- ]);
90
- expect(inserted).toBe(true);
91
- expect(allIds()).toEqual(["evt-1", "evt-2", "evt-3"]);
92
- });
93
-
94
- test("batch insert is all-or-nothing on a mid-batch failure", () => {
95
- insert("evt-dup", 500);
96
-
97
- expect(() =>
98
- insertTelemetryOutboxEvents([
99
- {
100
- id: "evt-new-1",
101
- name: "lifecycle",
102
- createdAt: 1000,
103
- event: lifecycleEvent("evt-new-1", 1000),
104
- },
105
- {
106
- id: "evt-dup",
107
- name: "lifecycle",
108
- createdAt: 2000,
109
- event: lifecycleEvent("evt-dup", 2000),
110
- },
111
- {
112
- id: "evt-new-2",
113
- name: "lifecycle",
114
- createdAt: 3000,
115
- event: lifecycleEvent("evt-new-2", 3000),
116
- },
117
- ]),
118
- ).toThrow();
119
-
120
- // The primary-key conflict aborts the whole statement — no partial batch.
121
- expect(allIds()).toEqual(["evt-dup"]);
122
- });
123
-
124
- test("batch insert returns false when the telemetry DB is unavailable", () => {
125
- withTelemetryDbUnavailable(() => {
126
- expect(
127
- insertTelemetryOutboxEvents([
128
- {
129
- id: "evt-1",
130
- name: "lifecycle",
131
- createdAt: 1000,
132
- event: lifecycleEvent("evt-1", 1000),
133
- },
134
- ]),
135
- ).toBe(false);
136
- });
137
- expect(allIds()).toEqual([]);
138
- });
139
-
140
- test("empty batch is a successful no-op", () => {
141
- expect(insertTelemetryOutboxEvents([])).toBe(true);
142
- expect(allIds()).toEqual([]);
143
- });
144
-
145
- test("conversation_id persists in its dedicated column", () => {
146
- insert("evt-conv", 1000, "lifecycle", "conv-1");
147
- insert("evt-null", 2000, "lifecycle");
148
-
149
- const rows = getTelemetryDb()!
150
- .select({
151
- id: telemetryEvents.id,
152
- conversationId: telemetryEvents.conversationId,
153
- })
154
- .from(telemetryEvents)
155
- .all()
156
- .sort((a, b) => a.id.localeCompare(b.id));
157
- expect(rows).toEqual([
158
- { id: "evt-conv", conversationId: "conv-1" },
159
- { id: "evt-null", conversationId: null },
160
- ]);
161
- });
162
-
163
- test("orders by (created_at, id) with id as tiebreaker", () => {
164
- insert("evt-b", 2000);
165
- insert("evt-c", 1000);
166
- insert("evt-a", 1000);
167
-
168
- expect(allIds()).toEqual(["evt-a", "evt-c", "evt-b"]);
169
- });
170
-
171
- test("honors the limit", () => {
172
- insert("evt-1", 1000);
173
- insert("evt-2", 2000);
174
- insert("evt-3", 3000);
175
-
176
- const rows = queryTelemetryOutboxBatch("lifecycle", 2);
177
- expect(rows.map((r) => r.id)).toEqual(["evt-1", "evt-2"]);
178
- });
179
-
180
- test("queries are isolated per event name", () => {
181
- insert("evt-life", 1000, "lifecycle");
182
- insert("evt-watch", 1000, "watchdog");
183
-
184
- expect(allIds()).toEqual(["evt-life"]);
185
- expect(queryTelemetryOutboxBatch("watchdog", 10).map((r) => r.id)).toEqual([
186
- "evt-watch",
187
- ]);
188
- expect(queryTelemetryOutboxBatch("onboarding", 10)).toEqual([]);
189
- });
190
-
191
- test("deletes rows by id", () => {
192
- insert("evt-1", 1000);
193
- insert("evt-2", 2000);
194
- insert("evt-3", 3000);
195
-
196
- deleteTelemetryOutboxEvents(["evt-1", "evt-3"]);
197
-
198
- expect(allIds()).toEqual(["evt-2"]);
199
- });
200
-
201
- test("delete with an empty id list is a no-op", () => {
202
- insert("evt-1", 1000);
203
-
204
- deleteTelemetryOutboxEvents([]);
205
-
206
- expect(allIds()).toEqual(["evt-1"]);
207
- });
208
-
209
- test("deletes more than one chunk of ids", () => {
210
- const ids: string[] = [];
211
- for (let i = 0; i < 501; i++) {
212
- const id = `evt-${String(i).padStart(4, "0")}`;
213
- ids.push(id);
214
- insert(id, i);
215
- }
216
- insert("evt-keep", 9999);
217
-
218
- deleteTelemetryOutboxEvents(ids);
219
-
220
- expect(allIds()).toEqual(["evt-keep"]);
221
- });
222
-
223
- test("recordTelemetryEvent stamps the base fields", () => {
224
- const fields = {
225
- check_name: "db_size",
226
- value: 42,
227
- detail: { table: "messages" },
228
- };
229
- const recorded = recordTelemetryEvent("watchdog", fields);
230
- expect(recorded).not.toBeNull();
231
-
232
- const rows = queryTelemetryOutboxBatch("watchdog", 10);
233
- expect(rows).toHaveLength(1);
234
- expect(rows[0]!.id).toBe(recorded!.id);
235
- expect(JSON.parse(rows[0]!.payload)).toEqual({
236
- type: "watchdog",
237
- daemon_event_id: recorded!.id,
238
- recorded_at: recorded!.createdAt,
239
- assistant_version: APP_VERSION,
240
- ...fields,
241
- });
242
- });
243
-
244
- test("recordTelemetryEvent stamps win over base keys smuggled in via a widened fields value", () => {
245
- // A variable (not a literal) skips excess-property checking, so base
246
- // keys can reach the helper structurally. The stamps must still win.
247
- const widened = {
248
- check_name: "db_size",
249
- value: null,
250
- detail: null,
251
- daemon_event_id: "spoofed-id",
252
- recorded_at: 1,
253
- assistant_version: "0.0.0-spoof",
254
- };
255
- const recorded = recordTelemetryEvent("watchdog", widened);
256
- expect(recorded).not.toBeNull();
257
-
258
- const payload = JSON.parse(
259
- queryTelemetryOutboxBatch("watchdog", 10)[0]!.payload,
260
- ) as Record<string, unknown>;
261
- expect(payload.daemon_event_id).toBe(recorded!.id);
262
- expect(payload.recorded_at).toBe(recorded!.createdAt);
263
- expect(payload.assistant_version).toBe(APP_VERSION);
264
- });
265
-
266
- test("recordTelemetryEvent persists conversation_id in its column", () => {
267
- const withConv = recordTelemetryEvent(
268
- "watchdog",
269
- { check_name: "c1", value: null, detail: null },
270
- { conversationId: "conv-1" },
271
- );
272
- const withoutConv = recordTelemetryEvent("watchdog", {
273
- check_name: "c2",
274
- value: null,
275
- detail: null,
276
- });
277
-
278
- const rows = getTelemetryDb()!
279
- .select({
280
- id: telemetryEvents.id,
281
- conversationId: telemetryEvents.conversationId,
282
- })
283
- .from(telemetryEvents)
284
- .all();
285
- expect(rows).toHaveLength(2);
286
- expect(rows.find((r) => r.id === withConv!.id)!.conversationId).toBe(
287
- "conv-1",
288
- );
289
- expect(rows.find((r) => r.id === withoutConv!.id)!.conversationId).toBe(
290
- null,
291
- );
292
- });
293
-
294
- test("recordTelemetryEvent honors a confirmed share_analytics opt-out", () => {
295
- setShareAnalytics(false);
296
- expect(
297
- recordTelemetryEvent("watchdog", {
298
- check_name: "c",
299
- value: null,
300
- detail: null,
301
- }),
302
- ).toBeNull();
303
- expect(queryTelemetryOutboxBatch("watchdog", 10)).toEqual([]);
304
- });
305
-
306
- test("recordTelemetryEvent records while consent is unknown (cold cache)", () => {
307
- setShareAnalytics("unknown");
308
- const recorded = recordTelemetryEvent("watchdog", {
309
- check_name: "c",
310
- value: null,
311
- detail: null,
312
- });
313
- expect(recorded).not.toBeNull();
314
- expect(queryTelemetryOutboxBatch("watchdog", 10).map((r) => r.id)).toEqual([
315
- recorded!.id,
316
- ]);
317
- });
318
-
319
- test("recordTelemetryEvent returns null when the telemetry DB is unavailable", () => {
320
- withTelemetryDbUnavailable(() => {
321
- expect(
322
- recordTelemetryEvent("watchdog", {
323
- check_name: "c",
324
- value: null,
325
- detail: null,
326
- }),
327
- ).toBeNull();
328
- });
329
- expect(queryTelemetryOutboxBatch("watchdog", 10)).toEqual([]);
330
- });
331
-
332
- test("prune deletes rows strictly older than the cutoff across every name and returns the count", () => {
333
- insert("evt-old-life", 1000, "lifecycle");
334
- insert("evt-old-watch", 1500, "watchdog");
335
- insert("evt-at-cutoff", 2000, "lifecycle");
336
- insert("evt-fresh", 3000, "lifecycle");
337
-
338
- expect(deleteTelemetryOutboxEventsBefore(2000)).toBe(2);
339
-
340
- // Strictly-before semantics: the row AT the cutoff is retained.
341
- expect(allIds()).toEqual(["evt-at-cutoff", "evt-fresh"]);
342
- expect(queryTelemetryOutboxBatch("watchdog", 10)).toEqual([]);
343
- });
344
-
345
- test("prune with nothing expired deletes nothing and returns 0", () => {
346
- insert("evt-1", 5000);
347
-
348
- expect(deleteTelemetryOutboxEventsBefore(5000)).toBe(0);
349
-
350
- expect(allIds()).toEqual(["evt-1"]);
351
- });
352
-
353
- test("prune returns 0 when the telemetry DB is unavailable", () => {
354
- insert("evt-1", 1000);
355
-
356
- withTelemetryDbUnavailable(() => {
357
- expect(deleteTelemetryOutboxEventsBefore(2000)).toBe(0);
358
- });
359
-
360
- expect(allIds()).toEqual(["evt-1"]);
361
- });
362
-
363
- test("discards all pending rows for one name only", () => {
364
- insert("evt-1", 1000, "lifecycle");
365
- insert("evt-2", 2000, "lifecycle");
366
- insert("evt-other", 1000, "watchdog");
367
-
368
- discardPendingTelemetryOutboxEvents("lifecycle");
369
-
370
- expect(allIds()).toEqual([]);
371
- expect(queryTelemetryOutboxBatch("watchdog", 10).map((r) => r.id)).toEqual([
372
- "evt-other",
373
- ]);
374
- });
375
- });
@@ -1,237 +0,0 @@
1
- /**
2
- * Generic `telemetry_events` outbox on the dedicated telemetry database
3
- * (`assistant-telemetry.db`). Rows carry the full wire `TelemetryEvent` built
4
- * at record time and are deleted after a successful flush.
5
- * `recordTelemetryOutboxEvent` is the consent-owning record layer; the
6
- * storage seam functions carry no consent logic — their call sites own
7
- * gating.
8
- */
9
- import { asc, eq, inArray } from "drizzle-orm";
10
- import { v4 as uuid } from "uuid";
11
-
12
- import { getRawShareAnalytics } from "../cloud/consent-cache.js";
13
- import { getSqliteFrom, getTelemetryDb } from "../persistence/db-connection.js";
14
- import { telemetryEvents } from "../persistence/schema/index.js";
15
- import { APP_VERSION } from "../version.js";
16
- import type {
17
- OutboxTelemetryEventName,
18
- OutboxTelemetryEventOf,
19
- TelemetryEvent,
20
- TelemetryEventBase,
21
- } from "./types.js";
22
-
23
- /** Ids per DELETE chunk — stays under SQLite's bound-variable limit. */
24
- const DELETE_CHUNK_SIZE = 500;
25
-
26
- /**
27
- * Max age of a pending outbox row. The reporter prunes older rows at the
28
- * start of every flush cycle, in every consent state — this is what bounds
29
- * the unknown-consent buffering (a permanently-unknown state never resolves,
30
- * and a row this stale is worthless telemetry anyway).
31
- */
32
- export const OUTBOX_MAX_ROW_AGE_MS = 30 * 24 * 60 * 60 * 1000;
33
-
34
- /** One pending outbox row; `payload` is the wire `TelemetryEvent` JSON. */
35
- export interface TelemetryOutboxRow {
36
- id: string;
37
- createdAt: number;
38
- payload: string;
39
- }
40
-
41
- /** One pending telemetry event to insert; `event` is the wire payload. */
42
- export interface TelemetryOutboxInsert {
43
- id: string;
44
- name: string;
45
- createdAt: number;
46
- conversationId?: string | null;
47
- event: TelemetryEvent;
48
- }
49
-
50
- /**
51
- * Insert a batch of pending telemetry events as one multi-row INSERT —
52
- * all-or-nothing, so a mid-batch failure never leaves a partial batch
53
- * committed. Returns false when the telemetry DB is unavailable (degraded
54
- * mode), true once every row is inserted (or the batch is empty).
55
- */
56
- export function insertTelemetryOutboxEvents(
57
- rows: TelemetryOutboxInsert[],
58
- ): boolean {
59
- const db = getTelemetryDb();
60
- if (!db) {
61
- return false;
62
- }
63
- if (rows.length === 0) {
64
- return true;
65
- }
66
- db.insert(telemetryEvents)
67
- .values(
68
- rows.map((row) => ({
69
- id: row.id,
70
- name: row.name,
71
- createdAt: row.createdAt,
72
- conversationId: row.conversationId ?? null,
73
- payload: JSON.stringify(row.event),
74
- })),
75
- )
76
- .run();
77
- return true;
78
- }
79
-
80
- /**
81
- * Insert one pending telemetry event. Returns false when the telemetry DB is
82
- * unavailable (degraded mode), true once the row is inserted.
83
- */
84
- export function insertTelemetryOutboxEvent(
85
- row: TelemetryOutboxInsert,
86
- ): boolean {
87
- return insertTelemetryOutboxEvents([row]);
88
- }
89
-
90
- /**
91
- * Lower-level record escape hatch: for payloads that need the record-time
92
- * `(id, createdAt)` inside type-specific fields (onboarding's activation
93
- * `daemon_event_id` override and `completed_at`). Drops only on a confirmed
94
- * `share_analytics` opt-out — the record-time drop is a privacy courtesy for
95
- * known opt-outs. While consent is unknown (cold cache, no platform session)
96
- * the event is recorded: dropping on an unresolved state would permanently
97
- * destroy data, and consent is enforced again at flush time. Unknown-state
98
- * buffering is bounded — the reporter prunes rows older than
99
- * {@link OUTBOX_MAX_ROW_AGE_MS} each flush cycle. Generates the
100
- * outbox row identity, builds the wire payload via `buildEvent` (which owns
101
- * all stamping), and inserts. Returns the generated row identity, or null
102
- * when dropped for the opt-out or when the telemetry DB is unavailable
103
- * (degraded mode). Prefer `recordTelemetryEvent` when the payload doesn't
104
- * need them.
105
- */
106
- export function recordTelemetryOutboxEvent(
107
- name: string,
108
- buildEvent: (id: string, createdAt: number) => TelemetryEvent,
109
- opts?: { conversationId?: string | null },
110
- ): { id: string; createdAt: number } | null {
111
- if (getRawShareAnalytics() === false) {
112
- return null;
113
- }
114
- const id = uuid();
115
- const createdAt = Date.now();
116
- const inserted = insertTelemetryOutboxEvent({
117
- id,
118
- name,
119
- createdAt,
120
- conversationId: opts?.conversationId ?? null,
121
- event: buildEvent(id, createdAt),
122
- });
123
- return inserted ? { id, createdAt } : null;
124
- }
125
-
126
- /**
127
- * Preferred record API for outbox events whose payload does not depend on
128
- * the record-time `(id, createdAt)`: stamps the `TelemetryEventBase` fields
129
- * (record-time `assistant_version` included) and inherits
130
- * `recordTelemetryOutboxEvent`'s consent gate and degraded-mode `null`.
131
- */
132
- export function recordTelemetryEvent<N extends OutboxTelemetryEventName>(
133
- name: N,
134
- fields: Omit<OutboxTelemetryEventOf<N>, keyof TelemetryEventBase>,
135
- opts?: { conversationId?: string | null },
136
- ): { id: string; createdAt: number } | null {
137
- return recordTelemetryOutboxEvent(
138
- name,
139
- (id, createdAt) =>
140
- // Cast: TS cannot re-associate the `Omit<...>` spread with the stamped
141
- // base fields across a generic; `fields`' type guarantees the shape.
142
- // Base fields are stamped after the spread so a widened `fields` value
143
- // carrying base keys can never override them.
144
- ({
145
- ...fields,
146
- type: name,
147
- daemon_event_id: id,
148
- recorded_at: createdAt,
149
- assistant_version: APP_VERSION,
150
- }) as OutboxTelemetryEventOf<N>,
151
- opts,
152
- );
153
- }
154
-
155
- /**
156
- * Read the oldest pending rows for one event name in `(created_at, id)`
157
- * order. Empty when the telemetry DB is unavailable.
158
- */
159
- export function queryTelemetryOutboxBatch(
160
- name: string,
161
- limit: number,
162
- ): TelemetryOutboxRow[] {
163
- const db = getTelemetryDb();
164
- if (!db) {
165
- return [];
166
- }
167
- return db
168
- .select({
169
- id: telemetryEvents.id,
170
- createdAt: telemetryEvents.createdAt,
171
- payload: telemetryEvents.payload,
172
- })
173
- .from(telemetryEvents)
174
- .where(eq(telemetryEvents.name, name))
175
- .orderBy(asc(telemetryEvents.createdAt), asc(telemetryEvents.id))
176
- .limit(limit)
177
- .all();
178
- }
179
-
180
- /** Delete flushed rows by id, in chunks. No-op when db null or ids empty. */
181
- export function deleteTelemetryOutboxEvents(ids: string[]): void {
182
- const db = getTelemetryDb();
183
- if (!db || ids.length === 0) {
184
- return;
185
- }
186
- for (let i = 0; i < ids.length; i += DELETE_CHUNK_SIZE) {
187
- db.delete(telemetryEvents)
188
- .where(inArray(telemetryEvents.id, ids.slice(i, i + DELETE_CHUNK_SIZE)))
189
- .run();
190
- }
191
- }
192
-
193
- /**
194
- * Delete rows recorded before `cutoffCreatedAt`, across every event name
195
- * (age-bound prune). Returns the deleted row count; 0 when the telemetry DB
196
- * is unavailable.
197
- */
198
- export function deleteTelemetryOutboxEventsBefore(
199
- cutoffCreatedAt: number,
200
- ): number {
201
- const db = getTelemetryDb();
202
- if (!db) {
203
- return 0;
204
- }
205
- // Raw statement: drizzle's bun-sqlite `.run()` is typed void, and the
206
- // prune's only output is the changed-row count.
207
- return getSqliteFrom(db)
208
- .prepare("DELETE FROM telemetry_events WHERE created_at < ?")
209
- .run(cutoffCreatedAt).changes;
210
- }
211
-
212
- /** Drop all pending rows for one event name (telemetry opt-out). */
213
- export function discardPendingTelemetryOutboxEvents(name: string): void {
214
- const db = getTelemetryDb();
215
- if (!db) {
216
- return;
217
- }
218
- db.delete(telemetryEvents).where(eq(telemetryEvents.name, name)).run();
219
- }
220
-
221
- /**
222
- * Distinct event names with at least one pending row in the outbox. Used by the
223
- * orphan-drain source to find rows whose type is no longer in the wire contract
224
- * (e.g. recorded before the cloud removed/renamed a type) so they can be
225
- * flushed instead of stranded. Empty when the telemetry DB is unavailable.
226
- */
227
- export function queryDistinctOutboxEventNames(): string[] {
228
- const db = getTelemetryDb();
229
- if (!db) {
230
- return [];
231
- }
232
- return db
233
- .selectDistinct({ name: telemetryEvents.name })
234
- .from(telemetryEvents)
235
- .all()
236
- .map((row) => row.name);
237
- }
@@ -1,48 +0,0 @@
1
- import {
2
- type DrizzleDb,
3
- getDb,
4
- getMainDbReadOnly,
5
- } from "../persistence/db-connection.js";
6
-
7
- /**
8
- * Main-DB resolution for the telemetry stores' unreported-event queries.
9
- *
10
- * The queries run in two processes with different postures: the daemon owns
11
- * the main DB's read-write connection, while the resource monitor process
12
- * observes the daemon's main DB through a dedicated read-only connection
13
- * (WAL permits cross-process readers; the daemon stays the sole writer, and
14
- * an accidental monitor-side write fails loudly). The monitor opts into the
15
- * read-only posture once at startup; everything else resolves to the normal
16
- * read-write connection.
17
- */
18
-
19
- let readOnlyPosture = false;
20
-
21
- /**
22
- * Switch this process's telemetry main-DB reads to the dedicated read-only
23
- * connection. Called once at resource monitor startup, before the first
24
- * flush; never unset — the posture is process-scoped by design.
25
- */
26
- export function useReadOnlyMainDbForTelemetry(): void {
27
- readOnlyPosture = true;
28
- }
29
-
30
- /**
31
- * The main-DB connection for telemetry queries: `getDb()`'s read-write
32
- * connection in the daemon, the dedicated read-only connection in the
33
- * resource monitor. Throws when the read-only connection cannot be opened
34
- * (e.g. a fresh install where the daemon has not created the file yet) —
35
- * the reporter's flush treats that as non-fatal and retries next cycle.
36
- */
37
- export function getTelemetryMainDb(): DrizzleDb {
38
- if (!readOnlyPosture) {
39
- return getDb();
40
- }
41
- const db = getMainDbReadOnly();
42
- if (!db) {
43
- throw new Error(
44
- "read-only main DB connection unavailable — retried next flush cycle",
45
- );
46
- }
47
- return db;
48
- }
@@ -1,4 +0,0 @@
1
- {
2
- "sourceRepo": "vargasjr-dev/mycadet-platform",
3
- "sourceSha": "55599f8f2bc422177cc423020043577d7ee36264"
4
- }