@mycadet/assistant 0.12.9 → 0.12.10

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