@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,400 +0,0 @@
1
- import { beforeEach, describe, expect, mock, test } from "bun:test";
2
-
3
- import type { AssistantEvent } from "../api/index.js";
4
-
5
- // Analytics consent is granted so recordActivationEvent writes rows.
6
- let shareAnalytics = true;
7
-
8
- mock.module("../cloud/consent-cache.js", () => ({
9
- getRawShareAnalytics: () => shareAnalytics,
10
- }));
11
-
12
- let broadcastedMessages: AssistantEvent[] = [];
13
- setBroadcastOverrideForTesting((msg: AssistantEvent) =>
14
- broadcastedMessages.push(msg),
15
- );
16
-
17
- // Stub the child-conversation launcher so the launch_conversation commit path
18
- // runs without spinning up a real conversation.
19
- mock.module("../daemon/conversation-launch.js", () => ({
20
- launchConversation: async () => ({ conversationId: "spawned-conv" }),
21
- }));
22
-
23
- const {
24
- createSurfaceMutex,
25
- handleSurfaceAction,
26
- restoreSurfaceStateEntry,
27
- surfaceProxyResolver,
28
- } = await import("../daemon/conversation-surfaces.js");
29
-
30
- import type { Conversation } from "../daemon/conversation.js";
31
- import type { ProcessMessageOptions } from "../daemon/conversation-process.js";
32
- import type { SurfaceType, UiSurfaceShow } from "../daemon/message-protocol.js";
33
- import {
34
- getMemorySqlite,
35
- getTelemetryDb,
36
- } from "../persistence/db-connection.js";
37
- import { initializeDb } from "../persistence/db-init.js";
38
- import { telemetryEvents } from "../persistence/schema/index.js";
39
- import {
40
- isActivationSession,
41
- markActivationSession,
42
- } from "../plugins/defaults/memory/activation-session-store.js";
43
- import { setBroadcastOverrideForTesting } from "../runtime/assistant-event-hub.js";
44
- import { queryTelemetryOutboxBatch } from "../telemetry/telemetry-events-outbox.js";
45
- import type { OnboardingTelemetryEvent } from "../telemetry/types.js";
46
-
47
- await initializeDb();
48
-
49
- /** Pending onboarding outbox payloads, parsed, in `(created_at, id)` order. */
50
- function pendingOnboardingPayloads(): OnboardingTelemetryEvent[] {
51
- return queryTelemetryOutboxBatch("onboarding", 10).map(
52
- (row) => JSON.parse(row.payload) as OnboardingTelemetryEvent,
53
- );
54
- }
55
-
56
- interface ProcessMessageCall {
57
- content: string;
58
- activeSurfaceId?: string;
59
- }
60
-
61
- function makeContext(
62
- conversationId: string,
63
- sent: AssistantEvent[] = [],
64
- ): Conversation & {
65
- processMessageCalls: ProcessMessageCall[];
66
- } {
67
- const processMessageCalls: ProcessMessageCall[] = [];
68
- return {
69
- conversationId,
70
- sendToClient: (msg: AssistantEvent) => sent.push(msg),
71
- emit: (msg: AssistantEvent) => sent.push(msg),
72
- pendingSurfaceActions: new Map<string, { surfaceType: SurfaceType }>(),
73
- lastSurfaceAction: new Map<
74
- string,
75
- { actionId: string; data?: Record<string, unknown> }
76
- >(),
77
- surfaceState: new Map(),
78
- surfaceUndoStacks: new Map<string, string[]>(),
79
- accumulatedSurfaceState: new Map<string, Record<string, unknown>>(),
80
- surfaceActionRequestIds: new Set<string>(),
81
- currentTurnSurfaces: [],
82
- isProcessing: () => false,
83
- enqueueMessage: () => ({ queued: false, requestId: "req-1" }),
84
- getQueueDepth: () => 0,
85
- processMessage: async (options: ProcessMessageOptions) => {
86
- processMessageCalls.push({
87
- content: options.content,
88
- activeSurfaceId: options.activeSurfaceId,
89
- });
90
- return "msg-1";
91
- },
92
- withSurface: createSurfaceMutex(),
93
- processMessageCalls,
94
- } as unknown as Conversation & {
95
- processMessageCalls: ProcessMessageCall[];
96
- };
97
- }
98
-
99
- function resetTables(): void {
100
- getTelemetryDb()!.delete(telemetryEvents).run();
101
- getMemorySqlite()!.exec("DELETE FROM activation_sessions");
102
- }
103
-
104
- /** Render a choice surface tagged (or not) with an activation_moment. */
105
- async function showTaggedChoice(
106
- ctx: Conversation,
107
- sent: AssistantEvent[],
108
- activationMoment?: string,
109
- ): Promise<string> {
110
- await surfaceProxyResolver(ctx, "ui_show", {
111
- surface_type: "choice",
112
- title: "Pick an outcome",
113
- data: {
114
- options: [
115
- { id: "inbox", title: "Clean up my inbox" },
116
- { id: "calendar", title: "Plan my week" },
117
- ],
118
- },
119
- ...(activationMoment ? { activation_moment: activationMoment } : {}),
120
- });
121
- const showMessage = sent.find(
122
- (msg): msg is UiSurfaceShow => msg.type === "ui_surface_show",
123
- ) as UiSurfaceShow;
124
- return showMessage.surfaceId;
125
- }
126
-
127
- describe("activation moment emission from ui_show surface commits", () => {
128
- beforeEach(() => {
129
- shareAnalytics = true;
130
- broadcastedMessages = [];
131
- resetTables();
132
- });
133
-
134
- test("committed tagged surface in a marked session writes exactly one row", async () => {
135
- markActivationSession("conv-marked");
136
- expect(isActivationSession("conv-marked")).toBe(true);
137
-
138
- const sent: AssistantEvent[] = [];
139
- const ctx = makeContext("conv-marked", sent);
140
- const surfaceId = await showTaggedChoice(ctx, sent, "moment_2");
141
-
142
- await handleSurfaceAction(ctx, surfaceId, "inbox", {
143
- choiceId: "inbox",
144
- selectedIds: ["inbox"],
145
- });
146
-
147
- const rows = pendingOnboardingPayloads();
148
- expect(rows).toHaveLength(1);
149
- expect(rows[0]!.step_name).toBe("activation_moment_2_complete");
150
- expect(rows[0]!.step_index).toBe(2);
151
- expect(rows[0]!.session_id).toBe("conv-marked");
152
- });
153
-
154
- test("a queue-rejected commit does NOT emit; the tag survives for the retry", async () => {
155
- markActivationSession("conv-rejected");
156
- const sent: AssistantEvent[] = [];
157
- const ctx = makeContext("conv-rejected", sent);
158
- const surfaceId = await showTaggedChoice(ctx, sent, "moment_2");
159
-
160
- // First click while the queue is full: enqueue rejects, action not
161
- // accepted. Must NOT record a milestone, and must leave the one-shot tag
162
- // intact so the user's retry still emits.
163
- ctx.enqueueMessage = () => ({
164
- queued: false,
165
- requestId: "req-rejected",
166
- rejected: true,
167
- });
168
- await handleSurfaceAction(ctx, surfaceId, "inbox", {
169
- choiceId: "inbox",
170
- selectedIds: ["inbox"],
171
- });
172
- expect(pendingOnboardingPayloads()).toHaveLength(0);
173
-
174
- // Retry is accepted → records exactly one row.
175
- ctx.enqueueMessage = () => ({ queued: false, requestId: "req-ok" });
176
- await handleSurfaceAction(ctx, surfaceId, "inbox", {
177
- choiceId: "inbox",
178
- selectedIds: ["inbox"],
179
- });
180
- const rows = pendingOnboardingPayloads();
181
- expect(rows).toHaveLength(1);
182
- expect(rows[0]!.step_name).toBe("activation_moment_2_complete");
183
- });
184
-
185
- test("first_wow_executed records at SHOW time (no commit) and never double-emits", async () => {
186
- markActivationSession("conv-wow");
187
- const sent: AssistantEvent[] = [];
188
- const ctx = makeContext("conv-wow", sent);
189
-
190
- // A display-only result surface tagged with the execution moment.
191
- await surfaceProxyResolver(ctx, "ui_show", {
192
- surface_type: "card",
193
- title: "Inbox cleaned",
194
- data: { body: "Archived 1,240 emails" },
195
- activation_moment: "first_wow_executed",
196
- });
197
-
198
- // Recorded immediately on render — no handleSurfaceAction commit needed.
199
- let rows = pendingOnboardingPayloads();
200
- expect(rows).toHaveLength(1);
201
- expect(rows[0]!.step_name).toBe("activation_first_wow_executed");
202
- expect(rows[0]!.step_index).toBe(4);
203
-
204
- // If the card later receives a commit (e.g. it carried an action), it must
205
- // NOT double-emit — a show-timing tag is never stored for the commit path.
206
- const showMessage = sent.find(
207
- (msg): msg is UiSurfaceShow => msg.type === "ui_surface_show",
208
- ) as UiSurfaceShow;
209
- await handleSurfaceAction(ctx, showMessage.surfaceId, "expand", {});
210
- rows = pendingOnboardingPayloads();
211
- expect(rows).toHaveLength(1);
212
- });
213
-
214
- test("first_wow_executed in an UNMARKED session writes no row at show time", async () => {
215
- const sent: AssistantEvent[] = [];
216
- const ctx = makeContext("conv-wow-unmarked", sent);
217
- await surfaceProxyResolver(ctx, "ui_show", {
218
- surface_type: "card",
219
- title: "Result",
220
- data: { body: "x" },
221
- activation_moment: "first_wow_executed",
222
- });
223
- expect(pendingOnboardingPayloads()).toHaveLength(0);
224
- });
225
-
226
- test("does not forward the daemon-only tag to the client", async () => {
227
- markActivationSession("conv-marked-2");
228
- const sent: AssistantEvent[] = [];
229
- const ctx = makeContext("conv-marked-2", sent);
230
- await showTaggedChoice(ctx, sent, "moment_2");
231
-
232
- const showMessage = sent.find(
233
- (msg): msg is UiSurfaceShow => msg.type === "ui_surface_show",
234
- ) as UiSurfaceShow;
235
- expect(
236
- (showMessage as unknown as Record<string, unknown>).activation_moment,
237
- ).toBeUndefined();
238
- expect(JSON.stringify(showMessage)).not.toContain("moment_2");
239
- });
240
-
241
- test("untagged surface writes no row", async () => {
242
- markActivationSession("conv-untagged");
243
- const sent: AssistantEvent[] = [];
244
- const ctx = makeContext("conv-untagged", sent);
245
- const surfaceId = await showTaggedChoice(ctx, sent, undefined);
246
-
247
- await handleSurfaceAction(ctx, surfaceId, "inbox", {
248
- choiceId: "inbox",
249
- selectedIds: ["inbox"],
250
- });
251
-
252
- expect(pendingOnboardingPayloads()).toHaveLength(0);
253
- });
254
-
255
- test("tagged surface in an UNMARKED session writes no row", async () => {
256
- const sent: AssistantEvent[] = [];
257
- const ctx = makeContext("conv-not-rail", sent);
258
- const surfaceId = await showTaggedChoice(ctx, sent, "moment_2");
259
-
260
- await handleSurfaceAction(ctx, surfaceId, "inbox", {
261
- choiceId: "inbox",
262
- selectedIds: ["inbox"],
263
- });
264
-
265
- expect(pendingOnboardingPayloads()).toHaveLength(0);
266
- });
267
-
268
- test("an invalid activation_moment token is ignored (no row)", async () => {
269
- markActivationSession("conv-bad-tag");
270
- const sent: AssistantEvent[] = [];
271
- const ctx = makeContext("conv-bad-tag", sent);
272
- const surfaceId = await showTaggedChoice(ctx, sent, "bogus_moment");
273
-
274
- await handleSurfaceAction(ctx, surfaceId, "inbox", {
275
- choiceId: "inbox",
276
- selectedIds: ["inbox"],
277
- });
278
-
279
- expect(pendingOnboardingPayloads()).toHaveLength(0);
280
- });
281
-
282
- test("FIX 1: launch_conversation commit on a tagged surface records exactly one row", async () => {
283
- markActivationSession("conv-launch");
284
- const sent: AssistantEvent[] = [];
285
- const ctx = makeContext("conv-launch", sent);
286
-
287
- // A launcher card tagged with a commit-timing moment. The committed action
288
- // carries `_action: launch_conversation`, so handleSurfaceAction takes the
289
- // inline-launch branch (which previously returned before the emit).
290
- await surfaceProxyResolver(ctx, "ui_show", {
291
- surface_type: "card",
292
- title: "Start something",
293
- data: { body: "Kick off a draft" },
294
- actions: [{ id: "go", label: "Go", style: "primary" }],
295
- activation_moment: "moment_1",
296
- });
297
- const showMessage = sent.find(
298
- (msg): msg is UiSurfaceShow => msg.type === "ui_surface_show",
299
- ) as UiSurfaceShow;
300
- const surfaceId = showMessage.surfaceId;
301
-
302
- await handleSurfaceAction(ctx, surfaceId, "go", {
303
- _action: "launch_conversation",
304
- title: "Draft",
305
- seedPrompt: "Write a draft",
306
- });
307
-
308
- const rows = pendingOnboardingPayloads();
309
- expect(rows).toHaveLength(1);
310
- expect(rows[0]!.step_name).toBe("activation_moment_1_complete");
311
- expect(rows[0]!.session_id).toBe("conv-launch");
312
- });
313
-
314
- test("FIX 2: commit-timing tag survives a surfaceState restore from history", async () => {
315
- markActivationSession("conv-restore");
316
- const sent: AssistantEvent[] = [];
317
- const ctx = makeContext("conv-restore", sent);
318
- const surfaceId = await showTaggedChoice(ctx, sent, "moment_2");
319
-
320
- // The daemon-only tag must NOT leak to the client.
321
- const showMessage = sent.find(
322
- (msg): msg is UiSurfaceShow => msg.type === "ui_surface_show",
323
- ) as UiSurfaceShow;
324
- expect(
325
- (showMessage as unknown as Record<string, unknown>).activation_moment,
326
- ).toBeUndefined();
327
- expect(JSON.stringify(showMessage)).not.toContain("moment_2");
328
-
329
- // Persist the surface into a history block exactly as the agent loop does
330
- // (conversation-agent-loop-handlers): copy the activationMoment through.
331
- const persisted = ctx.currentTurnSurfaces.map((s) => ({
332
- type: "ui_surface" as const,
333
- surfaceId: s.surfaceId,
334
- surfaceType: s.surfaceType,
335
- title: s.title,
336
- data: s.data,
337
- actions: s.actions,
338
- ...(s.activationMoment ? { activationMoment: s.activationMoment } : {}),
339
- }));
340
- expect(persisted[0]!.activationMoment).toBe("moment_2");
341
-
342
- // Simulate a reload: drop the in-memory surfaceState, then rebuild it
343
- // from the persisted history block through the same helper
344
- // `restoreSurfaceStateFromHistory` uses (including rehydrating the
345
- // daemon-only tag).
346
- ctx.surfaceState.clear();
347
- for (const b of persisted) {
348
- ctx.surfaceState.set(b.surfaceId, restoreSurfaceStateEntry(b));
349
- }
350
-
351
- // A commit after restore still records exactly one row.
352
- await handleSurfaceAction(ctx, surfaceId, "inbox", {
353
- choiceId: "inbox",
354
- selectedIds: ["inbox"],
355
- });
356
-
357
- const rows = pendingOnboardingPayloads();
358
- expect(rows).toHaveLength(1);
359
- expect(rows[0]!.step_name).toBe("activation_moment_2_complete");
360
- expect(rows[0]!.session_id).toBe("conv-restore");
361
- });
362
-
363
- test("intermediate selection_changed does NOT emit; the terminal commit does", async () => {
364
- markActivationSession("conv-table");
365
- const sent: AssistantEvent[] = [];
366
- const ctx = makeContext("conv-table", sent);
367
-
368
- // A table surface stays pending across selection_changed (non-terminal).
369
- await surfaceProxyResolver(ctx, "ui_show", {
370
- surface_type: "table",
371
- title: "Tasks",
372
- data: {
373
- columns: [{ id: "name", label: "Name" }],
374
- rows: [
375
- { id: "r1", cells: { name: "Task 1" } },
376
- { id: "r2", cells: { name: "Task 2" } },
377
- ],
378
- selectionMode: "multiple",
379
- },
380
- actions: [{ id: "run", label: "Run", style: "primary" }],
381
- activation_moment: "moment_3",
382
- });
383
- const showMessage = sent.find(
384
- (msg): msg is UiSurfaceShow => msg.type === "ui_surface_show",
385
- ) as UiSurfaceShow;
386
- const surfaceId = showMessage.surfaceId;
387
-
388
- // Intermediate, non-terminal — must NOT emit.
389
- await handleSurfaceAction(ctx, surfaceId, "selection_changed", {
390
- selectedIds: ["r1"],
391
- });
392
- expect(pendingOnboardingPayloads()).toHaveLength(0);
393
-
394
- // Terminal commit — emits exactly once.
395
- await handleSurfaceAction(ctx, surfaceId, "run", { selectedIds: ["r1"] });
396
- const rows = pendingOnboardingPayloads();
397
- expect(rows).toHaveLength(1);
398
- expect(rows[0]!.step_name).toBe("activation_moment_3_complete");
399
- });
400
- });
@@ -1,213 +0,0 @@
1
- import { beforeEach, describe, expect, mock, spyOn, test } from "bun:test";
2
-
3
- import type { ConsentState } from "../cloud/consent-cache.js";
4
-
5
- // Toggle for the share_analytics consent the real store consults. The store
6
- // module is intentionally NOT mocked here — it has its own DB-backed tests, and
7
- // Bun's `mock.module` is process-global, so mocking it would leak into those
8
- // tests when files share an invocation. Exercising the real store keeps every
9
- // auth-fallback test order-independent.
10
- let shareAnalytics: ConsentState = true;
11
-
12
- mock.module("../cloud/consent-cache.js", () => ({
13
- getRawShareAnalytics: () => shareAnalytics,
14
- }));
15
-
16
- // The watchdog relay must go through the direct (unbuffered) emit; capture the
17
- // forwarded arguments instead of POSTing to the cloud.
18
- const emitCalls: {
19
- checkName: string;
20
- detail: Record<string, unknown> | null;
21
- value: number | null;
22
- }[] = [];
23
- mock.module("../telemetry/watchdog-direct-emit.js", () => ({
24
- emitWatchdogEventDirect: async (
25
- checkName: string,
26
- detail: Record<string, unknown> | null,
27
- value: number | null = null,
28
- ) => {
29
- emitCalls.push({ checkName, detail, value });
30
- },
31
- }));
32
-
33
- import * as dbConnection from "../persistence/db-connection.js";
34
- import { initializeDb } from "../persistence/db-init.js";
35
- import { GATEWAY_PRINCIPALS } from "../runtime/auth/route-policy.js";
36
- import {
37
- RouteError,
38
- ServiceUnavailableError,
39
- } from "../runtime/routes/errors.js";
40
- import { ROUTES } from "../runtime/routes/internal-telemetry-routes.js";
41
- import type { RouteHandlerArgs } from "../runtime/routes/types.js";
42
- import {
43
- discardPendingTelemetryOutboxEvents,
44
- queryTelemetryOutboxBatch,
45
- } from "../telemetry/telemetry-events-outbox.js";
46
- import type { AuthFallbackTelemetryEvent } from "../telemetry/types.js";
47
-
48
- await initializeDb();
49
-
50
- function pendingAuthFallbackPayloads(): AuthFallbackTelemetryEvent[] {
51
- return queryTelemetryOutboxBatch("auth_fallback", 100).map(
52
- (r) => JSON.parse(r.payload) as AuthFallbackTelemetryEvent,
53
- );
54
- }
55
-
56
- const route = ROUTES.find(
57
- (r) => r.operationId === "internal_telemetry_auth_fallback",
58
- );
59
-
60
- function call(body: unknown) {
61
- if (!route) {
62
- throw new Error("route not found");
63
- }
64
- return route.handler({ body } as RouteHandlerArgs);
65
- }
66
-
67
- const VALID_BODY = {
68
- window_start: 1000,
69
- window_end: 2000,
70
- counts: [
71
- {
72
- guard: "edge",
73
- path: "/v1/messages",
74
- failure_kind: "missing_authorization",
75
- count: 5,
76
- },
77
- ],
78
- };
79
-
80
- describe("internal-telemetry-routes: auth-fallback", () => {
81
- beforeEach(() => {
82
- shareAnalytics = true;
83
- discardPendingTelemetryOutboxEvents("auth_fallback");
84
- });
85
-
86
- test("route is locked to service-token callers (GATEWAY_PRINCIPALS + internal.write)", () => {
87
- expect(route).toBeDefined();
88
- expect(route?.endpoint).toBe("internal/telemetry/auth-fallback");
89
- expect(route?.method).toBe("POST");
90
- expect(route?.policy?.allowedPrincipalTypes).toEqual(GATEWAY_PRINCIPALS);
91
- expect(route?.policy?.requiredScopes).toEqual(["internal.write"]);
92
- });
93
-
94
- test("valid batch is persisted to the outbox as a wire auth_fallback event", () => {
95
- const result = call(VALID_BODY);
96
- expect(result).toEqual({ recorded: 1 });
97
-
98
- const payloads = pendingAuthFallbackPayloads();
99
- expect(payloads.length).toBe(1);
100
- expect(payloads[0]).toMatchObject({
101
- type: "auth_fallback",
102
- guard: "edge",
103
- path: "/v1/messages",
104
- failure_kind: "missing_authorization",
105
- count: 5,
106
- window_start: 1000,
107
- window_end: 2000,
108
- });
109
- });
110
-
111
- test("returns skipped and persists nothing under a confirmed opt-out", () => {
112
- shareAnalytics = false;
113
- expect(call(VALID_BODY)).toEqual({ skipped: true });
114
- expect(pendingAuthFallbackPayloads().length).toBe(0);
115
- });
116
-
117
- test("records the batch while consent is unknown (a cold cache never drops data)", () => {
118
- shareAnalytics = "unknown";
119
- expect(call(VALID_BODY)).toEqual({ recorded: 1 });
120
- expect(pendingAuthFallbackPayloads().length).toBe(1);
121
- });
122
-
123
- test("throws 503 when consent is on but the telemetry DB is unavailable, so the gateway re-queues", () => {
124
- const spy = spyOn(dbConnection, "getTelemetryDb").mockReturnValue(null);
125
- try {
126
- expect(() => call(VALID_BODY)).toThrow(ServiceUnavailableError);
127
- } finally {
128
- spy.mockRestore();
129
- }
130
- expect(pendingAuthFallbackPayloads().length).toBe(0);
131
-
132
- // Once the DB is back the same batch records normally.
133
- expect(call(VALID_BODY)).toEqual({ recorded: 1 });
134
- });
135
-
136
- test("throws 503 (not skipped) when consent is unknown and the telemetry DB is unavailable", () => {
137
- shareAnalytics = "unknown";
138
- const spy = spyOn(dbConnection, "getTelemetryDb").mockReturnValue(null);
139
- try {
140
- expect(() => call(VALID_BODY)).toThrow(ServiceUnavailableError);
141
- } finally {
142
- spy.mockRestore();
143
- }
144
- expect(pendingAuthFallbackPayloads().length).toBe(0);
145
- });
146
-
147
- test("rejects a malformed body without persisting", () => {
148
- expect(() => call({ window_start: 1000 })).toThrow(RouteError);
149
- expect(() => call({ ...VALID_BODY, counts: [] })).toThrow(RouteError);
150
- expect(() =>
151
- call({
152
- ...VALID_BODY,
153
- counts: [{ guard: "edge", path: "/x", failure_kind: "y", count: 0 }],
154
- }),
155
- ).toThrow(RouteError);
156
- expect(pendingAuthFallbackPayloads().length).toBe(0);
157
- });
158
- });
159
-
160
- describe("internal-telemetry-routes: watchdog relay", () => {
161
- const watchdogRoute = ROUTES.find(
162
- (r) => r.operationId === "internal_telemetry_watchdog",
163
- );
164
-
165
- function callWatchdog(body: unknown) {
166
- if (!watchdogRoute) {
167
- throw new Error("route not found");
168
- }
169
- return watchdogRoute.handler({ body } as RouteHandlerArgs);
170
- }
171
-
172
- beforeEach(() => {
173
- emitCalls.length = 0;
174
- });
175
-
176
- test("route is locked to service-token callers (GATEWAY_PRINCIPALS + internal.write)", () => {
177
- expect(watchdogRoute).toBeDefined();
178
- expect(watchdogRoute?.endpoint).toBe("internal/telemetry/watchdog");
179
- expect(watchdogRoute?.method).toBe("POST");
180
- expect(watchdogRoute?.policy?.allowedPrincipalTypes).toEqual(
181
- GATEWAY_PRINCIPALS,
182
- );
183
- expect(watchdogRoute?.policy?.requiredScopes).toEqual(["internal.write"]);
184
- });
185
-
186
- test("valid event is forwarded to the direct emit", async () => {
187
- const result = await callWatchdog({
188
- check_name: "gateway_guardian_missing",
189
- detail: { has_contacts: true, has_actor_tokens: false },
190
- });
191
- expect(result).toEqual({ ok: true });
192
- expect(emitCalls).toEqual([
193
- {
194
- checkName: "gateway_guardian_missing",
195
- detail: { has_contacts: true, has_actor_tokens: false },
196
- value: null,
197
- },
198
- ]);
199
- });
200
-
201
- test("detail and value are optional", async () => {
202
- await callWatchdog({ check_name: "some_check" });
203
- expect(emitCalls).toEqual([
204
- { checkName: "some_check", detail: null, value: null },
205
- ]);
206
- });
207
-
208
- test("rejects a malformed body without emitting", async () => {
209
- await expect(callWatchdog({})).rejects.toThrow(RouteError);
210
- await expect(callWatchdog({ check_name: "" })).rejects.toThrow(RouteError);
211
- expect(emitCalls.length).toBe(0);
212
- });
213
- });