@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,217 +0,0 @@
1
- /**
2
- * Tests for the pure `avatar_changed` mapper and its no-op predicate. Nothing
3
- * here touches the filesystem: states are literals, and every payload the
4
- * mapper produces is checked against the synced wire schema.
5
- */
6
- import { describe, expect, test } from "bun:test";
7
-
8
- import { avatarChangedTelemetryEventSchema } from "../../telemetry/telemetry-wire.generated.js";
9
- import {
10
- avatarChangedFields,
11
- isSameAvatar,
12
- } from "../avatar-changed-telemetry.js";
13
- import { type AvatarState, NONE_AVATAR_STATE } from "../avatar-manifest.js";
14
-
15
- const TRAITS = { bodyShape: "blob", eyeStyle: "curious", color: "green" };
16
-
17
- const CHARACTER: AvatarState = {
18
- kind: "character",
19
- traits: TRAITS,
20
- source: "builder",
21
- image: null,
22
- accent: { hex: "#4caf50", source: "palette" },
23
- };
24
-
25
- const UPLOADED: AvatarState = {
26
- kind: "image",
27
- traits: null,
28
- source: "upload",
29
- image: { updatedAt: "2026-01-01T00:00:00.000Z", etag: "etag-1" },
30
- accent: { hex: "#c81e1e", source: "derived" },
31
- };
32
-
33
- /** The same PNG written again: fresh metadata, everything else equal. */
34
- const UPLOADED_REWRITTEN: AvatarState = {
35
- ...UPLOADED,
36
- image: { updatedAt: "2026-01-02T00:00:00.000Z", etag: "etag-2" },
37
- };
38
-
39
- /** An image manifest derived from legacy files: it names no source and no accent. */
40
- const UPLOADED_LEGACY: AvatarState = {
41
- ...UPLOADED,
42
- source: null,
43
- accent: null,
44
- };
45
-
46
- const CUSTOM_ACCENT = { hex: "#123456", source: "custom" } as const;
47
-
48
- function parseOnTheWire(fields: ReturnType<typeof avatarChangedFields>) {
49
- return avatarChangedTelemetryEventSchema.safeParse({
50
- type: "avatar_changed",
51
- daemon_event_id: "evt-avatar-changed-001",
52
- recorded_at: 1_767_225_600_000,
53
- assistant_version: "1.2.3",
54
- ...fields,
55
- });
56
- }
57
-
58
- describe("avatarChangedFields", () => {
59
- test("a character carries its trait ids and palette accent", () => {
60
- const fields = avatarChangedFields("set_character", UPLOADED, CHARACTER);
61
- expect(fields).toStrictEqual({
62
- action: "set_character",
63
- kind: "character",
64
- previous_kind: "image",
65
- body_shape: "blob",
66
- eye_style: "curious",
67
- color: "green",
68
- accent_hex: "#4caf50",
69
- accent_source: "palette",
70
- });
71
- });
72
-
73
- test("an image carries its derived accent and no trait keys", () => {
74
- const fields = avatarChangedFields("upload_image", CHARACTER, UPLOADED);
75
- expect(fields).toStrictEqual({
76
- action: "upload_image",
77
- kind: "image",
78
- previous_kind: "character",
79
- accent_hex: "#c81e1e",
80
- accent_source: "derived",
81
- });
82
- });
83
-
84
- test("a cleared avatar carries only the action and the two kinds", () => {
85
- const fields = avatarChangedFields("clear", UPLOADED, NONE_AVATAR_STATE);
86
- expect(fields).toStrictEqual({
87
- action: "clear",
88
- kind: "none",
89
- previous_kind: "image",
90
- });
91
- });
92
-
93
- test("a first set reports a previous kind of none", () => {
94
- expect(
95
- avatarChangedFields("set_character", NONE_AVATAR_STATE, CHARACTER)
96
- .previous_kind,
97
- ).toBe("none");
98
- });
99
-
100
- test("an upper-case palette hex is emitted lower case", () => {
101
- const fields = avatarChangedFields("set_character", NONE_AVATAR_STATE, {
102
- ...CHARACTER,
103
- accent: { hex: "#4C9B50", source: "palette" },
104
- });
105
- expect(fields.accent_hex).toBe("#4c9b50");
106
- });
107
-
108
- test("the client OS rides along only when it is non-empty", () => {
109
- const withOs = avatarChangedFields(
110
- "generate_image",
111
- NONE_AVATAR_STATE,
112
- UPLOADED,
113
- "macos",
114
- );
115
- expect(withOs.client_os).toBe("macos");
116
-
117
- const emptyOs = avatarChangedFields(
118
- "generate_image",
119
- NONE_AVATAR_STATE,
120
- UPLOADED,
121
- "",
122
- );
123
- expect(emptyOs).not.toHaveProperty("client_os");
124
- });
125
-
126
- test("every payload parses under the synced wire schema", () => {
127
- const payloads = [
128
- avatarChangedFields("set_character", NONE_AVATAR_STATE, CHARACTER),
129
- avatarChangedFields("upload_image", CHARACTER, UPLOADED, "web"),
130
- avatarChangedFields("generate_image", NONE_AVATAR_STATE, UPLOADED),
131
- avatarChangedFields("set_accent", UPLOADED, {
132
- ...UPLOADED,
133
- accent: CUSTOM_ACCENT,
134
- }),
135
- avatarChangedFields("clear", CHARACTER, NONE_AVATAR_STATE),
136
- ];
137
- for (const payload of payloads) {
138
- const parsed = parseOnTheWire(payload);
139
- expect(parsed.success).toBe(true);
140
- }
141
- });
142
- });
143
-
144
- describe("isSameAvatar", () => {
145
- test("a character re-set with the same traits is the same", () => {
146
- expect(isSameAvatar(CHARACTER, { ...CHARACTER })).toBe(true);
147
- });
148
-
149
- test("a character with one trait changed is not", () => {
150
- expect(
151
- isSameAvatar(CHARACTER, {
152
- ...CHARACTER,
153
- traits: { ...TRAITS, color: "blue" },
154
- }),
155
- ).toBe(false);
156
- });
157
-
158
- test("the same traits under a custom rather than palette accent is not", () => {
159
- expect(
160
- isSameAvatar(CHARACTER, {
161
- ...CHARACTER,
162
- accent: { hex: "#4caf50", source: "custom" },
163
- }),
164
- ).toBe(false);
165
- });
166
-
167
- test("a character whose accent was never recorded is the same under its palette accent", () => {
168
- expect(isSameAvatar({ ...CHARACTER, accent: null }, CHARACTER)).toBe(true);
169
- });
170
-
171
- test("an image rewritten from the same bytes and source is the same", () => {
172
- expect(isSameAvatar(UPLOADED, UPLOADED_REWRITTEN)).toBe(true);
173
- });
174
-
175
- test("an image whose bytes changed is not, even when every manifest field matches", () => {
176
- expect(isSameAvatar(UPLOADED, UPLOADED_REWRITTEN, true)).toBe(false);
177
- });
178
-
179
- test("the same bytes from a different source is not", () => {
180
- expect(isSameAvatar(UPLOADED, { ...UPLOADED, source: "ai" })).toBe(false);
181
- });
182
-
183
- test("the same bytes under a different accent is not", () => {
184
- expect(
185
- isSameAvatar(UPLOADED, {
186
- ...UPLOADED,
187
- accent: { hex: "#c81e1e", source: "custom" },
188
- }),
189
- ).toBe(false);
190
- });
191
-
192
- test("a legacy-derived image re-set from the same bytes is the same, whatever the source", () => {
193
- expect(isSameAvatar(UPLOADED_LEGACY, UPLOADED)).toBe(true);
194
- expect(isSameAvatar(UPLOADED_LEGACY, { ...UPLOADED, source: "ai" })).toBe(
195
- true,
196
- );
197
- });
198
-
199
- test("a custom accent over one that was never recorded is not", () => {
200
- expect(
201
- isSameAvatar(UPLOADED_LEGACY, { ...UPLOADED, accent: CUSTOM_ACCENT }),
202
- ).toBe(false);
203
- });
204
-
205
- test("none is always the same as none", () => {
206
- expect(isSameAvatar(NONE_AVATAR_STATE, NONE_AVATAR_STATE)).toBe(true);
207
- expect(
208
- isSameAvatar(NONE_AVATAR_STATE, { ...NONE_AVATAR_STATE }, true),
209
- ).toBe(true);
210
- });
211
-
212
- test("none is never the same as an avatar", () => {
213
- expect(isSameAvatar(NONE_AVATAR_STATE, CHARACTER)).toBe(false);
214
- expect(isSameAvatar(NONE_AVATAR_STATE, UPLOADED)).toBe(false);
215
- expect(isSameAvatar(UPLOADED, NONE_AVATAR_STATE)).toBe(false);
216
- });
217
- });
@@ -1,128 +0,0 @@
1
- /**
2
- * The pure half of the avatar store's telemetry: maps a before/after avatar
3
- * transition onto the `avatar_changed` wire event, so the store stays the one
4
- * caller of `recordTelemetryEvent`.
5
- */
6
- import type {
7
- AvatarChangedTelemetryEvent,
8
- TelemetryEventBase,
9
- } from "../telemetry/types.js";
10
- import type {
11
- AvatarSource,
12
- AvatarState,
13
- CharacterTraits,
14
- } from "./avatar-manifest.js";
15
-
16
- export type AvatarChangeAction =
17
- | "set_character"
18
- | "upload_image"
19
- | "generate_image"
20
- | "set_accent"
21
- | "clear";
22
-
23
- /** The sources an image can be set from. */
24
- export type ImageSource = Exclude<AvatarSource, "builder">;
25
-
26
- /** The action an image write counts as, by where the image came from. */
27
- export const IMAGE_ACTIONS: Readonly<Record<ImageSource, AvatarChangeAction>> =
28
- { upload: "upload_image", ai: "generate_image" };
29
-
30
- /** The `avatar_changed` wire payload minus the fields `recordTelemetryEvent` stamps. */
31
- type AvatarChangedFields = Omit<
32
- AvatarChangedTelemetryEvent,
33
- keyof TelemetryEventBase
34
- >;
35
-
36
- function sameTraits(
37
- previous: CharacterTraits | null,
38
- next: CharacterTraits | null,
39
- ): boolean {
40
- return (
41
- previous?.bodyShape === next?.bodyShape &&
42
- previous?.eyeStyle === next?.eyeStyle &&
43
- previous?.color === next?.color
44
- );
45
- }
46
-
47
- /** An unknown previous source cannot prove a change. */
48
- function sameSource(previous: AvatarState, next: AvatarState): boolean {
49
- return previous.source === null || previous.source === next.source;
50
- }
51
-
52
- /**
53
- * A previous accent that was never recorded is an automatic one, so only a
54
- * custom accent over it proves a change.
55
- */
56
- function sameAccent(previous: AvatarState, next: AvatarState): boolean {
57
- if (previous.accent === null) {
58
- return next.accent?.source !== "custom";
59
- }
60
- return (
61
- previous.accent.hex === next.accent?.hex &&
62
- previous.accent.source === next.accent?.source
63
- );
64
- }
65
-
66
- /**
67
- * Whether a mutation left the avatar as it was, so the store can skip the
68
- * event. Image metadata (`etag`, `updatedAt`) is ignored: a rewrite of the
69
- * same bytes changes it, and two different images can derive the same accent,
70
- * so the store compares bytes and passes the verdict as `imageBytesChanged`.
71
- * A manifest derived from legacy files or not yet backfilled carries no
72
- * source or accent, and an unknown value cannot prove a change.
73
- */
74
- export function isSameAvatar(
75
- previous: AvatarState,
76
- next: AvatarState,
77
- imageBytesChanged = false,
78
- ): boolean {
79
- if (previous.kind !== next.kind) {
80
- return false;
81
- }
82
- switch (next.kind) {
83
- case "character":
84
- return (
85
- sameTraits(previous.traits, next.traits) && sameAccent(previous, next)
86
- );
87
- case "image":
88
- return (
89
- !imageBytesChanged &&
90
- sameSource(previous, next) &&
91
- sameAccent(previous, next)
92
- );
93
- case "none":
94
- return true;
95
- }
96
- }
97
-
98
- /**
99
- * The `avatar_changed` fields for a transition. Optional keys are omitted,
100
- * never set to `null` or `""`: the wire schema requires at least one
101
- * character, and a single failing field makes the server drop the whole event.
102
- */
103
- export function avatarChangedFields(
104
- action: AvatarChangeAction,
105
- previous: AvatarState,
106
- next: AvatarState,
107
- clientOs?: string,
108
- ): AvatarChangedFields {
109
- const fields: AvatarChangedFields = {
110
- action,
111
- kind: next.kind,
112
- previous_kind: previous.kind,
113
- };
114
- if (next.kind === "character" && next.traits) {
115
- fields.body_shape = next.traits.bodyShape;
116
- fields.eye_style = next.traits.eyeStyle;
117
- fields.color = next.traits.color;
118
- }
119
- if (next.accent) {
120
- // One casing on the wire: the palette catalog spells its hexes upper case.
121
- fields.accent_hex = next.accent.hex.toLowerCase();
122
- fields.accent_source = next.accent.source;
123
- }
124
- if (clientOs) {
125
- fields.client_os = clientOs;
126
- }
127
- return fields;
128
- }
@@ -1,204 +0,0 @@
1
- /**
2
- * Phone-call funnel rows: which ones the call store records and what they say.
3
- *
4
- * The recorder is mocked, as in `live-voice-session-telemetry.test.ts`: the
5
- * outbox and its consent gate are covered by `telemetry-events-outbox.test.ts`.
6
- * What these tests pin is the wiring that decides whether a row exists at all,
7
- * which is where the measurement silently goes wrong: a call that never
8
- * connects still has to count, a terminal status has to emit exactly one end
9
- * row however many writes follow it, and a call nobody spoke on has to say so.
10
- */
11
-
12
- import { beforeEach, describe, expect, mock, test } from "bun:test";
13
-
14
- const recordPhoneCallStarted = mock(() => null);
15
- const recordPhoneCallEnded = mock(() => null);
16
-
17
- // Spread the real module rather than replacing it: the call store pulls other
18
- // recorders out of it, and a bare replacement makes those imports fail.
19
- const onboardingEventsStore =
20
- await import("../../onboarding/onboarding-events-store.js");
21
- mock.module("../../onboarding/onboarding-events-store.js", () => ({
22
- ...onboardingEventsStore,
23
- recordPhoneCallStarted,
24
- recordPhoneCallEnded,
25
- }));
26
-
27
- import { getDb } from "../../persistence/db-connection.js";
28
- import { initializeDb } from "../../persistence/db-init.js";
29
- import { conversations } from "../../persistence/schema/index.js";
30
-
31
- await initializeDb();
32
-
33
- // Values load after `mock.module` so the store picks up the mocked recorder.
34
- const { createCallSession, recordCallEvent, updateCallSession } =
35
- await import("../call-store.js");
36
-
37
- let conversationSeq = 0;
38
-
39
- function makeConversation(): string {
40
- const id = `conv-funnel-${++conversationSeq}`;
41
- const now = Date.now();
42
- getDb()
43
- .insert(conversations)
44
- .values({
45
- id,
46
- title: `Test conversation ${id}`,
47
- createdAt: now,
48
- updatedAt: now,
49
- })
50
- .run();
51
- return id;
52
- }
53
-
54
- function startCall(opts?: {
55
- direction?: "inbound" | "outbound";
56
- callMode?: string;
57
- }): string {
58
- const session = createCallSession({
59
- conversationId: makeConversation(),
60
- provider: "twilio",
61
- direction: opts?.direction ?? "inbound",
62
- fromNumber: "+15550100",
63
- toNumber: "+15550101",
64
- ...(opts?.callMode !== undefined ? { callMode: opts.callMode } : {}),
65
- });
66
- return session.id;
67
- }
68
-
69
- beforeEach(() => {
70
- recordPhoneCallStarted.mockClear();
71
- recordPhoneCallEnded.mockClear();
72
- });
73
-
74
- describe("call funnel start rows", () => {
75
- test("an inbound call counts the moment its session row exists", () => {
76
- // Before the provider has dialled and before any preflight can reject it:
77
- // a call that never connects is the one the funnel most needs to count.
78
- const callSessionId = startCall({ callMode: "normal" });
79
-
80
- expect(recordPhoneCallStarted).toHaveBeenCalledTimes(1);
81
- expect(recordPhoneCallStarted).toHaveBeenCalledWith({
82
- callSessionId,
83
- screen: "started_inbound:normal",
84
- });
85
- });
86
-
87
- test("an outbound call is stamped by the direction it states", () => {
88
- // Stated, not inferred: a verification or invite call dials out and
89
- // carries no task, so task presence would misread as inbound.
90
- startCall({ direction: "outbound", callMode: "verification" });
91
-
92
- expect(recordPhoneCallStarted).toHaveBeenCalledWith(
93
- expect.objectContaining({ screen: "started_outbound:verification" }),
94
- );
95
- });
96
-
97
- test("an ordinary call stamps the normal mode it never writes", () => {
98
- // createInboundVoiceSession and startCall leave callMode null; only the
99
- // verification and invite flows set one.
100
- startCall();
101
-
102
- expect(recordPhoneCallStarted).toHaveBeenCalledWith(
103
- expect.objectContaining({ screen: "started_inbound:normal" }),
104
- );
105
- });
106
- });
107
-
108
- describe("call funnel end rows", () => {
109
- test("a completed call that took a turn reports no silence", () => {
110
- const callSessionId = startCall({ callMode: "normal" });
111
- updateCallSession(callSessionId, { status: "in_progress" });
112
- recordCallEvent(callSessionId, "call_connected");
113
- recordCallEvent(callSessionId, "caller_spoke", {
114
- transcript: "hello",
115
- transport: "media-stream",
116
- });
117
-
118
- updateCallSession(callSessionId, { status: "completed" });
119
-
120
- expect(recordPhoneCallEnded).toHaveBeenCalledTimes(1);
121
- expect(recordPhoneCallEnded).toHaveBeenCalledWith({
122
- callSessionId,
123
- screen: "ended_completed",
124
- outcome: "completed",
125
- });
126
- });
127
-
128
- test("a call that never connected is silent for that reason", () => {
129
- const callSessionId = startCall({ callMode: "normal" });
130
-
131
- updateCallSession(callSessionId, { status: "failed" });
132
-
133
- expect(recordPhoneCallEnded).toHaveBeenCalledWith({
134
- callSessionId,
135
- screen: "ended_failed:silent_no_connect",
136
- outcome: "failed",
137
- });
138
- });
139
-
140
- test("a connected call nobody spoke on is silent on the line", () => {
141
- // The distinction the rate lives on: the telephony leg worked and the
142
- // conversation still never started.
143
- const callSessionId = startCall({ callMode: "normal" });
144
- updateCallSession(callSessionId, { status: "in_progress" });
145
- recordCallEvent(callSessionId, "call_connected");
146
-
147
- updateCallSession(callSessionId, { status: "completed" });
148
-
149
- expect(recordPhoneCallEnded).toHaveBeenCalledWith(
150
- expect.objectContaining({ screen: "ended_completed:silent_no_turn" }),
151
- );
152
- });
153
-
154
- test("a call where only digits were pressed took no turn", () => {
155
- // DTMF digits ride `caller_spoke` too; only a transcript is a turn.
156
- const callSessionId = startCall({ callMode: "normal" });
157
- updateCallSession(callSessionId, { status: "in_progress" });
158
- recordCallEvent(callSessionId, "call_connected");
159
- recordCallEvent(callSessionId, "caller_spoke", {
160
- dtmfDigit: "4",
161
- transport: "media-stream",
162
- });
163
-
164
- updateCallSession(callSessionId, { status: "completed" });
165
-
166
- expect(recordPhoneCallEnded).toHaveBeenCalledWith(
167
- expect.objectContaining({ screen: "ended_completed:silent_no_turn" }),
168
- );
169
- });
170
-
171
- test("a cancelled call completed its course", () => {
172
- // Only an error is a failure; a call cancelled before it connected ran
173
- // exactly as far as it was asked to.
174
- const callSessionId = startCall({ callMode: "normal" });
175
-
176
- updateCallSession(callSessionId, { status: "cancelled" });
177
-
178
- expect(recordPhoneCallEnded).toHaveBeenCalledWith(
179
- expect.objectContaining({ outcome: "completed" }),
180
- );
181
- });
182
-
183
- test("only the first terminal write records an end", () => {
184
- // Terminal states are immutable, so the rejected second write must not
185
- // produce a second row to pair with the one start.
186
- const callSessionId = startCall({ callMode: "normal" });
187
- updateCallSession(callSessionId, { status: "completed" });
188
-
189
- updateCallSession(callSessionId, { status: "failed" });
190
-
191
- expect(recordPhoneCallEnded).toHaveBeenCalledTimes(1);
192
- expect(recordPhoneCallEnded).toHaveBeenCalledWith(
193
- expect.objectContaining({ screen: "ended_completed:silent_no_connect" }),
194
- );
195
- });
196
-
197
- test("a non-status update records nothing", () => {
198
- const callSessionId = startCall({ callMode: "normal" });
199
-
200
- updateCallSession(callSessionId, { providerCallSid: "CA-test" });
201
-
202
- expect(recordPhoneCallEnded).not.toHaveBeenCalled();
203
- });
204
- });
@@ -1,27 +0,0 @@
1
- /** Declarative help for the `assistant telemetry` command. */
2
-
3
- import type { CliCommandHelp } from "../lib/cli-command-help.js";
4
-
5
- export const telemetryHelp: CliCommandHelp = {
6
- name: "telemetry",
7
- description: "Manage telemetry reporting",
8
- subcommands: [
9
- {
10
- name: "flush",
11
- description: "Force-flush all pending telemetry events to the cloud",
12
- helpText: `
13
- Reports how many events reached the cloud: 'sent' (POSTed), 'persisted'
14
- (confirmed written), and 'dropped' (sent - persisted — server-side drops plus
15
- events skipped at ingest validation). When nothing ships, prints why (e.g.
16
- nothing pending, opted out, not signed in).
17
-
18
- Pass --json for the raw summary:
19
- { "flushed": true, "sent": 44, "persisted": 40, "dropped": 4 }
20
- { "flushed": false, "reason": "opted-out" }
21
-
22
- Examples:
23
- $ assistant telemetry flush
24
- $ assistant telemetry flush --json`,
25
- },
26
- ],
27
- };
@@ -1,83 +0,0 @@
1
- import type { Command } from "commander";
2
-
3
- import { cliIpcCall, exitFromIpcResult } from "../../ipc/cli-client.js";
4
- import type { TelemetryFlushSummary } from "../../telemetry/usage-telemetry-reporter.js";
5
- import { applyCommandHelp, subcommand } from "../lib/cli-command-help.js";
6
- import { registerCommand } from "../lib/register-command.js";
7
- import { log } from "../logger.js";
8
- import { shouldOutputJson, writeOutput } from "../output.js";
9
- import { telemetryHelp } from "./telemetry.help.js";
10
-
11
- function describeSkip(reason: string): string {
12
- switch (reason) {
13
- case "nothing-pending":
14
- return "No pending telemetry events to flush.";
15
- case "opted-out":
16
- return "Telemetry flush skipped: analytics sharing is opted out.";
17
- case "no-credentials":
18
- return "Telemetry flush skipped: not signed in to the cloud yet.";
19
- case "unknown-consent":
20
- return "Telemetry flush skipped: consent not yet resolved (will retry).";
21
- case "checkpoint-unavailable":
22
- return "Telemetry flush skipped: telemetry store unavailable (will retry).";
23
- case "disabled":
24
- return "Telemetry flush skipped: telemetry is disabled.";
25
- case "post-failed":
26
- return "Telemetry flush failed: the cloud rejected the request.";
27
- default:
28
- return `Telemetry flush skipped: ${reason}`;
29
- }
30
- }
31
-
32
- function describeFlushed(r: {
33
- sent: number;
34
- persisted: number;
35
- dropped: number;
36
- }): string {
37
- const events = r.sent === 1 ? "event" : "events";
38
- if (r.dropped === 0) {
39
- return `Flushed ${r.sent} ${events} — all persisted.`;
40
- }
41
- return `Flushed ${r.sent} ${events} — ${r.persisted} persisted, ${r.dropped} dropped.`;
42
- }
43
-
44
- export function registerTelemetryCommand(program: Command): void {
45
- registerCommand(program, {
46
- name: telemetryHelp.name,
47
- transport: "ipc",
48
- description: telemetryHelp.description,
49
- build: (telemetry) => {
50
- applyCommandHelp(telemetry, telemetryHelp);
51
-
52
- subcommand(telemetry, "flush").action(
53
- async (_opts: Record<string, unknown>, cmd: Command) => {
54
- const r = await cliIpcCall<TelemetryFlushSummary>(
55
- "telemetry_flush",
56
- {},
57
- );
58
- if (!r.ok) {
59
- return exitFromIpcResult(
60
- {
61
- ok: false,
62
- error: r.error,
63
- statusCode: r.statusCode,
64
- },
65
- cmd,
66
- );
67
- }
68
-
69
- const result = r.result!;
70
- if (shouldOutputJson(cmd)) {
71
- writeOutput(cmd, result);
72
- return;
73
- }
74
- if (result.flushed) {
75
- log.info(describeFlushed(result));
76
- } else {
77
- log.info(describeSkip(result.reason));
78
- }
79
- },
80
- );
81
- },
82
- });
83
- }