@vellumai/assistant 0.7.0 → 0.7.1

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 (666) hide show
  1. package/ARCHITECTURE.md +6 -7
  2. package/Dockerfile +1 -0
  3. package/README.md +2 -2
  4. package/__tests__/permissions/gateway-threshold-reader.test.ts +79 -139
  5. package/bun.lock +3 -0
  6. package/docs/architecture/security.md +18 -16
  7. package/knip.json +1 -0
  8. package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
  9. package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -5
  10. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
  11. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
  12. package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
  13. package/node_modules/@vellumai/slack-text/bun.lock +24 -0
  14. package/node_modules/@vellumai/slack-text/package.json +18 -0
  15. package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
  16. package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
  17. package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
  18. package/openapi.yaml +294 -107
  19. package/package.json +4 -2
  20. package/scripts/generate-openapi.ts +16 -111
  21. package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
  22. package/src/__tests__/anthropic-provider.test.ts +56 -13
  23. package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
  24. package/src/__tests__/app-conversation-ids.test.ts +151 -0
  25. package/src/__tests__/approval-cascade.test.ts +0 -15
  26. package/src/__tests__/approval-routes-http.test.ts +6 -17
  27. package/src/__tests__/assistant-event-hub.test.ts +126 -77
  28. package/src/__tests__/assistant-event.test.ts +0 -5
  29. package/src/__tests__/assistant-events-sse-hardening.test.ts +37 -15
  30. package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -29
  31. package/src/__tests__/background-shell-host-bash.test.ts +34 -43
  32. package/src/__tests__/call-controller.test.ts +1 -1
  33. package/src/__tests__/call-site-routing-provider.test.ts +193 -0
  34. package/src/__tests__/channel-approval-routes.test.ts +10 -296
  35. package/src/__tests__/channel-approvals.test.ts +25 -17
  36. package/src/__tests__/channel-guardian.test.ts +100 -146
  37. package/src/__tests__/checker.test.ts +20 -34
  38. package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
  39. package/src/__tests__/compaction-events.test.ts +2 -0
  40. package/src/__tests__/config-schema.test.ts +6 -48
  41. package/src/__tests__/config-watcher.test.ts +12 -0
  42. package/src/__tests__/connection-policy.test.ts +1 -52
  43. package/src/__tests__/contacts-write.test.ts +2 -64
  44. package/src/__tests__/context-image-dimensions.test.ts +1 -1
  45. package/src/__tests__/context-search-memory-source.test.ts +120 -1
  46. package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
  47. package/src/__tests__/context-search-pkb-source.test.ts +49 -0
  48. package/src/__tests__/context-search-workspace-source.test.ts +9 -22
  49. package/src/__tests__/context-window-manager.test.ts +46 -0
  50. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
  51. package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
  52. package/src/__tests__/conversation-agent-loop.test.ts +980 -13
  53. package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
  54. package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
  55. package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
  56. package/src/__tests__/conversation-history-web-search.test.ts +4 -3
  57. package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
  58. package/src/__tests__/conversation-lifecycle.test.ts +4 -4
  59. package/src/__tests__/conversation-process-callsite.test.ts +79 -2
  60. package/src/__tests__/conversation-queue.test.ts +3 -8
  61. package/src/__tests__/conversation-routes-disk-view.test.ts +1 -161
  62. package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -32
  63. package/src/__tests__/conversation-routes-slash-commands.test.ts +75 -66
  64. package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
  65. package/src/__tests__/conversation-slash-commands.test.ts +24 -4
  66. package/src/__tests__/conversation-slash-queue.test.ts +2 -0
  67. package/src/__tests__/conversation-speed-override.test.ts +0 -3
  68. package/src/__tests__/conversation-starter-routes.test.ts +79 -2
  69. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
  70. package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
  71. package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
  72. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
  73. package/src/__tests__/conversation-usage.test.ts +253 -3
  74. package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
  75. package/src/__tests__/credential-health-service.test.ts +68 -0
  76. package/src/__tests__/credential-security-e2e.test.ts +4 -3
  77. package/src/__tests__/credential-security-invariants.test.ts +1 -5
  78. package/src/__tests__/credential-token-resolver.test.ts +180 -0
  79. package/src/__tests__/cu-unified-flow.test.ts +33 -16
  80. package/src/__tests__/daemon-assistant-events.test.ts +34 -21
  81. package/src/__tests__/daemon-credential-client.test.ts +4 -1
  82. package/src/__tests__/db-connection-isolation.test.ts +125 -0
  83. package/src/__tests__/db-migration-rollback.test.ts +101 -0
  84. package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
  85. package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
  86. package/src/__tests__/document-conversations.test.ts +332 -0
  87. package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
  88. package/src/__tests__/emit-event-signal.test.ts +4 -6
  89. package/src/__tests__/events-client-registration.test.ts +193 -49
  90. package/src/__tests__/filing-service.test.ts +58 -7
  91. package/src/__tests__/first-greeting.test.ts +156 -150
  92. package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
  93. package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
  94. package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
  95. package/src/__tests__/guardian-dispatch.test.ts +1 -1
  96. package/src/__tests__/guardian-grant-minting.test.ts +7 -2
  97. package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
  98. package/src/__tests__/guardian-routing-state.test.ts +1 -1
  99. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +32 -11
  100. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -83
  101. package/src/__tests__/headless-browser-mode.test.ts +4 -9
  102. package/src/__tests__/headless-browser-navigate.test.ts +21 -20
  103. package/src/__tests__/heartbeat-service.test.ts +289 -7
  104. package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
  105. package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
  106. package/src/__tests__/host-bash-proxy.test.ts +46 -122
  107. package/src/__tests__/host-browser-e2e-cloud.test.ts +36 -497
  108. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +26 -96
  109. package/src/__tests__/host-browser-proxy.test.ts +111 -185
  110. package/src/__tests__/host-browser-routes.test.ts +45 -75
  111. package/src/__tests__/host-browser-ws-events-e2e.test.ts +26 -30
  112. package/src/__tests__/host-cu-proxy.test.ts +56 -111
  113. package/src/__tests__/host-file-proxy.test.ts +44 -98
  114. package/src/__tests__/host-file-read-tool.test.ts +42 -21
  115. package/src/__tests__/host-shell-tool.test.ts +33 -68
  116. package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
  117. package/src/__tests__/host-transfer-proxy.test.ts +43 -53
  118. package/src/__tests__/http-user-message-parity.test.ts +0 -6
  119. package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
  120. package/src/__tests__/injector-chain.test.ts +10 -5
  121. package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
  122. package/src/__tests__/inline-command-runner.test.ts +0 -66
  123. package/src/__tests__/inline-skill-load-permissions.test.ts +0 -2
  124. package/src/__tests__/install-skill-routing.test.ts +1 -13
  125. package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
  126. package/src/__tests__/llm-catalog-parity.test.ts +90 -0
  127. package/src/__tests__/llm-context-resolution.test.ts +180 -0
  128. package/src/__tests__/llm-resolver.test.ts +80 -12
  129. package/src/__tests__/llm-usage-store.test.ts +269 -4
  130. package/src/__tests__/log-export-routes.test.ts +89 -0
  131. package/src/__tests__/managed-profile-guard.test.ts +225 -0
  132. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -10
  133. package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
  134. package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
  135. package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
  136. package/src/__tests__/migration-export-http.test.ts +33 -26
  137. package/src/__tests__/migration-export-streaming.test.ts +18 -10
  138. package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
  139. package/src/__tests__/migration-import-commit-http.test.ts +66 -21
  140. package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
  141. package/src/__tests__/migration-import-from-url.test.ts +20 -6
  142. package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
  143. package/src/__tests__/migration-parity-persistence.test.ts +62 -25
  144. package/src/__tests__/migration-transport.test.ts +115 -23
  145. package/src/__tests__/migration-validate-http.test.ts +105 -80
  146. package/src/__tests__/migration-wizard.test.ts +133 -27
  147. package/src/__tests__/non-member-access-request.test.ts +1 -1
  148. package/src/__tests__/notification-guardian-path.test.ts +1 -1
  149. package/src/__tests__/oauth-store.test.ts +19 -0
  150. package/src/__tests__/platform-bash-auto-approve.test.ts +21 -12
  151. package/src/__tests__/prechat-onboarding-contract.test.ts +31 -7
  152. package/src/__tests__/pricing.test.ts +68 -4
  153. package/src/__tests__/process-message-background-slack.test.ts +331 -0
  154. package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
  155. package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
  156. package/src/__tests__/provider-usage-tracking.test.ts +208 -0
  157. package/src/__tests__/reaction-persistence.test.ts +9 -6
  158. package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
  159. package/src/__tests__/recording-handler.test.ts +64 -81
  160. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
  161. package/src/__tests__/relay-server.test.ts +18 -13
  162. package/src/__tests__/require-fresh-approval.test.ts +13 -22
  163. package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
  164. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  165. package/src/__tests__/runtime-events-sse.test.ts +3 -12
  166. package/src/__tests__/search-skills-unified.test.ts +9 -15
  167. package/src/__tests__/secret-ingress-cli.test.ts +2 -5
  168. package/src/__tests__/secret-ingress-http.test.ts +0 -4
  169. package/src/__tests__/secret-onetime-send.test.ts +4 -2
  170. package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
  171. package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
  172. package/src/__tests__/secret-response-routing.test.ts +29 -15
  173. package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
  174. package/src/__tests__/secret-scanner.test.ts +2 -545
  175. package/src/__tests__/send-endpoint-busy.test.ts +9 -24
  176. package/src/__tests__/settings-routes.test.ts +1 -1
  177. package/src/__tests__/shell-credential-ref.test.ts +0 -8
  178. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -56
  179. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -11
  180. package/src/__tests__/skill-tool-factory.test.ts +97 -0
  181. package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
  182. package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
  183. package/src/__tests__/slack-inbound-verification.test.ts +1 -62
  184. package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
  185. package/src/__tests__/subagent-manager-notify.test.ts +70 -70
  186. package/src/__tests__/subagent-notify-parent.test.ts +80 -83
  187. package/src/__tests__/system-prompt.test.ts +115 -13
  188. package/src/__tests__/terminal-tools.test.ts +0 -89
  189. package/src/__tests__/thread-backfill.test.ts +945 -31
  190. package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
  191. package/src/__tests__/tool-execute-pipeline.test.ts +0 -6
  192. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -16
  193. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
  194. package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -7
  195. package/src/__tests__/tool-executor.test.ts +12 -19
  196. package/src/__tests__/tool-metrics-listener.test.ts +0 -35
  197. package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
  198. package/src/__tests__/tool-trace-listener.test.ts +0 -17
  199. package/src/__tests__/transfer-progress-screen.test.ts +63 -26
  200. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
  201. package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
  202. package/src/__tests__/trusted-contact-verification.test.ts +1 -1
  203. package/src/__tests__/tts-catalog-parity.test.ts +16 -5
  204. package/src/__tests__/usage-attribution.test.ts +247 -0
  205. package/src/__tests__/usage-cli.test.ts +143 -0
  206. package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
  207. package/src/__tests__/usage-routes.test.ts +150 -0
  208. package/src/__tests__/validation-results-screen.test.ts +39 -16
  209. package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
  210. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +49 -137
  211. package/src/__tests__/verification-control-plane-policy.test.ts +4 -7
  212. package/src/__tests__/voice-session-bridge.test.ts +5 -5
  213. package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
  214. package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
  215. package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
  216. package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
  217. package/src/acp/index.ts +0 -15
  218. package/src/acp/session-manager.ts +37 -34
  219. package/src/agent/loop.ts +16 -1
  220. package/src/approvals/AGENTS.md +4 -0
  221. package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
  222. package/src/approvals/guardian-request-resolvers.ts +10 -2
  223. package/src/backup/__tests__/backup-worker.test.ts +36 -8
  224. package/src/backup/__tests__/paths.test.ts +2 -2
  225. package/src/backup/__tests__/restore.test.ts +45 -28
  226. package/src/backup/backup-worker.ts +36 -2
  227. package/src/backup/paths.ts +9 -6
  228. package/src/browser-session/events.ts +0 -9
  229. package/src/calls/call-store.ts +1 -34
  230. package/src/calls/guardian-question-copy.ts +0 -108
  231. package/src/calls/relay-server.ts +0 -24
  232. package/src/calls/twilio-rest.ts +0 -38
  233. package/src/calls/twilio-routes.ts +1 -1
  234. package/src/calls/voice-session-bridge.ts +7 -38
  235. package/src/channels/types.ts +1 -36
  236. package/src/cli/commands/__tests__/cache.test.ts +152 -5
  237. package/src/cli/commands/__tests__/memory-v2.test.ts +14 -28
  238. package/src/cli/commands/__tests__/trust.test.ts +21 -387
  239. package/src/cli/commands/backup.ts +4 -4
  240. package/src/cli/commands/cache-fs.ts +8 -0
  241. package/src/cli/commands/cache.ts +153 -82
  242. package/src/cli/commands/clients.ts +63 -5
  243. package/src/cli/commands/completions.ts +3 -3
  244. package/src/cli/commands/contacts.ts +231 -76
  245. package/src/cli/commands/keys.ts +4 -1
  246. package/src/cli/commands/memory-v2.ts +24 -52
  247. package/src/cli/commands/oauth/shared.ts +2 -29
  248. package/src/cli/commands/pending.ts +102 -0
  249. package/src/cli/commands/skills.ts +77 -35
  250. package/src/cli/commands/trust.ts +70 -430
  251. package/src/cli/commands/usage.ts +25 -16
  252. package/src/cli/lib/daemon-credential-client.ts +14 -0
  253. package/src/cli/program.ts +2 -0
  254. package/src/cli.ts +0 -21
  255. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  256. package/src/config/bundled-skills/messaging/TOOLS.json +14 -4
  257. package/src/config/env-registry.ts +12 -2
  258. package/src/config/env.ts +3 -14
  259. package/src/config/feature-flag-registry.json +30 -30
  260. package/src/config/llm-callsite-catalog.ts +12 -0
  261. package/src/config/llm-context-resolution.ts +80 -0
  262. package/src/config/llm-resolver.ts +58 -22
  263. package/src/config/loader.ts +3 -3
  264. package/src/config/schema.ts +2 -158
  265. package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
  266. package/src/config/schemas/call-site-catalog.ts +271 -0
  267. package/src/config/schemas/calls.ts +5 -5
  268. package/src/config/schemas/inference.ts +1 -1
  269. package/src/config/schemas/ingress.ts +1 -1
  270. package/src/config/schemas/llm.ts +31 -3
  271. package/src/config/schemas/memory-retrieval.ts +2 -2
  272. package/src/config/schemas/memory-v2.ts +9 -0
  273. package/src/config/schemas/security.ts +1 -42
  274. package/src/config/schemas/services.ts +6 -6
  275. package/src/config/schemas/skills.ts +5 -5
  276. package/src/config/schemas/tts.ts +1 -1
  277. package/src/config/seed-inference-profiles.ts +117 -0
  278. package/src/config/skills.ts +0 -90
  279. package/src/config/types.ts +3 -6
  280. package/src/contacts/contact-store.ts +0 -17
  281. package/src/contacts/contacts-write.ts +1 -105
  282. package/src/context/window-manager.ts +44 -5
  283. package/src/credential-execution/process-manager.ts +34 -10
  284. package/src/credential-health/credential-health-service.ts +21 -16
  285. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
  286. package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
  287. package/src/daemon/connection-policy.ts +1 -26
  288. package/src/daemon/conversation-agent-loop-handlers.ts +53 -4
  289. package/src/daemon/conversation-agent-loop.ts +277 -36
  290. package/src/daemon/conversation-history.ts +8 -8
  291. package/src/daemon/conversation-launch.ts +20 -135
  292. package/src/daemon/conversation-lifecycle.ts +1 -1
  293. package/src/daemon/conversation-messaging.ts +1 -0
  294. package/src/daemon/conversation-process.ts +83 -163
  295. package/src/daemon/conversation-runtime-assembly.ts +219 -76
  296. package/src/daemon/conversation-slash.ts +47 -5
  297. package/src/daemon/conversation-store.ts +7 -31
  298. package/src/daemon/conversation-surfaces.ts +22 -28
  299. package/src/daemon/conversation-tool-setup.ts +3 -33
  300. package/src/daemon/conversation-usage.ts +36 -0
  301. package/src/daemon/conversation.ts +117 -233
  302. package/src/daemon/daemon-control.ts +3 -71
  303. package/src/daemon/daemon-skill-host.ts +8 -11
  304. package/src/daemon/dictation-profile-store.ts +2 -26
  305. package/src/daemon/first-greeting.ts +44 -156
  306. package/src/daemon/handlers/config-channels.ts +12 -12
  307. package/src/daemon/handlers/config-ingress.ts +4 -165
  308. package/src/daemon/handlers/config-model.ts +1 -1
  309. package/src/daemon/handlers/config-voice.ts +0 -42
  310. package/src/daemon/handlers/conversations.ts +11 -190
  311. package/src/daemon/handlers/recording.ts +26 -158
  312. package/src/daemon/handlers/shared.ts +23 -71
  313. package/src/daemon/handlers/skills.ts +42 -93
  314. package/src/daemon/host-bash-proxy.ts +67 -45
  315. package/src/daemon/host-browser-proxy.ts +65 -27
  316. package/src/daemon/host-cu-proxy.ts +40 -39
  317. package/src/daemon/host-file-proxy.ts +58 -37
  318. package/src/daemon/host-transfer-proxy.ts +84 -46
  319. package/src/daemon/lifecycle.ts +49 -15
  320. package/src/daemon/message-types/conversations.ts +7 -0
  321. package/src/daemon/message-types/host-bash.ts +1 -0
  322. package/src/daemon/message-types/host-cu.ts +1 -0
  323. package/src/daemon/message-types/host-file.ts +1 -0
  324. package/src/daemon/message-types/host-transfer.ts +1 -0
  325. package/src/daemon/message-types/messages.ts +10 -9
  326. package/src/daemon/message-types/workspace.ts +1 -1
  327. package/src/daemon/process-message.ts +102 -239
  328. package/src/daemon/server.ts +13 -462
  329. package/src/daemon/shutdown-handlers.ts +2 -2
  330. package/src/daemon/tool-side-effects.ts +125 -107
  331. package/src/daemon/trust-context.ts +13 -0
  332. package/src/daemon/wake-target-adapter.ts +4 -9
  333. package/src/events/domain-events.ts +0 -8
  334. package/src/events/tool-audit-listener.ts +3 -1
  335. package/src/events/tool-domain-event-publisher.ts +0 -10
  336. package/src/events/tool-metrics-listener.ts +0 -17
  337. package/src/events/tool-trace-listener.ts +0 -14
  338. package/src/filing/filing-service.ts +13 -1
  339. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +6 -2
  340. package/src/heartbeat/heartbeat-service.ts +23 -5
  341. package/src/home/__tests__/feed-writer.test.ts +0 -4
  342. package/src/home/__tests__/relationship-state-writer.test.ts +30 -0
  343. package/src/home/feed-writer.ts +1 -2
  344. package/src/home/relationship-state-writer.ts +16 -3
  345. package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
  346. package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
  347. package/src/ipc/assistant-server.ts +3 -10
  348. package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
  349. package/src/ipc/routes/route-adapter.ts +1 -1
  350. package/src/ipc/routes/trust-rules.test.ts +0 -95
  351. package/src/ipc/skill-ipc-types.ts +41 -0
  352. package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
  353. package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
  354. package/src/ipc/skill-routes/events.ts +12 -23
  355. package/src/ipc/skill-routes/identity.ts +4 -17
  356. package/src/ipc/skill-routes/index.ts +1 -1
  357. package/src/ipc/skill-server.ts +6 -39
  358. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
  359. package/src/live-voice/protocol.ts +4 -13
  360. package/src/mcp/manager.ts +0 -5
  361. package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
  362. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
  363. package/src/memory/app-git-service.ts +0 -32
  364. package/src/memory/app-store.ts +154 -0
  365. package/src/memory/attachments-store.ts +6 -0
  366. package/src/memory/context-search/sources/memory-v2.ts +578 -0
  367. package/src/memory/context-search/sources/memory.ts +5 -0
  368. package/src/memory/context-search/sources/pkb.ts +10 -1
  369. package/src/memory/context-search/sources/workspace.ts +3 -2
  370. package/src/memory/conversation-crud.ts +29 -4
  371. package/src/memory/conversation-disk-view.ts +1 -5
  372. package/src/memory/conversation-starter-checkpoints.ts +63 -0
  373. package/src/memory/db-connection.ts +62 -0
  374. package/src/memory/db-init.ts +14 -0
  375. package/src/memory/embedding-backend.ts +3 -21
  376. package/src/memory/embedding-gemini.ts +0 -2
  377. package/src/memory/embedding-local.ts +6 -6
  378. package/src/memory/embedding-ollama.ts +6 -6
  379. package/src/memory/embedding-openai.ts +6 -6
  380. package/src/memory/embedding-types.ts +21 -0
  381. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +3 -7
  382. package/src/memory/graph/conversation-graph-memory.ts +35 -13
  383. package/src/memory/graph/injection.test.ts +2 -2
  384. package/src/memory/graph/injection.ts +1 -1
  385. package/src/memory/guardian-action-store.ts +0 -83
  386. package/src/memory/guardian-approvals.ts +0 -48
  387. package/src/memory/indexer.ts +1 -15
  388. package/src/memory/job-handlers/conversation-starters.ts +36 -53
  389. package/src/memory/job-utils.ts +0 -6
  390. package/src/memory/jobs-store.ts +0 -1
  391. package/src/memory/jobs-worker.ts +2 -16
  392. package/src/memory/llm-request-log-store.ts +0 -41
  393. package/src/memory/llm-usage-store.ts +129 -43
  394. package/src/memory/memory-v2-activation-log-store.ts +115 -0
  395. package/src/memory/migrations/233-document-conversations.ts +54 -0
  396. package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
  397. package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
  398. package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
  399. package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
  400. package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
  401. package/src/memory/migrations/index.ts +14 -0
  402. package/src/memory/migrations/registry.ts +24 -0
  403. package/src/memory/raw-query.ts +2 -68
  404. package/src/memory/schema/conversations.ts +7 -0
  405. package/src/memory/schema/infrastructure.ts +25 -0
  406. package/src/memory/search/semantic.ts +5 -16
  407. package/src/memory/tool-usage-store.ts +2 -0
  408. package/src/memory/usage-buckets.ts +40 -1
  409. package/src/memory/usage-grouped-buckets.ts +127 -0
  410. package/src/memory/v2/__tests__/activation.test.ts +289 -90
  411. package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
  412. package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
  413. package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
  414. package/src/memory/v2/__tests__/injection.test.ts +384 -15
  415. package/src/memory/v2/__tests__/migration.test.ts +64 -36
  416. package/src/memory/v2/__tests__/page-store.test.ts +191 -8
  417. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
  418. package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
  419. package/src/memory/v2/__tests__/static-context.test.ts +153 -0
  420. package/src/memory/v2/activation.ts +168 -97
  421. package/src/memory/v2/backfill-jobs.ts +15 -100
  422. package/src/memory/v2/consolidation-job.ts +14 -12
  423. package/src/memory/v2/edge-index.ts +191 -0
  424. package/src/memory/v2/injection.ts +182 -58
  425. package/src/memory/v2/migration.ts +57 -64
  426. package/src/memory/v2/now-text.ts +2 -3
  427. package/src/memory/v2/page-store.ts +168 -31
  428. package/src/memory/v2/prompts/consolidation.ts +118 -42
  429. package/src/memory/v2/prompts/sweep.ts +3 -3
  430. package/src/memory/v2/skill-store.ts +55 -7
  431. package/src/memory/v2/static-context.ts +62 -0
  432. package/src/memory/v2/types.ts +10 -20
  433. package/src/memory/validation.ts +0 -11
  434. package/src/messaging/draft-store.ts +0 -6
  435. package/src/messaging/provider-types.ts +8 -0
  436. package/src/messaging/provider.ts +7 -0
  437. package/src/messaging/providers/gmail/client.ts +1 -121
  438. package/src/messaging/providers/outlook/client.ts +0 -73
  439. package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
  440. package/src/messaging/providers/slack/adapter.ts +122 -21
  441. package/src/messaging/providers/slack/backfill.test.ts +95 -6
  442. package/src/messaging/providers/slack/backfill.ts +89 -11
  443. package/src/messaging/providers/slack/client.ts +10 -124
  444. package/src/messaging/providers/slack/message-metadata.ts +12 -2
  445. package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
  446. package/src/messaging/providers/slack/render-transcript.ts +126 -25
  447. package/src/messaging/providers/slack/types.ts +1 -0
  448. package/src/oauth/connection-resolver.test.ts +8 -0
  449. package/src/oauth/connection-resolver.ts +8 -16
  450. package/src/oauth/credential-token-resolver.ts +97 -0
  451. package/src/oauth/manual-token-connection.ts +30 -34
  452. package/src/oauth/oauth-store.ts +6 -4
  453. package/src/outbound-proxy/certs.ts +0 -7
  454. package/src/outbound-proxy/config.ts +0 -74
  455. package/src/outbound-proxy/health.ts +0 -44
  456. package/src/outbound-proxy/index.ts +0 -22
  457. package/src/permissions/approval-provenance.test.ts +184 -0
  458. package/src/permissions/approval-provenance.ts +70 -0
  459. package/src/permissions/checker.ts +4 -1
  460. package/src/permissions/gateway-threshold-reader.ts +4 -1
  461. package/src/permissions/prompter.ts +9 -2
  462. package/src/permissions/secret-prompter.ts +21 -48
  463. package/src/permissions/types.ts +33 -0
  464. package/src/permissions/workspace-policy.ts +0 -5
  465. package/src/platform/sync-identity.ts +0 -8
  466. package/src/plugins/defaults/injectors.ts +69 -2
  467. package/src/plugins/defaults/overflow-reduce.ts +3 -2
  468. package/src/plugins/types.ts +8 -0
  469. package/src/prompts/system-prompt.ts +34 -70
  470. package/src/prompts/templates/BOOTSTRAP.md +52 -6
  471. package/src/prompts/update-bulletin-job.ts +2 -0
  472. package/src/providers/__tests__/retry-callsite.test.ts +138 -1
  473. package/src/providers/anthropic/client.ts +72 -33
  474. package/src/providers/call-site-routing.ts +42 -3
  475. package/src/providers/gemini/client.ts +18 -2
  476. package/src/providers/managed-proxy/context.ts +0 -5
  477. package/src/providers/model-catalog.ts +105 -19
  478. package/src/providers/openai/chat-completions-provider.ts +6 -0
  479. package/src/providers/openai/responses-provider.ts +7 -1
  480. package/src/providers/provider-send-message.ts +45 -2
  481. package/src/providers/ratelimit.ts +7 -2
  482. package/src/providers/registry.ts +14 -9
  483. package/src/providers/retry.ts +96 -8
  484. package/src/providers/types.ts +13 -0
  485. package/src/providers/usage-tracking.ts +96 -0
  486. package/src/runtime/AGENTS.md +10 -6
  487. package/src/runtime/__tests__/agent-wake.test.ts +89 -0
  488. package/src/runtime/agent-wake.ts +39 -2
  489. package/src/runtime/assistant-event-hub.ts +541 -45
  490. package/src/runtime/assistant-event.ts +1 -6
  491. package/src/runtime/auth/context.ts +0 -9
  492. package/src/runtime/auth/middleware.ts +1 -1
  493. package/src/runtime/auth/route-policy.ts +11 -9
  494. package/src/runtime/auth/token-service.ts +0 -11
  495. package/src/runtime/channel-approvals.ts +6 -2
  496. package/src/runtime/channel-verification-service.ts +3 -5
  497. package/src/runtime/http-errors.ts +0 -34
  498. package/src/runtime/http-router.ts +6 -3
  499. package/src/runtime/http-server.ts +22 -82
  500. package/src/runtime/http-types.ts +5 -0
  501. package/src/runtime/interactive-ui.ts +0 -1
  502. package/src/runtime/middleware/auth.ts +0 -20
  503. package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
  504. package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
  505. package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
  506. package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
  507. package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
  508. package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
  509. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +143 -79
  510. package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
  511. package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
  512. package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +371 -0
  513. package/src/runtime/migrations/migration-transport.ts +46 -13
  514. package/src/runtime/migrations/migration-wizard.ts +2 -2
  515. package/src/runtime/migrations/origin-mode.ts +40 -0
  516. package/src/runtime/migrations/vbundle-builder.ts +133 -79
  517. package/src/runtime/migrations/vbundle-import-analyzer.ts +9 -7
  518. package/src/runtime/migrations/vbundle-importer.ts +7 -7
  519. package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
  520. package/src/runtime/migrations/vbundle-streaming-importer.ts +3 -3
  521. package/src/runtime/migrations/vbundle-streaming-validator.ts +48 -26
  522. package/src/runtime/migrations/vbundle-validator.ts +214 -41
  523. package/src/runtime/pending-interactions.ts +13 -4
  524. package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
  525. package/src/runtime/routes/__tests__/backup-routes.test.ts +28 -19
  526. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +235 -0
  527. package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
  528. package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
  529. package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
  530. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
  531. package/src/runtime/routes/acp-routes.test.ts +0 -3
  532. package/src/runtime/routes/acp-routes.ts +3 -7
  533. package/src/runtime/routes/app-management-routes.ts +18 -9
  534. package/src/runtime/routes/approval-routes.ts +55 -14
  535. package/src/runtime/routes/avatar-routes.ts +3 -5
  536. package/src/runtime/routes/browser-routes.ts +1 -15
  537. package/src/runtime/routes/channel-guardian-routes.ts +1 -5
  538. package/src/runtime/routes/channel-readiness-routes.ts +3 -7
  539. package/src/runtime/routes/channel-route-shared.ts +2 -28
  540. package/src/runtime/routes/client-routes.ts +45 -12
  541. package/src/runtime/routes/consolidation-routes.ts +115 -0
  542. package/src/runtime/routes/conversation-list-routes.ts +12 -29
  543. package/src/runtime/routes/conversation-management-routes.ts +14 -51
  544. package/src/runtime/routes/conversation-query-routes.ts +120 -8
  545. package/src/runtime/routes/conversation-routes.ts +44 -528
  546. package/src/runtime/routes/conversation-starter-routes.ts +19 -40
  547. package/src/runtime/routes/documents-routes.ts +53 -18
  548. package/src/runtime/routes/events-routes.ts +59 -91
  549. package/src/runtime/routes/filing-routes.ts +18 -1
  550. package/src/runtime/routes/guardian-action-routes.ts +4 -9
  551. package/src/runtime/routes/host-bash-routes.ts +3 -2
  552. package/src/runtime/routes/host-browser-routes.ts +9 -33
  553. package/src/runtime/routes/host-cu-routes.ts +6 -1
  554. package/src/runtime/routes/host-file-routes.ts +3 -2
  555. package/src/runtime/routes/host-transfer-routes.ts +11 -15
  556. package/src/runtime/routes/identity-routes.ts +78 -6
  557. package/src/runtime/routes/inbound-message-handler.ts +580 -137
  558. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -88
  559. package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
  560. package/src/runtime/routes/index.ts +4 -0
  561. package/src/runtime/routes/integrations/slack/channel.ts +0 -24
  562. package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
  563. package/src/runtime/routes/memory-v2-routes.ts +10 -15
  564. package/src/runtime/routes/migration-routes.ts +188 -31
  565. package/src/runtime/routes/playground/guard.ts +1 -1
  566. package/src/runtime/routes/playground/index.ts +0 -2
  567. package/src/runtime/routes/recording-routes.ts +4 -24
  568. package/src/runtime/routes/rename-conversation-routes.ts +2 -6
  569. package/src/runtime/routes/schedule-routes.ts +3 -6
  570. package/src/runtime/routes/secret-routes.ts +87 -18
  571. package/src/runtime/routes/settings-routes.ts +29 -28
  572. package/src/runtime/routes/skills-routes.ts +12 -31
  573. package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
  574. package/src/runtime/routes/task-routes.ts +6 -6
  575. package/src/runtime/routes/trust-rules-routes.ts +3 -94
  576. package/src/runtime/routes/types.ts +4 -4
  577. package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
  578. package/src/runtime/routes/usage-routes.ts +87 -10
  579. package/src/runtime/routes/user-routes.ts +17 -31
  580. package/src/runtime/routes/work-items-routes.ts +1 -4
  581. package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
  582. package/src/runtime/services/analyze-conversation.ts +7 -17
  583. package/src/runtime/services/conversation-serializer.ts +2 -4
  584. package/src/runtime/verification-outbound-actions.ts +1 -1
  585. package/src/runtime/verification-rate-limiter.ts +1 -1
  586. package/src/schedule/schedule-store.ts +0 -16
  587. package/src/security/secret-scanner.ts +14 -547
  588. package/src/security/secure-keys.ts +31 -11
  589. package/src/security/token-manager.ts +7 -3
  590. package/src/signals/cancel.ts +16 -25
  591. package/src/signals/conversation-undo.ts +2 -27
  592. package/src/signals/emit-event.ts +1 -2
  593. package/src/signals/user-message.ts +108 -22
  594. package/src/skills/catalog-install.ts +1 -0
  595. package/src/skills/clawhub.ts +2 -2
  596. package/src/skills/inline-command-runner.ts +1 -7
  597. package/src/subagent/manager.ts +67 -84
  598. package/src/tasks/task-store.ts +1 -28
  599. package/src/telemetry/types.ts +6 -0
  600. package/src/telemetry/usage-telemetry-reporter.test.ts +38 -15
  601. package/src/telemetry/usage-telemetry-reporter.ts +3 -5
  602. package/src/tools/acp/spawn.test.ts +1 -2
  603. package/src/tools/acp/steer.test.ts +1 -2
  604. package/src/tools/browser/__tests__/browser-status.test.ts +44 -127
  605. package/src/tools/browser/browser-execution.ts +31 -147
  606. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +92 -68
  607. package/src/tools/browser/cdp-client/factory.ts +48 -76
  608. package/src/tools/browser/cdp-client/index.ts +1 -14
  609. package/src/tools/executor.ts +44 -31
  610. package/src/tools/host-filesystem/edit.ts +3 -2
  611. package/src/tools/host-filesystem/read.ts +3 -2
  612. package/src/tools/host-filesystem/transfer.test.ts +45 -42
  613. package/src/tools/host-filesystem/transfer.ts +4 -3
  614. package/src/tools/host-filesystem/write.ts +3 -2
  615. package/src/tools/host-terminal/host-shell.ts +4 -3
  616. package/src/tools/network/script-proxy/index.ts +1 -10
  617. package/src/tools/permission-checker.ts +66 -1
  618. package/src/tools/skills/sandbox-runner.ts +1 -6
  619. package/src/tools/skills/skill-tool-factory.ts +32 -0
  620. package/src/tools/terminal/safe-env.ts +1 -0
  621. package/src/tools/terminal/shell.ts +2 -78
  622. package/src/tools/types.ts +12 -39
  623. package/src/tts/__tests__/provider-catalog.test.ts +2 -2
  624. package/src/tts/provider-catalog.ts +1 -1
  625. package/src/usage/actors.ts +2 -1
  626. package/src/usage/attribution.ts +185 -0
  627. package/src/usage/pricing.ts +166 -0
  628. package/src/usage/types.ts +14 -0
  629. package/src/util/json.ts +13 -0
  630. package/src/util/logger.ts +3 -3
  631. package/src/util/pricing.ts +50 -3
  632. package/src/work-items/work-item-runner.ts +15 -42
  633. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +4 -3
  634. package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
  635. package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
  636. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +59 -0
  637. package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
  638. package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
  639. package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
  640. package/src/workspace/migrations/registry.ts +8 -0
  641. package/src/workspace/provider-commit-message-generator.ts +3 -3
  642. package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
  643. package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
  644. package/src/__tests__/secret-detection-handler.test.ts +0 -67
  645. package/src/__tests__/secret-scanner-executor.test.ts +0 -450
  646. package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
  647. package/src/__tests__/terminal-sandbox.test.ts +0 -374
  648. package/src/__tests__/tool-notification-listener.test.ts +0 -65
  649. package/src/context/__tests__/microcompact.test.ts +0 -805
  650. package/src/context/microcompact.ts +0 -443
  651. package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
  652. package/src/events/tool-notification-listener.ts +0 -17
  653. package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
  654. package/src/memory/v2/__tests__/edges.test.ts +0 -435
  655. package/src/memory/v2/edges.ts +0 -217
  656. package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
  657. package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
  658. package/src/runtime/__tests__/client-registry.test.ts +0 -271
  659. package/src/runtime/chrome-extension-registry.ts +0 -368
  660. package/src/runtime/client-registry.ts +0 -254
  661. package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
  662. package/src/tools/secret-detection-handler.ts +0 -269
  663. package/src/tools/terminal/backends/native.ts +0 -327
  664. package/src/tools/terminal/backends/types.ts +0 -37
  665. package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
  666. package/src/tools/terminal/sandbox.ts +0 -40
@@ -19,6 +19,8 @@
19
19
  * stable identity.
20
20
  */
21
21
 
22
+ import { AsyncLocalStorage } from "node:async_hooks";
23
+
22
24
  import { resolveCallSiteConfig } from "../config/llm-resolver.js";
23
25
  import { getConfig } from "../config/loader.js";
24
26
  import type {
@@ -30,14 +32,28 @@ import type {
30
32
  } from "./types.js";
31
33
 
32
34
  export class CallSiteRoutingProvider implements Provider {
33
- public readonly name: string;
34
35
  public readonly tokenEstimationProvider?: string;
35
36
 
37
+ // Per-call async context that tracks which provider is currently executing.
38
+ // Using AsyncLocalStorage instead of a plain instance field means concurrent
39
+ // sendMessage calls (e.g. the main agent turn and a title-generation call
40
+ // both in-flight at the same time on the same provider instance) each see
41
+ // their own value — no clobbering, no premature clear.
42
+ //
43
+ // During sendMessage, emitLlmCallStartedIfNeeded reads provider.name on the
44
+ // first text_delta (before the response completes). The getter below returns
45
+ // the async-context value so streaming trace events carry the routed
46
+ // provider's name, not the default's.
47
+ private readonly _activeProviderContext = new AsyncLocalStorage<string>();
48
+
49
+ get name(): string {
50
+ return this._activeProviderContext.getStore() ?? this.defaultProvider.name;
51
+ }
52
+
36
53
  constructor(
37
54
  private readonly defaultProvider: Provider,
38
55
  private readonly getProviderByName: (name: string) => Provider | undefined,
39
56
  ) {
40
- this.name = defaultProvider.name;
41
57
  this.tokenEstimationProvider = defaultProvider.tokenEstimationProvider;
42
58
  }
43
59
 
@@ -48,7 +64,30 @@ export class CallSiteRoutingProvider implements Provider {
48
64
  options?: SendMessageOptions,
49
65
  ): Promise<ProviderResponse> {
50
66
  const target = this.selectProvider(options);
51
- return target.sendMessage(messages, tools, systemPrompt, options);
67
+ const isRouted = target !== this.defaultProvider;
68
+
69
+ const doSend = async (): Promise<ProviderResponse> => {
70
+ const response = await target.sendMessage(
71
+ messages,
72
+ tools,
73
+ systemPrompt,
74
+ options,
75
+ );
76
+ // Also stamp actualProvider on the response so that handleUsage /
77
+ // llm_call_finished (which read event.actualProvider, not provider.name)
78
+ // attribute the call to the right provider.
79
+ if (isRouted && response.actualProvider == null) {
80
+ return { ...response, actualProvider: target.name };
81
+ }
82
+ return response;
83
+ };
84
+
85
+ // Run inside the async context so that any code reading provider.name
86
+ // during streaming (e.g. emitLlmCallStartedIfNeeded on text_delta) sees
87
+ // the routed provider's name for this specific call, not the default.
88
+ return isRouted
89
+ ? this._activeProviderContext.run(target.name, doSend)
90
+ : doSend();
52
91
  }
53
92
 
54
93
  /**
@@ -30,10 +30,20 @@ const GEMINI_CONTEXT_OVERFLOW_TOKEN_PATTERNS =
30
30
  const GEMINI_3_UNSIGNED_TOOL_CALL_THOUGHT_SIGNATURE =
31
31
  "context_engineering_is_the_way_to_go";
32
32
 
33
- export function isGemini3Model(model: string): boolean {
33
+ function isGemini3Model(model: string): boolean {
34
34
  return model.startsWith("gemini-3") || model.startsWith("models/gemini-3");
35
35
  }
36
36
 
37
+ function stripGeminiHttpOptions(
38
+ config: genai.GenerateContentConfig,
39
+ ): genai.GenerateContentConfig {
40
+ const { httpOptions: _httpOptions, ...rest } =
41
+ config as genai.GenerateContentConfig & {
42
+ httpOptions?: unknown;
43
+ };
44
+ return rest;
45
+ }
46
+
37
47
  /**
38
48
  * Detect Gemini's context-overflow signals on an `ApiError`. Gemini surfaces
39
49
  * this condition via its "RESOURCE_EXHAUSTED" category. The Gemini SDK's
@@ -162,6 +172,9 @@ export class GeminiProvider implements Provider {
162
172
  const configObj = config as Record<string, unknown> | undefined;
163
173
  const maxTokens = configObj?.max_tokens as number | undefined;
164
174
  const modelOverride = configObj?.model as string | undefined;
175
+ const usageAttributionHeaders = configObj?.usageAttributionHeaders as
176
+ | Record<string, string>
177
+ | undefined;
165
178
  const activeModel = modelOverride ?? this.model;
166
179
 
167
180
  try {
@@ -193,6 +206,9 @@ export class GeminiProvider implements Provider {
193
206
  const { signal: timeoutSignal, cleanup: cleanupTimeout } =
194
207
  createStreamTimeout(this.streamTimeoutMs, signal);
195
208
  geminiConfig.abortSignal = timeoutSignal;
209
+ if (usageAttributionHeaders) {
210
+ geminiConfig.httpOptions = { headers: usageAttributionHeaders };
211
+ }
196
212
 
197
213
  // Accumulate from streaming chunks
198
214
  let fullText = "";
@@ -296,7 +312,7 @@ export class GeminiProvider implements Provider {
296
312
  const rawRequest = {
297
313
  model: activeModel,
298
314
  contents: geminiContents,
299
- config: geminiConfig,
315
+ config: stripGeminiHttpOptions(geminiConfig),
300
316
  };
301
317
  const rawResponse = {
302
318
  model: responseModel,
@@ -92,8 +92,3 @@ export async function managedFallbackEnabledFor(
92
92
  if (!meta?.managed) return false;
93
93
  return await hasManagedProxyPrereqs();
94
94
  }
95
-
96
- /** @internal Test-only: reset the cached managed-proxy-enabled flag. */
97
- export function _resetManagedProxyEnabledCache(): void {
98
- _managedProxyEnabled = false;
99
- }
@@ -1,8 +1,16 @@
1
+ export type LongContextMode =
2
+ | "native-model"
3
+ | "provider-request-option"
4
+ | "unsupported";
5
+
1
6
  export interface CatalogModel {
2
7
  id: string;
3
8
  displayName: string;
4
9
  contextWindowTokens?: number;
5
10
  maxOutputTokens?: number;
11
+ defaultContextWindowTokens?: number;
12
+ longContextPricingThresholdTokens?: number;
13
+ longContextMode?: LongContextMode;
6
14
  supportsThinking?: boolean;
7
15
  supportsCaching?: boolean;
8
16
  supportsVision?: boolean;
@@ -15,6 +23,31 @@ export interface CatalogModel {
15
23
  };
16
24
  }
17
25
 
26
+ const DEFAULT_CONTEXT_WINDOW_TOKENS = 200000;
27
+ const OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS = 272000;
28
+
29
+ function catalogModel(model: CatalogModel): CatalogModel {
30
+ const configuredDefaultContextWindowTokens =
31
+ model.defaultContextWindowTokens ?? DEFAULT_CONTEXT_WINDOW_TOKENS;
32
+ const defaultContextWindowTokens =
33
+ model.contextWindowTokens === undefined
34
+ ? configuredDefaultContextWindowTokens
35
+ : Math.min(
36
+ configuredDefaultContextWindowTokens,
37
+ model.contextWindowTokens,
38
+ );
39
+
40
+ return {
41
+ ...model,
42
+ defaultContextWindowTokens,
43
+ longContextMode:
44
+ model.longContextMode ??
45
+ ((model.contextWindowTokens ?? 0) > DEFAULT_CONTEXT_WINDOW_TOKENS
46
+ ? "native-model"
47
+ : "unsupported"),
48
+ };
49
+ }
50
+
18
51
  export interface ProviderCatalogEntry {
19
52
  id: string;
20
53
  displayName: string;
@@ -33,8 +66,26 @@ export interface ProviderCatalogEntry {
33
66
  };
34
67
  }
35
68
 
36
- /** Single source of truth for all inference provider metadata and models. */
37
- export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
69
+ /**
70
+ * Canonical assistant catalog for inference provider metadata and models.
71
+ * `meta/llm-provider-catalog.json` mirrors the client-facing subset and is
72
+ * kept in parity by `llm-catalog-parity.test.ts`; native-client fallbacks
73
+ * mirror only the startup-critical display/setup/context metadata.
74
+ *
75
+ * Model limits verified 2026-04-30 against official provider docs:
76
+ * - Anthropic model overview and context window docs:
77
+ * https://platform.claude.com/docs/en/about-claude/models/overview
78
+ * https://platform.claude.com/docs/en/build-with-claude/context-windows
79
+ * - OpenAI model comparison and model detail docs:
80
+ * https://developers.openai.com/api/docs/models/compare
81
+ * https://developers.openai.com/api/docs/models
82
+ * - Google Gemini model docs:
83
+ * https://ai.google.dev/gemini-api/docs/models
84
+ *
85
+ * contextWindowTokens is the maximum known input context. maxOutputTokens is
86
+ * the maximum standard synchronous Messages/Responses output limit.
87
+ */
88
+ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
38
89
  {
39
90
  id: "anthropic",
40
91
  displayName: "Anthropic",
@@ -52,8 +103,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
52
103
  {
53
104
  id: "claude-opus-4-7",
54
105
  displayName: "Claude Opus 4.7",
55
- contextWindowTokens: 200000,
56
- maxOutputTokens: 32000,
106
+ contextWindowTokens: 1000000,
107
+ maxOutputTokens: 128000,
108
+ longContextPricingThresholdTokens: 200000,
57
109
  supportsThinking: true,
58
110
  supportsCaching: true,
59
111
  supportsVision: true,
@@ -68,8 +120,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
68
120
  {
69
121
  id: "claude-opus-4-6",
70
122
  displayName: "Claude Opus 4.6",
71
- contextWindowTokens: 200000,
72
- maxOutputTokens: 32000,
123
+ contextWindowTokens: 1000000,
124
+ maxOutputTokens: 128000,
125
+ longContextPricingThresholdTokens: 200000,
73
126
  supportsThinking: true,
74
127
  supportsCaching: true,
75
128
  supportsVision: true,
@@ -84,8 +137,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
84
137
  {
85
138
  id: "claude-sonnet-4-6",
86
139
  displayName: "Claude Sonnet 4.6",
87
- contextWindowTokens: 200000,
140
+ contextWindowTokens: 1000000,
88
141
  maxOutputTokens: 64000,
142
+ longContextPricingThresholdTokens: 200000,
89
143
  supportsThinking: true,
90
144
  supportsCaching: true,
91
145
  supportsVision: true,
@@ -101,7 +155,7 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
101
155
  id: "claude-haiku-4-5-20251001",
102
156
  displayName: "Claude Haiku 4.5",
103
157
  contextWindowTokens: 200000,
104
- maxOutputTokens: 16000,
158
+ maxOutputTokens: 64000,
105
159
  supportsThinking: true,
106
160
  supportsCaching: true,
107
161
  supportsVision: true,
@@ -137,6 +191,8 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
137
191
  displayName: "GPT-5.5",
138
192
  contextWindowTokens: 1050000,
139
193
  maxOutputTokens: 128000,
194
+ longContextPricingThresholdTokens:
195
+ OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
140
196
  supportsThinking: true,
141
197
  supportsCaching: true,
142
198
  supportsVision: true,
@@ -147,11 +203,29 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
147
203
  cacheReadPer1mTokens: 0.5,
148
204
  },
149
205
  },
206
+ {
207
+ id: "gpt-5.5-pro",
208
+ displayName: "GPT-5.5 Pro",
209
+ contextWindowTokens: 1050000,
210
+ maxOutputTokens: 128000,
211
+ longContextPricingThresholdTokens:
212
+ OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
213
+ supportsThinking: true,
214
+ supportsCaching: true,
215
+ supportsVision: true,
216
+ supportsToolUse: true,
217
+ pricing: {
218
+ inputPer1mTokens: 30.0,
219
+ outputPer1mTokens: 180.0,
220
+ },
221
+ },
150
222
  {
151
223
  id: "gpt-5.4",
152
224
  displayName: "GPT-5.4",
153
- contextWindowTokens: 400000,
225
+ contextWindowTokens: 1050000,
154
226
  maxOutputTokens: 128000,
227
+ longContextPricingThresholdTokens:
228
+ OPENAI_LONG_CONTEXT_PRICING_THRESHOLD_TOKENS,
155
229
  supportsThinking: true,
156
230
  supportsCaching: true,
157
231
  supportsVision: true,
@@ -187,9 +261,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
187
261
  supportsVision: true,
188
262
  supportsToolUse: true,
189
263
  pricing: {
190
- inputPer1mTokens: 0.5,
191
- outputPer1mTokens: 3.0,
192
- cacheReadPer1mTokens: 0.05,
264
+ inputPer1mTokens: 0.75,
265
+ outputPer1mTokens: 4.5,
266
+ cacheReadPer1mTokens: 0.075,
193
267
  },
194
268
  },
195
269
  {
@@ -232,6 +306,7 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
232
306
  displayName: "Gemini 3.1 Pro Preview",
233
307
  contextWindowTokens: 1048576,
234
308
  maxOutputTokens: 65536,
309
+ longContextPricingThresholdTokens: 200000,
235
310
  supportsThinking: true,
236
311
  supportsCaching: true,
237
312
  supportsVision: true,
@@ -247,6 +322,7 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
247
322
  displayName: "Gemini 3.1 Pro Preview (Custom Tools)",
248
323
  contextWindowTokens: 1048576,
249
324
  maxOutputTokens: 65536,
325
+ longContextPricingThresholdTokens: 200000,
250
326
  supportsThinking: true,
251
327
  supportsCaching: true,
252
328
  supportsVision: true,
@@ -320,8 +396,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
320
396
  {
321
397
  id: "gemini-2.5-pro",
322
398
  displayName: "Gemini 2.5 Pro",
323
- contextWindowTokens: 2000000,
399
+ contextWindowTokens: 1048576,
324
400
  maxOutputTokens: 65536,
401
+ longContextPricingThresholdTokens: 200000,
325
402
  supportsThinking: true,
326
403
  supportsCaching: true,
327
404
  supportsVision: true,
@@ -426,8 +503,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
426
503
  {
427
504
  id: "anthropic/claude-opus-4.7",
428
505
  displayName: "Claude Opus 4.7",
429
- contextWindowTokens: 200000,
430
- maxOutputTokens: 32000,
506
+ contextWindowTokens: 1000000,
507
+ maxOutputTokens: 128000,
508
+ longContextPricingThresholdTokens: 200000,
431
509
  supportsThinking: true,
432
510
  supportsCaching: true,
433
511
  supportsVision: true,
@@ -442,8 +520,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
442
520
  {
443
521
  id: "anthropic/claude-opus-4.6",
444
522
  displayName: "Claude Opus 4.6",
445
- contextWindowTokens: 200000,
446
- maxOutputTokens: 32000,
523
+ contextWindowTokens: 1000000,
524
+ maxOutputTokens: 128000,
525
+ longContextPricingThresholdTokens: 200000,
447
526
  supportsThinking: true,
448
527
  supportsCaching: true,
449
528
  supportsVision: true,
@@ -458,8 +537,9 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
458
537
  {
459
538
  id: "anthropic/claude-sonnet-4.6",
460
539
  displayName: "Claude Sonnet 4.6",
461
- contextWindowTokens: 200000,
540
+ contextWindowTokens: 1000000,
462
541
  maxOutputTokens: 64000,
542
+ longContextPricingThresholdTokens: 200000,
463
543
  supportsThinking: true,
464
544
  supportsCaching: true,
465
545
  supportsVision: true,
@@ -475,7 +555,7 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
475
555
  id: "anthropic/claude-haiku-4.5",
476
556
  displayName: "Claude Haiku 4.5",
477
557
  contextWindowTokens: 200000,
478
- maxOutputTokens: 16000,
558
+ maxOutputTokens: 64000,
479
559
  supportsThinking: true,
480
560
  supportsCaching: true,
481
561
  supportsVision: true,
@@ -677,6 +757,12 @@ export const PROVIDER_CATALOG: ProviderCatalogEntry[] = [
677
757
  },
678
758
  ];
679
759
 
760
+ export const PROVIDER_CATALOG: ProviderCatalogEntry[] =
761
+ RAW_PROVIDER_CATALOG.map((entry) => ({
762
+ ...entry,
763
+ models: entry.models.map(catalogModel),
764
+ }));
765
+
680
766
  /** Check if a model ID is in the catalog for a given provider. */
681
767
  export function isModelInCatalog(provider: string, modelId: string): boolean {
682
768
  const entry = PROVIDER_CATALOG.find((p) => p.id === provider);
@@ -139,6 +139,9 @@ export class OpenAIChatCompletionsProvider implements Provider {
139
139
  const maxTokens = configObj?.max_tokens as number | undefined;
140
140
  const modelOverride = configObj?.model as string | undefined;
141
141
  const effort = configObj?.effort as string | undefined;
142
+ const usageAttributionHeaders = configObj?.usageAttributionHeaders as
143
+ | Record<string, string>
144
+ | undefined;
142
145
 
143
146
  try {
144
147
  const openaiMessages = this.toOpenAIMessages(messages, systemPrompt);
@@ -196,6 +199,9 @@ export class OpenAIChatCompletionsProvider implements Provider {
196
199
  try {
197
200
  const stream = await this.client.chat.completions.create(params, {
198
201
  signal: timeoutSignal,
202
+ ...(usageAttributionHeaders
203
+ ? { headers: usageAttributionHeaders }
204
+ : {}),
199
205
  });
200
206
 
201
207
  for await (const chunk of stream) {
@@ -130,6 +130,9 @@ export class OpenAIResponsesProvider implements Provider {
130
130
  const modelOverride = configObj?.model as string | undefined;
131
131
  const effort = configObj?.effort as string | undefined;
132
132
  const verbosity = configObj?.verbosity as string | undefined;
133
+ const usageAttributionHeaders = configObj?.usageAttributionHeaders as
134
+ | Record<string, string>
135
+ | undefined;
133
136
 
134
137
  try {
135
138
  const input = this.toResponsesInput(messages);
@@ -222,11 +225,14 @@ export class OpenAIResponsesProvider implements Provider {
222
225
  const responsesApi = this.client.responses as unknown as {
223
226
  stream(
224
227
  p: Record<string, unknown>,
225
- o: { signal: AbortSignal },
228
+ o: { signal: AbortSignal; headers?: Record<string, string> },
226
229
  ): AsyncIterable<ResponsesStreamEvent>;
227
230
  };
228
231
  const stream = responsesApi.stream(params, {
229
232
  signal: timeoutSignal,
233
+ ...(usageAttributionHeaders
234
+ ? { headers: usageAttributionHeaders }
235
+ : {}),
230
236
  });
231
237
 
232
238
  for await (const event of stream) {
@@ -13,12 +13,13 @@ import type {
13
13
  Message,
14
14
  Provider,
15
15
  ProviderResponse,
16
+ SendMessageOptions,
17
+ ToolDefinition,
16
18
  ToolUseContent,
17
19
  } from "./types.js";
18
20
 
19
21
  // Re-export the typed context-overflow error so callsites that dispatch on
20
22
  // this category do not need to reach into `./types.js` directly.
21
- export { ContextOverflowError, isContextOverflowError } from "./types.js";
22
23
 
23
24
  export interface ConfiguredProviderResult {
24
25
  provider: Provider;
@@ -33,6 +34,44 @@ export interface ConfiguredProviderResult {
33
34
  */
34
35
  let lazyInitPromise: Promise<void> | null = null;
35
36
 
37
+ export class CallSiteConfiguredProvider implements Provider {
38
+ public readonly name: string;
39
+ public readonly tokenEstimationProvider?: string;
40
+
41
+ constructor(
42
+ private readonly inner: Provider,
43
+ private readonly callSite: LLMCallSite,
44
+ private readonly overrideProfile?: string,
45
+ ) {
46
+ this.name = inner.name;
47
+ this.tokenEstimationProvider = inner.tokenEstimationProvider;
48
+ }
49
+
50
+ sendMessage(
51
+ messages: Message[],
52
+ tools?: ToolDefinition[],
53
+ systemPrompt?: string,
54
+ options?: SendMessageOptions,
55
+ ): Promise<ProviderResponse> {
56
+ const config = options?.config;
57
+ if (config?.callSite) {
58
+ return this.inner.sendMessage(messages, tools, systemPrompt, options);
59
+ }
60
+
61
+ return this.inner.sendMessage(messages, tools, systemPrompt, {
62
+ ...options,
63
+ config: {
64
+ ...config,
65
+ callSite: this.callSite,
66
+ ...(config?.overrideProfile === undefined &&
67
+ this.overrideProfile !== undefined
68
+ ? { overrideProfile: this.overrideProfile }
69
+ : {}),
70
+ },
71
+ });
72
+ }
73
+ }
74
+
36
75
  /**
37
76
  * Resolve the configured provider with full selection metadata.
38
77
  * If providers haven't been initialized yet (e.g. non-daemon code paths),
@@ -77,7 +116,11 @@ export async function resolveConfiguredProvider(
77
116
  try {
78
117
  const provider = getProvider(inferenceProvider);
79
118
  return {
80
- provider,
119
+ provider: new CallSiteConfiguredProvider(
120
+ provider,
121
+ callSite,
122
+ opts.overrideProfile,
123
+ ),
81
124
  configuredProviderName: inferenceProvider,
82
125
  };
83
126
  } catch {
@@ -12,7 +12,13 @@ import type {
12
12
  const log = getLogger("rate-limit");
13
13
 
14
14
  export class RateLimitProvider implements Provider {
15
- public readonly name: string;
15
+ // Delegate name dynamically so that wrapper providers (e.g.
16
+ // CallSiteRoutingProvider) whose name getter reflects per-call async context
17
+ // (AsyncLocalStorage) are reached correctly during streaming — rather than
18
+ // returning a stale snapshot captured at construction time.
19
+ get name(): string {
20
+ return this.inner.name;
21
+ }
16
22
 
17
23
  get tokenEstimationProvider(): string | undefined {
18
24
  return this.inner.tokenEstimationProvider;
@@ -25,7 +31,6 @@ export class RateLimitProvider implements Provider {
25
31
  private readonly config: RateLimitConfig,
26
32
  sharedRequestTimestamps?: number[],
27
33
  ) {
28
- this.name = inner.name;
29
34
  this.requestTimestamps = sharedRequestTimestamps ?? [];
30
35
  }
31
36
 
@@ -14,12 +14,13 @@ import { OpenAIResponsesProvider } from "./openai/client.js";
14
14
  import { OpenRouterProvider } from "./openrouter/client.js";
15
15
  import { RetryProvider } from "./retry.js";
16
16
  import type { Provider } from "./types.js";
17
+ import { UsageTrackingProvider } from "./usage-tracking.js";
17
18
 
18
19
  const providers = new Map<string, Provider>();
19
20
  const routingSources = new Map<string, "user-key" | "managed-proxy">();
20
21
 
21
22
  function registerProvider(name: string, provider: Provider): void {
22
- providers.set(name, provider);
23
+ providers.set(name, new UsageTrackingProvider(provider));
23
24
  }
24
25
 
25
26
  export function getProvider(name: string): Provider {
@@ -40,14 +41,6 @@ export function getProviderRoutingSource(
40
41
  return routingSources.get(name);
41
42
  }
42
43
 
43
- /**
44
- * Return the default model for a given provider name.
45
- * Falls back to the Anthropic default if the provider name is unknown.
46
- */
47
- export function getDefaultModel(providerName: string): string {
48
- return getProviderDefaultModel(providerName);
49
- }
50
-
51
44
  export interface ProvidersConfig {
52
45
  services: {
53
46
  inference: {
@@ -171,6 +164,10 @@ export async function initializeProviders(
171
164
  ? { baseURL: anthropicCreds.baseURL }
172
165
  : {}),
173
166
  }),
167
+ {
168
+ forwardUsageAttributionHeaders:
169
+ anthropicCreds.source === "managed-proxy",
170
+ },
174
171
  ),
175
172
  );
176
173
  routingSources.set("anthropic", anthropicCreds.source);
@@ -188,6 +185,10 @@ export async function initializeProviders(
188
185
  streamTimeoutMs,
189
186
  ...(openaiCreds.baseURL ? { baseURL: openaiCreds.baseURL } : {}),
190
187
  }),
188
+ {
189
+ forwardUsageAttributionHeaders:
190
+ openaiCreds.source === "managed-proxy",
191
+ },
191
192
  ),
192
193
  );
193
194
  routingSources.set("openai", openaiCreds.source);
@@ -206,6 +207,10 @@ export async function initializeProviders(
206
207
  ? { managedBaseUrl: geminiCreds.baseURL }
207
208
  : {}),
208
209
  }),
210
+ {
211
+ forwardUsageAttributionHeaders:
212
+ geminiCreds.source === "managed-proxy",
213
+ },
209
214
  ),
210
215
  );
211
216
  routingSources.set("gemini", geminiCreds.source);