@browserbasehq/orca 3.7.1-preview.0 → 3.7.2-preview.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/cjs/lib/v3/agent/tools/click.js +16 -5
  2. package/dist/cjs/lib/v3/agent/tools/click.js.map +1 -1
  3. package/dist/cjs/lib/v3/agent/tools/clickAndHold.js +1 -1
  4. package/dist/cjs/lib/v3/agent/tools/clickAndHold.js.map +1 -1
  5. package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js +2 -2
  6. package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
  7. package/dist/cjs/lib/v3/agent/tools/fillFormVision.js +18 -7
  8. package/dist/cjs/lib/v3/agent/tools/fillFormVision.js.map +1 -1
  9. package/dist/cjs/lib/v3/agent/tools/scroll.js +1 -1
  10. package/dist/cjs/lib/v3/agent/tools/scroll.js.map +1 -1
  11. package/dist/cjs/lib/v3/agent/tools/type.js +13 -4
  12. package/dist/cjs/lib/v3/agent/tools/type.js.map +1 -1
  13. package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.d.ts +5 -2
  14. package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js +5 -7
  15. package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
  16. package/dist/cjs/lib/v3/api.d.ts +1 -1
  17. package/dist/cjs/lib/v3/api.js +2 -1
  18. package/dist/cjs/lib/v3/api.js.map +1 -1
  19. package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js +20 -0
  20. package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
  21. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +34 -20
  22. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  23. package/dist/cjs/lib/v3/llm/aisdk.js +3 -3
  24. package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
  25. package/dist/cjs/lib/v3/types/public/api.d.ts +53 -0
  26. package/dist/cjs/lib/v3/types/public/api.js +8 -0
  27. package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
  28. package/dist/cjs/lib/v3/types/public/options.d.ts +13 -0
  29. package/dist/cjs/lib/v3/types/public/options.js.map +1 -1
  30. package/dist/cjs/lib/v3/understudy/locator.d.ts +12 -0
  31. package/dist/cjs/lib/v3/understudy/locator.js +44 -0
  32. package/dist/cjs/lib/v3/understudy/locator.js.map +1 -1
  33. package/dist/cjs/lib/v3/understudy/page.d.ts +15 -0
  34. package/dist/cjs/lib/v3/understudy/page.js +50 -0
  35. package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
  36. package/dist/cjs/lib/v3/v3.d.ts +14 -0
  37. package/dist/cjs/lib/v3/v3.js +39 -13
  38. package/dist/cjs/lib/v3/v3.js.map +1 -1
  39. package/dist/cjs/lib/version.d.ts +1 -1
  40. package/dist/cjs/lib/version.js +1 -1
  41. package/dist/cjs/lib/version.js.map +1 -1
  42. package/dist/esm/lib/v3/agent/tools/click.js +16 -5
  43. package/dist/esm/lib/v3/agent/tools/click.js.map +1 -1
  44. package/dist/esm/lib/v3/agent/tools/clickAndHold.js +1 -1
  45. package/dist/esm/lib/v3/agent/tools/clickAndHold.js.map +1 -1
  46. package/dist/esm/lib/v3/agent/tools/dragAndDrop.js +2 -2
  47. package/dist/esm/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
  48. package/dist/esm/lib/v3/agent/tools/fillFormVision.js +19 -8
  49. package/dist/esm/lib/v3/agent/tools/fillFormVision.js.map +1 -1
  50. package/dist/esm/lib/v3/agent/tools/scroll.js +1 -1
  51. package/dist/esm/lib/v3/agent/tools/scroll.js.map +1 -1
  52. package/dist/esm/lib/v3/agent/tools/type.js +13 -4
  53. package/dist/esm/lib/v3/agent/tools/type.js.map +1 -1
  54. package/dist/esm/lib/v3/agent/utils/coordinateNormalization.d.ts +5 -2
  55. package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js +5 -7
  56. package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
  57. package/dist/esm/lib/v3/api.d.ts +1 -1
  58. package/dist/esm/lib/v3/api.js +2 -1
  59. package/dist/esm/lib/v3/api.js.map +1 -1
  60. package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +20 -0
  61. package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
  62. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +34 -20
  63. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  64. package/dist/esm/lib/v3/llm/aisdk.js +3 -3
  65. package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
  66. package/dist/esm/lib/v3/types/public/api.d.ts +53 -0
  67. package/dist/esm/lib/v3/types/public/api.js +8 -0
  68. package/dist/esm/lib/v3/types/public/api.js.map +1 -1
  69. package/dist/esm/lib/v3/types/public/options.d.ts +13 -0
  70. package/dist/esm/lib/v3/types/public/options.js.map +1 -1
  71. package/dist/esm/lib/v3/understudy/locator.d.ts +12 -0
  72. package/dist/esm/lib/v3/understudy/locator.js +44 -0
  73. package/dist/esm/lib/v3/understudy/locator.js.map +1 -1
  74. package/dist/esm/lib/v3/understudy/page.d.ts +15 -0
  75. package/dist/esm/lib/v3/understudy/page.js +50 -0
  76. package/dist/esm/lib/v3/understudy/page.js.map +1 -1
  77. package/dist/esm/lib/v3/v3.d.ts +14 -0
  78. package/dist/esm/lib/v3/v3.js +39 -13
  79. package/dist/esm/lib/v3/v3.js.map +1 -1
  80. package/dist/esm/lib/version.d.ts +1 -1
  81. package/dist/esm/lib/version.js +1 -1
  82. package/dist/esm/lib/version.js.map +1 -1
  83. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../lib/v3/api.ts"],"names":[],"mappings":"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","sourcesContent":["import makeFetchCookie from \"fetch-cookie\";\nimport {\n getInheritableModelOptions,\n hasModelProviderAuth,\n loadApiKeyFromEnv,\n} from \"../utils.js\";\nimport { isAutoModel } from \"../modelUtils.js\";\nimport { STAGEHAND_VERSION } from \"../version.js\";\nimport {\n StagehandAPIError,\n StagehandAPIUnauthorizedError,\n StagehandHttpError,\n StagehandResponseBodyError,\n StagehandResponseParseError,\n StagehandServerError,\n ExperimentalNotConfiguredError,\n} from \"./types/public/index.js\";\nimport type {\n ActResult,\n AgentConfig,\n AgentExecuteOptions,\n AgentResult,\n ExtractResult,\n ObserveResult,\n LogLine,\n StagehandMetrics,\n BrowserbaseRegion,\n ActOptions,\n ExtractOptions,\n ObserveOptions,\n Api,\n} from \"./types/public/index.js\";\nimport type {\n SerializableResponse,\n AgentCacheTransferPayload,\n} from \"./types/private/index.js\";\nimport type { ModelConfiguration } from \"./types/public/model.js\";\nimport { toJsonSchema } from \"./zodCompat.js\";\nimport type { StagehandZodSchema } from \"./zodCompat.js\";\n\n// =============================================================================\n// Multi-region API URL mapping\n// =============================================================================\n\n/**\n * Mapping of Browserbase regions to their corresponding Stagehand API base URLs.\n * Users should configure their client to hit the API endpoint that matches\n * the region where their browser session is running.\n */\nexport const REGION_API_URLS: Record<BrowserbaseRegion, string> = {\n \"us-west-2\": \"https://api.stagehand.browserbase.com\",\n \"us-east-1\": \"https://api.use1.stagehand.browserbase.com\",\n \"eu-central-1\": \"https://api.euc1.stagehand.browserbase.com\",\n \"ap-southeast-1\": \"https://api.apse1.stagehand.browserbase.com\",\n};\n\n/**\n * Returns the full API URL (with /v1 suffix) for a given Browserbase region.\n * If no region is specified or the region is unknown, defaults to us-west-2.\n *\n * @param region - The Browserbase region (e.g., \"us-west-2\", \"eu-central-1\")\n * @returns The full API URL including /v1 suffix\n */\nexport function getApiUrlForRegion(\n region: BrowserbaseRegion | undefined,\n): string {\n const baseUrl =\n REGION_API_URLS[region as BrowserbaseRegion] ??\n REGION_API_URLS[\"us-west-2\"];\n return `${baseUrl}/v1`;\n}\n\n// =============================================================================\n// Client-specific types (can't be Zod schemas due to functions/Page objects)\n// =============================================================================\n//\n// These types mirror the Api.* schemas from types/public/api.ts but include\n// non-serializable SDK fields (like Page objects) that get stripped before\n// sending requests over the wire.\n//\n// Relationship to wire format:\n// - Client accepts: SDK types (ActOptions, ExtractOptions, etc.) with optional `page`\n// - Wire sends: Api.* types (page stripped, Zod schema converted to JSON schema)\n// - Client returns: SDK result types (ActResult, ExtractResult, etc.)\n// =============================================================================\n\n/**\n * Constructor parameters for StagehandAPIClient\n */\ninterface StagehandAPIConstructorParams {\n apiKey: string;\n projectId?: string;\n logger: (message: LogLine) => void;\n /**\n * When true, enables server-side caching by default for all requests.\n * When false, disables server-side caching.\n * Defaults to true (caching enabled).\n * Can be overridden per-method in act(), extract(), and observe() options.\n */\n serverCache?: boolean;\n}\n\n/**\n * Parameters for starting a session via the API client.\n * Extends Api.SessionStartRequest with client-specific field (modelApiKey).\n *\n * Wire format: Api.SessionStartRequest (modelApiKey sent via header, not body)\n */\ninterface ClientSessionStartParams extends Api.SessionStartRequest {\n /** Model API key - sent via x-model-api-key header, not in request body.\n * Optional: when omitted, requests are sent without the x-model-api-key header\n * and the server is expected to handle model authentication on its own. */\n modelApiKey?: string;\n /** Default model config for later action requests. Not sent to /sessions/start. */\n defaultModelConfig?: ModelConfiguration;\n}\n\n/**\n * Generic API response wrapper matching Api.*Response schemas\n */\ntype ApiResponse<T> =\n | { success: true; data: T }\n | { success: false; message: string };\n\ntype PreparedModelConfig = { modelName: string; apiKey?: string } & Record<\n string,\n unknown\n>;\n\n/**\n * Union of all API request body types for type-safe execute() calls\n */\ntype ApiRequestBody =\n | Api.ActRequest\n | Api.ExtractRequest\n | Api.ObserveRequest\n | Api.NavigateRequest\n | Api.AgentExecuteRequest;\n\n/**\n * Parameters for executing an action via the streaming API\n */\ninterface ExecuteActionParams {\n method: \"act\" | \"extract\" | \"observe\" | \"navigate\" | \"end\" | \"agentExecute\";\n args?: ApiRequestBody;\n params?: Record<string, string>;\n /**\n * Override the instance-level serverCache setting for this request.\n * When true, enables server-side caching.\n * When false, disables server-side caching.\n */\n serverCache?: boolean;\n}\n\n/**\n * Client parameters for act() method.\n * Derives structure from Api.ActRequest but uses SDK's ActOptions (which includes `page`).\n * Before serialization, `page` is stripped to produce Api.ActRequest wire format.\n */\ninterface ClientActParameters {\n input: Api.ActRequest[\"input\"];\n options?: ActOptions;\n frameId?: Api.ActRequest[\"frameId\"];\n}\n\n/**\n * Client parameters for extract() method.\n * Derives structure from Api.ExtractRequest but uses SDK's ExtractOptions (which includes `page`)\n * and accepts Zod schema (converted to JSON schema for wire format).\n */\ninterface ClientExtractParameters {\n instruction?: Api.ExtractRequest[\"instruction\"];\n schema?: StagehandZodSchema;\n options?: ExtractOptions;\n frameId?: Api.ExtractRequest[\"frameId\"];\n}\n\n/**\n * Client parameters for observe() method.\n * Derives structure from Api.ObserveRequest but uses SDK's ObserveOptions (which includes `page`).\n * Before serialization, `page` is stripped to produce Api.ObserveRequest wire format.\n */\ninterface ClientObserveParameters {\n instruction?: Api.ObserveRequest[\"instruction\"];\n options?: ObserveOptions;\n frameId?: Api.ObserveRequest[\"frameId\"];\n}\n\nexport class StagehandAPIClient {\n private apiKey: string;\n private projectId?: string;\n private sessionId?: string;\n private modelApiKey?: string;\n private modelProvider?: string;\n private defaultModelConfig?: PreparedModelConfig;\n private region?: BrowserbaseRegion;\n private logger: (message: LogLine) => void;\n private fetchWithCookies;\n private serverCache: boolean;\n private lastFinishedEventData: Record<string, unknown> | null = null;\n private latestAgentCacheEntry: AgentCacheTransferPayload | null = null;\n private warnedStagehandBaseUrl = false;\n\n constructor({\n apiKey,\n projectId,\n logger,\n serverCache,\n }: StagehandAPIConstructorParams) {\n this.apiKey = apiKey;\n this.projectId = projectId;\n this.logger = logger;\n this.serverCache = serverCache ?? true;\n // Create a single cookie jar instance that will persist across all requests\n this.fetchWithCookies = makeFetchCookie(fetch);\n }\n\n async init({\n modelName,\n modelApiKey,\n defaultModelConfig,\n domSettleTimeoutMs,\n verbose,\n systemPrompt,\n selfHeal,\n browserbaseSessionCreateParams,\n browserbaseSessionID,\n // browser, TODO for local browsers\n }: ClientSessionStartParams): Promise<Api.SessionStartResult> {\n this.modelApiKey = modelApiKey;\n // Extract provider from modelName (e.g., \"openai/gpt-5-nano\" -> \"openai\")\n this.modelProvider = modelName?.includes(\"/\")\n ? modelName.split(\"/\")[0]\n : undefined;\n this.defaultModelConfig = defaultModelConfig\n ? this.prepareModelConfig(defaultModelConfig)\n : undefined;\n\n // Store the region for multi-region API URL resolution\n this.region = browserbaseSessionCreateParams?.region;\n\n this.logger({\n category: \"init\",\n message: \"Creating new browserbase session...\",\n level: 1,\n });\n\n // Build wire-format request body (Api.SessionStartRequest shape)\n const requestBody: Api.SessionStartRequest = {\n modelName,\n domSettleTimeoutMs,\n verbose,\n systemPrompt,\n selfHeal,\n browserbaseSessionCreateParams,\n browserbaseSessionID,\n // browser, TODO: only send when connected to local fastify\n };\n\n const sessionResponse = await this.request(\"/sessions/start\", {\n method: \"POST\",\n body: JSON.stringify(requestBody),\n });\n\n if (sessionResponse.status === 401) {\n throw new StagehandAPIUnauthorizedError(\n \"Unauthorized. Ensure you provided a valid API key.\",\n );\n } else if (sessionResponse.status !== 200) {\n const errorText = await sessionResponse.text();\n this.logger({\n category: \"api\",\n message: `API error (${sessionResponse.status}): ${errorText}`,\n level: 0,\n });\n throw new StagehandHttpError(`Unknown error: ${sessionResponse.status}`);\n }\n\n const sessionResponseBody =\n (await sessionResponse.json()) as ApiResponse<Api.SessionStartResult>;\n\n if (sessionResponseBody.success === false) {\n throw new StagehandAPIError(sessionResponseBody.message);\n }\n\n // Temporary reroute for rollout\n if (!sessionResponseBody.data?.available && browserbaseSessionID) {\n sessionResponseBody.data.sessionId = browserbaseSessionID;\n }\n\n this.sessionId = sessionResponseBody.data.sessionId;\n\n return sessionResponseBody.data;\n }\n\n async act({\n input,\n options,\n frameId,\n }: ClientActParameters): Promise<ActResult> {\n // Strip non-serializable `page` and SDK-only fields from options before wire serialization\n let wireOptions: Api.ActRequest[\"options\"];\n let serverCache: boolean | undefined;\n if (options) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page: _, serverCache: enableCache, ...restOptions } = options;\n serverCache = enableCache;\n if (restOptions.model) {\n restOptions.model = this.prepareModelConfig(restOptions.model);\n } else if (this.defaultModelConfig) {\n restOptions.model = this.getDefaultModelConfig();\n }\n if (Object.keys(restOptions).length > 0) {\n wireOptions = restOptions as unknown as Api.ActRequest[\"options\"];\n }\n } else if (this.defaultModelConfig) {\n wireOptions = {\n model: this.getDefaultModelConfig(),\n } as unknown as Api.ActRequest[\"options\"];\n }\n\n // Build wire-format request body\n const requestBody: Api.ActRequest = {\n input,\n options: wireOptions,\n frameId,\n };\n\n return this.execute<ActResult>({\n method: \"act\",\n args: requestBody,\n serverCache,\n });\n }\n\n async extract<T extends StagehandZodSchema>({\n instruction,\n schema: zodSchema,\n options,\n frameId,\n }: ClientExtractParameters): Promise<ExtractResult<T>> {\n // Convert Zod schema to JSON schema for wire format\n const jsonSchema = zodSchema ? toJsonSchema(zodSchema) : undefined;\n\n // Strip non-serializable `page` and SDK-only fields from options before wire serialization\n let wireOptions: Api.ExtractRequest[\"options\"];\n let serverCache: boolean | undefined;\n if (options) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page: _, serverCache: enableCache, ...restOptions } = options;\n serverCache = enableCache;\n if (restOptions.model) {\n restOptions.model = this.prepareModelConfig(restOptions.model);\n } else if (this.defaultModelConfig) {\n restOptions.model = this.getDefaultModelConfig();\n }\n if (Object.keys(restOptions).length > 0) {\n wireOptions = restOptions as unknown as Api.ExtractRequest[\"options\"];\n }\n } else if (this.defaultModelConfig) {\n wireOptions = {\n model: this.getDefaultModelConfig(),\n } as unknown as Api.ExtractRequest[\"options\"];\n }\n\n // Build wire-format request body\n const requestBody: Api.ExtractRequest = {\n instruction,\n schema: jsonSchema,\n options: wireOptions,\n frameId,\n };\n\n return this.execute<ExtractResult<T>>({\n method: \"extract\",\n args: requestBody,\n serverCache,\n });\n }\n\n async observe({\n instruction,\n options,\n frameId,\n }: ClientObserveParameters): Promise<ObserveResult> {\n // Strip non-serializable `page` and SDK-only fields from options before wire serialization\n let wireOptions: Api.ObserveRequest[\"options\"];\n let serverCache: boolean | undefined;\n if (options) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page: _, serverCache: enableCache, ...restOptions } = options;\n serverCache = enableCache;\n if (restOptions.model) {\n restOptions.model = this.prepareModelConfig(restOptions.model);\n } else if (this.defaultModelConfig) {\n restOptions.model = this.getDefaultModelConfig();\n }\n if (Object.keys(restOptions).length > 0) {\n wireOptions = restOptions as unknown as Api.ObserveRequest[\"options\"];\n }\n } else if (this.defaultModelConfig) {\n wireOptions = {\n model: this.getDefaultModelConfig(),\n } as unknown as Api.ObserveRequest[\"options\"];\n }\n\n // Build wire-format request body\n const requestBody: Api.ObserveRequest = {\n instruction,\n options: wireOptions,\n frameId,\n };\n\n return this.execute<ObserveResult>({\n method: \"observe\",\n args: requestBody,\n serverCache,\n });\n }\n\n async goto(\n url: string,\n options?: Api.NavigateRequest[\"options\"],\n frameId?: string,\n ): Promise<SerializableResponse | null> {\n const publicOptions = { ...(options ?? {}) } as NonNullable<\n Api.NavigateRequest[\"options\"]\n > & { model?: unknown };\n delete publicOptions.model;\n\n const wireOptions = {\n ...publicOptions,\n ...(this.defaultModelConfig\n ? { model: this.getDefaultModelConfig() }\n : {}),\n };\n const requestBody: Api.NavigateRequest = {\n url,\n options: Object.keys(wireOptions).length > 0 ? wireOptions : undefined,\n frameId,\n };\n\n return this.execute<SerializableResponse | null>({\n method: \"navigate\",\n args: requestBody,\n });\n }\n\n async agentExecute(\n agentConfig: AgentConfig,\n executeOptions: AgentExecuteOptions | string,\n frameId?: string,\n shouldCache?: boolean,\n ): Promise<AgentResult> {\n // Check if integrations are being used in API mode (not supported)\n if (agentConfig.integrations && agentConfig.integrations.length > 0) {\n throw new ExperimentalNotConfiguredError(\"MCP integrations\");\n }\n\n // Strip non-serializable `page` from executeOptions before wire serialization\n let wireExecuteOptions: Api.AgentExecuteRequest[\"executeOptions\"];\n if (typeof executeOptions === \"string\") {\n wireExecuteOptions = { instruction: executeOptions };\n } else if (executeOptions.page) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page: _, ...rest } = executeOptions;\n wireExecuteOptions = rest;\n } else {\n wireExecuteOptions = executeOptions;\n }\n\n const wireAgentConfig: Api.AgentExecuteRequest[\"agentConfig\"] = {\n systemPrompt: agentConfig.systemPrompt,\n mode: agentConfig.mode ?? (agentConfig.cua === true ? \"cua\" : undefined),\n cua: agentConfig.mode === undefined ? agentConfig.cua : undefined,\n model: agentConfig.model\n ? this.prepareModelConfig(agentConfig.model)\n : this.getDefaultModelConfig(),\n executionModel: agentConfig.executionModel\n ? this.prepareModelConfig(agentConfig.executionModel)\n : undefined,\n };\n\n // Build wire-format request body\n const requestBody: Api.AgentExecuteRequest = {\n agentConfig: wireAgentConfig,\n executeOptions: wireExecuteOptions,\n frameId,\n shouldCache,\n };\n\n const result = await this.execute<AgentResult>({\n method: \"agentExecute\",\n args: requestBody,\n });\n\n const finishedData =\n this.consumeFinishedEventData<Api.AgentExecuteResult>() ?? null;\n this.latestAgentCacheEntry =\n finishedData?.cacheEntry !== undefined\n ? (finishedData.cacheEntry as AgentCacheTransferPayload)\n : null;\n return result;\n }\n\n consumeLatestAgentCacheEntry(): AgentCacheTransferPayload | null {\n const entry = this.latestAgentCacheEntry;\n this.latestAgentCacheEntry = null;\n return entry;\n }\n\n async end(): Promise<Response> {\n const url = `/sessions/${this.sessionId}/end`;\n const response = await this.request(url, {\n method: \"POST\",\n });\n return response;\n }\n\n async getReplayMetrics(): Promise<StagehandMetrics> {\n if (!this.sessionId) {\n throw new StagehandAPIError(\"sessionId is required to fetch metrics.\");\n }\n\n const response = await this.request(`/sessions/${this.sessionId}/replay`, {\n method: \"GET\",\n });\n\n if (response.status !== 200) {\n const errorText = await response.text();\n this.logger({\n category: \"api\",\n message: `Failed to fetch metrics. Status ${response.status}: ${errorText}`,\n level: 0,\n });\n throw new StagehandHttpError(\n `Failed to fetch metrics with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as\n | Api.ReplayResponse\n | { success: false; error?: string };\n\n if (!data.success) {\n const errorData = data as { success: false; error?: string };\n throw new StagehandAPIError(\n `Failed to fetch metrics: ${errorData.error || \"Unknown error\"}`,\n );\n }\n\n // Parse the API data into StagehandMetrics format\n const apiData = (data as Api.ReplayResponse).data;\n const metrics: StagehandMetrics = {\n actPromptTokens: 0,\n actCompletionTokens: 0,\n actReasoningTokens: 0,\n actCachedInputTokens: 0,\n actInferenceTimeMs: 0,\n extractPromptTokens: 0,\n extractCompletionTokens: 0,\n extractReasoningTokens: 0,\n extractCachedInputTokens: 0,\n extractInferenceTimeMs: 0,\n observePromptTokens: 0,\n observeCompletionTokens: 0,\n observeReasoningTokens: 0,\n observeCachedInputTokens: 0,\n observeInferenceTimeMs: 0,\n agentPromptTokens: 0,\n agentCompletionTokens: 0,\n agentReasoningTokens: 0,\n agentCachedInputTokens: 0,\n agentInferenceTimeMs: 0,\n totalPromptTokens: 0,\n totalCompletionTokens: 0,\n totalReasoningTokens: 0,\n totalCachedInputTokens: 0,\n totalInferenceTimeMs: 0,\n };\n\n // Parse pages and their actions\n const pages = apiData?.pages || [];\n for (const page of pages) {\n const actions = page.actions || [];\n for (const action of actions) {\n // Get method name and token usage\n const method = (action.method || \"\").toLowerCase();\n const tokenUsage = action.tokenUsage;\n\n if (tokenUsage) {\n const inputTokens = tokenUsage.inputTokens || 0;\n const outputTokens = tokenUsage.outputTokens || 0;\n const reasoningTokens =\n \"reasoningTokens\" in tokenUsage\n ? Number(\n (tokenUsage as { reasoningTokens?: number })\n .reasoningTokens ?? 0,\n )\n : 0;\n const cachedInputTokens =\n \"cachedInputTokens\" in tokenUsage\n ? Number(\n (tokenUsage as { cachedInputTokens?: number })\n .cachedInputTokens ?? 0,\n )\n : 0;\n const timeMs = tokenUsage.timeMs || 0;\n\n // Map method to metrics fields\n if (method === \"act\") {\n metrics.actPromptTokens += inputTokens;\n metrics.actCompletionTokens += outputTokens;\n metrics.actReasoningTokens += reasoningTokens;\n metrics.actCachedInputTokens += cachedInputTokens;\n metrics.actInferenceTimeMs += timeMs;\n } else if (method === \"extract\") {\n metrics.extractPromptTokens += inputTokens;\n metrics.extractCompletionTokens += outputTokens;\n metrics.extractReasoningTokens += reasoningTokens;\n metrics.extractCachedInputTokens += cachedInputTokens;\n metrics.extractInferenceTimeMs += timeMs;\n } else if (method === \"observe\") {\n metrics.observePromptTokens += inputTokens;\n metrics.observeCompletionTokens += outputTokens;\n metrics.observeReasoningTokens += reasoningTokens;\n metrics.observeCachedInputTokens += cachedInputTokens;\n metrics.observeInferenceTimeMs += timeMs;\n } else if (method === \"agent\") {\n metrics.agentPromptTokens += inputTokens;\n metrics.agentCompletionTokens += outputTokens;\n metrics.agentReasoningTokens += reasoningTokens;\n metrics.agentCachedInputTokens += cachedInputTokens;\n metrics.agentInferenceTimeMs += timeMs;\n }\n\n // Always update totals for any method with token usage\n metrics.totalPromptTokens += inputTokens;\n metrics.totalCompletionTokens += outputTokens;\n metrics.totalReasoningTokens += reasoningTokens;\n metrics.totalCachedInputTokens += cachedInputTokens;\n metrics.totalInferenceTimeMs += timeMs;\n }\n }\n }\n\n return metrics;\n }\n\n /**\n * Prepares a model configuration for the API payload by ensuring the `apiKey`\n * is included. If the model is passed as a string, converts it to an object\n * with `modelName` and `apiKey`.\n *\n * In API mode, we only attempt to load an API key from env vars when the\n * model provider differs from the one used to init the session.\n */\n private prepareModelConfig(model: ModelConfiguration): PreparedModelConfig {\n // \"auto\" delegates model selection to the API, so never inherit the\n // default model's provider config or API key — the server picks the\n // provider. Explicit per-call options are still passed through.\n if (isAutoModel(model)) {\n return typeof model === \"string\"\n ? { modelName: model }\n : ({ ...model } as PreparedModelConfig);\n }\n\n if (typeof model === \"string\") {\n // Extract provider from model string (e.g., \"openai/gpt-5-nano\" -> \"openai\")\n const provider = this.getModelProvider(model);\n const inheritedDefault =\n provider && provider === this.modelProvider\n ? this.getDefaultModelConfig()\n : undefined;\n const apiKey = hasModelProviderAuth(inheritedDefault)\n ? undefined\n : provider && provider !== this.modelProvider\n ? (loadApiKeyFromEnv(provider, this.logger) ?? this.modelApiKey)\n : this.modelApiKey;\n return {\n ...inheritedDefault,\n modelName: model,\n ...(apiKey ? { apiKey } : {}),\n };\n }\n\n const provider = this.getModelProvider(model.modelName);\n const modelHasCredentials =\n hasModelProviderAuth(model) ||\n Boolean((model as { apiKey?: string }).apiKey);\n const defaultConfig =\n provider && provider === this.modelProvider\n ? this.getDefaultModelConfig()\n : undefined;\n const inheritedDefault = modelHasCredentials\n ? getInheritableModelOptions(defaultConfig)\n : defaultConfig;\n const mergedModel = {\n ...(inheritedDefault ?? {}),\n ...model,\n } as PreparedModelConfig;\n const hasProviderAuth = hasModelProviderAuth(mergedModel);\n const apiKey = hasProviderAuth\n ? undefined\n : !mergedModel.apiKey && provider && provider !== this.modelProvider\n ? (loadApiKeyFromEnv(provider, this.logger) ?? this.modelApiKey)\n : !mergedModel.apiKey\n ? this.modelApiKey\n : undefined;\n\n return {\n ...mergedModel,\n ...(apiKey ? { apiKey } : {}),\n } as PreparedModelConfig;\n }\n\n private getDefaultModelConfig(): PreparedModelConfig | undefined {\n return this.defaultModelConfig\n ? ({ ...this.defaultModelConfig } as PreparedModelConfig)\n : undefined;\n }\n\n private getModelProvider(modelName: string | undefined): string | undefined {\n return modelName?.includes(\"/\") ? modelName.split(\"/\")[0] : undefined;\n }\n\n private consumeFinishedEventData<T>(): T | null {\n const data = this.lastFinishedEventData as T | null;\n this.lastFinishedEventData = null;\n return data;\n }\n\n private async execute<T>({\n method,\n args,\n params,\n serverCache,\n }: ExecuteActionParams): Promise<T> {\n this.lastFinishedEventData = null;\n const urlParams = new URLSearchParams(params as Record<string, string>);\n const queryString = urlParams.toString();\n const url = `/sessions/${this.sessionId}/${method}${queryString ? `?${queryString}` : \"\"}`;\n\n const response = await this.request(\n url,\n {\n method: \"POST\",\n body: JSON.stringify(args),\n },\n serverCache,\n );\n\n // Capture cache status from response header\n const cacheStatus = response.headers.get(\"browserbase-cache-status\") as\n | \"HIT\"\n | \"MISS\"\n | null;\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new StagehandHttpError(\n `HTTP error! status: ${response.status}, body: ${errorBody}`,\n );\n }\n\n if (!response.body) {\n throw new StagehandResponseBodyError();\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { value, done } = await reader.read();\n\n if (done && !buffer) {\n throw new StagehandServerError(\n \"Stream ended without completion signal\",\n );\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n\n try {\n const eventData = JSON.parse(line.slice(6));\n\n if (eventData.type === \"system\") {\n if (eventData.data.status === \"error\") {\n const { error: errorMsg } = eventData.data;\n // Throw plain Error to match local SDK behavior (useApi: false)\n throw new Error(errorMsg);\n }\n if (eventData.data.status === \"finished\") {\n this.lastFinishedEventData = eventData.data;\n\n // If caching was bypassed for this request, suppress cache status\n // so we don't log or surface a MISS that the server emits anyway.\n const cacheEnabled = this.shouldUseCache(serverCache);\n return this.attachCacheStatus(\n eventData.data.result as T,\n method,\n cacheEnabled ? cacheStatus : null,\n cacheEnabled ? eventData : { data: {} },\n );\n }\n } else if (eventData.type === \"log\") {\n const msg = eventData.data.message;\n // Skip server-side internal logs that don't apply to API mode\n if (msg?.message === \"Connecting to local browser\") {\n continue;\n }\n this.logger(eventData.data.message);\n }\n } catch (e) {\n // Let Error instances pass through (server errors thrown above)\n // Only wrap SyntaxError from JSON.parse as parse errors\n if (e instanceof Error && !(e instanceof SyntaxError)) {\n throw e;\n }\n\n const errorMessage = e instanceof Error ? e.message : String(e);\n this.logger({\n category: \"api\",\n message: `Failed to parse SSE event: ${errorMessage}`,\n level: 0,\n });\n throw new StagehandResponseParseError(\n `Failed to parse server response: ${errorMessage}`,\n );\n }\n }\n\n if (done) {\n // Process any remaining data in buffer before exiting\n if (buffer.trim() && buffer.startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(buffer.slice(6));\n if (\n eventData.type === \"system\" &&\n eventData.data.status === \"finished\"\n ) {\n return this.attachCacheStatus(\n eventData.data.result as T,\n method,\n cacheStatus,\n eventData,\n );\n }\n } catch {\n this.logger({\n category: \"api\",\n message: `Incomplete data in final buffer: ${buffer.substring(0, 100)}`,\n level: 0,\n });\n }\n }\n throw new StagehandServerError(\n \"Stream ended without completion signal\",\n );\n }\n }\n }\n\n /**\n * Resolves the final cache status from the response header or SSE event data,\n * logs it, and attaches it to act/extract results before returning.\n */\n private attachCacheStatus<T>(\n result: T,\n method: string,\n cacheStatus: \"HIT\" | \"MISS\" | null,\n eventData: { data: { cacheHit?: boolean } },\n ): T {\n const finalCacheStatus =\n cacheStatus ||\n (typeof eventData.data.cacheHit === \"boolean\"\n ? eventData.data.cacheHit\n ? \"HIT\"\n : \"MISS\"\n : undefined);\n if (\n finalCacheStatus &&\n (method === \"act\" || method === \"extract\" || method === \"observe\")\n ) {\n this.logger({\n category: \"cache\",\n message: `${method} server cache ${finalCacheStatus.toLowerCase()}`,\n level: 1,\n });\n }\n if (\n finalCacheStatus &&\n result &&\n typeof result === \"object\" &&\n (method === \"act\" || method === \"extract\" || method === \"observe\")\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (result as ActResult | ExtractResult<any> | ObserveResult).cacheStatus =\n finalCacheStatus;\n }\n return result;\n }\n\n /**\n * Determine if caching should be enabled for a request.\n * Method-level setting takes precedence over instance-level setting.\n */\n private shouldUseCache(methodServerCache?: boolean): boolean {\n // If method-level setting is explicitly provided, use it\n if (methodServerCache !== undefined) {\n return methodServerCache;\n }\n // Otherwise, use instance-level setting\n return this.serverCache;\n }\n\n private async request(\n path: string,\n options: RequestInit,\n serverCache?: boolean,\n ): Promise<Response> {\n const defaultHeaders: Record<string, string> = {\n \"x-bb-api-key\": this.apiKey,\n ...(this.projectId ? { \"x-bb-project-id\": this.projectId } : {}),\n \"x-bb-session-id\": this.sessionId,\n // we want real-time logs, so we stream the response\n \"x-stream-response\": \"true\",\n ...(this.modelApiKey ? { \"x-model-api-key\": this.modelApiKey } : {}),\n \"x-language\": \"typescript\",\n \"x-sdk-version\": STAGEHAND_VERSION,\n };\n\n // Add cache bypass header if caching is disabled\n if (!this.shouldUseCache(serverCache)) {\n defaultHeaders[\"browserbase-cache-bypass\"] = \"true\";\n }\n\n if (options.method === \"POST\" && options.body) {\n defaultHeaders[\"Content-Type\"] = \"application/json\";\n }\n\n // Use STAGEHAND_API_URL when set. STAGEHAND_BASE_URL is a legacy alias.\n // Ensure /v1 suffix is present for consistency\n const configuredBaseUrl =\n process.env.STAGEHAND_API_URL ?? process.env.STAGEHAND_BASE_URL;\n if (\n !process.env.STAGEHAND_API_URL &&\n process.env.STAGEHAND_BASE_URL &&\n !this.warnedStagehandBaseUrl\n ) {\n this.logger({\n category: \"config\",\n message:\n \"STAGEHAND_BASE_URL is deprecated. Use STAGEHAND_API_URL instead.\",\n level: 0,\n });\n this.warnedStagehandBaseUrl = true;\n }\n\n let baseUrl: string;\n if (configuredBaseUrl) {\n const envUrl = configuredBaseUrl.replace(/\\/+$/, \"\");\n // Append /v1 if not already present\n baseUrl = envUrl.endsWith(\"/v1\") ? envUrl : `${envUrl}/v1`;\n } else {\n baseUrl = getApiUrlForRegion(this.region);\n }\n\n const response = await this.fetchWithCookies(`${baseUrl}${path}`, {\n ...options,\n headers: {\n ...defaultHeaders,\n ...options.headers,\n },\n });\n\n return response;\n }\n}\n"]}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../lib/v3/api.ts"],"names":[],"mappings":"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","sourcesContent":["import makeFetchCookie from \"fetch-cookie\";\nimport {\n getInheritableModelOptions,\n hasModelProviderAuth,\n loadApiKeyFromEnv,\n} from \"../utils.js\";\nimport { isAutoModel } from \"../modelUtils.js\";\nimport { STAGEHAND_VERSION } from \"../version.js\";\nimport {\n StagehandAPIError,\n StagehandAPIUnauthorizedError,\n StagehandHttpError,\n StagehandResponseBodyError,\n StagehandResponseParseError,\n StagehandServerError,\n ExperimentalNotConfiguredError,\n} from \"./types/public/index.js\";\nimport type {\n ActResult,\n AgentConfig,\n AgentExecuteOptions,\n AgentResult,\n ExtractResult,\n ObserveResult,\n LogLine,\n StagehandMetrics,\n BrowserbaseRegion,\n ActOptions,\n ExtractOptions,\n ObserveOptions,\n Api,\n} from \"./types/public/index.js\";\nimport type {\n SerializableResponse,\n AgentCacheTransferPayload,\n} from \"./types/private/index.js\";\nimport type { ModelConfiguration } from \"./types/public/model.js\";\nimport { toJsonSchema } from \"./zodCompat.js\";\nimport type { StagehandZodSchema } from \"./zodCompat.js\";\n\n// =============================================================================\n// Multi-region API URL mapping\n// =============================================================================\n\n/**\n * Mapping of Browserbase regions to their corresponding Stagehand API base URLs.\n * Users should configure their client to hit the API endpoint that matches\n * the region where their browser session is running.\n */\nexport const REGION_API_URLS: Record<BrowserbaseRegion, string> = {\n \"us-west-2\": \"https://api.stagehand.browserbase.com\",\n \"us-east-1\": \"https://api.use1.stagehand.browserbase.com\",\n \"eu-central-1\": \"https://api.euc1.stagehand.browserbase.com\",\n \"ap-southeast-1\": \"https://api.apse1.stagehand.browserbase.com\",\n};\n\n/**\n * Returns the full API URL (with /v1 suffix) for a given Browserbase region.\n * If no region is specified or the region is unknown, defaults to us-west-2.\n *\n * @param region - The Browserbase region (e.g., \"us-west-2\", \"eu-central-1\")\n * @returns The full API URL including /v1 suffix\n */\nexport function getApiUrlForRegion(\n region: BrowserbaseRegion | undefined,\n): string {\n const baseUrl =\n REGION_API_URLS[region as BrowserbaseRegion] ??\n REGION_API_URLS[\"us-west-2\"];\n return `${baseUrl}/v1`;\n}\n\n// =============================================================================\n// Client-specific types (can't be Zod schemas due to functions/Page objects)\n// =============================================================================\n//\n// These types mirror the Api.* schemas from types/public/api.ts but include\n// non-serializable SDK fields (like Page objects) that get stripped before\n// sending requests over the wire.\n//\n// Relationship to wire format:\n// - Client accepts: SDK types (ActOptions, ExtractOptions, etc.) with optional `page`\n// - Wire sends: Api.* types (page stripped, Zod schema converted to JSON schema)\n// - Client returns: SDK result types (ActResult, ExtractResult, etc.)\n// =============================================================================\n\n/**\n * Constructor parameters for StagehandAPIClient\n */\ninterface StagehandAPIConstructorParams {\n apiKey: string;\n projectId?: string;\n logger: (message: LogLine) => void;\n /**\n * When true, enables server-side caching by default for all requests.\n * When false, disables server-side caching.\n * Defaults to true (caching enabled).\n * Can be overridden per-method in act(), extract(), and observe() options.\n */\n serverCache?: boolean;\n}\n\n/**\n * Parameters for starting a session via the API client.\n * Extends Api.SessionStartRequest with client-specific field (modelApiKey).\n *\n * Wire format: Api.SessionStartRequest (modelApiKey sent via header, not body)\n */\ninterface ClientSessionStartParams extends Api.SessionStartRequest {\n /** Model API key - sent via x-model-api-key header, not in request body.\n * Optional: when omitted, requests are sent without the x-model-api-key header\n * and the server is expected to handle model authentication on its own. */\n modelApiKey?: string;\n /** Default model config for later action requests. Not sent to /sessions/start. */\n defaultModelConfig?: ModelConfiguration;\n}\n\n/**\n * Generic API response wrapper matching Api.*Response schemas\n */\ntype ApiResponse<T> =\n | { success: true; data: T }\n | { success: false; message: string };\n\ntype PreparedModelConfig = { modelName: string; apiKey?: string } & Record<\n string,\n unknown\n>;\n\n/**\n * Union of all API request body types for type-safe execute() calls\n */\ntype ApiRequestBody =\n | Api.ActRequest\n | Api.ExtractRequest\n | Api.ObserveRequest\n | Api.NavigateRequest\n | Api.AgentExecuteRequest;\n\n/**\n * Parameters for executing an action via the streaming API\n */\ninterface ExecuteActionParams {\n method: \"act\" | \"extract\" | \"observe\" | \"navigate\" | \"end\" | \"agentExecute\";\n args?: ApiRequestBody;\n params?: Record<string, string>;\n /**\n * Override the instance-level serverCache setting for this request.\n * When true, enables server-side caching.\n * When false, disables server-side caching.\n */\n serverCache?: boolean;\n}\n\n/**\n * Client parameters for act() method.\n * Derives structure from Api.ActRequest but uses SDK's ActOptions (which includes `page`).\n * Before serialization, `page` is stripped to produce Api.ActRequest wire format.\n */\ninterface ClientActParameters {\n input: Api.ActRequest[\"input\"];\n options?: ActOptions;\n frameId?: Api.ActRequest[\"frameId\"];\n}\n\n/**\n * Client parameters for extract() method.\n * Derives structure from Api.ExtractRequest but uses SDK's ExtractOptions (which includes `page`)\n * and accepts Zod schema (converted to JSON schema for wire format).\n */\ninterface ClientExtractParameters {\n instruction?: Api.ExtractRequest[\"instruction\"];\n schema?: StagehandZodSchema;\n options?: ExtractOptions;\n frameId?: Api.ExtractRequest[\"frameId\"];\n}\n\n/**\n * Client parameters for observe() method.\n * Derives structure from Api.ObserveRequest but uses SDK's ObserveOptions (which includes `page`).\n * Before serialization, `page` is stripped to produce Api.ObserveRequest wire format.\n */\ninterface ClientObserveParameters {\n instruction?: Api.ObserveRequest[\"instruction\"];\n options?: ObserveOptions;\n frameId?: Api.ObserveRequest[\"frameId\"];\n}\n\nexport class StagehandAPIClient {\n private apiKey: string;\n private projectId?: string;\n private sessionId?: string;\n private modelApiKey?: string;\n private modelProvider?: string;\n private defaultModelConfig?: PreparedModelConfig;\n private region?: BrowserbaseRegion;\n private logger: (message: LogLine) => void;\n private fetchWithCookies;\n private serverCache: boolean;\n private lastFinishedEventData: Record<string, unknown> | null = null;\n private latestAgentCacheEntry: AgentCacheTransferPayload | null = null;\n private warnedStagehandBaseUrl = false;\n\n constructor({\n apiKey,\n projectId,\n logger,\n serverCache,\n }: StagehandAPIConstructorParams) {\n this.apiKey = apiKey;\n this.projectId = projectId;\n this.logger = logger;\n this.serverCache = serverCache ?? true;\n // Create a single cookie jar instance that will persist across all requests\n this.fetchWithCookies = makeFetchCookie(fetch);\n }\n\n async init({\n modelName,\n modelApiKey,\n defaultModelConfig,\n domSettleTimeoutMs,\n verbose,\n systemPrompt,\n selfHeal,\n useTouch,\n browserbaseSessionCreateParams,\n browserbaseSessionID,\n // browser, TODO for local browsers\n }: ClientSessionStartParams): Promise<Api.SessionStartResult> {\n this.modelApiKey = modelApiKey;\n // Extract provider from modelName (e.g., \"openai/gpt-5-nano\" -> \"openai\")\n this.modelProvider = modelName?.includes(\"/\")\n ? modelName.split(\"/\")[0]\n : undefined;\n this.defaultModelConfig = defaultModelConfig\n ? this.prepareModelConfig(defaultModelConfig)\n : undefined;\n\n // Store the region for multi-region API URL resolution\n this.region = browserbaseSessionCreateParams?.region;\n\n this.logger({\n category: \"init\",\n message: \"Creating new browserbase session...\",\n level: 1,\n });\n\n // Build wire-format request body (Api.SessionStartRequest shape)\n const requestBody: Api.SessionStartRequest = {\n modelName,\n domSettleTimeoutMs,\n verbose,\n systemPrompt,\n selfHeal,\n useTouch,\n browserbaseSessionCreateParams,\n browserbaseSessionID,\n // browser, TODO: only send when connected to local fastify\n };\n\n const sessionResponse = await this.request(\"/sessions/start\", {\n method: \"POST\",\n body: JSON.stringify(requestBody),\n });\n\n if (sessionResponse.status === 401) {\n throw new StagehandAPIUnauthorizedError(\n \"Unauthorized. Ensure you provided a valid API key.\",\n );\n } else if (sessionResponse.status !== 200) {\n const errorText = await sessionResponse.text();\n this.logger({\n category: \"api\",\n message: `API error (${sessionResponse.status}): ${errorText}`,\n level: 0,\n });\n throw new StagehandHttpError(`Unknown error: ${sessionResponse.status}`);\n }\n\n const sessionResponseBody =\n (await sessionResponse.json()) as ApiResponse<Api.SessionStartResult>;\n\n if (sessionResponseBody.success === false) {\n throw new StagehandAPIError(sessionResponseBody.message);\n }\n\n // Temporary reroute for rollout\n if (!sessionResponseBody.data?.available && browserbaseSessionID) {\n sessionResponseBody.data.sessionId = browserbaseSessionID;\n }\n\n this.sessionId = sessionResponseBody.data.sessionId;\n\n return sessionResponseBody.data;\n }\n\n async act({\n input,\n options,\n frameId,\n }: ClientActParameters): Promise<ActResult> {\n // Strip non-serializable `page` and SDK-only fields from options before wire serialization\n let wireOptions: Api.ActRequest[\"options\"];\n let serverCache: boolean | undefined;\n if (options) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page: _, serverCache: enableCache, ...restOptions } = options;\n serverCache = enableCache;\n if (restOptions.model) {\n restOptions.model = this.prepareModelConfig(restOptions.model);\n } else if (this.defaultModelConfig) {\n restOptions.model = this.getDefaultModelConfig();\n }\n if (Object.keys(restOptions).length > 0) {\n wireOptions = restOptions as unknown as Api.ActRequest[\"options\"];\n }\n } else if (this.defaultModelConfig) {\n wireOptions = {\n model: this.getDefaultModelConfig(),\n } as unknown as Api.ActRequest[\"options\"];\n }\n\n // Build wire-format request body\n const requestBody: Api.ActRequest = {\n input,\n options: wireOptions,\n frameId,\n };\n\n return this.execute<ActResult>({\n method: \"act\",\n args: requestBody,\n serverCache,\n });\n }\n\n async extract<T extends StagehandZodSchema>({\n instruction,\n schema: zodSchema,\n options,\n frameId,\n }: ClientExtractParameters): Promise<ExtractResult<T>> {\n // Convert Zod schema to JSON schema for wire format\n const jsonSchema = zodSchema ? toJsonSchema(zodSchema) : undefined;\n\n // Strip non-serializable `page` and SDK-only fields from options before wire serialization\n let wireOptions: Api.ExtractRequest[\"options\"];\n let serverCache: boolean | undefined;\n if (options) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page: _, serverCache: enableCache, ...restOptions } = options;\n serverCache = enableCache;\n if (restOptions.model) {\n restOptions.model = this.prepareModelConfig(restOptions.model);\n } else if (this.defaultModelConfig) {\n restOptions.model = this.getDefaultModelConfig();\n }\n if (Object.keys(restOptions).length > 0) {\n wireOptions = restOptions as unknown as Api.ExtractRequest[\"options\"];\n }\n } else if (this.defaultModelConfig) {\n wireOptions = {\n model: this.getDefaultModelConfig(),\n } as unknown as Api.ExtractRequest[\"options\"];\n }\n\n // Build wire-format request body\n const requestBody: Api.ExtractRequest = {\n instruction,\n schema: jsonSchema,\n options: wireOptions,\n frameId,\n };\n\n return this.execute<ExtractResult<T>>({\n method: \"extract\",\n args: requestBody,\n serverCache,\n });\n }\n\n async observe({\n instruction,\n options,\n frameId,\n }: ClientObserveParameters): Promise<ObserveResult> {\n // Strip non-serializable `page` and SDK-only fields from options before wire serialization\n let wireOptions: Api.ObserveRequest[\"options\"];\n let serverCache: boolean | undefined;\n if (options) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page: _, serverCache: enableCache, ...restOptions } = options;\n serverCache = enableCache;\n if (restOptions.model) {\n restOptions.model = this.prepareModelConfig(restOptions.model);\n } else if (this.defaultModelConfig) {\n restOptions.model = this.getDefaultModelConfig();\n }\n if (Object.keys(restOptions).length > 0) {\n wireOptions = restOptions as unknown as Api.ObserveRequest[\"options\"];\n }\n } else if (this.defaultModelConfig) {\n wireOptions = {\n model: this.getDefaultModelConfig(),\n } as unknown as Api.ObserveRequest[\"options\"];\n }\n\n // Build wire-format request body\n const requestBody: Api.ObserveRequest = {\n instruction,\n options: wireOptions,\n frameId,\n };\n\n return this.execute<ObserveResult>({\n method: \"observe\",\n args: requestBody,\n serverCache,\n });\n }\n\n async goto(\n url: string,\n options?: Api.NavigateRequest[\"options\"],\n frameId?: string,\n ): Promise<SerializableResponse | null> {\n const publicOptions = { ...(options ?? {}) } as NonNullable<\n Api.NavigateRequest[\"options\"]\n > & { model?: unknown };\n delete publicOptions.model;\n\n const wireOptions = {\n ...publicOptions,\n ...(this.defaultModelConfig\n ? { model: this.getDefaultModelConfig() }\n : {}),\n };\n const requestBody: Api.NavigateRequest = {\n url,\n options: Object.keys(wireOptions).length > 0 ? wireOptions : undefined,\n frameId,\n };\n\n return this.execute<SerializableResponse | null>({\n method: \"navigate\",\n args: requestBody,\n });\n }\n\n async agentExecute(\n agentConfig: AgentConfig,\n executeOptions: AgentExecuteOptions | string,\n frameId?: string,\n shouldCache?: boolean,\n ): Promise<AgentResult> {\n // Check if integrations are being used in API mode (not supported)\n if (agentConfig.integrations && agentConfig.integrations.length > 0) {\n throw new ExperimentalNotConfiguredError(\"MCP integrations\");\n }\n\n // Strip non-serializable `page` from executeOptions before wire serialization\n let wireExecuteOptions: Api.AgentExecuteRequest[\"executeOptions\"];\n if (typeof executeOptions === \"string\") {\n wireExecuteOptions = { instruction: executeOptions };\n } else if (executeOptions.page) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { page: _, ...rest } = executeOptions;\n wireExecuteOptions = rest;\n } else {\n wireExecuteOptions = executeOptions;\n }\n\n const wireAgentConfig: Api.AgentExecuteRequest[\"agentConfig\"] = {\n systemPrompt: agentConfig.systemPrompt,\n mode: agentConfig.mode ?? (agentConfig.cua === true ? \"cua\" : undefined),\n cua: agentConfig.mode === undefined ? agentConfig.cua : undefined,\n model: agentConfig.model\n ? this.prepareModelConfig(agentConfig.model)\n : this.getDefaultModelConfig(),\n executionModel: agentConfig.executionModel\n ? this.prepareModelConfig(agentConfig.executionModel)\n : undefined,\n };\n\n // Build wire-format request body\n const requestBody: Api.AgentExecuteRequest = {\n agentConfig: wireAgentConfig,\n executeOptions: wireExecuteOptions,\n frameId,\n shouldCache,\n };\n\n const result = await this.execute<AgentResult>({\n method: \"agentExecute\",\n args: requestBody,\n });\n\n const finishedData =\n this.consumeFinishedEventData<Api.AgentExecuteResult>() ?? null;\n this.latestAgentCacheEntry =\n finishedData?.cacheEntry !== undefined\n ? (finishedData.cacheEntry as AgentCacheTransferPayload)\n : null;\n return result;\n }\n\n consumeLatestAgentCacheEntry(): AgentCacheTransferPayload | null {\n const entry = this.latestAgentCacheEntry;\n this.latestAgentCacheEntry = null;\n return entry;\n }\n\n async end(): Promise<Response> {\n const url = `/sessions/${this.sessionId}/end`;\n const response = await this.request(url, {\n method: \"POST\",\n });\n return response;\n }\n\n async getReplayMetrics(): Promise<StagehandMetrics> {\n if (!this.sessionId) {\n throw new StagehandAPIError(\"sessionId is required to fetch metrics.\");\n }\n\n const response = await this.request(`/sessions/${this.sessionId}/replay`, {\n method: \"GET\",\n });\n\n if (response.status !== 200) {\n const errorText = await response.text();\n this.logger({\n category: \"api\",\n message: `Failed to fetch metrics. Status ${response.status}: ${errorText}`,\n level: 0,\n });\n throw new StagehandHttpError(\n `Failed to fetch metrics with status ${response.status}: ${errorText}`,\n );\n }\n\n const data = (await response.json()) as\n | Api.ReplayResponse\n | { success: false; error?: string };\n\n if (!data.success) {\n const errorData = data as { success: false; error?: string };\n throw new StagehandAPIError(\n `Failed to fetch metrics: ${errorData.error || \"Unknown error\"}`,\n );\n }\n\n // Parse the API data into StagehandMetrics format\n const apiData = (data as Api.ReplayResponse).data;\n const metrics: StagehandMetrics = {\n actPromptTokens: 0,\n actCompletionTokens: 0,\n actReasoningTokens: 0,\n actCachedInputTokens: 0,\n actInferenceTimeMs: 0,\n extractPromptTokens: 0,\n extractCompletionTokens: 0,\n extractReasoningTokens: 0,\n extractCachedInputTokens: 0,\n extractInferenceTimeMs: 0,\n observePromptTokens: 0,\n observeCompletionTokens: 0,\n observeReasoningTokens: 0,\n observeCachedInputTokens: 0,\n observeInferenceTimeMs: 0,\n agentPromptTokens: 0,\n agentCompletionTokens: 0,\n agentReasoningTokens: 0,\n agentCachedInputTokens: 0,\n agentInferenceTimeMs: 0,\n totalPromptTokens: 0,\n totalCompletionTokens: 0,\n totalReasoningTokens: 0,\n totalCachedInputTokens: 0,\n totalInferenceTimeMs: 0,\n };\n\n // Parse pages and their actions\n const pages = apiData?.pages || [];\n for (const page of pages) {\n const actions = page.actions || [];\n for (const action of actions) {\n // Get method name and token usage\n const method = (action.method || \"\").toLowerCase();\n const tokenUsage = action.tokenUsage;\n\n if (tokenUsage) {\n const inputTokens = tokenUsage.inputTokens || 0;\n const outputTokens = tokenUsage.outputTokens || 0;\n const reasoningTokens =\n \"reasoningTokens\" in tokenUsage\n ? Number(\n (tokenUsage as { reasoningTokens?: number })\n .reasoningTokens ?? 0,\n )\n : 0;\n const cachedInputTokens =\n \"cachedInputTokens\" in tokenUsage\n ? Number(\n (tokenUsage as { cachedInputTokens?: number })\n .cachedInputTokens ?? 0,\n )\n : 0;\n const timeMs = tokenUsage.timeMs || 0;\n\n // Map method to metrics fields\n if (method === \"act\") {\n metrics.actPromptTokens += inputTokens;\n metrics.actCompletionTokens += outputTokens;\n metrics.actReasoningTokens += reasoningTokens;\n metrics.actCachedInputTokens += cachedInputTokens;\n metrics.actInferenceTimeMs += timeMs;\n } else if (method === \"extract\") {\n metrics.extractPromptTokens += inputTokens;\n metrics.extractCompletionTokens += outputTokens;\n metrics.extractReasoningTokens += reasoningTokens;\n metrics.extractCachedInputTokens += cachedInputTokens;\n metrics.extractInferenceTimeMs += timeMs;\n } else if (method === \"observe\") {\n metrics.observePromptTokens += inputTokens;\n metrics.observeCompletionTokens += outputTokens;\n metrics.observeReasoningTokens += reasoningTokens;\n metrics.observeCachedInputTokens += cachedInputTokens;\n metrics.observeInferenceTimeMs += timeMs;\n } else if (method === \"agent\") {\n metrics.agentPromptTokens += inputTokens;\n metrics.agentCompletionTokens += outputTokens;\n metrics.agentReasoningTokens += reasoningTokens;\n metrics.agentCachedInputTokens += cachedInputTokens;\n metrics.agentInferenceTimeMs += timeMs;\n }\n\n // Always update totals for any method with token usage\n metrics.totalPromptTokens += inputTokens;\n metrics.totalCompletionTokens += outputTokens;\n metrics.totalReasoningTokens += reasoningTokens;\n metrics.totalCachedInputTokens += cachedInputTokens;\n metrics.totalInferenceTimeMs += timeMs;\n }\n }\n }\n\n return metrics;\n }\n\n /**\n * Prepares a model configuration for the API payload by ensuring the `apiKey`\n * is included. If the model is passed as a string, converts it to an object\n * with `modelName` and `apiKey`.\n *\n * In API mode, we only attempt to load an API key from env vars when the\n * model provider differs from the one used to init the session.\n */\n private prepareModelConfig(model: ModelConfiguration): PreparedModelConfig {\n // \"auto\" delegates model selection to the API, so never inherit the\n // default model's provider config or API key — the server picks the\n // provider. Explicit per-call options are still passed through.\n if (isAutoModel(model)) {\n return typeof model === \"string\"\n ? { modelName: model }\n : ({ ...model } as PreparedModelConfig);\n }\n\n if (typeof model === \"string\") {\n // Extract provider from model string (e.g., \"openai/gpt-5-nano\" -> \"openai\")\n const provider = this.getModelProvider(model);\n const inheritedDefault =\n provider && provider === this.modelProvider\n ? this.getDefaultModelConfig()\n : undefined;\n const apiKey = hasModelProviderAuth(inheritedDefault)\n ? undefined\n : provider && provider !== this.modelProvider\n ? (loadApiKeyFromEnv(provider, this.logger) ?? this.modelApiKey)\n : this.modelApiKey;\n return {\n ...inheritedDefault,\n modelName: model,\n ...(apiKey ? { apiKey } : {}),\n };\n }\n\n const provider = this.getModelProvider(model.modelName);\n const modelHasCredentials =\n hasModelProviderAuth(model) ||\n Boolean((model as { apiKey?: string }).apiKey);\n const defaultConfig =\n provider && provider === this.modelProvider\n ? this.getDefaultModelConfig()\n : undefined;\n const inheritedDefault = modelHasCredentials\n ? getInheritableModelOptions(defaultConfig)\n : defaultConfig;\n const mergedModel = {\n ...(inheritedDefault ?? {}),\n ...model,\n } as PreparedModelConfig;\n const hasProviderAuth = hasModelProviderAuth(mergedModel);\n const apiKey = hasProviderAuth\n ? undefined\n : !mergedModel.apiKey && provider && provider !== this.modelProvider\n ? (loadApiKeyFromEnv(provider, this.logger) ?? this.modelApiKey)\n : !mergedModel.apiKey\n ? this.modelApiKey\n : undefined;\n\n return {\n ...mergedModel,\n ...(apiKey ? { apiKey } : {}),\n } as PreparedModelConfig;\n }\n\n private getDefaultModelConfig(): PreparedModelConfig | undefined {\n return this.defaultModelConfig\n ? ({ ...this.defaultModelConfig } as PreparedModelConfig)\n : undefined;\n }\n\n private getModelProvider(modelName: string | undefined): string | undefined {\n return modelName?.includes(\"/\") ? modelName.split(\"/\")[0] : undefined;\n }\n\n private consumeFinishedEventData<T>(): T | null {\n const data = this.lastFinishedEventData as T | null;\n this.lastFinishedEventData = null;\n return data;\n }\n\n private async execute<T>({\n method,\n args,\n params,\n serverCache,\n }: ExecuteActionParams): Promise<T> {\n this.lastFinishedEventData = null;\n const urlParams = new URLSearchParams(params as Record<string, string>);\n const queryString = urlParams.toString();\n const url = `/sessions/${this.sessionId}/${method}${queryString ? `?${queryString}` : \"\"}`;\n\n const response = await this.request(\n url,\n {\n method: \"POST\",\n body: JSON.stringify(args),\n },\n serverCache,\n );\n\n // Capture cache status from response header\n const cacheStatus = response.headers.get(\"browserbase-cache-status\") as\n | \"HIT\"\n | \"MISS\"\n | null;\n\n if (!response.ok) {\n const errorBody = await response.text();\n throw new StagehandHttpError(\n `HTTP error! status: ${response.status}, body: ${errorBody}`,\n );\n }\n\n if (!response.body) {\n throw new StagehandResponseBodyError();\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n while (true) {\n const { value, done } = await reader.read();\n\n if (done && !buffer) {\n throw new StagehandServerError(\n \"Stream ended without completion signal\",\n );\n }\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\\n\");\n buffer = lines.pop() || \"\";\n\n for (const line of lines) {\n if (!line.startsWith(\"data: \")) continue;\n\n try {\n const eventData = JSON.parse(line.slice(6));\n\n if (eventData.type === \"system\") {\n if (eventData.data.status === \"error\") {\n const { error: errorMsg } = eventData.data;\n // Throw plain Error to match local SDK behavior (useApi: false)\n throw new Error(errorMsg);\n }\n if (eventData.data.status === \"finished\") {\n this.lastFinishedEventData = eventData.data;\n\n // If caching was bypassed for this request, suppress cache status\n // so we don't log or surface a MISS that the server emits anyway.\n const cacheEnabled = this.shouldUseCache(serverCache);\n return this.attachCacheStatus(\n eventData.data.result as T,\n method,\n cacheEnabled ? cacheStatus : null,\n cacheEnabled ? eventData : { data: {} },\n );\n }\n } else if (eventData.type === \"log\") {\n const msg = eventData.data.message;\n // Skip server-side internal logs that don't apply to API mode\n if (msg?.message === \"Connecting to local browser\") {\n continue;\n }\n this.logger(eventData.data.message);\n }\n } catch (e) {\n // Let Error instances pass through (server errors thrown above)\n // Only wrap SyntaxError from JSON.parse as parse errors\n if (e instanceof Error && !(e instanceof SyntaxError)) {\n throw e;\n }\n\n const errorMessage = e instanceof Error ? e.message : String(e);\n this.logger({\n category: \"api\",\n message: `Failed to parse SSE event: ${errorMessage}`,\n level: 0,\n });\n throw new StagehandResponseParseError(\n `Failed to parse server response: ${errorMessage}`,\n );\n }\n }\n\n if (done) {\n // Process any remaining data in buffer before exiting\n if (buffer.trim() && buffer.startsWith(\"data: \")) {\n try {\n const eventData = JSON.parse(buffer.slice(6));\n if (\n eventData.type === \"system\" &&\n eventData.data.status === \"finished\"\n ) {\n return this.attachCacheStatus(\n eventData.data.result as T,\n method,\n cacheStatus,\n eventData,\n );\n }\n } catch {\n this.logger({\n category: \"api\",\n message: `Incomplete data in final buffer: ${buffer.substring(0, 100)}`,\n level: 0,\n });\n }\n }\n throw new StagehandServerError(\n \"Stream ended without completion signal\",\n );\n }\n }\n }\n\n /**\n * Resolves the final cache status from the response header or SSE event data,\n * logs it, and attaches it to act/extract results before returning.\n */\n private attachCacheStatus<T>(\n result: T,\n method: string,\n cacheStatus: \"HIT\" | \"MISS\" | null,\n eventData: { data: { cacheHit?: boolean } },\n ): T {\n const finalCacheStatus =\n cacheStatus ||\n (typeof eventData.data.cacheHit === \"boolean\"\n ? eventData.data.cacheHit\n ? \"HIT\"\n : \"MISS\"\n : undefined);\n if (\n finalCacheStatus &&\n (method === \"act\" || method === \"extract\" || method === \"observe\")\n ) {\n this.logger({\n category: \"cache\",\n message: `${method} server cache ${finalCacheStatus.toLowerCase()}`,\n level: 1,\n });\n }\n if (\n finalCacheStatus &&\n result &&\n typeof result === \"object\" &&\n (method === \"act\" || method === \"extract\" || method === \"observe\")\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (result as ActResult | ExtractResult<any> | ObserveResult).cacheStatus =\n finalCacheStatus;\n }\n return result;\n }\n\n /**\n * Determine if caching should be enabled for a request.\n * Method-level setting takes precedence over instance-level setting.\n */\n private shouldUseCache(methodServerCache?: boolean): boolean {\n // If method-level setting is explicitly provided, use it\n if (methodServerCache !== undefined) {\n return methodServerCache;\n }\n // Otherwise, use instance-level setting\n return this.serverCache;\n }\n\n private async request(\n path: string,\n options: RequestInit,\n serverCache?: boolean,\n ): Promise<Response> {\n const defaultHeaders: Record<string, string> = {\n \"x-bb-api-key\": this.apiKey,\n ...(this.projectId ? { \"x-bb-project-id\": this.projectId } : {}),\n \"x-bb-session-id\": this.sessionId,\n // we want real-time logs, so we stream the response\n \"x-stream-response\": \"true\",\n ...(this.modelApiKey ? { \"x-model-api-key\": this.modelApiKey } : {}),\n \"x-language\": \"typescript\",\n \"x-sdk-version\": STAGEHAND_VERSION,\n };\n\n // Add cache bypass header if caching is disabled\n if (!this.shouldUseCache(serverCache)) {\n defaultHeaders[\"browserbase-cache-bypass\"] = \"true\";\n }\n\n if (options.method === \"POST\" && options.body) {\n defaultHeaders[\"Content-Type\"] = \"application/json\";\n }\n\n // Use STAGEHAND_API_URL when set. STAGEHAND_BASE_URL is a legacy alias.\n // Ensure /v1 suffix is present for consistency\n const configuredBaseUrl =\n process.env.STAGEHAND_API_URL ?? process.env.STAGEHAND_BASE_URL;\n if (\n !process.env.STAGEHAND_API_URL &&\n process.env.STAGEHAND_BASE_URL &&\n !this.warnedStagehandBaseUrl\n ) {\n this.logger({\n category: \"config\",\n message:\n \"STAGEHAND_BASE_URL is deprecated. Use STAGEHAND_API_URL instead.\",\n level: 0,\n });\n this.warnedStagehandBaseUrl = true;\n }\n\n let baseUrl: string;\n if (configuredBaseUrl) {\n const envUrl = configuredBaseUrl.replace(/\\/+$/, \"\");\n // Append /v1 if not already present\n baseUrl = envUrl.endsWith(\"/v1\") ? envUrl : `${envUrl}/v1`;\n } else {\n baseUrl = getApiUrlForRegion(this.region);\n }\n\n const response = await this.fetchWithCookies(`${baseUrl}${path}`, {\n ...options,\n headers: {\n ...defaultHeaders,\n ...options.headers,\n },\n });\n\n return response;\n }\n}\n"]}
@@ -96,6 +96,7 @@ const METHOD_HANDLER_MAP = {
96
96
  type: typeText,
97
97
  press: pressKey,
98
98
  click: clickElement,
99
+ tap: tapElement,
99
100
  doubleClick,
100
101
  dragAndDrop,
101
102
  nextChunk: scrollToNextChunk,
@@ -274,6 +275,25 @@ async function clickElement(ctx) {
274
275
  throw new sdkErrors_js_1.StagehandClickError(ctx.xpath, msg);
275
276
  }
276
277
  }
278
+ async function tapElement(ctx) {
279
+ const { locator, xpath } = ctx;
280
+ try {
281
+ await locator.tap();
282
+ }
283
+ catch (e) {
284
+ const msg = e instanceof Error ? e.message : String(e);
285
+ (0, logger_js_1.v3Logger)({
286
+ category: "action",
287
+ message: "error performing tap",
288
+ level: 0,
289
+ auxiliary: {
290
+ error: { value: msg, type: "string" },
291
+ xpath: { value: xpath, type: "string" },
292
+ },
293
+ });
294
+ throw new sdkErrors_js_1.StagehandClickError(ctx.xpath, msg);
295
+ }
296
+ }
277
297
  async function doubleClick(ctx) {
278
298
  const { locator, xpath } = ctx;
279
299
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"actHandlerUtils.js","sourceRoot":"","sources":["../../../../../../lib/v3/handlers/handlerUtils/actHandlerUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/handlers/handlerUtils/actHandlerUtils.ts\nimport { Protocol } from \"devtools-protocol\";\nimport { Frame } from \"../../understudy/frame.js\";\nimport { Locator } from \"../../understudy/locator.js\";\nimport { MouseButton } from \"../../types/public/locator.js\";\nimport { resolveLocatorWithHops } from \"../../understudy/deepLocator.js\";\nimport type { Page } from \"../../understudy/page.js\";\nimport { v3Logger } from \"../../logger.js\";\nimport { FlowLogger } from \"../../flowlogger/FlowLogger.js\";\nimport { toTitleCase } from \"../../../utils.js\";\nimport {\n StagehandClickError,\n UnderstudyCommandException,\n} from \"../../types/public/sdkErrors.js\";\n\nexport interface UnderstudyMethodHandlerContext {\n method: string;\n locator: Locator;\n xpath: string;\n args: ReadonlyArray<string>;\n frame: Frame;\n page: Page;\n initialUrl: string;\n domSettleTimeoutMs?: number;\n}\n\n// Normalize cases where the XPath is the root \"/\" to point to the HTML element.\nfunction normalizeRootXPath(input: string): string {\n const s = String(input ?? \"\").trim();\n if (s === \"/\") return \"/html\";\n if (/^xpath=\\/$/i.test(s)) return \"xpath=/html\";\n return s;\n}\n\nexport async function performUnderstudyMethod(\n page: Page,\n frame: Frame,\n method: string,\n rawXPath: string,\n args: ReadonlyArray<unknown>,\n domSettleTimeoutMs?: number,\n): Promise<void> {\n const selectorRaw = normalizeRootXPath(rawXPath);\n\n try {\n await FlowLogger.runWithLogging(\n {\n eventType: `Understudy${toTitleCase(method)}`, // e.g. \"UnderstudyClick\"\n data: {\n target: selectorRaw,\n },\n },\n async () => {\n // Unified resolver: supports '>>' hops and XPath across iframes.\n const locator: Locator = await resolveLocatorWithHops(\n page,\n frame,\n selectorRaw,\n );\n const initialUrl = await getFrameUrl(frame);\n\n v3Logger({\n category: \"action\",\n message: \"performing understudy method\",\n level: 2,\n auxiliary: {\n xpath: { value: selectorRaw, type: \"string\" },\n method: { value: method, type: \"string\" },\n url: { value: initialUrl, type: \"string\" },\n },\n });\n\n const ctx: UnderstudyMethodHandlerContext = {\n method,\n locator,\n xpath: selectorRaw,\n args: args.map((a) => (a == null ? \"\" : String(a))),\n frame,\n page,\n initialUrl,\n domSettleTimeoutMs,\n };\n const handler = METHOD_HANDLER_MAP[method] ?? null;\n\n if (handler) {\n await handler(ctx);\n return;\n }\n\n v3Logger({\n category: \"action\",\n message: \"chosen method is invalid\",\n level: 1,\n auxiliary: { method: { value: method, type: \"string\" } },\n });\n throw new UnderstudyCommandException(`Method ${method} not supported`);\n },\n args,\n );\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n const stack = e instanceof Error ? e.stack : undefined;\n v3Logger({\n category: \"action\",\n message: \"error performing method\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n trace: { value: stack ?? \"\", type: \"string\" },\n method: { value: method, type: \"string\" },\n xpath: { value: selectorRaw, type: \"string\" },\n args: { value: JSON.stringify(args), type: \"object\" },\n },\n });\n if (e instanceof UnderstudyCommandException) {\n throw e;\n }\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\n/* ===================== Handlers & Map ===================== */\n\nconst METHOD_HANDLER_MAP: Record<\n string,\n (ctx: UnderstudyMethodHandlerContext) => Promise<void>\n> = {\n scrollIntoView,\n scrollByPixelOffset,\n scrollTo: scrollElementToPercentage,\n scroll: scrollElementToPercentage,\n \"mouse.wheel\": wheelScroll,\n fill: fillOrType,\n type: typeText,\n press: pressKey,\n click: clickElement,\n doubleClick,\n dragAndDrop,\n nextChunk: scrollToNextChunk,\n prevChunk: scrollToPreviousChunk,\n selectOptionFromDropdown: selectOption,\n selectOption: selectOption,\n hover: hover,\n};\n\nexport async function selectOption(ctx: UnderstudyMethodHandlerContext) {\n const { locator, xpath, args } = ctx;\n try {\n const text = args[0]?.toString() || \"\";\n await locator.selectOption(text);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n const stack = e instanceof Error ? e.stack : undefined;\n v3Logger({\n category: \"action\",\n message: \"error selecting option\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n trace: { value: stack ?? \"\", type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function scrollIntoView(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n const { locator, xpath } = ctx;\n v3Logger({\n category: \"action\",\n message: \"scrolling element into view\",\n level: 2,\n auxiliary: { xpath: { value: xpath, type: \"string\" } },\n });\n const { objectId } = await locator.resolveNode();\n const ownerSession = locator.getFrame().session;\n await ownerSession.send(\"DOM.scrollIntoViewIfNeeded\", { objectId });\n await ownerSession\n .send(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n}\n\nasync function scrollElementToPercentage(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n const { locator, xpath, args } = ctx;\n v3Logger({\n category: \"action\",\n message: \"scrolling element vertically to specified percentage\",\n level: 2,\n auxiliary: {\n xpath: { value: xpath, type: \"string\" },\n coordinate: { value: JSON.stringify(args), type: \"string\" },\n },\n });\n\n const [yArg = \"0%\"] = args;\n await locator.scrollTo(yArg);\n}\n\n/** Scroll the page by pixel offset, starting from the element's center. */\nasync function scrollByPixelOffset(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n const { locator, page, args } = ctx;\n const dx = Number(args[0] ?? 0);\n const dy = Number(args[1] ?? 0);\n\n try {\n const { x, y } = await locator.centroid();\n await page.scroll(x, y, dx, dy);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function wheelScroll(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { frame, args } = ctx;\n const deltaY = Number(args[0] ?? 200);\n v3Logger({\n category: \"action\",\n message: \"dispatching mouse wheel\",\n level: 2,\n auxiliary: { deltaY: { value: String(deltaY), type: \"string\" } },\n });\n await frame.session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseWheel\",\n x: 0,\n y: 0,\n deltaY,\n deltaX: 0,\n } as Protocol.Input.DispatchMouseEventRequest);\n}\n\nasync function fillOrType(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { locator, xpath, args } = ctx;\n try {\n await locator.fill(\"\"); // clear\n await locator.fill(args[0] ?? \"\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error filling element\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function typeText(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { locator, xpath, args } = ctx;\n try {\n await locator.type(args[0] ?? \"\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error typing into element\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function pressKey(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { args, xpath, page } = ctx;\n const key = args[0] ?? \"\";\n try {\n v3Logger({\n category: \"action\",\n message: \"pressing key\",\n level: 1,\n auxiliary: {\n key: { value: key, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n await page.keyPress(key);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error pressing key\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n key: { value: key, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function clickElement(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n const { locator, xpath, args } = ctx;\n try {\n await locator.click({ button: (args[0] as MouseButton) || undefined });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error performing click\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new StagehandClickError(ctx.xpath, msg);\n }\n}\n\nasync function doubleClick(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { locator, xpath } = ctx;\n try {\n await locator.click({ clickCount: 2 });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error performing doubleClick\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function dragAndDrop(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { page, frame, locator, args, xpath } = ctx;\n const toXPath = String(args[0] ?? \"\").trim();\n if (!toXPath)\n throw new UnderstudyCommandException(\n \"dragAndDrop requires a target XPath arg\",\n );\n\n const targetLocator = await resolveLocatorWithHops(page, frame, toXPath);\n\n try {\n // 1) Centers in local (owning-frame) viewport\n const { x: fromLocalX, y: fromLocalY } = await locator.centroid();\n const { x: toLocalX, y: toLocalY } = await targetLocator.centroid();\n\n // 2) Convert to main-viewport absolute coordinates\n const fromAbs = await locator\n .getFrame()\n .evaluate<{ x: number; y: number }, { x: number; y: number }>(\n ({ x, y }: { x: number; y: number }) => {\n let X = x;\n let Y = y;\n let w: Window = window;\n while (w !== w.top) {\n const fe = w.frameElement as HTMLElement | null;\n if (!fe) break;\n const r = fe.getBoundingClientRect();\n X += r.left;\n Y += r.top;\n w = w.parent as Window;\n }\n return { x: Math.round(X), y: Math.round(Y) };\n },\n { x: fromLocalX, y: fromLocalY },\n );\n\n const toAbs = await targetLocator\n .getFrame()\n .evaluate<{ x: number; y: number }, { x: number; y: number }>(\n ({ x, y }: { x: number; y: number }) => {\n let X = x;\n let Y = y;\n let w: Window = window;\n while (w !== w.top) {\n const fe = w.frameElement as HTMLElement | null;\n if (!fe) break;\n const r = fe.getBoundingClientRect();\n X += r.left;\n Y += r.top;\n w = w.parent as Window;\n }\n return { x: Math.round(X), y: Math.round(Y) };\n },\n { x: toLocalX, y: toLocalY },\n );\n\n // 3) Perform drag in main session\n await page.dragAndDrop(fromAbs.x, fromAbs.y, toAbs.x, toAbs.y, {\n steps: 10,\n delay: 5,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error performing dragAndDrop\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n from: { value: xpath, type: \"string\" },\n to: { value: toXPath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function scrollToNextChunk(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n await scrollByElementHeight(ctx, /*dir=*/ 1);\n}\n\nasync function scrollToPreviousChunk(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n await scrollByElementHeight(ctx, /*dir=*/ -1);\n}\n\nasync function scrollByElementHeight(\n ctx: UnderstudyMethodHandlerContext,\n direction: 1 | -1,\n): Promise<void> {\n const { locator, xpath } = ctx;\n v3Logger({\n category: \"action\",\n message:\n direction > 0 ? \"scrolling to next chunk\" : \"scrolling to previous chunk\",\n level: 2,\n auxiliary: { xpath: { value: xpath, type: \"string\" } },\n });\n\n const { objectId } = await locator.resolveNode();\n try {\n const ownerSession = locator.getFrame().session;\n await ownerSession.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: `\n function(dir) {\n const waitForScrollEnd = (el) => new Promise((resolve) => {\n let last = el.scrollTop ?? 0;\n const check = () => {\n const cur = el.scrollTop ?? 0;\n if (cur === last) return resolve();\n last = cur;\n requestAnimationFrame(check);\n };\n requestAnimationFrame(check);\n });\n\n const tag = this.tagName?.toLowerCase();\n if (tag === \"html\" || tag === \"body\") {\n const h = window.visualViewport?.height ?? window.innerHeight;\n window.scrollBy({ top: h * dir, left: 0, behavior: \"smooth\" });\n const root = document.scrollingElement ?? document.documentElement;\n return waitForScrollEnd(root);\n }\n const h = this.getBoundingClientRect().height;\n this.scrollBy({ top: h * dir, left: 0, behavior: \"smooth\" });\n return waitForScrollEnd(this);\n }\n `,\n arguments: [{ value: direction }],\n awaitPromise: true,\n returnByValue: true,\n },\n );\n } finally {\n const ownerSession = locator.getFrame().session;\n await ownerSession\n .send(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n}\n\nexport async function hover(ctx: UnderstudyMethodHandlerContext) {\n const { locator, xpath } = ctx;\n try {\n await locator.hover();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n const stack = e instanceof Error ? e.stack : undefined;\n v3Logger({\n category: \"action\",\n message: \"error attempting to hover\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n trace: { value: stack ?? \"\", type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\n/* ===================== Helpers ===================== */\n\nasync function getFrameUrl(frame: Frame): Promise<string> {\n // Evaluate from within the frame's isolated world\n const url = await frame.evaluate<string>(\"location.href\");\n return url;\n}\n\n/**\n * More robust DOM settle using Network + Page events to detect network quiet.\n * Closely modeled after the provided snippet, adapted to our Frame/session + logger.\n */\nexport async function waitForDomNetworkQuiet(\n frame: Frame,\n timeoutMs?: number,\n): Promise<void> {\n const overallTimeout =\n typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs)\n ? Math.max(0, timeoutMs)\n : 5_000;\n const client = frame.session;\n const settleStart = Date.now();\n\n // Ensure a document exists; if not, wait for DOMContentLoaded on this frame.\n let hasDoc: boolean;\n try {\n const rs = await frame.evaluate<string>(\"document.readyState\");\n hasDoc = rs === \"interactive\" || rs === \"complete\";\n } catch {\n hasDoc = false;\n }\n if (!hasDoc && overallTimeout > 0) {\n await frame\n .waitForLoadState(\"domcontentloaded\", overallTimeout)\n .catch(() => {});\n }\n\n const elapsed = Date.now() - settleStart;\n const remainingBudget = Math.max(0, overallTimeout - elapsed);\n if (remainingBudget === 0) {\n return;\n }\n\n await client.send(\"Network.enable\").catch(() => {});\n await client.send(\"Page.enable\").catch(() => {});\n // Best-effort; some sessions may not support Target.setAutoAttach here.\n await client\n .send(\"Target.setAutoAttach\", {\n autoAttach: true,\n waitForDebuggerOnStart: false,\n flatten: true,\n filter: [\n { type: \"worker\", exclude: true },\n { type: \"shared_worker\", exclude: true },\n ],\n })\n .catch(() => {});\n\n return new Promise<void>((resolve) => {\n const inflight = new Set<string>();\n const meta = new Map<string, { url: string; start: number }>();\n const docByFrame = new Map<string, string>();\n\n let quietTimer: NodeJS.Timeout | null = null;\n let stalledRequestSweepTimer: NodeJS.Timeout | null = null;\n\n const clearQuiet = () => {\n if (quietTimer) {\n clearTimeout(quietTimer);\n quietTimer = null;\n }\n };\n\n const maybeQuiet = () => {\n if (inflight.size === 0 && !quietTimer)\n quietTimer = setTimeout(() => resolveDone(), 500);\n };\n\n const finishReq = (id: string) => {\n if (!inflight.delete(id)) return;\n meta.delete(id);\n for (const [fid, rid] of docByFrame)\n if (rid === id) docByFrame.delete(fid);\n clearQuiet();\n maybeQuiet();\n };\n\n const onRequest = (p: Protocol.Network.RequestWillBeSentEvent) => {\n // Ignore long-lived streams\n // ResourceType includes: Document, XHR, Fetch, WebSocket, EventSource, etc.\n if (p.type === \"WebSocket\" || p.type === \"EventSource\") return;\n\n inflight.add(p.requestId);\n meta.set(p.requestId, { url: p.request.url, start: Date.now() });\n\n if (p.type === \"Document\" && p.frameId)\n docByFrame.set(p.frameId, p.requestId);\n\n clearQuiet();\n };\n\n const onFinish = (p: { requestId: string }) => finishReq(p.requestId);\n const onCached = (p: { requestId: string }) => finishReq(p.requestId);\n const onDataUrl = (p: Protocol.Network.ResponseReceivedEvent) => {\n if (p.response.url?.startsWith(\"data:\")) finishReq(p.requestId);\n };\n\n const onFrameStop = (f: Protocol.Page.FrameStoppedLoadingEvent) => {\n const id = docByFrame.get(f.frameId);\n if (id) finishReq(id);\n };\n\n client.on(\"Network.requestWillBeSent\", onRequest);\n client.on(\"Network.loadingFinished\", onFinish);\n client.on(\"Network.loadingFailed\", onFinish);\n client.on(\"Network.requestServedFromCache\", onCached);\n client.on(\"Network.responseReceived\", onDataUrl);\n client.on(\"Page.frameStoppedLoading\", onFrameStop);\n\n stalledRequestSweepTimer = setInterval(() => {\n const now = Date.now();\n for (const [id, m] of meta) {\n if (now - m.start > 2_000) {\n inflight.delete(id);\n meta.delete(id);\n v3Logger({\n category: \"dom\",\n message: \"⏳ forcing completion of stalled iframe document\",\n level: 1,\n auxiliary: {\n url: { value: (m.url ?? \"\").slice(0, 120), type: \"string\" },\n },\n });\n }\n }\n maybeQuiet();\n }, 500);\n\n maybeQuiet();\n\n const guard = setTimeout(() => {\n if (inflight.size) {\n v3Logger({\n category: \"dom\",\n message:\n \"⚠️ DOM-settle timeout reached – network requests still pending\",\n level: 1,\n auxiliary: {\n count: { value: String(inflight.size), type: \"integer\" },\n },\n });\n }\n resolveDone();\n }, remainingBudget);\n\n const resolveDone = () => {\n client.off(\"Network.requestWillBeSent\", onRequest);\n client.off(\"Network.loadingFinished\", onFinish);\n client.off(\"Network.loadingFailed\", onFinish);\n client.off(\"Network.requestServedFromCache\", onCached);\n client.off(\"Network.responseReceived\", onDataUrl);\n client.off(\"Page.frameStoppedLoading\", onFrameStop);\n if (quietTimer) clearTimeout(quietTimer);\n if (stalledRequestSweepTimer) clearInterval(stalledRequestSweepTimer);\n clearTimeout(guard);\n resolve();\n };\n });\n}\n"]}
1
+ {"version":3,"file":"actHandlerUtils.js","sourceRoot":"","sources":["../../../../../../lib/v3/handlers/handlerUtils/actHandlerUtils.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/handlers/handlerUtils/actHandlerUtils.ts\nimport { Protocol } from \"devtools-protocol\";\nimport { Frame } from \"../../understudy/frame.js\";\nimport { Locator } from \"../../understudy/locator.js\";\nimport { MouseButton } from \"../../types/public/locator.js\";\nimport { resolveLocatorWithHops } from \"../../understudy/deepLocator.js\";\nimport type { Page } from \"../../understudy/page.js\";\nimport { v3Logger } from \"../../logger.js\";\nimport { FlowLogger } from \"../../flowlogger/FlowLogger.js\";\nimport { toTitleCase } from \"../../../utils.js\";\nimport {\n StagehandClickError,\n UnderstudyCommandException,\n} from \"../../types/public/sdkErrors.js\";\n\nexport interface UnderstudyMethodHandlerContext {\n method: string;\n locator: Locator;\n xpath: string;\n args: ReadonlyArray<string>;\n frame: Frame;\n page: Page;\n initialUrl: string;\n domSettleTimeoutMs?: number;\n}\n\n// Normalize cases where the XPath is the root \"/\" to point to the HTML element.\nfunction normalizeRootXPath(input: string): string {\n const s = String(input ?? \"\").trim();\n if (s === \"/\") return \"/html\";\n if (/^xpath=\\/$/i.test(s)) return \"xpath=/html\";\n return s;\n}\n\nexport async function performUnderstudyMethod(\n page: Page,\n frame: Frame,\n method: string,\n rawXPath: string,\n args: ReadonlyArray<unknown>,\n domSettleTimeoutMs?: number,\n): Promise<void> {\n const selectorRaw = normalizeRootXPath(rawXPath);\n\n try {\n await FlowLogger.runWithLogging(\n {\n eventType: `Understudy${toTitleCase(method)}`, // e.g. \"UnderstudyClick\"\n data: {\n target: selectorRaw,\n },\n },\n async () => {\n // Unified resolver: supports '>>' hops and XPath across iframes.\n const locator: Locator = await resolveLocatorWithHops(\n page,\n frame,\n selectorRaw,\n );\n const initialUrl = await getFrameUrl(frame);\n\n v3Logger({\n category: \"action\",\n message: \"performing understudy method\",\n level: 2,\n auxiliary: {\n xpath: { value: selectorRaw, type: \"string\" },\n method: { value: method, type: \"string\" },\n url: { value: initialUrl, type: \"string\" },\n },\n });\n\n const ctx: UnderstudyMethodHandlerContext = {\n method,\n locator,\n xpath: selectorRaw,\n args: args.map((a) => (a == null ? \"\" : String(a))),\n frame,\n page,\n initialUrl,\n domSettleTimeoutMs,\n };\n const handler = METHOD_HANDLER_MAP[method] ?? null;\n\n if (handler) {\n await handler(ctx);\n return;\n }\n\n v3Logger({\n category: \"action\",\n message: \"chosen method is invalid\",\n level: 1,\n auxiliary: { method: { value: method, type: \"string\" } },\n });\n throw new UnderstudyCommandException(`Method ${method} not supported`);\n },\n args,\n );\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n const stack = e instanceof Error ? e.stack : undefined;\n v3Logger({\n category: \"action\",\n message: \"error performing method\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n trace: { value: stack ?? \"\", type: \"string\" },\n method: { value: method, type: \"string\" },\n xpath: { value: selectorRaw, type: \"string\" },\n args: { value: JSON.stringify(args), type: \"object\" },\n },\n });\n if (e instanceof UnderstudyCommandException) {\n throw e;\n }\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\n/* ===================== Handlers & Map ===================== */\n\nconst METHOD_HANDLER_MAP: Record<\n string,\n (ctx: UnderstudyMethodHandlerContext) => Promise<void>\n> = {\n scrollIntoView,\n scrollByPixelOffset,\n scrollTo: scrollElementToPercentage,\n scroll: scrollElementToPercentage,\n \"mouse.wheel\": wheelScroll,\n fill: fillOrType,\n type: typeText,\n press: pressKey,\n click: clickElement,\n tap: tapElement,\n doubleClick,\n dragAndDrop,\n nextChunk: scrollToNextChunk,\n prevChunk: scrollToPreviousChunk,\n selectOptionFromDropdown: selectOption,\n selectOption: selectOption,\n hover: hover,\n};\n\nexport async function selectOption(ctx: UnderstudyMethodHandlerContext) {\n const { locator, xpath, args } = ctx;\n try {\n const text = args[0]?.toString() || \"\";\n await locator.selectOption(text);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n const stack = e instanceof Error ? e.stack : undefined;\n v3Logger({\n category: \"action\",\n message: \"error selecting option\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n trace: { value: stack ?? \"\", type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function scrollIntoView(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n const { locator, xpath } = ctx;\n v3Logger({\n category: \"action\",\n message: \"scrolling element into view\",\n level: 2,\n auxiliary: { xpath: { value: xpath, type: \"string\" } },\n });\n const { objectId } = await locator.resolveNode();\n const ownerSession = locator.getFrame().session;\n await ownerSession.send(\"DOM.scrollIntoViewIfNeeded\", { objectId });\n await ownerSession\n .send(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n}\n\nasync function scrollElementToPercentage(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n const { locator, xpath, args } = ctx;\n v3Logger({\n category: \"action\",\n message: \"scrolling element vertically to specified percentage\",\n level: 2,\n auxiliary: {\n xpath: { value: xpath, type: \"string\" },\n coordinate: { value: JSON.stringify(args), type: \"string\" },\n },\n });\n\n const [yArg = \"0%\"] = args;\n await locator.scrollTo(yArg);\n}\n\n/** Scroll the page by pixel offset, starting from the element's center. */\nasync function scrollByPixelOffset(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n const { locator, page, args } = ctx;\n const dx = Number(args[0] ?? 0);\n const dy = Number(args[1] ?? 0);\n\n try {\n const { x, y } = await locator.centroid();\n await page.scroll(x, y, dx, dy);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function wheelScroll(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { frame, args } = ctx;\n const deltaY = Number(args[0] ?? 200);\n v3Logger({\n category: \"action\",\n message: \"dispatching mouse wheel\",\n level: 2,\n auxiliary: { deltaY: { value: String(deltaY), type: \"string\" } },\n });\n await frame.session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseWheel\",\n x: 0,\n y: 0,\n deltaY,\n deltaX: 0,\n } as Protocol.Input.DispatchMouseEventRequest);\n}\n\nasync function fillOrType(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { locator, xpath, args } = ctx;\n try {\n await locator.fill(\"\"); // clear\n await locator.fill(args[0] ?? \"\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error filling element\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function typeText(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { locator, xpath, args } = ctx;\n try {\n await locator.type(args[0] ?? \"\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error typing into element\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function pressKey(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { args, xpath, page } = ctx;\n const key = args[0] ?? \"\";\n try {\n v3Logger({\n category: \"action\",\n message: \"pressing key\",\n level: 1,\n auxiliary: {\n key: { value: key, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n await page.keyPress(key);\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error pressing key\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n key: { value: key, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function clickElement(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n const { locator, xpath, args } = ctx;\n try {\n await locator.click({ button: (args[0] as MouseButton) || undefined });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error performing click\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new StagehandClickError(ctx.xpath, msg);\n }\n}\n\nasync function tapElement(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { locator, xpath } = ctx;\n try {\n await locator.tap();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error performing tap\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new StagehandClickError(ctx.xpath, msg);\n }\n}\n\nasync function doubleClick(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { locator, xpath } = ctx;\n try {\n await locator.click({ clickCount: 2 });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error performing doubleClick\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function dragAndDrop(ctx: UnderstudyMethodHandlerContext): Promise<void> {\n const { page, frame, locator, args, xpath } = ctx;\n const toXPath = String(args[0] ?? \"\").trim();\n if (!toXPath)\n throw new UnderstudyCommandException(\n \"dragAndDrop requires a target XPath arg\",\n );\n\n const targetLocator = await resolveLocatorWithHops(page, frame, toXPath);\n\n try {\n // 1) Centers in local (owning-frame) viewport\n const { x: fromLocalX, y: fromLocalY } = await locator.centroid();\n const { x: toLocalX, y: toLocalY } = await targetLocator.centroid();\n\n // 2) Convert to main-viewport absolute coordinates\n const fromAbs = await locator\n .getFrame()\n .evaluate<{ x: number; y: number }, { x: number; y: number }>(\n ({ x, y }: { x: number; y: number }) => {\n let X = x;\n let Y = y;\n let w: Window = window;\n while (w !== w.top) {\n const fe = w.frameElement as HTMLElement | null;\n if (!fe) break;\n const r = fe.getBoundingClientRect();\n X += r.left;\n Y += r.top;\n w = w.parent as Window;\n }\n return { x: Math.round(X), y: Math.round(Y) };\n },\n { x: fromLocalX, y: fromLocalY },\n );\n\n const toAbs = await targetLocator\n .getFrame()\n .evaluate<{ x: number; y: number }, { x: number; y: number }>(\n ({ x, y }: { x: number; y: number }) => {\n let X = x;\n let Y = y;\n let w: Window = window;\n while (w !== w.top) {\n const fe = w.frameElement as HTMLElement | null;\n if (!fe) break;\n const r = fe.getBoundingClientRect();\n X += r.left;\n Y += r.top;\n w = w.parent as Window;\n }\n return { x: Math.round(X), y: Math.round(Y) };\n },\n { x: toLocalX, y: toLocalY },\n );\n\n // 3) Perform drag in main session\n await page.dragAndDrop(fromAbs.x, fromAbs.y, toAbs.x, toAbs.y, {\n steps: 10,\n delay: 5,\n });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n v3Logger({\n category: \"action\",\n message: \"error performing dragAndDrop\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n from: { value: xpath, type: \"string\" },\n to: { value: toXPath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\nasync function scrollToNextChunk(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n await scrollByElementHeight(ctx, /*dir=*/ 1);\n}\n\nasync function scrollToPreviousChunk(\n ctx: UnderstudyMethodHandlerContext,\n): Promise<void> {\n await scrollByElementHeight(ctx, /*dir=*/ -1);\n}\n\nasync function scrollByElementHeight(\n ctx: UnderstudyMethodHandlerContext,\n direction: 1 | -1,\n): Promise<void> {\n const { locator, xpath } = ctx;\n v3Logger({\n category: \"action\",\n message:\n direction > 0 ? \"scrolling to next chunk\" : \"scrolling to previous chunk\",\n level: 2,\n auxiliary: { xpath: { value: xpath, type: \"string\" } },\n });\n\n const { objectId } = await locator.resolveNode();\n try {\n const ownerSession = locator.getFrame().session;\n await ownerSession.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: `\n function(dir) {\n const waitForScrollEnd = (el) => new Promise((resolve) => {\n let last = el.scrollTop ?? 0;\n const check = () => {\n const cur = el.scrollTop ?? 0;\n if (cur === last) return resolve();\n last = cur;\n requestAnimationFrame(check);\n };\n requestAnimationFrame(check);\n });\n\n const tag = this.tagName?.toLowerCase();\n if (tag === \"html\" || tag === \"body\") {\n const h = window.visualViewport?.height ?? window.innerHeight;\n window.scrollBy({ top: h * dir, left: 0, behavior: \"smooth\" });\n const root = document.scrollingElement ?? document.documentElement;\n return waitForScrollEnd(root);\n }\n const h = this.getBoundingClientRect().height;\n this.scrollBy({ top: h * dir, left: 0, behavior: \"smooth\" });\n return waitForScrollEnd(this);\n }\n `,\n arguments: [{ value: direction }],\n awaitPromise: true,\n returnByValue: true,\n },\n );\n } finally {\n const ownerSession = locator.getFrame().session;\n await ownerSession\n .send(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n}\n\nexport async function hover(ctx: UnderstudyMethodHandlerContext) {\n const { locator, xpath } = ctx;\n try {\n await locator.hover();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n const stack = e instanceof Error ? e.stack : undefined;\n v3Logger({\n category: \"action\",\n message: \"error attempting to hover\",\n level: 0,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n trace: { value: stack ?? \"\", type: \"string\" },\n xpath: { value: xpath, type: \"string\" },\n },\n });\n throw new UnderstudyCommandException(msg, e);\n }\n}\n\n/* ===================== Helpers ===================== */\n\nasync function getFrameUrl(frame: Frame): Promise<string> {\n // Evaluate from within the frame's isolated world\n const url = await frame.evaluate<string>(\"location.href\");\n return url;\n}\n\n/**\n * More robust DOM settle using Network + Page events to detect network quiet.\n * Closely modeled after the provided snippet, adapted to our Frame/session + logger.\n */\nexport async function waitForDomNetworkQuiet(\n frame: Frame,\n timeoutMs?: number,\n): Promise<void> {\n const overallTimeout =\n typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs)\n ? Math.max(0, timeoutMs)\n : 5_000;\n const client = frame.session;\n const settleStart = Date.now();\n\n // Ensure a document exists; if not, wait for DOMContentLoaded on this frame.\n let hasDoc: boolean;\n try {\n const rs = await frame.evaluate<string>(\"document.readyState\");\n hasDoc = rs === \"interactive\" || rs === \"complete\";\n } catch {\n hasDoc = false;\n }\n if (!hasDoc && overallTimeout > 0) {\n await frame\n .waitForLoadState(\"domcontentloaded\", overallTimeout)\n .catch(() => {});\n }\n\n const elapsed = Date.now() - settleStart;\n const remainingBudget = Math.max(0, overallTimeout - elapsed);\n if (remainingBudget === 0) {\n return;\n }\n\n await client.send(\"Network.enable\").catch(() => {});\n await client.send(\"Page.enable\").catch(() => {});\n // Best-effort; some sessions may not support Target.setAutoAttach here.\n await client\n .send(\"Target.setAutoAttach\", {\n autoAttach: true,\n waitForDebuggerOnStart: false,\n flatten: true,\n filter: [\n { type: \"worker\", exclude: true },\n { type: \"shared_worker\", exclude: true },\n ],\n })\n .catch(() => {});\n\n return new Promise<void>((resolve) => {\n const inflight = new Set<string>();\n const meta = new Map<string, { url: string; start: number }>();\n const docByFrame = new Map<string, string>();\n\n let quietTimer: NodeJS.Timeout | null = null;\n let stalledRequestSweepTimer: NodeJS.Timeout | null = null;\n\n const clearQuiet = () => {\n if (quietTimer) {\n clearTimeout(quietTimer);\n quietTimer = null;\n }\n };\n\n const maybeQuiet = () => {\n if (inflight.size === 0 && !quietTimer)\n quietTimer = setTimeout(() => resolveDone(), 500);\n };\n\n const finishReq = (id: string) => {\n if (!inflight.delete(id)) return;\n meta.delete(id);\n for (const [fid, rid] of docByFrame)\n if (rid === id) docByFrame.delete(fid);\n clearQuiet();\n maybeQuiet();\n };\n\n const onRequest = (p: Protocol.Network.RequestWillBeSentEvent) => {\n // Ignore long-lived streams\n // ResourceType includes: Document, XHR, Fetch, WebSocket, EventSource, etc.\n if (p.type === \"WebSocket\" || p.type === \"EventSource\") return;\n\n inflight.add(p.requestId);\n meta.set(p.requestId, { url: p.request.url, start: Date.now() });\n\n if (p.type === \"Document\" && p.frameId)\n docByFrame.set(p.frameId, p.requestId);\n\n clearQuiet();\n };\n\n const onFinish = (p: { requestId: string }) => finishReq(p.requestId);\n const onCached = (p: { requestId: string }) => finishReq(p.requestId);\n const onDataUrl = (p: Protocol.Network.ResponseReceivedEvent) => {\n if (p.response.url?.startsWith(\"data:\")) finishReq(p.requestId);\n };\n\n const onFrameStop = (f: Protocol.Page.FrameStoppedLoadingEvent) => {\n const id = docByFrame.get(f.frameId);\n if (id) finishReq(id);\n };\n\n client.on(\"Network.requestWillBeSent\", onRequest);\n client.on(\"Network.loadingFinished\", onFinish);\n client.on(\"Network.loadingFailed\", onFinish);\n client.on(\"Network.requestServedFromCache\", onCached);\n client.on(\"Network.responseReceived\", onDataUrl);\n client.on(\"Page.frameStoppedLoading\", onFrameStop);\n\n stalledRequestSweepTimer = setInterval(() => {\n const now = Date.now();\n for (const [id, m] of meta) {\n if (now - m.start > 2_000) {\n inflight.delete(id);\n meta.delete(id);\n v3Logger({\n category: \"dom\",\n message: \"⏳ forcing completion of stalled iframe document\",\n level: 1,\n auxiliary: {\n url: { value: (m.url ?? \"\").slice(0, 120), type: \"string\" },\n },\n });\n }\n }\n maybeQuiet();\n }, 500);\n\n maybeQuiet();\n\n const guard = setTimeout(() => {\n if (inflight.size) {\n v3Logger({\n category: \"dom\",\n message:\n \"⚠️ DOM-settle timeout reached – network requests still pending\",\n level: 1,\n auxiliary: {\n count: { value: String(inflight.size), type: \"integer\" },\n },\n });\n }\n resolveDone();\n }, remainingBudget);\n\n const resolveDone = () => {\n client.off(\"Network.requestWillBeSent\", onRequest);\n client.off(\"Network.loadingFinished\", onFinish);\n client.off(\"Network.loadingFailed\", onFinish);\n client.off(\"Network.requestServedFromCache\", onCached);\n client.off(\"Network.responseReceived\", onDataUrl);\n client.off(\"Page.frameStoppedLoading\", onFrameStop);\n if (quietTimer) clearTimeout(quietTimer);\n if (stalledRequestSweepTimer) clearInterval(stalledRequestSweepTimer);\n clearTimeout(guard);\n resolve();\n };\n });\n}\n"]}
@@ -260,6 +260,38 @@ class V3CuaAgentHandler {
260
260
  switch (action.type) {
261
261
  case "click": {
262
262
  const { x, y, button = "left", clickCount } = action;
263
+ // On a touch session the computer-use model still emits "click", but the
264
+ // browser renders the site's touch-gated mobile layout whose handlers only
265
+ // respond to touch/pointer events — a mouse click there registers as "no
266
+ // selection" (e.g. a size selector's "please choose a size"). So actuate a
267
+ // single LEFT click as a trusted touch tap instead. Non-left (context menu)
268
+ // and multi-click stay on the mouse path unchanged.
269
+ const isPrimarySingleClick = button === "left" && (clickCount ?? 1) === 1;
270
+ if (isPrimarySingleClick) {
271
+ if (this.v3.usesTouch) {
272
+ if (recording) {
273
+ // Record the tap as a deterministic "tap" step so replay reproduces
274
+ // touch (dispatched via METHOD_HANDLER_MAP.tap -> locator.tap).
275
+ const xpath = await page.tap(x, y, {
276
+ returnXpath: true,
277
+ });
278
+ const normalized = (0, xpath_js_1.ensureXPath)(xpath);
279
+ if (normalized) {
280
+ const stagehandAction = {
281
+ selector: normalized,
282
+ description: this.describePointerAction("tap", x, y),
283
+ method: "tap",
284
+ arguments: [],
285
+ };
286
+ this.recordCuaActStep(action, [stagehandAction], stagehandAction.description);
287
+ }
288
+ }
289
+ else {
290
+ await page.tap(x, y);
291
+ }
292
+ return { success: true };
293
+ }
294
+ }
263
295
  if (recording) {
264
296
  const xpath = await page.click(x, y, {
265
297
  button: button ?? "left",
@@ -570,26 +602,8 @@ class V3CuaAgentHandler {
570
602
  });
571
603
  }
572
604
  async updateClientViewport() {
573
- try {
574
- // For Google CUA, use configured viewport for coordinate normalization
575
- // Browserbase managed fingerprinting uses a fixed 1288x711 fallback.
576
- if (this.agentClient instanceof GoogleCUAClient_js_1.GoogleCUAClient) {
577
- const dims = this.v3.isVerified
578
- ? { width: 1288, height: 711 }
579
- : this.v3.configuredViewport;
580
- this.agentClient.setViewport(dims.width, dims.height);
581
- }
582
- else {
583
- // For other clients, use actual window dimensions
584
- const page = await this.v3.context.awaitActivePage();
585
- const { w, h } = await page.mainFrame().evaluate("({ w: window.innerWidth, h: window.innerHeight })");
586
- if (w && h)
587
- this.agentClient.setViewport(w, h);
588
- }
589
- }
590
- catch {
591
- //
592
- }
605
+ const { width, height } = await this.v3.resolveViewport();
606
+ this.agentClient.setViewport(width, height);
593
607
  }
594
608
  async updateClientUrl() {
595
609
  try {