@browserbasehq/orca 3.1.0-patch.4 → 3.2.0-middleware.2

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 (495) hide show
  1. package/dist/cjs/lib/inference.d.ts +3 -1
  2. package/dist/cjs/lib/inference.js +4 -7
  3. package/dist/cjs/lib/inference.js.map +1 -1
  4. package/dist/cjs/lib/prompt.d.ts +1 -1
  5. package/dist/cjs/lib/prompt.js +24 -18
  6. package/dist/cjs/lib/prompt.js.map +1 -1
  7. package/dist/cjs/lib/utils.d.ts +1 -0
  8. package/dist/cjs/lib/utils.js +4 -0
  9. package/dist/cjs/lib/utils.js.map +1 -1
  10. package/dist/cjs/lib/v3/agent/AgentClient.d.ts +8 -0
  11. package/dist/cjs/lib/v3/agent/AgentClient.js +13 -0
  12. package/dist/cjs/lib/v3/agent/AgentClient.js.map +1 -1
  13. package/dist/cjs/lib/v3/agent/AgentProvider.js +0 -1
  14. package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
  15. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +6 -7
  16. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  17. package/dist/cjs/lib/v3/agent/GoogleCUAClient.js +6 -7
  18. package/dist/cjs/lib/v3/agent/GoogleCUAClient.js.map +1 -1
  19. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js +1 -0
  20. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
  21. package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +10 -6
  22. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +107 -18
  23. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  24. package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.d.ts +4 -2
  25. package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js +11 -12
  26. package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
  27. package/dist/cjs/lib/v3/agent/tools/act.d.ts +1 -1
  28. package/dist/cjs/lib/v3/agent/tools/act.js +11 -4
  29. package/dist/cjs/lib/v3/agent/tools/act.js.map +1 -1
  30. package/dist/cjs/lib/v3/agent/tools/ariaTree.d.ts +8 -1
  31. package/dist/cjs/lib/v3/agent/tools/ariaTree.js +49 -22
  32. package/dist/cjs/lib/v3/agent/tools/ariaTree.js.map +1 -1
  33. package/dist/cjs/lib/v3/agent/tools/{search.js → braveSearch.js} +1 -1
  34. package/dist/cjs/lib/v3/agent/tools/braveSearch.js.map +1 -0
  35. package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.d.ts +13 -0
  36. package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js +70 -0
  37. package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js.map +1 -0
  38. package/dist/cjs/lib/v3/agent/tools/click.js +23 -31
  39. package/dist/cjs/lib/v3/agent/tools/click.js.map +1 -1
  40. package/dist/cjs/lib/v3/agent/tools/clickAndHold.js.map +1 -1
  41. package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js +22 -30
  42. package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
  43. package/dist/cjs/lib/v3/agent/tools/extract.d.ts +2 -2
  44. package/dist/cjs/lib/v3/agent/tools/extract.js +7 -3
  45. package/dist/cjs/lib/v3/agent/tools/extract.js.map +1 -1
  46. package/dist/cjs/lib/v3/agent/tools/fillFormVision.js +30 -30
  47. package/dist/cjs/lib/v3/agent/tools/fillFormVision.js.map +1 -1
  48. package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +7 -2
  49. package/dist/cjs/lib/v3/agent/tools/fillform.js +56 -45
  50. package/dist/cjs/lib/v3/agent/tools/fillform.js.map +1 -1
  51. package/dist/cjs/lib/v3/agent/tools/index.d.ts +19 -3
  52. package/dist/cjs/lib/v3/agent/tools/index.js +63 -11
  53. package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
  54. package/dist/cjs/lib/v3/agent/tools/keys.d.ts +1 -1
  55. package/dist/cjs/lib/v3/agent/tools/keys.js.map +1 -1
  56. package/dist/cjs/lib/v3/agent/tools/screenshot.d.ts +8 -0
  57. package/dist/cjs/lib/v3/agent/tools/screenshot.js +32 -15
  58. package/dist/cjs/lib/v3/agent/tools/screenshot.js.map +1 -1
  59. package/dist/cjs/lib/v3/agent/tools/scroll.js +12 -0
  60. package/dist/cjs/lib/v3/agent/tools/scroll.js.map +1 -1
  61. package/dist/cjs/lib/v3/agent/tools/type.js +23 -31
  62. package/dist/cjs/lib/v3/agent/tools/type.js.map +1 -1
  63. package/dist/cjs/lib/v3/agent/tools/wait.js +6 -0
  64. package/dist/cjs/lib/v3/agent/tools/wait.js.map +1 -1
  65. package/dist/cjs/lib/v3/agent/utils/captchaSolver.d.ts +76 -0
  66. package/dist/cjs/lib/v3/agent/utils/captchaSolver.js +175 -0
  67. package/dist/cjs/lib/v3/agent/utils/captchaSolver.js.map +1 -0
  68. package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js +4 -0
  69. package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
  70. package/dist/cjs/lib/v3/agent/utils/variables.d.ts +5 -0
  71. package/dist/cjs/lib/v3/agent/utils/variables.js +9 -0
  72. package/dist/cjs/lib/v3/agent/utils/variables.js.map +1 -1
  73. package/dist/cjs/lib/v3/api.d.ts +2 -2
  74. package/dist/cjs/lib/v3/api.js +1 -1
  75. package/dist/cjs/lib/v3/api.js.map +1 -1
  76. package/dist/cjs/lib/v3/cache/ActCache.d.ts +0 -1
  77. package/dist/cjs/lib/v3/cache/ActCache.js +2 -18
  78. package/dist/cjs/lib/v3/cache/ActCache.js.map +1 -1
  79. package/dist/cjs/lib/v3/flowlogger/EventEmitter.d.ts +7 -0
  80. package/dist/cjs/lib/v3/flowlogger/EventEmitter.js +30 -0
  81. package/dist/cjs/lib/v3/flowlogger/EventEmitter.js.map +1 -0
  82. package/dist/cjs/lib/v3/flowlogger/EventSink.d.ts +44 -0
  83. package/dist/cjs/lib/v3/flowlogger/EventSink.js +217 -0
  84. package/dist/cjs/lib/v3/flowlogger/EventSink.js.map +1 -0
  85. package/dist/cjs/lib/v3/flowlogger/EventStore.d.ts +26 -0
  86. package/dist/cjs/lib/v3/flowlogger/EventStore.js +135 -0
  87. package/dist/cjs/lib/v3/flowlogger/EventStore.js.map +1 -0
  88. package/dist/cjs/lib/v3/flowlogger/FlowLogger.d.ts +99 -0
  89. package/dist/cjs/lib/v3/flowlogger/FlowLogger.js +591 -0
  90. package/dist/cjs/lib/v3/flowlogger/FlowLogger.js.map +1 -0
  91. package/dist/cjs/lib/v3/flowlogger/prettify.d.ts +6 -0
  92. package/dist/cjs/lib/v3/flowlogger/prettify.js +395 -0
  93. package/dist/cjs/lib/v3/flowlogger/prettify.js.map +1 -0
  94. package/dist/cjs/lib/v3/handlers/actHandler.js +1 -2
  95. package/dist/cjs/lib/v3/handlers/actHandler.js.map +1 -1
  96. package/dist/cjs/lib/v3/handlers/extractHandler.js +2 -2
  97. package/dist/cjs/lib/v3/handlers/extractHandler.js.map +1 -1
  98. package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js +43 -57
  99. package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
  100. package/dist/cjs/lib/v3/handlers/observeHandler.js +3 -3
  101. package/dist/cjs/lib/v3/handlers/observeHandler.js.map +1 -1
  102. package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +2 -5
  103. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +130 -91
  104. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  105. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.d.ts +5 -0
  106. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +134 -14
  107. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  108. package/dist/cjs/lib/v3/index.d.ts +2 -1
  109. package/dist/cjs/lib/v3/launch/browserbase.d.ts +1 -1
  110. package/dist/cjs/lib/v3/launch/browserbase.js +4 -9
  111. package/dist/cjs/lib/v3/launch/browserbase.js.map +1 -1
  112. package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +5 -2
  113. package/dist/cjs/lib/v3/llm/LLMProvider.js +14 -11
  114. package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
  115. package/dist/cjs/lib/v3/llm/aisdk.d.ts +3 -1
  116. package/dist/cjs/lib/v3/llm/aisdk.js +24 -28
  117. package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
  118. package/dist/cjs/lib/v3/runtimePaths.js +2 -1
  119. package/dist/cjs/lib/v3/runtimePaths.js.map +1 -1
  120. package/dist/cjs/lib/v3/shutdown/supervisor.js +2 -2
  121. package/dist/cjs/lib/v3/shutdown/supervisor.js.map +1 -1
  122. package/dist/cjs/lib/v3/timeoutConfig.d.ts +1 -1
  123. package/dist/cjs/lib/v3/timeoutConfig.js +5 -0
  124. package/dist/cjs/lib/v3/timeoutConfig.js.map +1 -1
  125. package/dist/cjs/lib/v3/types/private/cache.d.ts +0 -1
  126. package/dist/cjs/lib/v3/types/private/cache.js.map +1 -1
  127. package/dist/cjs/lib/v3/types/private/handlers.d.ts +1 -0
  128. package/dist/cjs/lib/v3/types/private/handlers.js.map +1 -1
  129. package/dist/cjs/lib/v3/types/private/shutdown.d.ts +1 -1
  130. package/dist/cjs/lib/v3/types/private/shutdown.js.map +1 -1
  131. package/dist/cjs/lib/v3/types/public/agent.d.ts +28 -3
  132. package/dist/cjs/lib/v3/types/public/agent.js +0 -1
  133. package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
  134. package/dist/cjs/lib/v3/types/public/api.d.ts +27 -7
  135. package/dist/cjs/lib/v3/types/public/api.js +42 -14
  136. package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
  137. package/dist/cjs/lib/v3/types/public/methods.d.ts +1 -0
  138. package/dist/cjs/lib/v3/types/public/methods.js.map +1 -1
  139. package/dist/cjs/lib/v3/types/public/model.d.ts +14 -3
  140. package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
  141. package/dist/cjs/lib/v3/types/public/options.d.ts +8 -0
  142. package/dist/cjs/lib/v3/types/public/options.js.map +1 -1
  143. package/dist/cjs/lib/v3/types/public/variables.d.ts +7 -0
  144. package/dist/cjs/lib/v3/types/public/variables.js +22 -0
  145. package/dist/cjs/lib/v3/types/public/variables.js.map +1 -0
  146. package/dist/cjs/lib/v3/understudy/cdp.d.ts +8 -13
  147. package/dist/cjs/lib/v3/understudy/cdp.js +180 -20
  148. package/dist/cjs/lib/v3/understudy/cdp.js.map +1 -1
  149. package/dist/cjs/lib/v3/understudy/context.d.ts +1 -0
  150. package/dist/cjs/lib/v3/understudy/context.js +148 -62
  151. package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
  152. package/dist/cjs/lib/v3/understudy/frame.js +23 -6
  153. package/dist/cjs/lib/v3/understudy/frame.js.map +1 -1
  154. package/dist/cjs/lib/v3/understudy/page.d.ts +13 -0
  155. package/dist/cjs/lib/v3/understudy/page.js +85 -22
  156. package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
  157. package/dist/cjs/lib/v3/understudy/screenshotUtils.d.ts +0 -1
  158. package/dist/cjs/lib/v3/understudy/screenshotUtils.js +0 -18
  159. package/dist/cjs/lib/v3/understudy/screenshotUtils.js.map +1 -1
  160. package/dist/cjs/lib/v3/v3.d.ts +26 -3
  161. package/dist/cjs/lib/v3/v3.js +250 -180
  162. package/dist/cjs/lib/v3/v3.js.map +1 -1
  163. package/dist/cjs/tests/integration/agent-captcha-autosolve.spec.js +56 -0
  164. package/dist/cjs/tests/integration/agent-captcha-autosolve.spec.js.map +1 -0
  165. package/dist/cjs/tests/integration/agent-hybrid-mode.spec.js +6 -6
  166. package/dist/cjs/tests/integration/agent-hybrid-mode.spec.js.map +1 -1
  167. package/dist/cjs/tests/integration/cdp-session-detached.spec.js +1 -1
  168. package/dist/cjs/tests/integration/cdp-session-detached.spec.js.map +1 -1
  169. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js +56 -0
  170. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
  171. package/dist/cjs/tests/integration/context-addInitScript.spec.js +104 -11
  172. package/dist/cjs/tests/integration/context-addInitScript.spec.js.map +1 -1
  173. package/dist/cjs/tests/integration/flowLogger.spec.d.ts +1 -0
  174. package/dist/cjs/tests/integration/flowLogger.spec.js +714 -0
  175. package/dist/cjs/tests/integration/flowLogger.spec.js.map +1 -0
  176. package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.d.ts +1 -0
  177. package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.js +219 -0
  178. package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.js.map +1 -0
  179. package/dist/cjs/tests/integration/page-extra-http-headers.spec.d.ts +1 -0
  180. package/dist/cjs/tests/integration/page-extra-http-headers.spec.js +85 -0
  181. package/dist/cjs/tests/integration/page-extra-http-headers.spec.js.map +1 -0
  182. package/dist/cjs/tests/integration/page-screenshot.spec.js +1 -1
  183. package/dist/cjs/tests/integration/page-screenshot.spec.js.map +1 -1
  184. package/dist/cjs/tests/integration/testUtils.d.ts +33 -0
  185. package/dist/cjs/tests/integration/testUtils.js +144 -0
  186. package/dist/cjs/tests/integration/testUtils.js.map +1 -1
  187. package/dist/cjs/tests/integration/timeouts.spec.js +278 -0
  188. package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
  189. package/dist/cjs/tests/unit/agent-captcha-hooks.test.d.ts +1 -0
  190. package/dist/cjs/tests/unit/agent-captcha-hooks.test.js +285 -0
  191. package/dist/cjs/tests/unit/agent-captcha-hooks.test.js.map +1 -0
  192. package/dist/cjs/tests/unit/agent-execution-model.test.js +25 -3
  193. package/dist/cjs/tests/unit/agent-execution-model.test.js.map +1 -1
  194. package/dist/cjs/tests/unit/agent-system-prompt-variables.test.d.ts +1 -0
  195. package/dist/cjs/tests/unit/agent-system-prompt-variables.test.js +23 -0
  196. package/dist/cjs/tests/unit/agent-system-prompt-variables.test.js.map +1 -0
  197. package/dist/cjs/tests/unit/aisdk-reasoning-effort.test.d.ts +1 -0
  198. package/dist/cjs/tests/unit/aisdk-reasoning-effort.test.js +153 -0
  199. package/dist/cjs/tests/unit/aisdk-reasoning-effort.test.js.map +1 -0
  200. package/dist/cjs/tests/unit/api-client-observe-variables.test.d.ts +1 -0
  201. package/dist/cjs/tests/unit/api-client-observe-variables.test.js +86 -0
  202. package/dist/cjs/tests/unit/api-client-observe-variables.test.js.map +1 -0
  203. package/dist/cjs/tests/unit/api-variables-schema.test.d.ts +1 -0
  204. package/dist/cjs/tests/unit/api-variables-schema.test.js +37 -0
  205. package/dist/cjs/tests/unit/api-variables-schema.test.js.map +1 -0
  206. package/dist/cjs/tests/unit/browserbase-session-accessors.test.js +20 -0
  207. package/dist/cjs/tests/unit/browserbase-session-accessors.test.js.map +1 -1
  208. package/dist/cjs/tests/unit/captcha-solver.test.d.ts +1 -0
  209. package/dist/cjs/tests/unit/captcha-solver.test.js +154 -0
  210. package/dist/cjs/tests/unit/captcha-solver.test.js.map +1 -0
  211. package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.d.ts +1 -0
  212. package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.js +95 -0
  213. package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.js.map +1 -0
  214. package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.d.ts +1 -0
  215. package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.js +43 -0
  216. package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.js.map +1 -0
  217. package/dist/cjs/tests/unit/flowlogger-eventstore.test.d.ts +1 -0
  218. package/dist/cjs/tests/unit/flowlogger-eventstore.test.js +250 -0
  219. package/dist/cjs/tests/unit/flowlogger-eventstore.test.js.map +1 -0
  220. package/dist/cjs/tests/unit/llm-middleware.test.d.ts +1 -0
  221. package/dist/cjs/tests/unit/llm-middleware.test.js +495 -0
  222. package/dist/cjs/tests/unit/llm-middleware.test.js.map +1 -0
  223. package/dist/cjs/tests/unit/model-deprecation.test.js +5 -8
  224. package/dist/cjs/tests/unit/model-deprecation.test.js.map +1 -1
  225. package/dist/cjs/tests/unit/openai-cua-client.test.d.ts +1 -0
  226. package/dist/cjs/tests/unit/openai-cua-client.test.js +71 -0
  227. package/dist/cjs/tests/unit/openai-cua-client.test.js.map +1 -0
  228. package/dist/cjs/tests/unit/page-extra-http-headers.test.d.ts +1 -0
  229. package/dist/cjs/tests/unit/page-extra-http-headers.test.js +92 -0
  230. package/dist/cjs/tests/unit/page-extra-http-headers.test.js.map +1 -0
  231. package/dist/cjs/tests/unit/prompt-observe-variables.test.d.ts +1 -0
  232. package/dist/cjs/tests/unit/prompt-observe-variables.test.js +19 -0
  233. package/dist/cjs/tests/unit/prompt-observe-variables.test.js.map +1 -0
  234. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js +13 -1
  235. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  236. package/dist/cjs/tests/unit/public-api/public-types.test.js.map +1 -1
  237. package/dist/cjs/tests/unit/timeout-handlers.test.js +50 -0
  238. package/dist/cjs/tests/unit/timeout-handlers.test.js.map +1 -1
  239. package/dist/esm/lib/inference.d.ts +3 -1
  240. package/dist/esm/lib/inference.js +4 -7
  241. package/dist/esm/lib/inference.js.map +1 -1
  242. package/dist/esm/lib/prompt.d.ts +1 -1
  243. package/dist/esm/lib/prompt.js +24 -18
  244. package/dist/esm/lib/prompt.js.map +1 -1
  245. package/dist/esm/lib/utils.d.ts +1 -0
  246. package/dist/esm/lib/utils.js +3 -0
  247. package/dist/esm/lib/utils.js.map +1 -1
  248. package/dist/esm/lib/v3/agent/AgentClient.d.ts +8 -0
  249. package/dist/esm/lib/v3/agent/AgentClient.js +13 -0
  250. package/dist/esm/lib/v3/agent/AgentClient.js.map +1 -1
  251. package/dist/esm/lib/v3/agent/AgentProvider.js +0 -1
  252. package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
  253. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +6 -7
  254. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  255. package/dist/esm/lib/v3/agent/GoogleCUAClient.js +6 -7
  256. package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -1
  257. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js +1 -0
  258. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
  259. package/dist/esm/lib/v3/agent/OpenAICUAClient.d.ts +10 -6
  260. package/dist/esm/lib/v3/agent/OpenAICUAClient.js +107 -18
  261. package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  262. package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.d.ts +4 -2
  263. package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js +11 -12
  264. package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
  265. package/dist/esm/lib/v3/agent/tools/act.d.ts +1 -1
  266. package/dist/esm/lib/v3/agent/tools/act.js +11 -4
  267. package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
  268. package/dist/esm/lib/v3/agent/tools/ariaTree.d.ts +8 -1
  269. package/dist/esm/lib/v3/agent/tools/ariaTree.js +49 -22
  270. package/dist/esm/lib/v3/agent/tools/ariaTree.js.map +1 -1
  271. package/dist/esm/lib/v3/agent/tools/{search.js → braveSearch.js} +1 -1
  272. package/dist/esm/lib/v3/agent/tools/braveSearch.js.map +1 -0
  273. package/dist/esm/lib/v3/agent/tools/browserbaseSearch.d.ts +13 -0
  274. package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js +66 -0
  275. package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js.map +1 -0
  276. package/dist/esm/lib/v3/agent/tools/click.js +23 -31
  277. package/dist/esm/lib/v3/agent/tools/click.js.map +1 -1
  278. package/dist/esm/lib/v3/agent/tools/clickAndHold.js.map +1 -1
  279. package/dist/esm/lib/v3/agent/tools/dragAndDrop.js +22 -30
  280. package/dist/esm/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
  281. package/dist/esm/lib/v3/agent/tools/extract.d.ts +2 -2
  282. package/dist/esm/lib/v3/agent/tools/extract.js +7 -3
  283. package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
  284. package/dist/esm/lib/v3/agent/tools/fillFormVision.js +30 -30
  285. package/dist/esm/lib/v3/agent/tools/fillFormVision.js.map +1 -1
  286. package/dist/esm/lib/v3/agent/tools/fillform.d.ts +7 -2
  287. package/dist/esm/lib/v3/agent/tools/fillform.js +56 -45
  288. package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
  289. package/dist/esm/lib/v3/agent/tools/index.d.ts +19 -3
  290. package/dist/esm/lib/v3/agent/tools/index.js +63 -11
  291. package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
  292. package/dist/esm/lib/v3/agent/tools/keys.d.ts +1 -1
  293. package/dist/esm/lib/v3/agent/tools/keys.js.map +1 -1
  294. package/dist/esm/lib/v3/agent/tools/screenshot.d.ts +8 -0
  295. package/dist/esm/lib/v3/agent/tools/screenshot.js +32 -15
  296. package/dist/esm/lib/v3/agent/tools/screenshot.js.map +1 -1
  297. package/dist/esm/lib/v3/agent/tools/scroll.js +12 -0
  298. package/dist/esm/lib/v3/agent/tools/scroll.js.map +1 -1
  299. package/dist/esm/lib/v3/agent/tools/type.js +23 -31
  300. package/dist/esm/lib/v3/agent/tools/type.js.map +1 -1
  301. package/dist/esm/lib/v3/agent/tools/wait.js +6 -0
  302. package/dist/esm/lib/v3/agent/tools/wait.js.map +1 -1
  303. package/dist/esm/lib/v3/agent/utils/captchaSolver.d.ts +76 -0
  304. package/dist/esm/lib/v3/agent/utils/captchaSolver.js +171 -0
  305. package/dist/esm/lib/v3/agent/utils/captchaSolver.js.map +1 -0
  306. package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js +4 -0
  307. package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
  308. package/dist/esm/lib/v3/agent/utils/variables.d.ts +5 -0
  309. package/dist/esm/lib/v3/agent/utils/variables.js +8 -0
  310. package/dist/esm/lib/v3/agent/utils/variables.js.map +1 -1
  311. package/dist/esm/lib/v3/api.d.ts +2 -2
  312. package/dist/esm/lib/v3/api.js +1 -1
  313. package/dist/esm/lib/v3/api.js.map +1 -1
  314. package/dist/esm/lib/v3/cache/ActCache.d.ts +0 -1
  315. package/dist/esm/lib/v3/cache/ActCache.js +2 -18
  316. package/dist/esm/lib/v3/cache/ActCache.js.map +1 -1
  317. package/dist/esm/lib/v3/flowlogger/EventEmitter.d.ts +7 -0
  318. package/dist/esm/lib/v3/flowlogger/EventEmitter.js +26 -0
  319. package/dist/esm/lib/v3/flowlogger/EventEmitter.js.map +1 -0
  320. package/dist/esm/lib/v3/flowlogger/EventSink.d.ts +44 -0
  321. package/dist/esm/lib/v3/flowlogger/EventSink.js +206 -0
  322. package/dist/esm/lib/v3/flowlogger/EventSink.js.map +1 -0
  323. package/dist/esm/lib/v3/flowlogger/EventStore.d.ts +26 -0
  324. package/dist/esm/lib/v3/flowlogger/EventStore.js +127 -0
  325. package/dist/esm/lib/v3/flowlogger/EventStore.js.map +1 -0
  326. package/dist/esm/lib/v3/flowlogger/FlowLogger.d.ts +99 -0
  327. package/dist/esm/lib/v3/flowlogger/FlowLogger.js +583 -0
  328. package/dist/esm/lib/v3/flowlogger/FlowLogger.js.map +1 -0
  329. package/dist/esm/lib/v3/flowlogger/prettify.d.ts +6 -0
  330. package/dist/esm/lib/v3/flowlogger/prettify.js +389 -0
  331. package/dist/esm/lib/v3/flowlogger/prettify.js.map +1 -0
  332. package/dist/esm/lib/v3/handlers/actHandler.js +1 -2
  333. package/dist/esm/lib/v3/handlers/actHandler.js.map +1 -1
  334. package/dist/esm/lib/v3/handlers/extractHandler.js +2 -2
  335. package/dist/esm/lib/v3/handlers/extractHandler.js.map +1 -1
  336. package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +43 -57
  337. package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
  338. package/dist/esm/lib/v3/handlers/observeHandler.js +3 -3
  339. package/dist/esm/lib/v3/handlers/observeHandler.js.map +1 -1
  340. package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +2 -5
  341. package/dist/esm/lib/v3/handlers/v3AgentHandler.js +131 -92
  342. package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  343. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.d.ts +5 -0
  344. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +134 -14
  345. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  346. package/dist/esm/lib/v3/index.d.ts +2 -1
  347. package/dist/esm/lib/v3/launch/browserbase.d.ts +1 -1
  348. package/dist/esm/lib/v3/launch/browserbase.js +4 -9
  349. package/dist/esm/lib/v3/launch/browserbase.js.map +1 -1
  350. package/dist/esm/lib/v3/llm/LLMProvider.d.ts +5 -2
  351. package/dist/esm/lib/v3/llm/LLMProvider.js +15 -12
  352. package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
  353. package/dist/esm/lib/v3/llm/aisdk.d.ts +3 -1
  354. package/dist/esm/lib/v3/llm/aisdk.js +24 -28
  355. package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
  356. package/dist/esm/lib/v3/runtimePaths.js +2 -1
  357. package/dist/esm/lib/v3/runtimePaths.js.map +1 -1
  358. package/dist/esm/lib/v3/shutdown/supervisor.js +2 -2
  359. package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
  360. package/dist/esm/lib/v3/timeoutConfig.d.ts +1 -1
  361. package/dist/esm/lib/v3/timeoutConfig.js +5 -0
  362. package/dist/esm/lib/v3/timeoutConfig.js.map +1 -1
  363. package/dist/esm/lib/v3/types/private/cache.d.ts +0 -1
  364. package/dist/esm/lib/v3/types/private/cache.js.map +1 -1
  365. package/dist/esm/lib/v3/types/private/handlers.d.ts +1 -0
  366. package/dist/esm/lib/v3/types/private/handlers.js.map +1 -1
  367. package/dist/esm/lib/v3/types/private/shutdown.d.ts +1 -1
  368. package/dist/esm/lib/v3/types/private/shutdown.js.map +1 -1
  369. package/dist/esm/lib/v3/types/public/agent.d.ts +28 -3
  370. package/dist/esm/lib/v3/types/public/agent.js +0 -1
  371. package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
  372. package/dist/esm/lib/v3/types/public/api.d.ts +27 -7
  373. package/dist/esm/lib/v3/types/public/api.js +37 -12
  374. package/dist/esm/lib/v3/types/public/api.js.map +1 -1
  375. package/dist/esm/lib/v3/types/public/methods.d.ts +1 -0
  376. package/dist/esm/lib/v3/types/public/methods.js.map +1 -1
  377. package/dist/esm/lib/v3/types/public/model.d.ts +14 -3
  378. package/dist/esm/lib/v3/types/public/model.js.map +1 -1
  379. package/dist/esm/lib/v3/types/public/options.d.ts +8 -0
  380. package/dist/esm/lib/v3/types/public/options.js.map +1 -1
  381. package/dist/esm/lib/v3/types/public/variables.d.ts +7 -0
  382. package/dist/esm/lib/v3/types/public/variables.js +19 -0
  383. package/dist/esm/lib/v3/types/public/variables.js.map +1 -0
  384. package/dist/esm/lib/v3/understudy/cdp.d.ts +8 -13
  385. package/dist/esm/lib/v3/understudy/cdp.js +181 -21
  386. package/dist/esm/lib/v3/understudy/cdp.js.map +1 -1
  387. package/dist/esm/lib/v3/understudy/context.d.ts +1 -0
  388. package/dist/esm/lib/v3/understudy/context.js +148 -62
  389. package/dist/esm/lib/v3/understudy/context.js.map +1 -1
  390. package/dist/esm/lib/v3/understudy/frame.js +23 -6
  391. package/dist/esm/lib/v3/understudy/frame.js.map +1 -1
  392. package/dist/esm/lib/v3/understudy/page.d.ts +13 -0
  393. package/dist/esm/lib/v3/understudy/page.js +87 -24
  394. package/dist/esm/lib/v3/understudy/page.js.map +1 -1
  395. package/dist/esm/lib/v3/understudy/screenshotUtils.d.ts +0 -1
  396. package/dist/esm/lib/v3/understudy/screenshotUtils.js +0 -17
  397. package/dist/esm/lib/v3/understudy/screenshotUtils.js.map +1 -1
  398. package/dist/esm/lib/v3/v3.d.ts +26 -3
  399. package/dist/esm/lib/v3/v3.js +250 -181
  400. package/dist/esm/lib/v3/v3.js.map +1 -1
  401. package/dist/esm/tests/integration/agent-captcha-autosolve.spec.d.ts +1 -0
  402. package/dist/esm/tests/integration/agent-captcha-autosolve.spec.js +54 -0
  403. package/dist/esm/tests/integration/agent-captcha-autosolve.spec.js.map +1 -0
  404. package/dist/esm/tests/integration/agent-hybrid-mode.spec.js +6 -6
  405. package/dist/esm/tests/integration/agent-hybrid-mode.spec.js.map +1 -1
  406. package/dist/esm/tests/integration/cdp-session-detached.spec.js +1 -1
  407. package/dist/esm/tests/integration/cdp-session-detached.spec.js.map +1 -1
  408. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
  409. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js +54 -0
  410. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
  411. package/dist/esm/tests/integration/context-addInitScript.spec.js +104 -11
  412. package/dist/esm/tests/integration/context-addInitScript.spec.js.map +1 -1
  413. package/dist/esm/tests/integration/flowLogger.spec.d.ts +1 -0
  414. package/dist/esm/tests/integration/flowLogger.spec.js +712 -0
  415. package/dist/esm/tests/integration/flowLogger.spec.js.map +1 -0
  416. package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.d.ts +1 -0
  417. package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.js +217 -0
  418. package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.js.map +1 -0
  419. package/dist/esm/tests/integration/page-extra-http-headers.spec.d.ts +1 -0
  420. package/dist/esm/tests/integration/page-extra-http-headers.spec.js +83 -0
  421. package/dist/esm/tests/integration/page-extra-http-headers.spec.js.map +1 -0
  422. package/dist/esm/tests/integration/page-screenshot.spec.js +1 -1
  423. package/dist/esm/tests/integration/page-screenshot.spec.js.map +1 -1
  424. package/dist/esm/tests/integration/testUtils.d.ts +33 -0
  425. package/dist/esm/tests/integration/testUtils.js +138 -0
  426. package/dist/esm/tests/integration/testUtils.js.map +1 -1
  427. package/dist/esm/tests/integration/timeouts.spec.js +278 -0
  428. package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
  429. package/dist/esm/tests/unit/agent-captcha-hooks.test.d.ts +1 -0
  430. package/dist/esm/tests/unit/agent-captcha-hooks.test.js +283 -0
  431. package/dist/esm/tests/unit/agent-captcha-hooks.test.js.map +1 -0
  432. package/dist/esm/tests/unit/agent-execution-model.test.js +25 -3
  433. package/dist/esm/tests/unit/agent-execution-model.test.js.map +1 -1
  434. package/dist/esm/tests/unit/agent-system-prompt-variables.test.d.ts +1 -0
  435. package/dist/esm/tests/unit/agent-system-prompt-variables.test.js +21 -0
  436. package/dist/esm/tests/unit/agent-system-prompt-variables.test.js.map +1 -0
  437. package/dist/esm/tests/unit/aisdk-reasoning-effort.test.d.ts +1 -0
  438. package/dist/esm/tests/unit/aisdk-reasoning-effort.test.js +118 -0
  439. package/dist/esm/tests/unit/aisdk-reasoning-effort.test.js.map +1 -0
  440. package/dist/esm/tests/unit/api-client-observe-variables.test.d.ts +1 -0
  441. package/dist/esm/tests/unit/api-client-observe-variables.test.js +84 -0
  442. package/dist/esm/tests/unit/api-client-observe-variables.test.js.map +1 -0
  443. package/dist/esm/tests/unit/api-variables-schema.test.d.ts +1 -0
  444. package/dist/esm/tests/unit/api-variables-schema.test.js +35 -0
  445. package/dist/esm/tests/unit/api-variables-schema.test.js.map +1 -0
  446. package/dist/esm/tests/unit/browserbase-session-accessors.test.js +20 -0
  447. package/dist/esm/tests/unit/browserbase-session-accessors.test.js.map +1 -1
  448. package/dist/esm/tests/unit/captcha-solver.test.d.ts +1 -0
  449. package/dist/esm/tests/unit/captcha-solver.test.js +152 -0
  450. package/dist/esm/tests/unit/captcha-solver.test.js.map +1 -0
  451. package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.d.ts +1 -0
  452. package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.js +93 -0
  453. package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.js.map +1 -0
  454. package/dist/esm/tests/unit/flowlogger-capturing-llm.test.d.ts +1 -0
  455. package/dist/esm/tests/unit/flowlogger-capturing-llm.test.js +41 -0
  456. package/dist/esm/tests/unit/flowlogger-capturing-llm.test.js.map +1 -0
  457. package/dist/esm/tests/unit/flowlogger-eventstore.test.d.ts +1 -0
  458. package/dist/esm/tests/unit/flowlogger-eventstore.test.js +248 -0
  459. package/dist/esm/tests/unit/flowlogger-eventstore.test.js.map +1 -0
  460. package/dist/esm/tests/unit/llm-middleware.test.d.ts +1 -0
  461. package/dist/esm/tests/unit/llm-middleware.test.js +460 -0
  462. package/dist/esm/tests/unit/llm-middleware.test.js.map +1 -0
  463. package/dist/esm/tests/unit/model-deprecation.test.js +5 -8
  464. package/dist/esm/tests/unit/model-deprecation.test.js.map +1 -1
  465. package/dist/esm/tests/unit/openai-cua-client.test.d.ts +1 -0
  466. package/dist/esm/tests/unit/openai-cua-client.test.js +69 -0
  467. package/dist/esm/tests/unit/openai-cua-client.test.js.map +1 -0
  468. package/dist/esm/tests/unit/page-extra-http-headers.test.d.ts +1 -0
  469. package/dist/esm/tests/unit/page-extra-http-headers.test.js +90 -0
  470. package/dist/esm/tests/unit/page-extra-http-headers.test.js.map +1 -0
  471. package/dist/esm/tests/unit/prompt-observe-variables.test.d.ts +1 -0
  472. package/dist/esm/tests/unit/prompt-observe-variables.test.js +17 -0
  473. package/dist/esm/tests/unit/prompt-observe-variables.test.js.map +1 -0
  474. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js +13 -1
  475. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  476. package/dist/esm/tests/unit/public-api/public-types.test.js.map +1 -1
  477. package/dist/esm/tests/unit/timeout-handlers.test.js +50 -0
  478. package/dist/esm/tests/unit/timeout-handlers.test.js.map +1 -1
  479. package/package.json +6 -4
  480. package/dist/cjs/lib/v3/agent/tools/search.js.map +0 -1
  481. package/dist/cjs/lib/v3/flowLogger.d.ts +0 -139
  482. package/dist/cjs/lib/v3/flowLogger.js +0 -881
  483. package/dist/cjs/lib/v3/flowLogger.js.map +0 -1
  484. package/dist/cjs/tests/unit/rerender-missing-shadows.test.js +0 -209
  485. package/dist/cjs/tests/unit/rerender-missing-shadows.test.js.map +0 -1
  486. package/dist/esm/lib/v3/agent/tools/search.js.map +0 -1
  487. package/dist/esm/lib/v3/flowLogger.d.ts +0 -139
  488. package/dist/esm/lib/v3/flowLogger.js +0 -868
  489. package/dist/esm/lib/v3/flowLogger.js.map +0 -1
  490. package/dist/esm/tests/unit/rerender-missing-shadows.test.js +0 -207
  491. package/dist/esm/tests/unit/rerender-missing-shadows.test.js.map +0 -1
  492. /package/dist/cjs/lib/v3/agent/tools/{search.d.ts → braveSearch.d.ts} +0 -0
  493. /package/dist/cjs/tests/{unit/rerender-missing-shadows.test.d.ts → integration/agent-captcha-autosolve.spec.d.ts} +0 -0
  494. /package/dist/{esm/tests/unit/rerender-missing-shadows.test.d.ts → cjs/tests/integration/chrome-newtab-page-tracking.spec.d.ts} +0 -0
  495. /package/dist/esm/lib/v3/agent/tools/{search.d.ts → braveSearch.d.ts} +0 -0
@@ -0,0 +1,495 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const vitest_1 = require("vitest");
37
+ const LLMProvider_js_1 = require("../../lib/v3/llm/LLMProvider.js");
38
+ const v3_js_1 = require("../../lib/v3/v3.js");
39
+ /**
40
+ * Creates a recording middleware that captures every doGenerate / doStream
41
+ * invocation along with the model identity and returned usage data.
42
+ */
43
+ function createRecordingMiddleware() {
44
+ const calls = [];
45
+ const middleware = {
46
+ wrapGenerate: async ({ doGenerate, model }) => {
47
+ const result = await doGenerate();
48
+ calls.push({
49
+ type: "generate",
50
+ modelId: model.modelId,
51
+ provider: model.provider,
52
+ usage: {
53
+ inputTokens: result.usage.inputTokens ?? undefined,
54
+ outputTokens: result.usage.outputTokens ?? undefined,
55
+ },
56
+ });
57
+ return result;
58
+ },
59
+ wrapStream: async ({ doStream, model }) => {
60
+ const result = await doStream();
61
+ calls.push({
62
+ type: "stream",
63
+ modelId: model.modelId,
64
+ provider: model.provider,
65
+ });
66
+ return result;
67
+ },
68
+ };
69
+ return { middleware, calls };
70
+ }
71
+ /**
72
+ * Creates a minimal mock LanguageModelV2 that returns canned results
73
+ * without hitting any real provider. Useful for testing the wrapping
74
+ * mechanics in isolation.
75
+ */
76
+ function createMockLanguageModel(modelId, provider) {
77
+ return {
78
+ specificationVersion: "v2",
79
+ provider,
80
+ modelId,
81
+ defaultObjectGenerationMode: "json",
82
+ doGenerate: vitest_1.vi.fn().mockResolvedValue({
83
+ content: [{ type: "text", text: "mock response" }],
84
+ finishReason: "stop",
85
+ usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 },
86
+ warnings: [],
87
+ }),
88
+ doStream: vitest_1.vi.fn().mockResolvedValue({
89
+ stream: new ReadableStream({
90
+ start(controller) {
91
+ controller.enqueue({
92
+ type: "finish",
93
+ finishReason: "stop",
94
+ usage: { inputTokens: 8, outputTokens: 3, totalTokens: 11 },
95
+ });
96
+ controller.close();
97
+ },
98
+ }),
99
+ }),
100
+ };
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // getAISDKLanguageModel with middleware
104
+ // ---------------------------------------------------------------------------
105
+ (0, vitest_1.describe)("getAISDKLanguageModel with middleware", () => {
106
+ (0, vitest_1.it)("returns a model when no middleware is provided", () => {
107
+ const model = (0, LLMProvider_js_1.getAISDKLanguageModel)("ollama", "llama3.2");
108
+ (0, vitest_1.expect)(model).toBeDefined();
109
+ (0, vitest_1.expect)(model.modelId).toBe("llama3.2");
110
+ });
111
+ (0, vitest_1.it)("returns a wrapped model when middleware is provided", () => {
112
+ const { middleware } = createRecordingMiddleware();
113
+ const model = (0, LLMProvider_js_1.getAISDKLanguageModel)("ollama", "llama3.2", undefined, middleware);
114
+ (0, vitest_1.expect)(model).toBeDefined();
115
+ // wrapLanguageModel preserves modelId
116
+ (0, vitest_1.expect)(model.modelId).toBe("llama3.2");
117
+ });
118
+ (0, vitest_1.it)("wrapped model preserves doGenerate and doStream methods", () => {
119
+ const { middleware } = createRecordingMiddleware();
120
+ const model = (0, LLMProvider_js_1.getAISDKLanguageModel)("ollama", "llama3.2", undefined, middleware);
121
+ (0, vitest_1.expect)(typeof model.doGenerate).toBe("function");
122
+ (0, vitest_1.expect)(typeof model.doStream).toBe("function");
123
+ (0, vitest_1.expect)(model.provider).toContain("ollama");
124
+ });
125
+ });
126
+ // ---------------------------------------------------------------------------
127
+ // LLMProvider with middleware
128
+ // ---------------------------------------------------------------------------
129
+ (0, vitest_1.describe)("LLMProvider with middleware", () => {
130
+ const noop = () => { };
131
+ (0, vitest_1.it)("creates an AISdkClient without middleware", () => {
132
+ const provider = new LLMProvider_js_1.LLMProvider(noop);
133
+ const client = provider.getClient("openai/gpt-4o");
134
+ (0, vitest_1.expect)(client).toBeDefined();
135
+ (0, vitest_1.expect)(client.type).toBe("aisdk");
136
+ });
137
+ (0, vitest_1.it)("creates an AISdkClient that carries middleware-wrapped model", () => {
138
+ const { middleware } = createRecordingMiddleware();
139
+ const provider = new LLMProvider_js_1.LLMProvider(noop, middleware);
140
+ const client = provider.getClient("ollama/llama3.2");
141
+ (0, vitest_1.expect)(client).toBeDefined();
142
+ (0, vitest_1.expect)(client.type).toBe("aisdk");
143
+ const languageModel = client.getLanguageModel();
144
+ (0, vitest_1.expect)(languageModel).toBeDefined();
145
+ // Wrapped models should still expose the original modelId
146
+ (0, vitest_1.expect)(languageModel.modelId).toBe("llama3.2");
147
+ });
148
+ (0, vitest_1.it)("applies the same middleware to different models from getClient", () => {
149
+ const { middleware } = createRecordingMiddleware();
150
+ const provider = new LLMProvider_js_1.LLMProvider(noop, middleware);
151
+ const clientA = provider.getClient("ollama/llama3.2");
152
+ const clientB = provider.getClient("ollama/mistral");
153
+ (0, vitest_1.expect)(clientA.getLanguageModel()).toBeDefined();
154
+ (0, vitest_1.expect)(clientB.getLanguageModel()).toBeDefined();
155
+ (0, vitest_1.expect)(clientA.getLanguageModel().modelId).toBe("llama3.2");
156
+ (0, vitest_1.expect)(clientB.getLanguageModel().modelId).toBe("mistral");
157
+ });
158
+ });
159
+ // ---------------------------------------------------------------------------
160
+ // Middleware captures usage across act/extract/observe/agent code paths
161
+ // ---------------------------------------------------------------------------
162
+ (0, vitest_1.describe)("middleware captures usage from doGenerate and doStream", () => {
163
+ (0, vitest_1.it)("wrapGenerate fires and captures usage on doGenerate", async () => {
164
+ const { middleware, calls } = createRecordingMiddleware();
165
+ const mockModel = createMockLanguageModel("gpt-4o", "openai.chat");
166
+ // Simulate what wrapLanguageModel does: import and wrap
167
+ const { wrapLanguageModel } = await Promise.resolve().then(() => __importStar(require("ai")));
168
+ const wrapped = wrapLanguageModel({ model: mockModel, middleware });
169
+ await wrapped.doGenerate({
170
+ prompt: [
171
+ {
172
+ role: "user",
173
+ content: [{ type: "text", text: "act: click button" }],
174
+ },
175
+ ],
176
+ });
177
+ (0, vitest_1.expect)(calls).toHaveLength(1);
178
+ (0, vitest_1.expect)(calls[0].type).toBe("generate");
179
+ (0, vitest_1.expect)(calls[0].modelId).toBe("gpt-4o");
180
+ (0, vitest_1.expect)(calls[0].usage).toEqual({ inputTokens: 10, outputTokens: 5 });
181
+ });
182
+ (0, vitest_1.it)("wrapStream fires on doStream", async () => {
183
+ const { middleware, calls } = createRecordingMiddleware();
184
+ const mockModel = createMockLanguageModel("gpt-4o", "openai.chat");
185
+ const { wrapLanguageModel } = await Promise.resolve().then(() => __importStar(require("ai")));
186
+ const wrapped = wrapLanguageModel({ model: mockModel, middleware });
187
+ const result = await wrapped.doStream({
188
+ prompt: [
189
+ { role: "user", content: [{ type: "text", text: "stream this" }] },
190
+ ],
191
+ });
192
+ // Consume the stream to trigger the finish chunk
193
+ const reader = result.stream.getReader();
194
+ while (true) {
195
+ const { done } = await reader.read();
196
+ if (done)
197
+ break;
198
+ }
199
+ (0, vitest_1.expect)(calls).toHaveLength(1);
200
+ (0, vitest_1.expect)(calls[0].type).toBe("stream");
201
+ (0, vitest_1.expect)(calls[0].modelId).toBe("gpt-4o");
202
+ });
203
+ (0, vitest_1.it)("middleware fires for each separate doGenerate call (simulates act + extract + observe)", async () => {
204
+ const { middleware, calls } = createRecordingMiddleware();
205
+ const mockModel = createMockLanguageModel("gpt-4o", "openai.chat");
206
+ const { wrapLanguageModel } = await Promise.resolve().then(() => __importStar(require("ai")));
207
+ const wrapped = wrapLanguageModel({ model: mockModel, middleware });
208
+ const callOpts = {
209
+ prompt: [
210
+ {
211
+ role: "user",
212
+ content: [{ type: "text", text: "test" }],
213
+ },
214
+ ],
215
+ };
216
+ // Simulate act call
217
+ await wrapped.doGenerate(callOpts);
218
+ // Simulate extract call
219
+ await wrapped.doGenerate(callOpts);
220
+ // Simulate observe call
221
+ await wrapped.doGenerate(callOpts);
222
+ (0, vitest_1.expect)(calls).toHaveLength(3);
223
+ (0, vitest_1.expect)(calls.every((c) => c.type === "generate")).toBe(true);
224
+ (0, vitest_1.expect)(calls.every((c) => c.modelId === "gpt-4o")).toBe(true);
225
+ });
226
+ (0, vitest_1.it)("middleware fires for agent multi-step calls (sequential doGenerate)", async () => {
227
+ const { middleware, calls } = createRecordingMiddleware();
228
+ const mockModel = createMockLanguageModel("openai/gpt-4.1", "gateway.openai");
229
+ const { wrapLanguageModel } = await Promise.resolve().then(() => __importStar(require("ai")));
230
+ const wrapped = wrapLanguageModel({ model: mockModel, middleware });
231
+ const callOpts = {
232
+ prompt: [
233
+ {
234
+ role: "user",
235
+ content: [{ type: "text", text: "agent step" }],
236
+ },
237
+ ],
238
+ };
239
+ // Simulate multiple agent reasoning steps
240
+ await wrapped.doGenerate(callOpts);
241
+ await wrapped.doGenerate(callOpts);
242
+ await wrapped.doGenerate(callOpts);
243
+ await wrapped.doGenerate(callOpts);
244
+ await wrapped.doGenerate(callOpts);
245
+ (0, vitest_1.expect)(calls).toHaveLength(5);
246
+ calls.forEach((c) => {
247
+ (0, vitest_1.expect)(c.usage).toEqual({ inputTokens: 10, outputTokens: 5 });
248
+ });
249
+ });
250
+ });
251
+ // ---------------------------------------------------------------------------
252
+ // ModelConfiguration-level middleware (the user-facing shape)
253
+ // ---------------------------------------------------------------------------
254
+ (0, vitest_1.describe)("middleware inside ModelConfiguration", () => {
255
+ (0, vitest_1.it)("resolveModelConfiguration extracts middleware from object config", () => {
256
+ const { middleware: mw } = createRecordingMiddleware();
257
+ const result = (0, v3_js_1.resolveModelConfiguration)({
258
+ modelName: "openai/gpt-4o",
259
+ apiKey: "sk-test",
260
+ middleware: mw,
261
+ });
262
+ (0, vitest_1.expect)(result.modelName).toBe("openai/gpt-4o");
263
+ (0, vitest_1.expect)(result.middleware).toBe(mw);
264
+ (0, vitest_1.expect)(result.clientOptions).toEqual({ apiKey: "sk-test" });
265
+ (0, vitest_1.expect)(result.clientOptions && "middleware" in result.clientOptions).toBe(false);
266
+ });
267
+ (0, vitest_1.it)("string ModelConfiguration has no middleware", () => {
268
+ const result = (0, v3_js_1.resolveModelConfiguration)("openai/gpt-4o");
269
+ (0, vitest_1.expect)(result.modelName).toBe("openai/gpt-4o");
270
+ (0, vitest_1.expect)(result.middleware).toBeUndefined();
271
+ (0, vitest_1.expect)(result.clientOptions).toBeUndefined();
272
+ });
273
+ (0, vitest_1.it)("middleware is separated from clientOptions when resolving per-method overrides", () => {
274
+ const { middleware: mw } = createRecordingMiddleware();
275
+ const result = (0, v3_js_1.resolveModelConfiguration)({
276
+ modelName: "anthropic/claude-sonnet-4-20250514",
277
+ apiKey: "sk-ant-test",
278
+ middleware: mw,
279
+ });
280
+ (0, vitest_1.expect)(result.modelName).toBe("anthropic/claude-sonnet-4-20250514");
281
+ (0, vitest_1.expect)(result.middleware).toBe(mw);
282
+ (0, vitest_1.expect)(result.clientOptions).toEqual({ apiKey: "sk-ant-test" });
283
+ (0, vitest_1.expect)(result.clientOptions && "middleware" in result.clientOptions).toBe(false);
284
+ });
285
+ });
286
+ // ---------------------------------------------------------------------------
287
+ // Practical middleware behaviors
288
+ // ---------------------------------------------------------------------------
289
+ (0, vitest_1.describe)("middleware that tracks duration", () => {
290
+ (0, vitest_1.it)("measures wall-clock time of doGenerate", async () => {
291
+ const durations = [];
292
+ const timingMiddleware = {
293
+ wrapGenerate: async ({ doGenerate }) => {
294
+ const start = performance.now();
295
+ const result = await doGenerate();
296
+ durations.push(performance.now() - start);
297
+ return result;
298
+ },
299
+ };
300
+ const mockModel = createMockLanguageModel("gpt-4o", "openai.chat");
301
+ const { wrapLanguageModel } = await Promise.resolve().then(() => __importStar(require("ai")));
302
+ const wrapped = wrapLanguageModel({
303
+ model: mockModel,
304
+ middleware: timingMiddleware,
305
+ });
306
+ await wrapped.doGenerate({
307
+ prompt: [{ role: "user", content: [{ type: "text", text: "time me" }] }],
308
+ });
309
+ (0, vitest_1.expect)(durations).toHaveLength(1);
310
+ (0, vitest_1.expect)(durations[0]).toBeGreaterThanOrEqual(0);
311
+ });
312
+ });
313
+ (0, vitest_1.describe)("middleware that aggregates token usage", () => {
314
+ (0, vitest_1.it)("sums tokens across multiple calls like a billing tracker", async () => {
315
+ let totalInput = 0;
316
+ let totalOutput = 0;
317
+ const billingMiddleware = {
318
+ wrapGenerate: async ({ doGenerate }) => {
319
+ const result = await doGenerate();
320
+ totalInput += result.usage.inputTokens ?? 0;
321
+ totalOutput += result.usage.outputTokens ?? 0;
322
+ return result;
323
+ },
324
+ };
325
+ const mockModel = createMockLanguageModel("gpt-4o", "openai.chat");
326
+ const { wrapLanguageModel } = await Promise.resolve().then(() => __importStar(require("ai")));
327
+ const wrapped = wrapLanguageModel({
328
+ model: mockModel,
329
+ middleware: billingMiddleware,
330
+ });
331
+ const callOpts = {
332
+ prompt: [
333
+ {
334
+ role: "user",
335
+ content: [{ type: "text", text: "go" }],
336
+ },
337
+ ],
338
+ };
339
+ // act
340
+ await wrapped.doGenerate(callOpts);
341
+ // extract
342
+ await wrapped.doGenerate(callOpts);
343
+ // observe
344
+ await wrapped.doGenerate(callOpts);
345
+ (0, vitest_1.expect)(totalInput).toBe(30);
346
+ (0, vitest_1.expect)(totalOutput).toBe(15);
347
+ });
348
+ });
349
+ (0, vitest_1.describe)("middleware that logs per-model call counts", () => {
350
+ (0, vitest_1.it)("tracks which models were called and how many times", async () => {
351
+ const modelCallCounts = new Map();
352
+ const countingMiddleware = {
353
+ wrapGenerate: async ({ doGenerate, model }) => {
354
+ const key = `${model.provider}/${model.modelId}`;
355
+ modelCallCounts.set(key, (modelCallCounts.get(key) ?? 0) + 1);
356
+ return doGenerate();
357
+ },
358
+ };
359
+ const modelA = createMockLanguageModel("gpt-4o", "openai.chat");
360
+ const modelB = createMockLanguageModel("claude-sonnet-4-20250514", "anthropic.messages");
361
+ const { wrapLanguageModel } = await Promise.resolve().then(() => __importStar(require("ai")));
362
+ const wrappedA = wrapLanguageModel({
363
+ model: modelA,
364
+ middleware: countingMiddleware,
365
+ });
366
+ const wrappedB = wrapLanguageModel({
367
+ model: modelB,
368
+ middleware: countingMiddleware,
369
+ });
370
+ const callOpts = {
371
+ prompt: [
372
+ {
373
+ role: "user",
374
+ content: [{ type: "text", text: "go" }],
375
+ },
376
+ ],
377
+ };
378
+ await wrappedA.doGenerate(callOpts);
379
+ await wrappedA.doGenerate(callOpts);
380
+ await wrappedB.doGenerate(callOpts);
381
+ (0, vitest_1.expect)(modelCallCounts.get("openai.chat/gpt-4o")).toBe(2);
382
+ (0, vitest_1.expect)(modelCallCounts.get("anthropic.messages/claude-sonnet-4-20250514")).toBe(1);
383
+ (0, vitest_1.expect)(modelCallCounts.size).toBe(2);
384
+ });
385
+ });
386
+ (0, vitest_1.describe)("middleware that detects errors", () => {
387
+ (0, vitest_1.it)("catches and re-throws errors from doGenerate while still recording the failure", async () => {
388
+ const errors = [];
389
+ const errorTrackingMiddleware = {
390
+ wrapGenerate: async ({ doGenerate }) => {
391
+ try {
392
+ return await doGenerate();
393
+ }
394
+ catch (err) {
395
+ errors.push(err);
396
+ throw err;
397
+ }
398
+ },
399
+ };
400
+ const failingModel = {
401
+ specificationVersion: "v2",
402
+ provider: "openai.chat",
403
+ modelId: "gpt-4o",
404
+ defaultObjectGenerationMode: "json",
405
+ doGenerate: vitest_1.vi.fn().mockRejectedValue(new Error("rate limit exceeded")),
406
+ doStream: vitest_1.vi.fn(),
407
+ };
408
+ const { wrapLanguageModel } = await Promise.resolve().then(() => __importStar(require("ai")));
409
+ const wrapped = wrapLanguageModel({
410
+ model: failingModel,
411
+ middleware: errorTrackingMiddleware,
412
+ });
413
+ await (0, vitest_1.expect)(wrapped.doGenerate({
414
+ prompt: [{ role: "user", content: [{ type: "text", text: "fail" }] }],
415
+ })).rejects.toThrow("rate limit exceeded");
416
+ (0, vitest_1.expect)(errors).toHaveLength(1);
417
+ (0, vitest_1.expect)(errors[0].message).toBe("rate limit exceeded");
418
+ });
419
+ });
420
+ (0, vitest_1.describe)("chaining middleware across multiple wrapped models", () => {
421
+ (0, vitest_1.it)("same middleware instance sees calls from different models", async () => {
422
+ const seen = [];
423
+ const spyMiddleware = {
424
+ wrapGenerate: async ({ doGenerate, model }) => {
425
+ seen.push(model.modelId);
426
+ return doGenerate();
427
+ },
428
+ };
429
+ const mockA = createMockLanguageModel("gpt-4o", "openai.chat");
430
+ const mockB = createMockLanguageModel("claude-sonnet-4-20250514", "anthropic.messages");
431
+ const { wrapLanguageModel } = await Promise.resolve().then(() => __importStar(require("ai")));
432
+ const wrappedA = wrapLanguageModel({
433
+ model: mockA,
434
+ middleware: spyMiddleware,
435
+ });
436
+ const wrappedB = wrapLanguageModel({
437
+ model: mockB,
438
+ middleware: spyMiddleware,
439
+ });
440
+ const callOpts = {
441
+ prompt: [
442
+ {
443
+ role: "user",
444
+ content: [{ type: "text", text: "go" }],
445
+ },
446
+ ],
447
+ };
448
+ await wrappedA.doGenerate(callOpts);
449
+ await wrappedB.doGenerate(callOpts);
450
+ await wrappedA.doGenerate(callOpts);
451
+ (0, vitest_1.expect)(seen).toEqual(["gpt-4o", "claude-sonnet-4-20250514", "gpt-4o"]);
452
+ });
453
+ });
454
+ // ---------------------------------------------------------------------------
455
+ // Edge cases
456
+ // ---------------------------------------------------------------------------
457
+ (0, vitest_1.describe)("middleware edge cases", () => {
458
+ (0, vitest_1.it)("middleware that only implements wrapGenerate still works for doStream", async () => {
459
+ const generateCalls = [];
460
+ const partialMiddleware = {
461
+ wrapGenerate: async ({ doGenerate, model }) => {
462
+ generateCalls.push(model.modelId);
463
+ return doGenerate();
464
+ },
465
+ };
466
+ const mockModel = createMockLanguageModel("gpt-4o", "openai.chat");
467
+ const { wrapLanguageModel } = await Promise.resolve().then(() => __importStar(require("ai")));
468
+ const wrapped = wrapLanguageModel({
469
+ model: mockModel,
470
+ middleware: partialMiddleware,
471
+ });
472
+ const result = await wrapped.doStream({
473
+ prompt: [{ role: "user", content: [{ type: "text", text: "stream" }] }],
474
+ });
475
+ (0, vitest_1.expect)(result.stream).toBeDefined();
476
+ (0, vitest_1.expect)(generateCalls).toHaveLength(0);
477
+ });
478
+ (0, vitest_1.it)("middleware does not alter the response data", async () => {
479
+ const { middleware } = createRecordingMiddleware();
480
+ const mockModel = createMockLanguageModel("gpt-4o", "openai.chat");
481
+ const { wrapLanguageModel } = await Promise.resolve().then(() => __importStar(require("ai")));
482
+ const wrapped = wrapLanguageModel({ model: mockModel, middleware });
483
+ const result = await wrapped.doGenerate({
484
+ prompt: [{ role: "user", content: [{ type: "text", text: "test" }] }],
485
+ });
486
+ (0, vitest_1.expect)(result.content).toEqual([{ type: "text", text: "mock response" }]);
487
+ (0, vitest_1.expect)(result.usage).toEqual({
488
+ inputTokens: 10,
489
+ outputTokens: 5,
490
+ totalTokens: 15,
491
+ });
492
+ (0, vitest_1.expect)(result.finishReason).toBe("stop");
493
+ });
494
+ });
495
+ //# sourceMappingURL=llm-middleware.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-middleware.test.js","sourceRoot":"","sources":["../../../../tests/unit/llm-middleware.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\nimport type {\n LanguageModelV2,\n LanguageModelV2Middleware,\n} from \"@ai-sdk/provider\";\nimport {\n getAISDKLanguageModel,\n LLMProvider,\n} from \"../../lib/v3/llm/LLMProvider.js\";\nimport { resolveModelConfiguration } from \"../../lib/v3/v3.js\";\n\n/**\n * Creates a recording middleware that captures every doGenerate / doStream\n * invocation along with the model identity and returned usage data.\n */\nfunction createRecordingMiddleware() {\n const calls: {\n type: \"generate\" | \"stream\";\n modelId: string;\n provider: string;\n usage?: { inputTokens?: number; outputTokens?: number };\n }[] = [];\n\n const middleware: LanguageModelV2Middleware = {\n wrapGenerate: async ({ doGenerate, model }) => {\n const result = await doGenerate();\n calls.push({\n type: \"generate\",\n modelId: model.modelId,\n provider: model.provider,\n usage: {\n inputTokens: result.usage.inputTokens ?? undefined,\n outputTokens: result.usage.outputTokens ?? undefined,\n },\n });\n return result;\n },\n wrapStream: async ({ doStream, model }) => {\n const result = await doStream();\n calls.push({\n type: \"stream\",\n modelId: model.modelId,\n provider: model.provider,\n });\n return result;\n },\n };\n\n return { middleware, calls };\n}\n\n/**\n * Creates a minimal mock LanguageModelV2 that returns canned results\n * without hitting any real provider. Useful for testing the wrapping\n * mechanics in isolation.\n */\nfunction createMockLanguageModel(\n modelId: string,\n provider: string,\n): LanguageModelV2 {\n return {\n specificationVersion: \"v2\",\n provider,\n modelId,\n defaultObjectGenerationMode: \"json\",\n doGenerate: vi.fn().mockResolvedValue({\n content: [{ type: \"text\", text: \"mock response\" }],\n finishReason: \"stop\",\n usage: { inputTokens: 10, outputTokens: 5, totalTokens: 15 },\n warnings: [],\n }),\n doStream: vi.fn().mockResolvedValue({\n stream: new ReadableStream({\n start(controller) {\n controller.enqueue({\n type: \"finish\",\n finishReason: \"stop\",\n usage: { inputTokens: 8, outputTokens: 3, totalTokens: 11 },\n });\n controller.close();\n },\n }),\n }),\n } as unknown as LanguageModelV2;\n}\n\n// ---------------------------------------------------------------------------\n// getAISDKLanguageModel with middleware\n// ---------------------------------------------------------------------------\n\ndescribe(\"getAISDKLanguageModel with middleware\", () => {\n it(\"returns a model when no middleware is provided\", () => {\n const model = getAISDKLanguageModel(\"ollama\", \"llama3.2\");\n expect(model).toBeDefined();\n expect(model.modelId).toBe(\"llama3.2\");\n });\n\n it(\"returns a wrapped model when middleware is provided\", () => {\n const { middleware } = createRecordingMiddleware();\n const model = getAISDKLanguageModel(\n \"ollama\",\n \"llama3.2\",\n undefined,\n middleware,\n );\n expect(model).toBeDefined();\n // wrapLanguageModel preserves modelId\n expect(model.modelId).toBe(\"llama3.2\");\n });\n\n it(\"wrapped model preserves doGenerate and doStream methods\", () => {\n const { middleware } = createRecordingMiddleware();\n const model = getAISDKLanguageModel(\n \"ollama\",\n \"llama3.2\",\n undefined,\n middleware,\n );\n\n expect(typeof model.doGenerate).toBe(\"function\");\n expect(typeof model.doStream).toBe(\"function\");\n expect(model.provider).toContain(\"ollama\");\n });\n});\n\n// ---------------------------------------------------------------------------\n// LLMProvider with middleware\n// ---------------------------------------------------------------------------\n\ndescribe(\"LLMProvider with middleware\", () => {\n const noop = () => {};\n\n it(\"creates an AISdkClient without middleware\", () => {\n const provider = new LLMProvider(noop);\n const client = provider.getClient(\"openai/gpt-4o\" as never);\n expect(client).toBeDefined();\n expect(client.type).toBe(\"aisdk\");\n });\n\n it(\"creates an AISdkClient that carries middleware-wrapped model\", () => {\n const { middleware } = createRecordingMiddleware();\n const provider = new LLMProvider(noop, middleware);\n const client = provider.getClient(\"ollama/llama3.2\" as never);\n expect(client).toBeDefined();\n expect(client.type).toBe(\"aisdk\");\n\n const languageModel = client.getLanguageModel();\n expect(languageModel).toBeDefined();\n // Wrapped models should still expose the original modelId\n expect(languageModel.modelId).toBe(\"llama3.2\");\n });\n\n it(\"applies the same middleware to different models from getClient\", () => {\n const { middleware } = createRecordingMiddleware();\n const provider = new LLMProvider(noop, middleware);\n\n const clientA = provider.getClient(\"ollama/llama3.2\" as never);\n const clientB = provider.getClient(\"ollama/mistral\" as never);\n\n expect(clientA.getLanguageModel()).toBeDefined();\n expect(clientB.getLanguageModel()).toBeDefined();\n expect(clientA.getLanguageModel().modelId).toBe(\"llama3.2\");\n expect(clientB.getLanguageModel().modelId).toBe(\"mistral\");\n });\n});\n\n// ---------------------------------------------------------------------------\n// Middleware captures usage across act/extract/observe/agent code paths\n// ---------------------------------------------------------------------------\n\ndescribe(\"middleware captures usage from doGenerate and doStream\", () => {\n it(\"wrapGenerate fires and captures usage on doGenerate\", async () => {\n const { middleware, calls } = createRecordingMiddleware();\n const mockModel = createMockLanguageModel(\"gpt-4o\", \"openai.chat\");\n\n // Simulate what wrapLanguageModel does: import and wrap\n const { wrapLanguageModel } = await import(\"ai\");\n const wrapped = wrapLanguageModel({ model: mockModel, middleware });\n\n await wrapped.doGenerate({\n prompt: [\n {\n role: \"user\",\n content: [{ type: \"text\", text: \"act: click button\" }],\n },\n ],\n });\n\n expect(calls).toHaveLength(1);\n expect(calls[0].type).toBe(\"generate\");\n expect(calls[0].modelId).toBe(\"gpt-4o\");\n expect(calls[0].usage).toEqual({ inputTokens: 10, outputTokens: 5 });\n });\n\n it(\"wrapStream fires on doStream\", async () => {\n const { middleware, calls } = createRecordingMiddleware();\n const mockModel = createMockLanguageModel(\"gpt-4o\", \"openai.chat\");\n\n const { wrapLanguageModel } = await import(\"ai\");\n const wrapped = wrapLanguageModel({ model: mockModel, middleware });\n\n const result = await wrapped.doStream({\n prompt: [\n { role: \"user\", content: [{ type: \"text\", text: \"stream this\" }] },\n ],\n });\n\n // Consume the stream to trigger the finish chunk\n const reader = result.stream.getReader();\n while (true) {\n const { done } = await reader.read();\n if (done) break;\n }\n\n expect(calls).toHaveLength(1);\n expect(calls[0].type).toBe(\"stream\");\n expect(calls[0].modelId).toBe(\"gpt-4o\");\n });\n\n it(\"middleware fires for each separate doGenerate call (simulates act + extract + observe)\", async () => {\n const { middleware, calls } = createRecordingMiddleware();\n const mockModel = createMockLanguageModel(\"gpt-4o\", \"openai.chat\");\n\n const { wrapLanguageModel } = await import(\"ai\");\n const wrapped = wrapLanguageModel({ model: mockModel, middleware });\n\n const callOpts = {\n prompt: [\n {\n role: \"user\" as const,\n content: [{ type: \"text\" as const, text: \"test\" }],\n },\n ],\n };\n\n // Simulate act call\n await wrapped.doGenerate(callOpts);\n // Simulate extract call\n await wrapped.doGenerate(callOpts);\n // Simulate observe call\n await wrapped.doGenerate(callOpts);\n\n expect(calls).toHaveLength(3);\n expect(calls.every((c) => c.type === \"generate\")).toBe(true);\n expect(calls.every((c) => c.modelId === \"gpt-4o\")).toBe(true);\n });\n\n it(\"middleware fires for agent multi-step calls (sequential doGenerate)\", async () => {\n const { middleware, calls } = createRecordingMiddleware();\n const mockModel = createMockLanguageModel(\n \"openai/gpt-4.1\",\n \"gateway.openai\",\n );\n\n const { wrapLanguageModel } = await import(\"ai\");\n const wrapped = wrapLanguageModel({ model: mockModel, middleware });\n\n const callOpts = {\n prompt: [\n {\n role: \"user\" as const,\n content: [{ type: \"text\" as const, text: \"agent step\" }],\n },\n ],\n };\n\n // Simulate multiple agent reasoning steps\n await wrapped.doGenerate(callOpts);\n await wrapped.doGenerate(callOpts);\n await wrapped.doGenerate(callOpts);\n await wrapped.doGenerate(callOpts);\n await wrapped.doGenerate(callOpts);\n\n expect(calls).toHaveLength(5);\n calls.forEach((c) => {\n expect(c.usage).toEqual({ inputTokens: 10, outputTokens: 5 });\n });\n });\n});\n\n// ---------------------------------------------------------------------------\n// ModelConfiguration-level middleware (the user-facing shape)\n// ---------------------------------------------------------------------------\n\ndescribe(\"middleware inside ModelConfiguration\", () => {\n it(\"resolveModelConfiguration extracts middleware from object config\", () => {\n const { middleware: mw } = createRecordingMiddleware();\n const result = resolveModelConfiguration({\n modelName: \"openai/gpt-4o\",\n apiKey: \"sk-test\",\n middleware: mw,\n });\n\n expect(result.modelName).toBe(\"openai/gpt-4o\");\n expect(result.middleware).toBe(mw);\n expect(result.clientOptions).toEqual({ apiKey: \"sk-test\" });\n expect(result.clientOptions && \"middleware\" in result.clientOptions).toBe(\n false,\n );\n });\n\n it(\"string ModelConfiguration has no middleware\", () => {\n const result = resolveModelConfiguration(\"openai/gpt-4o\");\n expect(result.modelName).toBe(\"openai/gpt-4o\");\n expect(result.middleware).toBeUndefined();\n expect(result.clientOptions).toBeUndefined();\n });\n\n it(\"middleware is separated from clientOptions when resolving per-method overrides\", () => {\n const { middleware: mw } = createRecordingMiddleware();\n const result = resolveModelConfiguration({\n modelName: \"anthropic/claude-sonnet-4-20250514\",\n apiKey: \"sk-ant-test\",\n middleware: mw,\n });\n\n expect(result.modelName).toBe(\"anthropic/claude-sonnet-4-20250514\");\n expect(result.middleware).toBe(mw);\n expect(result.clientOptions).toEqual({ apiKey: \"sk-ant-test\" });\n expect(result.clientOptions && \"middleware\" in result.clientOptions).toBe(\n false,\n );\n });\n});\n\n// ---------------------------------------------------------------------------\n// Practical middleware behaviors\n// ---------------------------------------------------------------------------\n\ndescribe(\"middleware that tracks duration\", () => {\n it(\"measures wall-clock time of doGenerate\", async () => {\n const durations: number[] = [];\n\n const timingMiddleware: LanguageModelV2Middleware = {\n wrapGenerate: async ({ doGenerate }) => {\n const start = performance.now();\n const result = await doGenerate();\n durations.push(performance.now() - start);\n return result;\n },\n };\n\n const mockModel = createMockLanguageModel(\"gpt-4o\", \"openai.chat\");\n const { wrapLanguageModel } = await import(\"ai\");\n const wrapped = wrapLanguageModel({\n model: mockModel,\n middleware: timingMiddleware,\n });\n\n await wrapped.doGenerate({\n prompt: [{ role: \"user\", content: [{ type: \"text\", text: \"time me\" }] }],\n });\n\n expect(durations).toHaveLength(1);\n expect(durations[0]).toBeGreaterThanOrEqual(0);\n });\n});\n\ndescribe(\"middleware that aggregates token usage\", () => {\n it(\"sums tokens across multiple calls like a billing tracker\", async () => {\n let totalInput = 0;\n let totalOutput = 0;\n\n const billingMiddleware: LanguageModelV2Middleware = {\n wrapGenerate: async ({ doGenerate }) => {\n const result = await doGenerate();\n totalInput += result.usage.inputTokens ?? 0;\n totalOutput += result.usage.outputTokens ?? 0;\n return result;\n },\n };\n\n const mockModel = createMockLanguageModel(\"gpt-4o\", \"openai.chat\");\n const { wrapLanguageModel } = await import(\"ai\");\n const wrapped = wrapLanguageModel({\n model: mockModel,\n middleware: billingMiddleware,\n });\n\n const callOpts = {\n prompt: [\n {\n role: \"user\" as const,\n content: [{ type: \"text\" as const, text: \"go\" }],\n },\n ],\n };\n\n // act\n await wrapped.doGenerate(callOpts);\n // extract\n await wrapped.doGenerate(callOpts);\n // observe\n await wrapped.doGenerate(callOpts);\n\n expect(totalInput).toBe(30);\n expect(totalOutput).toBe(15);\n });\n});\n\ndescribe(\"middleware that logs per-model call counts\", () => {\n it(\"tracks which models were called and how many times\", async () => {\n const modelCallCounts = new Map<string, number>();\n\n const countingMiddleware: LanguageModelV2Middleware = {\n wrapGenerate: async ({ doGenerate, model }) => {\n const key = `${model.provider}/${model.modelId}`;\n modelCallCounts.set(key, (modelCallCounts.get(key) ?? 0) + 1);\n return doGenerate();\n },\n };\n\n const modelA = createMockLanguageModel(\"gpt-4o\", \"openai.chat\");\n const modelB = createMockLanguageModel(\n \"claude-sonnet-4-20250514\",\n \"anthropic.messages\",\n );\n\n const { wrapLanguageModel } = await import(\"ai\");\n const wrappedA = wrapLanguageModel({\n model: modelA,\n middleware: countingMiddleware,\n });\n const wrappedB = wrapLanguageModel({\n model: modelB,\n middleware: countingMiddleware,\n });\n\n const callOpts = {\n prompt: [\n {\n role: \"user\" as const,\n content: [{ type: \"text\" as const, text: \"go\" }],\n },\n ],\n };\n\n await wrappedA.doGenerate(callOpts);\n await wrappedA.doGenerate(callOpts);\n await wrappedB.doGenerate(callOpts);\n\n expect(modelCallCounts.get(\"openai.chat/gpt-4o\")).toBe(2);\n expect(\n modelCallCounts.get(\"anthropic.messages/claude-sonnet-4-20250514\"),\n ).toBe(1);\n expect(modelCallCounts.size).toBe(2);\n });\n});\n\ndescribe(\"middleware that detects errors\", () => {\n it(\"catches and re-throws errors from doGenerate while still recording the failure\", async () => {\n const errors: Error[] = [];\n\n const errorTrackingMiddleware: LanguageModelV2Middleware = {\n wrapGenerate: async ({ doGenerate }) => {\n try {\n return await doGenerate();\n } catch (err) {\n errors.push(err as Error);\n throw err;\n }\n },\n };\n\n const failingModel: LanguageModelV2 = {\n specificationVersion: \"v2\",\n provider: \"openai.chat\",\n modelId: \"gpt-4o\",\n defaultObjectGenerationMode: \"json\",\n doGenerate: vi.fn().mockRejectedValue(new Error(\"rate limit exceeded\")),\n doStream: vi.fn(),\n } as unknown as LanguageModelV2;\n\n const { wrapLanguageModel } = await import(\"ai\");\n const wrapped = wrapLanguageModel({\n model: failingModel,\n middleware: errorTrackingMiddleware,\n });\n\n await expect(\n wrapped.doGenerate({\n prompt: [{ role: \"user\", content: [{ type: \"text\", text: \"fail\" }] }],\n }),\n ).rejects.toThrow(\"rate limit exceeded\");\n\n expect(errors).toHaveLength(1);\n expect(errors[0].message).toBe(\"rate limit exceeded\");\n });\n});\n\ndescribe(\"chaining middleware across multiple wrapped models\", () => {\n it(\"same middleware instance sees calls from different models\", async () => {\n const seen: string[] = [];\n\n const spyMiddleware: LanguageModelV2Middleware = {\n wrapGenerate: async ({ doGenerate, model }) => {\n seen.push(model.modelId);\n return doGenerate();\n },\n };\n\n const mockA = createMockLanguageModel(\"gpt-4o\", \"openai.chat\");\n const mockB = createMockLanguageModel(\n \"claude-sonnet-4-20250514\",\n \"anthropic.messages\",\n );\n\n const { wrapLanguageModel } = await import(\"ai\");\n const wrappedA = wrapLanguageModel({\n model: mockA,\n middleware: spyMiddleware,\n });\n const wrappedB = wrapLanguageModel({\n model: mockB,\n middleware: spyMiddleware,\n });\n\n const callOpts = {\n prompt: [\n {\n role: \"user\" as const,\n content: [{ type: \"text\" as const, text: \"go\" }],\n },\n ],\n };\n\n await wrappedA.doGenerate(callOpts);\n await wrappedB.doGenerate(callOpts);\n await wrappedA.doGenerate(callOpts);\n\n expect(seen).toEqual([\"gpt-4o\", \"claude-sonnet-4-20250514\", \"gpt-4o\"]);\n });\n});\n\n// ---------------------------------------------------------------------------\n// Edge cases\n// ---------------------------------------------------------------------------\n\ndescribe(\"middleware edge cases\", () => {\n it(\"middleware that only implements wrapGenerate still works for doStream\", async () => {\n const generateCalls: string[] = [];\n const partialMiddleware: LanguageModelV2Middleware = {\n wrapGenerate: async ({ doGenerate, model }) => {\n generateCalls.push(model.modelId);\n return doGenerate();\n },\n };\n\n const mockModel = createMockLanguageModel(\"gpt-4o\", \"openai.chat\");\n const { wrapLanguageModel } = await import(\"ai\");\n const wrapped = wrapLanguageModel({\n model: mockModel,\n middleware: partialMiddleware,\n });\n\n const result = await wrapped.doStream({\n prompt: [{ role: \"user\", content: [{ type: \"text\", text: \"stream\" }] }],\n });\n expect(result.stream).toBeDefined();\n\n expect(generateCalls).toHaveLength(0);\n });\n\n it(\"middleware does not alter the response data\", async () => {\n const { middleware } = createRecordingMiddleware();\n const mockModel = createMockLanguageModel(\"gpt-4o\", \"openai.chat\");\n\n const { wrapLanguageModel } = await import(\"ai\");\n const wrapped = wrapLanguageModel({ model: mockModel, middleware });\n\n const result = await wrapped.doGenerate({\n prompt: [{ role: \"user\", content: [{ type: \"text\", text: \"test\" }] }],\n });\n\n expect(result.content).toEqual([{ type: \"text\", text: \"mock response\" }]);\n expect(result.usage).toEqual({\n inputTokens: 10,\n outputTokens: 5,\n totalTokens: 15,\n });\n expect(result.finishReason).toBe(\"stop\");\n });\n});\n"]}
@@ -8,10 +8,7 @@ const mockClientOptions = { apiKey: "test-api-key-for-testing" };
8
8
  (0, vitest_1.describe)("Model format deprecation", () => {
9
9
  (0, vitest_1.describe)("UnsupportedModelError", () => {
10
10
  (0, vitest_1.it)("includes guidance to use provider/model format for unknown model names", () => {
11
- const error = new sdkErrors_js_1.UnsupportedModelError([
12
- "gpt-4o",
13
- "claude-3-5-sonnet-latest",
14
- ]);
11
+ const error = new sdkErrors_js_1.UnsupportedModelError(["gpt-4o", "gemini-2.0-flash"]);
15
12
  // Should mention the new format
16
13
  (0, vitest_1.expect)(error.message).toContain("provider/model");
17
14
  // Should include link to docs
@@ -70,15 +67,15 @@ const mockClientOptions = { apiKey: "test-api-key-for-testing" };
70
67
  // The client should be an OpenAIClient (check constructor name)
71
68
  (0, vitest_1.expect)(client.constructor.name).toBe("OpenAIClient");
72
69
  });
73
- (0, vitest_1.it)("returns AnthropicClient for legacy Anthropic model names", () => {
70
+ (0, vitest_1.it)("returns GoogleClient for legacy Google model names", () => {
74
71
  const logs = [];
75
72
  const logger = (line) => logs.push(line);
76
73
  const provider = new LLMProvider_js_1.LLMProvider(logger);
77
- const client = provider.getClient("claude-3-5-sonnet-latest", mockClientOptions);
74
+ const client = provider.getClient("gemini-2.0-flash", mockClientOptions);
78
75
  // Should return a client
79
76
  (0, vitest_1.expect)(client).toBeDefined();
80
- // The client should be an AnthropicClient
81
- (0, vitest_1.expect)(client.constructor.name).toBe("AnthropicClient");
77
+ // The client should be a GoogleClient
78
+ (0, vitest_1.expect)(client.constructor.name).toBe("GoogleClient");
82
79
  });
83
80
  });
84
81
  (0, vitest_1.describe)("LLMProvider.getClient error handling", () => {