@browserbasehq/orca 3.5.0-preview.0 → 3.5.0-preview.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/cjs/lib/v3/agent/utils/captureAriaTreeProbe.d.ts +35 -0
  2. package/dist/cjs/lib/v3/agent/utils/captureAriaTreeProbe.js +38 -0
  3. package/dist/cjs/lib/v3/agent/utils/captureAriaTreeProbe.js.map +1 -0
  4. package/dist/cjs/lib/v3/agent/utils/postStepProbeEvidence.d.ts +19 -0
  5. package/dist/cjs/lib/v3/agent/utils/postStepProbeEvidence.js +54 -0
  6. package/dist/cjs/lib/v3/agent/utils/postStepProbeEvidence.js.map +1 -0
  7. package/dist/cjs/lib/v3/agent/utils/toolOutputEvidence.d.ts +2 -0
  8. package/dist/cjs/lib/v3/agent/utils/toolOutputEvidence.js +62 -0
  9. package/dist/cjs/lib/v3/agent/utils/toolOutputEvidence.js.map +1 -0
  10. package/dist/cjs/lib/v3/agent/utils/wrapEvidenceCallback.d.ts +3 -0
  11. package/dist/cjs/lib/v3/agent/utils/wrapEvidenceCallback.js +25 -0
  12. package/dist/cjs/lib/v3/agent/utils/wrapEvidenceCallback.js.map +1 -0
  13. package/dist/cjs/lib/v3/api.d.ts +7 -1
  14. package/dist/cjs/lib/v3/api.js +100 -29
  15. package/dist/cjs/lib/v3/api.js.map +1 -1
  16. package/dist/cjs/lib/v3/dom/build/selectorRuntime.generated.d.ts +24 -0
  17. package/dist/cjs/lib/v3/dom/build/selectorRuntime.generated.js +31 -0
  18. package/dist/cjs/lib/v3/dom/build/selectorRuntime.generated.js.map +1 -0
  19. package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +1 -0
  20. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +83 -7
  21. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  22. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.d.ts +11 -0
  23. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +119 -5
  24. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  25. package/dist/cjs/lib/v3/index.d.ts +11 -0
  26. package/dist/cjs/lib/v3/index.js +19 -1
  27. package/dist/cjs/lib/v3/index.js.map +1 -1
  28. package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +3 -0
  29. package/dist/cjs/lib/v3/llm/LLMProvider.js +28 -8
  30. package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
  31. package/dist/cjs/lib/v3/types/public/agent.d.ts +6 -0
  32. package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
  33. package/dist/cjs/lib/v3/types/public/agentEvidenceEvents.d.ts +85 -0
  34. package/dist/cjs/lib/v3/types/public/agentEvidenceEvents.js +15 -0
  35. package/dist/cjs/lib/v3/types/public/agentEvidenceEvents.js.map +1 -0
  36. package/dist/cjs/lib/v3/types/public/api.d.ts +414 -182
  37. package/dist/cjs/lib/v3/types/public/api.js +62 -20
  38. package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
  39. package/dist/cjs/lib/v3/types/public/index.d.ts +1 -0
  40. package/dist/cjs/lib/v3/types/public/index.js +1 -0
  41. package/dist/cjs/lib/v3/types/public/index.js.map +1 -1
  42. package/dist/cjs/lib/v3/types/public/model.d.ts +16 -7
  43. package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
  44. package/dist/cjs/lib/v3/v3.d.ts +1 -0
  45. package/dist/cjs/lib/v3/v3.js +14 -0
  46. package/dist/cjs/lib/v3/v3.js.map +1 -1
  47. package/dist/cjs/lib/v3/verifier/evidenceNormalization.d.ts +7 -0
  48. package/dist/cjs/lib/v3/verifier/evidenceNormalization.js +100 -0
  49. package/dist/cjs/lib/v3/verifier/evidenceNormalization.js.map +1 -0
  50. package/dist/cjs/lib/v3/verifier/index.d.ts +6 -0
  51. package/dist/cjs/lib/v3/verifier/index.js +16 -0
  52. package/dist/cjs/lib/v3/verifier/index.js.map +1 -0
  53. package/dist/cjs/lib/v3/verifier/trajectory.d.ts +50 -0
  54. package/dist/cjs/lib/v3/verifier/trajectory.js +316 -0
  55. package/dist/cjs/lib/v3/verifier/trajectory.js.map +1 -0
  56. package/dist/cjs/lib/v3/verifier/types.d.ts +281 -0
  57. package/dist/cjs/lib/v3/verifier/types.js +10 -0
  58. package/dist/cjs/lib/v3/verifier/types.js.map +1 -0
  59. package/dist/cjs/lib/v3Evaluator.d.ts +9 -4
  60. package/dist/cjs/lib/v3Evaluator.js +148 -0
  61. package/dist/cjs/lib/v3Evaluator.js.map +1 -1
  62. package/dist/cjs/lib/v3LegacyEvaluator.js +5 -1
  63. package/dist/cjs/lib/v3LegacyEvaluator.js.map +1 -1
  64. package/dist/esm/lib/v3/agent/utils/captureAriaTreeProbe.d.ts +35 -0
  65. package/dist/esm/lib/v3/agent/utils/captureAriaTreeProbe.js +35 -0
  66. package/dist/esm/lib/v3/agent/utils/captureAriaTreeProbe.js.map +1 -0
  67. package/dist/esm/lib/v3/agent/utils/postStepProbeEvidence.d.ts +19 -0
  68. package/dist/esm/lib/v3/agent/utils/postStepProbeEvidence.js +50 -0
  69. package/dist/esm/lib/v3/agent/utils/postStepProbeEvidence.js.map +1 -0
  70. package/dist/esm/lib/v3/agent/utils/toolOutputEvidence.d.ts +2 -0
  71. package/dist/esm/lib/v3/agent/utils/toolOutputEvidence.js +59 -0
  72. package/dist/esm/lib/v3/agent/utils/toolOutputEvidence.js.map +1 -0
  73. package/dist/esm/lib/v3/agent/utils/wrapEvidenceCallback.d.ts +3 -0
  74. package/dist/esm/lib/v3/agent/utils/wrapEvidenceCallback.js +22 -0
  75. package/dist/esm/lib/v3/agent/utils/wrapEvidenceCallback.js.map +1 -0
  76. package/dist/esm/lib/v3/api.d.ts +7 -1
  77. package/dist/esm/lib/v3/api.js +100 -29
  78. package/dist/esm/lib/v3/api.js.map +1 -1
  79. package/dist/esm/lib/v3/dom/build/selectorRuntime.generated.d.ts +24 -0
  80. package/dist/esm/lib/v3/dom/build/selectorRuntime.generated.js +28 -0
  81. package/dist/esm/lib/v3/dom/build/selectorRuntime.generated.js.map +1 -0
  82. package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +1 -0
  83. package/dist/esm/lib/v3/handlers/v3AgentHandler.js +83 -7
  84. package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  85. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.d.ts +11 -0
  86. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +119 -5
  87. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  88. package/dist/esm/lib/v3/index.d.ts +11 -0
  89. package/dist/esm/lib/v3/index.js +10 -0
  90. package/dist/esm/lib/v3/index.js.map +1 -1
  91. package/dist/esm/lib/v3/llm/LLMProvider.d.ts +3 -0
  92. package/dist/esm/lib/v3/llm/LLMProvider.js +28 -9
  93. package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
  94. package/dist/esm/lib/v3/types/public/agent.d.ts +6 -0
  95. package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
  96. package/dist/esm/lib/v3/types/public/agentEvidenceEvents.d.ts +85 -0
  97. package/dist/esm/lib/v3/types/public/agentEvidenceEvents.js +14 -0
  98. package/dist/esm/lib/v3/types/public/agentEvidenceEvents.js.map +1 -0
  99. package/dist/esm/lib/v3/types/public/api.d.ts +414 -182
  100. package/dist/esm/lib/v3/types/public/api.js +60 -18
  101. package/dist/esm/lib/v3/types/public/api.js.map +1 -1
  102. package/dist/esm/lib/v3/types/public/index.d.ts +1 -0
  103. package/dist/esm/lib/v3/types/public/index.js +1 -0
  104. package/dist/esm/lib/v3/types/public/index.js.map +1 -1
  105. package/dist/esm/lib/v3/types/public/model.d.ts +16 -7
  106. package/dist/esm/lib/v3/types/public/model.js.map +1 -1
  107. package/dist/esm/lib/v3/v3.d.ts +1 -0
  108. package/dist/esm/lib/v3/v3.js +14 -0
  109. package/dist/esm/lib/v3/v3.js.map +1 -1
  110. package/dist/esm/lib/v3/verifier/evidenceNormalization.d.ts +7 -0
  111. package/dist/esm/lib/v3/verifier/evidenceNormalization.js +93 -0
  112. package/dist/esm/lib/v3/verifier/evidenceNormalization.js.map +1 -0
  113. package/dist/esm/lib/v3/verifier/index.d.ts +6 -0
  114. package/dist/esm/lib/v3/verifier/index.js +3 -0
  115. package/dist/esm/lib/v3/verifier/index.js.map +1 -0
  116. package/dist/esm/lib/v3/verifier/trajectory.d.ts +50 -0
  117. package/dist/esm/lib/v3/verifier/trajectory.js +273 -0
  118. package/dist/esm/lib/v3/verifier/trajectory.js.map +1 -0
  119. package/dist/esm/lib/v3/verifier/types.d.ts +281 -0
  120. package/dist/esm/lib/v3/verifier/types.js +9 -0
  121. package/dist/esm/lib/v3/verifier/types.js.map +1 -0
  122. package/dist/esm/lib/v3Evaluator.d.ts +9 -4
  123. package/dist/esm/lib/v3Evaluator.js +148 -0
  124. package/dist/esm/lib/v3Evaluator.js.map +1 -1
  125. package/dist/esm/lib/v3LegacyEvaluator.js +5 -1
  126. package/dist/esm/lib/v3LegacyEvaluator.js.map +1 -1
  127. package/package.json +4 -4
@@ -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 { loadApiKeyFromEnv } from \"../utils.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}\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\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 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 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\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 (Object.keys(restOptions).length > 0) {\n if (restOptions.model) {\n restOptions.model = this.prepareModelConfig(restOptions.model);\n }\n wireOptions = restOptions as unknown as Api.ActRequest[\"options\"];\n }\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 (Object.keys(restOptions).length > 0) {\n if (restOptions.model) {\n restOptions.model = this.prepareModelConfig(restOptions.model);\n }\n wireOptions = restOptions as unknown as Api.ExtractRequest[\"options\"];\n }\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 (Object.keys(restOptions).length > 0) {\n if (restOptions.model) {\n restOptions.model = this.prepareModelConfig(restOptions.model);\n }\n wireOptions = restOptions as unknown as Api.ObserveRequest[\"options\"];\n }\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 requestBody: Api.NavigateRequest = { url, options, frameId };\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 : undefined,\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(\n model: ModelConfiguration,\n ): { modelName: string; apiKey?: string } & Record<string, unknown> {\n if (typeof model === \"string\") {\n // Extract provider from model string (e.g., \"openai/gpt-5-nano\" -> \"openai\")\n const provider = model.includes(\"/\") ? model.split(\"/\")[0] : undefined;\n const apiKey =\n provider && provider !== this.modelProvider\n ? (loadApiKeyFromEnv(provider, this.logger) ?? this.modelApiKey)\n : this.modelApiKey;\n return {\n modelName: model,\n ...(apiKey ? { apiKey } : {}),\n };\n }\n\n if (!model.apiKey) {\n const provider = model.modelName?.includes(\"/\")\n ? model.modelName.split(\"/\")[0]\n : undefined;\n const apiKey =\n provider && provider !== this.modelProvider\n ? (loadApiKeyFromEnv(provider, this.logger) ?? this.modelApiKey)\n : this.modelApiKey;\n return {\n ...model,\n ...(apiKey ? { apiKey } : {}),\n };\n }\n\n return model as { modelName: string; apiKey: string } & Record<\n string,\n unknown\n >;\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 { loadApiKeyFromEnv } from \"../utils.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 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 =\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 inheritedDefault =\n provider && provider === this.modelProvider\n ? this.getDefaultModelConfig()\n : undefined;\n const apiKey =\n !model.apiKey && provider && provider !== this.modelProvider\n ? (loadApiKeyFromEnv(provider, this.logger) ?? this.modelApiKey)\n : !model.apiKey\n ? this.modelApiKey\n : undefined;\n\n return {\n ...inheritedDefault,\n ...model,\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 headers = {\n ...defaultHeaders,\n ...options.headers,\n };\n\n if (path.endsWith(\"/navigate\")) {\n let body: unknown = options.body;\n if (typeof options.body === \"string\") {\n try {\n body = JSON.parse(options.body);\n } catch {\n body = options.body;\n }\n }\n\n console.log(\n \"Stagehand goto request\",\n JSON.stringify(\n {\n url: `${baseUrl}${path}`,\n method: options.method,\n headers,\n body,\n },\n null,\n 2,\n ),\n );\n }\n\n const response = await this.fetchWithCookies(`${baseUrl}${path}`, {\n ...options,\n headers,\n });\n\n return response;\n }\n}\n"]}
@@ -0,0 +1,24 @@
1
+ export declare const selectorRuntimeBootstrap = "if (!globalThis.__stagehandSelectorRuntime) { var __stagehandSelectorRuntimeFactory=(()=>{var P=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var $=(t,e)=>{for(var n in e)P(t,n,{get:e[n],enumerable:!0})},C=(t,e,n,r)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let s of N(e))!D.call(t,s)&&s!==n&&P(t,s,{get:()=>e[s],enumerable:!(r=A(e,s))||r.enumerable});return t};var k=t=>C(P({},\"__esModule\",{value:!0}),t);var j={};$(j,{countCssWithRoots:()=>B,countTextWithRoots:()=>Y,countXPathNative:()=>U,countXPathWithRoots:()=>K,hasOpenShadowRoots:()=>V,queryCssWithRoots:()=>X,queryTextWithRoots:()=>M,queryXPathNative:()=>Z,queryXPathWithRoots:()=>z});function R(t){let e=String(t||\"\").trim().replace(/^xpath=/i,\"\");if(!e)return[];let n=[],r=0;for(;r<e.length;){let s=\"child\";e.startsWith(\"//\",r)?(s=\"desc\",r+=2):e[r]===\"/\"&&(s=\"child\",r+=1);let o=r,a=0,i=null;for(;r<e.length;){let l=e[r];if(i)l===i&&(i=null);else if(l===\"'\"||l==='\"')i=l;else if(l===\"[\")a++;else if(l===\"]\")a--;else if(l===\"/\"&&a===0)break;r+=1}let u=e.slice(o,r).trim();if(!u)continue;let{tag:c,predicates:f}=W(u);n.push({axis:s,tag:c,predicates:f})}return n}function q(t){let e=[],n=0;for(;n<t.length;){if(t[n]!==\"[\"){n++;continue}n++;let r=n,s=null;for(;n<t.length;){let o=t[n];if(s)o===s&&(s=null);else if(o===\"'\"||o==='\"')s=o;else if(o===\"]\")break;n++}e.push(t.slice(r,n).trim()),n++}return e}function W(t){let e=t.indexOf(\"[\");if(e===-1)return{tag:t===\"\"?\"*\":t.toLowerCase(),predicates:[]};let n=t.slice(0,e).trim(),r=n===\"\"?\"*\":n.toLowerCase(),s=t.slice(e),o=[];for(let a of q(s)){let i=d(a);i&&o.push(i)}return{tag:r,predicates:o}}function d(t){let e=t.trim();if(!e)return null;let n=y(e,\"or\");if(n.length>1){let o=n.map(a=>d(a)).filter(Boolean);return o.length!==n.length?null:{type:\"or\",predicates:o}}let r=y(e,\"and\");if(r.length>1){let o=r.map(a=>d(a)).filter(Boolean);return o.length!==r.length?null:{type:\"and\",predicates:o}}let s=O(e,\"not\");if(s!=null){let o=d(s);return o?{type:\"not\",predicate:o}:null}return _(e)}function _(t){let e=/^(?:'([^']*)'|\"([^\"]*)\")$/,n=\"[a-zA-Z_][\\\\w.-]*\",r=`(?:'([^']*)'|\"([^\"]*)\")`;if(/^\\d+$/.test(t))return{type:\"index\",index:Math.max(1,Number(t))};let s=t.match(new RegExp(`^normalize-space\\\\(\\\\s*@(${n})\\\\s*\\\\)\\\\s*=\\\\s*${r}$`));if(s)return{type:\"attrEquals\",name:s[1],value:s[2]??s[3]??\"\",normalize:!0};let o=t.match(new RegExp(`^normalize-space\\\\(\\\\s*(?:text\\\\(\\\\)|\\\\.)\\\\s*\\\\)\\\\s*=\\\\s*${r}$`));if(o)return{type:\"textEquals\",value:o[1]??o[2]??\"\",normalize:!0};let a=t.match(new RegExp(`^@(${n})\\\\s*=\\\\s*${r}$`));if(a)return{type:\"attrEquals\",name:a[1],value:a[2]??a[3]??\"\"};let i=t.match(new RegExp(`^@(${n})$`));if(i)return{type:\"attrExists\",name:i[1]};let u=t.match(new RegExp(`^contains\\\\(\\\\s*@(${n})\\\\s*,\\\\s*${r}\\\\s*\\\\)$`));if(u)return{type:\"attrContains\",name:u[1],value:u[2]??u[3]??\"\"};let c=t.match(new RegExp(`^starts-with\\\\(\\\\s*@(${n})\\\\s*,\\\\s*${r}\\\\s*\\\\)$`));if(c)return{type:\"attrStartsWith\",name:c[1],value:c[2]??c[3]??\"\"};let f=t.match(new RegExp(`^(?:text\\\\(\\\\)|\\\\.)\\\\s*=\\\\s*${r}$`));if(f)return{type:\"textEquals\",value:f[1]??f[2]??\"\"};let l=t.match(new RegExp(`^contains\\\\(\\\\s*(?:text\\\\(\\\\)|\\\\.)\\\\s*,\\\\s*${r}\\\\s*\\\\)$`));return l?{type:\"textContains\",value:l[1]??l[2]??\"\"}:(e.test(t),null)}function y(t,e){let n=[],r=0,s=0,o=null,a=0;for(;a<t.length;){let i=t[a];if(o){i===o&&(o=null),a+=1;continue}if(i===\"'\"||i==='\"'){o=i,a+=1;continue}if(i===\"(\"){s+=1,a+=1;continue}if(i===\")\"){s=Math.max(0,s-1),a+=1;continue}if(s===0&&L(t,a,e)){n.push(t.slice(r,a).trim()),a+=e.length,r=a;continue}a+=1}return n.push(t.slice(r).trim()),n.filter(i=>i.length>0)}function L(t,e,n){if(!t.startsWith(n,e))return!1;let r=e>0?t[e-1]:\" \";if(r===\"@\")return!1;let s=e+n.length<t.length?t[e+n.length]:\" \";return S(r)&&S(s)}function S(t){return!/[a-zA-Z0-9_.-]/.test(t)}function O(t,e){let n=`${e}(`;if(!t.startsWith(n)||!t.endsWith(\")\"))return null;let r=t.slice(n.length,-1);return I(r)?r:null}function I(t){let e=0,n=null;for(let r=0;r<t.length;r+=1){let s=t[r];if(n){s===n&&(n=null);continue}if(s===\"'\"||s==='\"'){n=s;continue}if(s===\"(\"?e+=1:s===\")\"&&(e-=1),e<0)return!1}return e===0}var F=t=>t.replace(/\\s+/g,\" \").trim();function b(t){return String(t.textContent??\"\")}function m(t,e){return e?F(t):t}function x(t,e){switch(e.type){case\"and\":return e.predicates.every(n=>x(t,n));case\"or\":return e.predicates.some(n=>x(t,n));case\"not\":return!x(t,e.predicate);case\"attrExists\":return t.getAttribute(e.name)!==null;case\"attrEquals\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize)===m(e.value,e.normalize)}case\"attrContains\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize).includes(m(e.value,e.normalize))}case\"attrStartsWith\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize).startsWith(m(e.value,e.normalize))}case\"textEquals\":return m(b(t),e.normalize)===m(e.value,e.normalize);case\"textContains\":return m(b(t),e.normalize).includes(m(e.value,e.normalize));case\"index\":return!0;default:return!0}}function v(t,e){let n=t;for(let r of e){if(!n.length)return[];if(r.type===\"index\"){let s=r.index-1;n=s>=0&&s<n.length?[n[s]]:[];continue}n=n.filter(s=>x(s,r))}return n}function w(t){let e=new Map;for(let n=0;n<t.length;n+=2){let r=t[n],s=t[n+1];r instanceof Element&&s instanceof ShadowRoot&&e.set(r,s)}return e}function E(t,e){if(!t)return[];if(t instanceof Document)return t.documentElement?[t.documentElement]:[];if(t instanceof ShadowRoot||t instanceof DocumentFragment)return Array.from(t.children||[]);if(!(t instanceof Element))return[];let n=Array.from(t.children||[]);t.shadowRoot&&n.push(...Array.from(t.shadowRoot.children||[]));let r=e.get(t);return r&&n.push(...Array.from(r.children||[])),n}function H(t,e){let n=[],r=new Set,s=[...E(t,e)].reverse();for(;s.length;){let o=s.pop();if(!(o instanceof Element)||r.has(o))continue;r.add(o),n.push(o);let a=E(o,e);for(let i=a.length-1;i>=0;i-=1)s.push(a[i])}return n}function X(t,e,...n){let r=w(n),s=[],o=new Set,a=[...E(this,r)].reverse();for(;a.length&&s.length<e;){let i=a.pop();if(!(i instanceof Element)||o.has(i))continue;o.add(i);try{if(i.matches(t)&&(s.push(i),s.length>=e))break}catch{return[]}let u=E(i,r);for(let c=u.length-1;c>=0;c-=1)a.push(u[c])}return s}function B(t,...e){return X.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function M(t,e,...n){let r=w(n),s=new Set([\"SCRIPT\",\"STYLE\",\"TEMPLATE\",\"NOSCRIPT\",\"HEAD\",\"TITLE\",\"LINK\",\"META\",\"HTML\",\"BODY\"]),o=String(t||\"\").toLowerCase();if(!o)return[];let a=l=>{let g=l.tagName?l.tagName.toUpperCase():\"\";if(s.has(g))return\"\";try{let p=l.innerText;if(typeof p==\"string\"&&p.trim())return p.trim()}catch{}let h=l.textContent;return typeof h==\"string\"?h.trim():\"\"},i=[],u=new Set,c=[...E(this,r)].reverse();for(;c.length;){let l=c.pop();if(!(l instanceof Element)||u.has(l))continue;u.add(l);let g=a(l);g&&g.toLowerCase().includes(o)&&i.push(l);let h=E(l,r);for(let p=h.length-1;p>=0;p-=1)c.push(h[p])}let f=[];for(let l of i){let g=!1;for(let h of i)if(l!==h)try{if(l.contains(h)){g=!0;break}}catch{}if(!g&&(f.push(l),f.length>=e))break}return f}function Y(t,...e){return M.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function T(t){let e=String(t||\"\").trim();return e?e.replace(/^xpath=/i,\"\").trim():\"\"}function G(t,e){return e.tag===\"*\"?!0:t.localName===e.tag}function z(t,e,...n){let r=w(n),s=R(t);if(!s.length)return[];let o=[this];for(let a of s){let i=[],u=new Set;for(let c of o){let l=(a.axis===\"child\"?E(c,r):H(c,r)).filter(h=>G(h,a)),g=v(l,a.predicates);for(let h of g)if(!u.has(h)&&(u.add(h),i.push(h),i.length>=e&&a===s[s.length-1]))break}if(!i.length)return[];o=i}return o.slice(0,e)}function K(t,...e){return z.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function Z(t,e){let n=T(t);if(!n||!Number.isFinite(e)||e<=0)return[];try{let r=this.evaluate(n,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),s=[],o=Math.min(r.snapshotLength,Math.floor(e));for(let a=0;a<o;a+=1){let i=r.snapshotItem(a);i instanceof Element&&s.push(i)}return s}catch{return[]}}function U(t){let e=T(t);if(!e)return 0;try{let n=this.evaluate(e,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),r=0;for(let s=0;s<n.snapshotLength;s+=1)n.snapshotItem(s)instanceof Element&&(r+=1);return r}catch{return 0}}function V(){try{let t=this.createTreeWalker(this,NodeFilter.SHOW_ELEMENT);for(;t.nextNode();){let e=t.currentNode;if(e instanceof Element&&e.shadowRoot)return!0}}catch{return!1}return!1}return k(j);})();\n globalThis.__stagehandSelectorRuntime = __stagehandSelectorRuntimeFactory;\n}";
2
+ export declare const selectorRuntimeSources: {
3
+ readonly countCssWithRoots: "function O(t,...e){return C.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}";
4
+ readonly countTextWithRoots: "function I(t,...e){return k.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}";
5
+ readonly countXPathNative: "function B(t){let e=v(t);if(!e)return 0;try{let n=this.evaluate(e,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),r=0;for(let s=0;s<n.snapshotLength;s+=1)n.snapshotItem(s)instanceof Element&&(r+=1);return r}catch{return 0}}";
6
+ readonly countXPathWithRoots: "function F(t,...e){return W.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}";
7
+ readonly hasOpenShadowRoots: "function Y(){try{let t=this.createTreeWalker(this,NodeFilter.SHOW_ELEMENT);for(;t.nextNode();){let e=t.currentNode;if(e instanceof Element&&e.shadowRoot)return!0}}catch{return!1}return!1}";
8
+ readonly queryCssWithRoots: "function C(t,e,...n){let r=P(n),s=[],o=new Set,a=[...E(this,r)].reverse();for(;a.length&&s.length<e;){let i=a.pop();if(!(i instanceof Element)||o.has(i))continue;o.add(i);try{if(i.matches(t)&&(s.push(i),s.length>=e))break}catch{return[]}let u=E(i,r);for(let c=u.length-1;c>=0;c-=1)a.push(u[c])}return s}";
9
+ readonly queryTextWithRoots: "function k(t,e,...n){let r=P(n),s=new Set([\"SCRIPT\",\"STYLE\",\"TEMPLATE\",\"NOSCRIPT\",\"HEAD\",\"TITLE\",\"LINK\",\"META\",\"HTML\",\"BODY\"]),o=String(t||\"\").toLowerCase();if(!o)return[];let a=l=>{let g=l.tagName?l.tagName.toUpperCase():\"\";if(s.has(g))return\"\";try{let p=l.innerText;if(typeof p==\"string\"&&p.trim())return p.trim()}catch{}let h=l.textContent;return typeof h==\"string\"?h.trim():\"\"},i=[],u=new Set,c=[...E(this,r)].reverse();for(;c.length;){let l=c.pop();if(!(l instanceof Element)||u.has(l))continue;u.add(l);let g=a(l);g&&g.toLowerCase().includes(o)&&i.push(l);let h=E(l,r);for(let p=h.length-1;p>=0;p-=1)c.push(h[p])}let f=[];for(let l of i){let g=!1;for(let h of i)if(l!==h)try{if(l.contains(h)){g=!0;break}}catch{}if(!g&&(f.push(l),f.length>=e))break}return f}";
10
+ readonly queryXPathNative: "function H(t,e){let n=v(t);if(!n||!Number.isFinite(e)||e<=0)return[];try{let r=this.evaluate(n,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),s=[],o=Math.min(r.snapshotLength,Math.floor(e));for(let a=0;a<o;a+=1){let i=r.snapshotItem(a);i instanceof Element&&s.push(i)}return s}catch{return[]}}";
11
+ readonly queryXPathWithRoots: "function W(t,e,...n){let r=P(n),s=b(t);if(!s.length)return[];let o=[this];for(let a of s){let i=[],u=new Set;for(let c of o){let l=(a.axis===\"child\"?E(c,r):$(c,r)).filter(h=>q(h,a)),g=R(l,a.predicates);for(let h of g)if(!u.has(h)&&(u.add(h),i.push(h),i.length>=e&&a===s[s.length-1]))break}if(!i.length)return[];o=i}return o.slice(0,e)}";
12
+ };
13
+ export declare const selectorRuntimeGlobalRefs: {
14
+ readonly countCssWithRoots: "globalThis.__stagehandSelectorRuntime.countCssWithRoots";
15
+ readonly countTextWithRoots: "globalThis.__stagehandSelectorRuntime.countTextWithRoots";
16
+ readonly countXPathNative: "globalThis.__stagehandSelectorRuntime.countXPathNative";
17
+ readonly countXPathWithRoots: "globalThis.__stagehandSelectorRuntime.countXPathWithRoots";
18
+ readonly hasOpenShadowRoots: "globalThis.__stagehandSelectorRuntime.hasOpenShadowRoots";
19
+ readonly queryCssWithRoots: "globalThis.__stagehandSelectorRuntime.queryCssWithRoots";
20
+ readonly queryTextWithRoots: "globalThis.__stagehandSelectorRuntime.queryTextWithRoots";
21
+ readonly queryXPathNative: "globalThis.__stagehandSelectorRuntime.queryXPathNative";
22
+ readonly queryXPathWithRoots: "globalThis.__stagehandSelectorRuntime.queryXPathWithRoots";
23
+ };
24
+ export type SelectorRuntimeName = keyof typeof selectorRuntimeSources;
@@ -0,0 +1,28 @@
1
+ /*
2
+ * AUTO-GENERATED FILE. DO NOT EDIT.
3
+ * Run `pnpm run build-dom-scripts` to regenerate.
4
+ */
5
+ export const selectorRuntimeBootstrap = "if (!globalThis.__stagehandSelectorRuntime) { var __stagehandSelectorRuntimeFactory=(()=>{var P=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var $=(t,e)=>{for(var n in e)P(t,n,{get:e[n],enumerable:!0})},C=(t,e,n,r)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let s of N(e))!D.call(t,s)&&s!==n&&P(t,s,{get:()=>e[s],enumerable:!(r=A(e,s))||r.enumerable});return t};var k=t=>C(P({},\"__esModule\",{value:!0}),t);var j={};$(j,{countCssWithRoots:()=>B,countTextWithRoots:()=>Y,countXPathNative:()=>U,countXPathWithRoots:()=>K,hasOpenShadowRoots:()=>V,queryCssWithRoots:()=>X,queryTextWithRoots:()=>M,queryXPathNative:()=>Z,queryXPathWithRoots:()=>z});function R(t){let e=String(t||\"\").trim().replace(/^xpath=/i,\"\");if(!e)return[];let n=[],r=0;for(;r<e.length;){let s=\"child\";e.startsWith(\"//\",r)?(s=\"desc\",r+=2):e[r]===\"/\"&&(s=\"child\",r+=1);let o=r,a=0,i=null;for(;r<e.length;){let l=e[r];if(i)l===i&&(i=null);else if(l===\"'\"||l==='\"')i=l;else if(l===\"[\")a++;else if(l===\"]\")a--;else if(l===\"/\"&&a===0)break;r+=1}let u=e.slice(o,r).trim();if(!u)continue;let{tag:c,predicates:f}=W(u);n.push({axis:s,tag:c,predicates:f})}return n}function q(t){let e=[],n=0;for(;n<t.length;){if(t[n]!==\"[\"){n++;continue}n++;let r=n,s=null;for(;n<t.length;){let o=t[n];if(s)o===s&&(s=null);else if(o===\"'\"||o==='\"')s=o;else if(o===\"]\")break;n++}e.push(t.slice(r,n).trim()),n++}return e}function W(t){let e=t.indexOf(\"[\");if(e===-1)return{tag:t===\"\"?\"*\":t.toLowerCase(),predicates:[]};let n=t.slice(0,e).trim(),r=n===\"\"?\"*\":n.toLowerCase(),s=t.slice(e),o=[];for(let a of q(s)){let i=d(a);i&&o.push(i)}return{tag:r,predicates:o}}function d(t){let e=t.trim();if(!e)return null;let n=y(e,\"or\");if(n.length>1){let o=n.map(a=>d(a)).filter(Boolean);return o.length!==n.length?null:{type:\"or\",predicates:o}}let r=y(e,\"and\");if(r.length>1){let o=r.map(a=>d(a)).filter(Boolean);return o.length!==r.length?null:{type:\"and\",predicates:o}}let s=O(e,\"not\");if(s!=null){let o=d(s);return o?{type:\"not\",predicate:o}:null}return _(e)}function _(t){let e=/^(?:'([^']*)'|\"([^\"]*)\")$/,n=\"[a-zA-Z_][\\\\w.-]*\",r=`(?:'([^']*)'|\"([^\"]*)\")`;if(/^\\d+$/.test(t))return{type:\"index\",index:Math.max(1,Number(t))};let s=t.match(new RegExp(`^normalize-space\\\\(\\\\s*@(${n})\\\\s*\\\\)\\\\s*=\\\\s*${r}$`));if(s)return{type:\"attrEquals\",name:s[1],value:s[2]??s[3]??\"\",normalize:!0};let o=t.match(new RegExp(`^normalize-space\\\\(\\\\s*(?:text\\\\(\\\\)|\\\\.)\\\\s*\\\\)\\\\s*=\\\\s*${r}$`));if(o)return{type:\"textEquals\",value:o[1]??o[2]??\"\",normalize:!0};let a=t.match(new RegExp(`^@(${n})\\\\s*=\\\\s*${r}$`));if(a)return{type:\"attrEquals\",name:a[1],value:a[2]??a[3]??\"\"};let i=t.match(new RegExp(`^@(${n})$`));if(i)return{type:\"attrExists\",name:i[1]};let u=t.match(new RegExp(`^contains\\\\(\\\\s*@(${n})\\\\s*,\\\\s*${r}\\\\s*\\\\)$`));if(u)return{type:\"attrContains\",name:u[1],value:u[2]??u[3]??\"\"};let c=t.match(new RegExp(`^starts-with\\\\(\\\\s*@(${n})\\\\s*,\\\\s*${r}\\\\s*\\\\)$`));if(c)return{type:\"attrStartsWith\",name:c[1],value:c[2]??c[3]??\"\"};let f=t.match(new RegExp(`^(?:text\\\\(\\\\)|\\\\.)\\\\s*=\\\\s*${r}$`));if(f)return{type:\"textEquals\",value:f[1]??f[2]??\"\"};let l=t.match(new RegExp(`^contains\\\\(\\\\s*(?:text\\\\(\\\\)|\\\\.)\\\\s*,\\\\s*${r}\\\\s*\\\\)$`));return l?{type:\"textContains\",value:l[1]??l[2]??\"\"}:(e.test(t),null)}function y(t,e){let n=[],r=0,s=0,o=null,a=0;for(;a<t.length;){let i=t[a];if(o){i===o&&(o=null),a+=1;continue}if(i===\"'\"||i==='\"'){o=i,a+=1;continue}if(i===\"(\"){s+=1,a+=1;continue}if(i===\")\"){s=Math.max(0,s-1),a+=1;continue}if(s===0&&L(t,a,e)){n.push(t.slice(r,a).trim()),a+=e.length,r=a;continue}a+=1}return n.push(t.slice(r).trim()),n.filter(i=>i.length>0)}function L(t,e,n){if(!t.startsWith(n,e))return!1;let r=e>0?t[e-1]:\" \";if(r===\"@\")return!1;let s=e+n.length<t.length?t[e+n.length]:\" \";return S(r)&&S(s)}function S(t){return!/[a-zA-Z0-9_.-]/.test(t)}function O(t,e){let n=`${e}(`;if(!t.startsWith(n)||!t.endsWith(\")\"))return null;let r=t.slice(n.length,-1);return I(r)?r:null}function I(t){let e=0,n=null;for(let r=0;r<t.length;r+=1){let s=t[r];if(n){s===n&&(n=null);continue}if(s===\"'\"||s==='\"'){n=s;continue}if(s===\"(\"?e+=1:s===\")\"&&(e-=1),e<0)return!1}return e===0}var F=t=>t.replace(/\\s+/g,\" \").trim();function b(t){return String(t.textContent??\"\")}function m(t,e){return e?F(t):t}function x(t,e){switch(e.type){case\"and\":return e.predicates.every(n=>x(t,n));case\"or\":return e.predicates.some(n=>x(t,n));case\"not\":return!x(t,e.predicate);case\"attrExists\":return t.getAttribute(e.name)!==null;case\"attrEquals\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize)===m(e.value,e.normalize)}case\"attrContains\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize).includes(m(e.value,e.normalize))}case\"attrStartsWith\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize).startsWith(m(e.value,e.normalize))}case\"textEquals\":return m(b(t),e.normalize)===m(e.value,e.normalize);case\"textContains\":return m(b(t),e.normalize).includes(m(e.value,e.normalize));case\"index\":return!0;default:return!0}}function v(t,e){let n=t;for(let r of e){if(!n.length)return[];if(r.type===\"index\"){let s=r.index-1;n=s>=0&&s<n.length?[n[s]]:[];continue}n=n.filter(s=>x(s,r))}return n}function w(t){let e=new Map;for(let n=0;n<t.length;n+=2){let r=t[n],s=t[n+1];r instanceof Element&&s instanceof ShadowRoot&&e.set(r,s)}return e}function E(t,e){if(!t)return[];if(t instanceof Document)return t.documentElement?[t.documentElement]:[];if(t instanceof ShadowRoot||t instanceof DocumentFragment)return Array.from(t.children||[]);if(!(t instanceof Element))return[];let n=Array.from(t.children||[]);t.shadowRoot&&n.push(...Array.from(t.shadowRoot.children||[]));let r=e.get(t);return r&&n.push(...Array.from(r.children||[])),n}function H(t,e){let n=[],r=new Set,s=[...E(t,e)].reverse();for(;s.length;){let o=s.pop();if(!(o instanceof Element)||r.has(o))continue;r.add(o),n.push(o);let a=E(o,e);for(let i=a.length-1;i>=0;i-=1)s.push(a[i])}return n}function X(t,e,...n){let r=w(n),s=[],o=new Set,a=[...E(this,r)].reverse();for(;a.length&&s.length<e;){let i=a.pop();if(!(i instanceof Element)||o.has(i))continue;o.add(i);try{if(i.matches(t)&&(s.push(i),s.length>=e))break}catch{return[]}let u=E(i,r);for(let c=u.length-1;c>=0;c-=1)a.push(u[c])}return s}function B(t,...e){return X.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function M(t,e,...n){let r=w(n),s=new Set([\"SCRIPT\",\"STYLE\",\"TEMPLATE\",\"NOSCRIPT\",\"HEAD\",\"TITLE\",\"LINK\",\"META\",\"HTML\",\"BODY\"]),o=String(t||\"\").toLowerCase();if(!o)return[];let a=l=>{let g=l.tagName?l.tagName.toUpperCase():\"\";if(s.has(g))return\"\";try{let p=l.innerText;if(typeof p==\"string\"&&p.trim())return p.trim()}catch{}let h=l.textContent;return typeof h==\"string\"?h.trim():\"\"},i=[],u=new Set,c=[...E(this,r)].reverse();for(;c.length;){let l=c.pop();if(!(l instanceof Element)||u.has(l))continue;u.add(l);let g=a(l);g&&g.toLowerCase().includes(o)&&i.push(l);let h=E(l,r);for(let p=h.length-1;p>=0;p-=1)c.push(h[p])}let f=[];for(let l of i){let g=!1;for(let h of i)if(l!==h)try{if(l.contains(h)){g=!0;break}}catch{}if(!g&&(f.push(l),f.length>=e))break}return f}function Y(t,...e){return M.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function T(t){let e=String(t||\"\").trim();return e?e.replace(/^xpath=/i,\"\").trim():\"\"}function G(t,e){return e.tag===\"*\"?!0:t.localName===e.tag}function z(t,e,...n){let r=w(n),s=R(t);if(!s.length)return[];let o=[this];for(let a of s){let i=[],u=new Set;for(let c of o){let l=(a.axis===\"child\"?E(c,r):H(c,r)).filter(h=>G(h,a)),g=v(l,a.predicates);for(let h of g)if(!u.has(h)&&(u.add(h),i.push(h),i.length>=e&&a===s[s.length-1]))break}if(!i.length)return[];o=i}return o.slice(0,e)}function K(t,...e){return z.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function Z(t,e){let n=T(t);if(!n||!Number.isFinite(e)||e<=0)return[];try{let r=this.evaluate(n,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),s=[],o=Math.min(r.snapshotLength,Math.floor(e));for(let a=0;a<o;a+=1){let i=r.snapshotItem(a);i instanceof Element&&s.push(i)}return s}catch{return[]}}function U(t){let e=T(t);if(!e)return 0;try{let n=this.evaluate(e,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),r=0;for(let s=0;s<n.snapshotLength;s+=1)n.snapshotItem(s)instanceof Element&&(r+=1);return r}catch{return 0}}function V(){try{let t=this.createTreeWalker(this,NodeFilter.SHOW_ELEMENT);for(;t.nextNode();){let e=t.currentNode;if(e instanceof Element&&e.shadowRoot)return!0}}catch{return!1}return!1}return k(j);})();\n globalThis.__stagehandSelectorRuntime = __stagehandSelectorRuntimeFactory;\n}";
6
+ export const selectorRuntimeSources = {
7
+ "countCssWithRoots": "function O(t,...e){return C.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}",
8
+ "countTextWithRoots": "function I(t,...e){return k.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}",
9
+ "countXPathNative": "function B(t){let e=v(t);if(!e)return 0;try{let n=this.evaluate(e,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),r=0;for(let s=0;s<n.snapshotLength;s+=1)n.snapshotItem(s)instanceof Element&&(r+=1);return r}catch{return 0}}",
10
+ "countXPathWithRoots": "function F(t,...e){return W.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}",
11
+ "hasOpenShadowRoots": "function Y(){try{let t=this.createTreeWalker(this,NodeFilter.SHOW_ELEMENT);for(;t.nextNode();){let e=t.currentNode;if(e instanceof Element&&e.shadowRoot)return!0}}catch{return!1}return!1}",
12
+ "queryCssWithRoots": "function C(t,e,...n){let r=P(n),s=[],o=new Set,a=[...E(this,r)].reverse();for(;a.length&&s.length<e;){let i=a.pop();if(!(i instanceof Element)||o.has(i))continue;o.add(i);try{if(i.matches(t)&&(s.push(i),s.length>=e))break}catch{return[]}let u=E(i,r);for(let c=u.length-1;c>=0;c-=1)a.push(u[c])}return s}",
13
+ "queryTextWithRoots": "function k(t,e,...n){let r=P(n),s=new Set([\"SCRIPT\",\"STYLE\",\"TEMPLATE\",\"NOSCRIPT\",\"HEAD\",\"TITLE\",\"LINK\",\"META\",\"HTML\",\"BODY\"]),o=String(t||\"\").toLowerCase();if(!o)return[];let a=l=>{let g=l.tagName?l.tagName.toUpperCase():\"\";if(s.has(g))return\"\";try{let p=l.innerText;if(typeof p==\"string\"&&p.trim())return p.trim()}catch{}let h=l.textContent;return typeof h==\"string\"?h.trim():\"\"},i=[],u=new Set,c=[...E(this,r)].reverse();for(;c.length;){let l=c.pop();if(!(l instanceof Element)||u.has(l))continue;u.add(l);let g=a(l);g&&g.toLowerCase().includes(o)&&i.push(l);let h=E(l,r);for(let p=h.length-1;p>=0;p-=1)c.push(h[p])}let f=[];for(let l of i){let g=!1;for(let h of i)if(l!==h)try{if(l.contains(h)){g=!0;break}}catch{}if(!g&&(f.push(l),f.length>=e))break}return f}",
14
+ "queryXPathNative": "function H(t,e){let n=v(t);if(!n||!Number.isFinite(e)||e<=0)return[];try{let r=this.evaluate(n,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),s=[],o=Math.min(r.snapshotLength,Math.floor(e));for(let a=0;a<o;a+=1){let i=r.snapshotItem(a);i instanceof Element&&s.push(i)}return s}catch{return[]}}",
15
+ "queryXPathWithRoots": "function W(t,e,...n){let r=P(n),s=b(t);if(!s.length)return[];let o=[this];for(let a of s){let i=[],u=new Set;for(let c of o){let l=(a.axis===\"child\"?E(c,r):$(c,r)).filter(h=>q(h,a)),g=R(l,a.predicates);for(let h of g)if(!u.has(h)&&(u.add(h),i.push(h),i.length>=e&&a===s[s.length-1]))break}if(!i.length)return[];o=i}return o.slice(0,e)}"
16
+ };
17
+ export const selectorRuntimeGlobalRefs = {
18
+ "countCssWithRoots": "globalThis.__stagehandSelectorRuntime.countCssWithRoots",
19
+ "countTextWithRoots": "globalThis.__stagehandSelectorRuntime.countTextWithRoots",
20
+ "countXPathNative": "globalThis.__stagehandSelectorRuntime.countXPathNative",
21
+ "countXPathWithRoots": "globalThis.__stagehandSelectorRuntime.countXPathWithRoots",
22
+ "hasOpenShadowRoots": "globalThis.__stagehandSelectorRuntime.hasOpenShadowRoots",
23
+ "queryCssWithRoots": "globalThis.__stagehandSelectorRuntime.queryCssWithRoots",
24
+ "queryTextWithRoots": "globalThis.__stagehandSelectorRuntime.queryTextWithRoots",
25
+ "queryXPathNative": "globalThis.__stagehandSelectorRuntime.queryXPathNative",
26
+ "queryXPathWithRoots": "globalThis.__stagehandSelectorRuntime.queryXPathWithRoots"
27
+ };
28
+ //# sourceMappingURL=selectorRuntime.generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectorRuntime.generated.js","sourceRoot":"","sources":["../../../../../../lib/v3/dom/build/selectorRuntime.generated.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,0oRAA0oR,CAAC;AACnrR,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,mBAAmB,EAAE,+EAA+E;IACpG,oBAAoB,EAAE,+EAA+E;IACrG,kBAAkB,EAAE,wOAAwO;IAC5P,qBAAqB,EAAE,+EAA+E;IACtG,oBAAoB,EAAE,6LAA6L;IACnN,mBAAmB,EAAE,iTAAiT;IACtU,oBAAoB,EAAE,8xBAA8xB;IACpzB,kBAAkB,EAAE,+SAA+S;IACnU,qBAAqB,EAAE,mVAAmV;CAClW,CAAC;AACX,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,mBAAmB,EAAE,yDAAyD;IAC9E,oBAAoB,EAAE,0DAA0D;IAChF,kBAAkB,EAAE,wDAAwD;IAC5E,qBAAqB,EAAE,2DAA2D;IAClF,oBAAoB,EAAE,0DAA0D;IAChF,mBAAmB,EAAE,yDAAyD;IAC9E,oBAAoB,EAAE,0DAA0D;IAChF,kBAAkB,EAAE,wDAAwD;IAC5E,qBAAqB,EAAE,2DAA2D;CAC1E,CAAC","sourcesContent":["/*\n * AUTO-GENERATED FILE. DO NOT EDIT.\n * Run `pnpm run build-dom-scripts` to regenerate.\n */\nexport const selectorRuntimeBootstrap = \"if (!globalThis.__stagehandSelectorRuntime) { var __stagehandSelectorRuntimeFactory=(()=>{var P=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var $=(t,e)=>{for(var n in e)P(t,n,{get:e[n],enumerable:!0})},C=(t,e,n,r)=>{if(e&&typeof e==\\\"object\\\"||typeof e==\\\"function\\\")for(let s of N(e))!D.call(t,s)&&s!==n&&P(t,s,{get:()=>e[s],enumerable:!(r=A(e,s))||r.enumerable});return t};var k=t=>C(P({},\\\"__esModule\\\",{value:!0}),t);var j={};$(j,{countCssWithRoots:()=>B,countTextWithRoots:()=>Y,countXPathNative:()=>U,countXPathWithRoots:()=>K,hasOpenShadowRoots:()=>V,queryCssWithRoots:()=>X,queryTextWithRoots:()=>M,queryXPathNative:()=>Z,queryXPathWithRoots:()=>z});function R(t){let e=String(t||\\\"\\\").trim().replace(/^xpath=/i,\\\"\\\");if(!e)return[];let n=[],r=0;for(;r<e.length;){let s=\\\"child\\\";e.startsWith(\\\"//\\\",r)?(s=\\\"desc\\\",r+=2):e[r]===\\\"/\\\"&&(s=\\\"child\\\",r+=1);let o=r,a=0,i=null;for(;r<e.length;){let l=e[r];if(i)l===i&&(i=null);else if(l===\\\"'\\\"||l==='\\\"')i=l;else if(l===\\\"[\\\")a++;else if(l===\\\"]\\\")a--;else if(l===\\\"/\\\"&&a===0)break;r+=1}let u=e.slice(o,r).trim();if(!u)continue;let{tag:c,predicates:f}=W(u);n.push({axis:s,tag:c,predicates:f})}return n}function q(t){let e=[],n=0;for(;n<t.length;){if(t[n]!==\\\"[\\\"){n++;continue}n++;let r=n,s=null;for(;n<t.length;){let o=t[n];if(s)o===s&&(s=null);else if(o===\\\"'\\\"||o==='\\\"')s=o;else if(o===\\\"]\\\")break;n++}e.push(t.slice(r,n).trim()),n++}return e}function W(t){let e=t.indexOf(\\\"[\\\");if(e===-1)return{tag:t===\\\"\\\"?\\\"*\\\":t.toLowerCase(),predicates:[]};let n=t.slice(0,e).trim(),r=n===\\\"\\\"?\\\"*\\\":n.toLowerCase(),s=t.slice(e),o=[];for(let a of q(s)){let i=d(a);i&&o.push(i)}return{tag:r,predicates:o}}function d(t){let e=t.trim();if(!e)return null;let n=y(e,\\\"or\\\");if(n.length>1){let o=n.map(a=>d(a)).filter(Boolean);return o.length!==n.length?null:{type:\\\"or\\\",predicates:o}}let r=y(e,\\\"and\\\");if(r.length>1){let o=r.map(a=>d(a)).filter(Boolean);return o.length!==r.length?null:{type:\\\"and\\\",predicates:o}}let s=O(e,\\\"not\\\");if(s!=null){let o=d(s);return o?{type:\\\"not\\\",predicate:o}:null}return _(e)}function _(t){let e=/^(?:'([^']*)'|\\\"([^\\\"]*)\\\")$/,n=\\\"[a-zA-Z_][\\\\\\\\w.-]*\\\",r=`(?:'([^']*)'|\\\"([^\\\"]*)\\\")`;if(/^\\\\d+$/.test(t))return{type:\\\"index\\\",index:Math.max(1,Number(t))};let s=t.match(new RegExp(`^normalize-space\\\\\\\\(\\\\\\\\s*@(${n})\\\\\\\\s*\\\\\\\\)\\\\\\\\s*=\\\\\\\\s*${r}$`));if(s)return{type:\\\"attrEquals\\\",name:s[1],value:s[2]??s[3]??\\\"\\\",normalize:!0};let o=t.match(new RegExp(`^normalize-space\\\\\\\\(\\\\\\\\s*(?:text\\\\\\\\(\\\\\\\\)|\\\\\\\\.)\\\\\\\\s*\\\\\\\\)\\\\\\\\s*=\\\\\\\\s*${r}$`));if(o)return{type:\\\"textEquals\\\",value:o[1]??o[2]??\\\"\\\",normalize:!0};let a=t.match(new RegExp(`^@(${n})\\\\\\\\s*=\\\\\\\\s*${r}$`));if(a)return{type:\\\"attrEquals\\\",name:a[1],value:a[2]??a[3]??\\\"\\\"};let i=t.match(new RegExp(`^@(${n})$`));if(i)return{type:\\\"attrExists\\\",name:i[1]};let u=t.match(new RegExp(`^contains\\\\\\\\(\\\\\\\\s*@(${n})\\\\\\\\s*,\\\\\\\\s*${r}\\\\\\\\s*\\\\\\\\)$`));if(u)return{type:\\\"attrContains\\\",name:u[1],value:u[2]??u[3]??\\\"\\\"};let c=t.match(new RegExp(`^starts-with\\\\\\\\(\\\\\\\\s*@(${n})\\\\\\\\s*,\\\\\\\\s*${r}\\\\\\\\s*\\\\\\\\)$`));if(c)return{type:\\\"attrStartsWith\\\",name:c[1],value:c[2]??c[3]??\\\"\\\"};let f=t.match(new RegExp(`^(?:text\\\\\\\\(\\\\\\\\)|\\\\\\\\.)\\\\\\\\s*=\\\\\\\\s*${r}$`));if(f)return{type:\\\"textEquals\\\",value:f[1]??f[2]??\\\"\\\"};let l=t.match(new RegExp(`^contains\\\\\\\\(\\\\\\\\s*(?:text\\\\\\\\(\\\\\\\\)|\\\\\\\\.)\\\\\\\\s*,\\\\\\\\s*${r}\\\\\\\\s*\\\\\\\\)$`));return l?{type:\\\"textContains\\\",value:l[1]??l[2]??\\\"\\\"}:(e.test(t),null)}function y(t,e){let n=[],r=0,s=0,o=null,a=0;for(;a<t.length;){let i=t[a];if(o){i===o&&(o=null),a+=1;continue}if(i===\\\"'\\\"||i==='\\\"'){o=i,a+=1;continue}if(i===\\\"(\\\"){s+=1,a+=1;continue}if(i===\\\")\\\"){s=Math.max(0,s-1),a+=1;continue}if(s===0&&L(t,a,e)){n.push(t.slice(r,a).trim()),a+=e.length,r=a;continue}a+=1}return n.push(t.slice(r).trim()),n.filter(i=>i.length>0)}function L(t,e,n){if(!t.startsWith(n,e))return!1;let r=e>0?t[e-1]:\\\" \\\";if(r===\\\"@\\\")return!1;let s=e+n.length<t.length?t[e+n.length]:\\\" \\\";return S(r)&&S(s)}function S(t){return!/[a-zA-Z0-9_.-]/.test(t)}function O(t,e){let n=`${e}(`;if(!t.startsWith(n)||!t.endsWith(\\\")\\\"))return null;let r=t.slice(n.length,-1);return I(r)?r:null}function I(t){let e=0,n=null;for(let r=0;r<t.length;r+=1){let s=t[r];if(n){s===n&&(n=null);continue}if(s===\\\"'\\\"||s==='\\\"'){n=s;continue}if(s===\\\"(\\\"?e+=1:s===\\\")\\\"&&(e-=1),e<0)return!1}return e===0}var F=t=>t.replace(/\\\\s+/g,\\\" \\\").trim();function b(t){return String(t.textContent??\\\"\\\")}function m(t,e){return e?F(t):t}function x(t,e){switch(e.type){case\\\"and\\\":return e.predicates.every(n=>x(t,n));case\\\"or\\\":return e.predicates.some(n=>x(t,n));case\\\"not\\\":return!x(t,e.predicate);case\\\"attrExists\\\":return t.getAttribute(e.name)!==null;case\\\"attrEquals\\\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize)===m(e.value,e.normalize)}case\\\"attrContains\\\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize).includes(m(e.value,e.normalize))}case\\\"attrStartsWith\\\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize).startsWith(m(e.value,e.normalize))}case\\\"textEquals\\\":return m(b(t),e.normalize)===m(e.value,e.normalize);case\\\"textContains\\\":return m(b(t),e.normalize).includes(m(e.value,e.normalize));case\\\"index\\\":return!0;default:return!0}}function v(t,e){let n=t;for(let r of e){if(!n.length)return[];if(r.type===\\\"index\\\"){let s=r.index-1;n=s>=0&&s<n.length?[n[s]]:[];continue}n=n.filter(s=>x(s,r))}return n}function w(t){let e=new Map;for(let n=0;n<t.length;n+=2){let r=t[n],s=t[n+1];r instanceof Element&&s instanceof ShadowRoot&&e.set(r,s)}return e}function E(t,e){if(!t)return[];if(t instanceof Document)return t.documentElement?[t.documentElement]:[];if(t instanceof ShadowRoot||t instanceof DocumentFragment)return Array.from(t.children||[]);if(!(t instanceof Element))return[];let n=Array.from(t.children||[]);t.shadowRoot&&n.push(...Array.from(t.shadowRoot.children||[]));let r=e.get(t);return r&&n.push(...Array.from(r.children||[])),n}function H(t,e){let n=[],r=new Set,s=[...E(t,e)].reverse();for(;s.length;){let o=s.pop();if(!(o instanceof Element)||r.has(o))continue;r.add(o),n.push(o);let a=E(o,e);for(let i=a.length-1;i>=0;i-=1)s.push(a[i])}return n}function X(t,e,...n){let r=w(n),s=[],o=new Set,a=[...E(this,r)].reverse();for(;a.length&&s.length<e;){let i=a.pop();if(!(i instanceof Element)||o.has(i))continue;o.add(i);try{if(i.matches(t)&&(s.push(i),s.length>=e))break}catch{return[]}let u=E(i,r);for(let c=u.length-1;c>=0;c-=1)a.push(u[c])}return s}function B(t,...e){return X.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function M(t,e,...n){let r=w(n),s=new Set([\\\"SCRIPT\\\",\\\"STYLE\\\",\\\"TEMPLATE\\\",\\\"NOSCRIPT\\\",\\\"HEAD\\\",\\\"TITLE\\\",\\\"LINK\\\",\\\"META\\\",\\\"HTML\\\",\\\"BODY\\\"]),o=String(t||\\\"\\\").toLowerCase();if(!o)return[];let a=l=>{let g=l.tagName?l.tagName.toUpperCase():\\\"\\\";if(s.has(g))return\\\"\\\";try{let p=l.innerText;if(typeof p==\\\"string\\\"&&p.trim())return p.trim()}catch{}let h=l.textContent;return typeof h==\\\"string\\\"?h.trim():\\\"\\\"},i=[],u=new Set,c=[...E(this,r)].reverse();for(;c.length;){let l=c.pop();if(!(l instanceof Element)||u.has(l))continue;u.add(l);let g=a(l);g&&g.toLowerCase().includes(o)&&i.push(l);let h=E(l,r);for(let p=h.length-1;p>=0;p-=1)c.push(h[p])}let f=[];for(let l of i){let g=!1;for(let h of i)if(l!==h)try{if(l.contains(h)){g=!0;break}}catch{}if(!g&&(f.push(l),f.length>=e))break}return f}function Y(t,...e){return M.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function T(t){let e=String(t||\\\"\\\").trim();return e?e.replace(/^xpath=/i,\\\"\\\").trim():\\\"\\\"}function G(t,e){return e.tag===\\\"*\\\"?!0:t.localName===e.tag}function z(t,e,...n){let r=w(n),s=R(t);if(!s.length)return[];let o=[this];for(let a of s){let i=[],u=new Set;for(let c of o){let l=(a.axis===\\\"child\\\"?E(c,r):H(c,r)).filter(h=>G(h,a)),g=v(l,a.predicates);for(let h of g)if(!u.has(h)&&(u.add(h),i.push(h),i.length>=e&&a===s[s.length-1]))break}if(!i.length)return[];o=i}return o.slice(0,e)}function K(t,...e){return z.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function Z(t,e){let n=T(t);if(!n||!Number.isFinite(e)||e<=0)return[];try{let r=this.evaluate(n,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),s=[],o=Math.min(r.snapshotLength,Math.floor(e));for(let a=0;a<o;a+=1){let i=r.snapshotItem(a);i instanceof Element&&s.push(i)}return s}catch{return[]}}function U(t){let e=T(t);if(!e)return 0;try{let n=this.evaluate(e,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),r=0;for(let s=0;s<n.snapshotLength;s+=1)n.snapshotItem(s)instanceof Element&&(r+=1);return r}catch{return 0}}function V(){try{let t=this.createTreeWalker(this,NodeFilter.SHOW_ELEMENT);for(;t.nextNode();){let e=t.currentNode;if(e instanceof Element&&e.shadowRoot)return!0}}catch{return!1}return!1}return k(j);})();\\n globalThis.__stagehandSelectorRuntime = __stagehandSelectorRuntimeFactory;\\n}\";\nexport const selectorRuntimeSources = {\n \"countCssWithRoots\": \"function O(t,...e){return C.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}\",\n \"countTextWithRoots\": \"function I(t,...e){return k.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}\",\n \"countXPathNative\": \"function B(t){let e=v(t);if(!e)return 0;try{let n=this.evaluate(e,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),r=0;for(let s=0;s<n.snapshotLength;s+=1)n.snapshotItem(s)instanceof Element&&(r+=1);return r}catch{return 0}}\",\n \"countXPathWithRoots\": \"function F(t,...e){return W.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}\",\n \"hasOpenShadowRoots\": \"function Y(){try{let t=this.createTreeWalker(this,NodeFilter.SHOW_ELEMENT);for(;t.nextNode();){let e=t.currentNode;if(e instanceof Element&&e.shadowRoot)return!0}}catch{return!1}return!1}\",\n \"queryCssWithRoots\": \"function C(t,e,...n){let r=P(n),s=[],o=new Set,a=[...E(this,r)].reverse();for(;a.length&&s.length<e;){let i=a.pop();if(!(i instanceof Element)||o.has(i))continue;o.add(i);try{if(i.matches(t)&&(s.push(i),s.length>=e))break}catch{return[]}let u=E(i,r);for(let c=u.length-1;c>=0;c-=1)a.push(u[c])}return s}\",\n \"queryTextWithRoots\": \"function k(t,e,...n){let r=P(n),s=new Set([\\\"SCRIPT\\\",\\\"STYLE\\\",\\\"TEMPLATE\\\",\\\"NOSCRIPT\\\",\\\"HEAD\\\",\\\"TITLE\\\",\\\"LINK\\\",\\\"META\\\",\\\"HTML\\\",\\\"BODY\\\"]),o=String(t||\\\"\\\").toLowerCase();if(!o)return[];let a=l=>{let g=l.tagName?l.tagName.toUpperCase():\\\"\\\";if(s.has(g))return\\\"\\\";try{let p=l.innerText;if(typeof p==\\\"string\\\"&&p.trim())return p.trim()}catch{}let h=l.textContent;return typeof h==\\\"string\\\"?h.trim():\\\"\\\"},i=[],u=new Set,c=[...E(this,r)].reverse();for(;c.length;){let l=c.pop();if(!(l instanceof Element)||u.has(l))continue;u.add(l);let g=a(l);g&&g.toLowerCase().includes(o)&&i.push(l);let h=E(l,r);for(let p=h.length-1;p>=0;p-=1)c.push(h[p])}let f=[];for(let l of i){let g=!1;for(let h of i)if(l!==h)try{if(l.contains(h)){g=!0;break}}catch{}if(!g&&(f.push(l),f.length>=e))break}return f}\",\n \"queryXPathNative\": \"function H(t,e){let n=v(t);if(!n||!Number.isFinite(e)||e<=0)return[];try{let r=this.evaluate(n,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),s=[],o=Math.min(r.snapshotLength,Math.floor(e));for(let a=0;a<o;a+=1){let i=r.snapshotItem(a);i instanceof Element&&s.push(i)}return s}catch{return[]}}\",\n \"queryXPathWithRoots\": \"function W(t,e,...n){let r=P(n),s=b(t);if(!s.length)return[];let o=[this];for(let a of s){let i=[],u=new Set;for(let c of o){let l=(a.axis===\\\"child\\\"?E(c,r):$(c,r)).filter(h=>q(h,a)),g=R(l,a.predicates);for(let h of g)if(!u.has(h)&&(u.add(h),i.push(h),i.length>=e&&a===s[s.length-1]))break}if(!i.length)return[];o=i}return o.slice(0,e)}\"\n} as const;\nexport const selectorRuntimeGlobalRefs = {\n \"countCssWithRoots\": \"globalThis.__stagehandSelectorRuntime.countCssWithRoots\",\n \"countTextWithRoots\": \"globalThis.__stagehandSelectorRuntime.countTextWithRoots\",\n \"countXPathNative\": \"globalThis.__stagehandSelectorRuntime.countXPathNative\",\n \"countXPathWithRoots\": \"globalThis.__stagehandSelectorRuntime.countXPathWithRoots\",\n \"hasOpenShadowRoots\": \"globalThis.__stagehandSelectorRuntime.hasOpenShadowRoots\",\n \"queryCssWithRoots\": \"globalThis.__stagehandSelectorRuntime.queryCssWithRoots\",\n \"queryTextWithRoots\": \"globalThis.__stagehandSelectorRuntime.queryTextWithRoots\",\n \"queryXPathNative\": \"globalThis.__stagehandSelectorRuntime.queryXPathNative\",\n \"queryXPathWithRoots\": \"globalThis.__stagehandSelectorRuntime.queryXPathWithRoots\"\n} as const;\nexport type SelectorRuntimeName = keyof typeof selectorRuntimeSources;\n"]}
@@ -18,6 +18,7 @@ export declare class V3AgentHandler {
18
18
  private createStepHandler;
19
19
  execute(instructionOrOptions: string | AgentExecuteOptions): Promise<AgentResult>;
20
20
  stream(instructionOrOptions: string | AgentStreamExecuteOptions): Promise<AgentStreamResult>;
21
+ private emitFinalEvidence;
21
22
  private consolidateMetricsAndResult;
22
23
  private createTools;
23
24
  private handleStop;
@@ -8,6 +8,9 @@ import { V3FunctionName } from "../types/public/methods.js";
8
8
  import { mapToolResultToActions } from "../agent/utils/actionMapping.js";
9
9
  import { MissingLLMConfigurationError, MissingEnvironmentVariableError, StreamingCallbacksInNonStreamingModeError, AgentAbortError, } from "../types/public/sdkErrors.js";
10
10
  import { handleDoneToolCall } from "../agent/utils/handleDoneToolCall.js";
11
+ import { captureProbeEvidence, emitPostStepProbeEvidence, } from "../agent/utils/postStepProbeEvidence.js";
12
+ import { wrapEvidenceCallback } from "../agent/utils/wrapEvidenceCallback.js";
13
+ import { inferToolOutput } from "../agent/utils/toolOutputEvidence.js";
11
14
  import { CaptchaSolver, CAPTCHA_SOLVED_MSG, CAPTCHA_ERRORED_MSG, } from "../agent/utils/captchaSolver.js";
12
15
  function getErrorMessage(error) {
13
16
  return error instanceof Error ? error.message : String(error);
@@ -160,13 +163,14 @@ export class V3AgentHandler {
160
163
  return options;
161
164
  };
162
165
  }
163
- createStepHandler(state, userCallback) {
166
+ createStepHandler(state, { userCallback, evidenceCallback, onFinalAnswer }) {
164
167
  return async (event) => {
165
168
  this.logger({
166
169
  category: "agent",
167
170
  message: `Step finished: ${event.finishReason}`,
168
171
  level: 2,
169
172
  });
173
+ let lastFinalAnswer;
170
174
  if (event.toolCalls && event.toolCalls.length > 0) {
171
175
  for (let i = 0; i < event.toolCalls.length; i++) {
172
176
  const toolCall = event.toolCalls[i];
@@ -189,6 +193,12 @@ export class V3AgentHandler {
189
193
  ? `${allReasoning} ${doneReasoning}`.trim()
190
194
  : allReasoning || "Task completed successfully";
191
195
  }
196
+ lastFinalAnswer = {
197
+ message: state.finalMessage,
198
+ output: typeof args?.output === "object" && args?.output !== null
199
+ ? args.output
200
+ : undefined,
201
+ };
192
202
  }
193
203
  const mappedActions = mapToolResultToActions({
194
204
  toolCallName: toolCall.toolName,
@@ -201,8 +211,31 @@ export class V3AgentHandler {
201
211
  action.timestamp = Date.now();
202
212
  state.actions.push(action);
203
213
  }
214
+ await evidenceCallback?.({
215
+ type: "step_finished",
216
+ actionName: toolCall.toolName,
217
+ actionArgs: typeof args === "object" && args !== null
218
+ ? args
219
+ : {},
220
+ reasoning: event.text ?? "",
221
+ toolOutput: inferToolOutput(toolResult),
222
+ });
204
223
  }
205
224
  state.currentPageUrl = (await this.v3.context.awaitActivePage()).url();
225
+ // Harness probe — one screenshot / a11y snapshot per AI SDK step.
226
+ // The recorder applies the probe to every step_finished received
227
+ // since the previous probe, so a multi-tool turn shares the same
228
+ // post-turn observation.
229
+ await emitPostStepProbeEvidence({
230
+ v3: this.v3,
231
+ url: state.currentPageUrl,
232
+ evidenceCallback,
233
+ logger: this.logger,
234
+ warningMessage: "Warning: harness probe failed",
235
+ });
236
+ }
237
+ if (lastFinalAnswer) {
238
+ onFinalAnswer?.(lastFinalAnswer);
206
239
  }
207
240
  if (userCallback) {
208
241
  await userCallback(event);
@@ -222,6 +255,7 @@ export class V3AgentHandler {
222
255
  completed: false,
223
256
  currentPageUrl: "",
224
257
  };
258
+ let finalAnswerFromDoneTool;
225
259
  let messages = [];
226
260
  let captchaSolver;
227
261
  try {
@@ -251,6 +285,7 @@ export class V3AgentHandler {
251
285
  throw new StreamingCallbacksInNonStreamingModeError(invalidCallbacks);
252
286
  }
253
287
  }
288
+ const evidenceCallback = wrapEvidenceCallback(callbacks?.onEvidence, this.logger);
254
289
  const result = await this.llmClient.generateText({
255
290
  model: wrappedModel,
256
291
  messages: prependSystemMessage(systemPrompt, messages),
@@ -258,7 +293,13 @@ export class V3AgentHandler {
258
293
  stopWhen: (result) => this.handleStop(result, maxSteps),
259
294
  toolChoice: "auto",
260
295
  prepareStep: this.createPrepareStep(callbacks?.prepareStep, captchaSolver),
261
- onStepFinish: this.createStepHandler(state, callbacks?.onStepFinish),
296
+ onStepFinish: this.createStepHandler(state, {
297
+ userCallback: callbacks?.onStepFinish,
298
+ evidenceCallback,
299
+ onFinalAnswer: (answer) => {
300
+ finalAnswerFromDoneTool = answer;
301
+ },
302
+ }),
262
303
  abortSignal: preparedOptions.signal,
263
304
  providerOptions: {
264
305
  google: { mediaResolution: "MEDIA_RESOLUTION_HIGH" },
@@ -267,7 +308,12 @@ export class V3AgentHandler {
267
308
  });
268
309
  const allMessages = [...messages, ...(result.response?.messages || [])];
269
310
  const doneResult = await this.ensureDone(state, wrappedModel, allMessages, preparedOptions.instruction, preparedOptions.output, this.logger);
270
- return this.consolidateMetricsAndResult(startTime, state, doneResult.messages, result, maxSteps, doneResult.output);
311
+ const output = doneResult.output ?? finalAnswerFromDoneTool?.output;
312
+ await this.emitFinalEvidence(state, {
313
+ message: state.finalMessage,
314
+ output,
315
+ }, evidenceCallback);
316
+ return this.consolidateMetricsAndResult(startTime, state, doneResult.messages, result, maxSteps, output);
271
317
  }
272
318
  catch (error) {
273
319
  // Re-throw validation errors that should propagate to the caller
@@ -303,6 +349,7 @@ export class V3AgentHandler {
303
349
  const streamOptions = typeof instructionOrOptions === "object" ? instructionOrOptions : null;
304
350
  // Highlight cursor defaults to true for hybrid mode, can be overridden
305
351
  const shouldHighlightCursor = streamOptions?.highlightCursor ?? this.mode === "hybrid";
352
+ let finalAnswerFromDoneTool;
306
353
  const { options, maxSteps, systemPrompt, allTools, messages, wrappedModel, initialPageUrl, } = await this.prepareAgent(instructionOrOptions);
307
354
  // Enable cursor overlay for hybrid mode (coordinate-based interactions)
308
355
  if (shouldHighlightCursor && this.mode === "hybrid") {
@@ -340,6 +387,7 @@ export class V3AgentHandler {
340
387
  });
341
388
  rejectResult(error);
342
389
  };
390
+ const evidenceCallback = wrapEvidenceCallback(callbacks?.onEvidence, this.logger);
343
391
  let streamResult;
344
392
  try {
345
393
  streamResult = this.llmClient.streamText({
@@ -349,7 +397,13 @@ export class V3AgentHandler {
349
397
  stopWhen: (result) => this.handleStop(result, maxSteps),
350
398
  toolChoice: "auto",
351
399
  prepareStep: this.createPrepareStep(callbacks?.prepareStep, captchaSolver),
352
- onStepFinish: this.createStepHandler(state, callbacks?.onStepFinish),
400
+ onStepFinish: this.createStepHandler(state, {
401
+ userCallback: callbacks?.onStepFinish,
402
+ evidenceCallback,
403
+ onFinalAnswer: (answer) => {
404
+ finalAnswerFromDoneTool = answer;
405
+ },
406
+ }),
353
407
  onError: (event) => {
354
408
  captchaSolver?.dispose();
355
409
  if (callbacks?.onError) {
@@ -367,10 +421,17 @@ export class V3AgentHandler {
367
421
  ...messages,
368
422
  ...(event.response?.messages || []),
369
423
  ];
370
- this.ensureDone(state, wrappedModel, allMessages, options.instruction, options.output, this.logger).then((doneResult) => {
371
- const result = this.consolidateMetricsAndResult(startTime, state, doneResult.messages, event, maxSteps, doneResult.output);
424
+ this.ensureDone(state, wrappedModel, allMessages, options.instruction, options.output, this.logger)
425
+ .then(async (doneResult) => {
426
+ const output = doneResult.output ?? finalAnswerFromDoneTool?.output;
427
+ await this.emitFinalEvidence(state, {
428
+ message: state.finalMessage,
429
+ output,
430
+ }, evidenceCallback);
431
+ const result = this.consolidateMetricsAndResult(startTime, state, doneResult.messages, event, maxSteps, output);
372
432
  resolveResult(result);
373
- });
433
+ })
434
+ .catch(handleError);
374
435
  },
375
436
  onAbort: (event) => {
376
437
  captchaSolver?.dispose();
@@ -398,6 +459,21 @@ export class V3AgentHandler {
398
459
  agentStreamResult.result = resultPromise;
399
460
  return agentStreamResult;
400
461
  }
462
+ async emitFinalEvidence(state, finalAnswer, evidenceCallback) {
463
+ if (!evidenceCallback)
464
+ return;
465
+ const observation = await captureProbeEvidence({
466
+ v3: this.v3,
467
+ url: state.currentPageUrl,
468
+ logger: this.logger,
469
+ warningMessage: "Warning: final harness probe failed",
470
+ });
471
+ await evidenceCallback({
472
+ type: "final_answer",
473
+ ...finalAnswer,
474
+ observation,
475
+ });
476
+ }
401
477
  consolidateMetricsAndResult(startTime, state, inputMessages, result, maxSteps, output) {
402
478
  if (!state.finalMessage) {
403
479
  const allReasoning = state.collectedReasoning.join(" ").trim();