@browserbasehq/orca 3.5.1-preview.0 → 3.7.0-preview.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 (242) hide show
  1. package/README.md +0 -12
  2. package/dist/cjs/lib/utils.d.ts +6 -0
  3. package/dist/cjs/lib/utils.js +11 -0
  4. package/dist/cjs/lib/utils.js.map +1 -1
  5. package/dist/cjs/lib/v3/agent/AgentClient.d.ts +2 -2
  6. package/dist/cjs/lib/v3/agent/AgentClient.js.map +1 -1
  7. package/dist/cjs/lib/v3/agent/AgentProvider.js +4 -3
  8. package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
  9. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.d.ts +4 -3
  10. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +21 -18
  11. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  12. package/dist/cjs/lib/v3/agent/GoogleCUAClient.d.ts +12 -3
  13. package/dist/cjs/lib/v3/agent/GoogleCUAClient.js +217 -36
  14. package/dist/cjs/lib/v3/agent/GoogleCUAClient.js.map +1 -1
  15. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.d.ts +2 -2
  16. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js +2 -2
  17. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
  18. package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +6 -3
  19. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +13 -7
  20. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  21. package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.d.ts +1 -0
  22. package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js +50 -3
  23. package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
  24. package/dist/cjs/lib/v3/cache/ActCache.js +1 -1
  25. package/dist/cjs/lib/v3/cache/ActCache.js.map +1 -1
  26. package/dist/cjs/lib/v3/cache/utils.d.ts +7 -0
  27. package/dist/cjs/lib/v3/cache/utils.js +19 -0
  28. package/dist/cjs/lib/v3/cache/utils.js.map +1 -1
  29. package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +2 -1
  30. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +55 -16
  31. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  32. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +32 -18
  33. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  34. package/dist/cjs/lib/v3/index.d.ts +3 -2
  35. package/dist/cjs/lib/v3/index.js.map +1 -1
  36. package/dist/cjs/lib/v3/launch/local.js +1 -0
  37. package/dist/cjs/lib/v3/launch/local.js.map +1 -1
  38. package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +2 -2
  39. package/dist/cjs/lib/v3/llm/LLMProvider.js +1 -0
  40. package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
  41. package/dist/cjs/lib/v3/llm/aisdk.js +4 -0
  42. package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
  43. package/dist/cjs/lib/v3/llm/anthropicOptions.d.ts +57 -0
  44. package/dist/cjs/lib/v3/llm/anthropicOptions.js +115 -0
  45. package/dist/cjs/lib/v3/llm/anthropicOptions.js.map +1 -0
  46. package/dist/cjs/lib/v3/types/public/agent.d.ts +10 -1
  47. package/dist/cjs/lib/v3/types/public/agent.js +2 -0
  48. package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
  49. package/dist/cjs/lib/v3/types/public/context.d.ts +7 -0
  50. package/dist/cjs/lib/v3/types/public/context.js.map +1 -1
  51. package/dist/cjs/lib/v3/types/public/model.d.ts +3 -2
  52. package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
  53. package/dist/cjs/lib/v3/types/public/sdkErrors.d.ts +4 -0
  54. package/dist/cjs/lib/v3/types/public/sdkErrors.js +9 -1
  55. package/dist/cjs/lib/v3/types/public/sdkErrors.js.map +1 -1
  56. package/dist/cjs/lib/v3/understudy/cdp.d.ts +2 -0
  57. package/dist/cjs/lib/v3/understudy/cdp.js +26 -12
  58. package/dist/cjs/lib/v3/understudy/cdp.js.map +1 -1
  59. package/dist/cjs/lib/v3/understudy/context.d.ts +13 -1
  60. package/dist/cjs/lib/v3/understudy/context.js +284 -1
  61. package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
  62. package/dist/cjs/lib/v3/understudy/domainPolicy.d.ts +25 -0
  63. package/dist/cjs/lib/v3/understudy/domainPolicy.js +162 -0
  64. package/dist/cjs/lib/v3/understudy/domainPolicy.js.map +1 -0
  65. package/dist/cjs/lib/v3/understudy/page.js +1 -1
  66. package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
  67. package/dist/cjs/lib/v3/v3.js +8 -2
  68. package/dist/cjs/lib/v3/v3.js.map +1 -1
  69. package/dist/cjs/lib/v3/verifier/errorTaxonomy.d.ts +35 -0
  70. package/dist/cjs/lib/v3/verifier/errorTaxonomy.js +291 -0
  71. package/dist/cjs/lib/v3/verifier/errorTaxonomy.js.map +1 -0
  72. package/dist/cjs/lib/v3/verifier/evidence.d.ts +44 -0
  73. package/dist/cjs/lib/v3/verifier/evidence.js +432 -0
  74. package/dist/cjs/lib/v3/verifier/evidence.js.map +1 -0
  75. package/dist/cjs/lib/v3/verifier/index.d.ts +1 -1
  76. package/dist/cjs/lib/v3/verifier/index.js.map +1 -1
  77. package/dist/cjs/lib/v3/verifier/prompts/batchedRelevance.d.ts +21 -0
  78. package/dist/cjs/lib/v3/verifier/prompts/batchedRelevance.js +71 -0
  79. package/dist/cjs/lib/v3/verifier/prompts/batchedRelevance.js.map +1 -0
  80. package/dist/cjs/lib/v3/verifier/prompts/firstPointOfFailure.d.ts +3 -0
  81. package/dist/cjs/lib/v3/verifier/prompts/firstPointOfFailure.js +166 -0
  82. package/dist/cjs/lib/v3/verifier/prompts/firstPointOfFailure.js.map +1 -0
  83. package/dist/cjs/lib/v3/verifier/prompts/fusedJudgment.d.ts +35 -0
  84. package/dist/cjs/lib/v3/verifier/prompts/fusedJudgment.js +158 -0
  85. package/dist/cjs/lib/v3/verifier/prompts/fusedJudgment.js.map +1 -0
  86. package/dist/cjs/lib/v3/verifier/prompts/fusedOutcome.d.ts +26 -0
  87. package/dist/cjs/lib/v3/verifier/prompts/fusedOutcome.js +137 -0
  88. package/dist/cjs/lib/v3/verifier/prompts/fusedOutcome.js.map +1 -0
  89. package/dist/cjs/lib/v3/verifier/prompts/index.d.ts +8 -0
  90. package/dist/cjs/lib/v3/verifier/prompts/index.js +22 -0
  91. package/dist/cjs/lib/v3/verifier/prompts/index.js.map +1 -0
  92. package/dist/cjs/lib/v3/verifier/prompts/perCriterionScore.d.ts +23 -0
  93. package/dist/cjs/lib/v3/verifier/prompts/perCriterionScore.js +77 -0
  94. package/dist/cjs/lib/v3/verifier/prompts/perCriterionScore.js.map +1 -0
  95. package/dist/cjs/lib/v3/verifier/prompts/render.d.ts +23 -0
  96. package/dist/cjs/lib/v3/verifier/prompts/render.js +45 -0
  97. package/dist/cjs/lib/v3/verifier/prompts/render.js.map +1 -0
  98. package/dist/cjs/lib/v3/verifier/prompts/rubricGeneration.d.ts +16 -0
  99. package/dist/cjs/lib/v3/verifier/prompts/rubricGeneration.js +321 -0
  100. package/dist/cjs/lib/v3/verifier/prompts/rubricGeneration.js.map +1 -0
  101. package/dist/cjs/lib/v3/verifier/prompts/taskValidity.d.ts +1 -0
  102. package/dist/cjs/lib/v3/verifier/prompts/taskValidity.js +116 -0
  103. package/dist/cjs/lib/v3/verifier/prompts/taskValidity.js.map +1 -0
  104. package/dist/cjs/lib/v3/verifier/rubricVerifier.d.ts +91 -0
  105. package/dist/cjs/lib/v3/verifier/rubricVerifier.js +1645 -0
  106. package/dist/cjs/lib/v3/verifier/rubricVerifier.js.map +1 -0
  107. package/dist/cjs/lib/v3/verifier/trajectory.d.ts +3 -3
  108. package/dist/cjs/lib/v3/verifier/trajectory.js +26 -26
  109. package/dist/cjs/lib/v3/verifier/trajectory.js.map +1 -1
  110. package/dist/cjs/lib/v3/verifier/types.d.ts +163 -15
  111. package/dist/cjs/lib/v3/verifier/types.js +0 -7
  112. package/dist/cjs/lib/v3/verifier/types.js.map +1 -1
  113. package/dist/cjs/lib/v3Evaluator.d.ts +5 -0
  114. package/dist/cjs/lib/v3Evaluator.js +47 -7
  115. package/dist/cjs/lib/v3Evaluator.js.map +1 -1
  116. package/dist/cjs/lib/version.d.ts +1 -1
  117. package/dist/cjs/lib/version.js +1 -1
  118. package/dist/cjs/lib/version.js.map +1 -1
  119. package/dist/esm/lib/utils.d.ts +6 -0
  120. package/dist/esm/lib/utils.js +10 -0
  121. package/dist/esm/lib/utils.js.map +1 -1
  122. package/dist/esm/lib/v3/agent/AgentClient.d.ts +2 -2
  123. package/dist/esm/lib/v3/agent/AgentClient.js.map +1 -1
  124. package/dist/esm/lib/v3/agent/AgentProvider.js +4 -3
  125. package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
  126. package/dist/esm/lib/v3/agent/AnthropicCUAClient.d.ts +4 -3
  127. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +21 -18
  128. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  129. package/dist/esm/lib/v3/agent/GoogleCUAClient.d.ts +12 -3
  130. package/dist/esm/lib/v3/agent/GoogleCUAClient.js +217 -36
  131. package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -1
  132. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.d.ts +2 -2
  133. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js +2 -2
  134. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
  135. package/dist/esm/lib/v3/agent/OpenAICUAClient.d.ts +6 -3
  136. package/dist/esm/lib/v3/agent/OpenAICUAClient.js +13 -7
  137. package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  138. package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.d.ts +1 -0
  139. package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js +49 -3
  140. package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
  141. package/dist/esm/lib/v3/cache/ActCache.js +2 -2
  142. package/dist/esm/lib/v3/cache/ActCache.js.map +1 -1
  143. package/dist/esm/lib/v3/cache/utils.d.ts +7 -0
  144. package/dist/esm/lib/v3/cache/utils.js +18 -0
  145. package/dist/esm/lib/v3/cache/utils.js.map +1 -1
  146. package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +2 -1
  147. package/dist/esm/lib/v3/handlers/v3AgentHandler.js +55 -16
  148. package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  149. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +32 -18
  150. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  151. package/dist/esm/lib/v3/index.d.ts +3 -2
  152. package/dist/esm/lib/v3/index.js.map +1 -1
  153. package/dist/esm/lib/v3/launch/local.js +1 -0
  154. package/dist/esm/lib/v3/launch/local.js.map +1 -1
  155. package/dist/esm/lib/v3/llm/LLMProvider.d.ts +2 -2
  156. package/dist/esm/lib/v3/llm/LLMProvider.js +1 -0
  157. package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
  158. package/dist/esm/lib/v3/llm/aisdk.js +4 -0
  159. package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
  160. package/dist/esm/lib/v3/llm/anthropicOptions.d.ts +57 -0
  161. package/dist/esm/lib/v3/llm/anthropicOptions.js +106 -0
  162. package/dist/esm/lib/v3/llm/anthropicOptions.js.map +1 -0
  163. package/dist/esm/lib/v3/types/public/agent.d.ts +10 -1
  164. package/dist/esm/lib/v3/types/public/agent.js +2 -0
  165. package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
  166. package/dist/esm/lib/v3/types/public/context.d.ts +7 -0
  167. package/dist/esm/lib/v3/types/public/context.js.map +1 -1
  168. package/dist/esm/lib/v3/types/public/model.d.ts +3 -2
  169. package/dist/esm/lib/v3/types/public/model.js.map +1 -1
  170. package/dist/esm/lib/v3/types/public/sdkErrors.d.ts +4 -0
  171. package/dist/esm/lib/v3/types/public/sdkErrors.js +7 -0
  172. package/dist/esm/lib/v3/types/public/sdkErrors.js.map +1 -1
  173. package/dist/esm/lib/v3/understudy/cdp.d.ts +2 -0
  174. package/dist/esm/lib/v3/understudy/cdp.js +26 -12
  175. package/dist/esm/lib/v3/understudy/cdp.js.map +1 -1
  176. package/dist/esm/lib/v3/understudy/context.d.ts +13 -1
  177. package/dist/esm/lib/v3/understudy/context.js +285 -2
  178. package/dist/esm/lib/v3/understudy/context.js.map +1 -1
  179. package/dist/esm/lib/v3/understudy/domainPolicy.d.ts +25 -0
  180. package/dist/esm/lib/v3/understudy/domainPolicy.js +158 -0
  181. package/dist/esm/lib/v3/understudy/domainPolicy.js.map +1 -0
  182. package/dist/esm/lib/v3/understudy/page.js +1 -1
  183. package/dist/esm/lib/v3/understudy/page.js.map +1 -1
  184. package/dist/esm/lib/v3/v3.js +8 -2
  185. package/dist/esm/lib/v3/v3.js.map +1 -1
  186. package/dist/esm/lib/v3/verifier/errorTaxonomy.d.ts +35 -0
  187. package/dist/esm/lib/v3/verifier/errorTaxonomy.js +285 -0
  188. package/dist/esm/lib/v3/verifier/errorTaxonomy.js.map +1 -0
  189. package/dist/esm/lib/v3/verifier/evidence.d.ts +44 -0
  190. package/dist/esm/lib/v3/verifier/evidence.js +393 -0
  191. package/dist/esm/lib/v3/verifier/evidence.js.map +1 -0
  192. package/dist/esm/lib/v3/verifier/index.d.ts +1 -1
  193. package/dist/esm/lib/v3/verifier/index.js.map +1 -1
  194. package/dist/esm/lib/v3/verifier/prompts/batchedRelevance.d.ts +21 -0
  195. package/dist/esm/lib/v3/verifier/prompts/batchedRelevance.js +68 -0
  196. package/dist/esm/lib/v3/verifier/prompts/batchedRelevance.js.map +1 -0
  197. package/dist/esm/lib/v3/verifier/prompts/firstPointOfFailure.d.ts +3 -0
  198. package/dist/esm/lib/v3/verifier/prompts/firstPointOfFailure.js +162 -0
  199. package/dist/esm/lib/v3/verifier/prompts/firstPointOfFailure.js.map +1 -0
  200. package/dist/esm/lib/v3/verifier/prompts/fusedJudgment.d.ts +35 -0
  201. package/dist/esm/lib/v3/verifier/prompts/fusedJudgment.js +155 -0
  202. package/dist/esm/lib/v3/verifier/prompts/fusedJudgment.js.map +1 -0
  203. package/dist/esm/lib/v3/verifier/prompts/fusedOutcome.d.ts +26 -0
  204. package/dist/esm/lib/v3/verifier/prompts/fusedOutcome.js +134 -0
  205. package/dist/esm/lib/v3/verifier/prompts/fusedOutcome.js.map +1 -0
  206. package/dist/esm/lib/v3/verifier/prompts/index.d.ts +8 -0
  207. package/dist/esm/lib/v3/verifier/prompts/index.js +9 -0
  208. package/dist/esm/lib/v3/verifier/prompts/index.js.map +1 -0
  209. package/dist/esm/lib/v3/verifier/prompts/perCriterionScore.d.ts +23 -0
  210. package/dist/esm/lib/v3/verifier/prompts/perCriterionScore.js +74 -0
  211. package/dist/esm/lib/v3/verifier/prompts/perCriterionScore.js.map +1 -0
  212. package/dist/esm/lib/v3/verifier/prompts/render.d.ts +23 -0
  213. package/dist/esm/lib/v3/verifier/prompts/render.js +41 -0
  214. package/dist/esm/lib/v3/verifier/prompts/render.js.map +1 -0
  215. package/dist/esm/lib/v3/verifier/prompts/rubricGeneration.d.ts +16 -0
  216. package/dist/esm/lib/v3/verifier/prompts/rubricGeneration.js +318 -0
  217. package/dist/esm/lib/v3/verifier/prompts/rubricGeneration.js.map +1 -0
  218. package/dist/esm/lib/v3/verifier/prompts/taskValidity.d.ts +1 -0
  219. package/dist/esm/lib/v3/verifier/prompts/taskValidity.js +113 -0
  220. package/dist/esm/lib/v3/verifier/prompts/taskValidity.js.map +1 -0
  221. package/dist/esm/lib/v3/verifier/rubricVerifier.d.ts +91 -0
  222. package/dist/esm/lib/v3/verifier/rubricVerifier.js +1640 -0
  223. package/dist/esm/lib/v3/verifier/rubricVerifier.js.map +1 -0
  224. package/dist/esm/lib/v3/verifier/trajectory.d.ts +3 -3
  225. package/dist/esm/lib/v3/verifier/trajectory.js +26 -26
  226. package/dist/esm/lib/v3/verifier/trajectory.js.map +1 -1
  227. package/dist/esm/lib/v3/verifier/types.d.ts +163 -15
  228. package/dist/esm/lib/v3/verifier/types.js +0 -7
  229. package/dist/esm/lib/v3/verifier/types.js.map +1 -1
  230. package/dist/esm/lib/v3Evaluator.d.ts +5 -0
  231. package/dist/esm/lib/v3Evaluator.js +47 -7
  232. package/dist/esm/lib/v3Evaluator.js.map +1 -1
  233. package/dist/esm/lib/version.d.ts +1 -1
  234. package/dist/esm/lib/version.js +1 -1
  235. package/dist/esm/lib/version.js.map +1 -1
  236. package/package.json +10 -10
  237. package/dist/cjs/lib/v3/dom/build/selectorRuntime.generated.d.ts +0 -24
  238. package/dist/cjs/lib/v3/dom/build/selectorRuntime.generated.js +0 -31
  239. package/dist/cjs/lib/v3/dom/build/selectorRuntime.generated.js.map +0 -1
  240. package/dist/esm/lib/v3/dom/build/selectorRuntime.generated.d.ts +0 -24
  241. package/dist/esm/lib/v3/dom/build/selectorRuntime.generated.js +0 -28
  242. package/dist/esm/lib/v3/dom/build/selectorRuntime.generated.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import type { EasyInputMessage } from "openai/resources/responses/responses";
2
2
  import { LogLine } from "../types/public/logs.js";
3
- import { AgentAction, AgentResult, AgentType, AgentExecutionOptions, ResponseInputItem, ResponseItem, SafetyConfirmationHandler } from "../types/public/agent.js";
3
+ import { AgentAction, AgentResult, AgentType, AgentExecutionOptions, ResponseInputItem, ResponseItem, SafetyConfirmationHandler, ScreenshotProviderResult } from "../types/public/agent.js";
4
4
  import { ClientOptions } from "../types/public/model.js";
5
5
  import { AgentClient } from "./AgentClient.js";
6
6
  import { ToolSet } from "ai";
@@ -25,7 +25,7 @@ export declare class OpenAICUAClient extends AgentClient {
25
25
  constructor(type: AgentType, modelName: string, userProvidedInstructions?: string, clientOptions?: ClientOptions, tools?: ToolSet);
26
26
  setViewport(width: number, height: number): void;
27
27
  setCurrentUrl(url: string): void;
28
- setScreenshotProvider(provider: () => Promise<string>): void;
28
+ setScreenshotProvider(provider: () => Promise<ScreenshotProviderResult>): void;
29
29
  setActionHandler(handler: (action: AgentAction) => Promise<void>): void;
30
30
  setTools(tools: ToolSet): void;
31
31
  setSafetyConfirmationHandler(handler?: SafetyConfirmationHandler): void;
@@ -69,7 +69,10 @@ export declare class OpenAICUAClient extends AgentClient {
69
69
  private convertFunctionCallToAction;
70
70
  captureScreenshot(options?: {
71
71
  base64Image?: string;
72
+ mediaType?: "image/png" | "image/jpeg";
72
73
  currentUrl?: string;
73
- }): Promise<string>;
74
+ }): Promise<ScreenshotProviderResult>;
75
+ /** Build the `data:` URL the OpenAI image payload expects. */
76
+ private toDataUrl;
74
77
  }
75
78
  export {};
@@ -347,7 +347,7 @@ export class OpenAICUAClient extends AgentClient {
347
347
  if (initialScreenshot) {
348
348
  const screenshotInput = {
349
349
  type: "input_image",
350
- image_url: initialScreenshot,
350
+ image_url: this.toDataUrl(initialScreenshot),
351
351
  detail: "high",
352
352
  };
353
353
  userContent.push(screenshotInput);
@@ -485,7 +485,7 @@ export class OpenAICUAClient extends AgentClient {
485
485
  call_id: item.call_id,
486
486
  output: {
487
487
  type: outputType,
488
- image_url: screenshot,
488
+ image_url: this.toDataUrl(screenshot),
489
489
  ...(this.usesNewComputerTool
490
490
  ? { detail: "original" }
491
491
  : {}),
@@ -532,7 +532,7 @@ export class OpenAICUAClient extends AgentClient {
532
532
  call_id: item.call_id,
533
533
  output: {
534
534
  type: outputType,
535
- image_url: screenshot,
535
+ image_url: this.toDataUrl(screenshot),
536
536
  error: errorMessage,
537
537
  ...(this.usesNewComputerTool
538
538
  ? { detail: "original" }
@@ -708,13 +708,15 @@ export class OpenAICUAClient extends AgentClient {
708
708
  async captureScreenshot(options) {
709
709
  // Use provided options if available
710
710
  if (options?.base64Image) {
711
- return `data:image/png;base64,${options.base64Image}`;
711
+ return {
712
+ base64: options.base64Image,
713
+ mediaType: options.mediaType ?? "image/png",
714
+ };
712
715
  }
713
716
  // Use the screenshot provider if available
714
717
  if (this.screenshotProvider) {
715
718
  try {
716
- const base64Image = await this.screenshotProvider();
717
- return `data:image/png;base64,${base64Image}`;
719
+ return await this.screenshotProvider();
718
720
  }
719
721
  catch (error) {
720
722
  console.error("Error capturing screenshot:", error);
@@ -722,7 +724,11 @@ export class OpenAICUAClient extends AgentClient {
722
724
  }
723
725
  }
724
726
  throw new AgentScreenshotProviderError("`screenshotProvider` has not been set. " +
725
- "Please call `setScreenshotProvider()` with a valid function that returns a base64-encoded image");
727
+ "Please call `setScreenshotProvider()` with a valid function that returns a base64-encoded image and media type");
728
+ }
729
+ /** Build the `data:` URL the OpenAI image payload expects. */
730
+ toDataUrl(screenshot) {
731
+ return `data:${screenshot.mediaType};base64,${screenshot.base64}`;
726
732
  }
727
733
  }
728
734
  //# sourceMappingURL=OpenAICUAClient.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OpenAICUAClient.js","sourceRoot":"","sources":["../../../../../lib/v3/agent/OpenAICUAClient.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAoB5B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,UAAU,EACV,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC;;;GAGG;AACH,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAIpD,MAAM,OAAO,eAAgB,SAAQ,WAAW;IACtC,mBAAmB,GAAa,EAAE,CAAC;IACnC,uBAAuB,GAAG,KAAK,CAAC;IAChC,MAAM,CAAS;IACf,YAAY,CAAU;IACtB,OAAO,CAAS;IAChB,MAAM,CAAS;IAChB,cAAc,CAAU;IACvB,eAAe,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC/C,UAAU,CAAU;IACpB,kBAAkB,CAAyB;IAC3C,aAAa,CAA0C;IACvD,cAAc,GAA8B,IAAI,GAAG,EAAE,CAAC;IACtD,WAAW,GAAW,SAAS,CAAC,CAAC,2CAA2C;IAC5E,KAAK,CAAW;IAChB,yBAAyB,CAA6B;IAE9D,IAAY,mBAAmB;QAC7B,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED,YACE,IAAe,EACf,SAAiB,EACjB,wBAAiC,EACjC,aAA6B,EAC7B,KAAe;QAEf,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,wBAAwB,CAAC,CAAC;QAEjD,yBAAyB;QACzB,IAAI,CAAC,MAAM;YACR,aAAa,EAAE,MAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;QACxE,IAAI,CAAC,OAAO,GAAI,aAAa,EAAE,OAAkB,IAAI,SAAS,CAAC;QAC/D,IAAI,CAAC,YAAY;YACd,aAAa,EAAE,YAAuB,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAEpE,+BAA+B;QAC/B,IACE,aAAa,EAAE,WAAW;YAC1B,OAAO,aAAa,CAAC,WAAW,KAAK,QAAQ,EAC7C,CAAC;YACD,IAAI,CAAC,WAAW,GAAG,aAAa,CAAC,WAAW,CAAC;QAC/C,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC,aAAa,GAAG;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;QAEF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC5C,CAAC;QAED,+BAA+B;QAC/B,IAAI,CAAC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAE7C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,WAAW,CAAC,KAAa,EAAE,MAAc;QACvC,IAAI,CAAC,eAAe,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3C,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;IACxB,CAAC;IAED,qBAAqB,CAAC,QAA+B;QACnD,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IACrC,CAAC;IAED,gBAAgB,CAAC,OAA+C;QAC9D,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IAC/B,CAAC;IAED,QAAQ,CAAC,KAAc;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,4BAA4B,CAAC,OAAmC;QAC9D,IAAI,CAAC,yBAAyB,GAAG,OAAO,CAAC;IAC3C,CAAC;IAED,cAAc,CAAC,IAAY;QACzB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpC,wEAAwE;QACxE,mEAAmE;QACnE,8DAA8D;QAC9D,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,gBAAuC;QACnD,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC;QAC7C,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;QAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QAExC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,qCAAqC;QAElE,qCAAqC;QACrC,IAAI,UAAU,GACZ,MAAM,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;QAClD,IAAI,kBAAkB,GAAuB,SAAS,CAAC;QACvD,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAC1B,IAAI,kBAAkB,GAAG,CAAC,CAAC;QAE3B,IAAI,CAAC;YACH,sDAAsD;YACtD,OAAO,CAAC,SAAS,IAAI,WAAW,GAAG,QAAQ,EAAE,CAAC;gBAC5C,MAAM,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBAE3B,MAAM,CAAC;oBACL,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,kBAAkB,WAAW,GAAG,CAAC,IAAI,QAAQ,EAAE;oBACxD,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,CACnC,UAAU,EACV,kBAAkB,EAClB,MAAM,CACP,CAAC;gBACF,gBAAgB,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC;gBAC9C,iBAAiB,IAAI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;gBAChD,kBAAkB,IAAI,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC;gBAErD,0BAA0B;gBAC1B,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;gBAEhC,2BAA2B;gBAC3B,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;gBAE7B,sDAAsD;gBACtD,kBAAkB,GAAG,MAAM,CAAC,UAAU,CAAC;gBAEvC,+DAA+D;gBAC/D,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC;oBACnC,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAC9C,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC5B,UAAU,GAAG;4BACX,GAAG,UAAU;4BACb,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gCAC7B,IAAI,EAAE,MAAe;gCACrB,OAAO,EAAE,IAAI;6BACd,CAAC,CAAC;yBACJ,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,mCAAmC;gBACnC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACnB,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACjC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;gBAChC,CAAC;gBAED,yBAAyB;gBACzB,WAAW,EAAE,CAAC;YAChB,CAAC;YAED,0BAA0B;YAC1B,OAAO;gBACL,OAAO,EAAE,SAAS;gBAClB,OAAO;gBACP,OAAO,EAAE,YAAY;gBACrB,SAAS;gBACT,KAAK,EAAE;oBACL,YAAY,EAAE,gBAAgB;oBAC9B,aAAa,EAAE,iBAAiB;oBAChC,iBAAiB,EAAE,kBAAkB;iBACtC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,MAAM,CAAC;gBACL,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,+BAA+B,YAAY,EAAE;gBACtD,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,OAAO;gBACP,OAAO,EAAE,2BAA2B,YAAY,EAAE;gBAClD,SAAS,EAAE,KAAK;gBAChB,KAAK,EAAE;oBACL,YAAY,EAAE,gBAAgB;oBAC9B,aAAa,EAAE,iBAAiB;oBAChC,iBAAiB,EAAE,kBAAkB;iBACtC;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CACf,UAAoC,EACpC,kBAAsC,EACtC,MAAkC;QAalC,IAAI,CAAC;YACH,8BAA8B;YAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;YACrC,MAAM,KAAK,GAAG;gBACZ,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,YAAY;gBACvC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,aAAa;gBACzC,iBAAiB,EAAE,MAAM,CAAC,KAAK,CAAC,iBAAiB;aAClD,CAAC;YAEF,qCAAqC;YACrC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAC9B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;oBACvC,MAAM,CAAC;wBACL,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,cAAc,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE;wBACnD,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,kCAAkC;YAClC,MAAM,WAAW,GAAkB,EAAE,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;oBACnE,MAAM,CAAC;wBACL,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,qCAAqC,IAAI,CAAC,OAAO,EAAE;wBAC5D,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;oBACxD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;wBAC7B,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACzB,MAAM,CAAC;4BACL,QAAQ,EAAE,OAAO;4BACjB,OAAO,EAAE,+BAA+B,MAAM,CAAC,IAAI,cAAc,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,OAAO,EAAE;4BACnH,KAAK,EAAE,CAAC;yBACT,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;qBAAM,IACL,IAAI,CAAC,IAAI,KAAK,eAAe;oBAC7B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAC7B,CAAC;oBACD,MAAM,CAAC;wBACL,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,wBAAwB,IAAI,CAAC,IAAI,cAAc,IAAI,CAAC,OAAO,EAAE;wBACtE,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;oBACtD,IAAI,MAAM,EAAE,CAAC;wBACX,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;wBACzB,MAAM,CAAC;4BACL,QAAQ,EAAE,OAAO;4BACjB,OAAO,EAAE,sCAAsC,MAAM,CAAC,IAAI,EAAE;4BAC5D,KAAK,EAAE,CAAC;yBACT,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,uBAAuB;YACvB,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;gBAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC5B,MAAM,CAAC;wBACL,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,qBAAqB;wBAC9B,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;oBACH,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;wBAChD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;4BACnC,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gCACnD,OAAO,IAAI,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;gCAC/B,MAAM,CAAC;oCACL,QAAQ,EAAE,OAAO;oCACjB,OAAO,EAAE,iBAAiB,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;oCACtD,KAAK,EAAE,CAAC;iCACT,CAAC,CAAC;4BACL,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,+BAA+B;YAC/B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAE7D,qBAAqB;YACrB,MAAM,SAAS,GACb,MAAM,CAAC,MAAM,KAAK,CAAC;gBACnB,MAAM,CAAC,KAAK,CACV,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,CAC/D,CAAC;YAEJ,OAAO;gBACL,OAAO,EAAE,WAAW;gBACpB,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE;gBACvB,SAAS;gBACT,cAAc;gBACd,UAAU;gBACV,KAAK,EAAE,KAAK;aACb,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,MAAM,CAAC;gBACL,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,yBAAyB,YAAY,EAAE;gBAChD,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YAEH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,IAAkB;QAC3C,OAAO,CACL,IAAI,CAAC,IAAI,KAAK,eAAe;YAC7B,SAAS,IAAI,IAAI;YACjB,CAAC,CAAC,QAAQ,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC;gBACpD,CAAC,SAAS,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CACtD,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,wBAAwB,CACpC,mBAAkC,EAClC,MAAkC;QAElC,IAAI,IAAI,CAAC,yBAAyB,EAAE,CAAC;YACnC,MAAM,CAAC;gBACL,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,sCAAsC,mBAAmB,CAAC,MAAM,cAAc,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC1I,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;YAEH,MAAM,QAAQ,GACZ,MAAM,IAAI,CAAC,yBAAyB,CAAC,mBAAmB,CAAC,CAAC;YAE5D,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;gBAC1B,MAAM,CAAC;oBACL,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,oCAAoC;oBAC7C,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC;gBACH,OAAO,mBAAmB,CAAC;YAC7B,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC;oBACL,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,gCAAgC;oBACzC,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC;gBACH,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,MAAM,CAAC;YACL,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,sBAAsB,mBAAmB,CAAC,MAAM,kBAAkB;YAC3E,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QACH,OAAO,mBAAmB,CAAC;IAC7B,CAAC;IAEO,kBAAkB,CAAC,IAAkB;QAC3C,OAAO,CACL,IAAI,CAAC,IAAI,KAAK,eAAe;YAC7B,SAAS,IAAI,IAAI;YACjB,MAAM,IAAI,IAAI;YACd,WAAW,IAAI,IAAI,CACpB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,uBAAuB,CACnC,WAAmB;QAEnB,MAAM,UAAU,GAA6B,EAAE,CAAC;QAEhD,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAClC,MAAM,aAAa,GAAqB;gBACtC,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,IAAI,CAAC,wBAAwB;aACvC,CAAC;YACF,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,SAAS,GAAsB;YACnC,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,WAAW;SAClB,CAAC;QACF,MAAM,WAAW,GAAkD;YACjE,SAAS;SACV,CAAC;QAEF,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChE,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,eAAe,GAAuB;gBAC1C,IAAI,EAAE,aAAa;gBACnB,SAAS,EAAE,iBAAiB;gBAC5B,MAAM,EAAE,MAAM;aACf,CAAC;YACF,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,WAAW,GAAqB;YACpC,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,WAAW;SACrB,CAAC;QACF,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAE7B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,SAAS,CACb,UAAoC,EACpC,kBAA2B;QAM3B,IAAI,CAAC;YACH,0DAA0D;YAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB;gBAC3C,CAAC,CAAC,EAAE,IAAI,EAAE,UAAmB,EAAE;gBAC/B,CAAC,CAAC;oBACE,IAAI,EAAE,sBAA+B;oBACrC,aAAa,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK;oBACzC,cAAc,EAAE,IAAI,CAAC,eAAe,CAAC,MAAM;oBAC3C,WAAW,EAAE,IAAI,CAAC,WAAW;iBAC9B,CAAC;YAEN,MAAM,aAAa,GAA4B;gBAC7C,KAAK,EAAE,IAAI,CAAC,SAAS;gBACrB,KAAK,EAAE,CAAC,YAAY,CAAC;gBACrB,KAAK,EAAE,UAAU;gBACjB,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;aAC5D,CAAC;YAEF,gCAAgC;YAChC,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpE,IAAI,EAAE,UAAmB;oBACzB,IAAI;oBACJ,QAAQ,EAAE;wBACR,IAAI;wBACJ,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC7B,UAAU,EAAE,IAAI,CAAC,WAAW;qBAC7B;iBACF,CAAC,CAAC,CAAC;gBAEJ,aAAa,CAAC,KAAK,GAAG;oBACpB,GAAI,aAAa,CAAC,KAAmC;oBACrD,GAAG,WAAW;iBACf,CAAC;YACJ,CAAC;YAED,mEAAmE;YACnE,oEAAoE;YACpE,+DAA+D;YAC/D,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACjC,aAAa,CAAC,KAAK,GAAG;oBACpB,GAAI,aAAa,CAAC,KAAmC;oBACrD;wBACE,IAAI,EAAE,UAAmB;wBACzB,IAAI,EAAE,oBAAoB;wBAC1B,QAAQ,EAAE;4BACR,IAAI,EAAE,oBAAoB;4BAC1B,WAAW,EACT,qDAAqD;gCACrD,wDAAwD;gCACxD,4CAA4C;4BAC9C,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;yBAC7D;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,wCAAwC;YACxC,IAAI,kBAAkB,EAAE,CAAC;gBACvB,aAAa,CAAC,oBAAoB,GAAG,kBAAkB,CAAC;YAC1D,CAAC;YAED,kBAAkB;YAClB,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC;YAC9B,UAAU,CAAC,aAAa,CAAC;gBACvB,SAAS,EAAE,YAAY;gBACvB,KAAK,EAAE,IAAI,CAAC,SAAS;gBACrB,MAAM,EAAE,0BAA0B,CAAC,UAAU,CAAC;aAC/C,CAAC,CAAC;YAEH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,qDAAqD;YACrD,qEAAqE;YACrE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YACnE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;YAEtC,kDAAkD;YAClD,MAAM,KAAK,GAAG;gBACZ,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY;gBACzC,aAAa,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa;gBAC3C,iBAAiB,EAAE,SAAS;aAC7B,CAAC;YAEF,mBAAmB;YACnB,UAAU,CAAC,cAAc,CAAC;gBACxB,SAAS,EAAE,YAAY;gBACvB,KAAK,EAAE,IAAI,CAAC,SAAS;gBACrB,MAAM,EAAE,4BAA4B,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACrD,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,YAAY;gBACxC,YAAY,EAAE,QAAQ,CAAC,KAAK,CAAC,aAAa;aAC3C,CAAC,CAAC;YAEH,uCAAuC;YACvC,IAAI,CAAC,cAAc,GAAG,QAAQ,CAAC,EAAE,CAAC;YAElC,oCAAoC;YACpC,OAAO;gBACL,MAAM,EAAE,QAAQ,CAAC,MAAmC;gBACpD,UAAU,EAAE,QAAQ,CAAC,EAAE;gBACvB,KAAK;aACN,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YAC1D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CACd,MAAsB,EACtB,MAAkC;QAElC,MAAM,cAAc,GAAwB,EAAE,CAAC;QAE/C,2BAA2B;QAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnE,yEAAyE;gBACzE,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;oBAExD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;wBACvB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;4BAC7B,MAAM,CAAC;gCACL,QAAQ,EAAE,OAAO;gCACjB,OAAO,EAAE,8BAA8B,MAAM,CAAC,IAAI,EAAE;gCACpD,KAAK,EAAE,CAAC;6BACT,CAAC,CAAC;4BACH,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;wBACnC,CAAC;oBACH,CAAC;oBAED,sDAAsD;oBACtD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAElD,wFAAwF;oBACxF,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB;wBACzC,CAAC,CAAE,qBAA+B;wBAClC,CAAC,CAAE,aAAuB,CAAC;oBAE7B,MAAM,UAAU,GAAG;wBACjB,IAAI,EAAE,sBAA+B;wBACrC,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,MAAM,EAAE;4BACN,IAAI,EAAE,UAAU;4BAChB,SAAS,EAAE,UAAU;4BACrB,GAAG,CAAC,IAAI,CAAC,mBAAmB;gCAC1B,CAAC,CAAC,EAAE,MAAM,EAAE,UAAmB,EAAE;gCACjC,CAAC,CAAC,EAAE,CAAC;yBACR;qBACmB,CAAC;oBAEvB,MAAM,CAAC;wBACL,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,2CAA2C,IAAI,CAAC,OAAO,EAAE;wBAClE,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;oBAEH,wEAAwE;oBACxE,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;wBACjD,MAAM,kBAAkB,GAAG,UAS1B,CAAC;wBACF,kBAAkB,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;oBAC1D,CAAC;oBAED,IACE,IAAI,CAAC,qBAAqB;wBAC1B,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EACrC,CAAC;wBACD,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAC5D,IAAI,CAAC,qBAAqB,EAC1B,MAAM,CACP,CAAC;wBAEF,IAAI,kBAAkB,EAAE,CAAC;4BACvB,MAAM,kBAAkB,GAAG,UAQ1B,CAAC;4BACF,kBAAkB,CAAC,0BAA0B;gCAC3C,kBAAkB,CAAC;wBACvB,CAAC;oBACH,CAAC;oBAED,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;wBAC1C,MAAM,KAAK,CAAC;oBACd,CAAC;oBACD,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAEzD,MAAM,CAAC;wBACL,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,kCAAkC,YAAY,EAAE;wBACzD,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;oBAEH,IAAI,CAAC;wBACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;wBAElD,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB;4BACzC,CAAC,CAAE,qBAA+B;4BAClC,CAAC,CAAE,aAAuB,CAAC;wBAE7B,MAAM,eAAe,GAAG;4BACtB,IAAI,EAAE,sBAA+B;4BACrC,OAAO,EAAE,IAAI,CAAC,OAAO;4BACrB,MAAM,EAAE;gCACN,IAAI,EAAE,UAAU;gCAChB,SAAS,EAAE,UAAU;gCACrB,KAAK,EAAE,YAAY;gCACnB,GAAG,CAAC,IAAI,CAAC,mBAAmB;oCAC1B,CAAC,CAAC,EAAE,MAAM,EAAE,UAAmB,EAAE;oCACjC,CAAC,CAAC,EAAE,CAAC;6BACR;yBACmB,CAAC;wBAEvB,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;4BACjD,MAAM,kBAAkB,GAAG,eAS1B,CAAC;4BACF,kBAAkB,CAAC,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;wBAC1D,CAAC;wBAED,IACE,IAAI,CAAC,qBAAqB;4BAC1B,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EACrC,CAAC;4BACD,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAC5D,IAAI,CAAC,qBAAqB,EAC1B,MAAM,CACP,CAAC;4BAEF,IAAI,kBAAkB,EAAE,CAAC;gCACvB,MAAM,kBAAkB,GAAG,eAQ1B,CAAC;gCACF,kBAAkB,CAAC,0BAA0B;oCAC3C,kBAAkB,CAAC;4BACvB,CAAC;wBACH,CAAC;wBAED,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;oBACvC,CAAC;oBAAC,OAAO,eAAe,EAAE,CAAC;wBACzB,IAAI,eAAe,YAAY,oBAAoB,EAAE,CAAC;4BACpD,MAAM,eAAe,CAAC;wBACxB,CAAC;wBACD,MAAM,CAAC;4BACL,QAAQ,EAAE,OAAO;4BACjB,OAAO,EAAE,+BAA+B,MAAM,CAAC,eAAe,CAAC,EAAE;4BACjE,KAAK,EAAE,CAAC;yBACT,CAAC,CAAC;wBAEH,cAAc,CAAC,IAAI,CAAC;4BAClB,IAAI,EAAE,sBAAsB;4BAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;4BACrB,MAAM,EAAE,UAAU,YAAY,EAAE;yBACZ,CAAC,CAAC;oBAC1B,CAAC;gBACH,CAAC;YACH,CAAC;iBAAM,IACL,IAAI,CAAC,IAAI,KAAK,eAAe;gBAC7B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAC7B,CAAC;gBACD,mEAAmE;gBACnE,gEAAgE;gBAChE,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;oBACvC,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;oBACrC,cAAc,CAAC,IAAI,CAAC;wBAClB,IAAI,EAAE,sBAAsB;wBAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,MAAM,EACJ,+HAA+H;qBAC7G,CAAC,CAAC;oBACxB,SAAS;gBACX,CAAC;gBAED,qCAAqC;gBACrC,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;oBAEtD,IAAI,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;wBACjC,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBACnC,CAAC;oBAED,gCAAgC;oBAChC,IAAI,UAAU,GAAG,4BAA4B,CAAC;oBAC9C,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;wBAC1C,IAAI,CAAC;4BACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;4BACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;4BAExC,MAAM,CAAC;gCACL,QAAQ,EAAE,OAAO;gCACjB,OAAO,EAAE,wBAAwB,IAAI,CAAC,IAAI,eAAe,IAAI,CAAC,SAAS,EAAE;gCACzE,KAAK,EAAE,CAAC;6BACT,CAAC,CAAC;4BAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;gCACtC,UAAU,EAAE,IAAI,CAAC,OAAO;gCACxB,QAAQ,EAAE,EAAE;6BACb,CAAC,CAAC;4BACH,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;4BAEpC,MAAM,CAAC;gCACL,QAAQ,EAAE,OAAO;gCACjB,OAAO,EAAE,QAAQ,IAAI,CAAC,IAAI,oCAAoC,UAAU,EAAE;gCAC1E,KAAK,EAAE,CAAC;6BACT,CAAC,CAAC;wBACL,CAAC;wBAAC,OAAO,SAAS,EAAE,CAAC;4BACnB,MAAM,YAAY,GAChB,SAAS,YAAY,KAAK;gCACxB,CAAC,CAAC,SAAS,CAAC,OAAO;gCACnB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;4BACxB,UAAU,GAAG,yBAAyB,YAAY,EAAE,CAAC;4BAErD,MAAM,CAAC;gCACL,QAAQ,EAAE,OAAO;gCACjB,OAAO,EAAE,wBAAwB,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE;gCAC7D,KAAK,EAAE,CAAC;6BACT,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBAED,qDAAqD;oBACrD,MAAM,UAAU,GAAsB;wBACpC,IAAI,EAAE,sBAAsB;wBAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,MAAM,EAAE,UAAU;qBACnB,CAAC;oBAEF,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBAClC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;wBAC1C,MAAM,KAAK,CAAC;oBACd,CAAC;oBACD,MAAM,YAAY,GAChB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAEzD,MAAM,CAAC;wBACL,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,kCAAkC,YAAY,EAAE;wBACzD,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;oBAEH,yBAAyB;oBACzB,MAAM,eAAe,GAAsB;wBACzC,IAAI,EAAE,sBAAsB;wBAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;wBACrB,MAAM,EAAE,UAAU,YAAY,EAAE;qBACjC,CAAC;oBAEF,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAEO,2BAA2B,CACjC,IAAsB;QAEtB,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAc;YAC3B,GAAG,MAAM;SACV,CAAC;IACJ,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC5C,IAAI,CAAC,mBAAmB,GAAG,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,wBAAwB;QACpC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,4BAA4B,CAAC,IAAsB;QACzD,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,MAAM,CAAC,IAAc;gBAC3B,GAAG,MAAM;aACV,CAAC,CAAC,CAAC;QACN,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChC,CAAC;IAEO,2BAA2B,CACjC,IAAsB;QAEtB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAExC,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI;aACb,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;YAC/D,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAGvB;QACC,oCAAoC;QACpC,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;YACzB,OAAO,yBAAyB,OAAO,CAAC,WAAW,EAAE,CAAC;QACxD,CAAC;QAED,2CAA2C;QAC3C,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACpD,OAAO,yBAAyB,WAAW,EAAE,CAAC;YAChD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;gBACpD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,MAAM,IAAI,4BAA4B,CACpC,yCAAyC;YACvC,iGAAiG,CACpG,CAAC;IACJ,CAAC;CACF","sourcesContent":["import OpenAI from \"openai\";\nimport type {\n EasyInputMessage,\n ResponseInputImage,\n ResponseInputText,\n} from \"openai/resources/responses/responses\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport {\n AgentAction,\n AgentResult,\n AgentType,\n AgentExecutionOptions,\n ResponseInputItem,\n ResponseItem,\n ComputerCallItem,\n FunctionCallItem,\n SafetyCheck,\n SafetyConfirmationHandler,\n} from \"../types/public/agent.js\";\nimport { ClientOptions } from \"../types/public/model.js\";\nimport { AgentClient } from \"./AgentClient.js\";\nimport {\n AgentScreenshotProviderError,\n StagehandClosedError,\n} from \"../types/public/sdkErrors.js\";\nimport { ToolSet } from \"ai\";\nimport {\n FlowLogger,\n extractLlmCuaPromptSummary,\n extractLlmCuaResponseSummary,\n} from \"../flowlogger/FlowLogger.js\";\nimport { v7 as uuidv7 } from \"uuid\";\n\n/**\n * Client for OpenAI's Computer Use Assistant API\n * This implementation uses the official OpenAI Responses API for Computer Use\n */\nconst CAPTCHA_PROCEED_TOOL = \"captchaSolvedProceed\";\n\ntype OpenAIRequestInputItem = ResponseInputItem | EasyInputMessage;\n\nexport class OpenAICUAClient extends AgentClient {\n private pendingContextNotes: string[] = [];\n private captchaSolvedToolActive = false;\n private apiKey: string;\n private organization?: string;\n private baseURL: string;\n private client: OpenAI;\n public lastResponseId?: string;\n private currentViewport = { width: 1288, height: 711 };\n private currentUrl?: string;\n private screenshotProvider?: () => Promise<string>;\n private actionHandler?: (action: AgentAction) => Promise<void>;\n private reasoningItems: Map<string, ResponseItem> = new Map();\n private environment: string = \"browser\"; // \"browser\", \"mac\", \"windows\", or \"ubuntu\"\n private tools?: ToolSet;\n private safetyConfirmationHandler?: SafetyConfirmationHandler;\n\n private get usesNewComputerTool(): boolean {\n return this.modelName.startsWith(\"gpt-5\");\n }\n\n constructor(\n type: AgentType,\n modelName: string,\n userProvidedInstructions?: string,\n clientOptions?: ClientOptions,\n tools?: ToolSet,\n ) {\n super(type, modelName, userProvidedInstructions);\n\n // Process client options\n this.apiKey =\n (clientOptions?.apiKey as string) || process.env.OPENAI_API_KEY || \"\";\n this.baseURL = (clientOptions?.baseURL as string) || undefined;\n this.organization =\n (clientOptions?.organization as string) || process.env.OPENAI_ORG;\n\n // Get environment if specified\n if (\n clientOptions?.environment &&\n typeof clientOptions.environment === \"string\"\n ) {\n this.environment = clientOptions.environment;\n }\n\n // Store client options for reference\n this.clientOptions = {\n apiKey: this.apiKey,\n };\n\n if (this.baseURL) {\n this.clientOptions.baseURL = this.baseURL;\n }\n\n // Initialize the OpenAI client\n this.client = new OpenAI(this.clientOptions);\n\n this.tools = tools;\n }\n\n setViewport(width: number, height: number): void {\n this.currentViewport = { width, height };\n }\n\n setCurrentUrl(url: string): void {\n this.currentUrl = url;\n }\n\n setScreenshotProvider(provider: () => Promise<string>): void {\n this.screenshotProvider = provider;\n }\n\n setActionHandler(handler: (action: AgentAction) => Promise<void>): void {\n this.actionHandler = handler;\n }\n\n setTools(tools: ToolSet): void {\n this.tools = tools;\n }\n\n setSafetyConfirmationHandler(handler?: SafetyConfirmationHandler): void {\n this.safetyConfirmationHandler = handler;\n }\n\n addContextNote(note: string): void {\n this.pendingContextNotes.push(note);\n\n // When a captcha-related note arrives, expose a tool that the model can\n // call instead of asking the user for confirmation. This replaces\n // fragile English-phrase parsing with a structured tool call.\n if (note.toLowerCase().includes(\"captcha\")) {\n this.captchaSolvedToolActive = true;\n }\n }\n\n /**\n * Execute a task with the OpenAI CUA\n * This is the main entry point for the agent\n * @implements AgentClient.execute\n */\n async execute(executionOptions: AgentExecutionOptions): Promise<AgentResult> {\n const { options, logger } = executionOptions;\n const { instruction } = options;\n const maxSteps = options.maxSteps || 10;\n\n let currentStep = 0;\n let completed = false;\n const actions: AgentAction[] = [];\n const messageList: string[] = [];\n let finalMessage = \"\";\n this.reasoningItems.clear(); // Clear any previous reasoning items\n\n // Start with the initial instruction\n let inputItems: OpenAIRequestInputItem[] =\n await this.createInitialInputItems(instruction);\n let previousResponseId: string | undefined = undefined;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalInferenceTime = 0;\n\n try {\n // Execute steps until completion or max steps reached\n while (!completed && currentStep < maxSteps) {\n await this.preStepHook?.();\n\n logger({\n category: \"agent\",\n message: `Executing step ${currentStep + 1}/${maxSteps}`,\n level: 1,\n });\n\n const result = await this.executeStep(\n inputItems,\n previousResponseId,\n logger,\n );\n totalInputTokens += result.usage.input_tokens;\n totalOutputTokens += result.usage.output_tokens;\n totalInferenceTime += result.usage.inference_time_ms;\n\n // Add actions to the list\n actions.push(...result.actions);\n\n // Update completion status\n completed = result.completed;\n\n // Store the previous response ID for the next request\n previousResponseId = result.responseId;\n\n // Update the input items for the next step if we're continuing\n if (!completed) {\n inputItems = result.nextInputItems;\n const contextNotes = this.drainContextNotes();\n if (contextNotes.length > 0) {\n inputItems = [\n ...inputItems,\n ...contextNotes.map((note) => ({\n role: \"user\" as const,\n content: note,\n })),\n ];\n }\n }\n\n // Record any message for this step\n if (result.message) {\n messageList.push(result.message);\n finalMessage = result.message;\n }\n\n // Increment step counter\n currentStep++;\n }\n\n // Return the final result\n return {\n success: completed,\n actions,\n message: finalMessage,\n completed,\n usage: {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n inference_time_ms: totalInferenceTime,\n },\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger({\n category: \"agent\",\n message: `Error executing agent task: ${errorMessage}`,\n level: 0,\n });\n\n return {\n success: false,\n actions,\n message: `Failed to execute task: ${errorMessage}`,\n completed: false,\n usage: {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n inference_time_ms: totalInferenceTime,\n },\n };\n }\n }\n\n /**\n * Execute a single step of the agent\n * This coordinates the flow: Request → Get Action → Execute Action\n */\n async executeStep(\n inputItems: OpenAIRequestInputItem[],\n previousResponseId: string | undefined,\n logger: (message: LogLine) => void,\n ): Promise<{\n actions: AgentAction[];\n message: string;\n completed: boolean;\n nextInputItems: ResponseInputItem[];\n responseId: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n inference_time_ms: number;\n };\n }> {\n try {\n // Get response from the model\n const result = await this.getAction(inputItems, previousResponseId);\n const output = result.output;\n const responseId = result.responseId;\n const usage = {\n input_tokens: result.usage.input_tokens,\n output_tokens: result.usage.output_tokens,\n inference_time_ms: result.usage.inference_time_ms,\n };\n\n // Add any reasoning items to our map\n for (const item of output) {\n if (item.type === \"reasoning\") {\n this.reasoningItems.set(item.id, item);\n logger({\n category: \"agent\",\n message: `Reasoning: ${String(item.content || \"\")}`,\n level: 1,\n });\n }\n }\n\n // Extract actions from the output\n const stepActions: AgentAction[] = [];\n for (const item of output) {\n if (item.type === \"computer_call\" && this.isComputerCallItem(item)) {\n logger({\n category: \"agent\",\n message: `Found computer_call with call_id: ${item.call_id}`,\n level: 2,\n });\n const actions = this.convertComputerCallToActions(item);\n for (const action of actions) {\n stepActions.push(action);\n logger({\n category: \"agent\",\n message: `Found computer_call action: ${action.type}, payload: ${JSON.stringify(action)}, call_id: ${item.call_id}`,\n level: 2,\n });\n }\n } else if (\n item.type === \"function_call\" &&\n this.isFunctionCallItem(item)\n ) {\n logger({\n category: \"agent\",\n message: `Found function_call: ${item.name}, call_id: ${item.call_id}`,\n level: 2,\n });\n const action = this.convertFunctionCallToAction(item);\n if (action) {\n stepActions.push(action);\n logger({\n category: \"agent\",\n message: `Converted function_call to action: ${action.type}`,\n level: 2,\n });\n }\n }\n }\n\n // Extract message text\n let message = \"\";\n for (const item of output) {\n if (item.type === \"message\") {\n logger({\n category: \"agent\",\n message: `Found message block`,\n level: 2,\n });\n if (item.content && Array.isArray(item.content)) {\n for (const content of item.content) {\n if (content.type === \"output_text\" && content.text) {\n message += content.text + \"\\n\";\n logger({\n category: \"agent\",\n message: `Message text: ${String(content.text || \"\")}`,\n level: 1,\n });\n }\n }\n }\n }\n }\n\n // Take actions and get results\n const nextInputItems = await this.takeAction(output, logger);\n\n // Check if completed\n const completed =\n output.length === 0 ||\n output.every(\n (item) => item.type === \"message\" || item.type === \"reasoning\",\n );\n\n return {\n actions: stepActions,\n message: message.trim(),\n completed,\n nextInputItems,\n responseId,\n usage: usage,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger({\n category: \"agent\",\n message: `Error executing step: ${errorMessage}`,\n level: 0,\n });\n\n throw error;\n }\n }\n\n private isComputerCallItem(item: ResponseItem): item is ComputerCallItem {\n return (\n item.type === \"computer_call\" &&\n \"call_id\" in item &&\n ((\"action\" in item && typeof item.action === \"object\") ||\n (\"actions\" in item && Array.isArray(item.actions)))\n );\n }\n\n private async handleSafetyConfirmation(\n pendingSafetyChecks: SafetyCheck[],\n logger: (message: LogLine) => void,\n ): Promise<SafetyCheck[] | undefined> {\n if (this.safetyConfirmationHandler) {\n logger({\n category: \"agent\",\n message: `Requesting safety confirmation for ${pendingSafetyChecks.length} check(s): ${pendingSafetyChecks.map((c) => c.code).join(\", \")}`,\n level: 1,\n });\n\n const response =\n await this.safetyConfirmationHandler(pendingSafetyChecks);\n\n if (response.acknowledged) {\n logger({\n category: \"agent\",\n message: `Safety checks acknowledged by user`,\n level: 1,\n });\n return pendingSafetyChecks;\n } else {\n logger({\n category: \"agent\",\n message: `Safety checks rejected by user`,\n level: 1,\n });\n return undefined;\n }\n }\n\n logger({\n category: \"agent\",\n message: `Auto-acknowledging ${pendingSafetyChecks.length} safety check(s)`,\n level: 2,\n });\n return pendingSafetyChecks;\n }\n\n private isFunctionCallItem(item: ResponseItem): item is FunctionCallItem {\n return (\n item.type === \"function_call\" &&\n \"call_id\" in item &&\n \"name\" in item &&\n \"arguments\" in item\n );\n }\n\n private async createInitialInputItems(\n instruction: string,\n ): Promise<OpenAIRequestInputItem[]> {\n const inputItems: OpenAIRequestInputItem[] = [];\n\n if (this.userProvidedInstructions) {\n const systemMessage: EasyInputMessage = {\n role: \"system\",\n content: this.userProvidedInstructions,\n };\n inputItems.push(systemMessage);\n }\n\n const textInput: ResponseInputText = {\n type: \"input_text\",\n text: instruction,\n };\n const userContent: Array<ResponseInputText | ResponseInputImage> = [\n textInput,\n ];\n\n const initialScreenshot = await this.captureInitialScreenshot();\n if (initialScreenshot) {\n const screenshotInput: ResponseInputImage = {\n type: \"input_image\",\n image_url: initialScreenshot,\n detail: \"high\",\n };\n userContent.push(screenshotInput);\n }\n\n const userMessage: EasyInputMessage = {\n role: \"user\",\n content: userContent,\n };\n inputItems.push(userMessage);\n\n return inputItems;\n }\n\n async getAction(\n inputItems: OpenAIRequestInputItem[],\n previousResponseId?: string,\n ): Promise<{\n output: ResponseItem[];\n responseId: string;\n usage: Record<string, number>;\n }> {\n try {\n // Create the request parameters, branching on tool format\n const computerTool = this.usesNewComputerTool\n ? { type: \"computer\" as const }\n : {\n type: \"computer_use_preview\" as const,\n display_width: this.currentViewport.width,\n display_height: this.currentViewport.height,\n environment: this.environment,\n };\n\n const requestParams: Record<string, unknown> = {\n model: this.modelName,\n tools: [computerTool],\n input: inputItems,\n ...(this.usesNewComputerTool ? {} : { truncation: \"auto\" }),\n };\n\n // Add custom tools if available\n if (this.tools && Object.keys(this.tools).length > 0) {\n const customTools = Object.entries(this.tools).map(([name, tool]) => ({\n type: \"function\" as const,\n name,\n function: {\n name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n\n requestParams.tools = [\n ...(requestParams.tools as Record<string, unknown>[]),\n ...customTools,\n ];\n }\n\n // When a captcha was just solved, expose a tool the model can call\n // to confirm it should proceed. This avoids fragile English-phrase\n // parsing and works regardless of the model's output language.\n if (this.captchaSolvedToolActive) {\n requestParams.tools = [\n ...(requestParams.tools as Record<string, unknown>[]),\n {\n type: \"function\" as const,\n name: CAPTCHA_PROCEED_TOOL,\n function: {\n name: CAPTCHA_PROCEED_TOOL,\n description:\n \"The captcha on this page was solved automatically. \" +\n \"Call this tool to confirm and continue with your task \" +\n \"instead of asking the user for permission.\",\n parameters: { type: \"object\", properties: {}, required: [] },\n },\n },\n ];\n }\n\n // Add previous_response_id if available\n if (previousResponseId) {\n requestParams.previous_response_id = previousResponseId;\n }\n\n // Log LLM request\n const llmRequestId = uuidv7();\n FlowLogger.logLlmRequest({\n requestId: llmRequestId,\n model: this.modelName,\n prompt: extractLlmCuaPromptSummary(inputItems),\n });\n\n const startTime = Date.now();\n // Create the response using the OpenAI Responses API\n // @ts-expect-error - Force type to match what the OpenAI SDK expects\n const response = await this.client.responses.create(requestParams);\n const endTime = Date.now();\n const elapsedMs = endTime - startTime;\n\n // Extract only the input_tokens and output_tokens\n const usage = {\n input_tokens: response.usage.input_tokens,\n output_tokens: response.usage.output_tokens,\n inference_time_ms: elapsedMs,\n };\n\n // Log LLM response\n FlowLogger.logLlmResponse({\n requestId: llmRequestId,\n model: this.modelName,\n output: extractLlmCuaResponseSummary(response.output),\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n });\n\n // Store the response ID for future use\n this.lastResponseId = response.id;\n\n // Return the output and response ID\n return {\n output: response.output as unknown as ResponseItem[],\n responseId: response.id,\n usage,\n };\n } catch (error) {\n console.error(\"Error getting action from OpenAI:\", error);\n throw error;\n }\n }\n\n async takeAction(\n output: ResponseItem[],\n logger: (message: LogLine) => void,\n ): Promise<ResponseInputItem[]> {\n const nextInputItems: ResponseInputItem[] = [];\n\n // Process each output item\n for (const item of output) {\n if (item.type === \"computer_call\" && this.isComputerCallItem(item)) {\n // Handle computer calls (both single-action and batched-actions formats)\n try {\n const actions = this.convertComputerCallToActions(item);\n\n if (this.actionHandler) {\n for (const action of actions) {\n logger({\n category: \"agent\",\n message: `Executing computer action: ${action.type}`,\n level: 1,\n });\n await this.actionHandler(action);\n }\n }\n\n // Capture a screenshot after all actions in the batch\n const screenshot = await this.captureScreenshot();\n\n // Build the output — use \"computer_screenshot\" for new format, \"input_image\" for legacy\n const outputType = this.usesNewComputerTool\n ? (\"computer_screenshot\" as const)\n : (\"input_image\" as const);\n\n const outputItem = {\n type: \"computer_call_output\" as const,\n call_id: item.call_id,\n output: {\n type: outputType,\n image_url: screenshot,\n ...(this.usesNewComputerTool\n ? { detail: \"original\" as const }\n : {}),\n },\n } as ResponseInputItem;\n\n logger({\n category: \"agent\",\n message: `Added computer_call_output for call_id: ${item.call_id}`,\n level: 2,\n });\n\n // Legacy format supports current_url on the output; new format does not\n if (!this.usesNewComputerTool && this.currentUrl) {\n const computerCallOutput = outputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\" | \"computer_screenshot\";\n image_url: string;\n current_url?: string;\n };\n acknowledged_safety_checks?: SafetyCheck[];\n };\n computerCallOutput.output.current_url = this.currentUrl;\n }\n\n if (\n item.pending_safety_checks &&\n item.pending_safety_checks.length > 0\n ) {\n const acknowledgedChecks = await this.handleSafetyConfirmation(\n item.pending_safety_checks,\n logger,\n );\n\n if (acknowledgedChecks) {\n const computerCallOutput = outputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\" | \"computer_screenshot\";\n image_url: string;\n };\n acknowledged_safety_checks?: SafetyCheck[];\n };\n computerCallOutput.acknowledged_safety_checks =\n acknowledgedChecks;\n }\n }\n\n nextInputItems.push(outputItem);\n } catch (error) {\n if (error instanceof StagehandClosedError) {\n throw error;\n }\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n logger({\n category: \"agent\",\n message: `Error executing computer call: ${errorMessage}`,\n level: 0,\n });\n\n try {\n const screenshot = await this.captureScreenshot();\n\n const outputType = this.usesNewComputerTool\n ? (\"computer_screenshot\" as const)\n : (\"input_image\" as const);\n\n const errorOutputItem = {\n type: \"computer_call_output\" as const,\n call_id: item.call_id,\n output: {\n type: outputType,\n image_url: screenshot,\n error: errorMessage,\n ...(this.usesNewComputerTool\n ? { detail: \"original\" as const }\n : {}),\n },\n } as ResponseInputItem;\n\n if (!this.usesNewComputerTool && this.currentUrl) {\n const computerCallOutput = errorOutputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\" | \"computer_screenshot\";\n image_url: string;\n current_url?: string;\n };\n acknowledged_safety_checks?: SafetyCheck[];\n };\n computerCallOutput.output.current_url = this.currentUrl;\n }\n\n if (\n item.pending_safety_checks &&\n item.pending_safety_checks.length > 0\n ) {\n const acknowledgedChecks = await this.handleSafetyConfirmation(\n item.pending_safety_checks,\n logger,\n );\n\n if (acknowledgedChecks) {\n const computerCallOutput = errorOutputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\" | \"computer_screenshot\";\n image_url: string;\n };\n acknowledged_safety_checks?: SafetyCheck[];\n };\n computerCallOutput.acknowledged_safety_checks =\n acknowledgedChecks;\n }\n }\n\n nextInputItems.push(errorOutputItem);\n } catch (screenshotError) {\n if (screenshotError instanceof StagehandClosedError) {\n throw screenshotError;\n }\n logger({\n category: \"agent\",\n message: `Error capturing screenshot: ${String(screenshotError)}`,\n level: 0,\n });\n\n nextInputItems.push({\n type: \"computer_call_output\",\n call_id: item.call_id,\n output: `Error: ${errorMessage}`,\n } as ResponseInputItem);\n }\n }\n } else if (\n item.type === \"function_call\" &&\n this.isFunctionCallItem(item)\n ) {\n // Handle the captcha-proceed tool — just return a confirmation and\n // deactivate the tool so it doesn't appear on subsequent steps.\n if (item.name === CAPTCHA_PROCEED_TOOL) {\n this.captchaSolvedToolActive = false;\n nextInputItems.push({\n type: \"function_call_output\",\n call_id: item.call_id,\n output:\n \"Confirmed. The captcha is solved. Continue completing the original task autonomously without asking for further confirmation.\",\n } as ResponseInputItem);\n continue;\n }\n\n // Handle function calls (tool calls)\n try {\n const action = this.convertFunctionCallToAction(item);\n\n if (action && this.actionHandler) {\n await this.actionHandler(action);\n }\n\n // Execute the tool if available\n let toolResult = \"Tool executed successfully\";\n if (this.tools && item.name in this.tools) {\n try {\n const tool = this.tools[item.name];\n const args = JSON.parse(item.arguments);\n\n logger({\n category: \"agent\",\n message: `Executing tool call: ${item.name} with args: ${item.arguments}`,\n level: 1,\n });\n\n const result = await tool.execute(args, {\n toolCallId: item.call_id,\n messages: [],\n });\n toolResult = JSON.stringify(result);\n\n logger({\n category: \"agent\",\n message: `Tool ${item.name} completed successfully. Result: ${toolResult}`,\n level: 1,\n });\n } catch (toolError) {\n const errorMessage =\n toolError instanceof Error\n ? toolError.message\n : String(toolError);\n toolResult = `Error executing tool: ${errorMessage}`;\n\n logger({\n category: \"agent\",\n message: `Error executing tool ${item.name}: ${errorMessage}`,\n level: 0,\n });\n }\n }\n\n // Create a function_call_output for the next request\n const outputItem: ResponseInputItem = {\n type: \"function_call_output\",\n call_id: item.call_id,\n output: toolResult,\n };\n\n nextInputItems.push(outputItem);\n } catch (error) {\n if (error instanceof StagehandClosedError) {\n throw error;\n }\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n logger({\n category: \"agent\",\n message: `Error executing function call: ${errorMessage}`,\n level: 0,\n });\n\n // Send error result back\n const errorOutputItem: ResponseInputItem = {\n type: \"function_call_output\",\n call_id: item.call_id,\n output: `Error: ${errorMessage}`,\n };\n\n nextInputItems.push(errorOutputItem);\n }\n }\n }\n\n return nextInputItems;\n }\n\n private convertComputerCallToAction(\n call: ComputerCallItem,\n ): AgentAction | null {\n const { action } = call;\n if (!action) return null;\n\n return {\n type: action.type as string,\n ...action,\n };\n }\n\n private drainContextNotes(): string[] {\n if (this.pendingContextNotes.length === 0) {\n return [];\n }\n\n const notes = [...this.pendingContextNotes];\n this.pendingContextNotes = [];\n return notes;\n }\n\n private async captureInitialScreenshot(): Promise<string | undefined> {\n if (!this.screenshotProvider) {\n return undefined;\n }\n\n try {\n return await this.captureScreenshot();\n } catch {\n return undefined;\n }\n }\n\n private convertComputerCallToActions(call: ComputerCallItem): AgentAction[] {\n if (call.actions && Array.isArray(call.actions)) {\n return call.actions.map((action) => ({\n type: action.type as string,\n ...action,\n }));\n }\n\n const single = this.convertComputerCallToAction(call);\n return single ? [single] : [];\n }\n\n private convertFunctionCallToAction(\n call: FunctionCallItem,\n ): AgentAction | null {\n try {\n const args = JSON.parse(call.arguments);\n\n return {\n type: call.name,\n params: args,\n };\n } catch (error) {\n console.error(\"Error parsing function call arguments:\", error);\n return null;\n }\n }\n\n async captureScreenshot(options?: {\n base64Image?: string;\n currentUrl?: string;\n }): Promise<string> {\n // Use provided options if available\n if (options?.base64Image) {\n return `data:image/png;base64,${options.base64Image}`;\n }\n\n // Use the screenshot provider if available\n if (this.screenshotProvider) {\n try {\n const base64Image = await this.screenshotProvider();\n return `data:image/png;base64,${base64Image}`;\n } catch (error) {\n console.error(\"Error capturing screenshot:\", error);\n throw error;\n }\n }\n\n throw new AgentScreenshotProviderError(\n \"`screenshotProvider` has not been set. \" +\n \"Please call `setScreenshotProvider()` with a valid function that returns a base64-encoded image\",\n );\n }\n}\n"]}
1
+ {"version":3,"file":"OpenAICUAClient.js","sourceRoot":"","sources":["../../../../../lib/v3/agent/OpenAICUAClient.ts"],"names":[],"mappings":"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","sourcesContent":["import OpenAI from \"openai\";\nimport type {\n EasyInputMessage,\n ResponseInputImage,\n ResponseInputText,\n} from \"openai/resources/responses/responses\";\nimport { LogLine } from \"../types/public/logs.js\";\nimport {\n AgentAction,\n AgentResult,\n AgentType,\n AgentExecutionOptions,\n ResponseInputItem,\n ResponseItem,\n ComputerCallItem,\n FunctionCallItem,\n SafetyCheck,\n SafetyConfirmationHandler,\n ScreenshotProviderResult,\n} from \"../types/public/agent.js\";\nimport { ClientOptions } from \"../types/public/model.js\";\nimport { AgentClient } from \"./AgentClient.js\";\nimport {\n AgentScreenshotProviderError,\n StagehandClosedError,\n} from \"../types/public/sdkErrors.js\";\nimport { ToolSet } from \"ai\";\nimport {\n FlowLogger,\n extractLlmCuaPromptSummary,\n extractLlmCuaResponseSummary,\n} from \"../flowlogger/FlowLogger.js\";\nimport { v7 as uuidv7 } from \"uuid\";\n\n/**\n * Client for OpenAI's Computer Use Assistant API\n * This implementation uses the official OpenAI Responses API for Computer Use\n */\nconst CAPTCHA_PROCEED_TOOL = \"captchaSolvedProceed\";\n\ntype OpenAIRequestInputItem = ResponseInputItem | EasyInputMessage;\n\nexport class OpenAICUAClient extends AgentClient {\n private pendingContextNotes: string[] = [];\n private captchaSolvedToolActive = false;\n private apiKey: string;\n private organization?: string;\n private baseURL: string;\n private client: OpenAI;\n public lastResponseId?: string;\n private currentViewport = { width: 1288, height: 711 };\n private currentUrl?: string;\n private screenshotProvider?: () => Promise<ScreenshotProviderResult>;\n private actionHandler?: (action: AgentAction) => Promise<void>;\n private reasoningItems: Map<string, ResponseItem> = new Map();\n private environment: string = \"browser\"; // \"browser\", \"mac\", \"windows\", or \"ubuntu\"\n private tools?: ToolSet;\n private safetyConfirmationHandler?: SafetyConfirmationHandler;\n\n private get usesNewComputerTool(): boolean {\n return this.modelName.startsWith(\"gpt-5\");\n }\n\n constructor(\n type: AgentType,\n modelName: string,\n userProvidedInstructions?: string,\n clientOptions?: ClientOptions,\n tools?: ToolSet,\n ) {\n super(type, modelName, userProvidedInstructions);\n\n // Process client options\n this.apiKey =\n (clientOptions?.apiKey as string) || process.env.OPENAI_API_KEY || \"\";\n this.baseURL = (clientOptions?.baseURL as string) || undefined;\n this.organization =\n (clientOptions?.organization as string) || process.env.OPENAI_ORG;\n\n // Get environment if specified\n if (\n clientOptions?.environment &&\n typeof clientOptions.environment === \"string\"\n ) {\n this.environment = clientOptions.environment;\n }\n\n // Store client options for reference\n this.clientOptions = {\n apiKey: this.apiKey,\n };\n\n if (this.baseURL) {\n this.clientOptions.baseURL = this.baseURL;\n }\n\n // Initialize the OpenAI client\n this.client = new OpenAI(this.clientOptions);\n\n this.tools = tools;\n }\n\n setViewport(width: number, height: number): void {\n this.currentViewport = { width, height };\n }\n\n setCurrentUrl(url: string): void {\n this.currentUrl = url;\n }\n\n setScreenshotProvider(\n provider: () => Promise<ScreenshotProviderResult>,\n ): void {\n this.screenshotProvider = provider;\n }\n\n setActionHandler(handler: (action: AgentAction) => Promise<void>): void {\n this.actionHandler = handler;\n }\n\n setTools(tools: ToolSet): void {\n this.tools = tools;\n }\n\n setSafetyConfirmationHandler(handler?: SafetyConfirmationHandler): void {\n this.safetyConfirmationHandler = handler;\n }\n\n addContextNote(note: string): void {\n this.pendingContextNotes.push(note);\n\n // When a captcha-related note arrives, expose a tool that the model can\n // call instead of asking the user for confirmation. This replaces\n // fragile English-phrase parsing with a structured tool call.\n if (note.toLowerCase().includes(\"captcha\")) {\n this.captchaSolvedToolActive = true;\n }\n }\n\n /**\n * Execute a task with the OpenAI CUA\n * This is the main entry point for the agent\n * @implements AgentClient.execute\n */\n async execute(executionOptions: AgentExecutionOptions): Promise<AgentResult> {\n const { options, logger } = executionOptions;\n const { instruction } = options;\n const maxSteps = options.maxSteps || 10;\n\n let currentStep = 0;\n let completed = false;\n const actions: AgentAction[] = [];\n const messageList: string[] = [];\n let finalMessage = \"\";\n this.reasoningItems.clear(); // Clear any previous reasoning items\n\n // Start with the initial instruction\n let inputItems: OpenAIRequestInputItem[] =\n await this.createInitialInputItems(instruction);\n let previousResponseId: string | undefined = undefined;\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let totalInferenceTime = 0;\n\n try {\n // Execute steps until completion or max steps reached\n while (!completed && currentStep < maxSteps) {\n await this.preStepHook?.();\n\n logger({\n category: \"agent\",\n message: `Executing step ${currentStep + 1}/${maxSteps}`,\n level: 1,\n });\n\n const result = await this.executeStep(\n inputItems,\n previousResponseId,\n logger,\n );\n totalInputTokens += result.usage.input_tokens;\n totalOutputTokens += result.usage.output_tokens;\n totalInferenceTime += result.usage.inference_time_ms;\n\n // Add actions to the list\n actions.push(...result.actions);\n\n // Update completion status\n completed = result.completed;\n\n // Store the previous response ID for the next request\n previousResponseId = result.responseId;\n\n // Update the input items for the next step if we're continuing\n if (!completed) {\n inputItems = result.nextInputItems;\n const contextNotes = this.drainContextNotes();\n if (contextNotes.length > 0) {\n inputItems = [\n ...inputItems,\n ...contextNotes.map((note) => ({\n role: \"user\" as const,\n content: note,\n })),\n ];\n }\n }\n\n // Record any message for this step\n if (result.message) {\n messageList.push(result.message);\n finalMessage = result.message;\n }\n\n // Increment step counter\n currentStep++;\n }\n\n // Return the final result\n return {\n success: completed,\n actions,\n message: finalMessage,\n completed,\n usage: {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n inference_time_ms: totalInferenceTime,\n },\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger({\n category: \"agent\",\n message: `Error executing agent task: ${errorMessage}`,\n level: 0,\n });\n\n return {\n success: false,\n actions,\n message: `Failed to execute task: ${errorMessage}`,\n completed: false,\n usage: {\n input_tokens: totalInputTokens,\n output_tokens: totalOutputTokens,\n inference_time_ms: totalInferenceTime,\n },\n };\n }\n }\n\n /**\n * Execute a single step of the agent\n * This coordinates the flow: Request → Get Action → Execute Action\n */\n async executeStep(\n inputItems: OpenAIRequestInputItem[],\n previousResponseId: string | undefined,\n logger: (message: LogLine) => void,\n ): Promise<{\n actions: AgentAction[];\n message: string;\n completed: boolean;\n nextInputItems: ResponseInputItem[];\n responseId: string;\n usage: {\n input_tokens: number;\n output_tokens: number;\n inference_time_ms: number;\n };\n }> {\n try {\n // Get response from the model\n const result = await this.getAction(inputItems, previousResponseId);\n const output = result.output;\n const responseId = result.responseId;\n const usage = {\n input_tokens: result.usage.input_tokens,\n output_tokens: result.usage.output_tokens,\n inference_time_ms: result.usage.inference_time_ms,\n };\n\n // Add any reasoning items to our map\n for (const item of output) {\n if (item.type === \"reasoning\") {\n this.reasoningItems.set(item.id, item);\n logger({\n category: \"agent\",\n message: `Reasoning: ${String(item.content || \"\")}`,\n level: 1,\n });\n }\n }\n\n // Extract actions from the output\n const stepActions: AgentAction[] = [];\n for (const item of output) {\n if (item.type === \"computer_call\" && this.isComputerCallItem(item)) {\n logger({\n category: \"agent\",\n message: `Found computer_call with call_id: ${item.call_id}`,\n level: 2,\n });\n const actions = this.convertComputerCallToActions(item);\n for (const action of actions) {\n stepActions.push(action);\n logger({\n category: \"agent\",\n message: `Found computer_call action: ${action.type}, payload: ${JSON.stringify(action)}, call_id: ${item.call_id}`,\n level: 2,\n });\n }\n } else if (\n item.type === \"function_call\" &&\n this.isFunctionCallItem(item)\n ) {\n logger({\n category: \"agent\",\n message: `Found function_call: ${item.name}, call_id: ${item.call_id}`,\n level: 2,\n });\n const action = this.convertFunctionCallToAction(item);\n if (action) {\n stepActions.push(action);\n logger({\n category: \"agent\",\n message: `Converted function_call to action: ${action.type}`,\n level: 2,\n });\n }\n }\n }\n\n // Extract message text\n let message = \"\";\n for (const item of output) {\n if (item.type === \"message\") {\n logger({\n category: \"agent\",\n message: `Found message block`,\n level: 2,\n });\n if (item.content && Array.isArray(item.content)) {\n for (const content of item.content) {\n if (content.type === \"output_text\" && content.text) {\n message += content.text + \"\\n\";\n logger({\n category: \"agent\",\n message: `Message text: ${String(content.text || \"\")}`,\n level: 1,\n });\n }\n }\n }\n }\n }\n\n // Take actions and get results\n const nextInputItems = await this.takeAction(output, logger);\n\n // Check if completed\n const completed =\n output.length === 0 ||\n output.every(\n (item) => item.type === \"message\" || item.type === \"reasoning\",\n );\n\n return {\n actions: stepActions,\n message: message.trim(),\n completed,\n nextInputItems,\n responseId,\n usage: usage,\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n logger({\n category: \"agent\",\n message: `Error executing step: ${errorMessage}`,\n level: 0,\n });\n\n throw error;\n }\n }\n\n private isComputerCallItem(item: ResponseItem): item is ComputerCallItem {\n return (\n item.type === \"computer_call\" &&\n \"call_id\" in item &&\n ((\"action\" in item && typeof item.action === \"object\") ||\n (\"actions\" in item && Array.isArray(item.actions)))\n );\n }\n\n private async handleSafetyConfirmation(\n pendingSafetyChecks: SafetyCheck[],\n logger: (message: LogLine) => void,\n ): Promise<SafetyCheck[] | undefined> {\n if (this.safetyConfirmationHandler) {\n logger({\n category: \"agent\",\n message: `Requesting safety confirmation for ${pendingSafetyChecks.length} check(s): ${pendingSafetyChecks.map((c) => c.code).join(\", \")}`,\n level: 1,\n });\n\n const response =\n await this.safetyConfirmationHandler(pendingSafetyChecks);\n\n if (response.acknowledged) {\n logger({\n category: \"agent\",\n message: `Safety checks acknowledged by user`,\n level: 1,\n });\n return pendingSafetyChecks;\n } else {\n logger({\n category: \"agent\",\n message: `Safety checks rejected by user`,\n level: 1,\n });\n return undefined;\n }\n }\n\n logger({\n category: \"agent\",\n message: `Auto-acknowledging ${pendingSafetyChecks.length} safety check(s)`,\n level: 2,\n });\n return pendingSafetyChecks;\n }\n\n private isFunctionCallItem(item: ResponseItem): item is FunctionCallItem {\n return (\n item.type === \"function_call\" &&\n \"call_id\" in item &&\n \"name\" in item &&\n \"arguments\" in item\n );\n }\n\n private async createInitialInputItems(\n instruction: string,\n ): Promise<OpenAIRequestInputItem[]> {\n const inputItems: OpenAIRequestInputItem[] = [];\n\n if (this.userProvidedInstructions) {\n const systemMessage: EasyInputMessage = {\n role: \"system\",\n content: this.userProvidedInstructions,\n };\n inputItems.push(systemMessage);\n }\n\n const textInput: ResponseInputText = {\n type: \"input_text\",\n text: instruction,\n };\n const userContent: Array<ResponseInputText | ResponseInputImage> = [\n textInput,\n ];\n\n const initialScreenshot = await this.captureInitialScreenshot();\n if (initialScreenshot) {\n const screenshotInput: ResponseInputImage = {\n type: \"input_image\",\n image_url: this.toDataUrl(initialScreenshot),\n detail: \"high\",\n };\n userContent.push(screenshotInput);\n }\n\n const userMessage: EasyInputMessage = {\n role: \"user\",\n content: userContent,\n };\n inputItems.push(userMessage);\n\n return inputItems;\n }\n\n async getAction(\n inputItems: OpenAIRequestInputItem[],\n previousResponseId?: string,\n ): Promise<{\n output: ResponseItem[];\n responseId: string;\n usage: Record<string, number>;\n }> {\n try {\n // Create the request parameters, branching on tool format\n const computerTool = this.usesNewComputerTool\n ? { type: \"computer\" as const }\n : {\n type: \"computer_use_preview\" as const,\n display_width: this.currentViewport.width,\n display_height: this.currentViewport.height,\n environment: this.environment,\n };\n\n const requestParams: Record<string, unknown> = {\n model: this.modelName,\n tools: [computerTool],\n input: inputItems,\n ...(this.usesNewComputerTool ? {} : { truncation: \"auto\" }),\n };\n\n // Add custom tools if available\n if (this.tools && Object.keys(this.tools).length > 0) {\n const customTools = Object.entries(this.tools).map(([name, tool]) => ({\n type: \"function\" as const,\n name,\n function: {\n name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n\n requestParams.tools = [\n ...(requestParams.tools as Record<string, unknown>[]),\n ...customTools,\n ];\n }\n\n // When a captcha was just solved, expose a tool the model can call\n // to confirm it should proceed. This avoids fragile English-phrase\n // parsing and works regardless of the model's output language.\n if (this.captchaSolvedToolActive) {\n requestParams.tools = [\n ...(requestParams.tools as Record<string, unknown>[]),\n {\n type: \"function\" as const,\n name: CAPTCHA_PROCEED_TOOL,\n function: {\n name: CAPTCHA_PROCEED_TOOL,\n description:\n \"The captcha on this page was solved automatically. \" +\n \"Call this tool to confirm and continue with your task \" +\n \"instead of asking the user for permission.\",\n parameters: { type: \"object\", properties: {}, required: [] },\n },\n },\n ];\n }\n\n // Add previous_response_id if available\n if (previousResponseId) {\n requestParams.previous_response_id = previousResponseId;\n }\n\n // Log LLM request\n const llmRequestId = uuidv7();\n FlowLogger.logLlmRequest({\n requestId: llmRequestId,\n model: this.modelName,\n prompt: extractLlmCuaPromptSummary(inputItems),\n });\n\n const startTime = Date.now();\n // Create the response using the OpenAI Responses API\n // @ts-expect-error - Force type to match what the OpenAI SDK expects\n const response = await this.client.responses.create(requestParams);\n const endTime = Date.now();\n const elapsedMs = endTime - startTime;\n\n // Extract only the input_tokens and output_tokens\n const usage = {\n input_tokens: response.usage.input_tokens,\n output_tokens: response.usage.output_tokens,\n inference_time_ms: elapsedMs,\n };\n\n // Log LLM response\n FlowLogger.logLlmResponse({\n requestId: llmRequestId,\n model: this.modelName,\n output: extractLlmCuaResponseSummary(response.output),\n inputTokens: response.usage.input_tokens,\n outputTokens: response.usage.output_tokens,\n });\n\n // Store the response ID for future use\n this.lastResponseId = response.id;\n\n // Return the output and response ID\n return {\n output: response.output as unknown as ResponseItem[],\n responseId: response.id,\n usage,\n };\n } catch (error) {\n console.error(\"Error getting action from OpenAI:\", error);\n throw error;\n }\n }\n\n async takeAction(\n output: ResponseItem[],\n logger: (message: LogLine) => void,\n ): Promise<ResponseInputItem[]> {\n const nextInputItems: ResponseInputItem[] = [];\n\n // Process each output item\n for (const item of output) {\n if (item.type === \"computer_call\" && this.isComputerCallItem(item)) {\n // Handle computer calls (both single-action and batched-actions formats)\n try {\n const actions = this.convertComputerCallToActions(item);\n\n if (this.actionHandler) {\n for (const action of actions) {\n logger({\n category: \"agent\",\n message: `Executing computer action: ${action.type}`,\n level: 1,\n });\n await this.actionHandler(action);\n }\n }\n\n // Capture a screenshot after all actions in the batch\n const screenshot = await this.captureScreenshot();\n\n // Build the output — use \"computer_screenshot\" for new format, \"input_image\" for legacy\n const outputType = this.usesNewComputerTool\n ? (\"computer_screenshot\" as const)\n : (\"input_image\" as const);\n\n const outputItem = {\n type: \"computer_call_output\" as const,\n call_id: item.call_id,\n output: {\n type: outputType,\n image_url: this.toDataUrl(screenshot),\n ...(this.usesNewComputerTool\n ? { detail: \"original\" as const }\n : {}),\n },\n } as ResponseInputItem;\n\n logger({\n category: \"agent\",\n message: `Added computer_call_output for call_id: ${item.call_id}`,\n level: 2,\n });\n\n // Legacy format supports current_url on the output; new format does not\n if (!this.usesNewComputerTool && this.currentUrl) {\n const computerCallOutput = outputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\" | \"computer_screenshot\";\n image_url: string;\n current_url?: string;\n };\n acknowledged_safety_checks?: SafetyCheck[];\n };\n computerCallOutput.output.current_url = this.currentUrl;\n }\n\n if (\n item.pending_safety_checks &&\n item.pending_safety_checks.length > 0\n ) {\n const acknowledgedChecks = await this.handleSafetyConfirmation(\n item.pending_safety_checks,\n logger,\n );\n\n if (acknowledgedChecks) {\n const computerCallOutput = outputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\" | \"computer_screenshot\";\n image_url: string;\n };\n acknowledged_safety_checks?: SafetyCheck[];\n };\n computerCallOutput.acknowledged_safety_checks =\n acknowledgedChecks;\n }\n }\n\n nextInputItems.push(outputItem);\n } catch (error) {\n if (error instanceof StagehandClosedError) {\n throw error;\n }\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n logger({\n category: \"agent\",\n message: `Error executing computer call: ${errorMessage}`,\n level: 0,\n });\n\n try {\n const screenshot = await this.captureScreenshot();\n\n const outputType = this.usesNewComputerTool\n ? (\"computer_screenshot\" as const)\n : (\"input_image\" as const);\n\n const errorOutputItem = {\n type: \"computer_call_output\" as const,\n call_id: item.call_id,\n output: {\n type: outputType,\n image_url: this.toDataUrl(screenshot),\n error: errorMessage,\n ...(this.usesNewComputerTool\n ? { detail: \"original\" as const }\n : {}),\n },\n } as ResponseInputItem;\n\n if (!this.usesNewComputerTool && this.currentUrl) {\n const computerCallOutput = errorOutputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\" | \"computer_screenshot\";\n image_url: string;\n current_url?: string;\n };\n acknowledged_safety_checks?: SafetyCheck[];\n };\n computerCallOutput.output.current_url = this.currentUrl;\n }\n\n if (\n item.pending_safety_checks &&\n item.pending_safety_checks.length > 0\n ) {\n const acknowledgedChecks = await this.handleSafetyConfirmation(\n item.pending_safety_checks,\n logger,\n );\n\n if (acknowledgedChecks) {\n const computerCallOutput = errorOutputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\" | \"computer_screenshot\";\n image_url: string;\n };\n acknowledged_safety_checks?: SafetyCheck[];\n };\n computerCallOutput.acknowledged_safety_checks =\n acknowledgedChecks;\n }\n }\n\n nextInputItems.push(errorOutputItem);\n } catch (screenshotError) {\n if (screenshotError instanceof StagehandClosedError) {\n throw screenshotError;\n }\n logger({\n category: \"agent\",\n message: `Error capturing screenshot: ${String(screenshotError)}`,\n level: 0,\n });\n\n nextInputItems.push({\n type: \"computer_call_output\",\n call_id: item.call_id,\n output: `Error: ${errorMessage}`,\n } as ResponseInputItem);\n }\n }\n } else if (\n item.type === \"function_call\" &&\n this.isFunctionCallItem(item)\n ) {\n // Handle the captcha-proceed tool — just return a confirmation and\n // deactivate the tool so it doesn't appear on subsequent steps.\n if (item.name === CAPTCHA_PROCEED_TOOL) {\n this.captchaSolvedToolActive = false;\n nextInputItems.push({\n type: \"function_call_output\",\n call_id: item.call_id,\n output:\n \"Confirmed. The captcha is solved. Continue completing the original task autonomously without asking for further confirmation.\",\n } as ResponseInputItem);\n continue;\n }\n\n // Handle function calls (tool calls)\n try {\n const action = this.convertFunctionCallToAction(item);\n\n if (action && this.actionHandler) {\n await this.actionHandler(action);\n }\n\n // Execute the tool if available\n let toolResult = \"Tool executed successfully\";\n if (this.tools && item.name in this.tools) {\n try {\n const tool = this.tools[item.name];\n const args = JSON.parse(item.arguments);\n\n logger({\n category: \"agent\",\n message: `Executing tool call: ${item.name} with args: ${item.arguments}`,\n level: 1,\n });\n\n const result = await tool.execute(args, {\n toolCallId: item.call_id,\n messages: [],\n });\n toolResult = JSON.stringify(result);\n\n logger({\n category: \"agent\",\n message: `Tool ${item.name} completed successfully. Result: ${toolResult}`,\n level: 1,\n });\n } catch (toolError) {\n const errorMessage =\n toolError instanceof Error\n ? toolError.message\n : String(toolError);\n toolResult = `Error executing tool: ${errorMessage}`;\n\n logger({\n category: \"agent\",\n message: `Error executing tool ${item.name}: ${errorMessage}`,\n level: 0,\n });\n }\n }\n\n // Create a function_call_output for the next request\n const outputItem: ResponseInputItem = {\n type: \"function_call_output\",\n call_id: item.call_id,\n output: toolResult,\n };\n\n nextInputItems.push(outputItem);\n } catch (error) {\n if (error instanceof StagehandClosedError) {\n throw error;\n }\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n logger({\n category: \"agent\",\n message: `Error executing function call: ${errorMessage}`,\n level: 0,\n });\n\n // Send error result back\n const errorOutputItem: ResponseInputItem = {\n type: \"function_call_output\",\n call_id: item.call_id,\n output: `Error: ${errorMessage}`,\n };\n\n nextInputItems.push(errorOutputItem);\n }\n }\n }\n\n return nextInputItems;\n }\n\n private convertComputerCallToAction(\n call: ComputerCallItem,\n ): AgentAction | null {\n const { action } = call;\n if (!action) return null;\n\n return {\n type: action.type as string,\n ...action,\n };\n }\n\n private drainContextNotes(): string[] {\n if (this.pendingContextNotes.length === 0) {\n return [];\n }\n\n const notes = [...this.pendingContextNotes];\n this.pendingContextNotes = [];\n return notes;\n }\n\n private async captureInitialScreenshot(): Promise<\n ScreenshotProviderResult | undefined\n > {\n if (!this.screenshotProvider) {\n return undefined;\n }\n\n try {\n return await this.captureScreenshot();\n } catch {\n return undefined;\n }\n }\n\n private convertComputerCallToActions(call: ComputerCallItem): AgentAction[] {\n if (call.actions && Array.isArray(call.actions)) {\n return call.actions.map((action) => ({\n type: action.type as string,\n ...action,\n }));\n }\n\n const single = this.convertComputerCallToAction(call);\n return single ? [single] : [];\n }\n\n private convertFunctionCallToAction(\n call: FunctionCallItem,\n ): AgentAction | null {\n try {\n const args = JSON.parse(call.arguments);\n\n return {\n type: call.name,\n params: args,\n };\n } catch (error) {\n console.error(\"Error parsing function call arguments:\", error);\n return null;\n }\n }\n\n async captureScreenshot(options?: {\n base64Image?: string;\n mediaType?: \"image/png\" | \"image/jpeg\";\n currentUrl?: string;\n }): Promise<ScreenshotProviderResult> {\n // Use provided options if available\n if (options?.base64Image) {\n return {\n base64: options.base64Image,\n mediaType: options.mediaType ?? \"image/png\",\n };\n }\n\n // Use the screenshot provider if available\n if (this.screenshotProvider) {\n try {\n return await this.screenshotProvider();\n } catch (error) {\n console.error(\"Error capturing screenshot:\", error);\n throw error;\n }\n }\n\n throw new AgentScreenshotProviderError(\n \"`screenshotProvider` has not been set. \" +\n \"Please call `setScreenshotProvider()` with a valid function that returns a base64-encoded image and media type\",\n );\n }\n\n /** Build the `data:` URL the OpenAI image payload expects. */\n private toDataUrl(screenshot: ScreenshotProviderResult): string {\n return `data:${screenshot.mediaType};base64,${screenshot.base64}`;\n }\n}\n"]}
@@ -7,6 +7,7 @@ interface DoneResult {
7
7
  messages: ModelMessage[];
8
8
  output?: Record<string, unknown>;
9
9
  }
10
+ export declare function sanitizeMessagesForResubmission(messages: ModelMessage[]): ModelMessage[];
10
11
  /**
11
12
  * Force a done tool call at the end of an agent run.
12
13
  * This ensures we always get a structured final response,
@@ -1,7 +1,45 @@
1
1
  import { generateText } from "ai";
2
2
  import { z } from "zod";
3
3
  import { tool } from "ai";
4
+ import { anthropicFallbacksOptions, rejectsForcedToolUse, } from "../../llm/anthropicOptions.js";
4
5
  import { getZFactory } from "../../../utils.js";
6
+ /**
7
+ * Deep-remove `undefined` values from the run history before it is re-submitted
8
+ * to the forced "done" call.
9
+ *
10
+ * The AI SDK validates re-submitted messages against its `ModelMessage` schema,
11
+ * whose JSON-value schema rejects `undefined` (only null/string/number/boolean/
12
+ * object/array are allowed). A custom tool that returns an object with an
13
+ * optional field left `undefined` (e.g. `{ matchedExpected: undefined }`) lands
14
+ * that `undefined` inside a tool-result `output.value`, and reasoning models can
15
+ * leave `undefined` in part fields too. Either makes the forced "done" call
16
+ * throw `Invalid prompt: messages must be a ModelMessage[]` (STG-2335) — a red
17
+ * error that fires after the run has already completed. Stripping `undefined`
18
+ * keeps the history valid without dropping any real content.
19
+ *
20
+ * Only plain objects and arrays are traversed; class instances (URL, typed
21
+ * arrays for binary image data, Date, …) are passed through untouched.
22
+ */
23
+ function stripUndefinedDeep(value) {
24
+ if (Array.isArray(value)) {
25
+ return value.map((v) => stripUndefinedDeep(v));
26
+ }
27
+ if (value !== null && typeof value === "object") {
28
+ const proto = Object.getPrototypeOf(value);
29
+ if (proto === Object.prototype || proto === null) {
30
+ const out = {};
31
+ for (const [k, v] of Object.entries(value)) {
32
+ if (v !== undefined)
33
+ out[k] = stripUndefinedDeep(v);
34
+ }
35
+ return out;
36
+ }
37
+ }
38
+ return value;
39
+ }
40
+ export function sanitizeMessagesForResubmission(messages) {
41
+ return stripUndefinedDeep(messages);
42
+ }
5
43
  function buildBaseDoneSchema(factory) {
6
44
  return factory.object({
7
45
  reasoning: factory
@@ -66,18 +104,26 @@ Call the "done" tool with:
66
104
  ? "Provide your final assessment and the requested output data."
67
105
  : "Provide your final assessment.",
68
106
  };
107
+ const modelId = typeof model === "string" ? model : model.modelId;
108
+ const fallbacks = anthropicFallbacksOptions(modelId);
109
+ // Models whose always-on thinking rejects forced tool use go straight to
110
+ // "auto" — the prompt already instructs calling "done", and the
111
+ // no-tool-call case below handles a plain-text answer.
69
112
  const result = await generateText({
70
113
  model,
71
114
  system: systemPrompt,
72
- messages: [...inputMessages, userPrompt],
115
+ messages: [...sanitizeMessagesForResubmission(inputMessages), userPrompt],
73
116
  tools: { done: doneTool },
74
- toolChoice: { type: "tool", toolName: "done" },
117
+ toolChoice: rejectsForcedToolUse(modelId)
118
+ ? "auto"
119
+ : { type: "tool", toolName: "done" },
75
120
  providerOptions: {
76
121
  google: { mediaResolution: "MEDIA_RESOLUTION_HIGH" },
77
122
  openai: { store: false },
123
+ ...(fallbacks ? { anthropic: fallbacks } : {}),
78
124
  },
79
125
  });
80
- const doneToolCall = result.toolCalls.find((tc) => tc.toolName === "done");
126
+ const doneToolCall = result.toolCalls?.find((tc) => tc.toolName === "done");
81
127
  const outputMessages = [
82
128
  userPrompt,
83
129
  ...(result.response?.messages || []),
@@ -1 +1 @@
1
- {"version":3,"file":"handleDoneToolCall.js","sourceRoot":"","sources":["../../../../../../lib/v3/agent/utils/handleDoneToolCall.ts"],"names":[],"mappings":"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","sourcesContent":["import { generateText, ModelMessage, LanguageModel, ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport { tool } from \"ai\";\nimport { LogLine } from \"../../types/public/logs.js\";\nimport { StagehandZodObject } from \"../../zodCompat.js\";\nimport { getZFactory } from \"../../../utils.js\";\nimport type { StagehandZodSchema } from \"../../zodCompat.js\";\n\ninterface DoneResult {\n reasoning: string;\n taskComplete: boolean;\n messages: ModelMessage[];\n output?: Record<string, unknown>;\n}\n\nfunction buildBaseDoneSchema(factory: typeof z) {\n return factory.object({\n reasoning: factory\n .string()\n .describe(\"Brief summary of what actions were taken and the outcome\"),\n taskComplete: factory\n .boolean()\n .describe(\"true if the task was fully completed, false otherwise\"),\n });\n}\n\n/**\n * Force a done tool call at the end of an agent run.\n * This ensures we always get a structured final response,\n * even if the main loop ended without calling done.\n */\nexport async function handleDoneToolCall(options: {\n model: LanguageModel;\n inputMessages: ModelMessage[];\n instruction: string;\n outputSchema?: StagehandZodObject;\n logger: (message: LogLine) => void;\n}): Promise<DoneResult> {\n const { model, inputMessages, instruction, outputSchema, logger } = options;\n\n logger({\n category: \"agent\",\n message: \"Agent calling tool: done\",\n level: 1,\n });\n // Use the same Zod version as the user's outputSchema to avoid v3/v4 mixing\n const factory = outputSchema\n ? getZFactory(outputSchema as StagehandZodSchema)\n : z;\n const baseDoneSchema = buildBaseDoneSchema(factory);\n\n // Merge base done schema with user-provided output schema if present\n const doneToolSchema = outputSchema\n ? baseDoneSchema.extend({\n output: outputSchema.describe(\n \"The specific data the user requested from this task\",\n ),\n })\n : baseDoneSchema;\n\n const outputInstructions = outputSchema\n ? `\\n\\nThe user also requested the following information from this task. Provide it in the \"output\" field:\\n${JSON.stringify(\n Object.fromEntries(\n Object.entries(outputSchema.shape).map(\n ([key, value]: [string, StagehandZodSchema]) => [\n key,\n value.description || \"no description\",\n ],\n ),\n ),\n null,\n 2,\n )}`\n : \"\";\n\n const systemPrompt = `You are a web automation assistant that was tasked with completing a task.\n\nThe task was:\n\"${instruction}\"\n\nReview what was accomplished and provide your final assessment in whether the task was completed successfully. you have been provided with the history of the actions taken so far, use this to determine if the task was completed successfully.${outputInstructions}\n\nCall the \"done\" tool with:\n1. A brief summary of what was done\n2. Whether the task was completed successfully${outputSchema ? \"\\n3. The requested output data based on what you found\" : \"\"}`;\n\n const doneTool = tool({\n description: outputSchema\n ? \"Complete the task with your assessment and the requested output data.\"\n : \"Complete the task with your final assessment.\",\n inputSchema: doneToolSchema,\n execute: async (params) => {\n return { success: true, ...params };\n },\n });\n\n const userPrompt: ModelMessage = {\n role: \"user\",\n content: outputSchema\n ? \"Provide your final assessment and the requested output data.\"\n : \"Provide your final assessment.\",\n };\n\n const result = await generateText({\n model,\n system: systemPrompt,\n messages: [...inputMessages, userPrompt],\n tools: { done: doneTool } as ToolSet,\n toolChoice: { type: \"tool\", toolName: \"done\" },\n providerOptions: {\n google: { mediaResolution: \"MEDIA_RESOLUTION_HIGH\" },\n openai: { store: false },\n },\n });\n\n const doneToolCall = result.toolCalls.find((tc) => tc.toolName === \"done\");\n const outputMessages: ModelMessage[] = [\n userPrompt,\n ...(result.response?.messages || []),\n ];\n\n if (!doneToolCall) {\n return {\n reasoning: result.text || \"Task execution completed\",\n taskComplete: false,\n messages: outputMessages,\n };\n }\n\n const input = doneToolCall.input as {\n reasoning: string;\n taskComplete: boolean;\n output?: Record<string, unknown>;\n };\n logger({\n category: \"agent\",\n message: `Task completed`,\n level: 1,\n });\n\n return {\n reasoning: input.reasoning,\n taskComplete: input.taskComplete,\n messages: outputMessages,\n output: input.output,\n };\n}\n"]}
1
+ {"version":3,"file":"handleDoneToolCall.js","sourceRoot":"","sources":["../../../../../../lib/v3/agent/utils/handleDoneToolCall.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAwC,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,IAAI,CAAC;AAE1B,OAAO,EACL,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAUhD;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,kBAAkB,CAAI,KAAQ;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAiB,CAAC;IACjE,CAAC;IACD,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjD,MAAM,GAAG,GAA4B,EAAE,CAAC;YACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;gBACtE,IAAI,CAAC,KAAK,SAAS;oBAAE,GAAG,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,GAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,QAAwB;IAExB,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAiB;IAC5C,OAAO,OAAO,CAAC,MAAM,CAAC;QACpB,SAAS,EAAE,OAAO;aACf,MAAM,EAAE;aACR,QAAQ,CAAC,0DAA0D,CAAC;QACvE,YAAY,EAAE,OAAO;aAClB,OAAO,EAAE;aACT,QAAQ,CAAC,uDAAuD,CAAC;KACrE,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAMxC;IACC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE5E,MAAM,CAAC;QACL,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,0BAA0B;QACnC,KAAK,EAAE,CAAC;KACT,CAAC,CAAC;IACH,4EAA4E;IAC5E,MAAM,OAAO,GAAG,YAAY;QAC1B,CAAC,CAAC,WAAW,CAAC,YAAkC,CAAC;QACjD,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,cAAc,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAEpD,qEAAqE;IACrE,MAAM,cAAc,GAAG,YAAY;QACjC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC;YACpB,MAAM,EAAE,YAAY,CAAC,QAAQ,CAC3B,qDAAqD,CACtD;SACF,CAAC;QACJ,CAAC,CAAC,cAAc,CAAC;IAEnB,MAAM,kBAAkB,GAAG,YAAY;QACrC,CAAC,CAAC,4GAA4G,IAAI,CAAC,SAAS,CACxH,MAAM,CAAC,WAAW,CAChB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,CACpC,CAAC,CAAC,GAAG,EAAE,KAAK,CAA+B,EAAE,EAAE,CAAC;YAC9C,GAAG;YACH,KAAK,CAAC,WAAW,IAAI,gBAAgB;SACtC,CACF,CACF,EACD,IAAI,EACJ,CAAC,CACF,EAAE;QACL,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,YAAY,GAAG;;;GAGpB,WAAW;;mPAEqO,kBAAkB;;;;gDAIrN,YAAY,CAAC,CAAC,CAAC,wDAAwD,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAE7H,MAAM,QAAQ,GAAG,IAAI,CAAC;QACpB,WAAW,EAAE,YAAY;YACvB,CAAC,CAAC,uEAAuE;YACzE,CAAC,CAAC,+CAA+C;QACnD,WAAW,EAAE,cAAc;QAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;QACtC,CAAC;KACF,CAAC,CAAC;IAEH,MAAM,UAAU,GAAiB;QAC/B,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,YAAY;YACnB,CAAC,CAAC,8DAA8D;YAChE,CAAC,CAAC,gCAAgC;KACrC,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAClE,MAAM,SAAS,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAErD,yEAAyE;IACzE,gEAAgE;IAChE,uDAAuD;IACvD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,KAAK;QACL,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,CAAC,GAAG,+BAA+B,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC;QACzE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAa;QACpC,UAAU,EAAE,oBAAoB,CAAC,OAAO,CAAC;YACvC,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;QACtC,eAAe,EAAE;YACf,MAAM,EAAE,EAAE,eAAe,EAAE,uBAAuB,EAAE;YACpD,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE;YACxB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/C;KACF,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAmB;QACrC,UAAU;QACV,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC;KACrC,CAAC;IAEF,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,SAAS,EAAE,MAAM,CAAC,IAAI,IAAI,0BAA0B;YACpD,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,cAAc;SACzB,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,KAI1B,CAAC;IACF,MAAM,CAAC;QACL,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,gBAAgB;QACzB,KAAK,EAAE,CAAC;KACT,CAAC,CAAC;IAEH,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,QAAQ,EAAE,cAAc;QACxB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC;AACJ,CAAC","sourcesContent":["import { generateText, ModelMessage, LanguageModel, ToolSet } from \"ai\";\nimport { z } from \"zod\";\nimport { tool } from \"ai\";\nimport { LogLine } from \"../../types/public/logs.js\";\nimport {\n anthropicFallbacksOptions,\n rejectsForcedToolUse,\n} from \"../../llm/anthropicOptions.js\";\nimport { StagehandZodObject } from \"../../zodCompat.js\";\nimport { getZFactory } from \"../../../utils.js\";\nimport type { StagehandZodSchema } from \"../../zodCompat.js\";\n\ninterface DoneResult {\n reasoning: string;\n taskComplete: boolean;\n messages: ModelMessage[];\n output?: Record<string, unknown>;\n}\n\n/**\n * Deep-remove `undefined` values from the run history before it is re-submitted\n * to the forced \"done\" call.\n *\n * The AI SDK validates re-submitted messages against its `ModelMessage` schema,\n * whose JSON-value schema rejects `undefined` (only null/string/number/boolean/\n * object/array are allowed). A custom tool that returns an object with an\n * optional field left `undefined` (e.g. `{ matchedExpected: undefined }`) lands\n * that `undefined` inside a tool-result `output.value`, and reasoning models can\n * leave `undefined` in part fields too. Either makes the forced \"done\" call\n * throw `Invalid prompt: messages must be a ModelMessage[]` (STG-2335) — a red\n * error that fires after the run has already completed. Stripping `undefined`\n * keeps the history valid without dropping any real content.\n *\n * Only plain objects and arrays are traversed; class instances (URL, typed\n * arrays for binary image data, Date, …) are passed through untouched.\n */\nfunction stripUndefinedDeep<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => stripUndefinedDeep(v)) as unknown as T;\n }\n if (value !== null && typeof value === \"object\") {\n const proto = Object.getPrototypeOf(value);\n if (proto === Object.prototype || proto === null) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (v !== undefined) out[k] = stripUndefinedDeep(v);\n }\n return out as T;\n }\n }\n return value;\n}\n\nexport function sanitizeMessagesForResubmission(\n messages: ModelMessage[],\n): ModelMessage[] {\n return stripUndefinedDeep(messages);\n}\n\nfunction buildBaseDoneSchema(factory: typeof z) {\n return factory.object({\n reasoning: factory\n .string()\n .describe(\"Brief summary of what actions were taken and the outcome\"),\n taskComplete: factory\n .boolean()\n .describe(\"true if the task was fully completed, false otherwise\"),\n });\n}\n\n/**\n * Force a done tool call at the end of an agent run.\n * This ensures we always get a structured final response,\n * even if the main loop ended without calling done.\n */\nexport async function handleDoneToolCall(options: {\n model: LanguageModel;\n inputMessages: ModelMessage[];\n instruction: string;\n outputSchema?: StagehandZodObject;\n logger: (message: LogLine) => void;\n}): Promise<DoneResult> {\n const { model, inputMessages, instruction, outputSchema, logger } = options;\n\n logger({\n category: \"agent\",\n message: \"Agent calling tool: done\",\n level: 1,\n });\n // Use the same Zod version as the user's outputSchema to avoid v3/v4 mixing\n const factory = outputSchema\n ? getZFactory(outputSchema as StagehandZodSchema)\n : z;\n const baseDoneSchema = buildBaseDoneSchema(factory);\n\n // Merge base done schema with user-provided output schema if present\n const doneToolSchema = outputSchema\n ? baseDoneSchema.extend({\n output: outputSchema.describe(\n \"The specific data the user requested from this task\",\n ),\n })\n : baseDoneSchema;\n\n const outputInstructions = outputSchema\n ? `\\n\\nThe user also requested the following information from this task. Provide it in the \"output\" field:\\n${JSON.stringify(\n Object.fromEntries(\n Object.entries(outputSchema.shape).map(\n ([key, value]: [string, StagehandZodSchema]) => [\n key,\n value.description || \"no description\",\n ],\n ),\n ),\n null,\n 2,\n )}`\n : \"\";\n\n const systemPrompt = `You are a web automation assistant that was tasked with completing a task.\n\nThe task was:\n\"${instruction}\"\n\nReview what was accomplished and provide your final assessment in whether the task was completed successfully. you have been provided with the history of the actions taken so far, use this to determine if the task was completed successfully.${outputInstructions}\n\nCall the \"done\" tool with:\n1. A brief summary of what was done\n2. Whether the task was completed successfully${outputSchema ? \"\\n3. The requested output data based on what you found\" : \"\"}`;\n\n const doneTool = tool({\n description: outputSchema\n ? \"Complete the task with your assessment and the requested output data.\"\n : \"Complete the task with your final assessment.\",\n inputSchema: doneToolSchema,\n execute: async (params) => {\n return { success: true, ...params };\n },\n });\n\n const userPrompt: ModelMessage = {\n role: \"user\",\n content: outputSchema\n ? \"Provide your final assessment and the requested output data.\"\n : \"Provide your final assessment.\",\n };\n\n const modelId = typeof model === \"string\" ? model : model.modelId;\n const fallbacks = anthropicFallbacksOptions(modelId);\n\n // Models whose always-on thinking rejects forced tool use go straight to\n // \"auto\" — the prompt already instructs calling \"done\", and the\n // no-tool-call case below handles a plain-text answer.\n const result = await generateText({\n model,\n system: systemPrompt,\n messages: [...sanitizeMessagesForResubmission(inputMessages), userPrompt],\n tools: { done: doneTool } as ToolSet,\n toolChoice: rejectsForcedToolUse(modelId)\n ? \"auto\"\n : { type: \"tool\", toolName: \"done\" },\n providerOptions: {\n google: { mediaResolution: \"MEDIA_RESOLUTION_HIGH\" },\n openai: { store: false },\n ...(fallbacks ? { anthropic: fallbacks } : {}),\n },\n });\n\n const doneToolCall = result.toolCalls?.find((tc) => tc.toolName === \"done\");\n const outputMessages: ModelMessage[] = [\n userPrompt,\n ...(result.response?.messages || []),\n ];\n\n if (!doneToolCall) {\n return {\n reasoning: result.text || \"Task execution completed\",\n taskComplete: false,\n messages: outputMessages,\n };\n }\n\n const input = doneToolCall.input as {\n reasoning: string;\n taskComplete: boolean;\n output?: Record<string, unknown>;\n };\n logger({\n category: \"agent\",\n message: `Task completed`,\n level: 1,\n });\n\n return {\n reasoning: input.reasoning,\n taskComplete: input.taskComplete,\n messages: outputMessages,\n output: input.output,\n };\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { createHash } from "crypto";
2
- import { safeGetPageUrl, waitForCachedSelector } from "./utils.js";
2
+ import { normalizeUrlForCacheKey, safeGetPageUrl, waitForCachedSelector, } from "./utils.js";
3
3
  import { StagehandNotInitializedError } from "../types/public/sdkErrors.js";
4
4
  import { withTimeout } from "../timeoutConfig.js";
5
5
  export class ActCache {
@@ -27,7 +27,7 @@ export class ActCache {
27
27
  ? Object.keys(sanitizedVariables).sort()
28
28
  : [];
29
29
  const pageUrl = await safeGetPageUrl(page);
30
- const cacheKey = this.buildActCacheKey(sanitizedInstruction, pageUrl, variableKeys);
30
+ const cacheKey = this.buildActCacheKey(sanitizedInstruction, normalizeUrlForCacheKey(pageUrl), variableKeys);
31
31
  return {
32
32
  instruction: sanitizedInstruction,
33
33
  cacheKey,
@@ -1 +1 @@
1
- {"version":3,"file":"ActCache.js","sourceRoot":"","sources":["../../../../../lib/v3/cache/ActCache.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"crypto\";\nimport type { ActHandler } from \"../handlers/actHandler.js\";\nimport type { LLMClient } from \"../llm/LLMClient.js\";\nimport type { Action, ActResult, Logger } from \"../types/public/index.js\";\nimport type { Page } from \"../understudy/page.js\";\nimport { CacheStorage } from \"./CacheStorage.js\";\nimport { safeGetPageUrl, waitForCachedSelector } from \"./utils.js\";\nimport {\n ActCacheContext,\n ActCacheDeps,\n CachedActEntry,\n} from \"../types/private/index.js\";\nimport { StagehandNotInitializedError } from \"../types/public/sdkErrors.js\";\nimport { withTimeout } from \"../timeoutConfig.js\";\n\nexport class ActCache {\n private readonly storage: CacheStorage;\n private readonly logger: Logger;\n private readonly getActHandler: () => ActHandler | null;\n private readonly getDefaultLlmClient: () => LLMClient;\n private readonly domSettleTimeoutMs?: number;\n\n constructor({\n storage,\n logger,\n getActHandler,\n getDefaultLlmClient,\n domSettleTimeoutMs,\n }: ActCacheDeps) {\n this.storage = storage;\n this.logger = logger;\n this.getActHandler = getActHandler;\n this.getDefaultLlmClient = getDefaultLlmClient;\n this.domSettleTimeoutMs = domSettleTimeoutMs;\n }\n\n get enabled(): boolean {\n return this.storage.enabled;\n }\n\n async prepareContext(\n instruction: string,\n page: Page,\n variables?: Record<string, string>,\n ): Promise<ActCacheContext | null> {\n if (!this.enabled) return null;\n const sanitizedInstruction = instruction.trim();\n const sanitizedVariables = variables ? { ...variables } : undefined;\n const variableKeys = sanitizedVariables\n ? Object.keys(sanitizedVariables).sort()\n : [];\n const pageUrl = await safeGetPageUrl(page);\n const cacheKey = this.buildActCacheKey(\n sanitizedInstruction,\n pageUrl,\n variableKeys,\n );\n return {\n instruction: sanitizedInstruction,\n cacheKey,\n pageUrl,\n variableKeys,\n variables: sanitizedVariables,\n };\n }\n\n async tryReplay(\n context: ActCacheContext,\n page: Page,\n timeout?: number,\n llmClientOverride?: LLMClient,\n ): Promise<ActResult | null> {\n if (!this.enabled) return null;\n\n const {\n value: entry,\n error,\n path,\n } = await this.storage.readJson<CachedActEntry>(`${context.cacheKey}.json`);\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: `failed to read act cache entry: ${path}`,\n level: 2,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return null;\n }\n if (!entry) return null;\n if (entry.version !== 1) return null;\n if (!Array.isArray(entry.actions) || entry.actions.length === 0) {\n return null;\n }\n\n const entryVariableKeys = Array.isArray(entry.variableKeys)\n ? [...entry.variableKeys].sort()\n : [];\n const contextVariableKeys = [...context.variableKeys];\n\n if (!this.doVariableKeysMatch(entryVariableKeys, contextVariableKeys)) {\n return null;\n }\n\n if (\n contextVariableKeys.length > 0 &&\n (!context.variables ||\n !this.hasAllVariableValues(contextVariableKeys, context.variables))\n ) {\n this.logger({\n category: \"cache\",\n message: \"act cache miss: missing variables for replay\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n },\n });\n return null;\n }\n\n this.logger({\n category: \"cache\",\n message: \"act cache hit\",\n level: 1,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n url: {\n value: entry.url ?? context.pageUrl,\n type: \"string\",\n },\n },\n });\n\n return await this.replayCachedActions(\n context,\n entry,\n page,\n timeout,\n llmClientOverride,\n );\n }\n\n async store(context: ActCacheContext, result: ActResult): Promise<void> {\n if (!this.enabled) return;\n\n const entry: CachedActEntry = {\n version: 1,\n instruction: context.instruction,\n url: context.pageUrl,\n variableKeys: context.variableKeys,\n actions: result.actions ?? [],\n actionDescription: result.actionDescription,\n message: result.message,\n };\n\n const { error, path } = await this.storage.writeJson(\n `${context.cacheKey}.json`,\n entry,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to write act cache entry\",\n level: 1,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n\n this.logger({\n category: \"cache\",\n message: \"act cache stored\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n url: { value: context.pageUrl, type: \"string\" },\n },\n });\n }\n\n private buildActCacheKey(\n instruction: string,\n url: string,\n variableKeys: string[],\n ): string {\n const payload = JSON.stringify({\n instruction,\n url,\n variableKeys,\n });\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n }\n\n private async replayCachedActions(\n context: ActCacheContext,\n entry: CachedActEntry,\n page: Page,\n timeout?: number,\n llmClientOverride?: LLMClient,\n ): Promise<ActResult> {\n const handler = this.getActHandler();\n if (!handler) {\n throw new StagehandNotInitializedError(\"act()\");\n }\n const effectiveClient = llmClientOverride ?? this.getDefaultLlmClient();\n\n const execute = async (): Promise<ActResult> => {\n const actionResults: ActResult[] = [];\n for (const action of entry.actions) {\n await waitForCachedSelector({\n page,\n selector: action.selector,\n timeout: this.domSettleTimeoutMs,\n logger: this.logger,\n context: \"act\",\n });\n const result = await handler.takeDeterministicAction(\n action,\n page,\n this.domSettleTimeoutMs,\n effectiveClient,\n undefined,\n context.variables,\n );\n actionResults.push(result);\n if (!result.success) {\n break;\n }\n }\n\n if (actionResults.length === 0) {\n return {\n success: false,\n message: \"Failed to perform act: cached entry has no actions\",\n actionDescription: entry.actionDescription ?? entry.instruction,\n actions: [],\n };\n }\n\n const success = actionResults.every((r) => r.success);\n const actions = actionResults.flatMap((r) => r.actions ?? []);\n const message =\n actionResults\n .map((r) => r.message)\n .filter((m) => m && m.trim().length > 0)\n .join(\" → \") ||\n entry.message ||\n `Replayed ${entry.actions.length} cached action${\n entry.actions.length === 1 ? \"\" : \"s\"\n }.`;\n const actionDescription =\n entry.actionDescription ||\n actionResults[actionResults.length - 1]?.actionDescription ||\n entry.actions[entry.actions.length - 1]?.description ||\n entry.instruction;\n\n if (\n success &&\n actions.length > 0 &&\n this.haveActionsChanged(entry.actions, actions)\n ) {\n await this.refreshCacheEntry(context, {\n ...entry,\n actions,\n message,\n actionDescription,\n });\n }\n return {\n success,\n message,\n actionDescription,\n actions,\n };\n };\n\n return await withTimeout(execute(), timeout, \"act()\");\n }\n\n private haveActionsChanged(original: Action[], updated: Action[]): boolean {\n if (original.length !== updated.length) {\n return true;\n }\n\n for (let i = 0; i < original.length; i += 1) {\n const orig = original[i];\n const next = updated[i];\n if (!next) {\n return true;\n }\n\n if (orig.selector !== next.selector) {\n return true;\n }\n\n if (orig.description !== next.description) {\n return true;\n }\n\n if ((orig.method ?? \"\") !== (next.method ?? \"\")) {\n return true;\n }\n\n const origArgs = orig.arguments ?? [];\n const nextArgs = next.arguments ?? [];\n if (origArgs.length !== nextArgs.length) {\n return true;\n }\n\n for (let j = 0; j < origArgs.length; j += 1) {\n if (origArgs[j] !== nextArgs[j]) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n private async refreshCacheEntry(\n context: ActCacheContext,\n entry: CachedActEntry,\n ): Promise<void> {\n const { error, path } = await this.storage.writeJson(\n `${context.cacheKey}.json`,\n {\n ...entry,\n variableKeys: context.variableKeys,\n },\n );\n\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to update act cache entry after self-heal\",\n level: 0,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n\n this.logger({\n category: \"cache\",\n message: \"act cache entry updated after self-heal\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n url: { value: context.pageUrl, type: \"string\" },\n },\n });\n }\n\n private doVariableKeysMatch(\n entryKeys: string[],\n contextKeys: string[],\n ): boolean {\n if (entryKeys.length !== contextKeys.length) {\n return false;\n }\n\n for (let i = 0; i < entryKeys.length; i += 1) {\n if (entryKeys[i] !== contextKeys[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n private hasAllVariableValues(\n variableKeys: string[],\n variables: Record<string, string>,\n ): boolean {\n for (const key of variableKeys) {\n if (!(key in variables)) {\n return false;\n }\n }\n return true;\n }\n}\n"]}
1
+ {"version":3,"file":"ActCache.js","sourceRoot":"","sources":["../../../../../lib/v3/cache/ActCache.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"crypto\";\nimport type { ActHandler } from \"../handlers/actHandler.js\";\nimport type { LLMClient } from \"../llm/LLMClient.js\";\nimport type { Action, ActResult, Logger } from \"../types/public/index.js\";\nimport type { Page } from \"../understudy/page.js\";\nimport { CacheStorage } from \"./CacheStorage.js\";\nimport {\n normalizeUrlForCacheKey,\n safeGetPageUrl,\n waitForCachedSelector,\n} from \"./utils.js\";\nimport {\n ActCacheContext,\n ActCacheDeps,\n CachedActEntry,\n} from \"../types/private/index.js\";\nimport { StagehandNotInitializedError } from \"../types/public/sdkErrors.js\";\nimport { withTimeout } from \"../timeoutConfig.js\";\n\nexport class ActCache {\n private readonly storage: CacheStorage;\n private readonly logger: Logger;\n private readonly getActHandler: () => ActHandler | null;\n private readonly getDefaultLlmClient: () => LLMClient;\n private readonly domSettleTimeoutMs?: number;\n\n constructor({\n storage,\n logger,\n getActHandler,\n getDefaultLlmClient,\n domSettleTimeoutMs,\n }: ActCacheDeps) {\n this.storage = storage;\n this.logger = logger;\n this.getActHandler = getActHandler;\n this.getDefaultLlmClient = getDefaultLlmClient;\n this.domSettleTimeoutMs = domSettleTimeoutMs;\n }\n\n get enabled(): boolean {\n return this.storage.enabled;\n }\n\n async prepareContext(\n instruction: string,\n page: Page,\n variables?: Record<string, string>,\n ): Promise<ActCacheContext | null> {\n if (!this.enabled) return null;\n const sanitizedInstruction = instruction.trim();\n const sanitizedVariables = variables ? { ...variables } : undefined;\n const variableKeys = sanitizedVariables\n ? Object.keys(sanitizedVariables).sort()\n : [];\n const pageUrl = await safeGetPageUrl(page);\n const cacheKey = this.buildActCacheKey(\n sanitizedInstruction,\n normalizeUrlForCacheKey(pageUrl),\n variableKeys,\n );\n return {\n instruction: sanitizedInstruction,\n cacheKey,\n pageUrl,\n variableKeys,\n variables: sanitizedVariables,\n };\n }\n\n async tryReplay(\n context: ActCacheContext,\n page: Page,\n timeout?: number,\n llmClientOverride?: LLMClient,\n ): Promise<ActResult | null> {\n if (!this.enabled) return null;\n\n const {\n value: entry,\n error,\n path,\n } = await this.storage.readJson<CachedActEntry>(`${context.cacheKey}.json`);\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: `failed to read act cache entry: ${path}`,\n level: 2,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return null;\n }\n if (!entry) return null;\n if (entry.version !== 1) return null;\n if (!Array.isArray(entry.actions) || entry.actions.length === 0) {\n return null;\n }\n\n const entryVariableKeys = Array.isArray(entry.variableKeys)\n ? [...entry.variableKeys].sort()\n : [];\n const contextVariableKeys = [...context.variableKeys];\n\n if (!this.doVariableKeysMatch(entryVariableKeys, contextVariableKeys)) {\n return null;\n }\n\n if (\n contextVariableKeys.length > 0 &&\n (!context.variables ||\n !this.hasAllVariableValues(contextVariableKeys, context.variables))\n ) {\n this.logger({\n category: \"cache\",\n message: \"act cache miss: missing variables for replay\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n },\n });\n return null;\n }\n\n this.logger({\n category: \"cache\",\n message: \"act cache hit\",\n level: 1,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n url: {\n value: entry.url ?? context.pageUrl,\n type: \"string\",\n },\n },\n });\n\n return await this.replayCachedActions(\n context,\n entry,\n page,\n timeout,\n llmClientOverride,\n );\n }\n\n async store(context: ActCacheContext, result: ActResult): Promise<void> {\n if (!this.enabled) return;\n\n const entry: CachedActEntry = {\n version: 1,\n instruction: context.instruction,\n url: context.pageUrl,\n variableKeys: context.variableKeys,\n actions: result.actions ?? [],\n actionDescription: result.actionDescription,\n message: result.message,\n };\n\n const { error, path } = await this.storage.writeJson(\n `${context.cacheKey}.json`,\n entry,\n );\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to write act cache entry\",\n level: 1,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n\n this.logger({\n category: \"cache\",\n message: \"act cache stored\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n url: { value: context.pageUrl, type: \"string\" },\n },\n });\n }\n\n private buildActCacheKey(\n instruction: string,\n url: string,\n variableKeys: string[],\n ): string {\n const payload = JSON.stringify({\n instruction,\n url,\n variableKeys,\n });\n return createHash(\"sha256\").update(payload).digest(\"hex\");\n }\n\n private async replayCachedActions(\n context: ActCacheContext,\n entry: CachedActEntry,\n page: Page,\n timeout?: number,\n llmClientOverride?: LLMClient,\n ): Promise<ActResult> {\n const handler = this.getActHandler();\n if (!handler) {\n throw new StagehandNotInitializedError(\"act()\");\n }\n const effectiveClient = llmClientOverride ?? this.getDefaultLlmClient();\n\n const execute = async (): Promise<ActResult> => {\n const actionResults: ActResult[] = [];\n for (const action of entry.actions) {\n await waitForCachedSelector({\n page,\n selector: action.selector,\n timeout: this.domSettleTimeoutMs,\n logger: this.logger,\n context: \"act\",\n });\n const result = await handler.takeDeterministicAction(\n action,\n page,\n this.domSettleTimeoutMs,\n effectiveClient,\n undefined,\n context.variables,\n );\n actionResults.push(result);\n if (!result.success) {\n break;\n }\n }\n\n if (actionResults.length === 0) {\n return {\n success: false,\n message: \"Failed to perform act: cached entry has no actions\",\n actionDescription: entry.actionDescription ?? entry.instruction,\n actions: [],\n };\n }\n\n const success = actionResults.every((r) => r.success);\n const actions = actionResults.flatMap((r) => r.actions ?? []);\n const message =\n actionResults\n .map((r) => r.message)\n .filter((m) => m && m.trim().length > 0)\n .join(\" → \") ||\n entry.message ||\n `Replayed ${entry.actions.length} cached action${\n entry.actions.length === 1 ? \"\" : \"s\"\n }.`;\n const actionDescription =\n entry.actionDescription ||\n actionResults[actionResults.length - 1]?.actionDescription ||\n entry.actions[entry.actions.length - 1]?.description ||\n entry.instruction;\n\n if (\n success &&\n actions.length > 0 &&\n this.haveActionsChanged(entry.actions, actions)\n ) {\n await this.refreshCacheEntry(context, {\n ...entry,\n actions,\n message,\n actionDescription,\n });\n }\n return {\n success,\n message,\n actionDescription,\n actions,\n };\n };\n\n return await withTimeout(execute(), timeout, \"act()\");\n }\n\n private haveActionsChanged(original: Action[], updated: Action[]): boolean {\n if (original.length !== updated.length) {\n return true;\n }\n\n for (let i = 0; i < original.length; i += 1) {\n const orig = original[i];\n const next = updated[i];\n if (!next) {\n return true;\n }\n\n if (orig.selector !== next.selector) {\n return true;\n }\n\n if (orig.description !== next.description) {\n return true;\n }\n\n if ((orig.method ?? \"\") !== (next.method ?? \"\")) {\n return true;\n }\n\n const origArgs = orig.arguments ?? [];\n const nextArgs = next.arguments ?? [];\n if (origArgs.length !== nextArgs.length) {\n return true;\n }\n\n for (let j = 0; j < origArgs.length; j += 1) {\n if (origArgs[j] !== nextArgs[j]) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n private async refreshCacheEntry(\n context: ActCacheContext,\n entry: CachedActEntry,\n ): Promise<void> {\n const { error, path } = await this.storage.writeJson(\n `${context.cacheKey}.json`,\n {\n ...entry,\n variableKeys: context.variableKeys,\n },\n );\n\n if (error && path) {\n this.logger({\n category: \"cache\",\n message: \"failed to update act cache entry after self-heal\",\n level: 0,\n auxiliary: {\n error: { value: String(error), type: \"string\" },\n },\n });\n return;\n }\n\n this.logger({\n category: \"cache\",\n message: \"act cache entry updated after self-heal\",\n level: 2,\n auxiliary: {\n instruction: { value: context.instruction, type: \"string\" },\n url: { value: context.pageUrl, type: \"string\" },\n },\n });\n }\n\n private doVariableKeysMatch(\n entryKeys: string[],\n contextKeys: string[],\n ): boolean {\n if (entryKeys.length !== contextKeys.length) {\n return false;\n }\n\n for (let i = 0; i < entryKeys.length; i += 1) {\n if (entryKeys[i] !== contextKeys[i]) {\n return false;\n }\n }\n\n return true;\n }\n\n private hasAllVariableValues(\n variableKeys: string[],\n variables: Record<string, string>,\n ): boolean {\n for (const key of variableKeys) {\n if (!(key in variables)) {\n return false;\n }\n }\n return true;\n }\n}\n"]}
@@ -2,6 +2,13 @@ import type { Logger } from "../types/public/index.js";
2
2
  import { Page } from "../understudy/page.js";
3
3
  export declare function cloneForCache<T>(value: T): T;
4
4
  export declare function safeGetPageUrl(page: Page): Promise<string>;
5
+ /**
6
+ * Normalizes a URL for use in cache key derivation: parses the URL and
7
+ * sorts its query parameters so that equivalent URLs that differ only in
8
+ * parameter order produce the same cache key. Returns the input unchanged
9
+ * if it isn't a parseable URL (e.g. empty string, `about:blank`).
10
+ */
11
+ export declare function normalizeUrlForCacheKey(rawUrl: string): string;
5
12
  /**
6
13
  * Waits for a cached action's selector to be attached to the DOM before executing.
7
14
  * Logs a warning and proceeds if the wait times out (non-blocking).