@mycadet/assistant 0.12.9 → 0.12.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (658) hide show
  1. package/Dockerfile +0 -8
  2. package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +1 -1
  3. package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
  4. package/node_modules/@mycadet/ces-client/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
  5. package/node_modules/@mycadet/ces-client/src/http-credentials.ts +18 -1
  6. package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
  7. package/node_modules/@mycadet/gateway-client/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
  8. package/node_modules/@mycadet/service-contracts/src/__tests__/ingress.test.ts +8 -8
  9. package/node_modules/@mycadet/service-contracts/src/ingress.ts +1 -1
  10. package/openapi.yaml +62 -910
  11. package/package.json +3 -7
  12. package/scripts/build-test-fixtures.ts +1 -1
  13. package/scripts/generate-openapi.ts +22 -6
  14. package/scripts/postinstall.ts +4 -10
  15. package/scripts/run-tests.ts +0 -21
  16. package/src/__tests__/adaptive-thinking-repair.test.ts +19 -57
  17. package/src/__tests__/agent-loop.test.ts +0 -76
  18. package/src/__tests__/anthropic-provider.test.ts +6 -6
  19. package/src/__tests__/assert-not-live-db.ts +1 -1
  20. package/src/__tests__/assistant-id-boundary-guard.test.ts +3 -3
  21. package/src/__tests__/attachments-store-heic-normalize.test.ts +1 -1
  22. package/src/__tests__/attachments-store.test.ts +1 -1
  23. package/src/__tests__/audit-log-rotation.test.ts +1 -1
  24. package/src/__tests__/btw-routes.test.ts +1 -1
  25. package/src/__tests__/byok-default-profile-ensure.test.ts +21 -27
  26. package/src/__tests__/call-conversation-messages.test.ts +0 -5
  27. package/src/__tests__/call-recovery.test.ts +2 -7
  28. package/src/__tests__/call-routes-http.test.ts +0 -12
  29. package/src/__tests__/call-store.test.ts +2 -7
  30. package/src/__tests__/catalog-files.test.ts +7 -5
  31. package/src/__tests__/checker.test.ts +1 -1
  32. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +4 -4
  33. package/src/__tests__/cloud-client-verify-credential.test.ts +0 -4
  34. package/src/__tests__/cloud-credential-catalog-cli.test.ts +14 -14
  35. package/src/__tests__/cloud-profile-guard.test.ts +87 -404
  36. package/src/__tests__/compaction-events.test.ts +2 -2
  37. package/src/__tests__/config-loader-backfill.test.ts +74 -163
  38. package/src/__tests__/config-loader-cloud-defaults.test.ts +11 -11
  39. package/src/__tests__/config-loader-corrupt.test.ts +10 -10
  40. package/src/__tests__/config-loader-quarantine-notice.test.ts +7 -7
  41. package/src/__tests__/config-loader-validation-reset-notice.test.ts +11 -11
  42. package/src/__tests__/config-schema.test.ts +26 -27
  43. package/src/__tests__/config-set-route.test.ts +2 -6
  44. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +28 -300
  45. package/src/__tests__/conversation-agent-loop-overflow.test.ts +39 -246
  46. package/src/__tests__/conversation-agent-loop.test.ts +2 -58
  47. package/src/__tests__/conversation-clear-safety.test.ts +0 -30
  48. package/src/__tests__/conversation-inference-profile-route.test.ts +1 -1
  49. package/src/__tests__/conversation-queue.test.ts +1 -1
  50. package/src/__tests__/conversation-runtime-assembly.test.ts +1 -1
  51. package/src/__tests__/conversation-skill-tools.test.ts +4 -444
  52. package/src/__tests__/conversation-slash-commands.test.ts +1 -1
  53. package/src/__tests__/conversation-store.test.ts +1 -84
  54. package/src/__tests__/conversation-surface-state.test.ts +0 -16
  55. package/src/__tests__/credential-health-service.test.ts +14 -1
  56. package/src/__tests__/credential-record-retire.test.ts +1 -1
  57. package/src/__tests__/credential-record-write-through.test.ts +1 -1
  58. package/src/__tests__/credential-security-invariants.test.ts +0 -145
  59. package/src/__tests__/custom-profile-ensure.test.ts +1 -1
  60. package/src/__tests__/default-profile-catalog-fallback.test.ts +5 -15
  61. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -2
  62. package/src/__tests__/dictation-profile-store.test.ts +6 -6
  63. package/src/__tests__/disk-usage.test.ts +28 -164
  64. package/src/__tests__/docker-signing-key-bootstrap.test.ts +1 -1
  65. package/src/__tests__/embedding-cloud-proxy-selection.test.ts +1 -1
  66. package/src/__tests__/emit-event-signal.test.ts +1 -1
  67. package/src/__tests__/gateway-client-cloud-outbound.test.ts +3 -3
  68. package/src/__tests__/gateway-only-enforcement.test.ts +1 -1
  69. package/src/__tests__/guardian-dispatch.test.ts +0 -13
  70. package/src/__tests__/helpers/seed-app.ts +1 -1
  71. package/src/__tests__/host-cu-routes-targeted.test.ts +1 -1
  72. package/src/__tests__/host-shell-tool.test.ts +1 -1
  73. package/src/__tests__/identity-routes.test.ts +1 -1
  74. package/src/__tests__/inference-profile-session-handler.test.ts +1 -1
  75. package/src/__tests__/inference-profile-session-ipc.test.ts +1 -1
  76. package/src/__tests__/injector-chain.test.ts +1 -1
  77. package/src/__tests__/injector-config-quarantine-notice.test.ts +1 -1
  78. package/src/__tests__/injector-config-validation-reset-notice.test.ts +1 -1
  79. package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
  80. package/src/__tests__/{platform.test.ts → layout.test.ts} +1 -1
  81. package/src/__tests__/list-all-apps.test.ts +1 -1
  82. package/src/__tests__/live-workspace-guard.test.ts +2 -2
  83. package/src/__tests__/llm-resolver-override-or-default.test.ts +5 -6
  84. package/src/__tests__/llm-resolver.test.ts +7 -7
  85. package/src/__tests__/llm-schema-fallback-profile.test.ts +9 -10
  86. package/src/__tests__/llm-usage-store.test.ts +0 -495
  87. package/src/__tests__/log-export-routes.test.ts +1 -1
  88. package/src/__tests__/mcp-config-secret-boundary.test.ts +12 -53
  89. package/src/__tests__/mcp-list-plugin-servers.test.ts +1 -1
  90. package/src/__tests__/memory-config-file-parity.test.ts +1 -1
  91. package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
  92. package/src/__tests__/messages-read-boundary-guard.test.ts +0 -2
  93. package/src/__tests__/notification-guardian-path.test.ts +0 -7
  94. package/src/__tests__/onboarding-persona-write.test.ts +1 -1
  95. package/src/__tests__/openai-provider.test.ts +8 -8
  96. package/src/__tests__/path-policy.test.ts +1 -1
  97. package/src/__tests__/persona-resolver.test.ts +1 -1
  98. package/src/__tests__/plugin-app-serve-routes.test.ts +1 -1
  99. package/src/__tests__/plugin-effective-enabled-set.test.ts +1 -1
  100. package/src/__tests__/plugin-import-boundary-guard.test.ts +4 -6
  101. package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +0 -3
  102. package/src/__tests__/provider-cloud-proxy-integration.test.ts +1 -5
  103. package/src/__tests__/provider-connections-backfill.test.ts +10 -10
  104. package/src/__tests__/prune-old-conversations-job.test.ts +6 -31
  105. package/src/__tests__/resolve-app.test.ts +1 -1
  106. package/src/__tests__/run-due-schedules.test.ts +1 -1
  107. package/src/__tests__/scaffold-managed-skill-tool.test.ts +0 -53
  108. package/src/__tests__/schedule-routes.test.ts +1 -1
  109. package/src/__tests__/schedule-store.test.ts +1 -1
  110. package/src/__tests__/secret-routes-cloud-proxy.test.ts +1 -1
  111. package/src/__tests__/skill-load-plugin-scope.test.ts +1 -1
  112. package/src/__tests__/surface-completion-compaction-boundary.test.ts +1 -1
  113. package/src/__tests__/tool-approval-handler.test.ts +1 -1
  114. package/src/__tests__/tool-audit.test.ts +5 -235
  115. package/src/__tests__/tool-executor-lifecycle-events.test.ts +54 -114
  116. package/src/__tests__/tools-get-route.test.ts +1 -1
  117. package/src/__tests__/turn-outcome-read.test.ts +1 -1
  118. package/src/__tests__/twilio-routes.test.ts +0 -1
  119. package/src/__tests__/usage-attribution.test.ts +0 -31
  120. package/src/__tests__/verification-control-plane-policy.test.ts +3 -10
  121. package/src/__tests__/visible-app-context.test.ts +1 -1
  122. package/src/__tests__/voice-ingress-preflight.test.ts +1 -1
  123. package/src/__tests__/workspace-git-service.test.ts +1 -1
  124. package/src/__tests__/workspace-greetings.test.ts +1 -1
  125. package/src/acp/__tests__/helpers/acp-config-stub.ts +1 -1
  126. package/src/activation/progress-store.ts +1 -1
  127. package/src/activation/turn-hooks.ts +1 -1
  128. package/src/agent/loop.ts +0 -51
  129. package/src/apps/app-store.ts +1 -1
  130. package/src/avatar/__tests__/avatar-store.test.ts +2 -172
  131. package/src/avatar/accent-backfill.ts +1 -1
  132. package/src/avatar/avatar-manifest.ts +1 -1
  133. package/src/avatar/avatar-store.ts +10 -69
  134. package/src/avatar/ensure-raster.ts +1 -1
  135. package/src/avatar/identity-avatar.ts +1 -1
  136. package/src/avatar/sync-avatar.ts +1 -1
  137. package/src/avatar/traits-png-sync.ts +1 -1
  138. package/src/bundler/compiler-tools.ts +1 -1
  139. package/src/bundler/package-resolver.ts +1 -1
  140. package/src/calls/__tests__/call-controller.test.ts +25 -27
  141. package/src/calls/active-call-lease.ts +1 -1
  142. package/src/calls/call-controller.ts +3 -3
  143. package/src/calls/call-domain.ts +4 -8
  144. package/src/calls/call-store.ts +2 -76
  145. package/src/calls/resolve-call-tts-provider.ts +3 -3
  146. package/src/calls/twilio-config.ts +3 -3
  147. package/src/calls/twilio-rest.ts +2 -2
  148. package/src/calls/voice-ingress-preflight.ts +2 -2
  149. package/src/cli/bundled-modules.ts +0 -2
  150. package/src/cli/commands/__tests__/apps.test.ts +1 -1
  151. package/src/cli/commands/__tests__/plugins.test.ts +9 -66
  152. package/src/cli/commands/__tests__/ps.test.ts +67 -0
  153. package/src/cli/commands/auth.help.ts +2 -2
  154. package/src/cli/commands/avatar.ts +1 -1
  155. package/src/cli/commands/changelog.ts +1 -1
  156. package/src/cli/commands/cloud/__tests__/subscription.test.ts +2 -2
  157. package/src/cli/commands/cloud/index.help.ts +1 -1
  158. package/src/cli/commands/cloud/index.ts +2 -2
  159. package/src/cli/commands/db/refresh.ts +1 -1
  160. package/src/cli/commands/db/repair-step-conversation-backfill.ts +1 -1
  161. package/src/cli/commands/db/repair.ts +1 -1
  162. package/src/cli/commands/db/status.ts +1 -1
  163. package/src/cli/commands/inference-profiles.ts +1 -12
  164. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +1 -116
  165. package/src/cli/commands/memory/index.help.ts +1 -43
  166. package/src/cli/commands/memory/memory-v3.ts +0 -64
  167. package/src/cli/commands/plugins.ts +54 -205
  168. package/src/cli/commands/ps.ts +5 -2
  169. package/src/cli/commands/status.ts +1 -1
  170. package/src/cli/index.help.ts +0 -2
  171. package/src/cli/lib/__tests__/inspect-plugin.test.ts +36 -66
  172. package/src/cli/lib/__tests__/install-from-cloud.test.ts +1 -1
  173. package/src/cli/lib/__tests__/install-from-github.test.ts +41 -117
  174. package/src/cli/lib/__tests__/plugin-catalog-cache.test.ts +2 -185
  175. package/src/cli/lib/__tests__/plugin-catalog-resolve.test.ts +36 -66
  176. package/src/cli/lib/__tests__/plugin-catalog-visibility.test.ts +4 -6
  177. package/src/cli/lib/__tests__/plugin-details.test.ts +113 -96
  178. package/src/cli/lib/__tests__/search-plugins.test.ts +9 -16
  179. package/src/cli/lib/__tests__/uninstall-plugin.test.ts +1 -1
  180. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +38 -15
  181. package/src/cli/lib/diff-plugin.ts +1 -1
  182. package/src/cli/lib/inspect-plugin.ts +13 -97
  183. package/src/cli/lib/install-from-cloud.ts +1 -1
  184. package/src/cli/lib/install-from-github.ts +75 -154
  185. package/src/cli/lib/install-plugin-dependencies.ts +1 -1
  186. package/src/cli/lib/list-installed-plugins.ts +1 -1
  187. package/src/cli/lib/open-browser.ts +1 -1
  188. package/src/cli/lib/plugin-catalog-cache.ts +8 -51
  189. package/src/cli/lib/plugin-catalog-resolve.ts +3 -22
  190. package/src/cli/lib/plugin-details.ts +5 -27
  191. package/src/cli/lib/plugin-marketplace.ts +18 -266
  192. package/src/cli/lib/search-plugins.ts +23 -43
  193. package/src/cli/lib/toggle-plugin.ts +1 -1
  194. package/src/cli/lib/uninstall-plugin.ts +1 -1
  195. package/src/cli/lib/upgrade-plugin.ts +3 -49
  196. package/src/cli/program.ts +1 -3
  197. package/src/cli.ts +1 -1
  198. package/src/cloud/client.ts +0 -6
  199. package/src/cloud/consent-cache.test.ts +22 -201
  200. package/src/cloud/consent-cache.ts +16 -111
  201. package/src/cloud/sync-identity.ts +1 -1
  202. package/src/config/__tests__/chat-settings.test.ts +1 -1
  203. package/src/config/__tests__/cloud-identity.test.ts +15 -2
  204. package/src/config/__tests__/default-plugin-skill-discovery.test.ts +1 -1
  205. package/src/config/__tests__/default-profile-catalog.test.ts +12 -51
  206. package/src/config/__tests__/deployment-context-defaults.test.ts +13 -13
  207. package/src/config/__tests__/loader-callsite-strip-fallback.test.ts +4 -4
  208. package/src/config/__tests__/loader-last-known-good.test.ts +9 -9
  209. package/src/config/__tests__/loader-sparse-array-cleanup.test.ts +7 -7
  210. package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +1 -1
  211. package/src/config/__tests__/profile-materialization.test.ts +2 -4
  212. package/src/config/__tests__/sync-gated-profiles.test.ts +1 -106
  213. package/src/config/acp-agent-write.ts +1 -1
  214. package/src/config/bundled-skills/settings/tools/open-system-settings.test.ts +1 -1
  215. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
  216. package/src/config/call-site-defaults.ts +0 -6
  217. package/src/config/cloud-identity.ts +12 -5
  218. package/src/config/composer-preferences.ts +1 -1
  219. package/src/config/default-profile-catalog.ts +8 -75
  220. package/src/config/default-profile-names.ts +2 -25
  221. package/src/config/env-registry.ts +1 -14
  222. package/src/config/env.ts +8 -6
  223. package/src/config/llm-resolver.ts +1 -2
  224. package/src/config/loader.ts +13 -17
  225. package/src/config/profile-materialization.ts +1 -1
  226. package/src/config/schema.ts +1 -7
  227. package/src/config/schemas/call-site-catalog.ts +0 -7
  228. package/src/config/schemas/llm.ts +25 -32
  229. package/src/config/seed-inference-profiles.ts +16 -17
  230. package/src/config/skills.ts +2 -2
  231. package/src/config/sync-gated-profiles.ts +6 -24
  232. package/src/credential-health/credential-health-service.ts +10 -3
  233. package/src/daemon/approval-generators.ts +3 -3
  234. package/src/daemon/config-watcher.ts +2 -2
  235. package/src/daemon/conversation-agent-loop-handlers.ts +0 -18
  236. package/src/daemon/conversation-agent-loop.ts +6 -97
  237. package/src/daemon/conversation-process.ts +1 -1
  238. package/src/daemon/conversation-skill-tools.ts +4 -72
  239. package/src/daemon/conversation-store.ts +1 -1
  240. package/src/daemon/conversation-surface-state.ts +0 -33
  241. package/src/daemon/conversation-surfaces.ts +1 -86
  242. package/src/daemon/conversation-tool-setup.test.ts +1 -1
  243. package/src/daemon/conversation-tool-setup.ts +0 -23
  244. package/src/daemon/conversation.ts +3 -5
  245. package/src/daemon/daemon-control.ts +3 -3
  246. package/src/daemon/dictation-profile-store.ts +3 -3
  247. package/src/daemon/event-loop-watchdog.test.ts +2 -198
  248. package/src/daemon/event-loop-watchdog.ts +0 -185
  249. package/src/daemon/external-plugins-bootstrap.ts +1 -1
  250. package/src/daemon/first-greeting.ts +1 -1
  251. package/src/daemon/handlers/skills.ts +1 -1
  252. package/src/daemon/host-app-control-proxy.ts +1 -1
  253. package/src/daemon/host-cu-proxy.ts +2 -2
  254. package/src/daemon/identity-helpers.ts +1 -1
  255. package/src/daemon/lifecycle.ts +11 -15
  256. package/src/daemon/main.ts +1 -1
  257. package/src/daemon/now-scratchpad.ts +1 -1
  258. package/src/daemon/process-message.ts +4 -4
  259. package/src/daemon/profiler-run-store.ts +2 -2
  260. package/src/daemon/providers-setup.ts +2 -2
  261. package/src/daemon/shutdown-handlers.ts +0 -10
  262. package/src/daemon/sqlite-corruption-watchdog.test.ts +2 -142
  263. package/src/daemon/sqlite-corruption-watchdog.ts +17 -81
  264. package/src/daemon/tool-side-effects.ts +1 -1
  265. package/src/desktop/desktop-session-manager.ts +1 -1
  266. package/src/desktop/desktop-wallpaper-renderer.ts +1 -1
  267. package/src/heartbeat/heartbeat-service.ts +1 -1
  268. package/src/home/feed-writer.ts +1 -1
  269. package/src/home/home-greeting-cache.ts +1 -1
  270. package/src/home/relationship-state-writer.ts +2 -2
  271. package/src/hooks/__tests__/hook-live-reload.test.ts +1 -1
  272. package/src/hooks/hook-loader.ts +2 -2
  273. package/src/inbound/__tests__/oauth-callback-url.test.ts +2 -2
  274. package/src/inbound/oauth-callback-url.ts +3 -3
  275. package/src/ipc/__tests__/attachment-ipc.test.ts +1 -1
  276. package/src/ipc/socket-path.ts +1 -1
  277. package/src/live-voice/__tests__/live-voice-archive.test.ts +1 -1
  278. package/src/live-voice/__tests__/live-voice-vad.test.ts +1 -1
  279. package/src/live-voice/live-voice-session.ts +3 -66
  280. package/src/mcp/__tests__/effective-config.test.ts +1 -1
  281. package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +2 -2
  282. package/src/mcp/__tests__/mcp-oauth-provider.test.ts +2 -3
  283. package/src/mcp/__tests__/reload-signal-emission.test.ts +1 -1
  284. package/src/mcp/__tests__/reload-signal.test.ts +1 -1
  285. package/src/mcp/__tests__/workspace-mcp-config.test.ts +19 -21
  286. package/src/mcp/reload-signal.ts +1 -1
  287. package/src/mcp/workspace-mcp-config.ts +1 -23
  288. package/src/messaging/draft-store.ts +1 -1
  289. package/src/monitoring/__tests__/active-conversations.test.ts +1 -1
  290. package/src/monitoring/__tests__/page-cache.test.ts +1 -1
  291. package/src/monitoring/__tests__/stall-capture.test.ts +1 -1
  292. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +1 -1
  293. package/src/monitoring/active-conversations.ts +1 -1
  294. package/src/monitoring/control.ts +1 -1
  295. package/src/monitoring/daemon-boot-time.ts +1 -1
  296. package/src/monitoring/daemon-heartbeat.ts +1 -1
  297. package/src/monitoring/page-cache.ts +1 -1
  298. package/src/monitoring/plugin-auto-update.ts +1 -7
  299. package/src/monitoring/plugin-source-watch.ts +1 -1
  300. package/src/monitoring/recovery/db.ts +1 -1
  301. package/src/monitoring/recovery/inflight-content.ts +1 -1
  302. package/src/monitoring/resource-sampler.ts +3 -14
  303. package/src/monitoring/stall-capture.ts +1 -1
  304. package/src/monitoring/worker.ts +9 -76
  305. package/src/monitoring/workspace-git-heartbeat.ts +1 -1
  306. package/src/oauth/connect-orchestrator.ts +4 -4
  307. package/src/permissions/checker.ts +1 -1
  308. package/src/permissions/workspace-policy.ts +1 -1
  309. package/src/persistence/__tests__/main-db-readonly-probe.ts +27 -52
  310. package/src/persistence/__tests__/message-content-file.test.ts +1 -1
  311. package/src/persistence/__tests__/slow-sync-log.test.ts +0 -2
  312. package/src/persistence/attachments-store.ts +1 -1
  313. package/src/persistence/conversation-crud.ts +1 -38
  314. package/src/persistence/conversation-directories.ts +1 -1
  315. package/src/persistence/conversation-types.ts +0 -8
  316. package/src/persistence/db-async-query.ts +1 -1
  317. package/src/persistence/db-connection.ts +11 -1
  318. package/src/persistence/db-init.ts +1 -1
  319. package/src/persistence/db-maintenance.ts +1 -1
  320. package/src/persistence/embeddings/__tests__/embedding-local-lifecycle.test.ts +1 -1
  321. package/src/persistence/embeddings/embedding-local.ts +4 -4
  322. package/src/persistence/embeddings/embedding-runtime-manager.ts +1 -1
  323. package/src/persistence/embeddings/qdrant-client.ts +1 -1
  324. package/src/persistence/embeddings/qdrant-manager.ts +1 -1
  325. package/src/persistence/job-handlers/__tests__/message-lexical-backfill.test.ts +1 -1
  326. package/src/persistence/job-handlers/__tests__/message-lexical-enqueue.test.ts +1 -1
  327. package/src/persistence/job-handlers/cleanup.ts +8 -17
  328. package/src/persistence/llm-usage-store.ts +2 -229
  329. package/src/persistence/message-content-file.ts +1 -1
  330. package/src/persistence/migrations/209-strip-thinking-from-consolidated.ts +1 -1
  331. package/src/persistence/migrations/222-strip-placeholder-sentinels-from-messages.ts +1 -1
  332. package/src/persistence/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +1 -1
  333. package/src/persistence/migrations/306-rewrite-frontier-profile-pins.test.ts +1 -1
  334. package/src/persistence/migrations/329-move-onboarding-events-to-telemetry-db.test.ts +13 -0
  335. package/src/persistence/migrations/330-move-auth-fallback-events-to-telemetry-db.test.ts +13 -0
  336. package/src/persistence/migrations/331-move-lifecycle-events-to-telemetry-db.test.ts +13 -0
  337. package/src/persistence/migrations/332-move-skill-loaded-events-to-telemetry-db.test.ts +13 -0
  338. package/src/persistence/migrations/333-create-telemetry-events-table.test.ts +7 -4
  339. package/src/persistence/migrations/334-backfill-telemetry-events-outbox.test.ts +13 -0
  340. package/src/persistence/migrations/387-drop-telemetry-tables.ts +51 -0
  341. package/src/persistence/migrations/__tests__/327-create-flush-checkpoints.test.ts +9 -1
  342. package/src/persistence/migrations/__tests__/387-drop-telemetry-tables.test.ts +79 -0
  343. package/src/persistence/migrations/helpers/relocation.ts +1 -1
  344. package/src/persistence/migrations/run-migrations.ts +1 -1
  345. package/src/persistence/migrations/validate-migration-state.ts +1 -1
  346. package/src/persistence/raw-query.ts +1 -29
  347. package/src/persistence/slow-sync-log.ts +0 -23
  348. package/src/persistence/steps.ts +2 -0
  349. package/src/{telemetry → persistence}/tool-audit.ts +6 -121
  350. package/src/plugin-api/index.ts +1 -1
  351. package/src/plugin-api/plugin-name-env.ts +1 -1
  352. package/src/plugins/__tests__/installed-plugin-dirs.test.ts +1 -1
  353. package/src/plugins/collect-source-versions.ts +1 -1
  354. package/src/plugins/defaults/channel/package.json +1 -1
  355. package/src/plugins/defaults/cloud-hosted/package.json +1 -1
  356. package/src/plugins/defaults/compaction/package.json +1 -1
  357. package/src/plugins/defaults/documents/package.json +1 -1
  358. package/src/plugins/defaults/empty-response/package.json +1 -1
  359. package/src/plugins/defaults/exploration-drift/package.json +1 -1
  360. package/src/plugins/defaults/image-fallback/package.json +1 -1
  361. package/src/plugins/defaults/image-recovery/package.json +1 -1
  362. package/src/plugins/defaults/max-tokens-continue/package.json +1 -1
  363. package/src/plugins/defaults/memory/__tests__/db-async-query.test.ts +1 -1
  364. package/src/plugins/defaults/memory/__tests__/db-maintenance.test.ts +1 -1
  365. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +0 -82
  366. package/src/plugins/defaults/memory/__tests__/memory-retrospective-skill-card.test.ts +0 -41
  367. package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -2
  368. package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -52
  369. package/src/plugins/defaults/memory/memory-retrospective-skill-card.ts +0 -18
  370. package/src/plugins/defaults/memory/package.json +1 -1
  371. package/src/plugins/defaults/memory/paths.ts +4 -4
  372. package/src/plugins/defaults/memory/src/__tests__/memory-worker-routes.test.ts +1 -1
  373. package/src/plugins/defaults/memory/src/memory-v2-routes.ts +5 -5
  374. package/src/plugins/defaults/memory/src/memory-v3-routes.ts +0 -207
  375. package/src/plugins/defaults/memory/src/memory-worker-routes.ts +1 -1
  376. package/src/plugins/defaults/memory/startup.ts +1 -22
  377. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +2 -253
  378. package/src/plugins/defaults/memory/v3/orchestrate.ts +5 -129
  379. package/src/plugins/defaults/memory/worker-control.ts +1 -1
  380. package/src/plugins/defaults/memory/worker.ts +2 -2
  381. package/src/plugins/defaults/session/package.json +1 -1
  382. package/src/plugins/defaults/surface-completion-nudge/package.json +1 -1
  383. package/src/plugins/defaults/task-progress/package.json +1 -1
  384. package/src/plugins/defaults/task-progress-nudge/package.json +1 -1
  385. package/src/plugins/defaults/title-generate/package.json +1 -1
  386. package/src/plugins/defaults/tool-error/package.json +1 -1
  387. package/src/plugins/defaults/tool-result-truncate/package.json +1 -1
  388. package/src/plugins/defaults/turn-context/package.json +1 -1
  389. package/src/plugins/defaults/workspace/injectors.ts +1 -1
  390. package/src/plugins/defaults/workspace/package.json +1 -1
  391. package/src/plugins/disabled-state.ts +1 -1
  392. package/src/plugins/ensure-plugin-api-shim.ts +1 -1
  393. package/src/plugins/ensure-shared-dep-links.ts +1 -1
  394. package/src/plugins/installed-plugin-dirs.ts +1 -1
  395. package/src/plugins/mcp-servers.ts +7 -9
  396. package/src/plugins/mtime-cache.ts +2 -2
  397. package/src/plugins/source-versions.ts +1 -1
  398. package/src/prompts/bootstrap-cleanup.ts +1 -1
  399. package/src/prompts/persona-resolver.ts +1 -1
  400. package/src/prompts/sections.ts +2 -2
  401. package/src/prompts/system-prompt.ts +10 -42
  402. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +0 -37
  403. package/src/providers/__tests__/cadet-connection-routing.test.ts +2 -2
  404. package/src/providers/cadet/client.ts +1 -1
  405. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +1 -1
  406. package/src/providers/inference/adapter-factory.ts +1 -1
  407. package/src/providers/inference/backfill.ts +3 -10
  408. package/src/providers/inference/profile-probe.ts +1 -1
  409. package/src/providers/retry.ts +0 -2
  410. package/src/providers/types.ts +0 -7
  411. package/src/providers/usage-tracking.ts +1 -1
  412. package/src/routes/__tests__/route-host.test.ts +1 -1
  413. package/src/routes/control.ts +1 -1
  414. package/src/routes/route-host-client.ts +1 -1
  415. package/src/routes/worker.ts +2 -2
  416. package/src/runtime/agent-wake.ts +1 -1
  417. package/src/runtime/assistant-stream-state.ts +1 -1
  418. package/src/runtime/auth/token-service.ts +1 -1
  419. package/src/runtime/background-job-runner.ts +1 -1
  420. package/src/runtime/middleware/twilio-validation.ts +2 -2
  421. package/src/runtime/routes/__tests__/app-pin-routes.test.ts +1 -1
  422. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +1 -1
  423. package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +3 -33
  424. package/src/runtime/routes/__tests__/cloud-credits-routes.test.ts +5 -4
  425. package/src/runtime/routes/__tests__/cloud-invoice-routes.test.ts +4 -3
  426. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +72 -298
  427. package/src/runtime/routes/__tests__/default-plugin-routes.test.ts +1 -1
  428. package/src/runtime/routes/__tests__/deprecated-route-context.test.ts +15 -62
  429. package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +105 -12
  430. package/src/runtime/routes/__tests__/ingress-status-routes.test.ts +1 -1
  431. package/src/runtime/routes/__tests__/monitoring-routes.test.ts +1 -1
  432. package/src/runtime/routes/__tests__/plugins-routes.test.ts +47 -211
  433. package/src/runtime/routes/__tests__/route-host-worker-routes.test.ts +1 -1
  434. package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +1 -1
  435. package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +1 -1
  436. package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +1 -1
  437. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +1 -1
  438. package/src/runtime/routes/__tests__/user-routes-cli.test.ts +1 -1
  439. package/src/runtime/routes/__tests__/user-routes-notices.test.ts +1 -1
  440. package/src/runtime/routes/__tests__/user-routes-request.test.ts +1 -1
  441. package/src/runtime/routes/app-management-routes.ts +1 -1
  442. package/src/runtime/routes/attachment-routes.ts +1 -1
  443. package/src/runtime/routes/audit-routes.ts +1 -1
  444. package/src/runtime/routes/avatar-routes.ts +3 -10
  445. package/src/runtime/routes/cloud-routes.ts +3 -3
  446. package/src/runtime/routes/content-source-routes.ts +1 -1
  447. package/src/runtime/routes/conversation-query-routes.ts +49 -706
  448. package/src/runtime/routes/conversation-routes.ts +1 -38
  449. package/src/runtime/routes/debug-routes.ts +1 -1
  450. package/src/runtime/routes/deprecated-route-context.ts +5 -61
  451. package/src/runtime/routes/heartbeat-routes.ts +1 -1
  452. package/src/runtime/routes/identity-routes.ts +1 -1
  453. package/src/runtime/routes/index.ts +0 -6
  454. package/src/runtime/routes/inference-profile-session-handler.ts +3 -3
  455. package/src/runtime/routes/inference-profiles-routes.ts +48 -21
  456. package/src/runtime/routes/inference-provider-connection-routes.ts +0 -1
  457. package/src/runtime/routes/llm-call-sites-routes.ts +3 -3
  458. package/src/runtime/routes/log-export/__tests__/installed-inventory.test.ts +1 -1
  459. package/src/runtime/routes/log-export/__tests__/workspace-allowlist-error-contract.test.ts +1 -1
  460. package/src/runtime/routes/log-export/__tests__/workspace-allowlist.test.ts +1 -1
  461. package/src/runtime/routes/log-export/workspace-allowlist.ts +1 -1
  462. package/src/runtime/routes/log-export-routes.ts +17 -15
  463. package/src/runtime/routes/migration-rollback-routes.ts +1 -1
  464. package/src/runtime/routes/migration-routes.ts +2 -3
  465. package/src/runtime/routes/monitoring-routes.ts +2 -2
  466. package/src/runtime/routes/oauth-providers.ts +5 -5
  467. package/src/runtime/routes/plugins-routes.ts +38 -163
  468. package/src/runtime/routes/profiler-routes.ts +1 -1
  469. package/src/runtime/routes/route-host-worker-routes.ts +1 -1
  470. package/src/runtime/routes/sanity-routes.ts +1 -1
  471. package/src/runtime/routes/schedule-routes.ts +1 -1
  472. package/src/runtime/routes/schedule-worker-routes.ts +1 -1
  473. package/src/runtime/routes/settings-routes.ts +1 -1
  474. package/src/runtime/routes/sounds-config-routes.ts +1 -1
  475. package/src/runtime/routes/surface-conversation-resolver.ts +1 -7
  476. package/src/runtime/routes/user-route-dispatcher.ts +1 -3
  477. package/src/runtime/routes/user-route-import.ts +1 -1
  478. package/src/runtime/routes/user-route-resolution.ts +1 -1
  479. package/src/runtime/routes/user-routes-cli.ts +1 -1
  480. package/src/runtime/routes/workspace-commit-routes.ts +1 -1
  481. package/src/runtime/routes/workspace-greetings.ts +1 -1
  482. package/src/runtime/routes/workspace-routes.ts +1 -1
  483. package/src/runtime/routes/workspace-utils.ts +1 -1
  484. package/src/runtime/sync/resource-sync-events.ts +1 -1
  485. package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +1 -1
  486. package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +1 -1
  487. package/src/schedule/plugin-schedule-availability.ts +1 -1
  488. package/src/schedule/plugin-schedule-declarations.ts +1 -1
  489. package/src/schedule/run-script.ts +1 -1
  490. package/src/schedule/scheduler.ts +1 -11
  491. package/src/schedule/worker-control.ts +1 -1
  492. package/src/schedule/worker.ts +3 -3
  493. package/src/security/oauth2.ts +2 -2
  494. package/src/security/secret-allowlist.ts +1 -1
  495. package/src/signals/cancel.ts +1 -1
  496. package/src/signals/conversation-undo.ts +1 -1
  497. package/src/signals/emit-event.ts +1 -1
  498. package/src/signals/event-stream.ts +1 -1
  499. package/src/signals/user-message.ts +1 -1
  500. package/src/skills/catalog-install.ts +2 -1
  501. package/src/skills/clawhub.ts +1 -1
  502. package/src/skills/cloud-store.ts +1 -1
  503. package/src/skills/path-classifier.ts +1 -1
  504. package/src/skills/skill-history.ts +1 -1
  505. package/src/skills/skillssh-registry.ts +1 -1
  506. package/src/skills/uninstall.ts +1 -1
  507. package/src/skills/workspace-skill-md-signature.ts +1 -1
  508. package/src/subagent/manager.ts +1 -1
  509. package/src/theme/workspace-theme.ts +1 -1
  510. package/src/tools/browser/auth-cache.ts +1 -1
  511. package/src/tools/browser/browser-manager.ts +1 -1
  512. package/src/tools/browser/runtime-check.ts +1 -1
  513. package/src/tools/executor.ts +4 -4
  514. package/src/tools/filesystem/write.ts +1 -1
  515. package/src/tools/permission-checker.ts +2 -51
  516. package/src/tools/run-standalone.ts +1 -1
  517. package/src/tools/skills/format-input-schema.ts +1 -1
  518. package/src/tools/skills/load.ts +1 -1
  519. package/src/tools/skills/scaffold-cloud.ts +0 -32
  520. package/src/tools/terminal/safe-env.ts +1 -2
  521. package/src/tools/terminal/sanitized-bash.ts +1 -1
  522. package/src/tools/terminal/shell.ts +1 -1
  523. package/src/tools/tool-approval-handler.ts +4 -1
  524. package/src/tools/workflows/manage-workflows.ts +2 -2
  525. package/src/tools/workflows/run-workflow.test.ts +1 -1
  526. package/src/tools/workspace-tools/loader.ts +1 -1
  527. package/src/tts/synthesis-stream.ts +2 -2
  528. package/src/usage/attribution.ts +1 -11
  529. package/src/util/browser.ts +1 -1
  530. package/src/util/bun-runtime.ts +2 -1
  531. package/src/util/device-id.ts +1 -1
  532. package/src/util/disk-usage.ts +4 -139
  533. package/src/util/layout.ts +3 -3
  534. package/src/util/logger.ts +1 -1
  535. package/src/util/logs-db-path.ts +1 -1
  536. package/src/util/memory-db-path.ts +1 -1
  537. package/src/util/{platform.ts → os.ts} +5 -30
  538. package/src/util/process-tree.ts +19 -0
  539. package/src/util/sqlite3-runtime.ts +1 -1
  540. package/src/util/telemetry-db-path.ts +1 -1
  541. package/src/watcher/__tests__/engine.test.ts +0 -23
  542. package/src/watcher/engine.ts +0 -7
  543. package/src/windows-compiled-cli.ts +0 -4
  544. package/src/windows-compiled-worker-entry.ts +0 -6
  545. package/src/workflows/leaf-runner.test.ts +1 -1
  546. package/src/workflows/leaf-runner.ts +1 -1
  547. package/src/workflows/library.ts +1 -1
  548. package/src/workspace/adaptive-thinking-repair.ts +5 -24
  549. package/src/workspace/byok-default-profile-ensure.ts +24 -26
  550. package/src/workspace/custom-profile-ensure.ts +2 -2
  551. package/src/workspace/git-service.ts +1 -1
  552. package/src/workspace/hatched-date.ts +1 -1
  553. package/src/workspace/migrations/038-unify-llm-callsite-configs.ts +2 -2
  554. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +1 -1
  555. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +1 -1
  556. package/src/workspace/migrations/077-seed-memory-router-callsite.ts +1 -1
  557. package/src/workspace/migrations/registry.ts +0 -4
  558. package/src/workspace/turn-commit.ts +1 -1
  559. package/docs/activation-funnel-telemetry.md +0 -324
  560. package/scripts/bundled-plugin-packages.ts +0 -154
  561. package/scripts/generate-bundled-plugin-packages.ts +0 -29
  562. package/src/__tests__/activation-early-marking.test.ts +0 -114
  563. package/src/__tests__/auth-fallback-events-store.test.ts +0 -99
  564. package/src/__tests__/config-get-vision-flag.test.ts +0 -139
  565. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +0 -400
  566. package/src/__tests__/internal-telemetry-routes.test.ts +0 -213
  567. package/src/__tests__/telemetry-routes.test.ts +0 -182
  568. package/src/__tests__/turn-events-store.test.ts +0 -376
  569. package/src/__tests__/ui-channel-variants.test.ts +0 -53
  570. package/src/avatar/__tests__/avatar-changed-telemetry.test.ts +0 -217
  571. package/src/avatar/avatar-changed-telemetry.ts +0 -128
  572. package/src/calls/__tests__/call-funnel-telemetry.test.ts +0 -204
  573. package/src/cli/commands/telemetry.help.ts +0 -27
  574. package/src/cli/commands/telemetry.ts +0 -83
  575. package/src/cli/lib/__tests__/local-plugin-upgrade.test.ts +0 -251
  576. package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +0 -113
  577. package/src/cli/lib/__tests__/plugin-marketplace.test.ts +0 -384
  578. package/src/cli/lib/__tests__/plugin-pin-history.test.ts +0 -164
  579. package/src/cli/lib/__tests__/plugins-install-offline.test.ts +0 -228
  580. package/src/cli/lib/bundled-marketplace.json +0 -1575
  581. package/src/cli/lib/bundled-plugin-packages.json +0 -827
  582. package/src/cli/lib/bundled-plugin-packages.ts +0 -87
  583. package/src/cli/lib/plugin-catalog-local.ts +0 -94
  584. package/src/cli/lib/plugin-pin-history.ts +0 -276
  585. package/src/cloud/feature-gate.ts +0 -8
  586. package/src/config/__tests__/cloud-rehydration.test.ts +0 -180
  587. package/src/config/cloud-rehydration.ts +0 -35
  588. package/src/daemon/__tests__/auto-profile-router.test.ts +0 -380
  589. package/src/daemon/auto-profile-router.ts +0 -428
  590. package/src/live-voice/__tests__/live-voice-session-telemetry.test.ts +0 -391
  591. package/src/monitoring/__tests__/db-integrity-sample.test.ts +0 -113
  592. package/src/monitoring/__tests__/oom-kill-reporter.test.ts +0 -374
  593. package/src/monitoring/db-integrity-check.ts +0 -163
  594. package/src/monitoring/db-integrity-sample.ts +0 -176
  595. package/src/monitoring/oom-kill-reporter.ts +0 -469
  596. package/src/onboarding/__tests__/onboarding-events-store.test.ts +0 -158
  597. package/src/onboarding/onboarding-events-store.ts +0 -296
  598. package/src/persistence/__tests__/raw-query-telemetry.test.ts +0 -76
  599. package/src/persistence/lifecycle-events-store.test.ts +0 -134
  600. package/src/persistence/lifecycle-events-store.ts +0 -110
  601. package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +0 -76
  602. package/src/plugins/defaults/memory/activation-session-store.ts +0 -50
  603. package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +0 -281
  604. package/src/runtime/routes/auto-profile-routes.ts +0 -83
  605. package/src/runtime/routes/internal-telemetry-routes.ts +0 -142
  606. package/src/runtime/routes/telemetry-routes.ts +0 -274
  607. package/src/security/auth-fallback-events-store.ts +0 -57
  608. package/src/telemetry/__tests__/activation-funnel.test.ts +0 -95
  609. package/src/telemetry/__tests__/config-setting-events-store.test.ts +0 -63
  610. package/src/telemetry/__tests__/config-setting-snapshot.test.ts +0 -143
  611. package/src/telemetry/__tests__/flush-checkpoints.test.ts +0 -56
  612. package/src/telemetry/__tests__/live-voice-funnel.test.ts +0 -174
  613. package/src/telemetry/__tests__/outbox-test-harness.ts +0 -85
  614. package/src/telemetry/__tests__/phone-call-funnel.test.ts +0 -72
  615. package/src/telemetry/__tests__/telemetry-event-fixtures.ts +0 -282
  616. package/src/telemetry/__tests__/watchdog-events-store.test.ts +0 -71
  617. package/src/telemetry/activation-funnel.ts +0 -172
  618. package/src/telemetry/config-setting-events-store.ts +0 -40
  619. package/src/telemetry/config-setting-snapshot.ts +0 -170
  620. package/src/telemetry/flush-checkpoints.ts +0 -70
  621. package/src/telemetry/live-voice-funnel.ts +0 -185
  622. package/src/telemetry/memory-corpus-size.test.ts +0 -120
  623. package/src/telemetry/memory-corpus-size.ts +0 -184
  624. package/src/telemetry/memory-tier-reporter.test.ts +0 -195
  625. package/src/telemetry/memory-tier-reporter.ts +0 -130
  626. package/src/telemetry/phone-call-funnel.ts +0 -144
  627. package/src/telemetry/skill-loaded-events-store.test.ts +0 -93
  628. package/src/telemetry/skill-loaded-events-store.ts +0 -39
  629. package/src/telemetry/telemetry-event-sources.test.ts +0 -223
  630. package/src/telemetry/telemetry-event-sources.ts +0 -597
  631. package/src/telemetry/telemetry-events-outbox.test.ts +0 -375
  632. package/src/telemetry/telemetry-events-outbox.ts +0 -237
  633. package/src/telemetry/telemetry-main-db.ts +0 -48
  634. package/src/telemetry/telemetry-wire-source.json +0 -4
  635. package/src/telemetry/telemetry-wire-validation.test.ts +0 -157
  636. package/src/telemetry/telemetry-wire-validation.ts +0 -162
  637. package/src/telemetry/telemetry-wire.generated.ts +0 -483
  638. package/src/telemetry/tool-executed-events-store.test.ts +0 -210
  639. package/src/telemetry/tool-executed-events-store.ts +0 -102
  640. package/src/telemetry/trace-collection-policy.test.ts +0 -28
  641. package/src/telemetry/trace-collection-policy.ts +0 -30
  642. package/src/telemetry/turn-events-store.ts +0 -216
  643. package/src/telemetry/turn-trace-store.test.ts +0 -884
  644. package/src/telemetry/turn-trace-store.ts +0 -399
  645. package/src/telemetry/types.test.ts +0 -38
  646. package/src/telemetry/types.ts +0 -780
  647. package/src/telemetry/usage-telemetry-reporter.test.ts +0 -3445
  648. package/src/telemetry/usage-telemetry-reporter.ts +0 -566
  649. package/src/telemetry/watchdog-direct-emit.test.ts +0 -112
  650. package/src/telemetry/watchdog-direct-emit.ts +0 -104
  651. package/src/telemetry/watchdog-events-store.ts +0 -31
  652. package/src/tools/ui-surface/channel-variants.ts +0 -52
  653. package/src/watcher/__tests__/telemetry.test.ts +0 -178
  654. package/src/watcher/telemetry.ts +0 -93
  655. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +0 -165
  656. package/src/workspace/migrations/104-recheck-adaptive-thinking-model-implied-anthropic.ts +0 -151
  657. /package/src/{telemetry → persistence}/tool-usage-store.ts +0 -0
  658. /package/src/{telemetry → persistence}/turn-outcome.ts +0 -0
@@ -1,483 +0,0 @@
1
- // GENERATED FILE — DO NOT EDIT BY HAND.
2
- // Source of truth: django/app/assistant/self_hosted_local/serializers.py
3
- // Regenerate with `make generate-telemetry-wire` (run from `django/`).
4
- //
5
- // This file must stay deterministic — never embed timestamps or commit SHAs —
6
- // so regeneration is diff-stable and CI can enforce freshness.
7
-
8
- import { z } from "zod";
9
-
10
- export type JsonValue =
11
- | string
12
- | number
13
- | boolean
14
- | null
15
- | JsonValue[]
16
- | { [key: string]: JsonValue };
17
- export const jsonValueSchema: z.ZodType<JsonValue> = z.lazy(() =>
18
- z.union([
19
- z.string(),
20
- z.number(),
21
- z.boolean(),
22
- z.null(),
23
- z.array(jsonValueSchema),
24
- z.record(z.string(), jsonValueSchema),
25
- ]),
26
- );
27
-
28
- // Byte length of the JSON serialization as the SERVER measures it: Python
29
- // `json.dumps(value, separators=(",", ":"))` with the default
30
- // `ensure_ascii=True`, then UTF-8-encoded. ensure_ascii escapes every code
31
- // point above 0x7E (including 0x7F DEL) as a 6-byte `\uXXXX` sequence —
32
- // astral chars become surrogate pairs, i.e. two escapes, 12 bytes — so the
33
- // escaped JSON is pure ASCII and its byte length equals its character count.
34
- // JSON.stringify already escapes quotes, backslashes, and ASCII control
35
- // chars identically to Python, so replacing each remaining UTF-16 code unit
36
- // above 0x7E with a six-char placeholder reproduces the server's byte count
37
- // exactly. Counting raw UTF-8 instead would undercount non-ASCII text ~3x
38
- // and let payloads through that the server silently drops.
39
- const jsonByteLength = (v: unknown): number =>
40
- JSON.stringify(v).replace(/[^\x00-\x7e]/g, "\\uxxxx").length;
41
-
42
- // ---- Server-side ingest bounds ----
43
- // Introspected from the ingest serializer class attributes at
44
- // generation time, so a server-side bump regenerates automatically.
45
- // A daemon-sent event violating a bound below is REJECTED by ingest
46
- // (logged server-side, silently dropped from the daemon's point of
47
- // view) — except `trace`, see TURN_TRACE_MAX_JSON_BYTES.
48
- export const TURN_CLIENT_MAX_KEYS = 16;
49
- export const TURN_CLIENT_MAX_KEY_LEN = 64;
50
- export const TURN_CLIENT_MAX_VALUE_LEN = 256;
51
- export const TURN_CLIENT_MAX_JSON_BYTES = 2048;
52
- // The server does NOT reject a turn event whose `trace` exceeds this
53
- // bound: it drops (nulls) the trace and keeps the event (see
54
- // TurnTelemetryEventSerializer.validate_trace). Client-side rejection
55
- // would therefore be wrong, so there is deliberately no `trace`
56
- // refinement on the turn schema. The daemon may use this constant to
57
- // pre-trim a trace it would rather not lose.
58
- export const TURN_TRACE_MAX_JSON_BYTES = 262144;
59
- export const WATCHDOG_DETAIL_MAX_JSON_BYTES = 4096;
60
- export const ONBOARDING_RESEARCH_CLAIMS_MAX_JSON_BYTES = 8192;
61
- export const ONBOARDING_RESEARCH_SUGGESTIONS_MAX_JSON_BYTES = 8192;
62
-
63
- export const llmUsageTelemetryEventSchema = z.object({
64
- type: z.literal("llm_usage"),
65
- daemon_event_id: z.string().trim().min(1).max(128),
66
- recorded_at: z.number().int(),
67
- assistant_version: z.string().trim().min(1).max(64).nullable().optional(),
68
- provider: z.string().trim().min(1).max(64),
69
- model: z.string().trim().min(1).max(128),
70
- llm_call_site: z.string().trim().min(1).max(255).nullable().optional(),
71
- inference_profile: z.string().trim().min(1).max(255).nullable().optional(),
72
- inference_profile_source: z
73
- .string()
74
- .trim()
75
- .min(1)
76
- .max(255)
77
- .nullable()
78
- .optional(),
79
- input_tokens: z.number().int().min(0),
80
- output_tokens: z.number().int().min(0),
81
- cache_creation_input_tokens: z.number().int().min(0).nullable().optional(),
82
- raw_usage: jsonValueSchema.nullable().optional(),
83
- cache_read_input_tokens: z.number().int().min(0).nullable().optional(),
84
- actor: z.string().trim().min(1).max(64),
85
- cost: z.number().min(0).nullable().optional(),
86
- conversation_id: z.string().trim().min(1).max(64).nullable().optional(),
87
- conversation_type: z.string().trim().min(1).max(32).nullable().optional(),
88
- turn_index: z.number().int().min(0).nullable().optional(),
89
- llm_call_count: z.number().int().min(1).nullable().optional(),
90
- parent_conversation_id: z
91
- .string()
92
- .trim()
93
- .min(1)
94
- .max(64)
95
- .nullable()
96
- .optional(),
97
- parent_turn_index: z.number().int().min(0).nullable().optional(),
98
- subagent_role: z.string().trim().min(1).max(64).nullable().optional(),
99
- subagent_spawn_mode: z.string().trim().min(1).max(64).nullable().optional(),
100
- cron_run_id: z.string().trim().min(1).max(64).nullable().optional(),
101
- });
102
- export type LlmUsageTelemetryEvent = z.infer<
103
- typeof llmUsageTelemetryEventSchema
104
- >;
105
-
106
- export const turnTelemetryEventSchema = z
107
- .object({
108
- type: z.literal("turn"),
109
- daemon_event_id: z.string().trim().min(1).max(128),
110
- recorded_at: z.number().int(),
111
- assistant_version: z.string().trim().min(1).max(64).nullable().optional(),
112
- conversation_type: z.string().trim().min(1).max(32).nullable().optional(),
113
- conversation_id: z.string().trim().min(1).max(64).nullable().optional(),
114
- turn_index: z.number().int().min(1).nullable().optional(),
115
- interface_id: z.string().trim().min(1).max(64).nullable().optional(),
116
- channel_id: z.string().trim().min(1).max(64).nullable().optional(),
117
- client: z.record(z.string(), jsonValueSchema).nullable().optional(),
118
- outcome: z.string().trim().min(1).max(32).nullable().optional(),
119
- batched_into: z.string().trim().min(1).max(64).nullable().optional(),
120
- failure_code: z.string().trim().min(1).max(64).nullable().optional(),
121
- scripted: z.boolean().nullable().optional(),
122
- trace: jsonValueSchema.nullable().optional(),
123
- })
124
- .superRefine((val, ctx) => {
125
- // Mirrors the server's TurnTelemetryEventSerializer.validate_client —
126
- // a `client` bag violating these bounds is rejected by ingest (the
127
- // event is silently dropped, never the whole batch).
128
- if (val.client === null || val.client === undefined) {
129
- return;
130
- }
131
- const entries = Object.entries(val.client);
132
- if (entries.length > TURN_CLIENT_MAX_KEYS) {
133
- ctx.addIssue({
134
- code: "custom",
135
- path: ["client"],
136
- message: `\`client\` may have at most ${TURN_CLIENT_MAX_KEYS} keys; got ${entries.length}.`,
137
- });
138
- }
139
- for (const [key, value] of entries) {
140
- if (key.length > TURN_CLIENT_MAX_KEY_LEN) {
141
- ctx.addIssue({
142
- code: "custom",
143
- path: ["client", key],
144
- message: `\`client\` keys must be strings of at most ${TURN_CLIENT_MAX_KEY_LEN} chars.`,
145
- });
146
- }
147
- if (typeof value === "object" && value !== null) {
148
- ctx.addIssue({
149
- code: "custom",
150
- path: ["client", key],
151
- message: `\`client\` values must be primitives (string / number / boolean / null), not nested objects or arrays.`,
152
- });
153
- }
154
- if (
155
- typeof value === "string" &&
156
- value.length > TURN_CLIENT_MAX_VALUE_LEN
157
- ) {
158
- ctx.addIssue({
159
- code: "custom",
160
- path: ["client", key],
161
- message: `\`client\` string values must be at most ${TURN_CLIENT_MAX_VALUE_LEN} chars.`,
162
- });
163
- }
164
- }
165
- if (jsonByteLength(val.client) > TURN_CLIENT_MAX_JSON_BYTES) {
166
- ctx.addIssue({
167
- code: "custom",
168
- path: ["client"],
169
- message: `\`client\` JSON exceeds ${TURN_CLIENT_MAX_JSON_BYTES} bytes when serialized.`,
170
- });
171
- }
172
- });
173
- export type TurnTelemetryEvent = z.infer<typeof turnTelemetryEventSchema>;
174
-
175
- export const lifecycleTelemetryEventSchema = z.object({
176
- type: z.literal("lifecycle"),
177
- daemon_event_id: z.string().trim().min(1).max(128),
178
- recorded_at: z.number().int(),
179
- assistant_version: z.string().trim().min(1).max(64).nullable().optional(),
180
- event_name: z.string().trim().min(1).max(64),
181
- tool_name: z.string().trim().min(1).max(255).optional(),
182
- risk_level: z.string().trim().min(1).max(32).optional(),
183
- risk_threshold: z.string().trim().min(1).max(32).optional(),
184
- surface: z.string().trim().min(1).max(64).optional(),
185
- conversation_id: z.string().trim().min(1).max(128).optional(),
186
- });
187
- export type LifecycleTelemetryEvent = z.infer<
188
- typeof lifecycleTelemetryEventSchema
189
- >;
190
-
191
- export const onboardingTelemetryEventSchema = z
192
- .object({
193
- type: z.literal("onboarding"),
194
- daemon_event_id: z.string().trim().min(1).max(128),
195
- recorded_at: z.number().int(),
196
- assistant_version: z.string().trim().min(1).max(64).nullable().optional(),
197
- screen: z.string().trim().min(1).max(64).optional(),
198
- tools: z.array(z.string().trim().min(1).max(128)).optional(),
199
- tasks: z.array(z.string().trim().min(1).max(128)).optional(),
200
- tone: z.string().trim().min(1).max(64).optional(),
201
- google_connected: z.boolean().optional(),
202
- google_scopes: z.array(z.string().trim().min(1).max(256)).optional(),
203
- ab_variant: z.string().trim().min(1).max(64).optional(),
204
- session_id: z.string().trim().min(1).max(128).optional(),
205
- step_name: z.string().trim().min(1).max(128).optional(),
206
- step_index: z.number().int().min(0).optional(),
207
- completed_at: z.string().trim().min(1).max(64).optional(),
208
- funnel_version: z.string().trim().min(1).max(128).optional(),
209
- user_id: z.string().trim().min(1).max(64).nullable().optional(),
210
- outcome: z.string().trim().min(1).max(32).optional(),
211
- })
212
- .superRefine((val, ctx) => {
213
- // Mirrors the server's OnboardingTelemetryEventSerializer.validate —
214
- // an onboarding event needs either a non-empty legacy `screen` or the
215
- // COMPLETE pre-chat funnel step field set; anything else is rejected
216
- // by ingest (silently dropped).
217
- const hasLegacyScreenEvent = Boolean(val.screen);
218
- const hasStepEvent = [
219
- val.session_id,
220
- val.step_name,
221
- val.step_index,
222
- val.completed_at,
223
- val.funnel_version,
224
- val.ab_variant,
225
- ].every((field) => field !== null && field !== undefined);
226
- if (!hasLegacyScreenEvent && !hasStepEvent) {
227
- ctx.addIssue({
228
- code: "custom",
229
- message:
230
- "Onboarding telemetry requires either `screen` or the complete pre-chat funnel step fields.",
231
- });
232
- }
233
- });
234
- export type OnboardingTelemetryEvent = z.infer<
235
- typeof onboardingTelemetryEventSchema
236
- >;
237
-
238
- export const authFallbackTelemetryEventSchema = z.object({
239
- type: z.literal("auth_fallback"),
240
- daemon_event_id: z.string().trim().min(1).max(128),
241
- recorded_at: z.number().int(),
242
- assistant_version: z.string().trim().min(1).max(64).nullable().optional(),
243
- guard: z.string().trim().min(1).max(64),
244
- failure_kind: z.string().trim().min(1).max(64),
245
- path: z.string().trim().min(1).max(2048),
246
- count: z.number().int().min(0),
247
- window_start: z.number().int().min(0),
248
- window_end: z.number().int().min(0),
249
- });
250
- export type AuthFallbackTelemetryEvent = z.infer<
251
- typeof authFallbackTelemetryEventSchema
252
- >;
253
-
254
- export const toolExecutedTelemetryEventSchema = z.object({
255
- provider: z.string().trim().min(1).max(64).nullable().optional(),
256
- model: z.string().trim().min(1).max(128).nullable().optional(),
257
- inference_profile: z.string().trim().min(1).max(255).nullable().optional(),
258
- inference_profile_source: z
259
- .string()
260
- .trim()
261
- .min(1)
262
- .max(255)
263
- .nullable()
264
- .optional(),
265
- type: z.literal("tool_executed"),
266
- daemon_event_id: z.string().trim().min(1).max(128),
267
- recorded_at: z.number().int(),
268
- assistant_version: z.string().trim().min(1).max(64).nullable().optional(),
269
- tool_name: z.string().trim().min(1).max(255),
270
- status: z.string().trim().min(1).max(32),
271
- duration_ms: z.number().int().min(0).nullable().optional(),
272
- arg_bytes: z.number().int().min(0).nullable().optional(),
273
- result_bytes: z.number().int().min(0).nullable().optional(),
274
- conversation_id: z.string().trim().min(1).max(128).nullable().optional(),
275
- });
276
- export type ToolExecutedTelemetryEvent = z.infer<
277
- typeof toolExecutedTelemetryEventSchema
278
- >;
279
-
280
- export const skillLoadedTelemetryEventSchema = z.object({
281
- provider: z.string().trim().min(1).max(64).nullable().optional(),
282
- model: z.string().trim().min(1).max(128).nullable().optional(),
283
- inference_profile: z.string().trim().min(1).max(255).nullable().optional(),
284
- inference_profile_source: z
285
- .string()
286
- .trim()
287
- .min(1)
288
- .max(255)
289
- .nullable()
290
- .optional(),
291
- type: z.literal("skill_loaded"),
292
- daemon_event_id: z.string().trim().min(1).max(128),
293
- recorded_at: z.number().int(),
294
- assistant_version: z.string().trim().min(1).max(64).nullable().optional(),
295
- skill_name: z.string().trim().min(1).max(255),
296
- skill_updated_at: z.string().trim().min(1).max(64).nullable().optional(),
297
- conversation_id: z.string().trim().min(1).max(128).nullable().optional(),
298
- });
299
- export type SkillLoadedTelemetryEvent = z.infer<
300
- typeof skillLoadedTelemetryEventSchema
301
- >;
302
-
303
- export const watchdogTelemetryEventSchema = z
304
- .object({
305
- type: z.literal("watchdog"),
306
- daemon_event_id: z.string().trim().min(1).max(128),
307
- recorded_at: z.number().int(),
308
- assistant_version: z.string().trim().min(1).max(64).nullable().optional(),
309
- check_name: z.string().trim().min(1).max(128),
310
- value: z.number().nullable().optional(),
311
- detail: jsonValueSchema.nullable().optional(),
312
- })
313
- .superRefine((val, ctx) => {
314
- // Mirrors the server's WatchdogTelemetryEventSerializer.validate_detail —
315
- // an oversize `detail` bag is rejected by ingest (the event is silently
316
- // dropped, never the whole batch).
317
- if (val.detail === null || val.detail === undefined) {
318
- return;
319
- }
320
- if (jsonByteLength(val.detail) > WATCHDOG_DETAIL_MAX_JSON_BYTES) {
321
- ctx.addIssue({
322
- code: "custom",
323
- path: ["detail"],
324
- message: `\`detail\` JSON exceeds ${WATCHDOG_DETAIL_MAX_JSON_BYTES} bytes when serialized.`,
325
- });
326
- }
327
- });
328
- export type WatchdogTelemetryEvent = z.infer<
329
- typeof watchdogTelemetryEventSchema
330
- >;
331
-
332
- export const configSettingTelemetryEventSchema = z.object({
333
- type: z.literal("config_setting"),
334
- daemon_event_id: z.string().trim().min(1).max(128),
335
- recorded_at: z.number().int(),
336
- assistant_version: z.string().trim().min(1).max(64).nullable().optional(),
337
- config_key: z.string().trim().min(1).max(128),
338
- config_value: z.string().trim().min(1).max(256),
339
- });
340
- export type ConfigSettingTelemetryEvent = z.infer<
341
- typeof configSettingTelemetryEventSchema
342
- >;
343
-
344
- export const onboardingResearchTelemetryEventSchema = z
345
- .object({
346
- type: z.literal("onboarding_research"),
347
- daemon_event_id: z.string().trim().min(1).max(128),
348
- recorded_at: z.number().int(),
349
- assistant_version: z.string().trim().min(1).max(64).nullable().optional(),
350
- conversation_id: z.string().trim().min(1).max(64).nullable().optional(),
351
- status: z.string().trim().min(1).max(32),
352
- self_reported_occupation: z.string().max(256).nullable().optional(),
353
- self_reported_hobbies: z
354
- .array(z.string().trim().min(1).max(128))
355
- .max(32)
356
- .optional(),
357
- self_reported_timezone: z.string().max(64).nullable().optional(),
358
- claims: z.array(jsonValueSchema).max(20),
359
- claim_count: z.number().int().min(0),
360
- claims_confident: z.number().int().min(0),
361
- claims_maybe: z.number().int().min(0),
362
- claims_guessing: z.number().int().min(0),
363
- suggestions: z.array(jsonValueSchema).max(20),
364
- suggestion_count: z.number().int().min(0),
365
- plugins: z.array(z.string().trim().min(1).max(128)).max(20),
366
- installed_plugins: z.array(z.string().trim().min(1).max(128)).max(20),
367
- })
368
- .superRefine((val, ctx) => {
369
- // Mirrors the server's OnboardingResearchTelemetryEventSerializer
370
- // validate_claims / validate_suggestions — an oversize `claims` or
371
- // `suggestions` array is rejected by ingest (the event is silently
372
- // dropped, never the whole batch).
373
- if (
374
- jsonByteLength(val.claims) > ONBOARDING_RESEARCH_CLAIMS_MAX_JSON_BYTES
375
- ) {
376
- ctx.addIssue({
377
- code: "custom",
378
- path: ["claims"],
379
- message: `\`claims\` JSON exceeds ${ONBOARDING_RESEARCH_CLAIMS_MAX_JSON_BYTES} bytes when serialized.`,
380
- });
381
- }
382
- if (
383
- jsonByteLength(val.suggestions) >
384
- ONBOARDING_RESEARCH_SUGGESTIONS_MAX_JSON_BYTES
385
- ) {
386
- ctx.addIssue({
387
- code: "custom",
388
- path: ["suggestions"],
389
- message: `\`suggestions\` JSON exceeds ${ONBOARDING_RESEARCH_SUGGESTIONS_MAX_JSON_BYTES} bytes when serialized.`,
390
- });
391
- }
392
- });
393
- export type OnboardingResearchTelemetryEvent = z.infer<
394
- typeof onboardingResearchTelemetryEventSchema
395
- >;
396
-
397
- export const avatarChangedTelemetryEventSchema = z.object({
398
- type: z.literal("avatar_changed"),
399
- daemon_event_id: z.string().trim().min(1).max(128),
400
- recorded_at: z.number().int(),
401
- assistant_version: z.string().trim().min(1).max(64).nullable().optional(),
402
- action: z.string().trim().min(1).max(32),
403
- kind: z.string().trim().min(1).max(16),
404
- previous_kind: z.string().trim().min(1).max(16),
405
- body_shape: z.string().trim().min(1).max(256).optional(),
406
- eye_style: z.string().trim().min(1).max(256).optional(),
407
- color: z.string().trim().min(1).max(256).optional(),
408
- accent_hex: z.string().trim().min(1).max(7).optional(),
409
- accent_source: z.string().trim().min(1).max(16).optional(),
410
- client_os: z.string().trim().min(1).max(64).optional(),
411
- });
412
- export type AvatarChangedTelemetryEvent = z.infer<
413
- typeof avatarChangedTelemetryEventSchema
414
- >;
415
-
416
- export type WireEventMap = {
417
- llm_usage: LlmUsageTelemetryEvent;
418
- turn: TurnTelemetryEvent;
419
- lifecycle: LifecycleTelemetryEvent;
420
- onboarding: OnboardingTelemetryEvent;
421
- auth_fallback: AuthFallbackTelemetryEvent;
422
- tool_executed: ToolExecutedTelemetryEvent;
423
- skill_loaded: SkillLoadedTelemetryEvent;
424
- watchdog: WatchdogTelemetryEvent;
425
- config_setting: ConfigSettingTelemetryEvent;
426
- onboarding_research: OnboardingResearchTelemetryEvent;
427
- avatar_changed: AvatarChangedTelemetryEvent;
428
- };
429
-
430
- export const telemetryEventSchema = z.discriminatedUnion("type", [
431
- llmUsageTelemetryEventSchema,
432
- turnTelemetryEventSchema,
433
- lifecycleTelemetryEventSchema,
434
- onboardingTelemetryEventSchema,
435
- authFallbackTelemetryEventSchema,
436
- toolExecutedTelemetryEventSchema,
437
- skillLoadedTelemetryEventSchema,
438
- watchdogTelemetryEventSchema,
439
- configSettingTelemetryEventSchema,
440
- onboardingResearchTelemetryEventSchema,
441
- avatarChangedTelemetryEventSchema,
442
- ]);
443
- export type TelemetryEvent = z.infer<typeof telemetryEventSchema>;
444
-
445
- // Event types recorded SERVER-SIDE by the cloud. A daemon-sent
446
- // event of one of these types is rejected (dropped) by ingest.
447
- export const PLATFORM_MANAGED_EVENT_TYPES = [
448
- "credit_balance_depleted",
449
- "free_tier_daily_limit_reached",
450
- "plugin_installed",
451
- ] as const;
452
-
453
- export const MAX_EVENTS_PER_BATCH = 10000;
454
-
455
- export const telemetryIngestRequestSchema = z
456
- .object({
457
- device_id: z.string().trim().min(1).max(255).optional(),
458
- installation_id: z.string().trim().min(1).max(255).optional(),
459
- assistant_version: z.string().trim().min(1).max(64).nullable().optional(),
460
- // The server tolerates unknown event types (it skips them); this
461
- // schema describes what a current daemon should construct.
462
- events: z.array(telemetryEventSchema).max(MAX_EVENTS_PER_BATCH),
463
- })
464
- .superRefine((val, ctx) => {
465
- if (!val.device_id && !val.installation_id) {
466
- ctx.addIssue({
467
- code: "custom",
468
- message: "Either 'device_id' or 'installation_id' is required.",
469
- });
470
- }
471
- });
472
- export type TelemetryIngestRequest = z.infer<
473
- typeof telemetryIngestRequestSchema
474
- >;
475
-
476
- export const telemetryIngestResponseSchema = z.object({
477
- accepted: z.number().int(),
478
- persisted: z.number().int(),
479
- dropped: z.record(z.string(), jsonValueSchema),
480
- });
481
- export type TelemetryIngestResponse = z.infer<
482
- typeof telemetryIngestResponseSchema
483
- >;
@@ -1,210 +0,0 @@
1
- import { beforeEach, describe, expect, mock, test } from "bun:test";
2
-
3
- // Toggle for the share_analytics opt-out gate the audit listener consults
4
- // when populating the telemetry columns.
5
- let shareAnalytics = true;
6
-
7
- mock.module("../cloud/consent-cache.js", () => ({
8
- getRawShareAnalytics: () => shareAnalytics,
9
- }));
10
-
11
- import {
12
- seedToolInvocation,
13
- TOOL_INVOCATION_PII_SENTINEL as PII_SENTINEL,
14
- type ToolInvocationSeedSpec,
15
- } from "../__tests__/test-support/tool-invocation-seed.js";
16
- import { getDb } from "../persistence/db-connection.js";
17
- import { initializeDb } from "../persistence/db-init.js";
18
- import { conversations, toolInvocations } from "../persistence/schema/index.js";
19
- import { recordToolExecuted } from "./tool-audit.js";
20
- import { queryUnreportedToolExecutedEvents } from "./tool-executed-events-store.js";
21
-
22
- await initializeDb();
23
-
24
- const CONVERSATION_ID = "conv-tool-executed-store-test";
25
-
26
- function insertInvocation(
27
- spec: Omit<ToolInvocationSeedSpec, "conversationId">,
28
- ): void {
29
- seedToolInvocation(
30
- { db: getDb(), conversations, toolInvocations },
31
- { ...spec, conversationId: CONVERSATION_ID },
32
- );
33
- }
34
-
35
- describe("tool-executed-events-store", () => {
36
- beforeEach(() => {
37
- shareAnalytics = true;
38
- getDb().delete(toolInvocations).run();
39
- });
40
-
41
- test("projects telemetry fields in (createdAt, id) order without input/result", () => {
42
- insertInvocation({
43
- id: "ti-b",
44
- createdAt: 2000,
45
- toolName: "web_search",
46
- decision: "error",
47
- durationMs: 7,
48
- });
49
- insertInvocation({
50
- id: "ti-a",
51
- createdAt: 1000,
52
- argBytes: 42,
53
- resultBytes: 9001,
54
- provider: "anthropic",
55
- model: "model-a",
56
- inferenceProfile: "balanced",
57
- inferenceProfileSource: "active",
58
- });
59
-
60
- const rows = queryUnreportedToolExecutedEvents(0, undefined, 100);
61
- expect(rows.map((r) => r.id)).toEqual(["ti-a", "ti-b"]);
62
- expect(rows[0]).toEqual({
63
- id: "ti-a",
64
- toolName: "calendar_list_events",
65
- decision: "allow",
66
- durationMs: 12,
67
- argBytes: 42,
68
- resultBytes: 9001,
69
- provider: "anthropic",
70
- model: "model-a",
71
- inferenceProfile: "balanced",
72
- inferenceProfileSource: "active",
73
- conversationId: CONVERSATION_ID,
74
- createdAt: 1000,
75
- });
76
- expect(rows[1]).toMatchObject({
77
- toolName: "web_search",
78
- decision: "error",
79
- durationMs: 7,
80
- });
81
- // Raw tool args/outputs are potentially PII — the projection must
82
- // never include them.
83
- expect(JSON.stringify(rows)).not.toContain(PII_SENTINEL);
84
- });
85
-
86
- test("excludes permission-denied rows", () => {
87
- insertInvocation({ id: "ti-denied", createdAt: 1000, decision: "denied" });
88
- insertInvocation({ id: "ti-allow", createdAt: 2000 });
89
- insertInvocation({ id: "ti-error", createdAt: 3000, decision: "error" });
90
-
91
- const rows = queryUnreportedToolExecutedEvents(0, undefined, 100);
92
- expect(rows.map((r) => r.id)).toEqual(["ti-allow", "ti-error"]);
93
- });
94
-
95
- test("excludes legacy pre-migration rows (null arg_bytes)", () => {
96
- // Already shipped under the reverted tool_execution type — never
97
- // projected, even from a zero watermark.
98
- insertInvocation({
99
- id: "ti-legacy",
100
- createdAt: 1000,
101
- argBytes: null,
102
- resultBytes: null,
103
- });
104
- insertInvocation({ id: "ti-new", createdAt: 2000 });
105
-
106
- const rows = queryUnreportedToolExecutedEvents(0, undefined, 100);
107
- expect(rows.map((r) => r.id)).toEqual(["ti-new"]);
108
- });
109
-
110
- test("rows recorded while opted out are never projected, even from a zero watermark", () => {
111
- // End-to-end through the real audit terminal: the write-time opt-out
112
- // gate persists NULL telemetry columns, which the arg_bytes IS NOT NULL
113
- // filter excludes permanently — the same mechanism as legacy rows. No
114
- // watermark state is involved, so no later opt-in can ship these rows.
115
- const recordExecuted = (toolName: string): void =>
116
- recordToolExecuted({
117
- conversationId: CONVERSATION_ID,
118
- toolName,
119
- input: { path: "/tmp/a" },
120
- resultContent: "ok",
121
- resultBytes: 2,
122
- decision: "allow",
123
- riskLevel: "low",
124
- durationMs: 5,
125
- attribution: null,
126
- });
127
-
128
- recordExecuted("t-opted-in-before");
129
-
130
- shareAnalytics = false;
131
- recordExecuted("t-opted-out");
132
-
133
- shareAnalytics = true;
134
- recordExecuted("t-opted-in-after");
135
-
136
- // Mid-session opt-out flip: only rows recorded while opted in project.
137
- const rows = queryUnreportedToolExecutedEvents(0, undefined, 100);
138
- expect(rows.map((r) => r.toolName).sort()).toEqual([
139
- "t-opted-in-after",
140
- "t-opted-in-before",
141
- ]);
142
-
143
- // The audit row itself is still recorded — only its telemetry columns
144
- // are NULL.
145
- const auditRows = getDb().select().from(toolInvocations).all();
146
- expect(auditRows).toHaveLength(3);
147
- const optedOut = auditRows.find((r) => r.toolName === "t-opted-out");
148
- expect(optedOut).toMatchObject({
149
- decision: "allow",
150
- argBytes: null,
151
- resultBytes: null,
152
- provider: null,
153
- model: null,
154
- inferenceProfile: null,
155
- inferenceProfileSource: null,
156
- });
157
- });
158
-
159
- test("post-migration rows project with null attribution columns", () => {
160
- insertInvocation({ id: "ti-no-attr", createdAt: 1000 });
161
-
162
- const rows = queryUnreportedToolExecutedEvents(0, undefined, 100);
163
- expect(rows[0]).toMatchObject({
164
- argBytes: 2,
165
- resultBytes: 9,
166
- provider: null,
167
- model: null,
168
- inferenceProfile: null,
169
- inferenceProfileSource: null,
170
- });
171
- });
172
-
173
- test("query advances past the compound (createdAt, id) cursor", () => {
174
- // Two rows in the same millisecond: pagination must use the id
175
- // tiebreaker to make forward progress, not loop.
176
- insertInvocation({ id: "ti-1", createdAt: 5000 });
177
- insertInvocation({ id: "ti-2", createdAt: 5000 });
178
- insertInvocation({ id: "ti-3", createdAt: 6000 });
179
-
180
- const first = queryUnreportedToolExecutedEvents(0, undefined, 1);
181
- expect(first.map((r) => r.id)).toEqual(["ti-1"]);
182
-
183
- const second = queryUnreportedToolExecutedEvents(
184
- first[0]!.createdAt,
185
- first[0]!.id,
186
- 100,
187
- );
188
- expect(second.map((r) => r.id)).toEqual(["ti-2", "ti-3"]);
189
-
190
- // Without an id cursor the timestamp-only branch is used.
191
- expect(
192
- queryUnreportedToolExecutedEvents(5000, undefined, 100).map((r) => r.id),
193
- ).toEqual(["ti-3"]);
194
-
195
- // Cursor past the last row returns nothing.
196
- const last = second[second.length - 1]!;
197
- expect(
198
- queryUnreportedToolExecutedEvents(last.createdAt, last.id, 100).length,
199
- ).toBe(0);
200
- });
201
-
202
- test("honors the limit", () => {
203
- insertInvocation({ id: "ti-l1", createdAt: 1000 });
204
- insertInvocation({ id: "ti-l2", createdAt: 2000 });
205
- insertInvocation({ id: "ti-l3", createdAt: 3000 });
206
-
207
- const rows = queryUnreportedToolExecutedEvents(0, undefined, 2);
208
- expect(rows.map((r) => r.id)).toEqual(["ti-l1", "ti-l2"]);
209
- });
210
- });