@browserbasehq/orca 3.1.0-patch.4 → 3.2.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.
- package/dist/cjs/lib/inference.js +1 -4
- package/dist/cjs/lib/inference.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AgentProvider.js +0 -1
- package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/act.d.ts +1 -1
- package/dist/cjs/lib/v3/agent/tools/act.js +20 -4
- package/dist/cjs/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/ariaTree.d.ts +8 -1
- package/dist/cjs/lib/v3/agent/tools/ariaTree.js +60 -22
- package/dist/cjs/lib/v3/agent/tools/ariaTree.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/click.js +23 -31
- package/dist/cjs/lib/v3/agent/tools/click.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js +22 -30
- package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/extract.d.ts +2 -2
- package/dist/cjs/lib/v3/agent/tools/extract.js +16 -3
- package/dist/cjs/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.js +30 -30
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +7 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.js +60 -37
- package/dist/cjs/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/index.d.ts +5 -0
- package/dist/cjs/lib/v3/agent/tools/index.js +5 -5
- package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/screenshot.d.ts +8 -0
- package/dist/cjs/lib/v3/agent/tools/screenshot.js +32 -15
- package/dist/cjs/lib/v3/agent/tools/screenshot.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/scroll.js +12 -0
- package/dist/cjs/lib/v3/agent/tools/scroll.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/type.js +23 -31
- package/dist/cjs/lib/v3/agent/tools/type.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/wait.js +6 -0
- package/dist/cjs/lib/v3/agent/tools/wait.js.map +1 -1
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js +4 -0
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
- package/dist/cjs/lib/v3/api.d.ts +2 -2
- package/dist/cjs/lib/v3/api.js +1 -1
- package/dist/cjs/lib/v3/api.js.map +1 -1
- package/dist/cjs/lib/v3/cache/ActCache.d.ts +0 -1
- package/dist/cjs/lib/v3/cache/ActCache.js +2 -18
- package/dist/cjs/lib/v3/cache/ActCache.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/actHandler.js +1 -2
- package/dist/cjs/lib/v3/handlers/actHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/extractHandler.js +2 -2
- package/dist/cjs/lib/v3/handlers/extractHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/observeHandler.js +1 -2
- package/dist/cjs/lib/v3/handlers/observeHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +11 -16
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/index.d.ts +2 -1
- package/dist/cjs/lib/v3/launch/browserbase.d.ts +1 -1
- package/dist/cjs/lib/v3/launch/browserbase.js +4 -9
- package/dist/cjs/lib/v3/launch/browserbase.js.map +1 -1
- package/dist/cjs/lib/v3/llm/LLMProvider.js +0 -5
- package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/cjs/lib/v3/runtimePaths.js +2 -1
- package/dist/cjs/lib/v3/runtimePaths.js.map +1 -1
- package/dist/cjs/lib/v3/shutdown/supervisor.js +2 -2
- package/dist/cjs/lib/v3/shutdown/supervisor.js.map +1 -1
- package/dist/cjs/lib/v3/timeoutConfig.d.ts +1 -1
- package/dist/cjs/lib/v3/timeoutConfig.js +5 -0
- package/dist/cjs/lib/v3/timeoutConfig.js.map +1 -1
- package/dist/cjs/lib/v3/types/private/shutdown.d.ts +1 -1
- package/dist/cjs/lib/v3/types/private/shutdown.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/agent.d.ts +12 -1
- package/dist/cjs/lib/v3/types/public/agent.js +0 -1
- package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/api.d.ts +3 -0
- package/dist/cjs/lib/v3/types/public/api.js +1 -0
- package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/model.d.ts +4 -2
- package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/options.d.ts +1 -0
- package/dist/cjs/lib/v3/understudy/cdp.d.ts +5 -1
- package/dist/cjs/lib/v3/understudy/cdp.js +54 -7
- package/dist/cjs/lib/v3/understudy/cdp.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/context.d.ts +1 -0
- package/dist/cjs/lib/v3/understudy/context.js +142 -60
- package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/frame.js +23 -6
- package/dist/cjs/lib/v3/understudy/frame.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/page.d.ts +13 -0
- package/dist/cjs/lib/v3/understudy/page.js +56 -3
- package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/screenshotUtils.d.ts +0 -1
- package/dist/cjs/lib/v3/understudy/screenshotUtils.js +0 -18
- package/dist/cjs/lib/v3/understudy/screenshotUtils.js.map +1 -1
- package/dist/cjs/lib/v3/v3.js +38 -24
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/cjs/tests/integration/cdp-session-detached.spec.js +1 -1
- package/dist/cjs/tests/integration/cdp-session-detached.spec.js.map +1 -1
- package/dist/cjs/tests/integration/context-addInitScript.spec.js +104 -11
- package/dist/cjs/tests/integration/context-addInitScript.spec.js.map +1 -1
- package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.d.ts +1 -0
- package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.js +219 -0
- package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.js.map +1 -0
- package/dist/cjs/tests/integration/page-extra-http-headers.spec.d.ts +1 -0
- package/dist/cjs/tests/integration/page-extra-http-headers.spec.js +85 -0
- package/dist/cjs/tests/integration/page-extra-http-headers.spec.js.map +1 -0
- package/dist/cjs/tests/integration/page-screenshot.spec.js +1 -1
- package/dist/cjs/tests/integration/page-screenshot.spec.js.map +1 -1
- package/dist/cjs/tests/integration/timeouts.spec.js +168 -0
- package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/cjs/tests/unit/model-deprecation.test.js +5 -8
- package/dist/cjs/tests/unit/model-deprecation.test.js.map +1 -1
- package/dist/cjs/tests/unit/page-extra-http-headers.test.d.ts +1 -0
- package/dist/cjs/tests/unit/page-extra-http-headers.test.js +92 -0
- package/dist/cjs/tests/unit/page-extra-http-headers.test.js.map +1 -0
- package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js +13 -1
- package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/cjs/tests/unit/public-api/public-types.test.js.map +1 -1
- package/dist/esm/lib/inference.js +1 -4
- package/dist/esm/lib/inference.js.map +1 -1
- package/dist/esm/lib/v3/agent/AgentProvider.js +0 -1
- package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/act.d.ts +1 -1
- package/dist/esm/lib/v3/agent/tools/act.js +20 -4
- package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/ariaTree.d.ts +8 -1
- package/dist/esm/lib/v3/agent/tools/ariaTree.js +60 -22
- package/dist/esm/lib/v3/agent/tools/ariaTree.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/click.js +23 -31
- package/dist/esm/lib/v3/agent/tools/click.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/dragAndDrop.js +22 -30
- package/dist/esm/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/extract.d.ts +2 -2
- package/dist/esm/lib/v3/agent/tools/extract.js +16 -3
- package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillFormVision.js +30 -30
- package/dist/esm/lib/v3/agent/tools/fillFormVision.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillform.d.ts +7 -1
- package/dist/esm/lib/v3/agent/tools/fillform.js +60 -37
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/index.d.ts +5 -0
- package/dist/esm/lib/v3/agent/tools/index.js +5 -5
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/screenshot.d.ts +8 -0
- package/dist/esm/lib/v3/agent/tools/screenshot.js +32 -15
- package/dist/esm/lib/v3/agent/tools/screenshot.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/scroll.js +12 -0
- package/dist/esm/lib/v3/agent/tools/scroll.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/type.js +23 -31
- package/dist/esm/lib/v3/agent/tools/type.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/wait.js +6 -0
- package/dist/esm/lib/v3/agent/tools/wait.js.map +1 -1
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js +4 -0
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
- package/dist/esm/lib/v3/api.d.ts +2 -2
- package/dist/esm/lib/v3/api.js +1 -1
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/cache/ActCache.d.ts +0 -1
- package/dist/esm/lib/v3/cache/ActCache.js +2 -18
- package/dist/esm/lib/v3/cache/ActCache.js.map +1 -1
- package/dist/esm/lib/v3/handlers/actHandler.js +1 -2
- package/dist/esm/lib/v3/handlers/actHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/extractHandler.js +2 -2
- package/dist/esm/lib/v3/handlers/extractHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/observeHandler.js +1 -2
- package/dist/esm/lib/v3/handlers/observeHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +11 -16
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/index.d.ts +2 -1
- package/dist/esm/lib/v3/launch/browserbase.d.ts +1 -1
- package/dist/esm/lib/v3/launch/browserbase.js +4 -9
- package/dist/esm/lib/v3/launch/browserbase.js.map +1 -1
- package/dist/esm/lib/v3/llm/LLMProvider.js +0 -5
- package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/esm/lib/v3/runtimePaths.js +2 -1
- package/dist/esm/lib/v3/runtimePaths.js.map +1 -1
- package/dist/esm/lib/v3/shutdown/supervisor.js +2 -2
- package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
- package/dist/esm/lib/v3/timeoutConfig.d.ts +1 -1
- package/dist/esm/lib/v3/timeoutConfig.js +5 -0
- package/dist/esm/lib/v3/timeoutConfig.js.map +1 -1
- package/dist/esm/lib/v3/types/private/shutdown.d.ts +1 -1
- package/dist/esm/lib/v3/types/private/shutdown.js.map +1 -1
- package/dist/esm/lib/v3/types/public/agent.d.ts +12 -1
- package/dist/esm/lib/v3/types/public/agent.js +0 -1
- package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
- package/dist/esm/lib/v3/types/public/api.d.ts +3 -0
- package/dist/esm/lib/v3/types/public/api.js +1 -0
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/model.d.ts +4 -2
- package/dist/esm/lib/v3/types/public/model.js.map +1 -1
- package/dist/esm/lib/v3/types/public/options.d.ts +1 -0
- package/dist/esm/lib/v3/understudy/cdp.d.ts +5 -1
- package/dist/esm/lib/v3/understudy/cdp.js +55 -8
- package/dist/esm/lib/v3/understudy/cdp.js.map +1 -1
- package/dist/esm/lib/v3/understudy/context.d.ts +1 -0
- package/dist/esm/lib/v3/understudy/context.js +142 -60
- package/dist/esm/lib/v3/understudy/context.js.map +1 -1
- package/dist/esm/lib/v3/understudy/frame.js +23 -6
- package/dist/esm/lib/v3/understudy/frame.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.d.ts +13 -0
- package/dist/esm/lib/v3/understudy/page.js +58 -5
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/understudy/screenshotUtils.d.ts +0 -1
- package/dist/esm/lib/v3/understudy/screenshotUtils.js +0 -17
- package/dist/esm/lib/v3/understudy/screenshotUtils.js.map +1 -1
- package/dist/esm/lib/v3/v3.js +38 -24
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/tests/integration/cdp-session-detached.spec.js +1 -1
- package/dist/esm/tests/integration/cdp-session-detached.spec.js.map +1 -1
- package/dist/esm/tests/integration/context-addInitScript.spec.js +104 -11
- package/dist/esm/tests/integration/context-addInitScript.spec.js.map +1 -1
- package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.d.ts +1 -0
- package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.js +217 -0
- package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.js.map +1 -0
- package/dist/esm/tests/integration/page-extra-http-headers.spec.d.ts +1 -0
- package/dist/esm/tests/integration/page-extra-http-headers.spec.js +83 -0
- package/dist/esm/tests/integration/page-extra-http-headers.spec.js.map +1 -0
- package/dist/esm/tests/integration/page-screenshot.spec.js +1 -1
- package/dist/esm/tests/integration/page-screenshot.spec.js.map +1 -1
- package/dist/esm/tests/integration/timeouts.spec.js +168 -0
- package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/esm/tests/unit/model-deprecation.test.js +5 -8
- package/dist/esm/tests/unit/model-deprecation.test.js.map +1 -1
- package/dist/esm/tests/unit/page-extra-http-headers.test.d.ts +1 -0
- package/dist/esm/tests/unit/page-extra-http-headers.test.js +90 -0
- package/dist/esm/tests/unit/page-extra-http-headers.test.js.map +1 -0
- package/dist/esm/tests/unit/public-api/llm-and-agents.test.js +13 -1
- package/dist/esm/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/esm/tests/unit/public-api/public-types.test.js.map +1 -1
- package/package.json +4 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/context.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/understudy/context.ts\nimport type { Protocol } from \"devtools-protocol\";\nimport { v3Logger } from \"../logger.js\";\nimport { CdpConnection, CDPSessionLike } from \"./cdp.js\";\nimport { Page } from \"./page.js\";\nimport { installV3PiercerIntoSession } from \"./piercer.js\";\nimport { v3ScriptContent } from \"../dom/build/scriptV3Content.js\";\nimport { executionContexts } from \"./executionContextRegistry.js\";\nimport type { StagehandAPIClient } from \"../api.js\";\nimport { LocalBrowserLaunchOptions } from \"../types/public/index.js\";\nimport { InitScriptSource } from \"../types/private/index.js\";\nimport { normalizeInitScriptSource } from \"./initScripts.js\";\nimport {\n TimeoutError,\n CookieSetError,\n PageNotFoundError,\n StagehandSetExtraHTTPHeadersError,\n} from \"../types/public/sdkErrors.js\";\nimport { getEnvTimeoutMs, withTimeout } from \"../timeoutConfig.js\";\nimport {\n filterCookies,\n normalizeCookieParams,\n cookieMatchesFilter,\n toCdpCookieParam,\n} from \"./cookies.js\";\nimport {\n Cookie,\n ClearCookieOptions,\n CookieParam,\n} from \"../types/public/context.js\";\n\ntype TargetId = string;\ntype SessionId = string;\n\ntype TargetType = \"page\" | \"iframe\" | string;\n\n/**\n * Returns true when the target's URL points to a document with a real,\n * pierceable HTML DOM. We allowlist the small set of schemes that carry\n * web content rather than trying to blacklist every internal browser scheme\n * (chrome://, chrome-extension://, devtools://, brave://, edge://, …).\n */\nfunction hasInjectableDOM(url: string | undefined): boolean {\n if (!url || url === \"\") return true;\n if (\n url === \"about:blank\" ||\n url === \"about:srcdoc\" ||\n url.startsWith(\"about:blank#\")\n )\n return true;\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) return true;\n if (\n url.startsWith(\"data:\") ||\n url.startsWith(\"blob:\") ||\n url.startsWith(\"file://\") ||\n url.startsWith(\"filesystem:\")\n )\n return true;\n return false;\n}\n\nfunction isNonWebTarget(info: Protocol.Target.TargetInfo): boolean {\n return (\n (info.type !== \"page\" && info.type !== \"iframe\") ||\n !hasInjectableDOM(info.url)\n );\n}\n\nfunction isTopLevelPage(info: Protocol.Target.TargetInfo): boolean {\n const ti = info as unknown as { subtype?: string };\n return info.type === \"page\" && ti.subtype !== \"iframe\";\n}\n\nconst DEFAULT_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS = 5000;\nconst CI_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS = 30000;\nconst FIRST_TOP_LEVEL_PAGE_TIMEOUT_ENV =\n \"STAGEHAND_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS\";\nconst WAIT_FOR_FIRST_TOP_LEVEL_PAGE_OPERATION =\n \"waitForFirstTopLevelPage (no top-level Page)\";\n\nfunction getFirstTopLevelPageTimeoutMs(): number {\n return (\n getEnvTimeoutMs(FIRST_TOP_LEVEL_PAGE_TIMEOUT_ENV) ??\n (process.env.CI\n ? CI_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS\n : DEFAULT_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS)\n );\n}\n\n/**\n * V3Context\n *\n * Owns the root CDP connection and wires Target/Page events into Page.\n * Maintains one Page per top-level target, adopts OOPIF child sessions into the owner Page,\n * and tracks target→page and (root) frame→target mappings for lookups.\n *\n * IMPORTANT: FrameId → session ownership is managed inside Page (via its FrameRegistry).\n * Context never “guesses” owners; it simply forwards events (with the emitting session)\n * so Page can record the correct owner at event time.\n */\nexport class V3Context {\n private constructor(\n readonly conn: CdpConnection,\n private readonly env: \"LOCAL\" | \"BROWSERBASE\" = \"LOCAL\",\n private readonly apiClient: StagehandAPIClient | null = null,\n private readonly localBrowserLaunchOptions: LocalBrowserLaunchOptions | null = null,\n ) {}\n\n private readonly _piercerInstalled = new Set<string>();\n // Timestamp for most recent popup/open signal\n private _lastPopupSignalAt = 0;\n private readonly _targetSessionListeners = new Set<SessionId>();\n\n private readonly _sessionInit = new Set<SessionId>();\n private pagesByTarget = new Map<TargetId, Page>();\n private mainFrameToTarget = new Map<string, TargetId>();\n private sessionOwnerPage = new Map<SessionId, Page>();\n private frameOwnerPage = new Map<string, Page>();\n private pendingOopifByMainFrame = new Map<string, SessionId>();\n private createdAtByTarget = new Map<TargetId, number>();\n private typeByTarget = new Map<TargetId, TargetType>();\n private _pageOrder: TargetId[] = [];\n private pendingCreatedTargetUrl = new Map<TargetId, string>();\n private readonly initScripts: string[] = [];\n private extraHttpHeaders: Record<string, string> | null = null;\n\n private installTargetSessionListeners(session: CDPSessionLike): void {\n const sessionId = session.id;\n if (!sessionId) return;\n if (this._targetSessionListeners.has(sessionId)) return;\n this._targetSessionListeners.add(sessionId);\n\n session.on<Protocol.Target.AttachedToTargetEvent>(\n \"Target.attachedToTarget\",\n (evt) => {\n void this.onAttachedToTarget(evt.targetInfo, evt.sessionId);\n },\n );\n session.on<Protocol.Target.DetachedFromTargetEvent>(\n \"Target.detachedFromTarget\",\n (evt) => {\n this.onDetachedFromTarget(evt.sessionId, evt.targetId ?? null);\n },\n );\n session.on<Protocol.Target.TargetDestroyedEvent>(\n \"Target.targetDestroyed\",\n (evt) => {\n this.cleanupByTarget(evt.targetId);\n },\n );\n }\n\n /**\n * Create a Context for a given CDP websocket URL and bootstrap target wiring.\n */\n static async create(\n wsUrl: string,\n opts?: {\n env?: \"LOCAL\" | \"BROWSERBASE\";\n apiClient?: StagehandAPIClient | null;\n localBrowserLaunchOptions?: LocalBrowserLaunchOptions | null;\n },\n ): Promise<V3Context> {\n const connectTask = async () => {\n const conn = await CdpConnection.connect(wsUrl);\n const ctx = new V3Context(\n conn,\n opts?.env ?? \"LOCAL\",\n opts?.apiClient ?? null,\n opts?.localBrowserLaunchOptions ?? null,\n );\n await ctx.bootstrap();\n await ctx.ensureFirstTopLevelPage(getFirstTopLevelPageTimeoutMs());\n return ctx;\n };\n\n const cdpTimeoutMs =\n opts?.env === \"BROWSERBASE\"\n ? getEnvTimeoutMs(\"BROWSERBASE_CDP_CONNECT_MAX_MS\")\n : undefined;\n\n if (cdpTimeoutMs) {\n let timedOut = false;\n const connectPromise = connectTask();\n const guarded = withTimeout(\n connectPromise,\n cdpTimeoutMs,\n \"Browserbase CDP connect\",\n ).catch((err) => {\n timedOut = true;\n throw err;\n });\n connectPromise\n .then((ctx) => {\n if (timedOut) void ctx.close();\n })\n .catch(() => {});\n return await guarded;\n }\n\n return await connectTask();\n }\n\n private hasTopLevelPage(): boolean {\n for (const [targetId, targetType] of this.typeByTarget) {\n if (targetType === \"page\" && this.pagesByTarget.has(targetId)) {\n return true;\n }\n }\n return false;\n }\n\n private async ensureFirstTopLevelPage(timeoutMs: number): Promise<void> {\n if (this.hasTopLevelPage()) return;\n\n try {\n await this.waitForFirstTopLevelPage(timeoutMs);\n return;\n } catch (err) {\n if (!(err instanceof TimeoutError)) {\n throw err;\n }\n v3Logger({\n category: \"ctx\",\n message:\n \"No open browser pages found after connect; creating an initial about:blank page\",\n level: 1,\n });\n }\n\n await this.newPage(\"about:blank\");\n }\n\n /**\n * Wait until at least one top-level Page has been created and registered.\n * We poll internal maps that bootstrap/onAttachedToTarget populate.\n */\n private async waitForFirstTopLevelPage(timeoutMs: number): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n // A top-level Page is present if typeByTarget has an entry \"page\"\n // and pagesByTarget has the corresponding Page object.\n for (const [tid, ttype] of this.typeByTarget) {\n if (ttype === \"page\") {\n const p = this.pagesByTarget.get(tid);\n if (p) return;\n }\n }\n await new Promise((r) => setTimeout(r, 25));\n }\n throw new TimeoutError(WAIT_FOR_FIRST_TOP_LEVEL_PAGE_OPERATION, timeoutMs);\n }\n\n private async waitForInitialTopLevelTargets(\n targetIds: TargetId[],\n timeoutMs = 3000,\n ): Promise<void> {\n if (!targetIds.length) return;\n const pending = new Set(targetIds);\n const deadline = Date.now() + timeoutMs;\n while (pending.size && Date.now() < deadline) {\n for (const tid of Array.from(pending)) {\n if (this.pagesByTarget.has(tid)) {\n pending.delete(tid);\n }\n }\n if (!pending.size) return;\n await new Promise((r) => setTimeout(r, 25));\n }\n if (pending.size) {\n v3Logger({\n category: \"ctx\",\n message: \"Timed out waiting for existing top-level targets to attach\",\n level: 2,\n auxiliary: {\n remainingTargets: {\n value: JSON.stringify(Array.from(pending)),\n type: \"object\",\n },\n },\n });\n }\n }\n\n private async ensurePiercer(session: CDPSessionLike): Promise<boolean> {\n const id = session.id ?? \"\";\n if (this._piercerInstalled.has(id)) return true;\n\n const installed = await installV3PiercerIntoSession(session);\n if (installed) {\n this._piercerInstalled.add(id);\n }\n return installed;\n }\n\n /** Mark a page target as the most-recent one (active). */\n private _pushActive(tid: TargetId): void {\n // remove prior entry if any\n const i = this._pageOrder.indexOf(tid);\n if (i !== -1) this._pageOrder.splice(i, 1);\n this._pageOrder.push(tid);\n }\n\n /** Remove a page target from the recency list (used on close). */\n private _removeFromOrder(tid: TargetId): void {\n const i = this._pageOrder.indexOf(tid);\n if (i !== -1) this._pageOrder.splice(i, 1);\n }\n\n /** Return the current active Page (most-recent page that still exists). */\n public activePage(): Page | undefined {\n // prune any stale ids from the tail\n for (let i = this._pageOrder.length - 1; i >= 0; i--) {\n const tid = this._pageOrder[i]!;\n const p = this.pagesByTarget.get(tid);\n if (p) return p;\n // stale — remove and continue\n this._pageOrder.splice(i, 1);\n }\n // fallback: pick the newest by createdAt if order is empty\n let newestTid: TargetId | undefined;\n let newestTs = -1;\n for (const [tid] of this.pagesByTarget) {\n const ts = this.createdAtByTarget.get(tid) ?? 0;\n if (ts > newestTs) {\n newestTs = ts;\n newestTid = tid;\n }\n }\n return newestTid ? this.pagesByTarget.get(newestTid) : undefined;\n }\n\n /** Explicitly mark a known Page as the most-recent active page (and focus it). */\n public setActivePage(page: Page): void {\n let targetId = page.targetId();\n if (this.pagesByTarget.get(targetId) !== page) {\n const lookup = this.findTargetIdByPage(page);\n if (!lookup) {\n v3Logger({\n category: \"ctx\",\n message: \"setActivePage called with unknown Page\",\n level: 2,\n auxiliary: {\n targetId: { value: String(targetId), type: \"string\" },\n },\n });\n return;\n }\n targetId = lookup;\n }\n\n this._pushActive(targetId);\n\n // Bring the tab to the foreground in headful Chrome (best effort).\n void this.conn.send(\"Target.activateTarget\", { targetId }).catch(() => {});\n }\n\n public async addInitScript<Arg>(\n script: InitScriptSource<Arg>,\n arg?: Arg,\n ): Promise<void> {\n const source = await normalizeInitScriptSource(script, arg);\n if (this.initScripts.includes(source)) return;\n this.initScripts.push(source);\n const pages = this.pages();\n await Promise.all(pages.map((page) => page.registerInitScript(source)));\n }\n\n public async setExtraHTTPHeaders(\n headers: Record<string, string>,\n ): Promise<void> {\n const nextHeaders = { ...headers };\n this.extraHttpHeaders = nextHeaders;\n\n const sessions: CDPSessionLike[] = [];\n for (const sessionId of this._sessionInit) {\n const session = this.conn.getSession(sessionId);\n if (session) sessions.push(session);\n }\n\n if (!sessions.length) return;\n\n const results = await Promise.allSettled(\n sessions.map(async (session) => {\n await session.send(\"Network.enable\");\n await session.send(\"Network.setExtraHTTPHeaders\", {\n headers: nextHeaders,\n });\n }),\n );\n\n const failures = results\n .map((result, index) => ({ result, session: sessions[index] }))\n .filter(\n (\n entry,\n ): entry is {\n result: PromiseRejectedResult;\n session: CDPSessionLike;\n } => entry.result.status === \"rejected\",\n )\n .map((entry) => {\n const reason = entry.result.reason as Error;\n const sid = entry.session.id ?? \"unknown\";\n const message = reason?.message ?? String(reason);\n return `session=${sid} error=${message}`;\n });\n\n if (failures.length) {\n throw new StagehandSetExtraHTTPHeadersError(failures);\n }\n }\n\n /**\n * Return top-level `Page`s (oldest → newest). OOPIF targets are not included.\n */\n pages(): Page[] {\n const rows: Array<{ tid: TargetId; page: Page; created: number }> = [];\n for (const [tid, page] of this.pagesByTarget) {\n if (this.typeByTarget.get(tid) === \"page\") {\n rows.push({ tid, page, created: this.createdAtByTarget.get(tid) ?? 0 });\n }\n }\n rows.sort((a, b) => a.created - b.created);\n return rows.map((r) => r.page);\n }\n\n private async applyInitScriptsToPage(\n page: Page,\n opts?: { seedOnly?: boolean },\n ): Promise<void> {\n if (opts?.seedOnly) {\n for (const source of this.initScripts) {\n page.seedInitScript(source);\n }\n return;\n }\n for (const source of this.initScripts) {\n await page.registerInitScript(source);\n }\n }\n\n /**\n * Resolve an owning `Page` by the **top-level main frame id**.\n * Note: child (OOPIF) roots are intentionally not present in this mapping.\n */\n resolvePageByMainFrameId(frameId: string): Page | undefined {\n const targetId = this.mainFrameToTarget.get(frameId);\n return targetId ? this.pagesByTarget.get(targetId) : undefined;\n }\n\n /**\n * Serialize the full frame tree for a given top-level main frame id.\n */\n async getFullFrameTreeByMainFrameId(\n rootMainFrameId: string,\n ): Promise<Protocol.Page.FrameTree> {\n const owner = this.resolvePageByMainFrameId(rootMainFrameId);\n if (!owner) throw new PageNotFoundError(`mainFrameId=${rootMainFrameId}`);\n return owner.asProtocolFrameTree(rootMainFrameId);\n }\n\n /**\n * Create a new top-level page (tab) with the given URL and return its Page object.\n * Waits until the target is attached and registered.\n */\n public async newPage(url = \"about:blank\"): Promise<Page> {\n const targetUrl = String(url ?? \"about:blank\");\n const { targetId } = await this.conn.send<{ targetId: string }>(\n \"Target.createTarget\",\n // Create at about:blank so init scripts can install before first real navigation.\n { url: \"about:blank\" },\n );\n this.pendingCreatedTargetUrl.set(targetId, \"about:blank\");\n // Best-effort bring-to-front\n await this.conn.send(\"Target.activateTarget\", { targetId }).catch(() => {});\n\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n const page = this.pagesByTarget.get(targetId);\n if (page) {\n // we created at about:blank; navigate only after attach so init scripts run\n // on the first real document. Fire-and-forget so newPage() resolves on attach.\n if (targetUrl !== \"about:blank\") {\n // Seed requested URL into the page cache before navigation events arrive.\n page.seedCurrentUrl(targetUrl);\n void page\n .sendCDP(\"Page.navigate\", { url: targetUrl })\n .catch(() => {});\n }\n return page;\n }\n await new Promise((r) => setTimeout(r, 25));\n }\n throw new TimeoutError(`newPage: target not attached (${targetId})`, 5000);\n }\n\n /**\n * Close CDP and clear all mappings. Best-effort cleanup.\n */\n async close(): Promise<void> {\n await this.conn.close();\n this.pagesByTarget.clear();\n this.mainFrameToTarget.clear();\n this.sessionOwnerPage.clear();\n this.frameOwnerPage.clear();\n this.pendingOopifByMainFrame.clear();\n this.createdAtByTarget.clear();\n this.typeByTarget.clear();\n this.pendingCreatedTargetUrl.clear();\n }\n\n /**\n * Bootstrap target lifecycle:\n * - Attach to existing targets.\n * - Handle auto-attach events.\n * - Clean up on detach/destroy.\n */\n private async bootstrap(): Promise<void> {\n // Live attach via auto-attach (normal path)\n this.conn.on<Protocol.Target.AttachedToTargetEvent>(\n \"Target.attachedToTarget\",\n async (evt) => {\n await this.onAttachedToTarget(evt.targetInfo, evt.sessionId);\n },\n );\n\n // Live detach (clean up session from owner page & frame graph)\n this.conn.on<Protocol.Target.DetachedFromTargetEvent>(\n \"Target.detachedFromTarget\",\n (evt) => {\n this.onDetachedFromTarget(evt.sessionId, evt.targetId ?? null);\n },\n );\n\n // Destroyed targets (fallback cleanup by targetId)\n this.conn.on<Protocol.Target.TargetDestroyedEvent>(\n \"Target.targetDestroyed\",\n (evt) => {\n this.cleanupByTarget(evt.targetId);\n },\n );\n\n this.conn.on<Protocol.Target.TargetCreatedEvent>(\n \"Target.targetCreated\",\n async (evt) => {\n const info = evt.targetInfo;\n // Note popups to help activePage settle\n const ti = info;\n if (info.type === \"page\" && (ti?.openerId || ti?.openerFrameId)) {\n this._notePopupSignal();\n }\n },\n );\n\n // Only enable auto-attach after listeners are ready so replayed targets are captured.\n await this.conn.enableAutoAttach();\n\n const targets = await this.conn.getTargets();\n for (const t of targets) {\n if (t.attached) continue; // auto-attach already handled this target\n try {\n await this.conn.attachToTarget(t.targetId);\n } catch {\n // ignore attach race\n }\n }\n\n const topLevelTargetIds = targets\n .filter((t) => isTopLevelPage(t))\n .map((t) => t.targetId);\n await this.waitForInitialTopLevelTargets(topLevelTargetIds);\n }\n\n /**\n * Handle a newly attached target (top-level or potential OOPIF):\n * - Enable Page domain and lifecycle events.\n * - If top-level → create Page, wire listeners, resume.\n * - Else → probe child root frame id via `Page.getFrameTree` and adopt immediately\n * if the parent is known; otherwise stage until parent `frameAttached`.\n * - Resume the target only after listeners are wired.\n */\n private async onAttachedToTarget(\n info: Protocol.Target.TargetInfo,\n sessionId: SessionId,\n ): Promise<void> {\n // Skip non-web targets (workers, chrome extensions, background pages, etc.).\n // They still need to be resumed so we don't leave them paused by\n // waitForDebuggerOnStart, but injecting the piercer into these targets\n // can throw or corrupt their internal state (e.g. Chrome's PDF viewer).\n if (isNonWebTarget(info)) {\n const session = this.conn.getSession(sessionId);\n if (session) {\n await session.send(\"Runtime.runIfWaitingForDebugger\").catch(() => {});\n }\n return;\n }\n\n const session = this.conn.getSession(sessionId);\n if (!session) return;\n\n // Init guard\n if (this._sessionInit.has(sessionId)) return;\n this._sessionInit.add(sessionId);\n\n this.installTargetSessionListeners(session);\n\n // Register for Runtime events before enabling it so we don't miss initial contexts.\n executionContexts.attachSession(session);\n\n // Ensure we only resume once even if multiple code paths hit finally.\n let resumed = false;\n const resume = async (): Promise<void> => {\n if (resumed) return;\n resumed = true;\n // waitForDebuggerOnStart pauses new targets; resume once we've done\n // any \"must happen before first document\" work.\n await session.send(\"Runtime.runIfWaitingForDebugger\").catch(() => {});\n };\n\n // Install any context-level init scripts as early as possible on this session.\n // If this throws, we still resume the target but avoid re-installing later.\n let scriptsInstalled = true;\n let piercerPreRegistered = false;\n const installPromises: Array<Promise<unknown>> = [];\n try {\n const send = (method: string, params?: object) =>\n session.send(method, params).catch(() => {});\n // make sure init scripts land before any subframe work.\n installPromises.push(send(\"Page.enable\"));\n installPromises.push(send(\"Runtime.enable\"));\n installPromises.push(\n session\n .send(\"Target.setAutoAttach\", {\n autoAttach: true,\n waitForDebuggerOnStart: true,\n flatten: true,\n })\n .catch(() => {}),\n );\n if (this.extraHttpHeaders) {\n const headers = { ...this.extraHttpHeaders };\n installPromises.push(send(\"Network.enable\"));\n installPromises.push(send(\"Network.setExtraHTTPHeaders\", { headers }));\n }\n // Send init scripts only after auto-attach has been issued.\n if (this.initScripts.length) {\n for (const source of this.initScripts) {\n installPromises.push(\n session.send(\"Page.addScriptToEvaluateOnNewDocument\", {\n source,\n runImmediately: true,\n }),\n );\n }\n }\n // register piercer (shadow-DOM hook) before resume so it runs\n // before page scripts\n installPromises.push(\n session\n .send(\"Page.addScriptToEvaluateOnNewDocument\", {\n source: v3ScriptContent,\n runImmediately: true,\n })\n .then(() => {\n piercerPreRegistered = true;\n })\n .catch(() => {}),\n );\n installPromises.push(resume());\n } catch {\n scriptsInstalled = false;\n }\n if (installPromises.length) {\n const results = await Promise.allSettled(installPromises);\n if (results.some((r) => r.status === \"rejected\")) {\n scriptsInstalled = false;\n }\n }\n\n // Only mark the piercer as installed when the pre-registration actually\n // succeeded. This lets ensurePiercer() short-circuit (avoiding sequential\n // CDP round-trips that delay Page.create / installFrameEventBridges and\n // cause same-process iframe frame-events to be missed) while still falling\n // back to the full install path when registration failed.\n if (piercerPreRegistered) {\n this._piercerInstalled.add(sessionId);\n }\n\n try {\n const piercerReady = await this.ensurePiercer(session);\n if (!piercerReady) return;\n\n await session\n .send(\"Page.setLifecycleEventsEnabled\", { enabled: true })\n .catch(() => {});\n\n // Top-level handling\n if (isTopLevelPage(info)) {\n const page = await Page.create(\n this.conn,\n session,\n info.targetId,\n this.apiClient,\n this.localBrowserLaunchOptions,\n this.env === \"BROWSERBASE\",\n );\n this.wireSessionToOwnerPage(sessionId, page);\n this.pagesByTarget.set(info.targetId, page);\n this.mainFrameToTarget.set(page.mainFrameId(), info.targetId);\n this.sessionOwnerPage.set(sessionId, page);\n this.frameOwnerPage.set(page.mainFrameId(), page);\n this.typeByTarget.set(info.targetId, \"page\");\n if (!this.createdAtByTarget.has(info.targetId)) {\n this.createdAtByTarget.set(info.targetId, Date.now());\n }\n const pendingSeedUrl = this.pendingCreatedTargetUrl.get(info.targetId);\n this.pendingCreatedTargetUrl.delete(info.targetId);\n page.seedCurrentUrl(pendingSeedUrl ?? info.url ?? \"\");\n this._pushActive(info.targetId);\n this.installFrameEventBridges(sessionId, page);\n // If we already installed scripts at the session level, only seed the\n // Page's registry to avoid double-installing DOMContentLoaded handlers.\n await this.applyInitScriptsToPage(page, {\n seedOnly: scriptsInstalled,\n });\n\n return;\n }\n\n // Child (iframe / OOPIF)\n try {\n const { frameTree } =\n await session.send<Protocol.Page.GetFrameTreeResponse>(\n \"Page.getFrameTree\",\n );\n const childMainId = frameTree.frame.id;\n\n // Try to find owner Page now (it may already have the node in its tree)\n let owner = this.frameOwnerPage.get(childMainId);\n if (!owner) {\n for (const p of this.pagesByTarget.values()) {\n const tree = p.asProtocolFrameTree(p.mainFrameId());\n const has = (function find(n: Protocol.Page.FrameTree): boolean {\n if (n.frame.id === childMainId) return true;\n for (const c of n.childFrames ?? []) if (find(c)) return true;\n return false;\n })(tree);\n if (has) {\n owner = p;\n break;\n }\n }\n }\n\n if (owner) {\n owner.adoptOopifSession(session, childMainId);\n this.sessionOwnerPage.set(sessionId, owner);\n this.installFrameEventBridges(sessionId, owner);\n // Prime the execution-context registry so later lookups succeed even if\n // the frame navigates before we issue a command.\n void executionContexts\n .waitForMainWorld(session, childMainId)\n .catch(() => {});\n } else {\n this.pendingOopifByMainFrame.set(childMainId, sessionId);\n }\n } catch {\n // page.getFrameTree failed. Most likely was an ad iframe\n // that opened & closed before we could attach. ignore\n }\n } finally {\n await resume();\n }\n }\n\n /**\n * Detach handler:\n * - Remove child session ownership and prune its subtree.\n * - If a top-level target, cleanup its `Page` and mappings.\n * - Drop any staged child for this session.\n */\n private onDetachedFromTarget(\n sessionId: SessionId,\n targetId: string | null,\n ): void {\n const owner = this.sessionOwnerPage.get(sessionId);\n if (owner) {\n owner.detachOopifSession(sessionId);\n this.sessionOwnerPage.delete(sessionId);\n }\n\n if (targetId && this.pagesByTarget.has(targetId)) {\n this.cleanupByTarget(targetId);\n }\n\n for (const [fid, sid] of Array.from(\n this.pendingOopifByMainFrame.entries(),\n )) {\n if (sid === sessionId) this.pendingOopifByMainFrame.delete(fid);\n }\n\n this._targetSessionListeners.delete(sessionId);\n this._sessionInit.delete(sessionId);\n this._piercerInstalled.delete(sessionId);\n }\n\n /**\n * Cleanup a top-level Page by target id, removing its root and staged children.\n */\n private cleanupByTarget(targetId: TargetId): void {\n const page = this.pagesByTarget.get(targetId);\n if (!page) return;\n\n const mainId = page.mainFrameId();\n this.mainFrameToTarget.delete(mainId);\n this.frameOwnerPage.delete(mainId);\n\n for (const [sid, p] of Array.from(this.sessionOwnerPage.entries())) {\n if (p === page) this.sessionOwnerPage.delete(sid);\n }\n\n for (const [fid] of Array.from(this.pendingOopifByMainFrame.entries())) {\n const owner = this.frameOwnerPage.get(fid);\n if (!owner || owner === page) this.pendingOopifByMainFrame.delete(fid);\n }\n\n this._removeFromOrder(targetId);\n this.pagesByTarget.delete(targetId);\n this.createdAtByTarget.delete(targetId);\n this.typeByTarget.delete(targetId);\n this.pendingCreatedTargetUrl.delete(targetId);\n }\n\n /**\n * Wire Page-domain frame events for a session into the owning Page & mappings.\n * We forward the *emitting session* with every event so Page can stamp ownership precisely.\n */\n private installFrameEventBridges(sessionId: SessionId, owner: Page): void {\n const session = this.conn.getSession(sessionId);\n if (!session) return;\n\n session.on<Protocol.Page.FrameAttachedEvent>(\n \"Page.frameAttached\",\n (evt) => {\n const { frameId, parentFrameId } = evt;\n\n owner.onFrameAttached(frameId, parentFrameId ?? null, session);\n\n // If we were waiting for this id (OOPIF child), adopt now.\n const pendingChildSessionId = this.pendingOopifByMainFrame.get(frameId);\n if (pendingChildSessionId) {\n const child = this.conn.getSession(pendingChildSessionId);\n if (child) {\n owner.adoptOopifSession(child, frameId);\n this.sessionOwnerPage.set(child.id, owner);\n // Wire bridges for the child so its Page events keep flowing.\n this.installFrameEventBridges(pendingChildSessionId, owner);\n }\n this.pendingOopifByMainFrame.delete(frameId);\n }\n\n // Track Page ownership for quick reverse lookups (debug helpers).\n this.frameOwnerPage.set(frameId, owner);\n\n // Root handoff: keep mainFrameToTarget aligned for the page\n if (!parentFrameId) {\n const newRoot = owner.mainFrameId();\n const topTargetId = this.findTargetIdByPage(owner);\n if (topTargetId) {\n this.mainFrameToTarget.set(newRoot, topTargetId);\n }\n this.frameOwnerPage.set(newRoot, owner);\n }\n },\n );\n\n session.on<Protocol.Page.FrameDetachedEvent>(\n \"Page.frameDetached\",\n (evt) => {\n owner.onFrameDetached(evt.frameId, evt.reason ?? \"remove\");\n if (evt.reason !== \"swap\") {\n this.frameOwnerPage.delete(evt.frameId);\n }\n },\n );\n\n session.on<Protocol.Page.FrameNavigatedEvent>(\n \"Page.frameNavigated\",\n (evt) => {\n owner.onFrameNavigated(evt.frame, session);\n },\n );\n\n session.on<Protocol.Page.NavigatedWithinDocumentEvent>(\n \"Page.navigatedWithinDocument\",\n (evt) => {\n owner.onNavigatedWithinDocument(evt.frameId, evt.url, session);\n },\n );\n\n // Observe window.open to anticipate default page changes\n session.on<Protocol.Page.WindowOpenEvent>(\"Page.windowOpen\", () => {\n this._notePopupSignal();\n });\n }\n\n /**\n * Register that a session belongs to a Page (used by event routing).\n */\n private wireSessionToOwnerPage(sessionId: SessionId, owner: Page): void {\n this.sessionOwnerPage.set(sessionId, owner);\n }\n\n /**\n * Utility: reverse-lookup the top-level target id that owns a given Page.\n */\n private findTargetIdByPage(page: Page): TargetId | undefined {\n for (const [tid, p] of this.pagesByTarget) {\n if (p === page) return tid;\n }\n return undefined;\n }\n\n private _notePopupSignal(): void {\n this._lastPopupSignalAt = Date.now();\n }\n\n /**\n * Await the current active page, waiting briefly if a popup/open was just triggered.\n * Normal path returns immediately; popup path waits up to timeoutMs for the new page.\n */\n async awaitActivePage(timeoutMs?: number): Promise<Page> {\n const defaultTimeout = this.env === \"BROWSERBASE\" ? 4000 : 2000;\n timeoutMs = timeoutMs ?? defaultTimeout;\n // If a popup was just triggered, Chrome (especially on Browserbase)\n // may briefly pause new targets at document start (\"waiting for debugger\").\n const recentWindowMs = this.env === \"BROWSERBASE\" ? 1000 : 300;\n const now = Date.now();\n const hasRecentPopup = now - this._lastPopupSignalAt <= recentWindowMs;\n\n const immediate = this.activePage();\n if (!hasRecentPopup && immediate) return immediate;\n\n const deadline = now + timeoutMs;\n while (Date.now() < deadline) {\n // Prefer most-recent by createdAt\n let newestTid: TargetId | undefined;\n let newestTs = -1;\n for (const [tid] of this.pagesByTarget) {\n const ts = this.createdAtByTarget.get(tid) ?? 0;\n if (ts > newestTs) {\n newestTs = ts;\n newestTid = tid;\n }\n }\n if (newestTid) {\n const p = this.pagesByTarget.get(newestTid);\n if (p && newestTs >= this._lastPopupSignalAt) return p;\n }\n await new Promise((r) => setTimeout(r, 25));\n }\n if (immediate) return immediate;\n throw new PageNotFoundError(\"awaitActivePage: no page available\");\n }\n\n /**\n * Get all browser cookies, optionally filtered by URL(s).\n *\n * When `urls` is omitted or empty every cookie in the browser context is\n * returned. When one or more URLs are supplied only cookies whose\n * domain/path/secure attributes match are included.\n */\n async cookies(urls?: string | string[]): Promise<Cookie[]> {\n const urlList = !urls ? [] : typeof urls === \"string\" ? [urls] : urls;\n\n const { cookies } = await this.conn.send<{\n cookies: Protocol.Network.Cookie[];\n }>(\"Storage.getCookies\");\n\n const mapped: Cookie[] = cookies.map((c) => ({\n name: c.name,\n value: c.value,\n domain: c.domain,\n path: c.path,\n expires: c.expires,\n httpOnly: c.httpOnly,\n secure: c.secure,\n sameSite: (c.sameSite as Cookie[\"sameSite\"]) ?? \"Lax\",\n }));\n\n return filterCookies(mapped, urlList);\n }\n\n /**\n * Add one or more cookies to the browser context.\n *\n * Each cookie must specify either a `url` (from which domain/path/secure are\n * derived) or an explicit `domain` + `path` pair.\n *\n * We surface CDP errors if the browser rejects a cookie.\n */\n async addCookies(cookies: CookieParam[]): Promise<void> {\n const normalized = normalizeCookieParams(cookies);\n if (!normalized.length) return;\n\n const cdpCookies = normalized.map(toCdpCookieParam);\n\n try {\n await this.conn.send(\"Storage.setCookies\", { cookies: cdpCookies });\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n const names = normalized.map((c) => `\"${c.name}\"`).join(\", \");\n throw new CookieSetError(\n `Failed to set cookies [${names}] — ` +\n `the browser rejected the batch. Check that the domain, path, and secure/sameSite values are valid.` +\n (detail ? ` (CDP error: ${detail})` : \"\"),\n );\n }\n }\n\n /**\n * Clear cookies from the browser context.\n *\n * - Called with no arguments: clears **all** cookies atomically via\n * `Storage.clearCookies`.\n * - Called with filter options: fetches all cookies, clears everything,\n * then re-adds only the cookies that do NOT match the filter via\n * `Storage.setCookies`. This is necessary on the browser endpoint because\n * the Storage domain does not support targeted deletes.\n */\n async clearCookies(options?: ClearCookieOptions): Promise<void> {\n const hasFilter =\n options?.name !== undefined ||\n options?.domain !== undefined ||\n options?.path !== undefined;\n\n if (!hasFilter) {\n // Atomic single-call wipe — no race condition, no O(N) roundtrips.\n await this.conn.send(\"Storage.clearCookies\");\n return;\n }\n\n const current = await this.cookies();\n const toKeep = current.filter((c) => !cookieMatchesFilter(c, options!));\n\n if (toKeep.length === current.length) return;\n\n // Storage domain doesn't support targeted deletes on the browser endpoint.\n // Clear everything, then re-add only the cookies we're keeping.\n await this.conn.send(\"Storage.clearCookies\");\n if (toKeep.length) {\n try {\n await this.conn.send(\"Storage.setCookies\", {\n cookies: toKeep.map(toCdpCookieParam),\n });\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n const names = toKeep.map((c) => `\"${c.name}\"`).join(\", \");\n throw new CookieSetError(\n `clearCookies: cookies were cleared but failed to re-add the ${toKeep.length} ` +\n `non-matching cookie(s) [${names}]. The browser cookie jar is now empty. ` +\n (detail ? `(CDP error: ${detail})` : \"\"),\n );\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/context.ts"],"names":[],"mappings":";;;AAEA,4CAAwC;AACxC,qCAAyD;AACzD,uCAAiC;AACjC,6CAA2D;AAC3D,wEAAkE;AAClE,+EAAkE;AAIlE,qDAA6D;AAC7D,+DAKsC;AACtC,0DAAmE;AACnE,6CAKsB;AAYtB;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,GAAuB;IAC/C,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACpC,IACE,GAAG,KAAK,aAAa;QACrB,GAAG,KAAK,cAAc;QACtB,GAAG,CAAC,UAAU,CAAC,cAAc,CAAC;QAE9B,OAAO,IAAI,CAAC;IACd,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACzE,IACE,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;QACvB,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC;QACvB,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC;QACzB,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC;QAE7B,OAAO,IAAI,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAgC;IACtD,OAAO,CACL,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;QAChD,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAC5B,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAgC;IACtD,MAAM,EAAE,GAAG,IAAuC,CAAC;IACnD,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC,OAAO,KAAK,QAAQ,CAAC;AACzD,CAAC;AAED,MAAM,uCAAuC,GAAG,IAAI,CAAC;AACrD,MAAM,kCAAkC,GAAG,KAAK,CAAC;AACjD,MAAM,gCAAgC,GACpC,2CAA2C,CAAC;AAC9C,MAAM,uCAAuC,GAC3C,8CAA8C,CAAC;AAEjD,SAAS,6BAA6B;IACpC,OAAO,CACL,IAAA,kCAAe,EAAC,gCAAgC,CAAC;QACjD,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACb,CAAC,CAAC,kCAAkC;YACpC,CAAC,CAAC,uCAAuC,CAAC,CAC7C,CAAC;AACJ,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAa,SAAS;IAET;IACQ;IACA;IACA;IAJnB,YACW,IAAmB,EACX,MAA+B,OAAO,EACtC,YAAuC,IAAI,EAC3C,4BAA8D,IAAI;QAH1E,SAAI,GAAJ,IAAI,CAAe;QACX,QAAG,GAAH,GAAG,CAAmC;QACtC,cAAS,GAAT,SAAS,CAAkC;QAC3C,8BAAyB,GAAzB,yBAAyB,CAAyC;IAClF,CAAC;IAEa,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IACvD,8CAA8C;IACtC,kBAAkB,GAAG,CAAC,CAAC;IACd,uBAAuB,GAAG,IAAI,GAAG,EAAa,CAAC;IAE/C,YAAY,GAAG,IAAI,GAAG,EAAa,CAAC;IAC7C,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC1C,iBAAiB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAChD,gBAAgB,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC9C,cAAc,GAAG,IAAI,GAAG,EAAgB,CAAC;IACzC,uBAAuB,GAAG,IAAI,GAAG,EAAqB,CAAC;IACvD,iBAAiB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAChD,YAAY,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,UAAU,GAAe,EAAE,CAAC;IAC5B,uBAAuB,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC7C,WAAW,GAAa,EAAE,CAAC;IACpC,gBAAgB,GAAkC,IAAI,CAAC;IAEvD,6BAA6B,CAAC,OAAuB;QAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,IAAI,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QACxD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE5C,OAAO,CAAC,EAAE,CACR,yBAAyB,EACzB,CAAC,GAAG,EAAE,EAAE;YACN,KAAK,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC9D,CAAC,CACF,CAAC;QACF,OAAO,CAAC,EAAE,CACR,2BAA2B,EAC3B,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QACjE,CAAC,CACF,CAAC;QACF,OAAO,CAAC,EAAE,CACR,wBAAwB,EACxB,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,MAAM,CACjB,KAAa,EACb,IAKC;QAED,MAAM,WAAW,GAAG,KAAK,IAAI,EAAE;YAC7B,MAAM,IAAI,GAAG,MAAM,sBAAa,CAAC,OAAO,CAAC,KAAK,EAAE;gBAC9C,OAAO,EAAE,IAAI,EAAE,UAAU;aAC1B,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,SAAS,CACvB,IAAI,EACJ,IAAI,EAAE,GAAG,IAAI,OAAO,EACpB,IAAI,EAAE,SAAS,IAAI,IAAI,EACvB,IAAI,EAAE,yBAAyB,IAAI,IAAI,CACxC,CAAC;YACF,MAAM,GAAG,CAAC,SAAS,EAAE,CAAC;YACtB,MAAM,GAAG,CAAC,uBAAuB,CAAC,6BAA6B,EAAE,CAAC,CAAC;YACnE,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QAEF,MAAM,YAAY,GAChB,IAAI,EAAE,GAAG,KAAK,aAAa;YACzB,CAAC,CAAC,IAAA,kCAAe,EAAC,gCAAgC,CAAC;YACnD,CAAC,CAAC,SAAS,CAAC;QAEhB,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,MAAM,cAAc,GAAG,WAAW,EAAE,CAAC;YACrC,MAAM,OAAO,GAAG,IAAA,8BAAW,EACzB,cAAc,EACd,YAAY,EACZ,yBAAyB,CAC1B,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACd,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM,GAAG,CAAC;YACZ,CAAC,CAAC,CAAC;YACH,cAAc;iBACX,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;gBACZ,IAAI,QAAQ;oBAAE,KAAK,GAAG,CAAC,KAAK,EAAE,CAAC;YACjC,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACnB,OAAO,MAAM,OAAO,CAAC;QACvB,CAAC;QAED,OAAO,MAAM,WAAW,EAAE,CAAC;IAC7B,CAAC;IAEO,eAAe;QACrB,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACvD,IAAI,UAAU,KAAK,MAAM,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC9D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,SAAiB;QACrD,IAAI,IAAI,CAAC,eAAe,EAAE;YAAE,OAAO;QAEnC,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,YAAY,2BAAY,CAAC,EAAE,CAAC;gBACnC,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,IAAA,oBAAQ,EAAC;gBACP,QAAQ,EAAE,KAAK;gBACf,OAAO,EACL,iFAAiF;gBACnF,KAAK,EAAE,CAAC;aACT,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACpC,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,wBAAwB,CAAC,SAAiB;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,kEAAkE;YAClE,uDAAuD;YACvD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAC7C,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;oBACrB,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACtC,IAAI,CAAC;wBAAE,OAAO;gBAChB,CAAC;YACH,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,IAAI,2BAAY,CAAC,uCAAuC,EAAE,SAAS,CAAC,CAAC;IAC7E,CAAC;IAEO,KAAK,CAAC,6BAA6B,CACzC,SAAqB,EACrB,SAAS,GAAG,IAAI;QAEhB,IAAI,CAAC,SAAS,CAAC,MAAM;YAAE,OAAO;QAC9B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,OAAO,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7C,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAChC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,IAAI;gBAAE,OAAO;YAC1B,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,IAAA,oBAAQ,EAAC;gBACP,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,4DAA4D;gBACrE,KAAK,EAAE,CAAC;gBACR,SAAS,EAAE;oBACT,gBAAgB,EAAE;wBAChB,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBAC1C,IAAI,EAAE,QAAQ;qBACf;iBACF;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,OAAuB;QACjD,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO,IAAI,CAAC;QAEhD,MAAM,SAAS,GAAG,MAAM,IAAA,wCAA2B,EAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,0DAA0D;IAClD,WAAW,CAAC,GAAa;QAC/B,4BAA4B;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,kEAAkE;IAC1D,gBAAgB,CAAC,GAAa;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,2EAA2E;IACpE,UAAU;QACf,oCAAoC;QACpC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;YAChC,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,CAAC;gBAAE,OAAO,CAAC,CAAC;YAChB,8BAA8B;YAC9B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,2DAA2D;QAC3D,IAAI,SAA+B,CAAC;QACpC,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;QAClB,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvC,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;gBAClB,QAAQ,GAAG,EAAE,CAAC;gBACd,SAAS,GAAG,GAAG,CAAC;YAClB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,CAAC;IAED,kFAAkF;IAC3E,aAAa,CAAC,IAAU;QAC7B,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAA,oBAAQ,EAAC;oBACP,QAAQ,EAAE,KAAK;oBACf,OAAO,EAAE,wCAAwC;oBACjD,KAAK,EAAE,CAAC;oBACR,SAAS,EAAE;wBACT,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACtD;iBACF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,QAAQ,GAAG,MAAM,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAE3B,mEAAmE;QACnE,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;IAEM,KAAK,CAAC,aAAa,CACxB,MAA6B,EAC7B,GAAS;QAET,MAAM,MAAM,GAAG,MAAM,IAAA,0CAAyB,EAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO;QAC9C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC9B,OAA+B;QAE/B,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,gBAAgB,GAAG,WAAW,CAAC;QAEpC,MAAM,QAAQ,GAAqB,EAAE,CAAC;QACtC,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,OAAO;gBAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO;QAE7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAC7B,MAAM,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YACrC,MAAM,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE;gBAChD,OAAO,EAAE,WAAW;aACrB,CAAC,CAAC;QACL,CAAC,CAAC,CACH,CAAC;QAEF,MAAM,QAAQ,GAAG,OAAO;aACrB,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;aAC9D,MAAM,CACL,CACE,KAAK,EAIL,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,UAAU,CACxC;aACA,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACb,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,MAAe,CAAC;YAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,SAAS,CAAC;YAC1C,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;YAClD,OAAO,WAAW,GAAG,UAAU,OAAO,EAAE,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEL,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,gDAAiC,CAAC,QAAQ,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,MAAM,IAAI,GAA0D,EAAE,CAAC;QACvE,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE,CAAC;gBAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAClC,IAAU,EACV,IAA6B;QAE7B,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;YACnB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,wBAAwB,CAAC,OAAe;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,6BAA6B,CACjC,eAAuB;QAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,gCAAiB,CAAC,eAAe,eAAe,EAAE,CAAC,CAAC;QAC1E,OAAO,KAAK,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACpD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,OAAO,CAAC,GAAG,GAAG,aAAa;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC;QAC/C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CACvC,qBAAqB;QACrB,kFAAkF;QAClF,EAAE,GAAG,EAAE,aAAa,EAAE,CACvB,CAAC;QACF,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC1D,6BAA6B;QAC7B,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAE5E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QACnC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC9C,IAAI,IAAI,EAAE,CAAC;gBACT,4EAA4E;gBAC5E,+EAA+E;gBAC/E,IAAI,SAAS,KAAK,aAAa,EAAE,CAAC;oBAChC,0EAA0E;oBAC1E,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;oBAC/B,KAAK,IAAI;yBACN,OAAO,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;yBAC5C,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,MAAM,IAAI,2BAAY,CAAC,iCAAiC,QAAQ,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAC3B,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,SAAS;QACrB,4CAA4C;QAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,CACV,yBAAyB,EACzB,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/D,CAAC,CACF,CAAC;QAEF,+DAA+D;QAC/D,IAAI,CAAC,IAAI,CAAC,EAAE,CACV,2BAA2B,EAC3B,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QACjE,CAAC,CACF,CAAC;QAEF,mDAAmD;QACnD,IAAI,CAAC,IAAI,CAAC,EAAE,CACV,wBAAwB,EACxB,CAAC,GAAG,EAAE,EAAE;YACN,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,EAAE,CACV,sBAAsB,EACtB,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC;YAC5B,wCAAwC;YACxC,MAAM,EAAE,GAAG,IAAI,CAAC;YAChB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,EAAE,EAAE,QAAQ,IAAI,EAAE,EAAE,aAAa,CAAC,EAAE,CAAC;gBAChE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC,CACF,CAAC;QAEF,sFAAsF;QACtF,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAEnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,CAAC,QAAQ;gBAAE,SAAS,CAAC,0CAA0C;YACpE,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;QACH,CAAC;QAED,MAAM,iBAAiB,GAAG,OAAO;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC1B,MAAM,IAAI,CAAC,6BAA6B,CAAC,iBAAiB,CAAC,CAAC;IAC9D,CAAC;IAED;;;;;;;OAOG;IACK,KAAK,CAAC,kBAAkB,CAC9B,IAAgC,EAChC,SAAoB;QAEpB,6EAA6E;QAC7E,iEAAiE;QACjE,uEAAuE;QACvE,wEAAwE;QACxE,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACxE,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,aAAa;QACb,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,OAAO;QAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEjC,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAC,CAAC;QAE5C,oFAAoF;QACpF,+CAAiB,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QAEzC,sEAAsE;QACtE,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;YACvC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,oEAAoE;YACpE,gDAAgD;YAChD,MAAM,OAAO,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACxE,CAAC,CAAC;QAEF,yCAAyC;QACzC,iFAAiF;QACjF,8BAA8B;QAC9B,mDAAmD;QACnD,yEAAyE;QACzE,4DAA4D;QAC5D,uEAAuE;QACvE,0BAA0B;QAC1B,0BAA0B;QAC1B,MAAM,cAAc,GAAG,CACrB,MAAc,EACd,MAAe,EACf,KAAwC,EACxC,EAAE;YACF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI;iBACzB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC;iBAChD,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;iBAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YACtB,MAAM,QAAQ,GAAG,OAAO;iBACrB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;iBACpB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;iBAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;QAClC,CAAC,CAAC;QACF,MAAM,aAAa,GAGd,EAAE,CAAC;QACR,+BAA+B;QAC/B,oBAAoB;QACpB,0DAA0D;QAC1D,2BAA2B;QAC3B,gEAAgE;QAChE,MAAM,gBAAgB,GAAG;YACvB,cAAc,CAAC,aAAa,CAAC;YAC7B,cAAc,CAAC,gBAAgB,CAAC;YAChC,cAAc,CAAC,sBAAsB,EAAE;gBACrC,UAAU,EAAE,IAAI;gBAChB,sBAAsB,EAAE,IAAI;gBAC5B,OAAO,EAAE,IAAI;aACd,CAAC;SACH,CAAC;QACF,MAAM,kBAAkB,GAGnB,EAAE,CAAC;QACR,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC7C,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC1D,kBAAkB,CAAC,IAAI,CACrB,cAAc,CAAC,6BAA6B,EAAE,EAAE,OAAO,EAAE,CAAC,CAC3D,CAAC;QACJ,CAAC;QACD,4DAA4D;QAC5D,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YAC5B,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACtC,aAAa,CAAC,IAAI,CAChB,cAAc,CACZ,uCAAuC,EACvC;oBACE,MAAM;oBACN,cAAc,EAAE,IAAI;iBACrB,EACD,CAAC,UAAU,EAAE,EAAE,CACZ,UAA8C,EAAE,MAAM;oBACvD,MAAM,CACT,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,MAAM,gBAAgB,GAAG,cAAc,CACrC,uCAAuC,EACvC;YACE,MAAM,EAAE,oCAAe;YACvB,cAAc,EAAE,IAAI;SACrB,EACD,CAAC,UAAU,EAAE,EAAE,CACZ,UAA8C,EAAE,MAAM;YACvD,oCAAe,CAClB,CAAC;QACF,MAAM,mBAAmB,GAAG,CAC1B,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC;YAC9C,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC;YAChD,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC;YAC3C,gBAAgB,CAAC,UAAU;SAC5B,CAAC,CACH,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjB,sEAAsE;QACtE,MAAM,QAAQ,GAAG,cAAc,CAAC,iCAAiC,CAAC,CAAC;QACnE,MAAM,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACvD,QAAQ,CAAC,UAAU;YACnB,QAAQ,CAAC,QAAQ;SAClB,CAAC,CAAC;QACH,MAAM,CACJ,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACrB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YACtD,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YACnD,gBAAgB,CAAC,QAAQ;SAC1B,CAAC,CAAC;QACH,yEAAyE;QACzE,yEAAyE;QACzE,KAAK,aAAa,CAAC;QACnB,IAAI,CAAC,mBAAmB,IAAI,CAAC,iBAAiB,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7D,sEAAsE;YACtE,0EAA0E;YAC1E,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAA,oBAAQ,EAAC;oBACP,QAAQ,EAAE,KAAK;oBACf,OAAO,EAAE,yCAAyC;oBAClD,KAAK,EAAE,CAAC;oBACR,SAAS,EAAE;wBACT,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;wBAC1D,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACxD,mBAAmB,EAAE;4BACnB,KAAK,EAAE,MAAM,CAAC,mBAAmB,CAAC;4BAClC,IAAI,EAAE,QAAQ;yBACf;wBACD,iBAAiB,EAAE;4BACjB,KAAK,EAAE,MAAM,CAAC,iBAAiB,CAAC;4BAChC,IAAI,EAAE,QAAQ;yBACf;wBACD,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACxD;iBACF,CAAC,CAAC;YACL,CAAC;YACD,OAAO;QACT,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,gBAAgB,GACpB,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEjE,IAAI,CAAC;YACH,yEAAyE;YACzE,kCAAkC;YAClC,KAAK,OAAO;iBACT,IAAI,CAAC,gCAAgC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;iBACzD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAEnB,qBAAqB;YACrB,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAI,IAAI,GAAgB,IAAI,CAAC;gBAC7B,IAAI,WAAoB,CAAC;gBACzB,uEAAuE;gBACvE,wEAAwE;gBACxE,gDAAgD;gBAChD,IAAI,CAAC;oBACH,IAAI,GAAG,MAAM,cAAI,CAAC,MAAM,CACtB,IAAI,CAAC,IAAI,EACT,OAAO,EACP,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,yBAAyB,EAC9B,IAAI,CAAC,GAAG,KAAK,aAAa,CAC3B,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,WAAW,GAAG,KAAK,CAAC;gBACtB,CAAC;gBACD,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,IAAA,oBAAQ,EAAC;wBACP,QAAQ,EAAE,KAAK;wBACf,OAAO,EAAE,iCAAiC;wBAC1C,KAAK,EAAE,CAAC;wBACR,SAAS,EAAE;4BACT,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC1D,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACxD,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC5D,KAAK,EAAE;gCACL,KAAK,EAAE,MAAM,CACX,WAAW,YAAY,KAAK;oCAC1B,CAAC,CAAC,WAAW,CAAC,OAAO;oCACrB,CAAC,CAAC,WAAW,CAChB;gCACD,IAAI,EAAE,QAAQ;6BACf;yBACF;qBACF,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC7C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAC5C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC9D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC3C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;gBAClD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC7C,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/C,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACxD,CAAC;gBACD,MAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvE,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACnD,IAAI,CAAC,cAAc,CAAC,cAAc,IAAI,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;gBACtD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC/C,IAAI,oBAAoB,EAAE,CAAC;oBACzB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACxC,CAAC;gBACD,sEAAsE;gBACtE,wEAAwE;gBACxE,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE;oBACtC,QAAQ,EAAE,gBAAgB;iBAC3B,CAAC,CAAC;gBACH,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC1B,KAAK,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACnD,CAAC;gBAED,OAAO;YACT,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YAC1E,IAAI,CAAC,YAAY;gBAAE,OAAO;YAE1B,yBAAyB;YACzB,IAAI,CAAC;gBACH,MAAM,EAAE,SAAS,EAAE,GACjB,MAAM,OAAO,CAAC,IAAI,CAChB,mBAAmB,CACpB,CAAC;gBACJ,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAEvC,wEAAwE;gBACxE,IAAI,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACjD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC;wBAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;wBACpD,MAAM,GAAG,GAAG,CAAC,SAAS,IAAI,CAAC,CAA0B;4BACnD,IAAI,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,WAAW;gCAAE,OAAO,IAAI,CAAC;4BAC5C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,EAAE;gCAAE,IAAI,IAAI,CAAC,CAAC,CAAC;oCAAE,OAAO,IAAI,CAAC;4BAC9D,OAAO,KAAK,CAAC;wBACf,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;wBACT,IAAI,GAAG,EAAE,CAAC;4BACR,KAAK,GAAG,CAAC,CAAC;4BACV,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;oBAC9C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;oBAC5C,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;oBAChD,wEAAwE;oBACxE,iDAAiD;oBACjD,KAAK,+CAAiB;yBACnB,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;yBACtC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACrB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;gBAC3D,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,yDAAyD;gBACzD,sDAAsD;YACxD,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,oBAAoB,CAC1B,SAAoB,EACpB,QAAuB;QAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACnD,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACpC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QAED,IAAI,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CACjC,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,CACvC,EAAE,CAAC;YACF,IAAI,GAAG,KAAK,SAAS;gBAAE,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClE,CAAC;QAED,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,QAAkB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEnC,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACnE,IAAI,CAAC,KAAK,IAAI;gBAAE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC;QAED,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YACvE,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI;gBAAE,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED;;;OAGG;IACK,wBAAwB,CAAC,SAAoB,EAAE,KAAW;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,OAAO,CAAC,EAAE,CACR,oBAAoB,EACpB,CAAC,GAAG,EAAE,EAAE;YACN,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC;YAEvC,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,aAAa,IAAI,IAAI,EAAE,OAAO,CAAC,CAAC;YAE/D,2DAA2D;YAC3D,MAAM,qBAAqB,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxE,IAAI,qBAAqB,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;gBAC1D,IAAI,KAAK,EAAE,CAAC;oBACV,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBACxC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;oBAC3C,8DAA8D;oBAC9D,IAAI,CAAC,wBAAwB,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;gBAC9D,CAAC;gBACD,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;YAED,kEAAkE;YAClE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAExC,4DAA4D;YAC5D,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;gBACpC,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBACnD,IAAI,WAAW,EAAE,CAAC;oBAChB,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;gBACnD,CAAC;gBACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CACF,CAAC;QAEF,OAAO,CAAC,EAAE,CACR,oBAAoB,EACpB,CAAC,GAAG,EAAE,EAAE;YACN,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC;YAC3D,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC,CACF,CAAC;QAEF,OAAO,CAAC,EAAE,CACR,qBAAqB,EACrB,CAAC,GAAG,EAAE,EAAE;YACN,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC,CACF,CAAC;QAEF,OAAO,CAAC,EAAE,CACR,8BAA8B,EAC9B,CAAC,GAAG,EAAE,EAAE;YACN,KAAK,CAAC,yBAAyB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACjE,CAAC,CACF,CAAC;QAEF,yDAAyD;QACzD,OAAO,CAAC,EAAE,CAAgC,iBAAiB,EAAE,GAAG,EAAE;YAChE,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,SAAoB,EAAE,KAAW;QAC9D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,IAAU;QACnC,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,IAAI;gBAAE,OAAO,GAAG,CAAC;QAC7B,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,SAAkB;QACtC,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,SAAS,GAAG,SAAS,IAAI,cAAc,CAAC;QACxC,oEAAoE;QACpE,4EAA4E;QAC5E,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,cAAc,GAAG,GAAG,GAAG,IAAI,CAAC,kBAAkB,IAAI,cAAc,CAAC;QAEvE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,CAAC,cAAc,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;QAEnD,MAAM,QAAQ,GAAG,GAAG,GAAG,SAAS,CAAC;QACjC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC7B,kCAAkC;YAClC,IAAI,SAA+B,CAAC;YACpC,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;YAClB,KAAK,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvC,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAI,EAAE,GAAG,QAAQ,EAAE,CAAC;oBAClB,QAAQ,GAAG,EAAE,CAAC;oBACd,SAAS,GAAG,GAAG,CAAC;gBAClB,CAAC;YACH,CAAC;YACD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAC5C,IAAI,CAAC,IAAI,QAAQ,IAAI,IAAI,CAAC,kBAAkB;oBAAE,OAAO,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,SAAS;YAAE,OAAO,SAAS,CAAC;QAChC,MAAM,IAAI,gCAAiB,CAAC,oCAAoC,CAAC,CAAC;IACpE,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CAAC,IAAwB;QACpC,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEtE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAErC,oBAAoB,CAAC,CAAC;QAEzB,MAAM,MAAM,GAAa,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,QAAQ,EAAG,CAAC,CAAC,QAA+B,IAAI,KAAK;SACtD,CAAC,CAAC,CAAC;QAEJ,OAAO,IAAA,0BAAa,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,UAAU,CAAC,OAAsB;QACrC,MAAM,UAAU,GAAG,IAAA,kCAAqB,EAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,UAAU,CAAC,MAAM;YAAE,OAAO;QAE/B,MAAM,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,6BAAgB,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAChE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,IAAI,6BAAc,CACtB,0BAA0B,KAAK,MAAM;gBACnC,oGAAoG;gBACpG,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5C,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,YAAY,CAAC,OAA4B;QAC7C,MAAM,SAAS,GACb,OAAO,EAAE,IAAI,KAAK,SAAS;YAC3B,OAAO,EAAE,MAAM,KAAK,SAAS;YAC7B,OAAO,EAAE,IAAI,KAAK,SAAS,CAAC;QAE9B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,mEAAmE;YACnE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAA,gCAAmB,EAAC,CAAC,EAAE,OAAQ,CAAC,CAAC,CAAC;QAExE,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM;YAAE,OAAO;QAE7C,2EAA2E;QAC3E,gEAAgE;QAChE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7C,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE;oBACzC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,6BAAgB,CAAC;iBACtC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChE,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC1D,MAAM,IAAI,6BAAc,CACtB,+DAA+D,MAAM,CAAC,MAAM,GAAG;oBAC7E,2BAA2B,KAAK,0CAA0C;oBAC1E,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAC3C,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;CACF;AApjCD,8BAojCC","sourcesContent":["// lib/v3/understudy/context.ts\nimport type { Protocol } from \"devtools-protocol\";\nimport { v3Logger } from \"../logger.js\";\nimport { CdpConnection, CDPSessionLike } from \"./cdp.js\";\nimport { Page } from \"./page.js\";\nimport { installV3PiercerIntoSession } from \"./piercer.js\";\nimport { v3ScriptContent } from \"../dom/build/scriptV3Content.js\";\nimport { executionContexts } from \"./executionContextRegistry.js\";\nimport type { StagehandAPIClient } from \"../api.js\";\nimport { LocalBrowserLaunchOptions } from \"../types/public/index.js\";\nimport { InitScriptSource } from \"../types/private/index.js\";\nimport { normalizeInitScriptSource } from \"./initScripts.js\";\nimport {\n TimeoutError,\n CookieSetError,\n PageNotFoundError,\n StagehandSetExtraHTTPHeadersError,\n} from \"../types/public/sdkErrors.js\";\nimport { getEnvTimeoutMs, withTimeout } from \"../timeoutConfig.js\";\nimport {\n filterCookies,\n normalizeCookieParams,\n cookieMatchesFilter,\n toCdpCookieParam,\n} from \"./cookies.js\";\nimport {\n Cookie,\n ClearCookieOptions,\n CookieParam,\n} from \"../types/public/context.js\";\n\ntype TargetId = string;\ntype SessionId = string;\n\ntype TargetType = \"page\" | \"iframe\" | string;\n\n/**\n * Returns true when the target's URL points to a document with a real,\n * pierceable HTML DOM. We allowlist the small set of schemes that carry\n * web content rather than trying to blacklist every internal browser scheme\n * (chrome://, chrome-extension://, devtools://, brave://, edge://, …).\n */\nfunction hasInjectableDOM(url: string | undefined): boolean {\n if (!url || url === \"\") return true;\n if (\n url === \"about:blank\" ||\n url === \"about:srcdoc\" ||\n url.startsWith(\"about:blank#\")\n )\n return true;\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) return true;\n if (\n url.startsWith(\"data:\") ||\n url.startsWith(\"blob:\") ||\n url.startsWith(\"file://\") ||\n url.startsWith(\"filesystem:\")\n )\n return true;\n return false;\n}\n\nfunction isNonWebTarget(info: Protocol.Target.TargetInfo): boolean {\n return (\n (info.type !== \"page\" && info.type !== \"iframe\") ||\n !hasInjectableDOM(info.url)\n );\n}\n\nfunction isTopLevelPage(info: Protocol.Target.TargetInfo): boolean {\n const ti = info as unknown as { subtype?: string };\n return info.type === \"page\" && ti.subtype !== \"iframe\";\n}\n\nconst DEFAULT_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS = 5000;\nconst CI_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS = 30000;\nconst FIRST_TOP_LEVEL_PAGE_TIMEOUT_ENV =\n \"STAGEHAND_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS\";\nconst WAIT_FOR_FIRST_TOP_LEVEL_PAGE_OPERATION =\n \"waitForFirstTopLevelPage (no top-level Page)\";\n\nfunction getFirstTopLevelPageTimeoutMs(): number {\n return (\n getEnvTimeoutMs(FIRST_TOP_LEVEL_PAGE_TIMEOUT_ENV) ??\n (process.env.CI\n ? CI_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS\n : DEFAULT_FIRST_TOP_LEVEL_PAGE_TIMEOUT_MS)\n );\n}\n\n/**\n * V3Context\n *\n * Owns the root CDP connection and wires Target/Page events into Page.\n * Maintains one Page per top-level target, adopts OOPIF child sessions into the owner Page,\n * and tracks target→page and (root) frame→target mappings for lookups.\n *\n * IMPORTANT: FrameId → session ownership is managed inside Page (via its FrameRegistry).\n * Context never “guesses” owners; it simply forwards events (with the emitting session)\n * so Page can record the correct owner at event time.\n */\nexport class V3Context {\n private constructor(\n readonly conn: CdpConnection,\n private readonly env: \"LOCAL\" | \"BROWSERBASE\" = \"LOCAL\",\n private readonly apiClient: StagehandAPIClient | null = null,\n private readonly localBrowserLaunchOptions: LocalBrowserLaunchOptions | null = null,\n ) {}\n\n private readonly _piercerInstalled = new Set<string>();\n // Timestamp for most recent popup/open signal\n private _lastPopupSignalAt = 0;\n private readonly _targetSessionListeners = new Set<SessionId>();\n\n private readonly _sessionInit = new Set<SessionId>();\n private pagesByTarget = new Map<TargetId, Page>();\n private mainFrameToTarget = new Map<string, TargetId>();\n private sessionOwnerPage = new Map<SessionId, Page>();\n private frameOwnerPage = new Map<string, Page>();\n private pendingOopifByMainFrame = new Map<string, SessionId>();\n private createdAtByTarget = new Map<TargetId, number>();\n private typeByTarget = new Map<TargetId, TargetType>();\n private _pageOrder: TargetId[] = [];\n private pendingCreatedTargetUrl = new Map<TargetId, string>();\n private readonly initScripts: string[] = [];\n private extraHttpHeaders: Record<string, string> | null = null;\n\n private installTargetSessionListeners(session: CDPSessionLike): void {\n const sessionId = session.id;\n if (!sessionId) return;\n if (this._targetSessionListeners.has(sessionId)) return;\n this._targetSessionListeners.add(sessionId);\n\n session.on<Protocol.Target.AttachedToTargetEvent>(\n \"Target.attachedToTarget\",\n (evt) => {\n void this.onAttachedToTarget(evt.targetInfo, evt.sessionId);\n },\n );\n session.on<Protocol.Target.DetachedFromTargetEvent>(\n \"Target.detachedFromTarget\",\n (evt) => {\n this.onDetachedFromTarget(evt.sessionId, evt.targetId ?? null);\n },\n );\n session.on<Protocol.Target.TargetDestroyedEvent>(\n \"Target.targetDestroyed\",\n (evt) => {\n this.cleanupByTarget(evt.targetId);\n },\n );\n }\n\n /**\n * Create a Context for a given CDP websocket URL and bootstrap target wiring.\n */\n static async create(\n wsUrl: string,\n opts?: {\n env?: \"LOCAL\" | \"BROWSERBASE\";\n apiClient?: StagehandAPIClient | null;\n localBrowserLaunchOptions?: LocalBrowserLaunchOptions | null;\n cdpHeaders?: Record<string, string>;\n },\n ): Promise<V3Context> {\n const connectTask = async () => {\n const conn = await CdpConnection.connect(wsUrl, {\n headers: opts?.cdpHeaders,\n });\n const ctx = new V3Context(\n conn,\n opts?.env ?? \"LOCAL\",\n opts?.apiClient ?? null,\n opts?.localBrowserLaunchOptions ?? null,\n );\n await ctx.bootstrap();\n await ctx.ensureFirstTopLevelPage(getFirstTopLevelPageTimeoutMs());\n return ctx;\n };\n\n const cdpTimeoutMs =\n opts?.env === \"BROWSERBASE\"\n ? getEnvTimeoutMs(\"BROWSERBASE_CDP_CONNECT_MAX_MS\")\n : undefined;\n\n if (cdpTimeoutMs) {\n let timedOut = false;\n const connectPromise = connectTask();\n const guarded = withTimeout(\n connectPromise,\n cdpTimeoutMs,\n \"Browserbase CDP connect\",\n ).catch((err) => {\n timedOut = true;\n throw err;\n });\n connectPromise\n .then((ctx) => {\n if (timedOut) void ctx.close();\n })\n .catch(() => {});\n return await guarded;\n }\n\n return await connectTask();\n }\n\n private hasTopLevelPage(): boolean {\n for (const [targetId, targetType] of this.typeByTarget) {\n if (targetType === \"page\" && this.pagesByTarget.has(targetId)) {\n return true;\n }\n }\n return false;\n }\n\n private async ensureFirstTopLevelPage(timeoutMs: number): Promise<void> {\n if (this.hasTopLevelPage()) return;\n\n try {\n await this.waitForFirstTopLevelPage(timeoutMs);\n return;\n } catch (err) {\n if (!(err instanceof TimeoutError)) {\n throw err;\n }\n v3Logger({\n category: \"ctx\",\n message:\n \"No open browser pages found after connect; creating an initial about:blank page\",\n level: 1,\n });\n }\n\n await this.newPage(\"about:blank\");\n }\n\n /**\n * Wait until at least one top-level Page has been created and registered.\n * We poll internal maps that bootstrap/onAttachedToTarget populate.\n */\n private async waitForFirstTopLevelPage(timeoutMs: number): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n // A top-level Page is present if typeByTarget has an entry \"page\"\n // and pagesByTarget has the corresponding Page object.\n for (const [tid, ttype] of this.typeByTarget) {\n if (ttype === \"page\") {\n const p = this.pagesByTarget.get(tid);\n if (p) return;\n }\n }\n await new Promise((r) => setTimeout(r, 25));\n }\n throw new TimeoutError(WAIT_FOR_FIRST_TOP_LEVEL_PAGE_OPERATION, timeoutMs);\n }\n\n private async waitForInitialTopLevelTargets(\n targetIds: TargetId[],\n timeoutMs = 3000,\n ): Promise<void> {\n if (!targetIds.length) return;\n const pending = new Set(targetIds);\n const deadline = Date.now() + timeoutMs;\n while (pending.size && Date.now() < deadline) {\n for (const tid of Array.from(pending)) {\n if (this.pagesByTarget.has(tid)) {\n pending.delete(tid);\n }\n }\n if (!pending.size) return;\n await new Promise((r) => setTimeout(r, 25));\n }\n if (pending.size) {\n v3Logger({\n category: \"ctx\",\n message: \"Timed out waiting for existing top-level targets to attach\",\n level: 2,\n auxiliary: {\n remainingTargets: {\n value: JSON.stringify(Array.from(pending)),\n type: \"object\",\n },\n },\n });\n }\n }\n\n private async ensurePiercer(session: CDPSessionLike): Promise<boolean> {\n const id = session.id ?? \"\";\n if (this._piercerInstalled.has(id)) return true;\n\n const installed = await installV3PiercerIntoSession(session);\n if (installed) {\n this._piercerInstalled.add(id);\n }\n return installed;\n }\n\n /** Mark a page target as the most-recent one (active). */\n private _pushActive(tid: TargetId): void {\n // remove prior entry if any\n const i = this._pageOrder.indexOf(tid);\n if (i !== -1) this._pageOrder.splice(i, 1);\n this._pageOrder.push(tid);\n }\n\n /** Remove a page target from the recency list (used on close). */\n private _removeFromOrder(tid: TargetId): void {\n const i = this._pageOrder.indexOf(tid);\n if (i !== -1) this._pageOrder.splice(i, 1);\n }\n\n /** Return the current active Page (most-recent page that still exists). */\n public activePage(): Page | undefined {\n // prune any stale ids from the tail\n for (let i = this._pageOrder.length - 1; i >= 0; i--) {\n const tid = this._pageOrder[i]!;\n const p = this.pagesByTarget.get(tid);\n if (p) return p;\n // stale — remove and continue\n this._pageOrder.splice(i, 1);\n }\n // fallback: pick the newest by createdAt if order is empty\n let newestTid: TargetId | undefined;\n let newestTs = -1;\n for (const [tid] of this.pagesByTarget) {\n const ts = this.createdAtByTarget.get(tid) ?? 0;\n if (ts > newestTs) {\n newestTs = ts;\n newestTid = tid;\n }\n }\n return newestTid ? this.pagesByTarget.get(newestTid) : undefined;\n }\n\n /** Explicitly mark a known Page as the most-recent active page (and focus it). */\n public setActivePage(page: Page): void {\n let targetId = page.targetId();\n if (this.pagesByTarget.get(targetId) !== page) {\n const lookup = this.findTargetIdByPage(page);\n if (!lookup) {\n v3Logger({\n category: \"ctx\",\n message: \"setActivePage called with unknown Page\",\n level: 2,\n auxiliary: {\n targetId: { value: String(targetId), type: \"string\" },\n },\n });\n return;\n }\n targetId = lookup;\n }\n\n this._pushActive(targetId);\n\n // Bring the tab to the foreground in headful Chrome (best effort).\n void this.conn.send(\"Target.activateTarget\", { targetId }).catch(() => {});\n }\n\n public async addInitScript<Arg>(\n script: InitScriptSource<Arg>,\n arg?: Arg,\n ): Promise<void> {\n const source = await normalizeInitScriptSource(script, arg);\n if (this.initScripts.includes(source)) return;\n this.initScripts.push(source);\n const pages = this.pages();\n await Promise.all(pages.map((page) => page.registerInitScript(source)));\n }\n\n public async setExtraHTTPHeaders(\n headers: Record<string, string>,\n ): Promise<void> {\n const nextHeaders = { ...headers };\n this.extraHttpHeaders = nextHeaders;\n\n const sessions: CDPSessionLike[] = [];\n for (const sessionId of this._sessionInit) {\n const session = this.conn.getSession(sessionId);\n if (session) sessions.push(session);\n }\n\n if (!sessions.length) return;\n\n const results = await Promise.allSettled(\n sessions.map(async (session) => {\n await session.send(\"Network.enable\");\n await session.send(\"Network.setExtraHTTPHeaders\", {\n headers: nextHeaders,\n });\n }),\n );\n\n const failures = results\n .map((result, index) => ({ result, session: sessions[index] }))\n .filter(\n (\n entry,\n ): entry is {\n result: PromiseRejectedResult;\n session: CDPSessionLike;\n } => entry.result.status === \"rejected\",\n )\n .map((entry) => {\n const reason = entry.result.reason as Error;\n const sid = entry.session.id ?? \"unknown\";\n const message = reason?.message ?? String(reason);\n return `session=${sid} error=${message}`;\n });\n\n if (failures.length) {\n throw new StagehandSetExtraHTTPHeadersError(failures);\n }\n }\n\n /**\n * Return top-level `Page`s (oldest → newest). OOPIF targets are not included.\n */\n pages(): Page[] {\n const rows: Array<{ tid: TargetId; page: Page; created: number }> = [];\n for (const [tid, page] of this.pagesByTarget) {\n if (this.typeByTarget.get(tid) === \"page\") {\n rows.push({ tid, page, created: this.createdAtByTarget.get(tid) ?? 0 });\n }\n }\n rows.sort((a, b) => a.created - b.created);\n return rows.map((r) => r.page);\n }\n\n private async applyInitScriptsToPage(\n page: Page,\n opts?: { seedOnly?: boolean },\n ): Promise<void> {\n if (opts?.seedOnly) {\n for (const source of this.initScripts) {\n page.seedInitScript(source);\n }\n return;\n }\n for (const source of this.initScripts) {\n await page.registerInitScript(source);\n }\n }\n\n /**\n * Resolve an owning `Page` by the **top-level main frame id**.\n * Note: child (OOPIF) roots are intentionally not present in this mapping.\n */\n resolvePageByMainFrameId(frameId: string): Page | undefined {\n const targetId = this.mainFrameToTarget.get(frameId);\n return targetId ? this.pagesByTarget.get(targetId) : undefined;\n }\n\n /**\n * Serialize the full frame tree for a given top-level main frame id.\n */\n async getFullFrameTreeByMainFrameId(\n rootMainFrameId: string,\n ): Promise<Protocol.Page.FrameTree> {\n const owner = this.resolvePageByMainFrameId(rootMainFrameId);\n if (!owner) throw new PageNotFoundError(`mainFrameId=${rootMainFrameId}`);\n return owner.asProtocolFrameTree(rootMainFrameId);\n }\n\n /**\n * Create a new top-level page (tab) with the given URL and return its Page object.\n * Waits until the target is attached and registered.\n */\n public async newPage(url = \"about:blank\"): Promise<Page> {\n const targetUrl = String(url ?? \"about:blank\");\n const { targetId } = await this.conn.send<{ targetId: string }>(\n \"Target.createTarget\",\n // Create at about:blank so init scripts can install before first real navigation.\n { url: \"about:blank\" },\n );\n this.pendingCreatedTargetUrl.set(targetId, \"about:blank\");\n // Best-effort bring-to-front\n await this.conn.send(\"Target.activateTarget\", { targetId }).catch(() => {});\n\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n const page = this.pagesByTarget.get(targetId);\n if (page) {\n // we created at about:blank; navigate only after attach so init scripts run\n // on the first real document. Fire-and-forget so newPage() resolves on attach.\n if (targetUrl !== \"about:blank\") {\n // Seed requested URL into the page cache before navigation events arrive.\n page.seedCurrentUrl(targetUrl);\n void page\n .sendCDP(\"Page.navigate\", { url: targetUrl })\n .catch(() => {});\n }\n return page;\n }\n await new Promise((r) => setTimeout(r, 25));\n }\n throw new TimeoutError(`newPage: target not attached (${targetId})`, 5000);\n }\n\n /**\n * Close CDP and clear all mappings. Best-effort cleanup.\n */\n async close(): Promise<void> {\n await this.conn.close();\n this.pagesByTarget.clear();\n this.mainFrameToTarget.clear();\n this.sessionOwnerPage.clear();\n this.frameOwnerPage.clear();\n this.pendingOopifByMainFrame.clear();\n this.createdAtByTarget.clear();\n this.typeByTarget.clear();\n this.pendingCreatedTargetUrl.clear();\n }\n\n /**\n * Bootstrap target lifecycle:\n * - Attach to existing targets.\n * - Handle auto-attach events.\n * - Clean up on detach/destroy.\n */\n private async bootstrap(): Promise<void> {\n // Live attach via auto-attach (normal path)\n this.conn.on<Protocol.Target.AttachedToTargetEvent>(\n \"Target.attachedToTarget\",\n async (evt) => {\n await this.onAttachedToTarget(evt.targetInfo, evt.sessionId);\n },\n );\n\n // Live detach (clean up session from owner page & frame graph)\n this.conn.on<Protocol.Target.DetachedFromTargetEvent>(\n \"Target.detachedFromTarget\",\n (evt) => {\n this.onDetachedFromTarget(evt.sessionId, evt.targetId ?? null);\n },\n );\n\n // Destroyed targets (fallback cleanup by targetId)\n this.conn.on<Protocol.Target.TargetDestroyedEvent>(\n \"Target.targetDestroyed\",\n (evt) => {\n this.cleanupByTarget(evt.targetId);\n },\n );\n\n this.conn.on<Protocol.Target.TargetCreatedEvent>(\n \"Target.targetCreated\",\n async (evt) => {\n const info = evt.targetInfo;\n // Note popups to help activePage settle\n const ti = info;\n if (info.type === \"page\" && (ti?.openerId || ti?.openerFrameId)) {\n this._notePopupSignal();\n }\n },\n );\n\n // Only enable auto-attach after listeners are ready so replayed targets are captured.\n await this.conn.enableAutoAttach();\n\n const targets = await this.conn.getTargets();\n for (const t of targets) {\n if (t.attached) continue; // auto-attach already handled this target\n try {\n await this.conn.attachToTarget(t.targetId);\n } catch {\n // ignore attach race\n }\n }\n\n const topLevelTargetIds = targets\n .filter((t) => isTopLevelPage(t))\n .map((t) => t.targetId);\n await this.waitForInitialTopLevelTargets(topLevelTargetIds);\n }\n\n /**\n * Handle a newly attached target (top-level or potential OOPIF):\n * - Enable Page domain and lifecycle events.\n * - If top-level → create Page, wire listeners, resume.\n * - Else → probe child root frame id via `Page.getFrameTree` and adopt immediately\n * if the parent is known; otherwise stage until parent `frameAttached`.\n * - Resume the target only after listeners are wired.\n */\n private async onAttachedToTarget(\n info: Protocol.Target.TargetInfo,\n sessionId: SessionId,\n ): Promise<void> {\n // Skip non-web targets (workers, chrome extensions, background pages, etc.).\n // They still need to be resumed so we don't leave them paused by\n // waitForDebuggerOnStart, but injecting the piercer into these targets\n // can throw or corrupt their internal state (e.g. Chrome's PDF viewer).\n if (isNonWebTarget(info)) {\n const session = this.conn.getSession(sessionId);\n if (session) {\n await session.send(\"Runtime.runIfWaitingForDebugger\").catch(() => {});\n }\n return;\n }\n\n const session = this.conn.getSession(sessionId);\n if (!session) return;\n\n // Init guard\n if (this._sessionInit.has(sessionId)) return;\n this._sessionInit.add(sessionId);\n\n this.installTargetSessionListeners(session);\n\n // Register for Runtime events before enabling it so we don't miss initial contexts.\n executionContexts.attachSession(session);\n\n // Ensure we only resume once even if multiple code paths hit finally.\n let resumed = false;\n const resume = async (): Promise<void> => {\n if (resumed) return;\n resumed = true;\n // waitForDebuggerOnStart pauses new targets; resume once we've done\n // any \"must happen before first document\" work.\n await session.send(\"Runtime.runIfWaitingForDebugger\").catch(() => {});\n };\n\n // Attach lifecycle (per target session):\n // 1) while paused, enable domains + child auto-attach and register init scripts;\n // 2) resume target execution;\n // 3) build/adopt Page ownership and frame bridges.\n // Some CDP backends defer *.enable() responses until after resume, so we\n // cannot await those responses before resuming. Instead we:\n // - wait for transport-level dispatch of required pre-resume commands;\n // - then dispatch resume;\n // - then await responses.\n const queuePreResume = (\n method: string,\n params?: object,\n match?: (sentParams?: object) => boolean,\n ) => {\n const dispatched = this.conn\n .waitForSessionDispatch(sessionId, method, match)\n .then(() => true)\n .catch(() => false);\n const response = session\n .send(method, params)\n .then(() => true)\n .catch(() => false);\n return { dispatched, response };\n };\n const initScriptOps: Array<{\n dispatched: Promise<boolean>;\n response: Promise<boolean>;\n }> = [];\n // Pre-resume ordering matters:\n // - enable domains;\n // - enable child auto-attach with waitForDebuggerOnStart;\n // - register init scripts.\n // Commands are sent in-order on the same session before resume.\n const corePreResumeOps = [\n queuePreResume(\"Page.enable\"),\n queuePreResume(\"Runtime.enable\"),\n queuePreResume(\"Target.setAutoAttach\", {\n autoAttach: true,\n waitForDebuggerOnStart: true,\n flatten: true,\n }),\n ];\n const headerPreResumeOps: Array<{\n dispatched: Promise<boolean>;\n response: Promise<boolean>;\n }> = [];\n if (this.extraHttpHeaders) {\n const headers = { ...this.extraHttpHeaders };\n headerPreResumeOps.push(queuePreResume(\"Network.enable\"));\n headerPreResumeOps.push(\n queuePreResume(\"Network.setExtraHTTPHeaders\", { headers }),\n );\n }\n // Send init scripts only after auto-attach has been queued.\n if (this.initScripts.length) {\n for (const source of this.initScripts) {\n initScriptOps.push(\n queuePreResume(\n \"Page.addScriptToEvaluateOnNewDocument\",\n {\n source,\n runImmediately: true,\n },\n (sentParams) =>\n (sentParams as { source?: string } | undefined)?.source ===\n source,\n ),\n );\n }\n }\n const piercerPreloadOp = queuePreResume(\n \"Page.addScriptToEvaluateOnNewDocument\",\n {\n source: v3ScriptContent,\n runImmediately: true,\n },\n (sentParams) =>\n (sentParams as { source?: string } | undefined)?.source ===\n v3ScriptContent,\n );\n const preResumeDispatched = (\n await Promise.all([\n ...corePreResumeOps.map((op) => op.dispatched),\n ...headerPreResumeOps.map((op) => op.dispatched),\n ...initScriptOps.map((op) => op.dispatched),\n piercerPreloadOp.dispatched,\n ])\n ).every(Boolean);\n // Dispatch resume only after pre-resume setup has actually been sent.\n const resumeOp = queuePreResume(\"Runtime.runIfWaitingForDebugger\");\n const [resumedDispatched, resumedOk] = await Promise.all([\n resumeOp.dispatched,\n resumeOp.response,\n ]);\n const [\n coreResults,\n headerResults,\n initScriptResults,\n piercerPreRegistered,\n ] = await Promise.all([\n Promise.all(corePreResumeOps.map((op) => op.response)),\n Promise.all(headerPreResumeOps.map((op) => op.response)),\n Promise.all(initScriptOps.map((op) => op.response)),\n piercerPreloadOp.response,\n ]);\n // Header propagation is independent of init-script determinism but still\n // part of pre-resume attach setup; awaited above for ordering/lifecycle.\n void headerResults;\n if (!preResumeDispatched || !resumedDispatched || !resumedOk) {\n // Short-lived child targets can detach before resume is acknowledged.\n // Keep this noisy only for top-level pages where missing attach is fatal.\n if (isTopLevelPage(info)) {\n v3Logger({\n category: \"ctx\",\n message: \"Failed target pre-resume setup ordering\",\n level: 2,\n auxiliary: {\n targetId: { value: String(info.targetId), type: \"string\" },\n targetType: { value: String(info.type), type: \"string\" },\n preResumeDispatched: {\n value: String(preResumeDispatched),\n type: \"string\",\n },\n resumedDispatched: {\n value: String(resumedDispatched),\n type: \"string\",\n },\n resumedOk: { value: String(resumedOk), type: \"string\" },\n },\n });\n }\n return;\n }\n resumed = true;\n const scriptsInstalled =\n coreResults.every(Boolean) && initScriptResults.every(Boolean);\n\n try {\n // Best-effort lifecycle events; do not block top-level page registration\n // on this optional signal stream.\n void session\n .send(\"Page.setLifecycleEventsEnabled\", { enabled: true })\n .catch(() => {});\n\n // Top-level handling\n if (isTopLevelPage(info)) {\n let page: Page | null = null;\n let createError: unknown;\n // Deterministic contract: never drop a newly attached top-level target\n // because an arbitrary local timeout fired. We wait for Page.create and\n // let it finish regardless of CDP call latency.\n try {\n page = await Page.create(\n this.conn,\n session,\n info.targetId,\n this.apiClient,\n this.localBrowserLaunchOptions,\n this.env === \"BROWSERBASE\",\n );\n } catch (error) {\n createError = error;\n }\n if (!page) {\n v3Logger({\n category: \"ctx\",\n message: \"Failed to create top-level Page\",\n level: 2,\n auxiliary: {\n targetId: { value: String(info.targetId), type: \"string\" },\n targetType: { value: String(info.type), type: \"string\" },\n targetUrl: { value: String(info.url ?? \"\"), type: \"string\" },\n error: {\n value: String(\n createError instanceof Error\n ? createError.message\n : createError,\n ),\n type: \"string\",\n },\n },\n });\n return;\n }\n this.wireSessionToOwnerPage(sessionId, page);\n this.pagesByTarget.set(info.targetId, page);\n this.mainFrameToTarget.set(page.mainFrameId(), info.targetId);\n this.sessionOwnerPage.set(sessionId, page);\n this.frameOwnerPage.set(page.mainFrameId(), page);\n this.typeByTarget.set(info.targetId, \"page\");\n if (!this.createdAtByTarget.has(info.targetId)) {\n this.createdAtByTarget.set(info.targetId, Date.now());\n }\n const pendingSeedUrl = this.pendingCreatedTargetUrl.get(info.targetId);\n this.pendingCreatedTargetUrl.delete(info.targetId);\n page.seedCurrentUrl(pendingSeedUrl ?? info.url ?? \"\");\n this._pushActive(info.targetId);\n this.installFrameEventBridges(sessionId, page);\n if (piercerPreRegistered) {\n this._piercerInstalled.add(sessionId);\n }\n // If we already installed scripts at the session level, only seed the\n // Page's registry to avoid double-installing DOMContentLoaded handlers.\n await this.applyInitScriptsToPage(page, {\n seedOnly: scriptsInstalled,\n });\n if (!piercerPreRegistered) {\n void this.ensurePiercer(session).catch(() => {});\n }\n\n return;\n }\n\n const piercerReady = await this.ensurePiercer(session).catch(() => false);\n if (!piercerReady) return;\n\n // Child (iframe / OOPIF)\n try {\n const { frameTree } =\n await session.send<Protocol.Page.GetFrameTreeResponse>(\n \"Page.getFrameTree\",\n );\n const childMainId = frameTree.frame.id;\n\n // Try to find owner Page now (it may already have the node in its tree)\n let owner = this.frameOwnerPage.get(childMainId);\n if (!owner) {\n for (const p of this.pagesByTarget.values()) {\n const tree = p.asProtocolFrameTree(p.mainFrameId());\n const has = (function find(n: Protocol.Page.FrameTree): boolean {\n if (n.frame.id === childMainId) return true;\n for (const c of n.childFrames ?? []) if (find(c)) return true;\n return false;\n })(tree);\n if (has) {\n owner = p;\n break;\n }\n }\n }\n\n if (owner) {\n owner.adoptOopifSession(session, childMainId);\n this.sessionOwnerPage.set(sessionId, owner);\n this.installFrameEventBridges(sessionId, owner);\n // Prime the execution-context registry so later lookups succeed even if\n // the frame navigates before we issue a command.\n void executionContexts\n .waitForMainWorld(session, childMainId)\n .catch(() => {});\n } else {\n this.pendingOopifByMainFrame.set(childMainId, sessionId);\n }\n } catch {\n // page.getFrameTree failed. Most likely was an ad iframe\n // that opened & closed before we could attach. ignore\n }\n } finally {\n await resume();\n }\n }\n\n /**\n * Detach handler:\n * - Remove child session ownership and prune its subtree.\n * - If a top-level target, cleanup its `Page` and mappings.\n * - Drop any staged child for this session.\n */\n private onDetachedFromTarget(\n sessionId: SessionId,\n targetId: string | null,\n ): void {\n const owner = this.sessionOwnerPage.get(sessionId);\n if (owner) {\n owner.detachOopifSession(sessionId);\n this.sessionOwnerPage.delete(sessionId);\n }\n\n if (targetId && this.pagesByTarget.has(targetId)) {\n this.cleanupByTarget(targetId);\n }\n\n for (const [fid, sid] of Array.from(\n this.pendingOopifByMainFrame.entries(),\n )) {\n if (sid === sessionId) this.pendingOopifByMainFrame.delete(fid);\n }\n\n this._targetSessionListeners.delete(sessionId);\n this._sessionInit.delete(sessionId);\n this._piercerInstalled.delete(sessionId);\n }\n\n /**\n * Cleanup a top-level Page by target id, removing its root and staged children.\n */\n private cleanupByTarget(targetId: TargetId): void {\n const page = this.pagesByTarget.get(targetId);\n if (!page) return;\n\n const mainId = page.mainFrameId();\n this.mainFrameToTarget.delete(mainId);\n this.frameOwnerPage.delete(mainId);\n\n for (const [sid, p] of Array.from(this.sessionOwnerPage.entries())) {\n if (p === page) this.sessionOwnerPage.delete(sid);\n }\n\n for (const [fid] of Array.from(this.pendingOopifByMainFrame.entries())) {\n const owner = this.frameOwnerPage.get(fid);\n if (!owner || owner === page) this.pendingOopifByMainFrame.delete(fid);\n }\n\n this._removeFromOrder(targetId);\n this.pagesByTarget.delete(targetId);\n this.createdAtByTarget.delete(targetId);\n this.typeByTarget.delete(targetId);\n this.pendingCreatedTargetUrl.delete(targetId);\n }\n\n /**\n * Wire Page-domain frame events for a session into the owning Page & mappings.\n * We forward the *emitting session* with every event so Page can stamp ownership precisely.\n */\n private installFrameEventBridges(sessionId: SessionId, owner: Page): void {\n const session = this.conn.getSession(sessionId);\n if (!session) return;\n\n session.on<Protocol.Page.FrameAttachedEvent>(\n \"Page.frameAttached\",\n (evt) => {\n const { frameId, parentFrameId } = evt;\n\n owner.onFrameAttached(frameId, parentFrameId ?? null, session);\n\n // If we were waiting for this id (OOPIF child), adopt now.\n const pendingChildSessionId = this.pendingOopifByMainFrame.get(frameId);\n if (pendingChildSessionId) {\n const child = this.conn.getSession(pendingChildSessionId);\n if (child) {\n owner.adoptOopifSession(child, frameId);\n this.sessionOwnerPage.set(child.id, owner);\n // Wire bridges for the child so its Page events keep flowing.\n this.installFrameEventBridges(pendingChildSessionId, owner);\n }\n this.pendingOopifByMainFrame.delete(frameId);\n }\n\n // Track Page ownership for quick reverse lookups (debug helpers).\n this.frameOwnerPage.set(frameId, owner);\n\n // Root handoff: keep mainFrameToTarget aligned for the page\n if (!parentFrameId) {\n const newRoot = owner.mainFrameId();\n const topTargetId = this.findTargetIdByPage(owner);\n if (topTargetId) {\n this.mainFrameToTarget.set(newRoot, topTargetId);\n }\n this.frameOwnerPage.set(newRoot, owner);\n }\n },\n );\n\n session.on<Protocol.Page.FrameDetachedEvent>(\n \"Page.frameDetached\",\n (evt) => {\n owner.onFrameDetached(evt.frameId, evt.reason ?? \"remove\");\n if (evt.reason !== \"swap\") {\n this.frameOwnerPage.delete(evt.frameId);\n }\n },\n );\n\n session.on<Protocol.Page.FrameNavigatedEvent>(\n \"Page.frameNavigated\",\n (evt) => {\n owner.onFrameNavigated(evt.frame, session);\n },\n );\n\n session.on<Protocol.Page.NavigatedWithinDocumentEvent>(\n \"Page.navigatedWithinDocument\",\n (evt) => {\n owner.onNavigatedWithinDocument(evt.frameId, evt.url, session);\n },\n );\n\n // Observe window.open to anticipate default page changes\n session.on<Protocol.Page.WindowOpenEvent>(\"Page.windowOpen\", () => {\n this._notePopupSignal();\n });\n }\n\n /**\n * Register that a session belongs to a Page (used by event routing).\n */\n private wireSessionToOwnerPage(sessionId: SessionId, owner: Page): void {\n this.sessionOwnerPage.set(sessionId, owner);\n }\n\n /**\n * Utility: reverse-lookup the top-level target id that owns a given Page.\n */\n private findTargetIdByPage(page: Page): TargetId | undefined {\n for (const [tid, p] of this.pagesByTarget) {\n if (p === page) return tid;\n }\n return undefined;\n }\n\n private _notePopupSignal(): void {\n this._lastPopupSignalAt = Date.now();\n }\n\n /**\n * Await the current active page, waiting briefly if a popup/open was just triggered.\n * Normal path returns immediately; popup path waits up to timeoutMs for the new page.\n */\n async awaitActivePage(timeoutMs?: number): Promise<Page> {\n const defaultTimeout = this.env === \"BROWSERBASE\" ? 4000 : 2000;\n timeoutMs = timeoutMs ?? defaultTimeout;\n // If a popup was just triggered, Chrome (especially on Browserbase)\n // may briefly pause new targets at document start (\"waiting for debugger\").\n const recentWindowMs = this.env === \"BROWSERBASE\" ? 1000 : 300;\n const now = Date.now();\n const hasRecentPopup = now - this._lastPopupSignalAt <= recentWindowMs;\n\n const immediate = this.activePage();\n if (!hasRecentPopup && immediate) return immediate;\n\n const deadline = now + timeoutMs;\n while (Date.now() < deadline) {\n // Prefer most-recent by createdAt\n let newestTid: TargetId | undefined;\n let newestTs = -1;\n for (const [tid] of this.pagesByTarget) {\n const ts = this.createdAtByTarget.get(tid) ?? 0;\n if (ts > newestTs) {\n newestTs = ts;\n newestTid = tid;\n }\n }\n if (newestTid) {\n const p = this.pagesByTarget.get(newestTid);\n if (p && newestTs >= this._lastPopupSignalAt) return p;\n }\n await new Promise((r) => setTimeout(r, 25));\n }\n if (immediate) return immediate;\n throw new PageNotFoundError(\"awaitActivePage: no page available\");\n }\n\n /**\n * Get all browser cookies, optionally filtered by URL(s).\n *\n * When `urls` is omitted or empty every cookie in the browser context is\n * returned. When one or more URLs are supplied only cookies whose\n * domain/path/secure attributes match are included.\n */\n async cookies(urls?: string | string[]): Promise<Cookie[]> {\n const urlList = !urls ? [] : typeof urls === \"string\" ? [urls] : urls;\n\n const { cookies } = await this.conn.send<{\n cookies: Protocol.Network.Cookie[];\n }>(\"Storage.getCookies\");\n\n const mapped: Cookie[] = cookies.map((c) => ({\n name: c.name,\n value: c.value,\n domain: c.domain,\n path: c.path,\n expires: c.expires,\n httpOnly: c.httpOnly,\n secure: c.secure,\n sameSite: (c.sameSite as Cookie[\"sameSite\"]) ?? \"Lax\",\n }));\n\n return filterCookies(mapped, urlList);\n }\n\n /**\n * Add one or more cookies to the browser context.\n *\n * Each cookie must specify either a `url` (from which domain/path/secure are\n * derived) or an explicit `domain` + `path` pair.\n *\n * We surface CDP errors if the browser rejects a cookie.\n */\n async addCookies(cookies: CookieParam[]): Promise<void> {\n const normalized = normalizeCookieParams(cookies);\n if (!normalized.length) return;\n\n const cdpCookies = normalized.map(toCdpCookieParam);\n\n try {\n await this.conn.send(\"Storage.setCookies\", { cookies: cdpCookies });\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n const names = normalized.map((c) => `\"${c.name}\"`).join(\", \");\n throw new CookieSetError(\n `Failed to set cookies [${names}] — ` +\n `the browser rejected the batch. Check that the domain, path, and secure/sameSite values are valid.` +\n (detail ? ` (CDP error: ${detail})` : \"\"),\n );\n }\n }\n\n /**\n * Clear cookies from the browser context.\n *\n * - Called with no arguments: clears **all** cookies atomically via\n * `Storage.clearCookies`.\n * - Called with filter options: fetches all cookies, clears everything,\n * then re-adds only the cookies that do NOT match the filter via\n * `Storage.setCookies`. This is necessary on the browser endpoint because\n * the Storage domain does not support targeted deletes.\n */\n async clearCookies(options?: ClearCookieOptions): Promise<void> {\n const hasFilter =\n options?.name !== undefined ||\n options?.domain !== undefined ||\n options?.path !== undefined;\n\n if (!hasFilter) {\n // Atomic single-call wipe — no race condition, no O(N) roundtrips.\n await this.conn.send(\"Storage.clearCookies\");\n return;\n }\n\n const current = await this.cookies();\n const toKeep = current.filter((c) => !cookieMatchesFilter(c, options!));\n\n if (toKeep.length === current.length) return;\n\n // Storage domain doesn't support targeted deletes on the browser endpoint.\n // Clear everything, then re-add only the cookies we're keeping.\n await this.conn.send(\"Storage.clearCookies\");\n if (toKeep.length) {\n try {\n await this.conn.send(\"Storage.setCookies\", {\n cookies: toKeep.map(toCdpCookieParam),\n });\n } catch (err) {\n const detail = err instanceof Error ? err.message : String(err);\n const names = toKeep.map((c) => `\"${c.name}\"`).join(\", \");\n throw new CookieSetError(\n `clearCookies: cookies were cleared but failed to re-add the ${toKeep.length} ` +\n `non-matching cookie(s) [${names}]. The browser cookie jar is now empty. ` +\n (detail ? `(CDP error: ${detail})` : \"\"),\n );\n }\n }\n }\n}\n"]}
|
|
@@ -107,12 +107,29 @@ class Frame {
|
|
|
107
107
|
} catch (e) { throw e; }
|
|
108
108
|
})()`;
|
|
109
109
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
110
|
+
let res;
|
|
111
|
+
try {
|
|
112
|
+
res = await this.session.send("Runtime.evaluate", {
|
|
113
|
+
expression,
|
|
114
|
+
contextId,
|
|
115
|
+
awaitPromise: true,
|
|
116
|
+
returnByValue: true,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
// Execution contexts can be recreated between context lookup and
|
|
121
|
+
// Runtime.evaluate during popup/navigate churn. Retry once with a fresh id.
|
|
122
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
123
|
+
if (!msg.includes("Cannot find context with specified id"))
|
|
124
|
+
throw error;
|
|
125
|
+
const freshContextId = await this.getMainWorldExecutionContextId();
|
|
126
|
+
res = await this.session.send("Runtime.evaluate", {
|
|
127
|
+
expression,
|
|
128
|
+
contextId: freshContextId,
|
|
129
|
+
awaitPromise: true,
|
|
130
|
+
returnByValue: true,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
116
133
|
if (res.exceptionDetails) {
|
|
117
134
|
throw new sdkErrors_js_1.StagehandEvalError(res.exceptionDetails.text ?? "Evaluation failed");
|
|
118
135
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/frame.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/understudy/frame.ts\nimport { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport { Locator } from \"./locator.js\";\nimport { StagehandEvalError } from \"../types/public/sdkErrors.js\";\nimport { executionContexts } from \"./executionContextRegistry.js\";\n\ninterface FrameManager {\n session: CDPSessionLike;\n frameId: string;\n pageId: string;\n}\n\n/**\n * Frame\n *\n * A thin, session-bound handle to a specific DOM frame (by frameId).\n * All CDP calls in this class go through `this.session`, which MUST be the\n * owning session for `this.frameId`. Page is responsible for constructing\n * Frames with the correct session.\n */\nexport class Frame implements FrameManager {\n /** Owning CDP session id (useful for logs); null for root connection (should not happen for targets) */\n public readonly sessionId: string | null;\n\n constructor(\n public session: CDPSessionLike,\n public frameId: string,\n public pageId: string,\n private readonly remoteBrowser: boolean,\n ) {\n this.sessionId = this.session.id ?? null;\n }\n\n /** True when the controlled browser runs on a different machine. */\n public isBrowserRemote(): boolean {\n return this.remoteBrowser;\n }\n\n /** DOM.getNodeForLocation → DOM.describeNode */\n async getNodeAtLocation(x: number, y: number): Promise<Protocol.DOM.Node> {\n await this.session.send(\"DOM.enable\");\n const { backendNodeId } = await this.session.send<{\n backendNodeId: Protocol.DOM.BackendNodeId;\n }>(\"DOM.getNodeForLocation\", {\n x,\n y,\n includeUserAgentShadowDOM: true,\n ignorePointerEventsNone: false,\n });\n\n const { node } = await this.session.send<{\n node: Protocol.DOM.Node;\n }>(\"DOM.describeNode\", { backendNodeId });\n\n return node;\n }\n\n /** CSS selector → DOM.querySelector → DOM.getBoxModel */\n async getLocationForSelector(\n selector: string,\n ): Promise<{ x: number; y: number; width: number; height: number }> {\n await this.session.send(\"DOM.enable\");\n\n const { root } = await this.session.send<{ root: Protocol.DOM.Node }>(\n \"DOM.getDocument\",\n );\n\n const { nodeId } = await this.session.send<{ nodeId: Protocol.DOM.NodeId }>(\n \"DOM.querySelector\",\n { nodeId: root.nodeId, selector },\n );\n\n const { model } = await this.session.send<{ model: Protocol.DOM.BoxModel }>(\n \"DOM.getBoxModel\",\n { nodeId },\n );\n\n const x = model.content[0];\n const y = model.content[1];\n const width = model.width;\n const height = model.height;\n return { x, y, width, height };\n }\n\n /** Accessibility.getFullAXTree (+ recurse into child frames if requested) */\n async getAccessibilityTree(\n withFrames = false,\n ): Promise<Protocol.Accessibility.AXNode[]> {\n await this.session.send(\"Accessibility.enable\");\n let nodes: Protocol.Accessibility.AXNode[];\n try {\n ({ nodes } = await this.session.send<{\n nodes: Protocol.Accessibility.AXNode[];\n }>(\"Accessibility.getFullAXTree\", { frameId: this.frameId }));\n } catch (e) {\n const msg = String((e as Error)?.message ?? e ?? \"\");\n const isFrameScopeError =\n msg.includes(\"Frame with the given\") ||\n msg.includes(\"does not belong to the target\") ||\n msg.includes(\"is not found\");\n if (!isFrameScopeError) throw e;\n // Retry unscoped: on OOPIF sessions, returns the child doc's AX tree.\n ({ nodes } = await this.session.send<{\n nodes: Protocol.Accessibility.AXNode[];\n }>(\"Accessibility.getFullAXTree\"));\n }\n\n if (!withFrames) return nodes;\n\n const children = await this.childFrames();\n for (const child of children) {\n const childNodes = await child.getAccessibilityTree(false);\n nodes.push(...childNodes);\n }\n return nodes;\n }\n\n /**\n * Evaluate a function or expression in this frame's main world.\n * - If a string is provided, treated as a JS expression.\n * - If a function is provided, it is stringified and invoked with the optional argument.\n */\n async evaluate<R = unknown, Arg = unknown>(\n pageFunctionOrExpression: string | ((arg: Arg) => R | Promise<R>),\n arg?: Arg,\n ): Promise<R> {\n await this.session.send(\"Runtime.enable\").catch(() => {});\n const contextId = await this.getMainWorldExecutionContextId();\n\n const isString = typeof pageFunctionOrExpression === \"string\";\n let expression: string;\n\n if (isString) {\n expression = String(pageFunctionOrExpression);\n } else {\n const fnSrc = pageFunctionOrExpression.toString();\n const argJson = JSON.stringify(arg);\n expression = `(() => {\n const __fn = ${fnSrc};\n const __arg = ${argJson};\n try {\n const __res = __fn(__arg);\n return Promise.resolve(__res).then(v => {\n try { return JSON.parse(JSON.stringify(v)); } catch { return v; }\n });\n } catch (e) { throw e; }\n })()`;\n }\n\n const res = await this.session.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression,\n contextId,\n awaitPromise: true,\n returnByValue: true,\n },\n );\n if (res.exceptionDetails) {\n throw new StagehandEvalError(\n res.exceptionDetails.text ?? \"Evaluation failed\",\n );\n }\n return res.result.value as R;\n }\n\n /** Page.captureScreenshot (frame-scoped session) */\n async screenshot(options?: {\n fullPage?: boolean;\n clip?: { x: number; y: number; width: number; height: number };\n type?: \"png\" | \"jpeg\";\n quality?: number;\n scale?: number;\n }): Promise<Buffer> {\n await this.session.send(\"Page.enable\");\n const format = options?.type ?? \"png\";\n const params: Protocol.Page.CaptureScreenshotRequest & { scale?: number } =\n {\n format,\n fromSurface: true,\n captureBeyondViewport: options?.fullPage,\n };\n\n const clampScale = (value: number): number =>\n Math.min(2, Math.max(0.1, value));\n\n const normalizedScale =\n typeof options?.scale === \"number\"\n ? clampScale(options.scale)\n : undefined;\n\n if (options?.clip) {\n const clip = {\n x: options.clip.x,\n y: options.clip.y,\n width: options.clip.width,\n height: options.clip.height,\n scale: normalizedScale ?? 1,\n };\n params.clip = clip;\n } else if (normalizedScale !== undefined && normalizedScale !== 1) {\n params.scale = normalizedScale;\n }\n\n if (format === \"jpeg\" && typeof options?.quality === \"number\") {\n const q = Math.round(options.quality);\n params.quality = Math.min(100, Math.max(0, q));\n }\n\n const { data } =\n await this.session.send<Protocol.Page.CaptureScreenshotResponse>(\n \"Page.captureScreenshot\",\n params,\n );\n return Buffer.from(data, \"base64\");\n }\n\n /** Child frames via Page.getFrameTree */\n async childFrames(): Promise<Frame[]> {\n const { frameTree } = await this.session.send<{\n frameTree: Protocol.Page.FrameTree;\n }>(\"Page.getFrameTree\");\n const frames: Frame[] = [];\n\n const collect = (tree: Protocol.Page.FrameTree) => {\n if (tree.frame.parentId === this.frameId) {\n frames.push(\n new Frame(\n this.session,\n tree.frame.id,\n this.pageId,\n this.remoteBrowser,\n ),\n );\n }\n tree.childFrames?.forEach(collect);\n };\n\n collect(frameTree);\n return frames;\n }\n\n /** Wait for a lifecycle state (load/domcontentloaded/networkidle) */\n async waitForLoadState(\n state: \"load\" | \"domcontentloaded\" | \"networkidle\" = \"load\",\n timeoutMs: number = 15_000,\n ): Promise<void> {\n await this.session.send(\"Page.enable\");\n const targetState = state.toLowerCase();\n const timeout = Math.max(0, timeoutMs);\n await new Promise<void>((resolve, reject) => {\n let done = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const finish = () => {\n if (done) return;\n done = true;\n this.session.off(\"Page.lifecycleEvent\", handler);\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n resolve();\n };\n const handler = (evt: Protocol.Page.LifecycleEventEvent) => {\n const sameFrame = evt.frameId === this.frameId;\n // need to normalize here because CDP lifecycle names look like 'DOMContentLoaded'\n // but we accept 'domcontentloaded'\n const lifecycleName = String(evt.name ?? \"\").toLowerCase();\n if (sameFrame && lifecycleName === targetState) {\n finish();\n }\n };\n this.session.on(\"Page.lifecycleEvent\", handler);\n\n timer = setTimeout(() => {\n if (done) return;\n done = true;\n this.session.off(\"Page.lifecycleEvent\", handler);\n reject(\n new Error(\n `waitForLoadState(${state}) timed out after ${timeout}ms for frame ${this.frameId}`,\n ),\n );\n }, timeout);\n });\n }\n\n /** Simple placeholder for your own locator abstraction */\n locator(\n selector: string,\n options?: { deep?: boolean; depth?: number },\n ): Locator {\n return new Locator(this, selector, options);\n }\n\n /** Resolve the main-world execution context id for this frame. */\n private async getMainWorldExecutionContextId(): Promise<number> {\n return executionContexts.waitForMainWorld(this.session, this.frameId, 1000);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"frame.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/frame.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/understudy/frame.ts\nimport { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"./cdp.js\";\nimport { Locator } from \"./locator.js\";\nimport { StagehandEvalError } from \"../types/public/sdkErrors.js\";\nimport { executionContexts } from \"./executionContextRegistry.js\";\n\ninterface FrameManager {\n session: CDPSessionLike;\n frameId: string;\n pageId: string;\n}\n\n/**\n * Frame\n *\n * A thin, session-bound handle to a specific DOM frame (by frameId).\n * All CDP calls in this class go through `this.session`, which MUST be the\n * owning session for `this.frameId`. Page is responsible for constructing\n * Frames with the correct session.\n */\nexport class Frame implements FrameManager {\n /** Owning CDP session id (useful for logs); null for root connection (should not happen for targets) */\n public readonly sessionId: string | null;\n\n constructor(\n public session: CDPSessionLike,\n public frameId: string,\n public pageId: string,\n private readonly remoteBrowser: boolean,\n ) {\n this.sessionId = this.session.id ?? null;\n }\n\n /** True when the controlled browser runs on a different machine. */\n public isBrowserRemote(): boolean {\n return this.remoteBrowser;\n }\n\n /** DOM.getNodeForLocation → DOM.describeNode */\n async getNodeAtLocation(x: number, y: number): Promise<Protocol.DOM.Node> {\n await this.session.send(\"DOM.enable\");\n const { backendNodeId } = await this.session.send<{\n backendNodeId: Protocol.DOM.BackendNodeId;\n }>(\"DOM.getNodeForLocation\", {\n x,\n y,\n includeUserAgentShadowDOM: true,\n ignorePointerEventsNone: false,\n });\n\n const { node } = await this.session.send<{\n node: Protocol.DOM.Node;\n }>(\"DOM.describeNode\", { backendNodeId });\n\n return node;\n }\n\n /** CSS selector → DOM.querySelector → DOM.getBoxModel */\n async getLocationForSelector(\n selector: string,\n ): Promise<{ x: number; y: number; width: number; height: number }> {\n await this.session.send(\"DOM.enable\");\n\n const { root } = await this.session.send<{ root: Protocol.DOM.Node }>(\n \"DOM.getDocument\",\n );\n\n const { nodeId } = await this.session.send<{ nodeId: Protocol.DOM.NodeId }>(\n \"DOM.querySelector\",\n { nodeId: root.nodeId, selector },\n );\n\n const { model } = await this.session.send<{ model: Protocol.DOM.BoxModel }>(\n \"DOM.getBoxModel\",\n { nodeId },\n );\n\n const x = model.content[0];\n const y = model.content[1];\n const width = model.width;\n const height = model.height;\n return { x, y, width, height };\n }\n\n /** Accessibility.getFullAXTree (+ recurse into child frames if requested) */\n async getAccessibilityTree(\n withFrames = false,\n ): Promise<Protocol.Accessibility.AXNode[]> {\n await this.session.send(\"Accessibility.enable\");\n let nodes: Protocol.Accessibility.AXNode[];\n try {\n ({ nodes } = await this.session.send<{\n nodes: Protocol.Accessibility.AXNode[];\n }>(\"Accessibility.getFullAXTree\", { frameId: this.frameId }));\n } catch (e) {\n const msg = String((e as Error)?.message ?? e ?? \"\");\n const isFrameScopeError =\n msg.includes(\"Frame with the given\") ||\n msg.includes(\"does not belong to the target\") ||\n msg.includes(\"is not found\");\n if (!isFrameScopeError) throw e;\n // Retry unscoped: on OOPIF sessions, returns the child doc's AX tree.\n ({ nodes } = await this.session.send<{\n nodes: Protocol.Accessibility.AXNode[];\n }>(\"Accessibility.getFullAXTree\"));\n }\n\n if (!withFrames) return nodes;\n\n const children = await this.childFrames();\n for (const child of children) {\n const childNodes = await child.getAccessibilityTree(false);\n nodes.push(...childNodes);\n }\n return nodes;\n }\n\n /**\n * Evaluate a function or expression in this frame's main world.\n * - If a string is provided, treated as a JS expression.\n * - If a function is provided, it is stringified and invoked with the optional argument.\n */\n async evaluate<R = unknown, Arg = unknown>(\n pageFunctionOrExpression: string | ((arg: Arg) => R | Promise<R>),\n arg?: Arg,\n ): Promise<R> {\n await this.session.send(\"Runtime.enable\").catch(() => {});\n const contextId = await this.getMainWorldExecutionContextId();\n\n const isString = typeof pageFunctionOrExpression === \"string\";\n let expression: string;\n\n if (isString) {\n expression = String(pageFunctionOrExpression);\n } else {\n const fnSrc = pageFunctionOrExpression.toString();\n const argJson = JSON.stringify(arg);\n expression = `(() => {\n const __fn = ${fnSrc};\n const __arg = ${argJson};\n try {\n const __res = __fn(__arg);\n return Promise.resolve(__res).then(v => {\n try { return JSON.parse(JSON.stringify(v)); } catch { return v; }\n });\n } catch (e) { throw e; }\n })()`;\n }\n\n let res: Protocol.Runtime.EvaluateResponse;\n try {\n res = await this.session.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression,\n contextId,\n awaitPromise: true,\n returnByValue: true,\n },\n );\n } catch (error) {\n // Execution contexts can be recreated between context lookup and\n // Runtime.evaluate during popup/navigate churn. Retry once with a fresh id.\n const msg = error instanceof Error ? error.message : String(error);\n if (!msg.includes(\"Cannot find context with specified id\")) throw error;\n const freshContextId = await this.getMainWorldExecutionContextId();\n res = await this.session.send<Protocol.Runtime.EvaluateResponse>(\n \"Runtime.evaluate\",\n {\n expression,\n contextId: freshContextId,\n awaitPromise: true,\n returnByValue: true,\n },\n );\n }\n if (res.exceptionDetails) {\n throw new StagehandEvalError(\n res.exceptionDetails.text ?? \"Evaluation failed\",\n );\n }\n return res.result.value as R;\n }\n\n /** Page.captureScreenshot (frame-scoped session) */\n async screenshot(options?: {\n fullPage?: boolean;\n clip?: { x: number; y: number; width: number; height: number };\n type?: \"png\" | \"jpeg\";\n quality?: number;\n scale?: number;\n }): Promise<Buffer> {\n await this.session.send(\"Page.enable\");\n const format = options?.type ?? \"png\";\n const params: Protocol.Page.CaptureScreenshotRequest & { scale?: number } =\n {\n format,\n fromSurface: true,\n captureBeyondViewport: options?.fullPage,\n };\n\n const clampScale = (value: number): number =>\n Math.min(2, Math.max(0.1, value));\n\n const normalizedScale =\n typeof options?.scale === \"number\"\n ? clampScale(options.scale)\n : undefined;\n\n if (options?.clip) {\n const clip = {\n x: options.clip.x,\n y: options.clip.y,\n width: options.clip.width,\n height: options.clip.height,\n scale: normalizedScale ?? 1,\n };\n params.clip = clip;\n } else if (normalizedScale !== undefined && normalizedScale !== 1) {\n params.scale = normalizedScale;\n }\n\n if (format === \"jpeg\" && typeof options?.quality === \"number\") {\n const q = Math.round(options.quality);\n params.quality = Math.min(100, Math.max(0, q));\n }\n\n const { data } =\n await this.session.send<Protocol.Page.CaptureScreenshotResponse>(\n \"Page.captureScreenshot\",\n params,\n );\n return Buffer.from(data, \"base64\");\n }\n\n /** Child frames via Page.getFrameTree */\n async childFrames(): Promise<Frame[]> {\n const { frameTree } = await this.session.send<{\n frameTree: Protocol.Page.FrameTree;\n }>(\"Page.getFrameTree\");\n const frames: Frame[] = [];\n\n const collect = (tree: Protocol.Page.FrameTree) => {\n if (tree.frame.parentId === this.frameId) {\n frames.push(\n new Frame(\n this.session,\n tree.frame.id,\n this.pageId,\n this.remoteBrowser,\n ),\n );\n }\n tree.childFrames?.forEach(collect);\n };\n\n collect(frameTree);\n return frames;\n }\n\n /** Wait for a lifecycle state (load/domcontentloaded/networkidle) */\n async waitForLoadState(\n state: \"load\" | \"domcontentloaded\" | \"networkidle\" = \"load\",\n timeoutMs: number = 15_000,\n ): Promise<void> {\n await this.session.send(\"Page.enable\");\n const targetState = state.toLowerCase();\n const timeout = Math.max(0, timeoutMs);\n await new Promise<void>((resolve, reject) => {\n let done = false;\n let timer: ReturnType<typeof setTimeout> | null = null;\n const finish = () => {\n if (done) return;\n done = true;\n this.session.off(\"Page.lifecycleEvent\", handler);\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n resolve();\n };\n const handler = (evt: Protocol.Page.LifecycleEventEvent) => {\n const sameFrame = evt.frameId === this.frameId;\n // need to normalize here because CDP lifecycle names look like 'DOMContentLoaded'\n // but we accept 'domcontentloaded'\n const lifecycleName = String(evt.name ?? \"\").toLowerCase();\n if (sameFrame && lifecycleName === targetState) {\n finish();\n }\n };\n this.session.on(\"Page.lifecycleEvent\", handler);\n\n timer = setTimeout(() => {\n if (done) return;\n done = true;\n this.session.off(\"Page.lifecycleEvent\", handler);\n reject(\n new Error(\n `waitForLoadState(${state}) timed out after ${timeout}ms for frame ${this.frameId}`,\n ),\n );\n }, timeout);\n });\n }\n\n /** Simple placeholder for your own locator abstraction */\n locator(\n selector: string,\n options?: { deep?: boolean; depth?: number },\n ): Locator {\n return new Locator(this, selector, options);\n }\n\n /** Resolve the main-world execution context id for this frame. */\n private async getMainWorldExecutionContextId(): Promise<number> {\n return executionContexts.waitForMainWorld(this.session, this.frameId, 1000);\n }\n}\n"]}
|
|
@@ -39,6 +39,7 @@ export declare class Page {
|
|
|
39
39
|
private readonly consoleHandlers;
|
|
40
40
|
/** Document-start scripts installed across every session this page owns. */
|
|
41
41
|
private readonly initScripts;
|
|
42
|
+
private extraHTTPHeaders;
|
|
42
43
|
private constructor();
|
|
43
44
|
private installInitScriptOnSession;
|
|
44
45
|
private applyInitScriptsToSession;
|
|
@@ -118,6 +119,7 @@ export declare class Page {
|
|
|
118
119
|
close(): Promise<void>;
|
|
119
120
|
getFullFrameTree(): Protocol.Page.FrameTree;
|
|
120
121
|
asProtocolFrameTree(rootMainFrameId: string): Protocol.Page.FrameTree;
|
|
122
|
+
private applyExtraHTTPHeadersToSession;
|
|
121
123
|
private ensureOrdinal;
|
|
122
124
|
/** Public getter for snapshot code / handlers. */
|
|
123
125
|
getOrdinal(frameId: string): number;
|
|
@@ -202,6 +204,17 @@ export declare class Page {
|
|
|
202
204
|
* @param options.type Image format (`"png"` by default).
|
|
203
205
|
*/
|
|
204
206
|
screenshot(options?: ScreenshotOptions): Promise<Buffer>;
|
|
207
|
+
/**
|
|
208
|
+
* specifies additional HTTP headers to be included in every request sent by
|
|
209
|
+
* the root CDP session of the page, and all of its child CDP sessions.
|
|
210
|
+
*
|
|
211
|
+
* @param headers - the headers to be set.
|
|
212
|
+
* @throws {StagehandSetExtraHTTPHeadersError}
|
|
213
|
+
* Thrown when one or more CDP sessions fail to enable the Network domain or fail
|
|
214
|
+
* to apply the headers (i.e. `Network.enable` and/or `Network.setExtraHTTPHeaders` rejects).
|
|
215
|
+
* @return void
|
|
216
|
+
*/
|
|
217
|
+
setExtraHTTPHeaders(headers: Record<string, string>): Promise<void>;
|
|
205
218
|
/**
|
|
206
219
|
* Create a locator bound to the current main frame.
|
|
207
220
|
*/
|
|
@@ -54,6 +54,7 @@ const sdkErrors_js_1 = require("../types/public/sdkErrors.js");
|
|
|
54
54
|
const initScripts_js_1 = require("./initScripts.js");
|
|
55
55
|
const locatorInvocation_js_1 = require("./locatorInvocation.js");
|
|
56
56
|
const screenshotUtils_js_1 = require("./screenshotUtils.js");
|
|
57
|
+
const timeoutConfig_js_1 = require("../timeoutConfig.js");
|
|
57
58
|
/**
|
|
58
59
|
* Page
|
|
59
60
|
*
|
|
@@ -155,6 +156,7 @@ let Page = (() => {
|
|
|
155
156
|
consoleHandlers = new Map();
|
|
156
157
|
/** Document-start scripts installed across every session this page owns. */
|
|
157
158
|
initScripts = [];
|
|
159
|
+
extraHTTPHeaders;
|
|
158
160
|
constructor(conn, mainSession, _targetId, mainFrameId, apiClient, browserIsRemote = false) {
|
|
159
161
|
this.conn = conn;
|
|
160
162
|
this.mainSession = mainSession;
|
|
@@ -308,8 +310,12 @@ let Page = (() => {
|
|
|
308
310
|
* Assumes Page domain is already enabled on the session passed in.
|
|
309
311
|
*/
|
|
310
312
|
static async create(conn, session, targetId, apiClient, localBrowserLaunchOptions, browserIsRemote = false) {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
+
// Context already issues Page.enable + lifecycle enable before resume.
|
|
314
|
+
// Re-issue here only as best-effort and do not block page registration on
|
|
315
|
+
// their acknowledgements; some remote CDP backends can delay these replies
|
|
316
|
+
// long after the target is otherwise ready.
|
|
317
|
+
void session.send("Page.enable").catch(() => { });
|
|
318
|
+
void session
|
|
313
319
|
.send("Page.setLifecycleEventsEnabled", { enabled: true })
|
|
314
320
|
.catch(() => { });
|
|
315
321
|
const { frameTree } = await session.send("Page.getFrameTree");
|
|
@@ -393,6 +399,8 @@ let Page = (() => {
|
|
|
393
399
|
if (childSession.id)
|
|
394
400
|
this.sessions.set(childSession.id, childSession);
|
|
395
401
|
this.networkManager.trackSession(childSession);
|
|
402
|
+
if (this.extraHTTPHeaders)
|
|
403
|
+
void this.applyExtraHTTPHeadersToSession(childSession, this.extraHTTPHeaders).catch(() => { });
|
|
396
404
|
void this.applyInitScriptsToSession(childSession).catch(() => { });
|
|
397
405
|
if (this.consoleListeners.size > 0) {
|
|
398
406
|
this.installConsoleTap(childSession);
|
|
@@ -579,6 +587,12 @@ let Page = (() => {
|
|
|
579
587
|
asProtocolFrameTree(rootMainFrameId) {
|
|
580
588
|
return this.registry.asProtocolFrameTree(rootMainFrameId);
|
|
581
589
|
}
|
|
590
|
+
async applyExtraHTTPHeadersToSession(session, headers) {
|
|
591
|
+
await session.send("Network.enable");
|
|
592
|
+
await session.send("Network.setExtraHTTPHeaders", {
|
|
593
|
+
headers: headers,
|
|
594
|
+
});
|
|
595
|
+
}
|
|
582
596
|
ensureOrdinal(frameId) {
|
|
583
597
|
const hit = this.frameOrdinals.get(frameId);
|
|
584
598
|
if (hit !== undefined)
|
|
@@ -955,7 +969,46 @@ let Page = (() => {
|
|
|
955
969
|
await (0, screenshotUtils_js_1.runScreenshotCleanups)(cleanupTasks);
|
|
956
970
|
}
|
|
957
971
|
};
|
|
958
|
-
return (0,
|
|
972
|
+
return await (0, timeoutConfig_js_1.withTimeout)(exec(), opts.timeout, "screenshot");
|
|
973
|
+
}
|
|
974
|
+
/**
|
|
975
|
+
* specifies additional HTTP headers to be included in every request sent by
|
|
976
|
+
* the root CDP session of the page, and all of its child CDP sessions.
|
|
977
|
+
*
|
|
978
|
+
* @param headers - the headers to be set.
|
|
979
|
+
* @throws {StagehandSetExtraHTTPHeadersError}
|
|
980
|
+
* Thrown when one or more CDP sessions fail to enable the Network domain or fail
|
|
981
|
+
* to apply the headers (i.e. `Network.enable` and/or `Network.setExtraHTTPHeaders` rejects).
|
|
982
|
+
* @return void
|
|
983
|
+
*/
|
|
984
|
+
async setExtraHTTPHeaders(headers) {
|
|
985
|
+
const headersToSet = { ...headers };
|
|
986
|
+
this.extraHTTPHeaders = headersToSet;
|
|
987
|
+
// get the session(s) for this page:
|
|
988
|
+
const sessions = [this.mainSession];
|
|
989
|
+
for (const session of this.sessions.values()) {
|
|
990
|
+
if (session === this.mainSession)
|
|
991
|
+
continue;
|
|
992
|
+
sessions.push(session);
|
|
993
|
+
}
|
|
994
|
+
const results = await Promise.allSettled(sessions.map(async (session) => {
|
|
995
|
+
await this.applyExtraHTTPHeadersToSession(session, headersToSet);
|
|
996
|
+
}));
|
|
997
|
+
// get list of objects containing results & corresponding session IDs
|
|
998
|
+
const pairs = results.map((result, index) => ({
|
|
999
|
+
result,
|
|
1000
|
+
id: sessions[index].id,
|
|
1001
|
+
}));
|
|
1002
|
+
const filtered = pairs.filter((pair) => pair.result.status === "rejected");
|
|
1003
|
+
const errors = filtered.map((pair) => {
|
|
1004
|
+
const reason = pair.result.reason;
|
|
1005
|
+
const sessId = pair.id ?? "root";
|
|
1006
|
+
const message = reason?.message ?? String(reason);
|
|
1007
|
+
return `session=${sessId} error=${message}`;
|
|
1008
|
+
});
|
|
1009
|
+
if (errors.length > 0) {
|
|
1010
|
+
throw new index_js_2.StagehandSetExtraHTTPHeadersError(errors);
|
|
1011
|
+
}
|
|
959
1012
|
}
|
|
960
1013
|
/**
|
|
961
1014
|
* Create a locator bound to the current main frame.
|