@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,158 +0,0 @@
1
- import { beforeEach, describe, expect, test } from "bun:test";
2
-
3
- import { getTelemetrySqlite } from "../../persistence/db-connection.js";
4
- import {
5
- pendingOutboxPayloads,
6
- resetOutboxTable,
7
- setShareAnalytics,
8
- withTelemetryDbUnavailable,
9
- } from "../../telemetry/__tests__/outbox-test-harness.js";
10
- import { ACTIVATION_FUNNEL_VERSION } from "../../telemetry/activation-funnel.js";
11
- import type { OnboardingTelemetryEvent } from "../../telemetry/types.js";
12
- import { APP_VERSION } from "../../version.js";
13
- import {
14
- recordActivationEvent,
15
- recordOnboardingEvent,
16
- } from "../onboarding-events-store.js";
17
-
18
- /** Pending onboarding outbox payloads, parsed, in `(created_at, id)` order. */
19
- function pendingOnboardingPayloads(): OnboardingTelemetryEvent[] {
20
- return pendingOutboxPayloads<OnboardingTelemetryEvent>("onboarding", 10);
21
- }
22
-
23
- describe("onboarding-events-store: recordActivationEvent", () => {
24
- beforeEach(() => {
25
- setShareAnalytics(true);
26
- resetOutboxTable();
27
- });
28
-
29
- test("stores the full wire payload with the deterministic activation daemon_event_id", () => {
30
- const event = recordActivationEvent({
31
- stepName: "activation_moment_1_complete",
32
- sessionId: "conv-1",
33
- });
34
- expect(event).not.toBeNull();
35
-
36
- const payloads = pendingOnboardingPayloads();
37
- expect(payloads).toHaveLength(1);
38
- expect(payloads[0]).toEqual({
39
- type: "onboarding",
40
- daemon_event_id: `${ACTIVATION_FUNNEL_VERSION}:conv-1:activation_moment_1_complete`,
41
- recorded_at: event!.createdAt,
42
- screen: "activation_moment_1_complete",
43
- ab_variant: "variant-a",
44
- session_id: "conv-1",
45
- step_name: "activation_moment_1_complete",
46
- step_index: 1,
47
- completed_at: new Date(event!.createdAt).toISOString(),
48
- funnel_version: ACTIVATION_FUNNEL_VERSION,
49
- assistant_version: APP_VERSION,
50
- });
51
- });
52
-
53
- test("outbox row id stays a UUID distinct from the payload daemon_event_id", () => {
54
- const event = recordActivationEvent({
55
- stepName: "activation_moment_1_complete",
56
- sessionId: "conv-telemetry",
57
- });
58
- expect(event).not.toBeNull();
59
-
60
- const raw = getTelemetrySqlite()!
61
- .query(`SELECT id, name FROM telemetry_events`)
62
- .all() as Array<{ id: string; name: string }>;
63
- expect(raw).toEqual([{ id: event!.id, name: "onboarding" }]);
64
- const payload = pendingOnboardingPayloads()[0]!;
65
- expect(payload.daemon_event_id).not.toBe(event!.id);
66
- });
67
-
68
- test("honors an explicit abVariant override", () => {
69
- recordActivationEvent({
70
- stepName: "activation_moment_2_complete",
71
- sessionId: "conv-2",
72
- abVariant: "variant-b",
73
- });
74
-
75
- const payloads = pendingOnboardingPayloads();
76
- expect(payloads).toHaveLength(1);
77
- expect(payloads[0]!.ab_variant).toBe("variant-b");
78
- expect(payloads[0]!.step_index).toBe(2);
79
- });
80
-
81
- test("returns null and writes no row when share_analytics is disabled", () => {
82
- setShareAnalytics(false);
83
- const event = recordActivationEvent({
84
- stepName: "activation_moment_1_complete",
85
- sessionId: "conv-3",
86
- });
87
- expect(event).toBeNull();
88
-
89
- expect(pendingOnboardingPayloads()).toHaveLength(0);
90
- });
91
-
92
- test("returns null when the telemetry database is unavailable", () => {
93
- withTelemetryDbUnavailable(() => {
94
- const event = recordActivationEvent({
95
- stepName: "activation_moment_1_complete",
96
- sessionId: "conv-4",
97
- });
98
- expect(event).toBeNull();
99
- });
100
-
101
- expect(pendingOnboardingPayloads()).toHaveLength(0);
102
- });
103
- });
104
-
105
- describe("onboarding-events-store: recordOnboardingEvent", () => {
106
- beforeEach(() => {
107
- setShareAnalytics(true);
108
- resetOutboxTable();
109
- });
110
-
111
- test("stores a pre-chat wire payload with daemon_event_id = row id and no funnel fields", () => {
112
- const event = recordOnboardingEvent({
113
- screen: "tools",
114
- tools: ["gmail", "calendar"],
115
- tone: "warm",
116
- googleConnected: true,
117
- });
118
- expect(event).not.toBeNull();
119
-
120
- const payloads = pendingOnboardingPayloads();
121
- expect(payloads).toHaveLength(1);
122
- expect(payloads[0]).toEqual({
123
- type: "onboarding",
124
- daemon_event_id: event!.id,
125
- recorded_at: event!.createdAt,
126
- screen: "tools",
127
- tools: ["gmail", "calendar"],
128
- tone: "warm",
129
- google_connected: true,
130
- assistant_version: APP_VERSION,
131
- });
132
-
133
- const raw = getTelemetrySqlite()!
134
- .query(`SELECT id, name, conversation_id FROM telemetry_events`)
135
- .all() as Array<{
136
- id: string;
137
- name: string;
138
- conversation_id: string | null;
139
- }>;
140
- expect(raw).toEqual([
141
- { id: event!.id, name: "onboarding", conversation_id: null },
142
- ]);
143
- });
144
-
145
- test("returns null and writes no row when share_analytics is disabled", () => {
146
- setShareAnalytics(false);
147
- expect(recordOnboardingEvent({ screen: "tools" })).toBeNull();
148
- expect(pendingOnboardingPayloads()).toHaveLength(0);
149
- });
150
-
151
- test("returns null when the telemetry database is unavailable", () => {
152
- withTelemetryDbUnavailable(() => {
153
- expect(recordOnboardingEvent({ screen: "tools" })).toBeNull();
154
- });
155
-
156
- expect(pendingOnboardingPayloads()).toHaveLength(0);
157
- });
158
- });
@@ -1,296 +0,0 @@
1
- import {
2
- ACTIVATION_AB_VARIANT,
3
- ACTIVATION_FUNNEL_VERSION,
4
- activationStepIndex,
5
- type ActivationStepName,
6
- buildActivationDaemonEventId,
7
- } from "../telemetry/activation-funnel.js";
8
- import {
9
- LIVE_VOICE_FUNNEL_VERSION,
10
- LIVE_VOICE_STEPS,
11
- type LiveVoiceSessionOutcome,
12
- type LiveVoiceStepName,
13
- } from "../telemetry/live-voice-funnel.js";
14
- import {
15
- PHONE_CALL_FUNNEL_VERSION,
16
- PHONE_CALL_STEPS,
17
- type PhoneCallOutcome,
18
- type PhoneCallStepName,
19
- } from "../telemetry/phone-call-funnel.js";
20
- import { recordTelemetryOutboxEvent } from "../telemetry/telemetry-events-outbox.js";
21
- import type { OnboardingTelemetryEvent } from "../telemetry/types.js";
22
- import { getLogger } from "../util/logger.js";
23
- import { APP_VERSION } from "../version.js";
24
-
25
- const log = getLogger("onboarding-events-store");
26
-
27
- /** Identity of a recorded outbox row; the full payload lives in the outbox. */
28
- export interface OnboardingEvent {
29
- id: string;
30
- createdAt: number;
31
- }
32
-
33
- export interface RecordOnboardingEventParams {
34
- screen: string;
35
- tools?: string[];
36
- tasks?: string[];
37
- tone?: string;
38
- googleConnected?: boolean;
39
- googleScopes?: string[];
40
- abVariant?: string;
41
- sessionId?: string | null;
42
- stepName?: string | null;
43
- stepIndex?: number | null;
44
- completedAt?: string | null;
45
- funnelVersion?: string | null;
46
- outcome?: string | null;
47
- }
48
-
49
- /**
50
- * Build the wire event stored in the outbox payload at record time.
51
- * `assistant_version` is therefore record-time: the binary that recorded the
52
- * event, not the one that later flushes it.
53
- */
54
- function buildOnboardingTelemetryEvent(
55
- id: string,
56
- createdAt: number,
57
- params: RecordOnboardingEventParams,
58
- ): OnboardingTelemetryEvent {
59
- return {
60
- type: "onboarding",
61
- // Wire-only override for activation rows: a deterministic id keyed on
62
- // funnel_version/session/step lets dbt collapse a moment that fires more
63
- // than once. Keyed on the params' funnelVersion (frozen into the payload
64
- // now) so rows recorded under an older version — flushed offline or after
65
- // an upgrade — keep a stable id and still collapse with already-ingested
66
- // rows. The outbox row id stays `id`, so flush acks are unaffected.
67
- daemon_event_id:
68
- params.sessionId && params.stepName && params.funnelVersion
69
- ? buildActivationDaemonEventId(
70
- params.sessionId,
71
- params.stepName,
72
- params.funnelVersion,
73
- )
74
- : id,
75
- recorded_at: createdAt,
76
- screen: params.screen,
77
- ...(params.tools ? { tools: params.tools } : {}),
78
- ...(params.tasks ? { tasks: params.tasks } : {}),
79
- ...(params.tone ? { tone: params.tone } : {}),
80
- ...(params.googleConnected != null
81
- ? { google_connected: params.googleConnected }
82
- : {}),
83
- ...(params.googleScopes ? { google_scopes: params.googleScopes } : {}),
84
- ...(params.abVariant ? { ab_variant: params.abVariant } : {}),
85
- // Activation funnel fields — only present on activation rows.
86
- ...(params.sessionId ? { session_id: params.sessionId } : {}),
87
- ...(params.stepName ? { step_name: params.stepName } : {}),
88
- ...(params.stepIndex != null ? { step_index: params.stepIndex } : {}),
89
- ...(params.completedAt ? { completed_at: params.completedAt } : {}),
90
- ...(params.funnelVersion ? { funnel_version: params.funnelVersion } : {}),
91
- ...(params.outcome ? { outcome: params.outcome } : {}),
92
- assistant_version: APP_VERSION,
93
- };
94
- }
95
-
96
- /**
97
- * Record an onboarding event (pre-chat selections and Google connect status).
98
- * Returns null when usage data collection is disabled or the telemetry
99
- * database is unavailable.
100
- */
101
- export function recordOnboardingEvent(
102
- params: RecordOnboardingEventParams,
103
- ): OnboardingEvent | null {
104
- return recordTelemetryOutboxEvent("onboarding", (id, createdAt) =>
105
- buildOnboardingTelemetryEvent(id, createdAt, params),
106
- );
107
- }
108
-
109
- /**
110
- * Record an activation-funnel milestone event. Reuses the onboarding telemetry
111
- * substrate (`screen` carries the step name). Returns null when usage data
112
- * collection is disabled or the telemetry database is unavailable.
113
- */
114
- export function recordActivationEvent(params: {
115
- stepName: ActivationStepName;
116
- sessionId: string;
117
- abVariant?: string;
118
- }): OnboardingEvent | null {
119
- return recordTelemetryOutboxEvent("onboarding", (id, createdAt) =>
120
- buildOnboardingTelemetryEvent(id, createdAt, {
121
- screen: params.stepName,
122
- abVariant: params.abVariant ?? ACTIVATION_AB_VARIANT,
123
- sessionId: params.sessionId,
124
- stepName: params.stepName,
125
- stepIndex: activationStepIndex(params.stepName),
126
- completedAt: new Date(createdAt).toISOString(),
127
- funnelVersion: ACTIVATION_FUNNEL_VERSION,
128
- }),
129
- );
130
- }
131
-
132
- /**
133
- * Record a live-voice session milestone (started / ended). Reuses the same
134
- * onboarding telemetry substrate as {@link recordActivationEvent}, keyed by the
135
- * live-voice session id so the two events pair up downstream. See
136
- * `telemetry/live-voice-funnel.ts` for why duration and turn count are derived
137
- * from that pairing rather than carried as fields.
138
- *
139
- * `screen` carries the end reason on the ended event and the originating
140
- * client and entry point on the started one (see `liveVoiceStartScreen`).
141
- * Returns null when usage data collection is disabled or the telemetry
142
- * database is unavailable.
143
- *
144
- * **Never throws.** These fire from `LiveVoiceSession.start()` and `.close()`,
145
- * and from the call store's create and status writes, which are the user's
146
- * call itself: the outbox insert raises on a telemetry DB that is missing,
147
- * locked, or mid-migration, and an uncaught raise there would fail the session
148
- * rather than the measurement. A dropped row costs a gap in a chart; a raised
149
- * one costs the user their conversation.
150
- */
151
- function recordVoiceFunnelEventSafely(
152
- record: () => OnboardingEvent | null,
153
- ): OnboardingEvent | null {
154
- try {
155
- return record();
156
- } catch (err) {
157
- log.warn(
158
- { err },
159
- "Failed to record live-voice session telemetry; continuing",
160
- );
161
- return null;
162
- }
163
- }
164
-
165
- /**
166
- * Build one voice funnel row. The live-voice and phone-call funnels differ
167
- * only in their version stamp and step vocabulary, so they share the row
168
- * shape: same substrate, same session-keyed pairing, same duration math.
169
- */
170
- function recordVoiceFunnelEvent(params: {
171
- funnelVersion: string;
172
- stepName: string;
173
- stepIndex: number;
174
- sessionId: string;
175
- screen: string;
176
- outcome?: string;
177
- }): OnboardingEvent | null {
178
- return recordVoiceFunnelEventSafely(() =>
179
- recordTelemetryOutboxEvent("onboarding", (id, createdAt) =>
180
- buildOnboardingTelemetryEvent(id, createdAt, {
181
- screen: params.screen,
182
- sessionId: params.sessionId,
183
- stepName: params.stepName,
184
- stepIndex: params.stepIndex,
185
- completedAt: new Date(createdAt).toISOString(),
186
- funnelVersion: params.funnelVersion,
187
- ...(params.outcome ? { outcome: params.outcome } : {}),
188
- }),
189
- ),
190
- );
191
- }
192
-
193
- export function recordLiveVoiceSessionEvent(params: {
194
- stepName: LiveVoiceStepName;
195
- stepIndex: number;
196
- sessionId: string;
197
- screen?: string;
198
- outcome?: LiveVoiceSessionOutcome;
199
- }): OnboardingEvent | null {
200
- return recordVoiceFunnelEvent({
201
- funnelVersion: LIVE_VOICE_FUNNEL_VERSION,
202
- stepName: params.stepName,
203
- stepIndex: params.stepIndex,
204
- sessionId: params.sessionId,
205
- screen: params.screen ?? params.stepName,
206
- ...(params.outcome ? { outcome: params.outcome } : {}),
207
- });
208
- }
209
-
210
- /**
211
- * Record the "a live-voice session was attempted" milestone, with where it
212
- * was attempted from.
213
- */
214
- export function recordLiveVoiceSessionStarted(params: {
215
- sessionId: string;
216
- screen: string;
217
- }): OnboardingEvent | null {
218
- return recordLiveVoiceSessionEvent({
219
- stepName: LIVE_VOICE_STEPS.sessionStarted.stepName,
220
- stepIndex: LIVE_VOICE_STEPS.sessionStarted.stepIndex,
221
- sessionId: params.sessionId,
222
- screen: params.screen,
223
- });
224
- }
225
-
226
- /** Record the "a live-voice session ended" milestone, with how it ended. */
227
- export function recordLiveVoiceSessionEnded(params: {
228
- sessionId: string;
229
- screen: string;
230
- outcome: LiveVoiceSessionOutcome;
231
- }): OnboardingEvent | null {
232
- return recordLiveVoiceSessionEvent({
233
- stepName: LIVE_VOICE_STEPS.sessionEnded.stepName,
234
- stepIndex: LIVE_VOICE_STEPS.sessionEnded.stepIndex,
235
- sessionId: params.sessionId,
236
- screen: params.screen,
237
- outcome: params.outcome,
238
- });
239
- }
240
-
241
- /**
242
- * Record a phone-call milestone (started / ended) on the same substrate as the
243
- * live-voice pair, keyed by the call session id so the two events pair up
244
- * downstream. See `telemetry/phone-call-funnel.ts` for why duration and turn
245
- * count are derived from that pairing rather than carried as fields.
246
- *
247
- * Returns null when usage data collection is disabled or the telemetry
248
- * database is unavailable, and never throws: these fire from the call store's
249
- * writes, on the call's own path.
250
- */
251
- function recordPhoneCallEvent(params: {
252
- stepName: PhoneCallStepName;
253
- stepIndex: number;
254
- callSessionId: string;
255
- screen: string;
256
- outcome?: PhoneCallOutcome;
257
- }): OnboardingEvent | null {
258
- return recordVoiceFunnelEvent({
259
- funnelVersion: PHONE_CALL_FUNNEL_VERSION,
260
- stepName: params.stepName,
261
- stepIndex: params.stepIndex,
262
- sessionId: params.callSessionId,
263
- screen: params.screen,
264
- ...(params.outcome ? { outcome: params.outcome } : {}),
265
- });
266
- }
267
-
268
- /**
269
- * Record the "a phone call was attempted" milestone, with how it was placed.
270
- */
271
- export function recordPhoneCallStarted(params: {
272
- callSessionId: string;
273
- screen: string;
274
- }): OnboardingEvent | null {
275
- return recordPhoneCallEvent({
276
- stepName: PHONE_CALL_STEPS.callStarted.stepName,
277
- stepIndex: PHONE_CALL_STEPS.callStarted.stepIndex,
278
- callSessionId: params.callSessionId,
279
- screen: params.screen,
280
- });
281
- }
282
-
283
- /** Record the "a phone call ended" milestone, with how it ended. */
284
- export function recordPhoneCallEnded(params: {
285
- callSessionId: string;
286
- screen: string;
287
- outcome: PhoneCallOutcome;
288
- }): OnboardingEvent | null {
289
- return recordPhoneCallEvent({
290
- stepName: PHONE_CALL_STEPS.callEnded.stepName,
291
- stepIndex: PHONE_CALL_STEPS.callEnded.stepIndex,
292
- callSessionId: params.callSessionId,
293
- screen: params.screen,
294
- outcome: params.outcome,
295
- });
296
- }
@@ -1,76 +0,0 @@
1
- /**
2
- * Tests for {@link rawTelemetryRun} — the raw-write helper for the dedicated
3
- * telemetry connection (`assistant-telemetry.db`), mirroring
4
- * `rawMemoryRun`/`rawLogsRun`. Writes must land on the telemetry connection,
5
- * not the main DB, and return the changed-row count.
6
- */
7
-
8
- import { describe, expect, test } from "bun:test";
9
-
10
- import { getSqlite, getTelemetrySqlite } from "../db-connection.js";
11
- import { initializeDb } from "../db-init.js";
12
- import { rawTelemetryRun } from "../raw-query.js";
13
-
14
- await initializeDb();
15
-
16
- const telemetry = getTelemetrySqlite();
17
- if (!telemetry) {
18
- throw new Error("telemetry database unavailable in test");
19
- }
20
-
21
- telemetry.exec(/*sql*/ `
22
- CREATE TABLE IF NOT EXISTS raw_telemetry_run_test (
23
- id TEXT PRIMARY KEY,
24
- value INTEGER NOT NULL
25
- )
26
- `);
27
-
28
- describe("rawTelemetryRun", () => {
29
- test("inserts on the telemetry connection and returns the changed-row count", () => {
30
- const changes = rawTelemetryRun(
31
- "test:insert",
32
- "INSERT INTO raw_telemetry_run_test (id, value) VALUES (?, ?)",
33
- "row-1",
34
- 42,
35
- );
36
- expect(changes).toBe(1);
37
-
38
- // The row is visible through the telemetry connection…
39
- const row = telemetry
40
- .query("SELECT id, value FROM raw_telemetry_run_test WHERE id = ?")
41
- .get("row-1");
42
- expect(row).toEqual({ id: "row-1", value: 42 });
43
-
44
- // …and the table does not exist on the main connection at all.
45
- const onMain = getSqlite()
46
- .query("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?")
47
- .get("raw_telemetry_run_test");
48
- expect(onMain).toBeNull();
49
- });
50
-
51
- test("delete returns the changed-row count", () => {
52
- rawTelemetryRun(
53
- "test:insert",
54
- "INSERT INTO raw_telemetry_run_test (id, value) VALUES (?, ?), (?, ?)",
55
- "row-2",
56
- 1,
57
- "row-3",
58
- 2,
59
- );
60
-
61
- const deleted = rawTelemetryRun(
62
- "test:delete",
63
- "DELETE FROM raw_telemetry_run_test WHERE id IN (?, ?)",
64
- "row-2",
65
- "row-3",
66
- );
67
- expect(deleted).toBe(2);
68
-
69
- const noMatch = rawTelemetryRun(
70
- "test:delete",
71
- "DELETE FROM raw_telemetry_run_test WHERE id = ?",
72
- "missing",
73
- );
74
- expect(noMatch).toBe(0);
75
- });
76
- });
@@ -1,134 +0,0 @@
1
- import { beforeEach, describe, expect, test } from "bun:test";
2
-
3
- import {
4
- resetOutboxTable,
5
- setShareAnalytics,
6
- withTelemetryDbUnavailable,
7
- } from "../telemetry/__tests__/outbox-test-harness.js";
8
- import { APP_VERSION } from "../version.js";
9
- import { getTelemetrySqlite } from "./db-connection.js";
10
- import {
11
- buildLifecycleTelemetryEvent,
12
- recordLifecycleEvent,
13
- } from "./lifecycle-events-store.js";
14
-
15
- interface RawOutboxRow {
16
- id: string;
17
- name: string;
18
- created_at: number;
19
- conversation_id: string | null;
20
- payload: string;
21
- }
22
-
23
- function outboxRows(): RawOutboxRow[] {
24
- return getTelemetrySqlite()!
25
- .query(
26
- `SELECT id, name, created_at, conversation_id, payload
27
- FROM telemetry_events ORDER BY created_at, id`,
28
- )
29
- .all() as RawOutboxRow[];
30
- }
31
-
32
- describe("lifecycle-events-store", () => {
33
- beforeEach(() => {
34
- setShareAnalytics(true);
35
- resetOutboxTable();
36
- });
37
-
38
- test("record writes a telemetry_events outbox row carrying the wire payload", () => {
39
- const event = recordLifecycleEvent("app_open");
40
- expect(event).not.toBeNull();
41
- expect(event!.eventName).toBe("app_open");
42
- expect(event!.createdAt).toBeGreaterThan(0);
43
-
44
- const rows = outboxRows();
45
- expect(rows).toHaveLength(1);
46
- expect(rows[0]).toMatchObject({
47
- id: event!.id,
48
- name: "lifecycle",
49
- created_at: event!.createdAt,
50
- conversation_id: null,
51
- });
52
- expect(JSON.parse(rows[0]!.payload)).toEqual({
53
- type: "lifecycle",
54
- daemon_event_id: event!.id,
55
- event_name: "app_open",
56
- recorded_at: event!.createdAt,
57
- assistant_version: APP_VERSION,
58
- });
59
- });
60
-
61
- test("carries the optional attributes onto the wire payload", () => {
62
- const event = recordLifecycleEvent("permission_prompt:bash", {
63
- toolName: "bash",
64
- riskLevel: "high",
65
- riskThreshold: "low",
66
- surface: "slack",
67
- conversationId: "conv-xyz",
68
- });
69
- expect(event).not.toBeNull();
70
-
71
- const rows = outboxRows();
72
- expect(rows).toHaveLength(1);
73
- // The conversation is stamped on the row too, so deleting the conversation
74
- // deletes the pending event with it.
75
- expect(rows[0]!.conversation_id).toBe("conv-xyz");
76
- expect(JSON.parse(rows[0]!.payload)).toEqual({
77
- type: "lifecycle",
78
- daemon_event_id: event!.id,
79
- event_name: "permission_prompt:bash",
80
- recorded_at: event!.createdAt,
81
- assistant_version: APP_VERSION,
82
- tool_name: "bash",
83
- risk_level: "high",
84
- risk_threshold: "low",
85
- surface: "slack",
86
- conversation_id: "conv-xyz",
87
- });
88
- });
89
-
90
- test("omits attributes that are unset or empty", () => {
91
- // The wire schema requires at least one character, and one failing field
92
- // makes the server drop the whole event.
93
- const event = recordLifecycleEvent("permission_prompt:bash", {
94
- toolName: "bash",
95
- riskLevel: "high",
96
- surface: "",
97
- });
98
-
99
- expect(JSON.parse(outboxRows()[0]!.payload)).toEqual({
100
- type: "lifecycle",
101
- daemon_event_id: event!.id,
102
- event_name: "permission_prompt:bash",
103
- recorded_at: event!.createdAt,
104
- assistant_version: APP_VERSION,
105
- tool_name: "bash",
106
- risk_level: "high",
107
- });
108
- expect(outboxRows()[0]!.conversation_id).toBeNull();
109
- });
110
-
111
- test("buildLifecycleTelemetryEvent stamps the record-time binary version", () => {
112
- expect(buildLifecycleTelemetryEvent("id-1", "hatch", 1234)).toEqual({
113
- type: "lifecycle",
114
- daemon_event_id: "id-1",
115
- event_name: "hatch",
116
- recorded_at: 1234,
117
- assistant_version: APP_VERSION,
118
- });
119
- });
120
-
121
- test("returns null and writes no row when share_analytics is disabled", () => {
122
- setShareAnalytics(false);
123
- expect(recordLifecycleEvent("app_open")).toBeNull();
124
- expect(outboxRows()).toHaveLength(0);
125
- });
126
-
127
- test("degrades when the telemetry database is unavailable", () => {
128
- withTelemetryDbUnavailable(() => {
129
- expect(recordLifecycleEvent("app_open")).toBeNull();
130
- });
131
-
132
- expect(outboxRows()).toHaveLength(0);
133
- });
134
- });