@vellumai/assistant 0.8.6 → 0.8.7-dev.202606052135.3e62c5a

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 (1079) hide show
  1. package/AGENTS.md +4 -4
  2. package/Dockerfile +21 -4
  3. package/bun.lock +13 -4
  4. package/docker-entrypoint.sh +12 -8
  5. package/docker-init-apt-root.sh +3 -1
  6. package/docker-kata-apt-env.sh +3 -1
  7. package/docker-kata-runtime-family.sh +12 -0
  8. package/docs/architecture/memory.md +1 -1
  9. package/docs/plugins.md +80 -281
  10. package/examples/plugins/echo/README.md +28 -37
  11. package/examples/plugins/echo/register.ts +35 -117
  12. package/knip.json +1 -0
  13. package/node_modules/@vellumai/environments/bun.lock +24 -0
  14. package/node_modules/@vellumai/environments/package.json +18 -0
  15. package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
  16. package/node_modules/@vellumai/environments/src/index.ts +11 -0
  17. package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
  18. package/node_modules/@vellumai/environments/src/types.ts +70 -0
  19. package/node_modules/@vellumai/environments/tsconfig.json +20 -0
  20. package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
  21. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +3 -4
  22. package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +3 -3
  23. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +13 -8
  24. package/openapi.yaml +6964 -539
  25. package/package.json +8 -4
  26. package/scripts/generate-openapi.ts +88 -54
  27. package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
  28. package/src/__tests__/agent-loop-exit-reason.test.ts +188 -45
  29. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
  30. package/src/__tests__/agent-loop-override-profile.test.ts +19 -32
  31. package/src/__tests__/agent-loop-provider-error-recording.test.ts +7 -5
  32. package/src/__tests__/agent-loop-thinking.test.ts +17 -12
  33. package/src/__tests__/agent-loop.test.ts +238 -422
  34. package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +6 -2
  35. package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
  36. package/src/__tests__/annotate-activity-metadata.test.ts +262 -0
  37. package/src/__tests__/annotate-risk-options.test.ts +2 -3
  38. package/src/__tests__/anthropic-provider.test.ts +296 -57
  39. package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
  40. package/src/__tests__/app-control-flow.test.ts +6 -1
  41. package/src/__tests__/app-dir-path-guard.test.ts +1 -0
  42. package/src/__tests__/approval-cascade.test.ts +4 -11
  43. package/src/__tests__/approval-routes-http.test.ts +8 -3
  44. package/src/__tests__/assistant-event-hub.test.ts +25 -0
  45. package/src/__tests__/assistant-event.test.ts +15 -0
  46. package/src/__tests__/assistant-events-sse-shed.test.ts +8 -0
  47. package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
  48. package/src/__tests__/assistant-stream-state.test.ts +645 -0
  49. package/src/__tests__/auth-fallback-events-store.test.ts +116 -0
  50. package/src/__tests__/avatar-e2e.test.ts +7 -37
  51. package/src/__tests__/avatar-generator.test.ts +12 -42
  52. package/src/__tests__/avatar-identity-sync.test.ts +28 -3
  53. package/src/__tests__/background-shell-bash.test.ts +3 -7
  54. package/src/__tests__/background-workers-disk-pressure.test.ts +6 -0
  55. package/src/__tests__/btw-routes.test.ts +69 -15
  56. package/src/__tests__/build-persisted-content.test.ts +184 -0
  57. package/src/__tests__/call-pointer-messages.test.ts +5 -3
  58. package/src/__tests__/call-site-routing-provider.test.ts +22 -40
  59. package/src/__tests__/catalog-files.test.ts +1 -0
  60. package/src/__tests__/channel-approval-routes.test.ts +49 -21
  61. package/src/__tests__/channel-approvals.test.ts +4 -2
  62. package/src/__tests__/channel-invite-transport.test.ts +1 -5
  63. package/src/__tests__/channel-readiness-routes.test.ts +0 -4
  64. package/src/__tests__/channel-readiness-slack-remote.test.ts +2 -7
  65. package/src/__tests__/channel-retry-sweep.test.ts +71 -79
  66. package/src/__tests__/clawhub-files.test.ts +1 -0
  67. package/src/__tests__/compaction-circuit.test.ts +258 -0
  68. package/src/__tests__/compaction-direct.test.ts +132 -0
  69. package/src/__tests__/compaction-events.test.ts +5 -17
  70. package/src/__tests__/compaction-trail-store.test.ts +1 -79
  71. package/src/__tests__/compaction.benchmark.test.ts +0 -30
  72. package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
  73. package/src/__tests__/computer-use-tools.test.ts +2 -2
  74. package/src/__tests__/config-watcher.test.ts +28 -0
  75. package/src/__tests__/context-search-agent-runner.test.ts +6 -3
  76. package/src/__tests__/context-token-estimator.test.ts +34 -0
  77. package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
  78. package/src/__tests__/conversation-abort-tool-results.test.ts +70 -25
  79. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +9 -7
  80. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +22 -34
  81. package/src/__tests__/conversation-agent-loop-overflow.test.ts +476 -963
  82. package/src/__tests__/conversation-agent-loop.test.ts +823 -1321
  83. package/src/__tests__/conversation-analysis-routes.test.ts +7 -3
  84. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
  85. package/src/__tests__/conversation-clean-command.test.ts +5 -2
  86. package/src/__tests__/conversation-clear-safety.test.ts +20 -10
  87. package/src/__tests__/conversation-confirmation-signals.test.ts +15 -45
  88. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  89. package/src/__tests__/conversation-disk-view.test.ts +10 -17
  90. package/src/__tests__/conversation-fork-crud.test.ts +86 -172
  91. package/src/__tests__/conversation-fork-route.test.ts +16 -14
  92. package/src/__tests__/conversation-history-web-search.test.ts +11 -1
  93. package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
  94. package/src/__tests__/conversation-lifecycle.test.ts +3 -2
  95. package/src/__tests__/conversation-load-history-repair.test.ts +3 -2
  96. package/src/__tests__/conversation-load-history-stripped.test.ts +1 -1
  97. package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
  98. package/src/__tests__/conversation-pairing.test.ts +10 -7
  99. package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
  100. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -0
  101. package/src/__tests__/conversation-process-callsite.test.ts +27 -30
  102. package/src/__tests__/conversation-provider-retry-repair.test.ts +80 -51
  103. package/src/__tests__/conversation-queue.test.ts +272 -164
  104. package/src/__tests__/conversation-routes-disk-view.test.ts +6 -2
  105. package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
  106. package/src/__tests__/conversation-routes-slash-commands.test.ts +8 -7
  107. package/src/__tests__/conversation-runtime-assembly.test.ts +320 -314
  108. package/src/__tests__/conversation-runtime-workspace.test.ts +114 -36
  109. package/src/__tests__/conversation-slash-commands.test.ts +8 -42
  110. package/src/__tests__/conversation-slash-queue.test.ts +42 -31
  111. package/src/__tests__/conversation-slash-unknown.test.ts +13 -15
  112. package/src/__tests__/conversation-speed-override.test.ts +8 -22
  113. package/src/__tests__/conversation-starter-routes.test.ts +14 -6
  114. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +90 -15
  115. package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
  116. package/src/__tests__/conversation-surfaces-state-update.test.ts +5 -2
  117. package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -15
  118. package/src/__tests__/conversation-sync-tags.test.ts +27 -15
  119. package/src/__tests__/conversation-title-service.test.ts +135 -2
  120. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +23 -11
  121. package/src/__tests__/conversation-unread-route.test.ts +14 -2
  122. package/src/__tests__/conversation-usage.test.ts +0 -2
  123. package/src/__tests__/conversation-wipe.test.ts +1 -1
  124. package/src/__tests__/conversation-workspace-cache-state.test.ts +20 -17
  125. package/src/__tests__/conversation-workspace-injection.test.ts +114 -23
  126. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +34 -13
  127. package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
  128. package/src/__tests__/credential-execution-tools.test.ts +1 -2
  129. package/src/__tests__/credential-security-invariants.test.ts +0 -1
  130. package/src/__tests__/cross-provider-web-search.test.ts +220 -3
  131. package/src/__tests__/cu-unified-flow.test.ts +26 -1
  132. package/src/__tests__/db-acp-history.test.ts +101 -0
  133. package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -0
  134. package/src/__tests__/disk-pressure-guard.test.ts +66 -0
  135. package/src/__tests__/disk-pressure-routes.test.ts +9 -2
  136. package/src/__tests__/dm-persistence.test.ts +12 -3
  137. package/src/__tests__/dynamic-page-surface.test.ts +99 -0
  138. package/src/__tests__/edit-propagation.test.ts +1 -2
  139. package/src/__tests__/empty-response-hook.test.ts +304 -0
  140. package/src/__tests__/feature-flag-test-helpers.ts +2 -2
  141. package/src/__tests__/file-write-tool.test.ts +63 -0
  142. package/src/__tests__/filing-service.test.ts +2 -2
  143. package/src/__tests__/first-greeting.test.ts +55 -14
  144. package/src/__tests__/gemini-image-service.test.ts +13 -0
  145. package/src/__tests__/gemini-inline-media.test.ts +78 -0
  146. package/src/__tests__/gemini-provider.test.ts +351 -28
  147. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  148. package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
  149. package/src/__tests__/guardian-routing-state.test.ts +60 -71
  150. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +10 -8
  151. package/src/__tests__/heartbeat-disk-pressure.test.ts +2 -0
  152. package/src/__tests__/heartbeat-service.test.ts +3 -1
  153. package/src/__tests__/helpers/mock-provider.ts +110 -0
  154. package/src/__tests__/helpers/native-web-search-harness.ts +129 -0
  155. package/src/__tests__/history-repair-hook.test.ts +162 -0
  156. package/src/__tests__/history-repair-observability.test.ts +1 -1
  157. package/src/__tests__/history-repair.test.ts +2 -1
  158. package/src/__tests__/host-app-control-proxy.test.ts +2 -0
  159. package/src/__tests__/host-app-control-routes.test.ts +1 -1
  160. package/src/__tests__/host-cu-proxy.test.ts +2 -0
  161. package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
  162. package/src/__tests__/host-file-edit-tool.test.ts +4 -2
  163. package/src/__tests__/host-file-proxy.test.ts +31 -0
  164. package/src/__tests__/host-file-read-tool.test.ts +4 -2
  165. package/src/__tests__/host-file-write-tool.test.ts +9 -3
  166. package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
  167. package/src/__tests__/host-shell-tool.test.ts +9 -4
  168. package/src/__tests__/http-user-message-parity.test.ts +2 -2
  169. package/src/__tests__/identity-intro-cache.test.ts +47 -114
  170. package/src/__tests__/identity-routes.test.ts +248 -7
  171. package/src/__tests__/inbound-slack-persistence.test.ts +12 -3
  172. package/src/__tests__/injector-background-turn.test.ts +3 -9
  173. package/src/__tests__/injector-chain.test.ts +139 -275
  174. package/src/__tests__/injector-disk-pressure.test.ts +75 -41
  175. package/src/__tests__/injector-document-comments.test.ts +3 -3
  176. package/src/__tests__/injector-pkb-v2-silenced.test.ts +30 -22
  177. package/src/__tests__/injector-v3-suppression.test.ts +214 -0
  178. package/src/__tests__/internal-telemetry-routes.test.ts +109 -0
  179. package/src/__tests__/list-messages-attachments.test.ts +7 -8
  180. package/src/__tests__/list-messages-hidden-metadata.test.ts +55 -15
  181. package/src/__tests__/list-messages-page-latest.test.ts +60 -1
  182. package/src/__tests__/list-messages-tool-merge.test.ts +56 -6
  183. package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
  184. package/src/__tests__/llm-resolver.test.ts +23 -47
  185. package/src/__tests__/llm-usage-store.test.ts +268 -1
  186. package/src/__tests__/log-export-routes.test.ts +59 -0
  187. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
  188. package/src/__tests__/mcp-auth-routes.test.ts +15 -10
  189. package/src/__tests__/mcp-health-check.test.ts +18 -13
  190. package/src/__tests__/memory-retrieval-hook.test.ts +297 -0
  191. package/src/__tests__/memory-v2-static-injector.test.ts +103 -35
  192. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  193. package/src/__tests__/migration-export-http.test.ts +12 -12
  194. package/src/__tests__/migration-import-commit-http.test.ts +8 -8
  195. package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
  196. package/src/__tests__/migration-validate-http.test.ts +3 -3
  197. package/src/__tests__/native-web-search.test.ts +205 -20
  198. package/src/__tests__/notification-decision-identity.test.ts +9 -18
  199. package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
  200. package/src/__tests__/oauth-commands-routes.test.ts +1 -1
  201. package/src/__tests__/onboarding-template-contract.test.ts +12 -0
  202. package/src/__tests__/openai-image-service.test.ts +17 -0
  203. package/src/__tests__/openai-provider.test.ts +97 -71
  204. package/src/__tests__/openai-responses-provider.test.ts +21 -77
  205. package/src/__tests__/outbound-slack-persistence.test.ts +2 -1
  206. package/src/__tests__/{overflow-reduce-pipeline.test.ts → overflow-reduction-loop.test.ts} +64 -286
  207. package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
  208. package/src/__tests__/persist-unsendable-image.test.ts +215 -0
  209. package/src/__tests__/persistence-secret-redaction.test.ts +3 -1
  210. package/src/__tests__/pkb-autoinject.test.ts +2 -5
  211. package/src/__tests__/plugin-bootstrap.test.ts +63 -63
  212. package/src/__tests__/plugin-registry.test.ts +3 -76
  213. package/src/__tests__/plugin-route-contribution.test.ts +6 -16
  214. package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
  215. package/src/__tests__/plugin-tool-contribution.test.ts +10 -26
  216. package/src/__tests__/plugin-types.test.ts +3 -203
  217. package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
  218. package/src/__tests__/process-message-background-slack.test.ts +17 -16
  219. package/src/__tests__/process-message-display-content.test.ts +36 -44
  220. package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
  221. package/src/__tests__/provider-error-scenarios.test.ts +7 -6
  222. package/src/__tests__/provider-platform-proxy-integration.test.ts +3 -8
  223. package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
  224. package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
  225. package/src/__tests__/provider-usage-tracking.test.ts +0 -6
  226. package/src/__tests__/ratelimit.test.ts +9 -4
  227. package/src/__tests__/reaction-persistence.test.ts +1 -1
  228. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +5 -1
  229. package/src/__tests__/relay-server.test.ts +20 -13
  230. package/src/__tests__/resolve-trust-class.test.ts +4 -4
  231. package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
  232. package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
  233. package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
  234. package/src/__tests__/runtime-events-sse-reconnect.test.ts +390 -0
  235. package/src/__tests__/schedule-routes.test.ts +683 -12
  236. package/src/__tests__/schedule-store.test.ts +108 -0
  237. package/src/__tests__/schedule-tools.test.ts +160 -0
  238. package/src/__tests__/secret-ingress-http.test.ts +2 -2
  239. package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
  240. package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
  241. package/src/__tests__/secret-response-routing.test.ts +13 -11
  242. package/src/__tests__/send-endpoint-busy.test.ts +6 -2
  243. package/src/__tests__/server-history-render.test.ts +314 -1
  244. package/src/__tests__/shell-observability.test.ts +249 -0
  245. package/src/__tests__/skill-feature-flags-integration.test.ts +44 -11
  246. package/src/__tests__/skill-feature-flags.test.ts +6 -6
  247. package/src/__tests__/skill-load-feature-flag.test.ts +10 -10
  248. package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
  249. package/src/__tests__/skillssh-files.test.ts +1 -0
  250. package/src/__tests__/starter-task-flow.test.ts +6 -6
  251. package/src/__tests__/strip-memory-injections.test.ts +102 -14
  252. package/src/__tests__/subagent-call-site-routing.test.ts +3 -3
  253. package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
  254. package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
  255. package/src/__tests__/subagent-manager-notify.test.ts +1 -3
  256. package/src/__tests__/subagent-notify-parent.test.ts +1 -3
  257. package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
  258. package/src/__tests__/suggestion-routes.test.ts +3 -3
  259. package/src/__tests__/sync-message-contract.test.ts +19 -16
  260. package/src/__tests__/system-prompt.test.ts +74 -0
  261. package/src/__tests__/task-scheduler.test.ts +162 -1
  262. package/src/__tests__/terminal-tools.test.ts +9 -25
  263. package/src/__tests__/thread-backfill.test.ts +4 -9
  264. package/src/__tests__/title-generate-hook.test.ts +319 -0
  265. package/src/__tests__/tool-error-hook.test.ts +278 -0
  266. package/src/__tests__/tool-preview-lifecycle.test.ts +481 -16
  267. package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
  268. package/src/__tests__/tool-result-truncate-hook.test.ts +127 -0
  269. package/src/__tests__/tool-result-truncation.test.ts +1 -1
  270. package/src/__tests__/tools-audio-read.test.ts +113 -0
  271. package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
  272. package/src/__tests__/turn-events-store.test.ts +11 -7
  273. package/src/__tests__/ui-choice-copy-surfaces.test.ts +254 -0
  274. package/src/__tests__/ui-work-result-surface.test.ts +159 -0
  275. package/src/__tests__/usage-routes.test.ts +285 -1
  276. package/src/__tests__/user-plugin-loader.test.ts +2 -2
  277. package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
  278. package/src/__tests__/voice-session-bridge.test.ts +19 -10
  279. package/src/__tests__/web-search-backend-failure.test.ts +166 -0
  280. package/src/acp/__tests__/agent-process.test.ts +161 -0
  281. package/src/acp/__tests__/client-handler.test.ts +40 -0
  282. package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
  283. package/src/acp/__tests__/helpers/exec-file-stub.ts +101 -0
  284. package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
  285. package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
  286. package/src/acp/__tests__/session-manager-resume.test.ts +695 -0
  287. package/src/acp/agent-process.ts +61 -1
  288. package/src/acp/auto-install.test.ts +125 -0
  289. package/src/acp/auto-install.ts +174 -0
  290. package/src/acp/client-handler.ts +31 -0
  291. package/src/acp/feature-gate.test.ts +48 -0
  292. package/src/acp/feature-gate.ts +34 -0
  293. package/src/acp/prepare-agent-env.ts +52 -11
  294. package/src/acp/resolve-agent.test.ts +147 -6
  295. package/src/acp/resolve-agent.ts +81 -7
  296. package/src/acp/resume-hint.ts +22 -0
  297. package/src/acp/session-manager.ts +487 -71
  298. package/src/agent/compaction-circuit.ts +98 -0
  299. package/src/agent/loop.ts +651 -450
  300. package/src/api/README.md +19 -17
  301. package/src/api/constants/tool-execution.ts +21 -0
  302. package/src/api/events/assistant-activity-state.ts +75 -0
  303. package/src/api/events/assistant-outbound-attachment.ts +25 -27
  304. package/src/api/events/assistant-text-delta.ts +6 -8
  305. package/src/api/events/assistant-thinking-delta.ts +33 -0
  306. package/src/api/events/assistant-turn-start.ts +5 -7
  307. package/src/api/events/avatar-updated.ts +24 -0
  308. package/src/api/events/compaction-circuit-closed.ts +26 -0
  309. package/src/api/events/compaction-circuit-open.ts +28 -0
  310. package/src/api/events/confirmation-request.ts +114 -0
  311. package/src/api/events/contact-request.ts +33 -0
  312. package/src/api/events/conversation-error.ts +77 -0
  313. package/src/api/events/conversation-list-invalidated.ts +38 -0
  314. package/src/api/events/conversation-title-updated.ts +24 -0
  315. package/src/api/events/disk-pressure-status-changed.ts +61 -0
  316. package/src/api/events/document-comment-created.ts +24 -28
  317. package/src/api/events/document-comment-deleted.ts +6 -8
  318. package/src/api/events/document-comment-reopened.ts +6 -8
  319. package/src/api/events/document-comment-resolved.ts +8 -10
  320. package/src/api/events/document-editor-update.ts +27 -0
  321. package/src/api/events/error.ts +32 -0
  322. package/src/api/events/generation-cancelled.ts +4 -6
  323. package/src/api/events/generation-handoff.ts +13 -15
  324. package/src/api/events/home-feed-updated.ts +26 -0
  325. package/src/api/events/identity-changed.ts +32 -0
  326. package/src/api/events/interaction-resolved.ts +50 -0
  327. package/src/api/events/message-complete.ts +10 -12
  328. package/src/api/events/message-dequeued.ts +21 -0
  329. package/src/api/events/message-queued-deleted.ts +23 -0
  330. package/src/api/events/message-queued.ts +22 -0
  331. package/src/api/events/message-request-complete.ts +29 -0
  332. package/src/api/events/navigate-settings.ts +20 -0
  333. package/src/api/events/notification-intent.ts +33 -0
  334. package/src/api/events/open-url.ts +6 -8
  335. package/src/api/events/question-request.ts +67 -0
  336. package/src/api/events/relationship-state-updated.ts +4 -6
  337. package/src/api/events/secret-request.ts +42 -0
  338. package/src/api/events/subagent-event.ts +79 -0
  339. package/src/api/events/subagent-spawned.ts +40 -0
  340. package/src/api/events/subagent-status-changed.ts +65 -0
  341. package/src/api/events/sync-changed.ts +29 -0
  342. package/src/api/events/tool-output-chunk.ts +45 -0
  343. package/src/api/events/tool-result.ts +129 -0
  344. package/src/api/events/tool-use-preview-start.ts +32 -0
  345. package/src/api/events/tool-use-start.ts +8 -10
  346. package/src/api/events/trace-event.ts +69 -0
  347. package/src/api/events/turn-profile-auto-routed.ts +28 -0
  348. package/src/api/events/ui-surface-complete.ts +30 -0
  349. package/src/api/events/ui-surface-dismiss.ts +22 -0
  350. package/src/api/events/ui-surface-show.ts +67 -0
  351. package/src/api/events/ui-surface-update.ts +26 -0
  352. package/src/api/events/usage-update.ts +34 -0
  353. package/src/api/events/user-message-echo.ts +35 -0
  354. package/src/api/index.ts +389 -0
  355. package/src/api/requests/dictation.ts +45 -0
  356. package/src/api/responses/conversation-message.ts +374 -0
  357. package/src/api/responses/disk-pressure-status.ts +26 -0
  358. package/src/api/responses/home.ts +217 -0
  359. package/src/api/responses/llm-context-response.ts +2 -0
  360. package/src/api/responses/memory-v3-selection-log.ts +50 -0
  361. package/src/api/responses/subagent-detail.ts +48 -0
  362. package/src/approvals/guardian-decision-primitive.ts +7 -15
  363. package/src/approvals/guardian-request-resolvers.ts +7 -10
  364. package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
  365. package/src/avatar/__tests__/avatar-store.test.ts +198 -0
  366. package/src/avatar/avatar-manifest.ts +195 -0
  367. package/src/avatar/avatar-store.ts +113 -0
  368. package/src/avatar/traits-png-sync.ts +8 -2
  369. package/src/background-wake/next-wake.test.ts +31 -1
  370. package/src/background-wake/next-wake.ts +5 -1
  371. package/src/calls/call-conversation-messages.ts +6 -4
  372. package/src/calls/guardian-action-sweep.ts +6 -4
  373. package/src/calls/relay-server.ts +12 -8
  374. package/src/calls/voice-session-bridge.ts +13 -27
  375. package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
  376. package/src/cli/commands/__tests__/notifications.test.ts +58 -14
  377. package/src/cli/commands/avatar.ts +17 -11
  378. package/src/cli/commands/conversations.ts +15 -1
  379. package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
  380. package/src/cli/commands/db/__tests__/status.test.ts +253 -0
  381. package/src/cli/commands/db/format.ts +48 -0
  382. package/src/cli/commands/db/index.ts +29 -0
  383. package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
  384. package/src/cli/commands/db/repair-step-integrity.ts +146 -0
  385. package/src/cli/commands/db/repair-steps.ts +164 -0
  386. package/src/cli/commands/db/repair.ts +141 -0
  387. package/src/cli/commands/db/status.ts +366 -0
  388. package/src/cli/commands/memory-v3.ts +159 -445
  389. package/src/cli/commands/notifications.ts +112 -60
  390. package/src/cli/lib/cli-colors.ts +24 -6
  391. package/src/cli/program.ts +4 -5
  392. package/src/config/__tests__/feature-flag-registry-guard.test.ts +4 -4
  393. package/src/config/acp-defaults.test.ts +10 -0
  394. package/src/config/acp-defaults.ts +6 -0
  395. package/src/config/assistant-feature-flags.ts +24 -13
  396. package/src/config/bundled-skills/acp/SKILL.md +64 -30
  397. package/src/config/bundled-skills/acp/TOOLS.json +4 -4
  398. package/src/config/bundled-skills/app-builder/SKILL.md +224 -387
  399. package/src/config/bundled-skills/app-builder/TOOLS.json +29 -0
  400. package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
  401. package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
  402. package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
  403. package/src/config/bundled-skills/app-builder/references/examples/README.md +17 -0
  404. package/src/config/bundled-skills/app-builder/references/examples/expense-tracker.md +515 -0
  405. package/src/config/bundled-skills/app-builder/references/examples/focus-timer.md +342 -0
  406. package/src/config/bundled-skills/app-builder/references/examples/habit-tracker.md +490 -0
  407. package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
  408. package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
  409. package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
  410. package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
  411. package/src/config/bundled-skills/messaging/SKILL.md +0 -7
  412. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
  413. package/src/config/bundled-skills/schedule/SKILL.md +1 -1
  414. package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
  415. package/src/config/bundled-tool-registry.ts +2 -0
  416. package/src/config/call-site-defaults.ts +2 -7
  417. package/src/config/feature-flag-cache.ts +3 -3
  418. package/src/config/feature-flag-registry.json +68 -12
  419. package/src/config/schemas/__tests__/memory-v2.test.ts +2 -226
  420. package/src/config/schemas/__tests__/memory-v3.test.ts +25 -0
  421. package/src/config/schemas/call-site-catalog.ts +8 -15
  422. package/src/config/schemas/heartbeat.ts +9 -0
  423. package/src/config/schemas/llm.ts +3 -3
  424. package/src/config/schemas/memory-lifecycle.ts +24 -0
  425. package/src/config/schemas/memory-v2.ts +8 -253
  426. package/src/config/schemas/memory-v3.ts +47 -0
  427. package/src/config/schemas/memory.ts +6 -1
  428. package/src/config/schemas/platform.ts +8 -0
  429. package/src/config/schemas/timeouts.ts +3 -1
  430. package/src/config/seed-inference-profiles.ts +2 -2
  431. package/src/config/skills.ts +13 -0
  432. package/src/context/compactor.ts +55 -32
  433. package/src/context/strip-injections.ts +128 -0
  434. package/src/context/token-estimator.ts +42 -0
  435. package/src/context/tool-result-truncation.ts +1 -66
  436. package/src/context/window-manager.ts +143 -27
  437. package/src/credential-execution/executable-discovery.ts +16 -0
  438. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +6 -0
  439. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
  440. package/src/daemon/__tests__/inference-profile-notification.test.ts +153 -0
  441. package/src/daemon/__tests__/native-web-search-metadata.test.ts +10 -8
  442. package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
  443. package/src/daemon/approval-generators.ts +4 -4
  444. package/src/daemon/assistant-attachments.ts +1 -1
  445. package/src/daemon/config-watcher.ts +7 -1
  446. package/src/daemon/context-overflow-reducer.ts +0 -1
  447. package/src/daemon/conversation-agent-loop-handlers.ts +793 -215
  448. package/src/daemon/conversation-agent-loop.ts +487 -1479
  449. package/src/daemon/conversation-error.ts +7 -7
  450. package/src/daemon/conversation-history.ts +27 -10
  451. package/src/daemon/conversation-launch.ts +4 -8
  452. package/src/daemon/conversation-lifecycle.ts +13 -42
  453. package/src/daemon/conversation-messaging.ts +8 -9
  454. package/src/daemon/conversation-notifiers.ts +7 -5
  455. package/src/daemon/conversation-process.ts +109 -93
  456. package/src/daemon/conversation-registry.ts +159 -0
  457. package/src/daemon/conversation-runtime-assembly.ts +218 -385
  458. package/src/daemon/conversation-slash.ts +6 -25
  459. package/src/daemon/conversation-store.ts +15 -95
  460. package/src/daemon/conversation-surfaces.ts +277 -73
  461. package/src/daemon/conversation-tool-setup.ts +5 -29
  462. package/src/daemon/conversation-workspace.ts +17 -0
  463. package/src/daemon/conversation.ts +123 -146
  464. package/src/daemon/daemon-skill-host.ts +2 -6
  465. package/src/daemon/disk-pressure-guard.ts +35 -29
  466. package/src/daemon/external-plugins-bootstrap.ts +53 -33
  467. package/src/daemon/first-greeting.ts +26 -4
  468. package/src/daemon/guardian-action-generators.ts +2 -2
  469. package/src/daemon/handlers/config-a2a.ts +51 -36
  470. package/src/daemon/handlers/config-slack-channel.ts +20 -14
  471. package/src/daemon/handlers/config-telegram.ts +16 -2
  472. package/src/daemon/handlers/conversations.ts +9 -23
  473. package/src/daemon/handlers/shared.ts +158 -82
  474. package/src/daemon/handlers/skills.ts +53 -20
  475. package/src/daemon/host-app-control-proxy.ts +54 -1
  476. package/src/daemon/host-cu-proxy.ts +46 -22
  477. package/src/daemon/host-file-proxy.ts +25 -1
  478. package/src/daemon/host-proxy-preactivation.ts +25 -6
  479. package/src/daemon/lifecycle.ts +53 -55
  480. package/src/daemon/message-protocol.ts +2 -3
  481. package/src/daemon/message-provenance.ts +49 -0
  482. package/src/daemon/message-types/apps.ts +1 -29
  483. package/src/daemon/message-types/contacts.ts +3 -20
  484. package/src/daemon/message-types/conversations.ts +13 -111
  485. package/src/daemon/message-types/documents.ts +3 -9
  486. package/src/daemon/message-types/home.ts +4 -17
  487. package/src/daemon/message-types/integrations.ts +2 -6
  488. package/src/daemon/message-types/messages.ts +37 -400
  489. package/src/daemon/message-types/notifications.ts +2 -32
  490. package/src/daemon/message-types/settings.ts +3 -8
  491. package/src/daemon/message-types/skills.ts +4 -0
  492. package/src/daemon/message-types/surfaces.ts +138 -3
  493. package/src/daemon/message-types/sync.ts +12 -25
  494. package/src/daemon/message-types/workspace.ts +3 -11
  495. package/src/daemon/now-scratchpad.ts +21 -0
  496. package/src/daemon/orphan-reaper.test.ts +210 -0
  497. package/src/daemon/orphan-reaper.ts +240 -0
  498. package/src/daemon/overflow-reduction-loop.ts +230 -0
  499. package/src/daemon/persist-unsendable-image.ts +117 -0
  500. package/src/daemon/process-message.ts +50 -49
  501. package/src/daemon/server.ts +14 -0
  502. package/src/daemon/tool-side-effects.ts +10 -7
  503. package/src/daemon/trace-emitter.ts +6 -4
  504. package/src/daemon/trust-context.ts +32 -0
  505. package/src/daemon/wake-target-adapter.ts +14 -2
  506. package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -1
  507. package/src/heartbeat/heartbeat-run-store.ts +54 -1
  508. package/src/heartbeat/heartbeat-service.ts +42 -0
  509. package/src/home/feed-types.ts +36 -221
  510. package/src/home/home-greeting-cache.ts +24 -1
  511. package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
  512. package/src/ipc/__tests__/email-ipc.test.ts +0 -9
  513. package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
  514. package/src/ipc/gateway-client.test.ts +2 -2
  515. package/src/ipc/gateway-client.ts +3 -3
  516. package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
  517. package/src/ipc/routes/route-adapter.ts +45 -6
  518. package/src/ipc/skill-routes/__tests__/memory.test.ts +33 -9
  519. package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
  520. package/src/ipc/skill-routes/__tests__/registries.test.ts +28 -18
  521. package/src/ipc/skill-routes/memory.ts +29 -14
  522. package/src/ipc/skill-routes/providers.ts +5 -6
  523. package/src/ipc/skill-routes/registries.ts +13 -61
  524. package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
  525. package/src/media/gemini-image-service.ts +15 -0
  526. package/src/media/openai-image-service.ts +14 -0
  527. package/src/media/types.ts +34 -0
  528. package/src/memory/__tests__/conversation-queries.test.ts +192 -8
  529. package/src/memory/__tests__/db-maintenance.test.ts +128 -0
  530. package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
  531. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +56 -0
  532. package/src/memory/__tests__/memory-retrospective-job.test.ts +10 -6
  533. package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
  534. package/src/memory/auth-fallback-events-store.ts +94 -0
  535. package/src/memory/context-search/agent-runner.ts +2 -4
  536. package/src/memory/conversation-crud.ts +39 -8
  537. package/src/memory/conversation-queries.ts +78 -22
  538. package/src/memory/conversation-starter-checkpoints.ts +1 -0
  539. package/src/memory/conversation-title-service.ts +65 -41
  540. package/src/memory/db-init.ts +14 -0
  541. package/src/memory/db-maintenance.ts +18 -2
  542. package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
  543. package/src/memory/graph/consolidation.ts +8 -11
  544. package/src/memory/graph/conversation-graph-memory.ts +106 -8
  545. package/src/memory/graph/extraction.ts +6 -9
  546. package/src/memory/graph/narrative.ts +2 -2
  547. package/src/memory/graph/pattern-scan.ts +2 -2
  548. package/src/memory/graph/retriever.ts +20 -26
  549. package/src/memory/graph/tools.ts +4 -4
  550. package/src/memory/job-handlers/conversation-starters.ts +45 -34
  551. package/src/memory/job-handlers/summarization.ts +1 -2
  552. package/src/memory/jobs-store.ts +36 -1
  553. package/src/memory/jobs-worker.ts +82 -43
  554. package/src/memory/llm-request-log-source-clickhouse.ts +5 -31
  555. package/src/memory/llm-request-log-source-local.ts +0 -11
  556. package/src/memory/llm-request-log-source.ts +9 -25
  557. package/src/memory/llm-request-log-store.ts +0 -41
  558. package/src/memory/llm-usage-store.ts +234 -50
  559. package/src/memory/memory-marker.ts +17 -0
  560. package/src/memory/memory-retrospective-job.ts +6 -2
  561. package/src/memory/memory-v2-activation-log-store.ts +1 -83
  562. package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +6 -5
  563. package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
  564. package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
  565. package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
  566. package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
  567. package/src/memory/migrations/270-schedule-source-conversation.ts +13 -0
  568. package/src/memory/migrations/271-create-auth-fallback-events.ts +21 -0
  569. package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
  570. package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
  571. package/src/memory/migrations/index.ts +7 -0
  572. package/src/memory/pkb/autoinject.ts +61 -0
  573. package/src/memory/pkb/context.ts +50 -0
  574. package/src/memory/pkb/types.ts +14 -0
  575. package/src/memory/schedule-attribution-sql.ts +104 -0
  576. package/src/memory/schema/acp.ts +4 -0
  577. package/src/memory/schema/infrastructure.ts +27 -0
  578. package/src/memory/usage-grouped-buckets.ts +6 -1
  579. package/src/memory/v2/__tests__/consolidation-job.test.ts +125 -1
  580. package/src/memory/v2/__tests__/migration.test.ts +11 -3
  581. package/src/memory/v2/__tests__/page-index.test.ts +37 -1
  582. package/src/memory/v2/__tests__/router.test.ts +14 -4
  583. package/src/memory/v2/__tests__/sweep-job.test.ts +6 -5
  584. package/src/memory/v2/backfill-jobs.ts +6 -0
  585. package/src/memory/v2/consolidation-job.ts +99 -10
  586. package/src/memory/v2/migration.ts +5 -3
  587. package/src/memory/v2/page-index.ts +11 -0
  588. package/src/memory/v2/router.ts +8 -11
  589. package/src/memory/v2/sweep-job.ts +8 -11
  590. package/src/memory/v2/types.ts +1 -0
  591. package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
  592. package/src/messaging/providers/slack/render-transcript.ts +2 -2
  593. package/src/messaging/style-analyzer.ts +8 -11
  594. package/src/notifications/conversation-pairing.ts +8 -13
  595. package/src/notifications/decision-engine.ts +16 -16
  596. package/src/notifications/home-feed-side-effect.ts +12 -1
  597. package/src/notifications/preference-extractor.ts +11 -14
  598. package/src/permissions/prompter.ts +46 -36
  599. package/src/permissions/question-prompter.test.ts +35 -26
  600. package/src/permissions/question-prompter.ts +6 -10
  601. package/src/plugin-api/constants.ts +4 -0
  602. package/src/plugin-api/index.ts +9 -5
  603. package/src/plugin-api/types.ts +176 -4
  604. package/src/plugins/defaults/compaction/compact.ts +59 -0
  605. package/src/plugins/defaults/compaction/package.json +15 -0
  606. package/src/plugins/defaults/compaction/register.ts +24 -0
  607. package/src/plugins/defaults/empty-response/hooks/stop.ts +126 -0
  608. package/src/plugins/defaults/empty-response/package.json +15 -0
  609. package/src/plugins/defaults/empty-response/register.ts +23 -0
  610. package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
  611. package/src/plugins/defaults/history-repair/package.json +15 -0
  612. package/src/plugins/defaults/history-repair/register.ts +24 -0
  613. package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
  614. package/src/plugins/defaults/index.ts +22 -49
  615. package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +95 -0
  616. package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +216 -0
  617. package/src/plugins/defaults/memory-retrieval/injector-chain.ts +35 -0
  618. package/src/plugins/defaults/{injectors.ts → memory-retrieval/injectors.ts} +295 -112
  619. package/src/plugins/defaults/memory-v3-shadow/__tests__/assign.test.ts +242 -0
  620. package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +118 -0
  621. package/src/plugins/defaults/memory-v3-shadow/__tests__/core.test.ts +39 -0
  622. package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/eval-turns.json +36 -0
  623. package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/live-turns.json +37 -0
  624. package/src/plugins/defaults/memory-v3-shadow/__tests__/health.test.ts +219 -0
  625. package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +330 -0
  626. package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +288 -0
  627. package/src/plugins/defaults/memory-v3-shadow/__tests__/needle.test.ts +107 -0
  628. package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +436 -0
  629. package/src/plugins/defaults/memory-v3-shadow/__tests__/provider-blocks.test.ts +13 -0
  630. package/src/plugins/defaults/memory-v3-shadow/__tests__/reconcile.test.ts +274 -0
  631. package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +61 -0
  632. package/src/plugins/defaults/memory-v3-shadow/__tests__/router.test.ts +332 -0
  633. package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +179 -0
  634. package/src/plugins/defaults/memory-v3-shadow/__tests__/selector.test.ts +470 -0
  635. package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +432 -0
  636. package/src/plugins/defaults/memory-v3-shadow/__tests__/snapshot.test.ts +168 -0
  637. package/src/plugins/defaults/memory-v3-shadow/__tests__/tree.test.ts +192 -0
  638. package/src/plugins/defaults/memory-v3-shadow/__tests__/types.test.ts +54 -0
  639. package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-eviction.test.ts +106 -0
  640. package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-skeleton.test.ts +44 -0
  641. package/src/plugins/defaults/memory-v3-shadow/assign.ts +268 -0
  642. package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +124 -0
  643. package/src/plugins/defaults/memory-v3-shadow/core.ts +26 -0
  644. package/src/plugins/defaults/memory-v3-shadow/data/README.md +84 -0
  645. package/src/plugins/defaults/memory-v3-shadow/data/assignments.json +5 -0
  646. package/src/plugins/defaults/memory-v3-shadow/data/core.json +1 -0
  647. package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-a/topic-x.md +9 -0
  648. package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-a/topic-y.md +9 -0
  649. package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-b/topic-z.md +9 -0
  650. package/src/plugins/defaults/memory-v3-shadow/health.ts +0 -0
  651. package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
  652. package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
  653. package/src/plugins/defaults/memory-v3-shadow/injector.ts +75 -0
  654. package/src/plugins/defaults/memory-v3-shadow/llm-retry.ts +32 -0
  655. package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +314 -0
  656. package/src/plugins/defaults/memory-v3-shadow/needle.ts +115 -0
  657. package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +126 -0
  658. package/src/plugins/defaults/memory-v3-shadow/package.json +15 -0
  659. package/src/plugins/defaults/memory-v3-shadow/page-content.ts +34 -0
  660. package/src/plugins/defaults/memory-v3-shadow/provider-blocks.ts +26 -0
  661. package/src/plugins/defaults/memory-v3-shadow/reconcile.ts +523 -0
  662. package/src/plugins/defaults/memory-v3-shadow/register.ts +26 -0
  663. package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +32 -0
  664. package/src/plugins/defaults/memory-v3-shadow/router.ts +190 -0
  665. package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +84 -0
  666. package/src/plugins/defaults/memory-v3-shadow/selector.ts +226 -0
  667. package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +349 -0
  668. package/src/plugins/defaults/memory-v3-shadow/snapshot.ts +209 -0
  669. package/src/plugins/defaults/memory-v3-shadow/tree.ts +174 -0
  670. package/src/plugins/defaults/memory-v3-shadow/types.ts +59 -0
  671. package/src/plugins/defaults/memory-v3-shadow/working-set.ts +88 -0
  672. package/src/plugins/defaults/title-generate/hooks/stop.ts +75 -0
  673. package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +35 -0
  674. package/src/plugins/defaults/title-generate/package.json +15 -0
  675. package/src/plugins/defaults/title-generate/register.ts +35 -0
  676. package/src/plugins/defaults/tool-error/hooks/post-tool-use.ts +118 -0
  677. package/src/plugins/defaults/tool-error/package.json +15 -0
  678. package/src/plugins/defaults/tool-error/register.ts +23 -0
  679. package/src/plugins/defaults/tool-result-truncate/hooks/post-tool-use.ts +32 -0
  680. package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
  681. package/src/plugins/defaults/tool-result-truncate/register.ts +24 -0
  682. package/src/plugins/defaults/tool-result-truncate/terminal.ts +132 -0
  683. package/src/plugins/external-plugin-loader.ts +2 -2
  684. package/src/plugins/pipeline.ts +6 -317
  685. package/src/plugins/registry.ts +10 -55
  686. package/src/plugins/types.ts +79 -849
  687. package/src/plugins/user-loader.ts +4 -3
  688. package/src/proactive-artifact/aux-message-injector.ts +4 -5
  689. package/src/proactive-artifact/job.test.ts +28 -21
  690. package/src/proactive-artifact/job.ts +3 -1
  691. package/src/prompts/__tests__/system-prompt.test.ts +42 -0
  692. package/src/prompts/sections.ts +20 -7
  693. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +64 -0
  694. package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
  695. package/src/prompts/templates/BOOTSTRAP.md +7 -3
  696. package/src/prompts/templates/system-sections.ts +21 -0
  697. package/src/providers/__tests__/retry-callsite.test.ts +25 -25
  698. package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
  699. package/src/providers/anthropic/client.ts +61 -34
  700. package/src/providers/call-site-routing.ts +1 -9
  701. package/src/providers/gemini/client.ts +152 -34
  702. package/src/providers/gemini/inline-media.ts +74 -0
  703. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -2
  704. package/src/providers/openai/chat-completions-provider.ts +45 -4
  705. package/src/providers/openai/responses-provider.ts +1 -4
  706. package/src/providers/openrouter/client.ts +2 -6
  707. package/src/providers/placeholder-sentinels.ts +35 -0
  708. package/src/providers/provider-send-message.ts +6 -6
  709. package/src/providers/ratelimit.ts +1 -9
  710. package/src/providers/retry.ts +0 -5
  711. package/src/providers/types.ts +11 -2
  712. package/src/providers/usage-tracking.ts +1 -9
  713. package/src/runtime/__tests__/agent-wake.test.ts +141 -32
  714. package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
  715. package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
  716. package/src/runtime/agent-wake.ts +95 -23
  717. package/src/runtime/assistant-event-hub.ts +38 -8
  718. package/src/runtime/assistant-stream-state.ts +368 -0
  719. package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
  720. package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
  721. package/src/runtime/auth/route-policy.ts +42 -1079
  722. package/src/runtime/background-job-runner.ts +1 -4
  723. package/src/runtime/btw-sidechain.ts +3 -1
  724. package/src/runtime/channel-approvals.ts +4 -15
  725. package/src/runtime/channel-invite-transport.ts +5 -6
  726. package/src/runtime/channel-readiness-service.ts +2 -5
  727. package/src/runtime/channel-retry-sweep.ts +12 -16
  728. package/src/runtime/http-router.ts +35 -43
  729. package/src/runtime/http-types.ts +23 -71
  730. package/src/runtime/interactive-ui.ts +1 -1
  731. package/src/runtime/invite-instruction-generator.ts +3 -3
  732. package/src/runtime/pending-interactions.ts +3 -2
  733. package/src/runtime/routes/__tests__/acp-routes.test.ts +253 -55
  734. package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
  735. package/src/runtime/routes/__tests__/consolidation-routes.test.ts +265 -2
  736. package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
  737. package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +62 -32
  738. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
  739. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +31 -1
  740. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -22
  741. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +6 -2
  742. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +7 -2
  743. package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
  744. package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
  745. package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
  746. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +5 -4
  747. package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
  748. package/src/runtime/routes/__tests__/tts-routes.test.ts +9 -5
  749. package/src/runtime/routes/acp-routes.test.ts +186 -100
  750. package/src/runtime/routes/acp-routes.ts +110 -35
  751. package/src/runtime/routes/app-management-routes.ts +93 -131
  752. package/src/runtime/routes/app-routes.ts +38 -20
  753. package/src/runtime/routes/approval-routes.ts +17 -5
  754. package/src/runtime/routes/attachment-routes.ts +51 -16
  755. package/src/runtime/routes/audio-routes.ts +1 -0
  756. package/src/runtime/routes/audit-routes.ts +5 -0
  757. package/src/runtime/routes/auth-routes.ts +5 -0
  758. package/src/runtime/routes/avatar-routes.ts +264 -59
  759. package/src/runtime/routes/background-tool-routes.ts +9 -0
  760. package/src/runtime/routes/background-wake-routes.ts +13 -3
  761. package/src/runtime/routes/backup-routes.ts +45 -0
  762. package/src/runtime/routes/bookmark-routes.ts +13 -0
  763. package/src/runtime/routes/brain-graph-routes.ts +9 -0
  764. package/src/runtime/routes/browser-routes.ts +6 -1
  765. package/src/runtime/routes/browser-tabs-routes.ts +11 -10
  766. package/src/runtime/routes/btw-routes.ts +34 -24
  767. package/src/runtime/routes/cache-routes.ts +13 -0
  768. package/src/runtime/routes/call-routes.ts +21 -10
  769. package/src/runtime/routes/channel-availability-routes.ts +5 -1
  770. package/src/runtime/routes/channel-readiness-routes.ts +37 -4
  771. package/src/runtime/routes/channel-route-definitions.ts +21 -0
  772. package/src/runtime/routes/channel-verification-routes.ts +21 -0
  773. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
  774. package/src/runtime/routes/client-routes.ts +9 -0
  775. package/src/runtime/routes/consolidation-routes.ts +133 -25
  776. package/src/runtime/routes/contact-prompt-routes.ts +9 -0
  777. package/src/runtime/routes/contact-routes.ts +90 -23
  778. package/src/runtime/routes/content-source-routes.ts +5 -1
  779. package/src/runtime/routes/conversation-analysis-routes.ts +5 -1
  780. package/src/runtime/routes/conversation-attention-routes.ts +5 -0
  781. package/src/runtime/routes/conversation-cli-routes.ts +54 -7
  782. package/src/runtime/routes/conversation-compaction-routes.ts +54 -25
  783. package/src/runtime/routes/conversation-list-routes.ts +81 -12
  784. package/src/runtime/routes/conversation-management-routes.ts +57 -14
  785. package/src/runtime/routes/conversation-query-routes.ts +90 -41
  786. package/src/runtime/routes/conversation-routes.ts +446 -204
  787. package/src/runtime/routes/conversation-starter-routes.ts +35 -20
  788. package/src/runtime/routes/conversations-import-routes.ts +30 -8
  789. package/src/runtime/routes/credential-prompt-routes.ts +5 -0
  790. package/src/runtime/routes/credential-routes.ts +25 -6
  791. package/src/runtime/routes/debug-bash-routes.ts +5 -0
  792. package/src/runtime/routes/debug-routes.ts +11 -2
  793. package/src/runtime/routes/defer-routes.ts +13 -0
  794. package/src/runtime/routes/diagnostics-routes.ts +37 -46
  795. package/src/runtime/routes/disk-pressure-routes.ts +17 -31
  796. package/src/runtime/routes/document-comments-routes.ts +46 -27
  797. package/src/runtime/routes/documents-routes.ts +25 -10
  798. package/src/runtime/routes/domain-routes.ts +98 -51
  799. package/src/runtime/routes/email-routes.ts +33 -0
  800. package/src/runtime/routes/epoch-millis-range.ts +34 -0
  801. package/src/runtime/routes/events-routes.ts +107 -8
  802. package/src/runtime/routes/filing-routes.ts +9 -4
  803. package/src/runtime/routes/gateway-log-routes.ts +31 -4
  804. package/src/runtime/routes/global-search-routes.ts +53 -50
  805. package/src/runtime/routes/group-routes.ts +21 -5
  806. package/src/runtime/routes/guardian-action-routes.ts +9 -0
  807. package/src/runtime/routes/guardian-approval-interception.ts +0 -31
  808. package/src/runtime/routes/heartbeat-routes.ts +57 -21
  809. package/src/runtime/routes/home-feed-routes.ts +23 -19
  810. package/src/runtime/routes/home-state-routes.ts +8 -40
  811. package/src/runtime/routes/host-app-control-routes.ts +6 -1
  812. package/src/runtime/routes/host-bash-routes.ts +5 -0
  813. package/src/runtime/routes/host-browser-routes.ts +13 -0
  814. package/src/runtime/routes/host-cu-routes.ts +6 -1
  815. package/src/runtime/routes/host-file-routes.ts +26 -6
  816. package/src/runtime/routes/host-transfer-routes.ts +13 -2
  817. package/src/runtime/routes/http-adapter.ts +1 -2
  818. package/src/runtime/routes/identity-intro-cache.ts +28 -40
  819. package/src/runtime/routes/identity-routes.ts +236 -20
  820. package/src/runtime/routes/image-generation-routes.ts +45 -2
  821. package/src/runtime/routes/inbound-message-handler.ts +16 -12
  822. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
  823. package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
  824. package/src/runtime/routes/index.ts +2 -0
  825. package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
  826. package/src/runtime/routes/inference-provider-connection-routes.ts +21 -5
  827. package/src/runtime/routes/inference-send-routes.ts +11 -11
  828. package/src/runtime/routes/integrations/a2a.ts +32 -7
  829. package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +16 -0
  830. package/src/runtime/routes/integrations/slack/channel.ts +23 -3
  831. package/src/runtime/routes/integrations/slack/share.ts +36 -8
  832. package/src/runtime/routes/integrations/telegram.ts +34 -9
  833. package/src/runtime/routes/integrations/twilio.ts +77 -7
  834. package/src/runtime/routes/integrations/vercel.ts +3 -3
  835. package/src/runtime/routes/internal-oauth-routes.ts +5 -0
  836. package/src/runtime/routes/internal-telemetry-routes.ts +88 -0
  837. package/src/runtime/routes/internal-twilio-routes.ts +13 -0
  838. package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
  839. package/src/runtime/routes/log-export-routes.ts +36 -10
  840. package/src/runtime/routes/mcp-auth-routes.ts +25 -0
  841. package/src/runtime/routes/memory-item-routes.ts +21 -10
  842. package/src/runtime/routes/memory-v2-routes.ts +105 -44
  843. package/src/runtime/routes/memory-v3-routes.ts +306 -408
  844. package/src/runtime/routes/migration-rollback-routes.ts +5 -1
  845. package/src/runtime/routes/migration-routes.ts +29 -0
  846. package/src/runtime/routes/notification-routes.ts +17 -1
  847. package/src/runtime/routes/oauth-apps.ts +99 -23
  848. package/src/runtime/routes/oauth-commands-routes.ts +37 -14
  849. package/src/runtime/routes/oauth-connect-routes.ts +9 -0
  850. package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
  851. package/src/runtime/routes/oauth-providers.ts +79 -15
  852. package/src/runtime/routes/platform-routes.ts +102 -5
  853. package/src/runtime/routes/playground/__tests__/force-compact.test.ts +9 -6
  854. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
  855. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
  856. package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
  857. package/src/runtime/routes/playground/force-compact.ts +2 -2
  858. package/src/runtime/routes/playground/helpers.ts +1 -2
  859. package/src/runtime/routes/playground/inject-failures.ts +13 -8
  860. package/src/runtime/routes/playground/reset-circuit.ts +14 -9
  861. package/src/runtime/routes/playground/seed-conversation.ts +1 -1
  862. package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
  863. package/src/runtime/routes/playground/state.ts +4 -3
  864. package/src/runtime/routes/plugins-routes.ts +22 -19
  865. package/src/runtime/routes/profiler-routes.ts +17 -4
  866. package/src/runtime/routes/ps-routes.ts +5 -0
  867. package/src/runtime/routes/publish-routes.ts +13 -3
  868. package/src/runtime/routes/question-routes.ts +5 -0
  869. package/src/runtime/routes/recording-routes.ts +25 -12
  870. package/src/runtime/routes/rename-conversation-routes.ts +10 -0
  871. package/src/runtime/routes/sanity-routes.ts +9 -2
  872. package/src/runtime/routes/schedule-routes.ts +288 -88
  873. package/src/runtime/routes/secret-routes.ts +31 -6
  874. package/src/runtime/routes/sequence-routes.ts +33 -0
  875. package/src/runtime/routes/settings-routes.ts +65 -19
  876. package/src/runtime/routes/skills-routes.ts +166 -73
  877. package/src/runtime/routes/slack-channel-routes.ts +5 -0
  878. package/src/runtime/routes/stt-routes.ts +13 -6
  879. package/src/runtime/routes/subagents-routes.ts +24 -18
  880. package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
  881. package/src/runtime/routes/surface-action-routes.ts +9 -0
  882. package/src/runtime/routes/surface-content-routes.ts +10 -2
  883. package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
  884. package/src/runtime/routes/task-routes.ts +37 -0
  885. package/src/runtime/routes/telemetry-routes.ts +9 -0
  886. package/src/runtime/routes/tool-call-confirmation-enrichment.test.ts +161 -0
  887. package/src/runtime/routes/tool-call-confirmation-enrichment.ts +107 -0
  888. package/src/runtime/routes/trace-event-routes.ts +42 -1
  889. package/src/runtime/routes/trust-rules-routes.ts +31 -2
  890. package/src/runtime/routes/tts-routes.ts +48 -6
  891. package/src/runtime/routes/types.ts +83 -16
  892. package/src/runtime/routes/ui-request-routes.ts +5 -0
  893. package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
  894. package/src/runtime/routes/usage-routes.ts +118 -42
  895. package/src/runtime/routes/user-routes-cli.ts +9 -0
  896. package/src/runtime/routes/user-routes.ts +5 -1
  897. package/src/runtime/routes/wake-conversation-routes.ts +5 -0
  898. package/src/runtime/routes/watcher-routes.ts +21 -0
  899. package/src/runtime/routes/webhook-routes.ts +50 -2
  900. package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
  901. package/src/runtime/routes/work-items-routes.ts +49 -23
  902. package/src/runtime/routes/workspace-commit-routes.ts +5 -0
  903. package/src/runtime/routes/workspace-routes.test.ts +42 -0
  904. package/src/runtime/routes/workspace-routes.ts +124 -9
  905. package/src/runtime/services/__tests__/analyze-conversation.test.ts +8 -4
  906. package/src/runtime/services/analyze-conversation.ts +5 -8
  907. package/src/runtime/services/conversation-serializer.ts +24 -2
  908. package/src/runtime/sync/resource-sync-events.ts +16 -2
  909. package/src/runtime/sync/sync-publisher.ts +2 -2
  910. package/src/schedule/run-script.ts +28 -3
  911. package/src/schedule/schedule-store.ts +28 -1
  912. package/src/schedule/schedule-usage-store.ts +83 -0
  913. package/src/schedule/scheduler.ts +15 -6
  914. package/src/signals/cancel.ts +2 -4
  915. package/src/signals/user-message.ts +5 -8
  916. package/src/skills/catalog-files.ts +4 -1
  917. package/src/skills/catalog-install.ts +3 -0
  918. package/src/skills/categories-cache.ts +118 -0
  919. package/src/skills/clawhub-files.ts +1 -0
  920. package/src/skills/skillssh-files.ts +1 -0
  921. package/src/subagent/manager.ts +20 -11
  922. package/src/telemetry/types.ts +55 -1
  923. package/src/telemetry/usage-telemetry-reporter.test.ts +250 -4
  924. package/src/telemetry/usage-telemetry-reporter.ts +88 -2
  925. package/src/tools/acp/context.ts +20 -0
  926. package/src/tools/acp/list-agents.test.ts +7 -1
  927. package/src/tools/acp/spawn.test.ts +198 -93
  928. package/src/tools/acp/spawn.ts +32 -70
  929. package/src/tools/acp/steer.test.ts +105 -8
  930. package/src/tools/acp/steer.ts +48 -17
  931. package/src/tools/apps/definitions.ts +8 -4
  932. package/src/tools/apps/executors.ts +13 -8
  933. package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
  934. package/src/tools/ask-question/ask-question-tool.ts +85 -90
  935. package/src/tools/computer-use/definitions.ts +28 -24
  936. package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
  937. package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
  938. package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
  939. package/src/tools/credentials/vault.ts +112 -111
  940. package/src/tools/execution-target.ts +1 -1
  941. package/src/tools/execution-timeout.ts +3 -4
  942. package/src/tools/executor.ts +1 -53
  943. package/src/tools/filesystem/edit.ts +45 -42
  944. package/src/tools/filesystem/list.ts +33 -30
  945. package/src/tools/filesystem/read.ts +54 -35
  946. package/src/tools/filesystem/write.ts +69 -32
  947. package/src/tools/host-filesystem/edit.ts +44 -42
  948. package/src/tools/host-filesystem/read.ts +49 -35
  949. package/src/tools/host-filesystem/transfer.ts +121 -108
  950. package/src/tools/host-filesystem/write.ts +33 -31
  951. package/src/tools/host-terminal/host-shell.ts +50 -48
  952. package/src/tools/memory/register.ts +23 -24
  953. package/src/tools/network/__tests__/web-search-metadata.test.ts +7 -1
  954. package/src/tools/network/__tests__/web-search.test.ts +11 -3
  955. package/src/tools/network/web-fetch.ts +49 -46
  956. package/src/tools/network/web-search-error.test.ts +248 -0
  957. package/src/tools/network/web-search-error.ts +267 -0
  958. package/src/tools/network/web-search.ts +223 -61
  959. package/src/tools/registry.ts +39 -16
  960. package/src/tools/schedule/create.ts +13 -0
  961. package/src/tools/schedule/update.ts +16 -0
  962. package/src/tools/shared/filesystem/audio-read.ts +122 -0
  963. package/src/tools/shared/filesystem/image-read.ts +1 -1
  964. package/src/tools/skills/execute.ts +34 -31
  965. package/src/tools/skills/load.ts +29 -23
  966. package/src/tools/subagent/notify-parent.ts +35 -32
  967. package/src/tools/subagent/spawn.ts +2 -4
  968. package/src/tools/system/avatar-generator.ts +13 -22
  969. package/src/tools/system/request-permission.ts +30 -27
  970. package/src/tools/terminal/safe-env.ts +10 -1
  971. package/src/tools/terminal/shell.ts +190 -61
  972. package/src/tools/tool-defaults.ts +20 -9
  973. package/src/tools/tool-manifest.ts +4 -4
  974. package/src/tools/types.ts +74 -23
  975. package/src/tools/ui-surface/definitions.ts +99 -10
  976. package/src/tts/__tests__/provider-catalog-consistency.test.ts +85 -1
  977. package/src/tts/provider-catalog.ts +76 -1
  978. package/src/usage/types.ts +10 -0
  979. package/src/util/errors.ts +2 -2
  980. package/src/util/map-limit.ts +27 -0
  981. package/src/util/mutex.ts +47 -0
  982. package/src/util/platform.ts +15 -12
  983. package/src/work-items/work-item-runner.ts +7 -2
  984. package/src/workspace/git-service.ts +1 -42
  985. package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
  986. package/src/workspace/migrations/051-seed-conversation-summarization-callsite.ts +4 -5
  987. package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
  988. package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
  989. package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
  990. package/src/workspace/migrations/095-bump-heartbeat-interval-30m-to-60m.ts +51 -0
  991. package/src/workspace/migrations/096-reduce-quality-profile-effort.ts +72 -0
  992. package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +117 -0
  993. package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
  994. package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
  995. package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
  996. package/src/workspace/migrations/registry.ts +12 -0
  997. package/src/workspace/provider-commit-message-generator.ts +15 -17
  998. package/tsconfig.json +4 -1
  999. package/src/__tests__/bootstrap-turn-cleanup.test.ts +0 -44
  1000. package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
  1001. package/src/__tests__/compaction-pipeline.test.ts +0 -210
  1002. package/src/__tests__/compaction-timeout-recovery.test.ts +0 -262
  1003. package/src/__tests__/empty-response-pipeline.test.ts +0 -301
  1004. package/src/__tests__/history-repair-pipeline.test.ts +0 -396
  1005. package/src/__tests__/llm-call-pipeline.test.ts +0 -281
  1006. package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -418
  1007. package/src/__tests__/persistence-pipeline.test.ts +0 -514
  1008. package/src/__tests__/pipeline-runner.test.ts +0 -565
  1009. package/src/__tests__/title-generate-pipeline.test.ts +0 -211
  1010. package/src/__tests__/token-estimate-pipeline.test.ts +0 -481
  1011. package/src/__tests__/tool-error-pipeline.test.ts +0 -241
  1012. package/src/__tests__/tool-execute-pipeline.test.ts +0 -417
  1013. package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -344
  1014. package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
  1015. package/src/cli/commands/memory-v3-render.ts +0 -491
  1016. package/src/daemon/bootstrap-turn-cleanup.ts +0 -45
  1017. package/src/daemon/message-types/disk-pressure.ts +0 -9
  1018. package/src/email/feature-gate.ts +0 -23
  1019. package/src/gallery/default-gallery.ts +0 -1359
  1020. package/src/gallery/gallery-manifest.ts +0 -28
  1021. package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
  1022. package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -466
  1023. package/src/memory/v3/__tests__/coretrieval-seed.test.ts +0 -270
  1024. package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
  1025. package/src/memory/v3/__tests__/edges.test.ts +0 -706
  1026. package/src/memory/v3/__tests__/filter.test.ts +0 -560
  1027. package/src/memory/v3/__tests__/gate.test.ts +0 -637
  1028. package/src/memory/v3/__tests__/index-composition.test.ts +0 -291
  1029. package/src/memory/v3/__tests__/loop.test.ts +0 -775
  1030. package/src/memory/v3/__tests__/retriever.test.ts +0 -226
  1031. package/src/memory/v3/__tests__/scouts.test.ts +0 -489
  1032. package/src/memory/v3/__tests__/shadow-diff.test.ts +0 -225
  1033. package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -398
  1034. package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
  1035. package/src/memory/v3/__tests__/traversal.test.ts +0 -508
  1036. package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
  1037. package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
  1038. package/src/memory/v3/__tests__/tree-walk.test.ts +0 -784
  1039. package/src/memory/v3/__tests__/validate.test.ts +0 -277
  1040. package/src/memory/v3/auto-edges.ts +0 -223
  1041. package/src/memory/v3/coactivation-store.ts +0 -124
  1042. package/src/memory/v3/consolidation-job.ts +0 -323
  1043. package/src/memory/v3/coretrieval-seed.ts +0 -240
  1044. package/src/memory/v3/edge-learning-job.ts +0 -160
  1045. package/src/memory/v3/edges.ts +0 -286
  1046. package/src/memory/v3/filter.ts +0 -286
  1047. package/src/memory/v3/gate.ts +0 -349
  1048. package/src/memory/v3/index-composition.ts +0 -126
  1049. package/src/memory/v3/llm-capture.ts +0 -46
  1050. package/src/memory/v3/loop.ts +0 -430
  1051. package/src/memory/v3/maintenance.ts +0 -144
  1052. package/src/memory/v3/prompt-context.ts +0 -33
  1053. package/src/memory/v3/prompts/consolidation.ts +0 -458
  1054. package/src/memory/v3/prompts/system-prompts.ts +0 -196
  1055. package/src/memory/v3/retriever.ts +0 -33
  1056. package/src/memory/v3/scouts.ts +0 -431
  1057. package/src/memory/v3/shadow-diff.ts +0 -287
  1058. package/src/memory/v3/shadow-middleware.ts +0 -347
  1059. package/src/memory/v3/traversal.ts +0 -211
  1060. package/src/memory/v3/tree-index.ts +0 -237
  1061. package/src/memory/v3/tree-store.ts +0 -394
  1062. package/src/memory/v3/tree-walk.ts +0 -356
  1063. package/src/memory/v3/types.ts +0 -65
  1064. package/src/memory/v3/validate.ts +0 -323
  1065. package/src/plugins/defaults/circuit-breaker.ts +0 -141
  1066. package/src/plugins/defaults/compaction.ts +0 -141
  1067. package/src/plugins/defaults/empty-response.ts +0 -124
  1068. package/src/plugins/defaults/history-repair.ts +0 -83
  1069. package/src/plugins/defaults/llm-call.ts +0 -77
  1070. package/src/plugins/defaults/memory-retrieval.ts +0 -219
  1071. package/src/plugins/defaults/overflow-reduce.ts +0 -185
  1072. package/src/plugins/defaults/persistence.ts +0 -146
  1073. package/src/plugins/defaults/title-generate.ts +0 -90
  1074. package/src/plugins/defaults/token-estimate.ts +0 -101
  1075. package/src/plugins/defaults/tool-error.ts +0 -119
  1076. package/src/plugins/defaults/tool-execute.ts +0 -87
  1077. package/src/plugins/defaults/tool-result-truncate.ts +0 -84
  1078. package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
  1079. package/src/skills/category-inference.ts +0 -111
@@ -0,0 +1,118 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+
4
+ import { parse as parseYaml } from "yaml";
5
+
6
+ import { getPlatformBaseUrl } from "../config/env.js";
7
+ import { getLogger } from "../util/logger.js";
8
+ import { getRepoSkillsDir } from "./catalog-install.js";
9
+
10
+ const log = getLogger("categories-cache");
11
+ const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
12
+
13
+ export interface SkillCategoryDef {
14
+ slug: string;
15
+ label: string;
16
+ description: string;
17
+ icon: string;
18
+ }
19
+
20
+ let cachedCategories: SkillCategoryDef[] | null = null;
21
+ let cacheTimestamp = 0;
22
+
23
+ async function fetchCategories(): Promise<SkillCategoryDef[]> {
24
+ const platformUrl = getPlatformBaseUrl();
25
+ const url = `${platformUrl}/v1/skills/categories/`;
26
+ const response = await fetch(url, {
27
+ signal: AbortSignal.timeout(10000),
28
+ });
29
+
30
+ if (!response.ok) {
31
+ throw new Error(
32
+ `Platform API error ${response.status}: ${response.statusText}`,
33
+ );
34
+ }
35
+
36
+ const data = (await response.json()) as {
37
+ categories: SkillCategoryDef[];
38
+ };
39
+ if (!Array.isArray(data.categories)) {
40
+ throw new Error("Platform categories response has invalid categories array");
41
+ }
42
+ return data.categories.filter(
43
+ (c): c is SkillCategoryDef =>
44
+ !!c && typeof c.slug === "string" && typeof c.label === "string",
45
+ );
46
+ }
47
+
48
+ function readLocalCategories(repoSkillsDir: string): SkillCategoryDef[] {
49
+ try {
50
+ const raw = readFileSync(
51
+ join(repoSkillsDir, "skill-categories-catalog.yaml"),
52
+ "utf-8",
53
+ );
54
+ const parsed = parseYaml(raw) as { categories?: SkillCategoryDef[] };
55
+ if (!Array.isArray(parsed?.categories)) return [];
56
+ return parsed.categories.filter(
57
+ (c): c is SkillCategoryDef =>
58
+ !!c && typeof c.slug === "string" && typeof c.label === "string",
59
+ );
60
+ } catch {
61
+ return [];
62
+ }
63
+ }
64
+
65
+ export async function getCategories(): Promise<SkillCategoryDef[]> {
66
+ if (cachedCategories && Date.now() - cacheTimestamp < CACHE_TTL_MS) {
67
+ return cachedCategories;
68
+ }
69
+
70
+ const repoSkillsDir = getRepoSkillsDir();
71
+ const local = repoSkillsDir ? readLocalCategories(repoSkillsDir) : [];
72
+ let categories: SkillCategoryDef[];
73
+
74
+ try {
75
+ const remote = await fetchCategories();
76
+ if (local.length > 0) {
77
+ const localSlugs = new Set(local.map((c) => c.slug));
78
+ categories = [
79
+ ...local,
80
+ ...remote.filter((c) => !localSlugs.has(c.slug)),
81
+ ];
82
+ } else {
83
+ categories = remote;
84
+ }
85
+ } catch (err) {
86
+ if (cachedCategories) {
87
+ log.warn(
88
+ { err },
89
+ "Failed to fetch skill categories, keeping stale cache",
90
+ );
91
+ cacheTimestamp = Date.now();
92
+ return cachedCategories;
93
+ }
94
+ if (local.length > 0) {
95
+ log.warn(
96
+ { err },
97
+ "Failed to fetch skill categories, falling back to bundled local catalog",
98
+ );
99
+ categories = local;
100
+ } else {
101
+ log.warn({ err }, "Failed to fetch skill categories, returning empty");
102
+ return [];
103
+ }
104
+ }
105
+
106
+ cachedCategories = categories;
107
+ cacheTimestamp = Date.now();
108
+ return categories;
109
+ }
110
+
111
+ export function getCachedCategoriesSync(): SkillCategoryDef[] {
112
+ return cachedCategories ?? [];
113
+ }
114
+
115
+ export function invalidateCategoriesCache(): void {
116
+ cachedCategories = null;
117
+ cacheTimestamp = 0;
118
+ }
@@ -198,6 +198,7 @@ export function createClawhubProvider(): SkillFileProvider {
198
198
  kind: "catalog",
199
199
  status: "available",
200
200
  origin: "clawhub",
201
+ category: "integrations",
201
202
  slug: data.skill.slug,
202
203
  author: data.owner?.handle ?? "",
203
204
  stars: data.stats?.stars ?? 0,
@@ -383,6 +383,7 @@ export function createSkillsShProvider(): SkillFileProvider {
383
383
  kind: "catalog",
384
384
  status: "available",
385
385
  origin: "skillssh",
386
+ category: "integrations",
386
387
  slug: skillId,
387
388
  sourceRepo: `${source.owner}/${source.repo}`,
388
389
  installs: 0,
@@ -13,7 +13,11 @@ import { v4 as uuid } from "uuid";
13
13
  import { resolveCallSiteConfig } from "../config/llm-resolver.js";
14
14
  import { getConfig } from "../config/loader.js";
15
15
  import { Conversation } from "../daemon/conversation.js";
16
- import { findConversation } from "../daemon/conversation-store.js";
16
+ import {
17
+ findConversation,
18
+ removeSubagentConversation,
19
+ setSubagentConversation,
20
+ } from "../daemon/conversation-registry.js";
17
21
  import type { ServerMessage } from "../daemon/message-protocol.js";
18
22
  import { bootstrapConversation } from "../memory/conversation-bootstrap.js";
19
23
  import { wrapWithCallSiteRouting } from "../providers/call-site-routing.js";
@@ -285,12 +289,9 @@ export class SubagentManager {
285
289
  conversationRecord.id,
286
290
  provider,
287
291
  systemPrompt,
288
- maxTokens,
289
292
  wrappedSendToClient,
290
293
  workingDir,
291
- undefined, // sharedCesClient
292
- undefined, // speedOverride
293
- "5m", // cacheTtl — subagents run tight tool-use loops, 5m is always hot
294
+ { maxTokens, cacheTtl: "5m" },
294
295
  );
295
296
 
296
297
  // Mark conversation as having no direct client — it routes through parent.
@@ -337,6 +338,10 @@ export class SubagentManager {
337
338
 
338
339
  managed.conversation = conversation;
339
340
  this.subagents.set(subagentId, managed);
341
+ // Index the live conversation so the per-conversation injectors (workspace
342
+ // context, disk-pressure warning) can resolve it by id; subagents are not
343
+ // in the eviction-managed conversation store.
344
+ setSubagentConversation(conversationRecord.id, conversation);
340
345
  const labelKey = `${config.parentConversationId}:${config.label.toLowerCase().trim()}`;
341
346
  if (this.labelIndex.has(labelKey)) {
342
347
  log.warn(
@@ -439,7 +444,7 @@ export class SubagentManager {
439
444
  const { id: messageId } = await conversation.persistUserMessage({
440
445
  content: message,
441
446
  });
442
- await conversation.runAgentLoop(message, messageId, undefined, {
447
+ await conversation.runAgentLoop(message, messageId, {
443
448
  callSite: "subagentSpawn",
444
449
  ...(managed.state.config.overrideProfile
445
450
  ? { overrideProfile: managed.state.config.overrideProfile }
@@ -627,7 +632,7 @@ export class SubagentManager {
627
632
  content: trimmed,
628
633
  });
629
634
  conversation
630
- .runAgentLoop(trimmed, messageId, undefined, {
635
+ .runAgentLoop(trimmed, messageId, {
631
636
  callSite: "subagentSpawn",
632
637
  ...(managed.state.config.overrideProfile
633
638
  ? { overrideProfile: managed.state.config.overrideProfile }
@@ -698,7 +703,9 @@ export class SubagentManager {
698
703
  */
699
704
  private releaseConversation(managed: ManagedSubagent): void {
700
705
  if (!managed.conversation) return;
701
- managed.conversation.dispose();
706
+ const conversation = managed.conversation;
707
+ removeSubagentConversation(conversation.conversationId, conversation);
708
+ conversation.dispose();
702
709
  managed.conversation = null;
703
710
  managed.retainedUntil = Date.now() + TERMINAL_RETENTION_MS;
704
711
  this.ensureSweepRunning();
@@ -719,16 +726,18 @@ export class SubagentManager {
719
726
  if (!managed) return;
720
727
 
721
728
  if (managed.conversation) {
729
+ const conversation = managed.conversation;
722
730
  if (!TERMINAL_STATUSES.has(managed.state.status)) {
723
- managed.conversation.abort(
731
+ conversation.abort(
724
732
  createAbortReason(
725
733
  "subagent_aborted",
726
734
  "SubagentManager.dispose",
727
- managed.conversation.conversationId,
735
+ conversation.conversationId,
728
736
  ),
729
737
  );
730
738
  }
731
- managed.conversation.dispose();
739
+ removeSubagentConversation(conversation.conversationId, conversation);
740
+ conversation.dispose();
732
741
  managed.conversation = null;
733
742
  }
734
743
  this.subagents.delete(subagentId);
@@ -6,6 +6,32 @@ export interface TelemetryEventBase {
6
6
  type: string;
7
7
  daemon_event_id: string;
8
8
  recorded_at: number;
9
+ /**
10
+ * Version of the assistant binary at the moment THIS event was
11
+ * RECORDED (not when the batch was uploaded). Distinct from the
12
+ * envelope's `assistant_version` field, which still ships for
13
+ * back-compat with platforms that haven't deployed the per-event
14
+ * handling.
15
+ *
16
+ * The platform's `TelemetryIngestView` prefers per-event over
17
+ * envelope: when a per-event value is present (including explicit
18
+ * `null`) it wins. When the field is omitted on the event entirely
19
+ * (old assistant), the envelope value is the back-compat fallback.
20
+ *
21
+ * Daemon-side, this field is always non-null — the reporter stamps
22
+ * the running binary's `APP_VERSION` when the underlying SQLite row
23
+ * has no record-time value. In this PR only `llm_usage` events
24
+ * carry a true record-time value (legacy llm_usage rows from before
25
+ * migration 267 fall back to `APP_VERSION`); turn, lifecycle, and
26
+ * onboarding events all stamp `APP_VERSION` directly until the
27
+ * follow-ups that add the column to `messages` / `lifecycle_events`
28
+ * (#18112) / `onboarding_events` (#30733) land. Stamping
29
+ * `APP_VERSION` instead of emitting explicit `null` preserves
30
+ * envelope-equivalent behavior under the per-event-wins contract.
31
+ * The type allows `null` for parity with the platform contract;
32
+ * in practice the daemon never sends it.
33
+ */
34
+ assistant_version: string | null;
9
35
  }
10
36
 
11
37
  /** LLM usage event — one per provider API call. */
@@ -159,9 +185,37 @@ export interface OnboardingTelemetryEvent extends TelemetryEventBase {
159
185
  ab_variant?: string;
160
186
  }
161
187
 
188
+ /**
189
+ * Auth-fallback event — aggregated count of requests served via the legacy
190
+ * loopback auth fallback. One event per (guard, path, failure_kind) per flush
191
+ * window. Lets the platform see which deployments still rely on the loopback
192
+ * exemption instead of sending a bearer token.
193
+ */
194
+ export interface AuthFallbackTelemetryEvent extends TelemetryEventBase {
195
+ type: "auth_fallback";
196
+ /** Which auth guard fell back: `"edge"` | `"edge-scoped"` | `"edge-guardian"`. */
197
+ guard: string;
198
+ /** Request pathname that fell back. */
199
+ path: string;
200
+ /**
201
+ * Why the bearer-token check did not succeed before the fallback:
202
+ * `"missing_authorization"` | `"malformed_authorization"` |
203
+ * `"token_validation_failed"` | `"insufficient_scope"` |
204
+ * `"non_actor_principal"` | `"guardian_mismatch"`.
205
+ */
206
+ failure_kind: string;
207
+ /** Number of requests that fell back for this key during the window. */
208
+ count: number;
209
+ /** Window start (epoch ms) the count was accumulated over. */
210
+ window_start: number;
211
+ /** Window end (epoch ms) the count was accumulated over. */
212
+ window_end: number;
213
+ }
214
+
162
215
  /** Discriminated union of all telemetry event types. */
163
216
  export type TelemetryEvent =
164
217
  | LlmUsageTelemetryEvent
165
218
  | TurnTelemetryEvent
166
219
  | LifecycleTelemetryEvent
167
- | OnboardingTelemetryEvent;
220
+ | OnboardingTelemetryEvent
221
+ | AuthFallbackTelemetryEvent;
@@ -94,11 +94,24 @@ mock.module("../version.js", () => ({
94
94
  let mockCollectUsageData = true;
95
95
 
96
96
  mock.module("../config/loader.js", () => ({
97
- getConfig: () => ({ collectUsageData: mockCollectUsageData }),
97
+ getConfig: () => ({
98
+ ui: {},
99
+ model: "test",
100
+ provider: "test",
101
+ memory: { enabled: false },
102
+ rateLimit: { maxRequestsPerMinute: 0 },
103
+ secretDetection: { enabled: false },
104
+ collectUsageData: mockCollectUsageData,
105
+ }),
98
106
  }));
99
107
 
100
108
  const mockQueryUnreportedLifecycleEvents = mock(
101
- () => [] as { id: string; eventName: string; createdAt: number }[],
109
+ () =>
110
+ [] as {
111
+ id: string;
112
+ eventName: string;
113
+ createdAt: number;
114
+ }[],
102
115
  );
103
116
 
104
117
  mock.module("../memory/lifecycle-events-store.js", () => ({
@@ -116,6 +129,7 @@ const mockQueryUnreportedOnboardingEvents = mock(
116
129
  tone: string | null;
117
130
  googleConnected: boolean | null;
118
131
  googleScopesJson: string | null;
132
+ priorAssistantsJson: string | null;
119
133
  abVariant: string | null;
120
134
  }[],
121
135
  );
@@ -124,13 +138,24 @@ mock.module("../memory/onboarding-events-store.js", () => ({
124
138
  queryUnreportedOnboardingEvents: mockQueryUnreportedOnboardingEvents,
125
139
  }));
126
140
 
141
+ // The auth-fallback store is intentionally NOT mocked — it has its own
142
+ // DB-backed tests, and Bun's `mock.module` is process-global, so mocking it
143
+ // here would leak into those tests when files share an invocation. We seed the
144
+ // real DB instead so every auth-fallback test stays order-independent.
145
+
127
146
  // ---------------------------------------------------------------------------
128
147
  // Production import (after mocks)
129
148
  // ---------------------------------------------------------------------------
130
149
 
150
+ import { recordAuthFallbackCounts } from "../memory/auth-fallback-events-store.js";
151
+ import { getDb } from "../memory/db-connection.js";
152
+ import { initializeDb } from "../memory/db-init.js";
153
+ import { authFallbackEvents } from "../memory/schema.js";
131
154
  import type { UsageEvent } from "../usage/types.js";
132
155
  import { UsageTelemetryReporter } from "./usage-telemetry-reporter.js";
133
156
 
157
+ initializeDb();
158
+
134
159
  // ---------------------------------------------------------------------------
135
160
  // Helpers
136
161
  // ---------------------------------------------------------------------------
@@ -169,6 +194,7 @@ function makeUsageEvent(
169
194
  requestId: null,
170
195
  estimatedCostUsd: 0.001,
171
196
  pricingStatus: "priced",
197
+ assistantVersion: "test-app-version",
172
198
  conversationType: "standard",
173
199
  turnIndex: 1,
174
200
  ...overrides,
@@ -194,6 +220,7 @@ beforeEach(() => {
194
220
  mockQueryUnreportedLifecycleEvents.mockReturnValue([]);
195
221
  mockQueryUnreportedOnboardingEvents.mockReset();
196
222
  mockQueryUnreportedOnboardingEvents.mockReturnValue([]);
223
+ getDb().delete(authFallbackEvents).run();
197
224
  mockPlatformClient = null;
198
225
  mockGetPlatformBaseUrl.mockReset();
199
226
  mockGetDeviceId.mockReset();
@@ -902,9 +929,9 @@ describe("UsageTelemetryReporter", () => {
902
929
  // No HTTP call should have been made
903
930
  expect(mockFetch).not.toHaveBeenCalled();
904
931
 
905
- // All 4 timestamp watermarks should have been advanced (IDs left untouched
932
+ // All 5 timestamp watermarks should have been advanced (IDs left untouched
906
933
  // so the compound-cursor branch stays active)
907
- expect(mockSetMemoryCheckpoint).toHaveBeenCalledTimes(4);
934
+ expect(mockSetMemoryCheckpoint).toHaveBeenCalledTimes(5);
908
935
 
909
936
  const calls = mockSetMemoryCheckpoint.mock.calls;
910
937
  const keys = calls.map((c) => c[0]);
@@ -912,6 +939,7 @@ describe("UsageTelemetryReporter", () => {
912
939
  expect(keys).toContain("telemetry:turns:last_reported_at");
913
940
  expect(keys).toContain("telemetry:lifecycle:last_reported_at");
914
941
  expect(keys).toContain("telemetry:onboarding:last_reported_at");
942
+ expect(keys).toContain("telemetry:auth_fallback:last_reported_at");
915
943
  });
916
944
 
917
945
  test("events sent normally after re-enabling collectUsageData", async () => {
@@ -938,4 +966,222 @@ describe("UsageTelemetryReporter", () => {
938
966
  );
939
967
  expect(body.events[0].daemon_event_id).toBe("evt-after-reenable");
940
968
  });
969
+
970
+ // -------------------------------------------------------------------------
971
+ // Per-event `assistant_version` on the wire
972
+ //
973
+ // The envelope's `assistant_version` is upload-time (always the current
974
+ // binary). The per-event field is record-time (the binary that was running
975
+ // when the event was persisted to SQLite). In this PR only `llm_usage`
976
+ // events carry a true record-time value; turn events (and lifecycle /
977
+ // onboarding events, not asserted here) stamp the running binary's
978
+ // `APP_VERSION` directly until their respective follow-ups land.
979
+ // Nullable llm_usage cases (legacy rows from before migration 267 ran)
980
+ // fall back to the running binary's `APP_VERSION` rather than emitting
981
+ // explicit `null` — under the platform contract a present-but-null
982
+ // per-event value would override the envelope, and we'd rather have a
983
+ // concrete version than no version.
984
+ // -------------------------------------------------------------------------
985
+
986
+ test("llm_usage event carries its recorded assistantVersion on the wire", async () => {
987
+ const event = makeUsageEvent({
988
+ id: "evt-version-llm",
989
+ assistantVersion: "0.8.4",
990
+ });
991
+ mockQueryUnreportedUsageEvents.mockReturnValue([event]);
992
+ mockFetch.mockImplementation(() =>
993
+ Promise.resolve(new Response('{"accepted":1}', { status: 200 })),
994
+ );
995
+
996
+ const reporter = new UsageTelemetryReporter();
997
+ await reporter.flush();
998
+
999
+ const body = JSON.parse(
1000
+ (mockFetch.mock.calls[0] as [string, RequestInit])[1].body as string,
1001
+ );
1002
+ // Envelope reflects current binary (upload-time).
1003
+ expect(body.assistant_version).toBe("1.2.3-test");
1004
+ // Per-event reflects record-time — a different value here is the
1005
+ // whole point: backlogged events keep the binary they were stamped
1006
+ // with when they were originally recorded.
1007
+ expect(body.events[0].assistant_version).toBe("0.8.4");
1008
+ });
1009
+
1010
+ test("llm_usage event with null assistantVersion falls back to APP_VERSION (pre-migration row)", async () => {
1011
+ const event = makeUsageEvent({
1012
+ id: "evt-version-llm-null",
1013
+ assistantVersion: null,
1014
+ });
1015
+ mockQueryUnreportedUsageEvents.mockReturnValue([event]);
1016
+ mockFetch.mockImplementation(() =>
1017
+ Promise.resolve(new Response('{"accepted":1}', { status: 200 })),
1018
+ );
1019
+
1020
+ const reporter = new UsageTelemetryReporter();
1021
+ await reporter.flush();
1022
+
1023
+ const body = JSON.parse(
1024
+ (mockFetch.mock.calls[0] as [string, RequestInit])[1].body as string,
1025
+ );
1026
+ // No explicit null on the wire — the running binary's APP_VERSION is
1027
+ // stamped instead so a present-but-null value can't override the
1028
+ // envelope under the platform's per-event-wins contract.
1029
+ expect(body.events[0].assistant_version).toBe("1.2.3-test");
1030
+ });
1031
+
1032
+ test("turn event emits assistant_version: APP_VERSION (running binary)", async () => {
1033
+ // Turn events are derived from `messages` + `conversations`, which
1034
+ // don't yet carry a per-event version. Until the follow-up migration
1035
+ // adds a column to `messages`, we stamp the running binary's
1036
+ // APP_VERSION instead of explicit null — matches what the envelope
1037
+ // would have provided but per-event so it survives the platform
1038
+ // contract that treats present per-event values as winning over the
1039
+ // envelope.
1040
+ mockQueryUnreportedUsageEvents.mockReturnValue([]);
1041
+ mockQueryUnreportedTurnEvents.mockReturnValue([
1042
+ {
1043
+ id: "evt-turn-version",
1044
+ createdAt: 1700000300000,
1045
+ conversationId: "conv-1",
1046
+ conversationType: "standard",
1047
+ turnIndex: 1,
1048
+ interfaceId: null,
1049
+ channelId: null,
1050
+ clientMetadata: null,
1051
+ },
1052
+ ]);
1053
+ mockFetch.mockImplementation(() =>
1054
+ Promise.resolve(new Response('{"accepted":1}', { status: 200 })),
1055
+ );
1056
+
1057
+ const reporter = new UsageTelemetryReporter();
1058
+ await reporter.flush();
1059
+
1060
+ const body = JSON.parse(
1061
+ (mockFetch.mock.calls[0] as [string, RequestInit])[1].body as string,
1062
+ );
1063
+ const turn = body.events.find((e: { type: string }) => e.type === "turn");
1064
+ expect(turn).toBeDefined();
1065
+ expect(turn.assistant_version).toBe("1.2.3-test");
1066
+ });
1067
+
1068
+ test("a single batch can carry mixed per-event versions", async () => {
1069
+ // The whole point of this migration: an old backlogged event keeps
1070
+ // its old version while a freshly recorded event in the same flush
1071
+ // carries the current version. Pre-migration the entire batch would
1072
+ // collapse to the envelope value.
1073
+ const oldEvent = makeUsageEvent({
1074
+ id: "evt-old",
1075
+ assistantVersion: "0.8.3",
1076
+ });
1077
+ const newEvent = makeUsageEvent({
1078
+ id: "evt-new",
1079
+ assistantVersion: "0.8.5",
1080
+ });
1081
+ mockQueryUnreportedUsageEvents.mockReturnValue([oldEvent, newEvent]);
1082
+ mockFetch.mockImplementation(() =>
1083
+ Promise.resolve(new Response('{"accepted":2}', { status: 200 })),
1084
+ );
1085
+
1086
+ const reporter = new UsageTelemetryReporter();
1087
+ await reporter.flush();
1088
+
1089
+ const body = JSON.parse(
1090
+ (mockFetch.mock.calls[0] as [string, RequestInit])[1].body as string,
1091
+ );
1092
+ const versions = body.events.map(
1093
+ (e: { assistant_version: string | null }) => e.assistant_version,
1094
+ );
1095
+ expect(versions.sort()).toEqual(["0.8.3", "0.8.5"]);
1096
+ // Envelope still reflects the running binary, not either event.
1097
+ expect(body.assistant_version).toBe("1.2.3-test");
1098
+ });
1099
+
1100
+ // -------------------------------------------------------------------------
1101
+ // Auth-fallback events
1102
+ // -------------------------------------------------------------------------
1103
+
1104
+ test("auth_fallback events are included in the events array with type discriminator", async () => {
1105
+ mockQueryUnreportedUsageEvents.mockReturnValue([]);
1106
+ recordAuthFallbackCounts(1700000740000, 1700000800000, [
1107
+ {
1108
+ guard: "edge",
1109
+ path: "/v1/messages",
1110
+ failureKind: "missing_authorization",
1111
+ count: 42,
1112
+ },
1113
+ ]);
1114
+ mockFetch.mockImplementation(() =>
1115
+ Promise.resolve(new Response('{"accepted":1}', { status: 200 })),
1116
+ );
1117
+
1118
+ const reporter = new UsageTelemetryReporter();
1119
+ await reporter.flush();
1120
+
1121
+ expect(mockFetch).toHaveBeenCalledTimes(1);
1122
+ const body = JSON.parse(
1123
+ (mockFetch.mock.calls[0] as [string, RequestInit])[1].body as string,
1124
+ );
1125
+ expect(body.events.length).toBe(1);
1126
+ expect(body.events[0]).toMatchObject({
1127
+ type: "auth_fallback",
1128
+ guard: "edge",
1129
+ path: "/v1/messages",
1130
+ failure_kind: "missing_authorization",
1131
+ count: 42,
1132
+ window_start: 1700000740000,
1133
+ window_end: 1700000800000,
1134
+ assistant_version: "1.2.3-test",
1135
+ });
1136
+ // recorded_at is the row's createdAt (stamped at record time).
1137
+ expect(typeof body.events[0].recorded_at).toBe("number");
1138
+ expect(typeof body.events[0].daemon_event_id).toBe("string");
1139
+ });
1140
+
1141
+ test("auth_fallback watermark advances to the last reported row on success", async () => {
1142
+ mockQueryUnreportedUsageEvents.mockReturnValue([]);
1143
+ recordAuthFallbackCounts(1700000000000, 1700000001000, [
1144
+ {
1145
+ guard: "edge-scoped",
1146
+ path: "/v1/a",
1147
+ failureKind: "insufficient_scope",
1148
+ count: 1,
1149
+ },
1150
+ {
1151
+ guard: "edge-guardian",
1152
+ path: "/v1/b",
1153
+ failureKind: "guardian_mismatch",
1154
+ count: 3,
1155
+ },
1156
+ ]);
1157
+ mockFetch.mockImplementation(() =>
1158
+ Promise.resolve(new Response('{"accepted":2}', { status: 200 })),
1159
+ );
1160
+
1161
+ // The last row by the reporter's (createdAt, id) cursor order is the one
1162
+ // whose watermark should be persisted after a successful upload.
1163
+ const rows = getDb()
1164
+ .select()
1165
+ .from(authFallbackEvents)
1166
+ .orderBy(authFallbackEvents.createdAt, authFallbackEvents.id)
1167
+ .all();
1168
+ const lastRow = rows[rows.length - 1];
1169
+
1170
+ const reporter = new UsageTelemetryReporter();
1171
+ await reporter.flush();
1172
+
1173
+ const watermarkCalls = mockSetMemoryCheckpoint.mock.calls.filter(
1174
+ (c) => c[0] === "telemetry:auth_fallback:last_reported_at",
1175
+ );
1176
+ expect(watermarkCalls.length).toBeGreaterThanOrEqual(1);
1177
+ expect(watermarkCalls[watermarkCalls.length - 1][1]).toBe(
1178
+ String(lastRow.createdAt),
1179
+ );
1180
+
1181
+ const idCalls = mockSetMemoryCheckpoint.mock.calls.filter(
1182
+ (c) => c[0] === "telemetry:auth_fallback:last_reported_id",
1183
+ );
1184
+ expect(idCalls.length).toBeGreaterThanOrEqual(1);
1185
+ expect(idCalls[idCalls.length - 1][1]).toBe(lastRow.id);
1186
+ });
941
1187
  });