@browserbasehq/orca 3.2.0-preview.5 → 3.2.1-preview.0

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 (164) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/lib/inference.js +1 -1
  3. package/dist/cjs/lib/inference.js.map +1 -1
  4. package/dist/cjs/lib/prompt.js +13 -16
  5. package/dist/cjs/lib/prompt.js.map +1 -1
  6. package/dist/cjs/lib/v3/agent/AgentProvider.js +1 -0
  7. package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
  8. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.d.ts +3 -1
  9. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +60 -9
  10. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  11. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js +15 -0
  12. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
  13. package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +8 -2
  14. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +103 -49
  15. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  16. package/dist/cjs/lib/v3/agent/tools/index.js +1 -1
  17. package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
  18. package/dist/cjs/lib/v3/agent/tools/keys.d.ts +2 -1
  19. package/dist/cjs/lib/v3/agent/tools/keys.js +57 -49
  20. package/dist/cjs/lib/v3/agent/tools/keys.js.map +1 -1
  21. package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js +3 -5
  22. package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
  23. package/dist/cjs/lib/v3/api.d.ts +5 -3
  24. package/dist/cjs/lib/v3/api.js +3 -6
  25. package/dist/cjs/lib/v3/api.js.map +1 -1
  26. package/dist/cjs/lib/v3/cache/AgentCache.js +5 -3
  27. package/dist/cjs/lib/v3/cache/AgentCache.js.map +1 -1
  28. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +6 -15
  29. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  30. package/dist/cjs/lib/v3/index.d.ts +1 -1
  31. package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +5 -2
  32. package/dist/cjs/lib/v3/llm/LLMProvider.js +14 -6
  33. package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
  34. package/dist/cjs/lib/v3/llm/OpenAIClient.js +1 -0
  35. package/dist/cjs/lib/v3/llm/OpenAIClient.js.map +1 -1
  36. package/dist/cjs/lib/v3/llm/aisdk.d.ts +3 -1
  37. package/dist/cjs/lib/v3/llm/aisdk.js +67 -17
  38. package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
  39. package/dist/cjs/lib/v3/types/public/agent.d.ts +8 -3
  40. package/dist/cjs/lib/v3/types/public/agent.js +1 -0
  41. package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
  42. package/dist/cjs/lib/v3/types/public/api.d.ts +30 -0
  43. package/dist/cjs/lib/v3/types/public/api.js +6 -2
  44. package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
  45. package/dist/cjs/lib/v3/types/public/model.d.ts +32 -2
  46. package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
  47. package/dist/cjs/lib/v3/understudy/context.js +11 -3
  48. package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
  49. package/dist/cjs/lib/v3/understudy/page.js +1 -1
  50. package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
  51. package/dist/cjs/lib/v3/v3.d.ts +18 -2
  52. package/dist/cjs/lib/v3/v3.js +92 -9
  53. package/dist/cjs/lib/v3/v3.js.map +1 -1
  54. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
  55. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js +56 -0
  56. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
  57. package/dist/cjs/tests/unit/agent-captcha-hooks.test.js +56 -0
  58. package/dist/cjs/tests/unit/agent-captcha-hooks.test.js.map +1 -1
  59. package/dist/cjs/tests/unit/agent-metrics.test.d.ts +1 -0
  60. package/dist/cjs/tests/unit/agent-metrics.test.js +112 -0
  61. package/dist/cjs/tests/unit/agent-metrics.test.js.map +1 -0
  62. package/dist/cjs/tests/unit/aisdk-clients.test.d.ts +1 -0
  63. package/dist/cjs/tests/unit/aisdk-clients.test.js +90 -0
  64. package/dist/cjs/tests/unit/aisdk-clients.test.js.map +1 -0
  65. package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.d.ts +1 -0
  66. package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.js +250 -0
  67. package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.js.map +1 -0
  68. package/dist/cjs/tests/unit/api-optional-model-api-key.test.d.ts +1 -0
  69. package/dist/cjs/tests/unit/api-optional-model-api-key.test.js +95 -0
  70. package/dist/cjs/tests/unit/api-optional-model-api-key.test.js.map +1 -0
  71. package/dist/cjs/tests/unit/browserbase-session-accessors.test.js +20 -0
  72. package/dist/cjs/tests/unit/browserbase-session-accessors.test.js.map +1 -1
  73. package/dist/cjs/tests/unit/llm-middleware.test.d.ts +1 -0
  74. package/dist/cjs/tests/unit/llm-middleware.test.js +495 -0
  75. package/dist/cjs/tests/unit/llm-middleware.test.js.map +1 -0
  76. package/dist/cjs/tests/unit/microsoft-cua-client.test.d.ts +1 -0
  77. package/dist/cjs/tests/unit/microsoft-cua-client.test.js +86 -0
  78. package/dist/cjs/tests/unit/microsoft-cua-client.test.js.map +1 -0
  79. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js +1 -0
  80. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  81. package/dist/esm/lib/inference.js +1 -1
  82. package/dist/esm/lib/inference.js.map +1 -1
  83. package/dist/esm/lib/prompt.js +13 -16
  84. package/dist/esm/lib/prompt.js.map +1 -1
  85. package/dist/esm/lib/v3/agent/AgentProvider.js +1 -0
  86. package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
  87. package/dist/esm/lib/v3/agent/AnthropicCUAClient.d.ts +3 -1
  88. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +60 -9
  89. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  90. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js +15 -0
  91. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
  92. package/dist/esm/lib/v3/agent/OpenAICUAClient.d.ts +8 -2
  93. package/dist/esm/lib/v3/agent/OpenAICUAClient.js +103 -49
  94. package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  95. package/dist/esm/lib/v3/agent/tools/index.js +1 -1
  96. package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
  97. package/dist/esm/lib/v3/agent/tools/keys.d.ts +2 -1
  98. package/dist/esm/lib/v3/agent/tools/keys.js +57 -49
  99. package/dist/esm/lib/v3/agent/tools/keys.js.map +1 -1
  100. package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js +3 -5
  101. package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
  102. package/dist/esm/lib/v3/api.d.ts +5 -3
  103. package/dist/esm/lib/v3/api.js +3 -6
  104. package/dist/esm/lib/v3/api.js.map +1 -1
  105. package/dist/esm/lib/v3/cache/AgentCache.js +5 -3
  106. package/dist/esm/lib/v3/cache/AgentCache.js.map +1 -1
  107. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +6 -15
  108. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  109. package/dist/esm/lib/v3/index.d.ts +1 -1
  110. package/dist/esm/lib/v3/llm/LLMProvider.d.ts +5 -2
  111. package/dist/esm/lib/v3/llm/LLMProvider.js +15 -7
  112. package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
  113. package/dist/esm/lib/v3/llm/OpenAIClient.js +1 -0
  114. package/dist/esm/lib/v3/llm/OpenAIClient.js.map +1 -1
  115. package/dist/esm/lib/v3/llm/aisdk.d.ts +3 -1
  116. package/dist/esm/lib/v3/llm/aisdk.js +67 -17
  117. package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
  118. package/dist/esm/lib/v3/types/public/agent.d.ts +8 -3
  119. package/dist/esm/lib/v3/types/public/agent.js +1 -0
  120. package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
  121. package/dist/esm/lib/v3/types/public/api.d.ts +30 -0
  122. package/dist/esm/lib/v3/types/public/api.js +6 -2
  123. package/dist/esm/lib/v3/types/public/api.js.map +1 -1
  124. package/dist/esm/lib/v3/types/public/model.d.ts +32 -2
  125. package/dist/esm/lib/v3/types/public/model.js.map +1 -1
  126. package/dist/esm/lib/v3/understudy/context.js +11 -3
  127. package/dist/esm/lib/v3/understudy/context.js.map +1 -1
  128. package/dist/esm/lib/v3/understudy/page.js +1 -1
  129. package/dist/esm/lib/v3/understudy/page.js.map +1 -1
  130. package/dist/esm/lib/v3/v3.d.ts +18 -2
  131. package/dist/esm/lib/v3/v3.js +92 -10
  132. package/dist/esm/lib/v3/v3.js.map +1 -1
  133. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
  134. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js +54 -0
  135. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
  136. package/dist/esm/tests/unit/agent-captcha-hooks.test.js +56 -0
  137. package/dist/esm/tests/unit/agent-captcha-hooks.test.js.map +1 -1
  138. package/dist/esm/tests/unit/agent-metrics.test.d.ts +1 -0
  139. package/dist/esm/tests/unit/agent-metrics.test.js +110 -0
  140. package/dist/esm/tests/unit/agent-metrics.test.js.map +1 -0
  141. package/dist/esm/tests/unit/aisdk-clients.test.d.ts +1 -0
  142. package/dist/esm/tests/unit/aisdk-clients.test.js +88 -0
  143. package/dist/esm/tests/unit/aisdk-clients.test.js.map +1 -0
  144. package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.d.ts +1 -0
  145. package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.js +245 -0
  146. package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.js.map +1 -0
  147. package/dist/esm/tests/unit/api-optional-model-api-key.test.d.ts +1 -0
  148. package/dist/esm/tests/unit/api-optional-model-api-key.test.js +93 -0
  149. package/dist/esm/tests/unit/api-optional-model-api-key.test.js.map +1 -0
  150. package/dist/esm/tests/unit/browserbase-session-accessors.test.js +20 -0
  151. package/dist/esm/tests/unit/browserbase-session-accessors.test.js.map +1 -1
  152. package/dist/esm/tests/unit/llm-middleware.test.d.ts +1 -0
  153. package/dist/esm/tests/unit/llm-middleware.test.js +460 -0
  154. package/dist/esm/tests/unit/llm-middleware.test.js.map +1 -0
  155. package/dist/esm/tests/unit/microsoft-cua-client.test.d.ts +1 -0
  156. package/dist/esm/tests/unit/microsoft-cua-client.test.js +84 -0
  157. package/dist/esm/tests/unit/microsoft-cua-client.test.js.map +1 -0
  158. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js +1 -0
  159. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  160. package/package.json +4 -8
  161. package/dist/cjs/lib/v3/dom/build/rerender-index.js +0 -1
  162. package/dist/cjs/lib/v3/dom/build/v3-index.js +0 -1
  163. package/dist/esm/lib/v3/dom/build/rerender-index.js +0 -1
  164. package/dist/esm/lib/v3/dom/build/v3-index.js +0 -1
@@ -1,8 +1,10 @@
1
+ import type { EasyInputMessage } from "openai/resources/responses/responses";
1
2
  import { LogLine } from "../types/public/logs.js";
2
3
  import { AgentAction, AgentResult, AgentType, AgentExecutionOptions, ResponseInputItem, ResponseItem, SafetyConfirmationHandler } from "../types/public/agent.js";
3
4
  import { ClientOptions } from "../types/public/model.js";
4
5
  import { AgentClient } from "./AgentClient.js";
5
6
  import { ToolSet } from "ai";
7
+ type OpenAIRequestInputItem = ResponseInputItem | EasyInputMessage;
6
8
  export declare class OpenAICUAClient extends AgentClient {
7
9
  private pendingContextNotes;
8
10
  private captchaSolvedToolActive;
@@ -19,6 +21,7 @@ export declare class OpenAICUAClient extends AgentClient {
19
21
  private environment;
20
22
  private tools?;
21
23
  private safetyConfirmationHandler?;
24
+ private get usesNewComputerTool();
22
25
  constructor(type: AgentType, modelName: string, userProvidedInstructions?: string, clientOptions?: ClientOptions, tools?: ToolSet);
23
26
  setViewport(width: number, height: number): void;
24
27
  setCurrentUrl(url: string): void;
@@ -37,7 +40,7 @@ export declare class OpenAICUAClient extends AgentClient {
37
40
  * Execute a single step of the agent
38
41
  * This coordinates the flow: Request → Get Action → Execute Action
39
42
  */
40
- executeStep(inputItems: ResponseInputItem[], previousResponseId: string | undefined, logger: (message: LogLine) => void): Promise<{
43
+ executeStep(inputItems: OpenAIRequestInputItem[], previousResponseId: string | undefined, logger: (message: LogLine) => void): Promise<{
41
44
  actions: AgentAction[];
42
45
  message: string;
43
46
  completed: boolean;
@@ -53,7 +56,7 @@ export declare class OpenAICUAClient extends AgentClient {
53
56
  private handleSafetyConfirmation;
54
57
  private isFunctionCallItem;
55
58
  private createInitialInputItems;
56
- getAction(inputItems: ResponseInputItem[], previousResponseId?: string): Promise<{
59
+ getAction(inputItems: OpenAIRequestInputItem[], previousResponseId?: string): Promise<{
57
60
  output: ResponseItem[];
58
61
  responseId: string;
59
62
  usage: Record<string, number>;
@@ -61,9 +64,12 @@ export declare class OpenAICUAClient extends AgentClient {
61
64
  takeAction(output: ResponseItem[], logger: (message: LogLine) => void): Promise<ResponseInputItem[]>;
62
65
  private convertComputerCallToAction;
63
66
  private drainContextNotes;
67
+ private captureInitialScreenshot;
68
+ private convertComputerCallToActions;
64
69
  private convertFunctionCallToAction;
65
70
  captureScreenshot(options?: {
66
71
  base64Image?: string;
67
72
  currentUrl?: string;
68
73
  }): Promise<string>;
69
74
  }
75
+ export {};
@@ -30,6 +30,9 @@ class OpenAICUAClient extends AgentClient_js_1.AgentClient {
30
30
  environment = "browser"; // "browser", "mac", "windows", or "ubuntu"
31
31
  tools;
32
32
  safetyConfirmationHandler;
33
+ get usesNewComputerTool() {
34
+ return this.modelName.startsWith("gpt-5");
35
+ }
33
36
  constructor(type, modelName, userProvidedInstructions, clientOptions, tools) {
34
37
  super(type, modelName, userProvidedInstructions);
35
38
  // Process client options
@@ -97,7 +100,7 @@ class OpenAICUAClient extends AgentClient_js_1.AgentClient {
97
100
  let finalMessage = "";
98
101
  this.reasoningItems.clear(); // Clear any previous reasoning items
99
102
  // Start with the initial instruction
100
- let inputItems = this.createInitialInputItems(instruction);
103
+ let inputItems = await this.createInitialInputItems(instruction);
101
104
  let previousResponseId = undefined;
102
105
  let totalInputTokens = 0;
103
106
  let totalOutputTokens = 0;
@@ -208,15 +211,15 @@ class OpenAICUAClient extends AgentClient_js_1.AgentClient {
208
211
  if (item.type === "computer_call" && this.isComputerCallItem(item)) {
209
212
  logger({
210
213
  category: "agent",
211
- message: `Found computer_call: ${item.action.type}, payload: ${JSON.stringify(item.action)}, call_id: ${item.call_id}`,
214
+ message: `Found computer_call with call_id: ${item.call_id}`,
212
215
  level: 2,
213
216
  });
214
- const action = this.convertComputerCallToAction(item);
215
- if (action) {
217
+ const actions = this.convertComputerCallToActions(item);
218
+ for (const action of actions) {
216
219
  stepActions.push(action);
217
220
  logger({
218
221
  category: "agent",
219
- message: `Converted computer_call to action: ${action.type}`,
222
+ message: `Found computer_call action: ${action.type}, payload: ${JSON.stringify(action)}, call_id: ${item.call_id}`,
220
223
  level: 2,
221
224
  });
222
225
  }
@@ -289,8 +292,8 @@ class OpenAICUAClient extends AgentClient_js_1.AgentClient {
289
292
  isComputerCallItem(item) {
290
293
  return (item.type === "computer_call" &&
291
294
  "call_id" in item &&
292
- "action" in item &&
293
- typeof item.action === "object");
295
+ (("action" in item && typeof item.action === "object") ||
296
+ ("actions" in item && Array.isArray(item.actions))));
294
297
  }
295
298
  async handleSafetyConfirmation(pendingSafetyChecks, logger) {
296
299
  if (this.safetyConfirmationHandler) {
@@ -330,34 +333,54 @@ class OpenAICUAClient extends AgentClient_js_1.AgentClient {
330
333
  "name" in item &&
331
334
  "arguments" in item);
332
335
  }
333
- createInitialInputItems(instruction) {
334
- // For the initial request, we use a simple array with the user's instruction
335
- return [
336
- {
336
+ async createInitialInputItems(instruction) {
337
+ const inputItems = [];
338
+ if (this.userProvidedInstructions) {
339
+ const systemMessage = {
337
340
  role: "system",
338
341
  content: this.userProvidedInstructions,
339
- },
340
- {
341
- role: "user",
342
- content: instruction,
343
- },
342
+ };
343
+ inputItems.push(systemMessage);
344
+ }
345
+ const textInput = {
346
+ type: "input_text",
347
+ text: instruction,
348
+ };
349
+ const userContent = [
350
+ textInput,
344
351
  ];
352
+ const initialScreenshot = await this.captureInitialScreenshot();
353
+ if (initialScreenshot) {
354
+ const screenshotInput = {
355
+ type: "input_image",
356
+ image_url: initialScreenshot,
357
+ detail: "high",
358
+ };
359
+ userContent.push(screenshotInput);
360
+ }
361
+ const userMessage = {
362
+ role: "user",
363
+ content: userContent,
364
+ };
365
+ inputItems.push(userMessage);
366
+ return inputItems;
345
367
  }
346
368
  async getAction(inputItems, previousResponseId) {
347
369
  try {
348
- // Create the request parameters
370
+ // Create the request parameters, branching on tool format
371
+ const computerTool = this.usesNewComputerTool
372
+ ? { type: "computer" }
373
+ : {
374
+ type: "computer_use_preview",
375
+ display_width: this.currentViewport.width,
376
+ display_height: this.currentViewport.height,
377
+ environment: this.environment,
378
+ };
349
379
  const requestParams = {
350
380
  model: this.modelName,
351
- tools: [
352
- {
353
- type: "computer_use_preview",
354
- display_width: this.currentViewport.width,
355
- display_height: this.currentViewport.height,
356
- environment: this.environment,
357
- },
358
- ],
381
+ tools: [computerTool],
359
382
  input: inputItems,
360
- truncation: "auto",
383
+ ...(this.usesNewComputerTool ? {} : { truncation: "auto" }),
361
384
  };
362
385
  // Add custom tools if available
363
386
  if (this.tools && Object.keys(this.tools).length > 0) {
@@ -444,26 +467,34 @@ class OpenAICUAClient extends AgentClient_js_1.AgentClient {
444
467
  // Process each output item
445
468
  for (const item of output) {
446
469
  if (item.type === "computer_call" && this.isComputerCallItem(item)) {
447
- // Handle computer calls
470
+ // Handle computer calls (both single-action and batched-actions formats)
448
471
  try {
449
- const action = this.convertComputerCallToAction(item);
450
- if (action && this.actionHandler) {
451
- logger({
452
- category: "agent",
453
- message: `Executing computer action: ${action.type}`,
454
- level: 1,
455
- });
456
- await this.actionHandler(action);
472
+ const actions = this.convertComputerCallToActions(item);
473
+ if (this.actionHandler) {
474
+ for (const action of actions) {
475
+ logger({
476
+ category: "agent",
477
+ message: `Executing computer action: ${action.type}`,
478
+ level: 1,
479
+ });
480
+ await this.actionHandler(action);
481
+ }
457
482
  }
458
- // Capture a screenshot
483
+ // Capture a screenshot after all actions in the batch
459
484
  const screenshot = await this.captureScreenshot();
460
- // Create a computer_call_output for the next request
485
+ // Build the output — use "computer_screenshot" for new format, "input_image" for legacy
486
+ const outputType = this.usesNewComputerTool
487
+ ? "computer_screenshot"
488
+ : "input_image";
461
489
  const outputItem = {
462
490
  type: "computer_call_output",
463
491
  call_id: item.call_id,
464
492
  output: {
465
- type: "input_image",
493
+ type: outputType,
466
494
  image_url: screenshot,
495
+ ...(this.usesNewComputerTool
496
+ ? { detail: "original" }
497
+ : {}),
467
498
  },
468
499
  };
469
500
  logger({
@@ -471,8 +502,8 @@ class OpenAICUAClient extends AgentClient_js_1.AgentClient {
471
502
  message: `Added computer_call_output for call_id: ${item.call_id}`,
472
503
  level: 2,
473
504
  });
474
- // Add current URL if available
475
- if (this.currentUrl) {
505
+ // Legacy format supports current_url on the output; new format does not
506
+ if (!this.usesNewComputerTool && this.currentUrl) {
476
507
  const computerCallOutput = outputItem;
477
508
  computerCallOutput.output.current_url = this.currentUrl;
478
509
  }
@@ -498,19 +529,23 @@ class OpenAICUAClient extends AgentClient_js_1.AgentClient {
498
529
  level: 0,
499
530
  });
500
531
  try {
501
- // Capture a screenshot even on error
502
532
  const screenshot = await this.captureScreenshot();
533
+ const outputType = this.usesNewComputerTool
534
+ ? "computer_screenshot"
535
+ : "input_image";
503
536
  const errorOutputItem = {
504
537
  type: "computer_call_output",
505
538
  call_id: item.call_id,
506
539
  output: {
507
- type: "input_image",
540
+ type: outputType,
508
541
  image_url: screenshot,
509
542
  error: errorMessage,
543
+ ...(this.usesNewComputerTool
544
+ ? { detail: "original" }
545
+ : {}),
510
546
  },
511
547
  };
512
- // Add current URL if available
513
- if (this.currentUrl) {
548
+ if (!this.usesNewComputerTool && this.currentUrl) {
514
549
  const computerCallOutput = errorOutputItem;
515
550
  computerCallOutput.output.current_url = this.currentUrl;
516
551
  }
@@ -529,13 +564,11 @@ class OpenAICUAClient extends AgentClient_js_1.AgentClient {
529
564
  if (screenshotError instanceof sdkErrors_js_1.StagehandClosedError) {
530
565
  throw screenshotError;
531
566
  }
532
- // If we can't capture a screenshot, just send the error
533
567
  logger({
534
568
  category: "agent",
535
569
  message: `Error capturing screenshot: ${String(screenshotError)}`,
536
570
  level: 0,
537
571
  });
538
- // For error cases without a screenshot, we need to use a string output
539
572
  nextInputItems.push({
540
573
  type: "computer_call_output",
541
574
  call_id: item.call_id,
@@ -629,11 +662,11 @@ class OpenAICUAClient extends AgentClient_js_1.AgentClient {
629
662
  }
630
663
  convertComputerCallToAction(call) {
631
664
  const { action } = call;
632
- // Instead of wrapping the action in a params object, spread the action properties directly
633
- // This ensures properties like x, y, button, etc. are directly accessible on the AgentAction
665
+ if (!action)
666
+ return null;
634
667
  return {
635
668
  type: action.type,
636
- ...action, // Spread all properties from the action
669
+ ...action,
637
670
  };
638
671
  }
639
672
  drainContextNotes() {
@@ -644,6 +677,27 @@ class OpenAICUAClient extends AgentClient_js_1.AgentClient {
644
677
  this.pendingContextNotes = [];
645
678
  return notes;
646
679
  }
680
+ async captureInitialScreenshot() {
681
+ if (!this.screenshotProvider) {
682
+ return undefined;
683
+ }
684
+ try {
685
+ return await this.captureScreenshot();
686
+ }
687
+ catch {
688
+ return undefined;
689
+ }
690
+ }
691
+ convertComputerCallToActions(call) {
692
+ if (call.actions && Array.isArray(call.actions)) {
693
+ return call.actions.map((action) => ({
694
+ type: action.type,
695
+ ...action,
696
+ }));
697
+ }
698
+ const single = this.convertComputerCallToAction(call);
699
+ return single ? [single] : [];
700
+ }
647
701
  convertFunctionCallToAction(call) {
648
702
  try {
649
703
  const args = JSON.parse(call.arguments);
@@ -1 +1 @@
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 { 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\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 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 = 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: ResponseInputItem[],\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: ${item.action.type}, payload: ${JSON.stringify(item.action)}, call_id: ${item.call_id}`,\n level: 2,\n });\n const action = this.convertComputerCallToAction(item);\n if (action) {\n stepActions.push(action);\n logger({\n category: \"agent\",\n message: `Converted computer_call to action: ${action.type}`,\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 &&\n typeof item.action === \"object\"\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 createInitialInputItems(instruction: string): ResponseInputItem[] {\n // For the initial request, we use a simple array with the user's instruction\n return [\n {\n role: \"system\",\n content: this.userProvidedInstructions,\n },\n {\n role: \"user\",\n content: instruction,\n },\n ];\n }\n\n async getAction(\n inputItems: ResponseInputItem[],\n previousResponseId?: string,\n ): Promise<{\n output: ResponseItem[];\n responseId: string;\n usage: Record<string, number>;\n }> {\n try {\n // Create the request parameters\n const requestParams: Record<string, unknown> = {\n model: this.modelName,\n tools: [\n {\n type: \"computer_use_preview\",\n display_width: this.currentViewport.width,\n display_height: this.currentViewport.height,\n environment: this.environment,\n },\n ],\n input: inputItems,\n 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\n try {\n const action = this.convertComputerCallToAction(item);\n\n if (action && this.actionHandler) {\n logger({\n category: \"agent\",\n message: `Executing computer action: ${action.type}`,\n level: 1,\n });\n await this.actionHandler(action);\n }\n\n // Capture a screenshot\n const screenshot = await this.captureScreenshot();\n\n // Create a computer_call_output for the next request\n const outputItem = {\n type: \"computer_call_output\" as const,\n call_id: item.call_id,\n output: {\n type: \"input_image\" as const,\n image_url: screenshot,\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 // Add current URL if available\n if (this.currentUrl) {\n const computerCallOutput = outputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\";\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\";\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 // Capture a screenshot even on error\n const screenshot = await this.captureScreenshot();\n\n const errorOutputItem = {\n type: \"computer_call_output\" as const,\n call_id: item.call_id,\n output: {\n type: \"input_image\" as const,\n image_url: screenshot,\n error: errorMessage,\n },\n } as ResponseInputItem;\n\n // Add current URL if available\n if (this.currentUrl) {\n const computerCallOutput = errorOutputItem as {\n type: \"computer_call_output\";\n call_id: string;\n output: {\n type: \"input_image\";\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\";\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 // If we can't capture a screenshot, just send the error\n logger({\n category: \"agent\",\n message: `Error capturing screenshot: ${String(screenshotError)}`,\n level: 0,\n });\n\n // For error cases without a screenshot, we need to use a string output\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\n // Instead of wrapping the action in a params object, spread the action properties directly\n // This ensures properties like x, y, button, etc. are directly accessible on the AgentAction\n return {\n type: action.type as string,\n ...action, // Spread all properties from the 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 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} 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"]}
@@ -105,7 +105,7 @@ function createAgentTools(v3, options) {
105
105
  fillForm: (0, fillform_js_1.fillFormTool)(v3, executionModel, variables, toolTimeout),
106
106
  fillFormVision: (0, fillFormVision_js_1.fillFormVisionTool)(v3, provider, variables),
107
107
  goto: (0, goto_js_1.gotoTool)(v3),
108
- keys: (0, keys_js_1.keysTool)(v3),
108
+ keys: (0, keys_js_1.keysTool)(v3, variables),
109
109
  navback: (0, navback_js_1.navBackTool)(v3),
110
110
  screenshot: (0, screenshot_js_1.screenshotTool)(v3),
111
111
  scroll: mode === "hybrid" ? (0, scroll_js_1.scrollVisionTool)(v3, provider) : (0, scroll_js_1.scrollTool)(v3),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../lib/v3/agent/tools/index.ts"],"names":[],"mappings":";;AAgJA,4CA4DC;AA5MD,uCAAqC;AACrC,qCAAmC;AACnC,mDAAiD;AACjD,uCAAqC;AACrC,6CAA2C;AAC3C,+CAA6C;AAC7C,+CAA6C;AAC7C,2CAA2D;AAC3D,6CAA2C;AAC3C,yCAAuC;AACvC,uCAAqC;AACrC,qDAAmD;AACnD,uDAAqD;AACrD,uCAAqC;AACrC,2DAAyD;AACzD,yCAAuC;AACvC,iEAA6E;AAC7E,qDAAiE;AAUjE,6DAAqD;AACrD,kEAA+D;AA0C/D;;;;;GAKG;AACH,SAAS,WAAW,CAClB,KAAc,EACd,IAAmB,EACnB,YAAuB;IAEvB,MAAM,QAAQ,GAAY,EAAE,GAAG,KAAK,EAAE,CAAC;IAEvC,uBAAuB;IACvB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,QAAQ,CAAC,QAAQ,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,qBAAqB;QACrB,OAAO,QAAQ,CAAC,KAAK,CAAC;QACtB,OAAO,QAAQ,CAAC,IAAI,CAAC;QACrB,OAAO,QAAQ,CAAC,WAAW,CAAC;QAC5B,OAAO,QAAQ,CAAC,YAAY,CAAC;QAC7B,OAAO,QAAQ,CAAC,cAAc,CAAC;IACjC,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,QAAQ,IAAI,YAAY,EAAE,CAAC;YACpC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,8DAA8D;AAC9D,SAAS,mBAAmB,CAC1B,SAAY,EACZ,QAAgB,EAChB,EAAM,EACN,SAAkB,EAClB,WAAoB;IAEpB,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAEvD,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC;IAC1C,OAAO;QACL,GAAG,SAAS;QACZ,OAAO,EAAE,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;YACpC,IAAI,CAAC;gBACH,OAAO,MAAM,IAAA,8BAAW,EAAC,eAAe,CAAC,GAAG,IAAI,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;YAC1E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,2BAAY,EAAE,CAAC;oBAClC,MAAM,OAAO,GAAG,iBAAiB,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;oBACxF,EAAE,CAAC,MAAM,CAAC;wBACR,QAAQ,EAAE,OAAO;wBACjB,OAAO;wBACP,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;oBACH,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,KAAK,EAAE,OAAO;qBACf,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACG,CAAC;AACT,CAAC;AAED,SAAgB,gBAAgB,CAAC,EAAM,EAAE,OAA4B;IACnE,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,CAAC;IAC/C,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI,IAAI,KAAK,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,CAAC;IACnC,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,CAAC;IAC3C,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,CAAC;IACrC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,CAAC;IAEzC,MAAM,YAAY,GAA2B;QAC3C,GAAG,EAAE,kGAAkG;QACvG,QAAQ,EAAE,6BAA6B;QACvC,OAAO,EAAE,yCAAyC;QAClD,QAAQ,EACN,0GAA0G;KAC7G,CAAC;IAEF,MAAM,cAAc,GAAY;QAC9B,GAAG,EAAE,IAAA,gBAAO,EAAC,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,CAAC;QACxD,QAAQ,EAAE,IAAA,0BAAY,EAAC,EAAE,EAAE,WAAW,CAAC;QACvC,KAAK,EAAE,IAAA,oBAAS,EAAC,EAAE,EAAE,QAAQ,CAAC;QAC9B,YAAY,EAAE,IAAA,kCAAgB,EAAC,EAAE,EAAE,QAAQ,CAAC;QAC5C,WAAW,EAAE,IAAA,gCAAe,EAAC,EAAE,EAAE,QAAQ,CAAC;QAC1C,OAAO,EAAE,IAAA,wBAAW,EAAC,EAAE,EAAE,cAAc,EAAE,WAAW,CAAC;QACrD,QAAQ,EAAE,IAAA,0BAAY,EAAC,EAAE,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,CAAC;QAClE,cAAc,EAAE,IAAA,sCAAkB,EAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC;QAC3D,IAAI,EAAE,IAAA,kBAAQ,EAAC,EAAE,CAAC;QAClB,IAAI,EAAE,IAAA,kBAAQ,EAAC,EAAE,CAAC;QAClB,OAAO,EAAE,IAAA,wBAAW,EAAC,EAAE,CAAC;QACxB,UAAU,EAAE,IAAA,8BAAc,EAAC,EAAE,CAAC;QAC9B,MAAM,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,4BAAgB,EAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAA,sBAAU,EAAC,EAAE,CAAC;QAC3E,IAAI,EAAE,IAAA,kBAAQ,EAAC,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC;KACxC,CAAC;IAEF,IAAI,OAAO,EAAE,SAAS,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACpD,cAAc,CAAC,MAAM,GAAG,IAAA,iCAAqB,EAC3C,EAAE,EACF,OAAO,CAAC,iBAAiB,CAC1B,CAAC;IACJ,CAAC;SAAM,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;QACrC,cAAc,CAAC,MAAM,GAAG,IAAA,2BAAe,EAAC,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,QAAQ,GAAY;QACxB,GAAG,MAAM,CAAC,WAAW,CACnB,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAChD,IAAI;YACJ,mBAAmB,CACjB,CAAC,EACD,GAAG,IAAI,IAAI,EACX,EAAE,EACF,WAAW,EACX,YAAY,CAAC,IAAI,CAAC,CACnB;SACF,CAAC,CACH;QACD,KAAK,EAAE,IAAA,oBAAS,GAAE;QAClB,IAAI,EAAE,IAAA,kBAAQ,EAAC,EAAE,EAAE,IAAI,CAAC;KACzB,CAAC;IAEF,OAAO,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC;AACnD,CAAC","sourcesContent":["import { gotoTool } from \"./goto.js\";\nimport { actTool } from \"./act.js\";\nimport { screenshotTool } from \"./screenshot.js\";\nimport { waitTool } from \"./wait.js\";\nimport { navBackTool } from \"./navback.js\";\nimport { ariaTreeTool } from \"./ariaTree.js\";\nimport { fillFormTool } from \"./fillform.js\";\nimport { scrollTool, scrollVisionTool } from \"./scroll.js\";\nimport { extractTool } from \"./extract.js\";\nimport { clickTool } from \"./click.js\";\nimport { typeTool } from \"./type.js\";\nimport { dragAndDropTool } from \"./dragAndDrop.js\";\nimport { clickAndHoldTool } from \"./clickAndHold.js\";\nimport { keysTool } from \"./keys.js\";\nimport { fillFormVisionTool } from \"./fillFormVision.js\";\nimport { thinkTool } from \"./think.js\";\nimport { searchTool as browserbaseSearchTool } from \"./browserbaseSearch.js\";\nimport { searchTool as braveSearchTool } from \"./braveSearch.js\";\n\nimport type { ToolSet, InferUITools } from \"ai\";\nimport type { V3 } from \"../../v3.js\";\nimport type { LogLine } from \"../../types/public/logs.js\";\nimport type {\n AgentToolMode,\n AgentModelConfig,\n Variables,\n} from \"../../types/public/agent.js\";\nimport { withTimeout } from \"../../timeoutConfig.js\";\nimport { TimeoutError } from \"../../types/public/sdkErrors.js\";\n\nexport interface V3AgentToolOptions {\n executionModel?: string | AgentModelConfig;\n logger?: (message: LogLine) => void;\n /**\n * Tool mode determines which set of tools are available.\n * - 'dom' (default): Uses DOM-based tools (act, fillForm) - removes coordinate-based tools\n * - 'hybrid': Uses coordinate-based tools (click, type, dragAndDrop, etc.) - removes fillForm\n */\n mode?: AgentToolMode;\n /**\n * The model provider. Used for model-specific coordinate handling\n */\n provider?: string;\n /**\n * Tools to exclude from the available toolset.\n * These tools will be filtered out after mode-based filtering.\n */\n excludeTools?: string[];\n /**\n * Variables available to the agent for use in act/type tools.\n * When provided, these tools will have an optional useVariable field.\n */\n variables?: Variables;\n /**\n * Timeout in milliseconds for async tool calls.\n * Applied to all tools that perform I/O (except wait and think).\n */\n toolTimeout?: number;\n /**\n * Whether to enable the Browserbase-powered web search tool.\n * Requires a valid Browserbase API key.\n */\n useSearch?: boolean;\n /**\n * The Browserbase API key used for the search tool.\n * Resolved from BROWSERBASE_API_KEY env var or the Stagehand constructor.\n */\n browserbaseApiKey?: string;\n}\n\n/**\n * Filters tools based on mode and explicit exclusions.\n * - 'dom' mode: Removes coordinate-based tools (click, type, dragAndDrop, clickAndHold, fillFormVision)\n * - 'hybrid' mode: Removes DOM-based form tool (fillForm) in favor of coordinate-based fillFormVision\n * - excludeTools: Additional tools to remove from the toolset\n */\nfunction filterTools(\n tools: ToolSet,\n mode: AgentToolMode,\n excludeTools?: string[],\n): ToolSet {\n const filtered: ToolSet = { ...tools };\n\n // Mode-based filtering\n if (mode === \"hybrid\") {\n delete filtered.fillForm;\n } else {\n // DOM mode (default)\n delete filtered.click;\n delete filtered.type;\n delete filtered.dragAndDrop;\n delete filtered.clickAndHold;\n delete filtered.fillFormVision;\n }\n\n if (excludeTools) {\n for (const toolName of excludeTools) {\n delete filtered[toolName];\n }\n }\n\n return filtered;\n}\n\n/**\n * Wraps an AI SDK tool's execute function with a timeout guard.\n * On timeout, returns `{ success: false, error: \"TimeoutError: ...\" }` to the LLM\n * and logs the error. Also acts as a safety net for any uncaught errors.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction wrapToolWithTimeout<T extends Record<string, any>>(\n agentTool: T,\n toolName: string,\n v3: V3,\n timeoutMs?: number,\n timeoutHint?: string,\n): T {\n if (!timeoutMs || !agentTool.execute) return agentTool;\n\n const originalExecute = agentTool.execute;\n return {\n ...agentTool,\n execute: async (...args: unknown[]) => {\n try {\n return await withTimeout(originalExecute(...args), timeoutMs, toolName);\n } catch (error) {\n if (error instanceof TimeoutError) {\n const message = `TimeoutError: ${error.message}${timeoutHint ? ` ${timeoutHint}` : \"\"}`;\n v3.logger({\n category: \"agent\",\n message,\n level: 0,\n });\n return {\n success: false,\n error: message,\n };\n }\n throw error;\n }\n },\n } as T;\n}\n\nexport function createAgentTools(v3: V3, options?: V3AgentToolOptions) {\n const executionModel = options?.executionModel;\n const mode = options?.mode ?? \"dom\";\n const provider = options?.provider;\n const excludeTools = options?.excludeTools;\n const variables = options?.variables;\n const toolTimeout = options?.toolTimeout;\n\n const timeoutHints: Record<string, string> = {\n act: \"(it may continue executing in the background) — try using a different description for the action\",\n ariaTree: \"— the page may be too large\",\n extract: \"— try using a smaller or simpler schema\",\n fillForm:\n \"(it may continue executing in the background) — try filling fewer fields at once or use a different tool\",\n };\n\n const unwrappedTools: ToolSet = {\n act: actTool(v3, executionModel, variables, toolTimeout),\n ariaTree: ariaTreeTool(v3, toolTimeout),\n click: clickTool(v3, provider),\n clickAndHold: clickAndHoldTool(v3, provider),\n dragAndDrop: dragAndDropTool(v3, provider),\n extract: extractTool(v3, executionModel, toolTimeout),\n fillForm: fillFormTool(v3, executionModel, variables, toolTimeout),\n fillFormVision: fillFormVisionTool(v3, provider, variables),\n goto: gotoTool(v3),\n keys: keysTool(v3),\n navback: navBackTool(v3),\n screenshot: screenshotTool(v3),\n scroll: mode === \"hybrid\" ? scrollVisionTool(v3, provider) : scrollTool(v3),\n type: typeTool(v3, provider, variables),\n };\n\n if (options?.useSearch && options.browserbaseApiKey) {\n unwrappedTools.search = browserbaseSearchTool(\n v3,\n options.browserbaseApiKey,\n );\n } else if (process.env.BRAVE_API_KEY) {\n unwrappedTools.search = braveSearchTool(v3);\n }\n\n const allTools: ToolSet = {\n ...Object.fromEntries(\n Object.entries(unwrappedTools).map(([name, t]) => [\n name,\n wrapToolWithTimeout(\n t,\n `${name}()`,\n v3,\n toolTimeout,\n timeoutHints[name],\n ),\n ]),\n ),\n think: thinkTool(),\n wait: waitTool(v3, mode),\n };\n\n return filterTools(allTools, mode, excludeTools);\n}\n\nexport type AgentTools = ReturnType<typeof createAgentTools>;\n\n/**\n * Type map of all agent tools for strong typing of tool calls and results.\n * Note: `search` is optional — enabled via useSearch: true (Browserbase) or BRAVE_API_KEY env var (legacy).\n */\nexport type AgentToolTypesMap = {\n act: ReturnType<typeof actTool>;\n ariaTree: ReturnType<typeof ariaTreeTool>;\n click: ReturnType<typeof clickTool>;\n clickAndHold: ReturnType<typeof clickAndHoldTool>;\n dragAndDrop: ReturnType<typeof dragAndDropTool>;\n extract: ReturnType<typeof extractTool>;\n fillForm: ReturnType<typeof fillFormTool>;\n fillFormVision: ReturnType<typeof fillFormVisionTool>;\n goto: ReturnType<typeof gotoTool>;\n keys: ReturnType<typeof keysTool>;\n navback: ReturnType<typeof navBackTool>;\n screenshot: ReturnType<typeof screenshotTool>;\n scroll: ReturnType<typeof scrollTool> | ReturnType<typeof scrollVisionTool>;\n search?:\n | ReturnType<typeof browserbaseSearchTool>\n | ReturnType<typeof braveSearchTool>;\n think: ReturnType<typeof thinkTool>;\n type: ReturnType<typeof typeTool>;\n wait: ReturnType<typeof waitTool>;\n};\n\n/**\n * Inferred UI tools type for type-safe tool inputs and outputs.\n * Use with UIMessage for full type safety in UI contexts.\n */\nexport type AgentUITools = InferUITools<AgentToolTypesMap>;\n\n/**\n * Union type for all possible agent tool calls.\n * Provides type-safe access to tool call arguments.\n */\nexport type AgentToolCall = {\n [K in keyof AgentToolTypesMap]: {\n toolName: K;\n toolCallId: string;\n args: AgentUITools[K][\"input\"];\n };\n}[keyof AgentToolTypesMap];\n\n/**\n * Union type for all possible agent tool results.\n * Provides type-safe access to tool result values.\n */\nexport type AgentToolResult = {\n [K in keyof AgentToolTypesMap]: {\n toolName: K;\n toolCallId: string;\n result: AgentUITools[K][\"output\"];\n };\n}[keyof AgentToolTypesMap];\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../lib/v3/agent/tools/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { gotoTool } from \"./goto.js\";\nimport { actTool } from \"./act.js\";\nimport { screenshotTool } from \"./screenshot.js\";\nimport { waitTool } from \"./wait.js\";\nimport { navBackTool } from \"./navback.js\";\nimport { ariaTreeTool } from \"./ariaTree.js\";\nimport { fillFormTool } from \"./fillform.js\";\nimport { scrollTool, scrollVisionTool } from \"./scroll.js\";\nimport { extractTool } from \"./extract.js\";\nimport { clickTool } from \"./click.js\";\nimport { typeTool } from \"./type.js\";\nimport { dragAndDropTool } from \"./dragAndDrop.js\";\nimport { clickAndHoldTool } from \"./clickAndHold.js\";\nimport { keysTool } from \"./keys.js\";\nimport { fillFormVisionTool } from \"./fillFormVision.js\";\nimport { thinkTool } from \"./think.js\";\nimport { searchTool as browserbaseSearchTool } from \"./browserbaseSearch.js\";\nimport { searchTool as braveSearchTool } from \"./braveSearch.js\";\n\nimport type { ToolSet, InferUITools } from \"ai\";\nimport type { V3 } from \"../../v3.js\";\nimport type { LogLine } from \"../../types/public/logs.js\";\nimport type {\n AgentToolMode,\n AgentModelConfig,\n Variables,\n} from \"../../types/public/agent.js\";\nimport { withTimeout } from \"../../timeoutConfig.js\";\nimport { TimeoutError } from \"../../types/public/sdkErrors.js\";\n\nexport interface V3AgentToolOptions {\n executionModel?: string | AgentModelConfig;\n logger?: (message: LogLine) => void;\n /**\n * Tool mode determines which set of tools are available.\n * - 'dom' (default): Uses DOM-based tools (act, fillForm) - removes coordinate-based tools\n * - 'hybrid': Uses coordinate-based tools (click, type, dragAndDrop, etc.) - removes fillForm\n */\n mode?: AgentToolMode;\n /**\n * The model provider. Used for model-specific coordinate handling\n */\n provider?: string;\n /**\n * Tools to exclude from the available toolset.\n * These tools will be filtered out after mode-based filtering.\n */\n excludeTools?: string[];\n /**\n * Variables available to the agent for use in act/type tools.\n * When provided, these tools will have an optional useVariable field.\n */\n variables?: Variables;\n /**\n * Timeout in milliseconds for async tool calls.\n * Applied to all tools that perform I/O (except wait and think).\n */\n toolTimeout?: number;\n /**\n * Whether to enable the Browserbase-powered web search tool.\n * Requires a valid Browserbase API key.\n */\n useSearch?: boolean;\n /**\n * The Browserbase API key used for the search tool.\n * Resolved from BROWSERBASE_API_KEY env var or the Stagehand constructor.\n */\n browserbaseApiKey?: string;\n}\n\n/**\n * Filters tools based on mode and explicit exclusions.\n * - 'dom' mode: Removes coordinate-based tools (click, type, dragAndDrop, clickAndHold, fillFormVision)\n * - 'hybrid' mode: Removes DOM-based form tool (fillForm) in favor of coordinate-based fillFormVision\n * - excludeTools: Additional tools to remove from the toolset\n */\nfunction filterTools(\n tools: ToolSet,\n mode: AgentToolMode,\n excludeTools?: string[],\n): ToolSet {\n const filtered: ToolSet = { ...tools };\n\n // Mode-based filtering\n if (mode === \"hybrid\") {\n delete filtered.fillForm;\n } else {\n // DOM mode (default)\n delete filtered.click;\n delete filtered.type;\n delete filtered.dragAndDrop;\n delete filtered.clickAndHold;\n delete filtered.fillFormVision;\n }\n\n if (excludeTools) {\n for (const toolName of excludeTools) {\n delete filtered[toolName];\n }\n }\n\n return filtered;\n}\n\n/**\n * Wraps an AI SDK tool's execute function with a timeout guard.\n * On timeout, returns `{ success: false, error: \"TimeoutError: ...\" }` to the LLM\n * and logs the error. Also acts as a safety net for any uncaught errors.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction wrapToolWithTimeout<T extends Record<string, any>>(\n agentTool: T,\n toolName: string,\n v3: V3,\n timeoutMs?: number,\n timeoutHint?: string,\n): T {\n if (!timeoutMs || !agentTool.execute) return agentTool;\n\n const originalExecute = agentTool.execute;\n return {\n ...agentTool,\n execute: async (...args: unknown[]) => {\n try {\n return await withTimeout(originalExecute(...args), timeoutMs, toolName);\n } catch (error) {\n if (error instanceof TimeoutError) {\n const message = `TimeoutError: ${error.message}${timeoutHint ? ` ${timeoutHint}` : \"\"}`;\n v3.logger({\n category: \"agent\",\n message,\n level: 0,\n });\n return {\n success: false,\n error: message,\n };\n }\n throw error;\n }\n },\n } as T;\n}\n\nexport function createAgentTools(v3: V3, options?: V3AgentToolOptions) {\n const executionModel = options?.executionModel;\n const mode = options?.mode ?? \"dom\";\n const provider = options?.provider;\n const excludeTools = options?.excludeTools;\n const variables = options?.variables;\n const toolTimeout = options?.toolTimeout;\n\n const timeoutHints: Record<string, string> = {\n act: \"(it may continue executing in the background) — try using a different description for the action\",\n ariaTree: \"— the page may be too large\",\n extract: \"— try using a smaller or simpler schema\",\n fillForm:\n \"(it may continue executing in the background) — try filling fewer fields at once or use a different tool\",\n };\n\n const unwrappedTools: ToolSet = {\n act: actTool(v3, executionModel, variables, toolTimeout),\n ariaTree: ariaTreeTool(v3, toolTimeout),\n click: clickTool(v3, provider),\n clickAndHold: clickAndHoldTool(v3, provider),\n dragAndDrop: dragAndDropTool(v3, provider),\n extract: extractTool(v3, executionModel, toolTimeout),\n fillForm: fillFormTool(v3, executionModel, variables, toolTimeout),\n fillFormVision: fillFormVisionTool(v3, provider, variables),\n goto: gotoTool(v3),\n keys: keysTool(v3, variables),\n navback: navBackTool(v3),\n screenshot: screenshotTool(v3),\n scroll: mode === \"hybrid\" ? scrollVisionTool(v3, provider) : scrollTool(v3),\n type: typeTool(v3, provider, variables),\n };\n\n if (options?.useSearch && options.browserbaseApiKey) {\n unwrappedTools.search = browserbaseSearchTool(\n v3,\n options.browserbaseApiKey,\n );\n } else if (process.env.BRAVE_API_KEY) {\n unwrappedTools.search = braveSearchTool(v3);\n }\n\n const allTools: ToolSet = {\n ...Object.fromEntries(\n Object.entries(unwrappedTools).map(([name, t]) => [\n name,\n wrapToolWithTimeout(\n t,\n `${name}()`,\n v3,\n toolTimeout,\n timeoutHints[name],\n ),\n ]),\n ),\n think: thinkTool(),\n wait: waitTool(v3, mode),\n };\n\n return filterTools(allTools, mode, excludeTools);\n}\n\nexport type AgentTools = ReturnType<typeof createAgentTools>;\n\n/**\n * Type map of all agent tools for strong typing of tool calls and results.\n * Note: `search` is optional — enabled via useSearch: true (Browserbase) or BRAVE_API_KEY env var (legacy).\n */\nexport type AgentToolTypesMap = {\n act: ReturnType<typeof actTool>;\n ariaTree: ReturnType<typeof ariaTreeTool>;\n click: ReturnType<typeof clickTool>;\n clickAndHold: ReturnType<typeof clickAndHoldTool>;\n dragAndDrop: ReturnType<typeof dragAndDropTool>;\n extract: ReturnType<typeof extractTool>;\n fillForm: ReturnType<typeof fillFormTool>;\n fillFormVision: ReturnType<typeof fillFormVisionTool>;\n goto: ReturnType<typeof gotoTool>;\n keys: ReturnType<typeof keysTool>;\n navback: ReturnType<typeof navBackTool>;\n screenshot: ReturnType<typeof screenshotTool>;\n scroll: ReturnType<typeof scrollTool> | ReturnType<typeof scrollVisionTool>;\n search?:\n | ReturnType<typeof browserbaseSearchTool>\n | ReturnType<typeof braveSearchTool>;\n think: ReturnType<typeof thinkTool>;\n type: ReturnType<typeof typeTool>;\n wait: ReturnType<typeof waitTool>;\n};\n\n/**\n * Inferred UI tools type for type-safe tool inputs and outputs.\n * Use with UIMessage for full type safety in UI contexts.\n */\nexport type AgentUITools = InferUITools<AgentToolTypesMap>;\n\n/**\n * Union type for all possible agent tool calls.\n * Provides type-safe access to tool call arguments.\n */\nexport type AgentToolCall = {\n [K in keyof AgentToolTypesMap]: {\n toolName: K;\n toolCallId: string;\n args: AgentUITools[K][\"input\"];\n };\n}[keyof AgentToolTypesMap];\n\n/**\n * Union type for all possible agent tool results.\n * Provides type-safe access to tool result values.\n */\nexport type AgentToolResult = {\n [K in keyof AgentToolTypesMap]: {\n toolName: K;\n toolCallId: string;\n result: AgentUITools[K][\"output\"];\n };\n}[keyof AgentToolTypesMap];\n"]}