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