@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,597 +0,0 @@
1
- /**
2
- * Per-event-type telemetry sources for the usage telemetry reporter.
3
- *
4
- * Each {@link TelemetryEventSource} owns one event type end-to-end: querying
5
- * unreported rows after a compound `(createdAt, id)` cursor, mapping them to
6
- * wire events, and deciding which rows are reportable this cycle (the turn
7
- * source defers in-flight turns). The reporter is a generic engine over a
8
- * list of sources, so which process flushes which event types is a matter of
9
- * which sources its reporter instance is constructed with.
10
- */
11
-
12
- import {
13
- getCachedShareDiagnostics,
14
- getCachedShareDiagnosticsVersion,
15
- } from "../cloud/consent-cache.js";
16
- import { queryUnreportedUsageEvents } from "../persistence/llm-usage-store.js";
17
- import type { UsageAttributionProfileSource } from "../usage/types.js";
18
- import { getLogger } from "../util/logger.js";
19
- import { APP_VERSION } from "../version.js";
20
- import {
21
- deleteTelemetryOutboxEvents,
22
- discardPendingTelemetryOutboxEvents,
23
- queryDistinctOutboxEventNames,
24
- queryTelemetryOutboxBatch,
25
- } from "./telemetry-events-outbox.js";
26
- import { queryUnreportedToolExecutedEvents } from "./tool-executed-events-store.js";
27
- import { isDiagnosticsConsentVersionEligible } from "./trace-collection-policy.js";
28
- import { queryUnreportedTurnEvents } from "./turn-events-store.js";
29
- import { assembleBoundedTurnTrace, isTurnSettled } from "./turn-trace-store.js";
30
- import type {
31
- OutboxTelemetryEventName,
32
- TelemetryEvent,
33
- TurnTelemetryClientInfo,
34
- } from "./types.js";
35
- import { OUTBOX_TELEMETRY_EVENT_NAMES } from "./types.js";
36
-
37
- const log = getLogger("usage-telemetry");
38
-
39
- /** Compound `(createdAt, id)` position of a reported row. */
40
- export interface TelemetryCursor {
41
- createdAt: number;
42
- id: string;
43
- }
44
-
45
- /** One flush cycle's worth of reportable events from a single source. */
46
- export interface TelemetryEventSourceBatch {
47
- /** Wire events for the rows reportable this cycle, in cursor order. */
48
- events: TelemetryEvent[];
49
- /**
50
- * Row ids backing `events`, set by ack-mode sources so the reporter can
51
- * acknowledge (delete) exactly the shipped rows. These are ROW ids, not
52
- * wire `daemon_event_id`s — the onboarding source overrides
53
- * `daemon_event_id` for activation rows, so the two can differ.
54
- */
55
- rowIds?: string[];
56
- /** Cursor of the last reportable row; null when nothing is reportable. */
57
- lastCursor: TelemetryCursor | null;
58
- /**
59
- * True when this source may have more rows immediately behind the batch
60
- * (drives the reporter's recurse-after-success). Sources that defer rows
61
- * (the turn completeness barrier) key this off the REPORTED count so a
62
- * truncated batch waits for a later flush instead of re-querying and
63
- * re-deferring in a tight recursion.
64
- */
65
- fullBatch: boolean;
66
- }
67
-
68
- /** One event type's query + wire mapping, keyed by its watermark namespace. */
69
- export interface TelemetryEventSource {
70
- /**
71
- * Stable source id — the watermark key namespace. The reporter persists
72
- * this source's cursor under `telemetry:<id>:last_reported_{at,id}` in the
73
- * telemetry DB's `flush_checkpoints` table, so ids must never change once
74
- * shipped.
75
- */
76
- id: string;
77
- /** Query rows after the compound cursor and map them to wire events. */
78
- collect(
79
- afterCreatedAt: number,
80
- afterId: string | undefined,
81
- limit: number,
82
- ): TelemetryEventSourceBatch;
83
- /**
84
- * Delete-on-flush mode. Both operations are required together: `acknowledge`
85
- * deletes the rows behind {@link TelemetryEventSourceBatch.rowIds} after a
86
- * 2xx from the ingest endpoint, and `discardPending` drops all pending rows
87
- * on an opted-out flush (watermark writes are meaningless for ack-mode
88
- * sources, so they never touch `flush_checkpoints`).
89
- */
90
- ack?: {
91
- acknowledge(rowIds: string[]): void;
92
- discardPending(): void;
93
- };
94
- }
95
-
96
- /** The `flush_checkpoints` keys holding a source's compound cursor. */
97
- export function watermarkKeysForSource(sourceId: string): {
98
- at: string;
99
- id: string;
100
- } {
101
- return {
102
- at: `telemetry:${sourceId}:last_reported_at`,
103
- id: `telemetry:${sourceId}:last_reported_id`,
104
- };
105
- }
106
-
107
- /**
108
- * Build a source for the common case: every queried row is reportable, the
109
- * cursor advances to the last queried row, and a full query batch signals
110
- * more rows behind it.
111
- */
112
- function simpleSource<Row extends { id: string; createdAt: number }>(
113
- id: string,
114
- query: (
115
- afterCreatedAt: number,
116
- afterId: string | undefined,
117
- limit: number,
118
- ) => Row[],
119
- toEvent: (row: Row) => TelemetryEvent,
120
- ): TelemetryEventSource {
121
- return {
122
- id,
123
- collect(afterCreatedAt, afterId, limit) {
124
- const rows = query(afterCreatedAt, afterId, limit);
125
- const last = rows.length > 0 ? rows[rows.length - 1] : null;
126
- return {
127
- events: rows.map(toEvent),
128
- lastCursor: last ? { createdAt: last.createdAt, id: last.id } : null,
129
- fullBatch: rows.length === limit,
130
- };
131
- },
132
- };
133
- }
134
-
135
- /**
136
- * Query one outbox event name and parse each stored payload into its wire
137
- * event, accumulating into `events`/`rowIds`. A row whose payload does not
138
- * parse to an object is collected into `corruptIds` for immediate purge: an
139
- * early empty-batch return in the reporter would otherwise strand it at the
140
- * head of the queue forever. Shared by {@link outboxSource} and the
141
- * orphan-drain source.
142
- */
143
- function collectOutboxName(
144
- name: string,
145
- limit: number,
146
- into: { events: TelemetryEvent[]; rowIds: string[]; corruptIds: string[] },
147
- ): { queried: number } {
148
- const rows = queryTelemetryOutboxBatch(name, limit);
149
- for (const row of rows) {
150
- let event: TelemetryEvent | null = null;
151
- try {
152
- const parsed = JSON.parse(row.payload) as unknown;
153
- if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
154
- event = parsed as TelemetryEvent;
155
- }
156
- } catch {
157
- // Fall through to the purge below.
158
- }
159
- if (event) {
160
- into.events.push(event);
161
- into.rowIds.push(row.id);
162
- } else {
163
- into.corruptIds.push(row.id);
164
- log.warn(
165
- { name, rowId: row.id, payloadLength: row.payload.length },
166
- "Telemetry outbox: unparseable payload — purging row",
167
- );
168
- }
169
- }
170
- return { queried: rows.length };
171
- }
172
-
173
- /**
174
- * Build an ack-mode source over the generic `telemetry_events` outbox for one
175
- * event name. `collect` ignores the cursor args — acknowledged rows are
176
- * deleted, so the head of the queue is always the next batch.
177
- */
178
- export function outboxSource(
179
- name: OutboxTelemetryEventName,
180
- ): TelemetryEventSource {
181
- return {
182
- id: name,
183
- collect(_afterCreatedAt, _afterId, limit) {
184
- const acc = {
185
- events: [] as TelemetryEvent[],
186
- rowIds: [] as string[],
187
- corruptIds: [] as string[],
188
- };
189
- const { queried } = collectOutboxName(name, limit, acc);
190
- if (acc.corruptIds.length > 0) {
191
- deleteTelemetryOutboxEvents(acc.corruptIds);
192
- }
193
- return {
194
- events: acc.events,
195
- rowIds: acc.rowIds,
196
- lastCursor: null,
197
- fullBatch: queried === limit,
198
- };
199
- },
200
- ack: {
201
- acknowledge: (rowIds) => deleteTelemetryOutboxEvents(rowIds),
202
- discardPending: () => discardPendingTelemetryOutboxEvents(name),
203
- },
204
- };
205
- }
206
-
207
- /** Source id of the synthetic orphan-drain source (not a wire event type). */
208
- export const ORPHAN_OUTBOX_DRAIN_SOURCE_ID = "__orphan_outbox_drain";
209
-
210
- /**
211
- * Synthetic ack-mode source that drains outbox rows whose `name` is no longer a
212
- * current outbox event type — e.g. rows recorded before the cloud removed or
213
- * renamed a type, still pending on a client that has since upgraded. The
214
- * derived per-type sources ({@link OUTBOX_TELEMETRY_EVENT_NAMES}) never query
215
- * those names, so without this the rows would sit in the outbox forever.
216
- *
217
- * Draining is send-then-ack: the cloud skips an unknown event type but still
218
- * returns 2xx, after which the row is deleted. This is safe against a stale
219
- * local wire copy — a name merely missing from a lagging wire still ships and
220
- * lands rather than being purged and lost — and rides `share_analytics` like
221
- * every other outbox event (no outbox type is diagnostics-gated at flush).
222
- */
223
- export function orphanOutboxDrainSource(): TelemetryEventSource {
224
- const known = new Set<string>(OUTBOX_TELEMETRY_EVENT_NAMES);
225
- const orphanNames = (): string[] =>
226
- queryDistinctOutboxEventNames().filter((name) => !known.has(name));
227
- return {
228
- id: ORPHAN_OUTBOX_DRAIN_SOURCE_ID,
229
- collect(_afterCreatedAt, _afterId, limit) {
230
- const acc = {
231
- events: [] as TelemetryEvent[],
232
- rowIds: [] as string[],
233
- corruptIds: [] as string[],
234
- };
235
- for (const name of orphanNames()) {
236
- if (acc.events.length >= limit) {
237
- break;
238
- }
239
- collectOutboxName(name, limit - acc.events.length, acc);
240
- }
241
- if (acc.corruptIds.length > 0) {
242
- deleteTelemetryOutboxEvents(acc.corruptIds);
243
- }
244
- return {
245
- events: acc.events,
246
- rowIds: acc.rowIds,
247
- lastCursor: null,
248
- // Conservative: never signals more-behind, so orphan draining spreads
249
- // across flush cycles instead of monopolizing one. Rare by nature.
250
- fullBatch: false,
251
- };
252
- },
253
- ack: {
254
- acknowledge: (rowIds) => deleteTelemetryOutboxEvents(rowIds),
255
- discardPending: () => {
256
- for (const name of orphanNames()) {
257
- discardPendingTelemetryOutboxEvents(name);
258
- }
259
- },
260
- },
261
- };
262
- }
263
-
264
- // ---------------------------------------------------------------------------
265
- // Sources
266
- // ---------------------------------------------------------------------------
267
-
268
- const usageSource = simpleSource(
269
- "usage",
270
- (afterCreatedAt, afterId, limit) =>
271
- queryUnreportedUsageEvents(afterCreatedAt, afterId, limit),
272
- (e): TelemetryEvent => ({
273
- type: "llm_usage",
274
- daemon_event_id: e.id,
275
- // Conversation-level metadata for analytics joins. All three
276
- // are nullable on the wire: `conversation_id` is null for
277
- // LLM calls not tied to a conversation (memory consolidation,
278
- // background work), and the other two cascade from that.
279
- conversation_id: e.conversationId,
280
- conversation_type: e.conversationType,
281
- turn_index: e.turnIndex,
282
- parent_conversation_id: e.parentConversationId,
283
- parent_turn_index: e.parentTurnIndex,
284
- // Delegated-work decomposition. Every subagent variety shares
285
- // `llm_call_site = "subagentSpawn"`; these two orthogonal dimensions are
286
- // what make advisor consults, forks, and regular spawns separable. Null
287
- // for the vast majority of calls, which are not delegated at all.
288
- subagent_role: e.subagentRole,
289
- subagent_spawn_mode: e.subagentSpawnMode,
290
- provider: e.provider,
291
- model: e.model,
292
- input_tokens: e.inputTokens,
293
- output_tokens: e.outputTokens,
294
- cache_creation_input_tokens: e.cacheCreationInputTokens ?? null,
295
- cache_read_input_tokens: e.cacheReadInputTokens ?? null,
296
- llm_call_count: e.llmCallCount,
297
- raw_usage: e.rawUsage,
298
- actor: e.actor,
299
- llm_call_site: e.callSite,
300
- inference_profile: e.inferenceProfile,
301
- inference_profile_source: e.inferenceProfileSource,
302
- cost: e.estimatedCostUsd ?? null,
303
- recorded_at: e.createdAt,
304
- // Record-time version when present; otherwise the running
305
- // binary's `APP_VERSION` (a legacy row from before
306
- // migration 267 ran). We deliberately don't emit explicit
307
- // `null` — under the cloud contract a present-but-null
308
- // per-event value would override the envelope, and we'd
309
- // rather have a concrete version than no version.
310
- assistant_version: e.assistantVersion ?? APP_VERSION,
311
- }),
312
- );
313
-
314
- /**
315
- * Turn source. Unlike the simple sources it enforces the turn completeness
316
- * barrier and attaches consented traces, both of which need the daemon's
317
- * live in-memory conversation state (`isProcessing()`, cached system prompt,
318
- * registered tool definitions) — so this source must run in the daemon
319
- * process.
320
- */
321
- const turnSource: TelemetryEventSource = {
322
- id: "turns",
323
- collect(afterCreatedAt, afterId, limit) {
324
- const turnEvents = queryUnreportedTurnEvents(
325
- afterCreatedAt,
326
- afterId,
327
- limit,
328
- );
329
-
330
- // Turn completeness barrier (every turn event).
331
- //
332
- // A turn event must only be sent once that turn is COMPLETE, for two
333
- // reasons sharing the same failure mode (the watermark advances on ship,
334
- // so anything captured early is frozen forever):
335
- // - the consented `trace` would capture a partial mid-reply
336
- // transcript, and
337
- // - the `outcome` stamp (`messages.metadata.turnOutcome`, written by
338
- // the agent loop / drainBatch while the conversation is still
339
- // processing) would be missed, permanently mislabeling a
340
- // failed/cancelled/batched turn as normally-replied.
341
- // So we report only the leading run of complete turns and STOP at the
342
- // first incomplete (in-flight) one: the turn watermark is a single
343
- // monotonic `(createdAt, id)` cursor, so a later complete turn cannot be
344
- // reported past an earlier deferred one without skipping it. The
345
- // deferred turn (and everything after it) is picked up on a later flush
346
- // once its response settles.
347
- //
348
- // Trace eligibility is composed daemon-side to mirror the cloud's
349
- // authoritative owner-based ingest gate, so traces for ineligible owners
350
- // never leave the device. Two parts, fail-closed (both must be true):
351
- // 1. the owner's cached `share_diagnostics` consent, and
352
- // 2. the owner's cached `share_diagnostics_accepted_version` being at or
353
- // past the disclosing version — the cloud applies the identical
354
- // check, so an old consent never yields a trace here or there.
355
- const traceEligible =
356
- getCachedShareDiagnostics() &&
357
- isDiagnosticsConsentVersionEligible(getCachedShareDiagnosticsVersion());
358
- let reportableTurnEvents = turnEvents;
359
- if (turnEvents.length > 0) {
360
- let barrier = turnEvents.length;
361
- for (let i = 0; i < turnEvents.length; i++) {
362
- const t = turnEvents[i];
363
- if (
364
- !isTurnSettled({
365
- conversationId: t.conversationId,
366
- userMessageId: t.id,
367
- userMessageCreatedAt: t.createdAt,
368
- })
369
- ) {
370
- barrier = i;
371
- break;
372
- }
373
- }
374
- if (barrier < turnEvents.length) {
375
- reportableTurnEvents = turnEvents.slice(0, barrier);
376
- log.debug(
377
- {
378
- deferredTurnId: turnEvents[barrier].id,
379
- deferredConversationId: turnEvents[barrier].conversationId,
380
- reportedTurns: barrier,
381
- deferredTurns: turnEvents.length - barrier,
382
- },
383
- "Deferring in-progress turn(s) from telemetry until complete",
384
- );
385
- }
386
- }
387
-
388
- const events = reportableTurnEvents.map((e): TelemetryEvent => {
389
- // Per-turn trace collection gate. `traceEligible` (computed above)
390
- // requires the owner's cached `share_diagnostics` consent AND an
391
- // eligible accepted consent version. Fail-closed: when either is off
392
- // the trace is omitted and the trace-free turn row flushes as before. The
393
- // `share_analytics` gate in the reporter already passed, so this is an
394
- // additional, independent gate specific to trace PII. Every turn
395
- // reaching here is settled (the completeness barrier dropped any
396
- // in-flight turns), so the trace is never a partial mid-turn snapshot.
397
- const trace = traceEligible
398
- ? assembleBoundedTurnTrace({
399
- conversationId: e.conversationId,
400
- userMessageId: e.id,
401
- userMessageCreatedAt: e.createdAt,
402
- })
403
- : null;
404
- // `messages.metadata.client` is a nested JSON object extracted
405
- // via `json_extract`; sqlite returns it as a text representation.
406
- // Parse defensively — a corrupted blob in the JSON column should
407
- // not block the whole batch flush.
408
- let client: TurnTelemetryClientInfo | null = null;
409
- if (e.clientMetadata) {
410
- try {
411
- const parsed = JSON.parse(e.clientMetadata) as unknown;
412
- if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
413
- client = parsed as TurnTelemetryClientInfo;
414
- }
415
- } catch {
416
- // Malformed client JSON — emit null rather than fail the
417
- // batch. Logged once below for visibility.
418
- log.warn(
419
- { turnId: e.id, conversationId: e.conversationId },
420
- "Telemetry turn: failed to parse messages.metadata.client; emitting null",
421
- );
422
- }
423
- }
424
- // Narrow the raw metadata projection to the wire union — only
425
- // `stampTurnOutcome` writes the key, but the JSON column is
426
- // uncontrolled, so an unexpected value is dropped rather than
427
- // shipped.
428
- const outcome =
429
- e.outcome === "batched" ||
430
- e.outcome === "failed" ||
431
- e.outcome === "cancelled"
432
- ? e.outcome
433
- : null;
434
- return {
435
- type: "turn",
436
- daemon_event_id: e.id,
437
- recorded_at: e.createdAt,
438
- conversation_id: e.conversationId,
439
- conversation_type: e.conversationType,
440
- turn_index: e.turnIndex,
441
- interface_id: e.interfaceId,
442
- channel_id: e.channelId,
443
- client,
444
- // Outcome stamps are omit-when-absent: a normally-replied turn's
445
- // wire shape is byte-identical to a pre-outcome turn event.
446
- ...(outcome ? { outcome } : {}),
447
- ...(outcome === "batched" && e.batchedInto
448
- ? { batched_into: e.batchedInto }
449
- : {}),
450
- ...(outcome === "failed" && e.failureCode
451
- ? { failure_code: e.failureCode }
452
- : {}),
453
- // Scripted-turn marker. Tri-state, so this is an explicit null check
454
- // and NOT `...(e.scripted ? ...)`: a truthiness test would drop every
455
- // `false` and turn "the user typed this" into "unknown", which is the
456
- // measurement gap the field exists to close. `false` must reach the
457
- // wire as a real value; only a genuinely unknown origin (a row
458
- // persisted before the marker existed) omits the key.
459
- ...(e.scripted == null ? {} : { scripted: e.scripted }),
460
- // Only attach `trace` when consent is on AND a bounded trace was
461
- // assembled. Omitting the key entirely when there's no trace keeps
462
- // the wire shape byte-identical to pre-trace turn events for the
463
- // common (no-consent) path.
464
- ...(trace ? { trace } : {}),
465
- // Turn events derive from `messages` + `conversations`
466
- // rather than a dedicated table. Adding `assistant_version`
467
- // to `messages` is a separate (larger) migration; until
468
- // then we stamp the running binary's `APP_VERSION` so the
469
- // wire value is concrete (matches what the envelope would
470
- // have provided, but per-event so it survives the cloud
471
- // contract that treats present per-event values as winning
472
- // over the envelope).
473
- assistant_version: APP_VERSION,
474
- };
475
- });
476
-
477
- const last =
478
- reportableTurnEvents.length > 0
479
- ? reportableTurnEvents[reportableTurnEvents.length - 1]
480
- : null;
481
- return {
482
- events,
483
- // The cursor advances only to the last REPORTED turn. Deferred
484
- // (in-flight) turns sit beyond it and are re-evaluated on a later
485
- // flush, so the watermark never skips them.
486
- lastCursor: last ? { createdAt: last.createdAt, id: last.id } : null,
487
- // Keyed off the REPORTED count: when the completeness barrier
488
- // truncates the batch, the deferred turns must wait for a later flush
489
- // (by which point they've settled) rather than being re-queried and
490
- // re-deferred in a tight recursion.
491
- fullBatch: reportableTurnEvents.length === limit,
492
- };
493
- },
494
- };
495
-
496
- const toolExecutedSource = simpleSource(
497
- "tool_executed",
498
- (afterCreatedAt, afterId, limit) =>
499
- queryUnreportedToolExecutedEvents(afterCreatedAt, afterId, limit),
500
- (e): TelemetryEvent => ({
501
- type: "tool_executed",
502
- daemon_event_id: e.id,
503
- recorded_at: e.createdAt,
504
- tool_name: e.toolName,
505
- // The store filters out permission-denied rows, so the only
506
- // non-success decision that reaches here is "error".
507
- status: e.decision === "error" ? "errored" : "fulfilled",
508
- duration_ms: e.durationMs,
509
- arg_bytes: e.argBytes,
510
- result_bytes: e.resultBytes,
511
- conversation_id: e.conversationId,
512
- provider: e.provider,
513
- model: e.model,
514
- inference_profile: e.inferenceProfile,
515
- inference_profile_source:
516
- e.inferenceProfileSource as UsageAttributionProfileSource | null,
517
- // `tool_invocations` has no record-time version column — stamp
518
- // the running binary's `APP_VERSION` so the wire value is
519
- // concrete rather than an explicit null that would override the
520
- // envelope under the cloud's per-event-wins contract.
521
- assistant_version: APP_VERSION,
522
- }),
523
- );
524
-
525
- /**
526
- * Watermark key namespace of the tool_executed source — referenced by the
527
- * absent-watermark init that runs at daemon startup.
528
- */
529
- export const TOOL_EXECUTED_SOURCE_ID = toolExecutedSource.id;
530
-
531
- /**
532
- * Watermark-flushed sources — the high-volume events on their own SQLite
533
- * tables (`WATERMARK_TELEMETRY_EVENT_NAMES`), read forward by a `(createdAt,
534
- * id)` cursor rather than the generic outbox.
535
- */
536
- const WATERMARK_TELEMETRY_EVENT_SOURCES: readonly TelemetryEventSource[] = [
537
- usageSource,
538
- turnSource,
539
- toolExecutedSource,
540
- ];
541
-
542
- /**
543
- * Per-outbox-event flush-source override. The default for every outbox event is
544
- * the plain {@link outboxSource}; list only the exceptions here. A new outbox
545
- * event type therefore needs no edit — it flushes through `outboxSource`
546
- * automatically. There are currently no exceptions: every outbox event,
547
- * including `onboarding_research`, flushes through the default source and is
548
- * gated only by the `share_analytics` consent enforced at record time.
549
- */
550
- const OUTBOX_SOURCE_FACTORY: Partial<
551
- Record<
552
- OutboxTelemetryEventName,
553
- (name: OutboxTelemetryEventName) => TelemetryEventSource
554
- >
555
- > = {};
556
-
557
- /**
558
- * Every telemetry event source, in payload order (watermark sources first, then
559
- * outbox events in wire-contract order). Derived from the wire contract via
560
- * {@link OUTBOX_TELEMETRY_EVENT_NAMES}, so a new event type gets a flush source
561
- * with no edit here. Intra-batch ordering is not load-bearing downstream
562
- * (events are typed and deduped on `daemon_event_id`, not positional). This is
563
- * the test/reference list; production reporters run the daemon/monitor
564
- * partitions below.
565
- */
566
- export const ALL_TELEMETRY_EVENT_SOURCES: readonly TelemetryEventSource[] = [
567
- ...WATERMARK_TELEMETRY_EVENT_SOURCES,
568
- ...OUTBOX_TELEMETRY_EVENT_NAMES.map((name) =>
569
- (OUTBOX_SOURCE_FACTORY[name] ?? outboxSource)(name),
570
- ),
571
- // Not a wire event type — drains rows for types the wire no longer declares.
572
- orphanOutboxDrainSource(),
573
- ];
574
-
575
- /**
576
- * Sources flushed by the daemon's reporter. Turns only: the completeness
577
- * barrier (`isProcessing()`) and consented trace assembly (cached system
578
- * prompt, registered tool definitions) read the daemon's live in-memory
579
- * conversation state, so this source cannot leave the daemon process.
580
- */
581
- export const DAEMON_TELEMETRY_EVENT_SOURCES: readonly TelemetryEventSource[] = [
582
- turnSource,
583
- ];
584
-
585
- /**
586
- * Sources flushed by the resource monitor process's reporter. Everything
587
- * except turns: pure durable-table projections over the main and telemetry
588
- * databases, which the monitor reads cross-process (main DB read-only via
589
- * WAL; telemetry DB read-write, since the monitor owns flush state).
590
- * Together with {@link DAEMON_TELEMETRY_EVENT_SOURCES} this partitions
591
- * {@link ALL_TELEMETRY_EVENT_SOURCES} — every source is flushed by exactly
592
- * one process.
593
- */
594
- export const MONITOR_TELEMETRY_EVENT_SOURCES: readonly TelemetryEventSource[] =
595
- ALL_TELEMETRY_EVENT_SOURCES.filter(
596
- (source) => !DAEMON_TELEMETRY_EVENT_SOURCES.includes(source),
597
- );