@browserbasehq/orca 3.1.0-patch.2 → 3.1.0-patch.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/dist/cjs/cli.js +45 -17
  2. package/dist/cjs/cli.js.map +2 -2
  3. package/dist/cjs/index.js +192 -123
  4. package/dist/cjs/index.js.map +3 -3
  5. package/dist/cjs/lib/logger.d.ts +1 -1
  6. package/dist/cjs/lib/modelUtils.d.ts +3 -0
  7. package/dist/cjs/lib/v3/agent/tools/act.d.ts +2 -1
  8. package/dist/cjs/lib/v3/agent/tools/extract.d.ts +2 -1
  9. package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +2 -1
  10. package/dist/cjs/lib/v3/agent/tools/index.d.ts +2 -2
  11. package/dist/cjs/lib/v3/api.d.ts +16 -1
  12. package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +0 -3
  13. package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +2 -2
  14. package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js +12 -12
  15. package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js.map +1 -1
  16. package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js +2 -2
  17. package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js.map +1 -1
  18. package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js +1 -0
  19. package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js.map +1 -1
  20. package/dist/cjs/lib/v3/tests/locator-fill.spec.js +1 -0
  21. package/dist/cjs/lib/v3/tests/locator-fill.spec.js.map +1 -1
  22. package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js +1 -0
  23. package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js.map +1 -1
  24. package/dist/cjs/lib/v3/tests/locator-select-option.spec.js +1 -0
  25. package/dist/cjs/lib/v3/tests/locator-select-option.spec.js.map +1 -1
  26. package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js +2 -2
  27. package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js.map +1 -1
  28. package/dist/cjs/lib/v3/types/public/api.d.ts +8 -0
  29. package/dist/cjs/lib/v3/types/public/index.d.ts +1 -0
  30. package/dist/cjs/lib/v3/types/public/sdkErrors.d.ts +3 -0
  31. package/dist/cjs/tests/agent-execution-model.test.js +139 -0
  32. package/dist/cjs/tests/agent-execution-model.test.js.map +7 -0
  33. package/dist/cjs/tests/api-multiregion.test.js +73 -0
  34. package/dist/cjs/tests/api-multiregion.test.js.map +7 -0
  35. package/dist/cjs/tests/model-utils.test.js +43 -0
  36. package/dist/cjs/tests/model-utils.test.js.map +7 -0
  37. package/dist/cjs/tests/public-api/export-surface.test.js +1 -0
  38. package/dist/cjs/tests/public-api/export-surface.test.js.map +1 -1
  39. package/dist/cjs/tests/public-api/llm-and-agents.test.js +1 -0
  40. package/dist/cjs/tests/public-api/llm-and-agents.test.js.map +1 -1
  41. package/dist/cjs/tests/public-api/public-error-types.test.js +3 -1
  42. package/dist/cjs/tests/public-api/public-error-types.test.js.map +2 -2
  43. package/dist/cjs/tests/public-api/v3-core.test.js +1 -0
  44. package/dist/cjs/tests/public-api/v3-core.test.js.map +1 -1
  45. package/dist/cjs/tests/snapshot-capture-orchestration.test.js +2 -0
  46. package/dist/cjs/tests/snapshot-capture-orchestration.test.js.map +1 -1
  47. package/dist/cjs/tests/understudy-command-exception.test.js +52 -0
  48. package/dist/cjs/tests/understudy-command-exception.test.js.map +7 -0
  49. package/dist/esm/lib/logger.d.ts +1 -1
  50. package/dist/esm/lib/v3/cli.d.ts +2 -0
  51. package/dist/esm/lib/v3/cli.js +10 -0
  52. package/dist/esm/lib/v3/cli.js.map +1 -0
  53. package/dist/esm/lib/v3/dom/build/rerender-index.d.ts +0 -0
  54. package/dist/esm/lib/v3/dom/build/rerender-index.js.map +1 -0
  55. package/dist/esm/lib/v3/dom/build/v3-index.d.ts +0 -0
  56. package/dist/esm/lib/v3/dom/build/v3-index.js.map +1 -0
  57. package/dist/esm/lib/v3/index.d.ts +1 -0
  58. package/dist/esm/lib/v3/index.js +1 -0
  59. package/dist/esm/lib/v3/index.js.map +1 -1
  60. package/dist/esm/lib/v3/shutdown/supervisor.d.ts +7 -5
  61. package/dist/esm/lib/v3/shutdown/supervisor.js +93 -64
  62. package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
  63. package/dist/esm/lib/v3/shutdown/supervisorClient.js +49 -52
  64. package/dist/esm/lib/v3/shutdown/supervisorClient.js.map +1 -1
  65. package/dist/esm/lib/v3/tests/agent-callbacks.spec.js +12 -12
  66. package/dist/esm/lib/v3/tests/agent-callbacks.spec.js.map +1 -1
  67. package/dist/esm/lib/v3/tests/click-count.spec.js +47 -12
  68. package/dist/esm/lib/v3/tests/click-count.spec.js.map +2 -2
  69. package/dist/esm/lib/v3/tests/context-addInitScript.spec.js +2 -2
  70. package/dist/esm/lib/v3/tests/context-addInitScript.spec.js.map +1 -1
  71. package/dist/esm/lib/v3/tests/iframe-ctx-addInitScript.spec.js +67 -21
  72. package/dist/esm/lib/v3/tests/iframe-ctx-addInitScript.spec.js.map +2 -2
  73. package/dist/esm/lib/v3/tests/locator-content-methods.spec.js +1 -0
  74. package/dist/esm/lib/v3/tests/locator-content-methods.spec.js.map +1 -1
  75. package/dist/esm/lib/v3/tests/locator-fill.spec.js +1 -0
  76. package/dist/esm/lib/v3/tests/locator-fill.spec.js.map +1 -1
  77. package/dist/esm/lib/v3/tests/locator-input-methods.spec.js +1 -0
  78. package/dist/esm/lib/v3/tests/locator-input-methods.spec.js.map +1 -1
  79. package/dist/esm/lib/v3/tests/locator-select-option.spec.js +1 -0
  80. package/dist/esm/lib/v3/tests/locator-select-option.spec.js.map +1 -1
  81. package/dist/esm/lib/v3/tests/page-addInitScript.spec.js +2 -2
  82. package/dist/esm/lib/v3/tests/page-addInitScript.spec.js.map +1 -1
  83. package/dist/esm/lib/v3/tests/v3.playwright.config.js +3 -60
  84. package/dist/esm/lib/v3/tests/v3.playwright.config.js.map +2 -2
  85. package/dist/esm/lib/v3/types/private/shutdown.d.ts +1 -13
  86. package/dist/esm/lib/v3/types/private/shutdown.js.map +1 -1
  87. package/dist/esm/lib/v3/understudy/context.js +10 -1
  88. package/dist/esm/lib/v3/understudy/context.js.map +1 -1
  89. package/dist/esm/lib/v3/understudy/locator.js +2 -2
  90. package/dist/esm/lib/v3/understudy/locator.js.map +1 -1
  91. package/dist/esm/lib/v3/understudy/page.js +2 -1
  92. package/dist/esm/lib/v3/understudy/page.js.map +1 -1
  93. package/dist/esm/lib/v3/v3.js +2 -6
  94. package/dist/esm/lib/v3/v3.js.map +1 -1
  95. package/dist/esm/tests/public-api/export-surface.test.js +2 -0
  96. package/dist/esm/tests/public-api/export-surface.test.js.map +2 -2
  97. package/dist/esm/tests/public-api/llm-and-agents.test.js +1 -0
  98. package/dist/esm/tests/public-api/llm-and-agents.test.js.map +1 -1
  99. package/dist/esm/tests/public-api/public-error-types.test.js +1 -0
  100. package/dist/esm/tests/public-api/public-error-types.test.js.map +1 -1
  101. package/dist/esm/tests/public-api/v3-core.test.js +1 -0
  102. package/dist/esm/tests/public-api/v3-core.test.js.map +1 -1
  103. package/dist/esm/tests/snapshot-capture-orchestration.test.js +2 -0
  104. package/dist/esm/tests/snapshot-capture-orchestration.test.js.map +1 -1
  105. package/package.json +13 -11
  106. package/dist/esm/lib/v3/tests/envReporter.js +0 -57
  107. package/dist/esm/lib/v3/tests/envReporter.js.map +0 -7
@@ -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 { TimeoutError, PageNotFoundError } from \"../types/public/sdkErrors.js\";\nimport { getEnvTimeoutMs, withTimeout } from \"../timeoutConfig.js\";\n\ntype TargetId = string;\ntype SessionId = string;\n\ntype TargetType = \"page\" | \"iframe\" | string;\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\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\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.waitForFirstTopLevelPage(5000);\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 /**\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(\n \"waitForFirstTopLevelPage (no top-level Page)\",\n timeoutMs,\n );\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 /**\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 // Workers are ignored by Stagehand, but with waitForDebuggerOnStart enabled\n // they still need to be resumed so we don't leave them paused.\n if (\n info.type === \"worker\" ||\n info.type === \"service_worker\" ||\n info.type === \"shared_worker\"\n ) {\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 // 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"]}
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 { TimeoutError, PageNotFoundError } from \"../types/public/sdkErrors.js\";\nimport { getEnvTimeoutMs, withTimeout } from \"../timeoutConfig.js\";\n\ntype TargetId = string;\ntype SessionId = string;\n\ntype TargetType = \"page\" | \"iframe\" | string;\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\";\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\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\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\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.waitForFirstTopLevelPage(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 /**\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(\n \"waitForFirstTopLevelPage (no top-level Page)\",\n timeoutMs,\n );\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 /**\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 // Workers are ignored by Stagehand, but with waitForDebuggerOnStart enabled\n // they still need to be resumed so we don't leave them paused.\n if (\n info.type === \"worker\" ||\n info.type === \"service_worker\" ||\n info.type === \"shared_worker\"\n ) {\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 // 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"]}
@@ -318,8 +318,8 @@ export class Locator {
318
318
  if (!box.model)
319
319
  throw new ElementNotVisibleError(this.selector);
320
320
  const { cx, cy } = this.centerFromBoxContent(box.model.content);
321
- // Dispatch input (from the same session) without waiting between events.
322
- // This keeps multi-clicks within tight thresholds on remote browsers.
321
+ // Dispatch click events in a pipelined burst to reduce inter-click delay
322
+ // from network/CPU jitter between round trips.
323
323
  const dispatches = [];
324
324
  dispatches.push(session.send("Input.dispatchMouseEvent", {
325
325
  type: "mouseMoved",
@@ -1 +1 @@
1
- {"version":3,"file":"locator.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/locator.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/understudy/locator.ts\nimport { Protocol } from \"devtools-protocol\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport {\n locatorScriptBootstrap,\n locatorScriptGlobalRefs,\n locatorScriptSources,\n} from \"../dom/build/locatorScripts.generated.js\";\nimport type { Frame } from \"./frame.js\";\nimport {\n FrameSelectorResolver,\n type SelectorQuery,\n} from \"./selectorResolver.js\";\nimport {\n StagehandElementNotFoundError,\n StagehandInvalidArgumentError,\n StagehandLocatorError,\n ElementNotVisibleError,\n} from \"../types/public/sdkErrors.js\";\nimport { normalizeInputFiles } from \"./fileUploadUtils.js\";\nimport { SetInputFilesArgument, MouseButton } from \"../types/public/locator.js\";\nimport { NormalizedFilePayload } from \"../types/private/locator.js\";\n\nconst MAX_REMOTE_UPLOAD_BYTES = 50 * 1024 * 1024; // 50MB guard copied from Playwright\n\n/**\n * Locator\n *\n * Purpose:\n * A small, CDP-based element interaction helper scoped to a specific `Frame`.\n * It resolves a CSS/XPath selector inside the frame’s **isolated world**, and then\n * performs low-level actions (click, type, select) using DOM/Runtime/Input\n * protocol domains with minimal abstraction.\n *\n * Key change:\n * - Prefer **objectId**-based CDP calls (scroll, geometry) to avoid brittle\n * frontend nodeId mappings. nodeId is resolved on a best-effort basis and\n * returned for compatibility, but actions do not depend on it.\n *\n * Notes:\n * - Resolution is lazy: every action resolves the selector again.\n * - Uses `Page.createIsolatedWorld` so evaluation is isolated from page scripts.\n * - Releases remote objects (`Runtime.releaseObject`) where appropriate.\n */\nexport class Locator {\n private readonly selectorResolver: FrameSelectorResolver;\n\n private readonly selectorQuery: SelectorQuery;\n\n // -1 means \"no explicit nth()\"; default locator resolves to first match for actions.\n private readonly nthIndex: number;\n\n constructor(\n private readonly frame: Frame,\n private readonly selector: string,\n private readonly options?: { deep?: boolean; depth?: number },\n nthIndex: number = -1,\n ) {\n this.selectorResolver = new FrameSelectorResolver(this.frame);\n this.selectorQuery = FrameSelectorResolver.parseSelector(selector);\n const normalized = Number.isFinite(nthIndex) ? Math.floor(nthIndex) : -1;\n this.nthIndex = normalized < 0 ? -1 : normalized;\n }\n\n /** Return the owning Frame for this locator (typed accessor, no private access). */\n public getFrame(): Frame {\n return this.frame;\n }\n\n /**\n * Set files on an <input type=\"file\"> element.\n *\n * Mirrors Playwright's Locator.setInputFiles basics:\n * - Accepts file path(s) or payload object(s) { name, mimeType, buffer }.\n * - Uses CDP DOM.setFileInputFiles under the hood.\n * - Best‑effort dispatches change/input via CDP (Chrome does by default).\n * - Passing an empty array clears the selection.\n */\n public async setInputFiles(files: SetInputFilesArgument): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n const tempFiles: string[] = [];\n\n try {\n // Validate element is an <input type=\"file\">\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.ensureFileInputElement,\n returnByValue: true,\n },\n );\n const ok = Boolean(res.result.value);\n if (!ok)\n throw new StagehandInvalidArgumentError(\n 'Target is not an <input type=\"file\"> element',\n );\n } catch (e) {\n throw new StagehandInvalidArgumentError(\n e instanceof Error\n ? e.message\n : \"Unable to verify file input element\",\n );\n }\n\n const normalized = await normalizeInputFiles(files);\n\n if (!normalized.length) {\n await session.send<never>(\"DOM.setFileInputFiles\", {\n objectId,\n files: [],\n });\n return;\n }\n\n if (this.frame.isBrowserRemote()) {\n await this.assignFilesViaPayloadInjection(objectId, normalized);\n return;\n }\n\n const filePaths: string[] = [];\n for (const payload of normalized) {\n if (payload.absolutePath) {\n filePaths.push(payload.absolutePath);\n continue;\n }\n const ext = path.extname(payload.name);\n const tmp = path.join(\n os.tmpdir(),\n `stagehand-upload-${Date.now()}-${Math.random().toString(36).slice(2)}${ext}`,\n );\n await fs.promises.writeFile(tmp, payload.buffer);\n tempFiles.push(tmp);\n filePaths.push(tmp);\n }\n\n await session.send<never>(\"DOM.setFileInputFiles\", {\n objectId,\n files: filePaths,\n });\n } finally {\n // Cleanup: release element and remove any temporary files we created\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n for (const p of tempFiles) {\n try {\n await fs.promises.unlink(p);\n } catch {\n // ignore\n }\n }\n }\n }\n\n /**\n * Remote browser fallback: build File objects inside the page and attach them via JS.\n *\n * When Stagehand is driving a browser that cannot see the local filesystem (Browserbase,\n * remote CDP, etc.), CDP's DOM.setFileInputFiles would fail because Chrome can't reach\n * our temp files. Instead we base64-encode the payloads, send them into the page, and\n * let a DOM helper create File objects + dispatch change/input events.\n */\n private async assignFilesViaPayloadInjection(\n objectId: Protocol.Runtime.RemoteObjectId,\n files: NormalizedFilePayload[],\n ): Promise<void> {\n const session = this.frame.session;\n\n for (const payload of files) {\n if (payload.buffer.length > MAX_REMOTE_UPLOAD_BYTES) {\n throw new StagehandInvalidArgumentError(\n `setInputFiles(): file \"${payload.name}\" is larger than the 50MB limit for remote uploads`,\n );\n }\n }\n\n const serialized = files.map((payload) => ({\n name: payload.name,\n mimeType: payload.mimeType,\n lastModified: payload.lastModified,\n base64: payload.buffer.toString(\"base64\"),\n }));\n\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration:\n locatorScriptSources.assignFilePayloadsToInputElement,\n arguments: [\n {\n value: serialized,\n },\n ],\n returnByValue: true,\n },\n );\n\n const ok = Boolean(res.result?.value);\n if (!ok) {\n throw new StagehandInvalidArgumentError(\n \"Unable to assign file payloads to remote input element\",\n );\n }\n }\n\n /**\n * Return the DOM backendNodeId for this locator's target element.\n * Useful for identity comparisons without needing element handles.\n */\n async backendNodeId(): Promise<Protocol.DOM.BackendNodeId> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session.send(\"DOM.enable\").catch(() => {});\n const { node } = await session.send<{ node: Protocol.DOM.Node }>(\n \"DOM.describeNode\",\n { objectId },\n );\n return node.backendNodeId as Protocol.DOM.BackendNodeId;\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /** Return how many nodes the current selector resolves to. */\n public async count(): Promise<number> {\n const session = this.frame.session;\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n return this.selectorResolver.count(this.selectorQuery);\n }\n\n /**\n * Return the center of the element's bounding box in the owning frame's viewport\n * (CSS pixels), rounded to integers. Scrolls into view best-effort.\n */\n public async centroid(): Promise<{ x: number; y: number }> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n return { x: Math.round(cx), y: Math.round(cy) };\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Highlight the element's bounding box using the CDP Overlay domain.\n * - Scrolls element into view best-effort.\n * - Shows a semi-transparent overlay briefly, then hides it.\n */\n public async highlight(options?: {\n durationMs?: number;\n borderColor?: { r: number; g: number; b: number; a?: number };\n contentColor?: { r: number; g: number; b: number; a?: number };\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n const duration = Math.max(0, options?.durationMs ?? 800);\n\n const borderColor = options?.borderColor ?? { r: 255, g: 0, b: 0, a: 0.9 };\n const contentColor =\n options?.contentColor ?? ({ r: 255, g: 200, b: 0, a: 0.2 } as const);\n\n try {\n await session.send(\"Overlay.enable\").catch(() => {});\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n\n // Prefer backendNodeId to keep highlight stable even if objectId is released.\n await session.send(\"DOM.enable\").catch(() => {});\n let backendNodeId: Protocol.DOM.BackendNodeId | undefined;\n try {\n const { node } = await session.send<{ node: Protocol.DOM.Node }>(\n \"DOM.describeNode\",\n { objectId },\n );\n backendNodeId = node.backendNodeId as Protocol.DOM.BackendNodeId;\n } catch {\n backendNodeId = undefined;\n }\n\n const highlightConfig: Protocol.Overlay.HighlightConfig = {\n showInfo: false,\n showStyles: false,\n showRulers: false,\n showExtensionLines: false,\n borderColor,\n contentColor,\n } as Protocol.Overlay.HighlightConfig;\n\n const highlightOnce = async () => {\n await session.send<never>(\"Overlay.highlightNode\", {\n ...(backendNodeId ? { backendNodeId } : { objectId }),\n highlightConfig,\n });\n };\n\n // Initial draw\n await highlightOnce();\n\n // Keep alive until duration elapses to resist overlay clears on mouse move/repaints\n if (duration > 0) {\n const start = Date.now();\n const tick = Math.min(300, Math.max(100, Math.floor(duration / 50)));\n while (Date.now() - start < duration) {\n await new Promise((r) => setTimeout(r, tick));\n try {\n await highlightOnce();\n } catch {\n // ignore transient errors\n }\n }\n await session.send<never>(\"Overlay.hideHighlight\").catch(() => {});\n }\n } finally {\n // Releasing objectId should not affect highlight when using backendNodeId.\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Move the mouse cursor to the element's visual center without clicking.\n * - Scrolls into view best-effort, resolves geometry, then dispatches a mouse move.\n */\n async hover(): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n\n await session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x: cx,\n y: cy,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest);\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Click the element at its visual center.\n * Steps:\n * 1) Resolve selector to { objectId } in the frame world.\n * 2) Scroll into view via `DOM.scrollIntoViewIfNeeded({ objectId })`.\n * 3) Read geometry via `DOM.getBoxModel({ objectId })` → compute a center point.\n * 4) Synthesize mouse press + release via `Input.dispatchMouseEvent`.\n */\n async click(options?: {\n button?: MouseButton;\n clickCount?: number;\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n const button = options?.button ?? \"left\";\n const clickCount = options?.clickCount ?? 1;\n\n try {\n // Scroll into view using objectId (avoids frontend nodeId dependence)\n await session.send(\"DOM.scrollIntoViewIfNeeded\", { objectId });\n\n // Get geometry using objectId\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n\n // Dispatch input (from the same session) without waiting between events.\n // This keeps multi-clicks within tight thresholds on remote browsers.\n const dispatches: Array<Promise<unknown>> = [];\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x: cx,\n y: cy,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n\n for (let i = 1; i <= clickCount; i++) {\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mousePressed\",\n x: cx,\n y: cy,\n button,\n clickCount: i,\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseReleased\",\n x: cx,\n y: cy,\n button,\n clickCount: i,\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n }\n\n await Promise.all(dispatches);\n } finally {\n // release the element handle\n try {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n } catch {\n // If the context navigated or was destroyed (e.g., link opens new tab),\n // releaseObject may fail with -32000. Ignore as best-effort cleanup.\n }\n }\n }\n\n /**\n * Dispatch a DOM 'click' MouseEvent on the element itself.\n * - Does not synthesize real pointer input; directly dispatches an event.\n * - Useful for elements that rely on click handlers without needing hit-testing.\n */\n async sendClickEvent(options?: {\n bubbles?: boolean;\n cancelable?: boolean;\n composed?: boolean;\n detail?: number;\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n const bubbles = options?.bubbles ?? true;\n const cancelable = options?.cancelable ?? true;\n const composed = options?.composed ?? true;\n const detail = options?.detail ?? 1;\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.dispatchDomClick,\n arguments: [\n {\n value: { bubbles, cancelable, composed, detail },\n },\n ],\n returnByValue: true,\n },\n );\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Scroll the element vertically to a given percentage (0–100).\n * - If the element is <html> or <body>, scrolls the window/document.\n * - Otherwise, scrolls the element itself via element.scrollTo.\n */\n async scrollTo(percent: number | string): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.scrollElementToPercent,\n arguments: [{ value: percent as unknown as number }],\n returnByValue: true,\n },\n );\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Fill an input/textarea/contenteditable element.\n * Mirrors Playwright semantics: the DOM helper either applies the native\n * value setter (for special input types) or asks us to type text via the CDP\n * Input domain after focusing/selecting.\n */\n async fill(value: string): Promise<void> {\n const session = this.frame.session;\n // Use the bundled locator globals; the raw fill snippet depends on helper symbols.\n const fillDeclaration = `function(value) { ${locatorScriptBootstrap}; return ${locatorScriptGlobalRefs.fillElementValue}.call(this, value); }`;\n const { objectId } = await this.resolveNode();\n\n let releaseNeeded = true;\n\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: fillDeclaration,\n arguments: [{ value }],\n returnByValue: true,\n },\n );\n if (res.exceptionDetails) {\n // prefer exception.description over text (eg \"Uncaught\")\n const message =\n res.exceptionDetails.exception?.description ??\n res.exceptionDetails.text ??\n \"Unknown exception during locator().fill()\";\n throw new StagehandLocatorError(\"Filling\", this.selector, message);\n }\n\n const result = res.result.value as\n | { status?: string; reason?: string; value?: string }\n | null\n | undefined;\n const status =\n typeof result === \"object\" && result ? result.status : undefined;\n\n if (status === \"done\") {\n return;\n }\n\n if (status === \"needsinput\") {\n // Release the current handle before synthesizing keyboard input to avoid leaking it.\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n releaseNeeded = false;\n\n const valueToType =\n typeof result?.value === \"string\" ? result.value : value;\n\n let prepared = false;\n try {\n const { objectId: prepObjectId } = await this.resolveNode();\n try {\n const prepRes =\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId: prepObjectId,\n functionDeclaration:\n locatorScriptSources.prepareElementForTyping,\n returnByValue: true,\n },\n );\n prepared = Boolean(prepRes.result.value);\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId: prepObjectId })\n .catch(() => {});\n }\n } catch {\n // Ignore preparation failures; we'll fall back to typing best-effort.\n }\n\n if (!prepared && valueToType.length > 0) {\n await this.type(valueToType);\n return;\n }\n\n if (valueToType.length === 0) {\n // Simulate deleting the currently selected text to clear the field.\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n key: \"Backspace\",\n code: \"Backspace\",\n windowsVirtualKeyCode: 8,\n nativeVirtualKeyCode: 8,\n } as Protocol.Input.DispatchKeyEventRequest);\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n key: \"Backspace\",\n code: \"Backspace\",\n windowsVirtualKeyCode: 8,\n nativeVirtualKeyCode: 8,\n } as Protocol.Input.DispatchKeyEventRequest);\n } else {\n await session.send<never>(\"Input.insertText\", { text: valueToType });\n }\n\n return;\n }\n\n if (status === \"error\") {\n const reason =\n typeof result?.reason === \"string\" && result.reason.length > 0\n ? result.reason\n : \"Failed to fill element\";\n throw new StagehandInvalidArgumentError(\n `Failed to fill element (${reason})`,\n );\n }\n\n // Backward compatibility: if no status is returned (older bundle), fall back to setter logic.\n if (!status) {\n await this.type(value);\n }\n } finally {\n if (releaseNeeded) {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n }\n\n /**\n * Type text into the element (focuses first).\n * - Focus via element.focus() in page JS (no DOM.focus(nodeId)).\n * - If no delay, uses `Input.insertText` for efficiency.\n * - With delay, synthesizes `keyDown`/`keyUp` per character.\n */\n async type(text: string, options?: { delay?: number }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n try {\n // Focus using JS (avoids DOM.focus(nodeId))\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.focusElement,\n returnByValue: true,\n },\n );\n\n if (!options?.delay) {\n await session.send<never>(\"Input.insertText\", { text });\n return;\n }\n\n for (const ch of text) {\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n text: ch,\n key: ch,\n } as Protocol.Input.DispatchKeyEventRequest);\n\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n text: ch,\n key: ch,\n } as Protocol.Input.DispatchKeyEventRequest);\n\n await new Promise((r) => setTimeout(r, options.delay));\n }\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Select one or more options on a `<select>` element.\n * Returns the values actually selected after the operation.\n */\n async selectOption(values: string | string[]): Promise<string[]> {\n const session = this.frame.session;\n const desired = Array.isArray(values) ? values : [values];\n const { objectId } = await this.resolveNode();\n\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.selectElementOptions,\n arguments: [{ value: desired }],\n returnByValue: true,\n },\n );\n\n return (res.result.value as string[]) ?? [];\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return true if the element is attached and visible (rough heuristic).\n */\n async isVisible(): Promise<boolean> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.isElementVisible,\n returnByValue: true,\n },\n );\n return Boolean(res.result.value);\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return true if the element is an input[type=checkbox|radio] and is checked.\n * Also considers aria-checked for ARIA widgets.\n */\n async isChecked(): Promise<boolean> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.isElementChecked,\n returnByValue: true,\n },\n );\n return Boolean(res.result.value);\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's input value (for input/textarea/select/contenteditable).\n */\n async inputValue(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInputValue,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's textContent (raw, not innerText).\n */\n async textContent(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementTextContent,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's innerHTML string.\n */\n async innerHtml(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInnerHTML,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's innerText (layout-aware, visible text).\n */\n async innerText(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInnerText,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return a locator narrowed to the first match.\n */\n first(): Locator {\n return this.nth(0);\n }\n\n /** Return a locator narrowed to the element at the given zero-based index. */\n nth(index: number): Locator {\n const value = Number(index);\n if (!Number.isFinite(value) || value < 0) {\n throw new StagehandInvalidArgumentError(\n \"locator().nth() expects a non-negative index\",\n );\n }\n\n const nextIndex = Math.floor(value);\n if (nextIndex === this.nthIndex) {\n return this;\n }\n\n return new Locator(this.frame, this.selector, this.options, nextIndex);\n }\n\n // ---------- helpers ----------\n\n /**\n * Resolve `this.selector` within the frame to `{ objectId, nodeId? }`:\n * Delegates to a shared selector resolver so all selector logic stays in sync.\n */\n public async resolveNode(): Promise<{\n nodeId: Protocol.DOM.NodeId | null;\n objectId: Protocol.Runtime.RemoteObjectId;\n }> {\n const session = this.frame.session;\n\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n\n const index = this.nthIndex < 0 ? 0 : this.nthIndex;\n const resolved = await this.selectorResolver.resolveAtIndex(\n this.selectorQuery,\n index,\n );\n if (!resolved) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n\n return resolved;\n }\n\n /**\n * Resolve all matching nodes for this locator.\n * If the locator is narrowed via nth(), only that index is returned.\n */\n public async resolveNodesForMask(): Promise<\n Array<{\n nodeId: Protocol.DOM.NodeId | null;\n objectId: Protocol.Runtime.RemoteObjectId;\n }>\n > {\n const session = this.frame.session;\n\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n\n if (this.nthIndex >= 0) {\n const resolved = await this.selectorResolver.resolveAtIndex(\n this.selectorQuery,\n this.nthIndex,\n );\n if (!resolved) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n return [resolved];\n }\n\n const resolved = await this.selectorResolver.resolveAll(this.selectorQuery);\n if (!resolved.length) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n return resolved;\n }\n\n /** Compute a center point from a BoxModel content quad */\n private centerFromBoxContent(content: number[]): { cx: number; cy: number } {\n // content is [x1,y1, x2,y2, x3,y3, x4,y4]\n if (!content || content.length < 8) {\n throw new StagehandInvalidArgumentError(\"Invalid box model content quad\");\n }\n const xs = [content[0], content[2], content[4], content[6]];\n const ys = [content[1], content[3], content[5], content[7]];\n const cx = (xs[0] + xs[1] + xs[2] + xs[3]) / 4;\n const cy = (ys[0] + ys[1] + ys[2] + ys[3]) / 4;\n return { cx, cy };\n }\n}\n"]}
1
+ {"version":3,"file":"locator.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/locator.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/understudy/locator.ts\nimport { Protocol } from \"devtools-protocol\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport {\n locatorScriptBootstrap,\n locatorScriptGlobalRefs,\n locatorScriptSources,\n} from \"../dom/build/locatorScripts.generated.js\";\nimport type { Frame } from \"./frame.js\";\nimport {\n FrameSelectorResolver,\n type SelectorQuery,\n} from \"./selectorResolver.js\";\nimport {\n StagehandElementNotFoundError,\n StagehandInvalidArgumentError,\n StagehandLocatorError,\n ElementNotVisibleError,\n} from \"../types/public/sdkErrors.js\";\nimport { normalizeInputFiles } from \"./fileUploadUtils.js\";\nimport { SetInputFilesArgument, MouseButton } from \"../types/public/locator.js\";\nimport { NormalizedFilePayload } from \"../types/private/locator.js\";\n\nconst MAX_REMOTE_UPLOAD_BYTES = 50 * 1024 * 1024; // 50MB guard copied from Playwright\n\n/**\n * Locator\n *\n * Purpose:\n * A small, CDP-based element interaction helper scoped to a specific `Frame`.\n * It resolves a CSS/XPath selector inside the frame’s **isolated world**, and then\n * performs low-level actions (click, type, select) using DOM/Runtime/Input\n * protocol domains with minimal abstraction.\n *\n * Key change:\n * - Prefer **objectId**-based CDP calls (scroll, geometry) to avoid brittle\n * frontend nodeId mappings. nodeId is resolved on a best-effort basis and\n * returned for compatibility, but actions do not depend on it.\n *\n * Notes:\n * - Resolution is lazy: every action resolves the selector again.\n * - Uses `Page.createIsolatedWorld` so evaluation is isolated from page scripts.\n * - Releases remote objects (`Runtime.releaseObject`) where appropriate.\n */\nexport class Locator {\n private readonly selectorResolver: FrameSelectorResolver;\n\n private readonly selectorQuery: SelectorQuery;\n\n // -1 means \"no explicit nth()\"; default locator resolves to first match for actions.\n private readonly nthIndex: number;\n\n constructor(\n private readonly frame: Frame,\n private readonly selector: string,\n private readonly options?: { deep?: boolean; depth?: number },\n nthIndex: number = -1,\n ) {\n this.selectorResolver = new FrameSelectorResolver(this.frame);\n this.selectorQuery = FrameSelectorResolver.parseSelector(selector);\n const normalized = Number.isFinite(nthIndex) ? Math.floor(nthIndex) : -1;\n this.nthIndex = normalized < 0 ? -1 : normalized;\n }\n\n /** Return the owning Frame for this locator (typed accessor, no private access). */\n public getFrame(): Frame {\n return this.frame;\n }\n\n /**\n * Set files on an <input type=\"file\"> element.\n *\n * Mirrors Playwright's Locator.setInputFiles basics:\n * - Accepts file path(s) or payload object(s) { name, mimeType, buffer }.\n * - Uses CDP DOM.setFileInputFiles under the hood.\n * - Best‑effort dispatches change/input via CDP (Chrome does by default).\n * - Passing an empty array clears the selection.\n */\n public async setInputFiles(files: SetInputFilesArgument): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n const tempFiles: string[] = [];\n\n try {\n // Validate element is an <input type=\"file\">\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.ensureFileInputElement,\n returnByValue: true,\n },\n );\n const ok = Boolean(res.result.value);\n if (!ok)\n throw new StagehandInvalidArgumentError(\n 'Target is not an <input type=\"file\"> element',\n );\n } catch (e) {\n throw new StagehandInvalidArgumentError(\n e instanceof Error\n ? e.message\n : \"Unable to verify file input element\",\n );\n }\n\n const normalized = await normalizeInputFiles(files);\n\n if (!normalized.length) {\n await session.send<never>(\"DOM.setFileInputFiles\", {\n objectId,\n files: [],\n });\n return;\n }\n\n if (this.frame.isBrowserRemote()) {\n await this.assignFilesViaPayloadInjection(objectId, normalized);\n return;\n }\n\n const filePaths: string[] = [];\n for (const payload of normalized) {\n if (payload.absolutePath) {\n filePaths.push(payload.absolutePath);\n continue;\n }\n const ext = path.extname(payload.name);\n const tmp = path.join(\n os.tmpdir(),\n `stagehand-upload-${Date.now()}-${Math.random().toString(36).slice(2)}${ext}`,\n );\n await fs.promises.writeFile(tmp, payload.buffer);\n tempFiles.push(tmp);\n filePaths.push(tmp);\n }\n\n await session.send<never>(\"DOM.setFileInputFiles\", {\n objectId,\n files: filePaths,\n });\n } finally {\n // Cleanup: release element and remove any temporary files we created\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n for (const p of tempFiles) {\n try {\n await fs.promises.unlink(p);\n } catch {\n // ignore\n }\n }\n }\n }\n\n /**\n * Remote browser fallback: build File objects inside the page and attach them via JS.\n *\n * When Stagehand is driving a browser that cannot see the local filesystem (Browserbase,\n * remote CDP, etc.), CDP's DOM.setFileInputFiles would fail because Chrome can't reach\n * our temp files. Instead we base64-encode the payloads, send them into the page, and\n * let a DOM helper create File objects + dispatch change/input events.\n */\n private async assignFilesViaPayloadInjection(\n objectId: Protocol.Runtime.RemoteObjectId,\n files: NormalizedFilePayload[],\n ): Promise<void> {\n const session = this.frame.session;\n\n for (const payload of files) {\n if (payload.buffer.length > MAX_REMOTE_UPLOAD_BYTES) {\n throw new StagehandInvalidArgumentError(\n `setInputFiles(): file \"${payload.name}\" is larger than the 50MB limit for remote uploads`,\n );\n }\n }\n\n const serialized = files.map((payload) => ({\n name: payload.name,\n mimeType: payload.mimeType,\n lastModified: payload.lastModified,\n base64: payload.buffer.toString(\"base64\"),\n }));\n\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration:\n locatorScriptSources.assignFilePayloadsToInputElement,\n arguments: [\n {\n value: serialized,\n },\n ],\n returnByValue: true,\n },\n );\n\n const ok = Boolean(res.result?.value);\n if (!ok) {\n throw new StagehandInvalidArgumentError(\n \"Unable to assign file payloads to remote input element\",\n );\n }\n }\n\n /**\n * Return the DOM backendNodeId for this locator's target element.\n * Useful for identity comparisons without needing element handles.\n */\n async backendNodeId(): Promise<Protocol.DOM.BackendNodeId> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session.send(\"DOM.enable\").catch(() => {});\n const { node } = await session.send<{ node: Protocol.DOM.Node }>(\n \"DOM.describeNode\",\n { objectId },\n );\n return node.backendNodeId as Protocol.DOM.BackendNodeId;\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /** Return how many nodes the current selector resolves to. */\n public async count(): Promise<number> {\n const session = this.frame.session;\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n return this.selectorResolver.count(this.selectorQuery);\n }\n\n /**\n * Return the center of the element's bounding box in the owning frame's viewport\n * (CSS pixels), rounded to integers. Scrolls into view best-effort.\n */\n public async centroid(): Promise<{ x: number; y: number }> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n return { x: Math.round(cx), y: Math.round(cy) };\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Highlight the element's bounding box using the CDP Overlay domain.\n * - Scrolls element into view best-effort.\n * - Shows a semi-transparent overlay briefly, then hides it.\n */\n public async highlight(options?: {\n durationMs?: number;\n borderColor?: { r: number; g: number; b: number; a?: number };\n contentColor?: { r: number; g: number; b: number; a?: number };\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n const duration = Math.max(0, options?.durationMs ?? 800);\n\n const borderColor = options?.borderColor ?? { r: 255, g: 0, b: 0, a: 0.9 };\n const contentColor =\n options?.contentColor ?? ({ r: 255, g: 200, b: 0, a: 0.2 } as const);\n\n try {\n await session.send(\"Overlay.enable\").catch(() => {});\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n\n // Prefer backendNodeId to keep highlight stable even if objectId is released.\n await session.send(\"DOM.enable\").catch(() => {});\n let backendNodeId: Protocol.DOM.BackendNodeId | undefined;\n try {\n const { node } = await session.send<{ node: Protocol.DOM.Node }>(\n \"DOM.describeNode\",\n { objectId },\n );\n backendNodeId = node.backendNodeId as Protocol.DOM.BackendNodeId;\n } catch {\n backendNodeId = undefined;\n }\n\n const highlightConfig: Protocol.Overlay.HighlightConfig = {\n showInfo: false,\n showStyles: false,\n showRulers: false,\n showExtensionLines: false,\n borderColor,\n contentColor,\n } as Protocol.Overlay.HighlightConfig;\n\n const highlightOnce = async () => {\n await session.send<never>(\"Overlay.highlightNode\", {\n ...(backendNodeId ? { backendNodeId } : { objectId }),\n highlightConfig,\n });\n };\n\n // Initial draw\n await highlightOnce();\n\n // Keep alive until duration elapses to resist overlay clears on mouse move/repaints\n if (duration > 0) {\n const start = Date.now();\n const tick = Math.min(300, Math.max(100, Math.floor(duration / 50)));\n while (Date.now() - start < duration) {\n await new Promise((r) => setTimeout(r, tick));\n try {\n await highlightOnce();\n } catch {\n // ignore transient errors\n }\n }\n await session.send<never>(\"Overlay.hideHighlight\").catch(() => {});\n }\n } finally {\n // Releasing objectId should not affect highlight when using backendNodeId.\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Move the mouse cursor to the element's visual center without clicking.\n * - Scrolls into view best-effort, resolves geometry, then dispatches a mouse move.\n */\n async hover(): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n\n await session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x: cx,\n y: cy,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest);\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Click the element at its visual center.\n * Steps:\n * 1) Resolve selector to { objectId } in the frame world.\n * 2) Scroll into view via `DOM.scrollIntoViewIfNeeded({ objectId })`.\n * 3) Read geometry via `DOM.getBoxModel({ objectId })` → compute a center point.\n * 4) Synthesize mouse press + release via `Input.dispatchMouseEvent`.\n */\n async click(options?: {\n button?: MouseButton;\n clickCount?: number;\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n const button = options?.button ?? \"left\";\n const clickCount = options?.clickCount ?? 1;\n\n try {\n // Scroll into view using objectId (avoids frontend nodeId dependence)\n await session.send(\"DOM.scrollIntoViewIfNeeded\", { objectId });\n\n // Get geometry using objectId\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n\n // Dispatch click events in a pipelined burst to reduce inter-click delay\n // from network/CPU jitter between round trips.\n const dispatches: Array<Promise<unknown>> = [];\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x: cx,\n y: cy,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n\n for (let i = 1; i <= clickCount; i++) {\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mousePressed\",\n x: cx,\n y: cy,\n button,\n clickCount: i,\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseReleased\",\n x: cx,\n y: cy,\n button,\n clickCount: i,\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n }\n await Promise.all(dispatches);\n } finally {\n // release the element handle\n try {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n } catch {\n // If the context navigated or was destroyed (e.g., link opens new tab),\n // releaseObject may fail with -32000. Ignore as best-effort cleanup.\n }\n }\n }\n\n /**\n * Dispatch a DOM 'click' MouseEvent on the element itself.\n * - Does not synthesize real pointer input; directly dispatches an event.\n * - Useful for elements that rely on click handlers without needing hit-testing.\n */\n async sendClickEvent(options?: {\n bubbles?: boolean;\n cancelable?: boolean;\n composed?: boolean;\n detail?: number;\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n const bubbles = options?.bubbles ?? true;\n const cancelable = options?.cancelable ?? true;\n const composed = options?.composed ?? true;\n const detail = options?.detail ?? 1;\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.dispatchDomClick,\n arguments: [\n {\n value: { bubbles, cancelable, composed, detail },\n },\n ],\n returnByValue: true,\n },\n );\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Scroll the element vertically to a given percentage (0–100).\n * - If the element is <html> or <body>, scrolls the window/document.\n * - Otherwise, scrolls the element itself via element.scrollTo.\n */\n async scrollTo(percent: number | string): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.scrollElementToPercent,\n arguments: [{ value: percent as unknown as number }],\n returnByValue: true,\n },\n );\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Fill an input/textarea/contenteditable element.\n * Mirrors Playwright semantics: the DOM helper either applies the native\n * value setter (for special input types) or asks us to type text via the CDP\n * Input domain after focusing/selecting.\n */\n async fill(value: string): Promise<void> {\n const session = this.frame.session;\n // Use the bundled locator globals; the raw fill snippet depends on helper symbols.\n const fillDeclaration = `function(value) { ${locatorScriptBootstrap}; return ${locatorScriptGlobalRefs.fillElementValue}.call(this, value); }`;\n const { objectId } = await this.resolveNode();\n\n let releaseNeeded = true;\n\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: fillDeclaration,\n arguments: [{ value }],\n returnByValue: true,\n },\n );\n if (res.exceptionDetails) {\n // prefer exception.description over text (eg \"Uncaught\")\n const message =\n res.exceptionDetails.exception?.description ??\n res.exceptionDetails.text ??\n \"Unknown exception during locator().fill()\";\n throw new StagehandLocatorError(\"Filling\", this.selector, message);\n }\n\n const result = res.result.value as\n | { status?: string; reason?: string; value?: string }\n | null\n | undefined;\n const status =\n typeof result === \"object\" && result ? result.status : undefined;\n\n if (status === \"done\") {\n return;\n }\n\n if (status === \"needsinput\") {\n // Release the current handle before synthesizing keyboard input to avoid leaking it.\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n releaseNeeded = false;\n\n const valueToType =\n typeof result?.value === \"string\" ? result.value : value;\n\n let prepared = false;\n try {\n const { objectId: prepObjectId } = await this.resolveNode();\n try {\n const prepRes =\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId: prepObjectId,\n functionDeclaration:\n locatorScriptSources.prepareElementForTyping,\n returnByValue: true,\n },\n );\n prepared = Boolean(prepRes.result.value);\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId: prepObjectId })\n .catch(() => {});\n }\n } catch {\n // Ignore preparation failures; we'll fall back to typing best-effort.\n }\n\n if (!prepared && valueToType.length > 0) {\n await this.type(valueToType);\n return;\n }\n\n if (valueToType.length === 0) {\n // Simulate deleting the currently selected text to clear the field.\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n key: \"Backspace\",\n code: \"Backspace\",\n windowsVirtualKeyCode: 8,\n nativeVirtualKeyCode: 8,\n } as Protocol.Input.DispatchKeyEventRequest);\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n key: \"Backspace\",\n code: \"Backspace\",\n windowsVirtualKeyCode: 8,\n nativeVirtualKeyCode: 8,\n } as Protocol.Input.DispatchKeyEventRequest);\n } else {\n await session.send<never>(\"Input.insertText\", { text: valueToType });\n }\n\n return;\n }\n\n if (status === \"error\") {\n const reason =\n typeof result?.reason === \"string\" && result.reason.length > 0\n ? result.reason\n : \"Failed to fill element\";\n throw new StagehandInvalidArgumentError(\n `Failed to fill element (${reason})`,\n );\n }\n\n // Backward compatibility: if no status is returned (older bundle), fall back to setter logic.\n if (!status) {\n await this.type(value);\n }\n } finally {\n if (releaseNeeded) {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n }\n\n /**\n * Type text into the element (focuses first).\n * - Focus via element.focus() in page JS (no DOM.focus(nodeId)).\n * - If no delay, uses `Input.insertText` for efficiency.\n * - With delay, synthesizes `keyDown`/`keyUp` per character.\n */\n async type(text: string, options?: { delay?: number }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n try {\n // Focus using JS (avoids DOM.focus(nodeId))\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.focusElement,\n returnByValue: true,\n },\n );\n\n if (!options?.delay) {\n await session.send<never>(\"Input.insertText\", { text });\n return;\n }\n\n for (const ch of text) {\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n text: ch,\n key: ch,\n } as Protocol.Input.DispatchKeyEventRequest);\n\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n text: ch,\n key: ch,\n } as Protocol.Input.DispatchKeyEventRequest);\n\n await new Promise((r) => setTimeout(r, options.delay));\n }\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Select one or more options on a `<select>` element.\n * Returns the values actually selected after the operation.\n */\n async selectOption(values: string | string[]): Promise<string[]> {\n const session = this.frame.session;\n const desired = Array.isArray(values) ? values : [values];\n const { objectId } = await this.resolveNode();\n\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.selectElementOptions,\n arguments: [{ value: desired }],\n returnByValue: true,\n },\n );\n\n return (res.result.value as string[]) ?? [];\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return true if the element is attached and visible (rough heuristic).\n */\n async isVisible(): Promise<boolean> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.isElementVisible,\n returnByValue: true,\n },\n );\n return Boolean(res.result.value);\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return true if the element is an input[type=checkbox|radio] and is checked.\n * Also considers aria-checked for ARIA widgets.\n */\n async isChecked(): Promise<boolean> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.isElementChecked,\n returnByValue: true,\n },\n );\n return Boolean(res.result.value);\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's input value (for input/textarea/select/contenteditable).\n */\n async inputValue(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInputValue,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's textContent (raw, not innerText).\n */\n async textContent(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementTextContent,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's innerHTML string.\n */\n async innerHtml(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInnerHTML,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's innerText (layout-aware, visible text).\n */\n async innerText(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInnerText,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return a locator narrowed to the first match.\n */\n first(): Locator {\n return this.nth(0);\n }\n\n /** Return a locator narrowed to the element at the given zero-based index. */\n nth(index: number): Locator {\n const value = Number(index);\n if (!Number.isFinite(value) || value < 0) {\n throw new StagehandInvalidArgumentError(\n \"locator().nth() expects a non-negative index\",\n );\n }\n\n const nextIndex = Math.floor(value);\n if (nextIndex === this.nthIndex) {\n return this;\n }\n\n return new Locator(this.frame, this.selector, this.options, nextIndex);\n }\n\n // ---------- helpers ----------\n\n /**\n * Resolve `this.selector` within the frame to `{ objectId, nodeId? }`:\n * Delegates to a shared selector resolver so all selector logic stays in sync.\n */\n public async resolveNode(): Promise<{\n nodeId: Protocol.DOM.NodeId | null;\n objectId: Protocol.Runtime.RemoteObjectId;\n }> {\n const session = this.frame.session;\n\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n\n const index = this.nthIndex < 0 ? 0 : this.nthIndex;\n const resolved = await this.selectorResolver.resolveAtIndex(\n this.selectorQuery,\n index,\n );\n if (!resolved) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n\n return resolved;\n }\n\n /**\n * Resolve all matching nodes for this locator.\n * If the locator is narrowed via nth(), only that index is returned.\n */\n public async resolveNodesForMask(): Promise<\n Array<{\n nodeId: Protocol.DOM.NodeId | null;\n objectId: Protocol.Runtime.RemoteObjectId;\n }>\n > {\n const session = this.frame.session;\n\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n\n if (this.nthIndex >= 0) {\n const resolved = await this.selectorResolver.resolveAtIndex(\n this.selectorQuery,\n this.nthIndex,\n );\n if (!resolved) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n return [resolved];\n }\n\n const resolved = await this.selectorResolver.resolveAll(this.selectorQuery);\n if (!resolved.length) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n return resolved;\n }\n\n /** Compute a center point from a BoxModel content quad */\n private centerFromBoxContent(content: number[]): { cx: number; cy: number } {\n // content is [x1,y1, x2,y2, x3,y3, x4,y4]\n if (!content || content.length < 8) {\n throw new StagehandInvalidArgumentError(\"Invalid box model content quad\");\n }\n const xs = [content[0], content[2], content[4], content[6]];\n const ys = [content[1], content[3], content[5], content[7]];\n const cx = (xs[0] + xs[1] + xs[2] + xs[3]) / 4;\n const cy = (ys[0] + ys[1] + ys[2] + ys[3]) / 4;\n return { cx, cy };\n }\n}\n"]}
@@ -1145,8 +1145,9 @@ let Page = (() => {
1145
1145
  }
1146
1146
  }
1147
1147
  // Synthesize a simple mouse move + press + release sequence.
1148
- // Fire events without waiting between them to keep multi-clicks tight.
1149
1148
  await this.updateCursor(x, y);
1149
+ // Dispatch click events in a pipelined burst to reduce inter-click delay
1150
+ // from network/CPU jitter between round trips.
1150
1151
  const dispatches = [];
1151
1152
  dispatches.push(this.mainSession.send("Input.dispatchMouseEvent", {
1152
1153
  type: "mouseMoved",