{"version":3,"sources":["jsdelivr-header.js","/npm/fork-of-dont-use-stagehand@1.13.0/dist/index.js"],"names":[],"mappings":"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","file":"/npm/fork-of-dont-use-stagehand@1.13.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/fork-of-dont-use-stagehand@1.13.0/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","var __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __reflectGet = Reflect.get;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n  for (var prop in b || (b = {}))\n    if (__hasOwnProp.call(b, prop))\n      __defNormalProp(a, prop, b[prop]);\n  if (__getOwnPropSymbols)\n    for (var prop of __getOwnPropSymbols(b)) {\n      if (__propIsEnum.call(b, prop))\n        __defNormalProp(a, prop, b[prop]);\n    }\n  return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nvar __objRest = (source, exclude) => {\n  var target = {};\n  for (var prop in source)\n    if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n      target[prop] = source[prop];\n  if (source != null && __getOwnPropSymbols)\n    for (var prop of __getOwnPropSymbols(source)) {\n      if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n        target[prop] = source[prop];\n    }\n  return target;\n};\nvar __export = (target, all) => {\n  for (var name in all)\n    __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n  if (from && typeof from === \"object\" || typeof from === \"function\") {\n    for (let key of __getOwnPropNames(from))\n      if (!__hasOwnProp.call(to, key) && key !== except)\n        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n  }\n  return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n  // If the importer is in node compatibility mode or this is not an ESM\n  // file that has been converted to a CommonJS file using a Babel-\n  // compatible transform (i.e. \"__esModule\" has not been set), then set\n  // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n  isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n  mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\nvar __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);\nvar __async = (__this, __arguments, generator) => {\n  return new Promise((resolve, reject) => {\n    var fulfilled = (value) => {\n      try {\n        step(generator.next(value));\n      } catch (e) {\n        reject(e);\n      }\n    };\n    var rejected = (value) => {\n      try {\n        step(generator.throw(value));\n      } catch (e) {\n        reject(e);\n      }\n    };\n    var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);\n    step((generator = generator.apply(__this, __arguments)).next());\n  });\n};\n\n// lib/index.ts\nvar index_exports = {};\n__export(index_exports, {\n  AnnotatedScreenshotText: () => AnnotatedScreenshotText,\n  AvailableModelSchema: () => AvailableModelSchema,\n  LLMClient: () => LLMClient,\n  PlaywrightCommandException: () => PlaywrightCommandException,\n  PlaywrightCommandMethodNotSupportedException: () => PlaywrightCommandMethodNotSupportedException,\n  Stagehand: () => Stagehand,\n  defaultExtractSchema: () => defaultExtractSchema\n});\nmodule.exports = __toCommonJS(index_exports);\nvar import_sdk3 = require(\"@browserbasehq/sdk\");\nvar import_test2 = require(\"@playwright/test\");\nvar import_crypto2 = require(\"crypto\");\nvar import_dotenv = __toESM(require(\"dotenv\"));\nvar import_fs = __toESM(require(\"fs\"));\nvar import_os = __toESM(require(\"os\"));\nvar import_path = __toESM(require(\"path\"));\n\n// lib/StagehandContext.ts\nvar StagehandContext = class _StagehandContext {\n  constructor(context, stagehand) {\n    this.intContext = context;\n    this.stagehand = stagehand;\n  }\n  static init(context, stagehand) {\n    return __async(this, null, function* () {\n      const proxyContext = new Proxy(context, {\n        get: (target, prop) => {\n          return target[prop];\n        }\n      });\n      const instance = new _StagehandContext(proxyContext, stagehand);\n      return instance;\n    });\n  }\n  get context() {\n    return this.intContext;\n  }\n};\n\n// lib/StagehandPage.ts\nvar import_sdk = require(\"@browserbasehq/sdk\");\nvar import_test = require(\"@playwright/test\");\n\n// types/page.ts\nvar import_zod = require(\"zod\");\nvar defaultExtractSchema = import_zod.z.object({\n  extraction: import_zod.z.string()\n});\n\n// types/playwright.ts\nvar PlaywrightCommandException = class extends Error {\n  constructor(message) {\n    super(message);\n    this.name = \"PlaywrightCommandException\";\n  }\n};\nvar PlaywrightCommandMethodNotSupportedException = class extends Error {\n  constructor(message) {\n    super(message);\n    this.name = \"PlaywrightCommandMethodNotSupportedException\";\n  }\n};\n\n// lib/cache/BaseCache.ts\nvar fs = __toESM(require(\"fs\"));\nvar path = __toESM(require(\"path\"));\nvar crypto = __toESM(require(\"crypto\"));\nvar BaseCache = class {\n  constructor(logger, cacheDir = path.join(process.cwd(), \"tmp\", \".cache\"), cacheFile = \"cache.json\") {\n    this.CACHE_MAX_AGE_MS = 7 * 24 * 60 * 60 * 1e3;\n    // 1 week in milliseconds\n    this.CLEANUP_PROBABILITY = 0.01;\n    this.LOCK_TIMEOUT_MS = 1e3;\n    this.lockAcquired = false;\n    this.lockAcquireFailures = 0;\n    // Added for request ID tracking\n    this.requestIdToUsedHashes = {};\n    this.logger = logger;\n    this.cacheDir = cacheDir;\n    this.cacheFile = path.join(cacheDir, cacheFile);\n    this.lockFile = path.join(cacheDir, \"cache.lock\");\n    this.ensureCacheDirectory();\n    this.setupProcessHandlers();\n  }\n  setupProcessHandlers() {\n    const releaseLockAndExit = () => {\n      this.releaseLock();\n      process.exit();\n    };\n    process.on(\"exit\", releaseLockAndExit);\n    process.on(\"SIGINT\", releaseLockAndExit);\n    process.on(\"SIGTERM\", releaseLockAndExit);\n    process.on(\"uncaughtException\", (err) => {\n      this.logger({\n        category: \"base_cache\",\n        message: \"uncaught exception\",\n        level: 2,\n        auxiliary: {\n          error: {\n            value: err.message,\n            type: \"string\"\n          },\n          trace: {\n            value: err.stack,\n            type: \"string\"\n          }\n        }\n      });\n      if (this.lockAcquired) {\n        releaseLockAndExit();\n      }\n    });\n  }\n  ensureCacheDirectory() {\n    if (!fs.existsSync(this.cacheDir)) {\n      fs.mkdirSync(this.cacheDir, { recursive: true });\n      this.logger({\n        category: \"base_cache\",\n        message: \"created cache directory\",\n        level: 1,\n        auxiliary: {\n          cacheDir: {\n            value: this.cacheDir,\n            type: \"string\"\n          }\n        }\n      });\n    }\n  }\n  createHash(data) {\n    const hash = crypto.createHash(\"sha256\");\n    return hash.update(JSON.stringify(data)).digest(\"hex\");\n  }\n  sleep(ms) {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n  acquireLock() {\n    return __async(this, null, function* () {\n      const startTime = Date.now();\n      while (Date.now() - startTime < this.LOCK_TIMEOUT_MS) {\n        try {\n          if (fs.existsSync(this.lockFile)) {\n            const lockAge = Date.now() - fs.statSync(this.lockFile).mtimeMs;\n            if (lockAge > this.LOCK_TIMEOUT_MS) {\n              fs.unlinkSync(this.lockFile);\n              this.logger({\n                category: \"base_cache\",\n                message: \"Stale lock file removed\",\n                level: 1\n              });\n            }\n          }\n          fs.writeFileSync(this.lockFile, process.pid.toString(), { flag: \"wx\" });\n          this.lockAcquireFailures = 0;\n          this.lockAcquired = true;\n          this.logger({\n            category: \"base_cache\",\n            message: \"Lock acquired\",\n            level: 1\n          });\n          return true;\n        } catch (e) {\n          this.logger({\n            category: \"base_cache\",\n            message: \"error acquiring lock\",\n            level: 2,\n            auxiliary: {\n              trace: {\n                value: e.stack,\n                type: \"string\"\n              },\n              message: {\n                value: e.message,\n                type: \"string\"\n              }\n            }\n          });\n          yield this.sleep(5);\n        }\n      }\n      this.logger({\n        category: \"base_cache\",\n        message: \"Failed to acquire lock after timeout\",\n        level: 2\n      });\n      this.lockAcquireFailures++;\n      if (this.lockAcquireFailures >= 3) {\n        this.logger({\n          category: \"base_cache\",\n          message: \"Failed to acquire lock 3 times in a row. Releasing lock manually.\",\n          level: 1\n        });\n        this.releaseLock();\n      }\n      return false;\n    });\n  }\n  releaseLock() {\n    try {\n      if (fs.existsSync(this.lockFile)) {\n        fs.unlinkSync(this.lockFile);\n        this.logger({\n          category: \"base_cache\",\n          message: \"Lock released\",\n          level: 1\n        });\n      }\n      this.lockAcquired = false;\n    } catch (error) {\n      this.logger({\n        category: \"base_cache\",\n        message: \"error releasing lock\",\n        level: 2,\n        auxiliary: {\n          error: {\n            value: error.message,\n            type: \"string\"\n          },\n          trace: {\n            value: error.stack,\n            type: \"string\"\n          }\n        }\n      });\n    }\n  }\n  /**\n   * Cleans up stale cache entries that exceed the maximum age.\n   */\n  cleanupStaleEntries() {\n    return __async(this, null, function* () {\n      if (!(yield this.acquireLock())) {\n        this.logger({\n          category: \"llm_cache\",\n          message: \"failed to acquire lock for cleanup\",\n          level: 2\n        });\n        return;\n      }\n      try {\n        const cache = this.readCache();\n        const now = Date.now();\n        let entriesRemoved = 0;\n        for (const [hash, entry] of Object.entries(cache)) {\n          if (now - entry.timestamp > this.CACHE_MAX_AGE_MS) {\n            delete cache[hash];\n            entriesRemoved++;\n          }\n        }\n        if (entriesRemoved > 0) {\n          this.writeCache(cache);\n          this.logger({\n            category: \"llm_cache\",\n            message: \"cleaned up stale cache entries\",\n            level: 1,\n            auxiliary: {\n              entriesRemoved: {\n                value: entriesRemoved.toString(),\n                type: \"integer\"\n              }\n            }\n          });\n        }\n      } catch (error) {\n        this.logger({\n          category: \"llm_cache\",\n          message: \"error during cache cleanup\",\n          level: 2,\n          auxiliary: {\n            error: {\n              value: error.message,\n              type: \"string\"\n            },\n            trace: {\n              value: error.stack,\n              type: \"string\"\n            }\n          }\n        });\n      } finally {\n        this.releaseLock();\n      }\n    });\n  }\n  readCache() {\n    if (fs.existsSync(this.cacheFile)) {\n      try {\n        const data = fs.readFileSync(this.cacheFile, \"utf-8\");\n        return JSON.parse(data);\n      } catch (error) {\n        this.logger({\n          category: \"base_cache\",\n          message: \"error reading cache file. resetting cache.\",\n          level: 1,\n          auxiliary: {\n            error: {\n              value: error.message,\n              type: \"string\"\n            },\n            trace: {\n              value: error.stack,\n              type: \"string\"\n            }\n          }\n        });\n        this.resetCache();\n        return {};\n      }\n    }\n    return {};\n  }\n  writeCache(cache) {\n    try {\n      fs.writeFileSync(this.cacheFile, JSON.stringify(cache, null, 2));\n      this.logger({\n        category: \"base_cache\",\n        message: \"Cache written to file\",\n        level: 1\n      });\n    } catch (error) {\n      this.logger({\n        category: \"base_cache\",\n        message: \"error writing cache file\",\n        level: 2,\n        auxiliary: {\n          error: {\n            value: error.message,\n            type: \"string\"\n          },\n          trace: {\n            value: error.stack,\n            type: \"string\"\n          }\n        }\n      });\n    } finally {\n      this.releaseLock();\n    }\n  }\n  /**\n   * Retrieves data from the cache based on the provided options.\n   * @param hashObj - The options used to generate the cache key.\n   * @param requestId - The identifier for the current request.\n   * @returns The cached data if available, otherwise null.\n   */\n  get(hashObj, requestId) {\n    return __async(this, null, function* () {\n      if (!(yield this.acquireLock())) {\n        this.logger({\n          category: \"base_cache\",\n          message: \"Failed to acquire lock for getting cache\",\n          level: 2\n        });\n        return null;\n      }\n      try {\n        const hash = this.createHash(hashObj);\n        const cache = this.readCache();\n        if (cache[hash]) {\n          this.trackRequestIdUsage(requestId, hash);\n          return cache[hash].data;\n        }\n        return null;\n      } catch (error) {\n        this.logger({\n          category: \"base_cache\",\n          message: \"error getting cache. resetting cache.\",\n          level: 1,\n          auxiliary: {\n            error: {\n              value: error.message,\n              type: \"string\"\n            },\n            trace: {\n              value: error.stack,\n              type: \"string\"\n            }\n          }\n        });\n        this.resetCache();\n        return null;\n      } finally {\n        this.releaseLock();\n      }\n    });\n  }\n  /**\n   * Stores data in the cache based on the provided options and requestId.\n   * @param hashObj - The options used to generate the cache key.\n   * @param data - The data to be cached.\n   * @param requestId - The identifier for the cache entry.\n   */\n  set(hashObj, data, requestId) {\n    return __async(this, null, function* () {\n      if (!(yield this.acquireLock())) {\n        this.logger({\n          category: \"base_cache\",\n          message: \"Failed to acquire lock for setting cache\",\n          level: 2\n        });\n        return;\n      }\n      try {\n        const hash = this.createHash(hashObj);\n        const cache = this.readCache();\n        cache[hash] = {\n          data,\n          timestamp: Date.now(),\n          requestId\n        };\n        this.writeCache(cache);\n        this.trackRequestIdUsage(requestId, hash);\n      } catch (error) {\n        this.logger({\n          category: \"base_cache\",\n          message: \"error setting cache. resetting cache.\",\n          level: 1,\n          auxiliary: {\n            error: {\n              value: error.message,\n              type: \"string\"\n            },\n            trace: {\n              value: error.stack,\n              type: \"string\"\n            }\n          }\n        });\n        this.resetCache();\n      } finally {\n        this.releaseLock();\n        if (Math.random() < this.CLEANUP_PROBABILITY) {\n          this.cleanupStaleEntries();\n        }\n      }\n    });\n  }\n  delete(hashObj) {\n    return __async(this, null, function* () {\n      if (!(yield this.acquireLock())) {\n        this.logger({\n          category: \"base_cache\",\n          message: \"Failed to acquire lock for removing cache entry\",\n          level: 2\n        });\n        return;\n      }\n      try {\n        const hash = this.createHash(hashObj);\n        const cache = this.readCache();\n        if (cache[hash]) {\n          delete cache[hash];\n          this.writeCache(cache);\n        } else {\n          this.logger({\n            category: \"base_cache\",\n            message: \"Cache entry not found to delete\",\n            level: 1\n          });\n        }\n      } catch (error) {\n        this.logger({\n          category: \"base_cache\",\n          message: \"error removing cache entry\",\n          level: 2,\n          auxiliary: {\n            error: {\n              value: error.message,\n              type: \"string\"\n            },\n            trace: {\n              value: error.stack,\n              type: \"string\"\n            }\n          }\n        });\n      } finally {\n        this.releaseLock();\n      }\n    });\n  }\n  /**\n   * Tracks the usage of a hash with a specific requestId.\n   * @param requestId - The identifier for the current request.\n   * @param hash - The cache key hash.\n   */\n  trackRequestIdUsage(requestId, hash) {\n    var _a, _b;\n    (_b = (_a = this.requestIdToUsedHashes)[requestId]) != null ? _b : _a[requestId] = [];\n    this.requestIdToUsedHashes[requestId].push(hash);\n  }\n  /**\n   * Deletes all cache entries associated with a specific requestId.\n   * @param requestId - The identifier for the request whose cache entries should be deleted.\n   */\n  deleteCacheForRequestId(requestId) {\n    return __async(this, null, function* () {\n      var _a;\n      if (!(yield this.acquireLock())) {\n        this.logger({\n          category: \"base_cache\",\n          message: \"Failed to acquire lock for deleting cache\",\n          level: 2\n        });\n        return;\n      }\n      try {\n        const cache = this.readCache();\n        const hashes = (_a = this.requestIdToUsedHashes[requestId]) != null ? _a : [];\n        let entriesRemoved = 0;\n        for (const hash of hashes) {\n          if (cache[hash]) {\n            delete cache[hash];\n            entriesRemoved++;\n          }\n        }\n        if (entriesRemoved > 0) {\n          this.writeCache(cache);\n        } else {\n          this.logger({\n            category: \"base_cache\",\n            message: \"no cache entries found for requestId\",\n            level: 1,\n            auxiliary: {\n              requestId: {\n                value: requestId,\n                type: \"string\"\n              }\n            }\n          });\n        }\n        delete this.requestIdToUsedHashes[requestId];\n      } catch (error) {\n        this.logger({\n          category: \"base_cache\",\n          message: \"error deleting cache for requestId\",\n          level: 2,\n          auxiliary: {\n            error: {\n              value: error.message,\n              type: \"string\"\n            },\n            trace: {\n              value: error.stack,\n              type: \"string\"\n            },\n            requestId: {\n              value: requestId,\n              type: \"string\"\n            }\n          }\n        });\n      } finally {\n        this.releaseLock();\n      }\n    });\n  }\n  /**\n   * Resets the entire cache by clearing the cache file.\n   */\n  resetCache() {\n    try {\n      fs.writeFileSync(this.cacheFile, \"{}\");\n      this.requestIdToUsedHashes = {};\n    } catch (error) {\n      this.logger({\n        category: \"base_cache\",\n        message: \"error resetting cache\",\n        level: 2,\n        auxiliary: {\n          error: {\n            value: error.message,\n            type: \"string\"\n          },\n          trace: {\n            value: error.stack,\n            type: \"string\"\n          }\n        }\n      });\n    } finally {\n      this.releaseLock();\n    }\n  }\n};\n\n// lib/cache/ActionCache.ts\nvar ActionCache = class _ActionCache extends BaseCache {\n  constructor(logger, cacheDir, cacheFile) {\n    super(logger, cacheDir, cacheFile || \"action_cache.json\");\n  }\n  addActionStep(_0) {\n    return __async(this, arguments, function* ({\n      url,\n      action,\n      previousSelectors,\n      playwrightCommand,\n      componentString,\n      xpaths,\n      newStepString,\n      completed,\n      requestId\n    }) {\n      this.logger({\n        category: \"action_cache\",\n        message: \"adding action step to cache\",\n        level: 1,\n        auxiliary: {\n          action: {\n            value: action,\n            type: \"string\"\n          },\n          requestId: {\n            value: requestId,\n            type: \"string\"\n          },\n          url: {\n            value: url,\n            type: \"string\"\n          },\n          previousSelectors: {\n            value: JSON.stringify(previousSelectors),\n            type: \"object\"\n          }\n        }\n      });\n      yield this.set(\n        { url, action, previousSelectors },\n        {\n          playwrightCommand,\n          componentString,\n          xpaths,\n          newStepString,\n          completed,\n          previousSelectors,\n          action\n        },\n        requestId\n      );\n    });\n  }\n  /**\n   * Retrieves all actions for a specific trajectory.\n   * @param trajectoryId - Unique identifier for the trajectory.\n   * @param requestId - The identifier for the current request.\n   * @returns An array of TrajectoryEntry objects or null if not found.\n   */\n  getActionStep(_0) {\n    return __async(this, arguments, function* ({\n      url,\n      action,\n      previousSelectors,\n      requestId\n    }) {\n      const data = yield __superGet(_ActionCache.prototype, this, \"get\").call(this, { url, action, previousSelectors }, requestId);\n      if (!data) {\n        return null;\n      }\n      return data;\n    });\n  }\n  removeActionStep(cacheHashObj) {\n    return __async(this, null, function* () {\n      yield __superGet(_ActionCache.prototype, this, \"delete\").call(this, cacheHashObj);\n    });\n  }\n  /**\n   * Clears all actions for a specific trajectory.\n   * @param trajectoryId - Unique identifier for the trajectory.\n   * @param requestId - The identifier for the current request.\n   */\n  clearAction(requestId) {\n    return __async(this, null, function* () {\n      yield __superGet(_ActionCache.prototype, this, \"deleteCacheForRequestId\").call(this, requestId);\n      this.logger({\n        category: \"action_cache\",\n        message: \"cleared action for ID\",\n        level: 1,\n        auxiliary: {\n          requestId: {\n            value: requestId,\n            type: \"string\"\n          }\n        }\n      });\n    });\n  }\n  /**\n   * Resets the entire action cache.\n   */\n  resetCache() {\n    return __async(this, null, function* () {\n      yield __superGet(_ActionCache.prototype, this, \"resetCache\").call(this);\n      this.logger({\n        category: \"action_cache\",\n        message: \"Action cache has been reset.\",\n        level: 1\n      });\n    });\n  }\n};\n\n// lib/inference.ts\nvar import_zod2 = require(\"zod\");\n\n// lib/prompt.ts\nvar actSystemPrompt = `\n# Instructions\nYou are a browser automation assistant. Your job is to accomplish the user's goal across multiple model calls by running playwright commands.\n\n## Input\nYou will receive:\n1. the user's overall goal\n2. the steps that you've taken so far\n3. a list of active DOM elements in this chunk to consider to get closer to the goal. \n4. Optionally, a list of variable names that the user has provided that you may use to accomplish the goal. To use the variables, you must use the special <|VARIABLE_NAME|> syntax.\n5. Optionally, custom instructions will be provided by the user. If the user's instructions are not relevant to the current task, ignore them. Otherwise, make sure to adhere to them.\n\n\n## Your Goal / Specification\nYou have 2 tools that you can call: doAction, and skipSection. Do action only performs Playwright actions. Do exactly what the user's goal is. Do not perform any other actions or exceed the scope of the goal.\nIf the user's goal will be accomplished after running the playwright action, set completed to true. Better to have completed set to true if your are not sure.\n\nNote 1: If there is a popup on the page for cookies or advertising that has nothing to do with the goal, try to close it first before proceeding. As this can block the goal from being completed.\nNote 2: Sometimes what your are looking for is hidden behind and element you need to interact with. For example, sliders, buttons, etc...\n\nAgain, if the user's goal will be accomplished after running the playwright action, set completed to true. Also, if the user provides custom instructions, it is imperative that you follow them no matter what.\n`;\nvar verifyActCompletionSystemPrompt = `\nYou are a browser automation assistant. The job has given you a goal and a list of steps that have been taken so far. Your job is to determine if the user's goal has been completed based on the provided information.\n\n# Input\nYou will receive:\n1. The user's goal: A clear description of what the user wants to achieve.\n2. Steps taken so far: A list of actions that have been performed up to this point.\n\n# Your Task\nAnalyze the provided information to determine if the user's goal has been fully completed.\n\n# Output\nReturn a boolean value:\n- true: If the goal has been definitively completed based on the steps taken and the current page.\n- false: If the goal has not been completed or if there's any uncertainty about its completion.\n\n# Important Considerations\n- False positives are okay. False negatives are not okay.\n- Look for evidence of errors on the page or something having gone wrong in completing the goal. If one does not exist, return true.\n`;\nfunction buildVerifyActCompletionSystemPrompt() {\n  return {\n    role: \"system\",\n    content: verifyActCompletionSystemPrompt\n  };\n}\nfunction buildVerifyActCompletionUserPrompt(goal, steps = \"None\", domElements) {\n  let actUserPrompt = `\n# My Goal\n${goal}\n\n# Steps You've Taken So Far\n${steps}\n`;\n  if (domElements) {\n    actUserPrompt += `\n# Active DOM Elements on the current page\n${domElements}\n`;\n  }\n  return {\n    role: \"user\",\n    content: actUserPrompt\n  };\n}\nfunction buildUserInstructionsString(userProvidedInstructions) {\n  if (!userProvidedInstructions) {\n    return \"\";\n  }\n  return `\n\n# Custom Instructions Provided by the User\n    \nPlease keep the user's instructions in mind when performing actions. If the user's instructions are not relevant to the current task, ignore them.\n\nUser Instructions:\n${userProvidedInstructions}`;\n}\nfunction buildActSystemPrompt(userProvidedInstructions) {\n  return {\n    role: \"system\",\n    content: [\n      actSystemPrompt,\n      buildUserInstructionsString(userProvidedInstructions)\n    ].filter(Boolean).join(\"\\n\\n\")\n  };\n}\nfunction buildActUserPrompt(action, steps = \"None\", domElements, variables) {\n  let actUserPrompt = `\n# My Goal\n${action}\n\n# Steps You've Taken So Far\n${steps}\n\n# Current Active Dom Elements\n${domElements}\n`;\n  if (variables && Object.keys(variables).length > 0) {\n    actUserPrompt += `\n# Variables\n${Object.keys(variables).map((key) => `<|${key.toUpperCase()}|>`).join(\"\\n\")}\n`;\n  }\n  return {\n    role: \"user\",\n    content: actUserPrompt\n  };\n}\nvar actTools = [\n  {\n    type: \"function\",\n    name: \"doAction\",\n    description: \"execute the next playwright step that directly accomplishes the goal\",\n    parameters: {\n      type: \"object\",\n      required: [\"method\", \"element\", \"args\", \"step\", \"completed\"],\n      properties: {\n        method: {\n          type: \"string\",\n          description: \"The playwright function to call.\"\n        },\n        element: {\n          type: \"number\",\n          description: \"The element number to act on\"\n        },\n        args: {\n          type: \"array\",\n          description: \"The required arguments\",\n          items: {\n            type: \"string\",\n            description: \"The argument to pass to the function\"\n          }\n        },\n        step: {\n          type: \"string\",\n          description: \"human readable description of the step that is taken in the past tense. Please be very detailed.\"\n        },\n        why: {\n          type: \"string\",\n          description: \"why is this step taken? how does it advance the goal?\"\n        },\n        completed: {\n          type: \"boolean\",\n          description: \"true if the goal should be accomplished after this step\"\n        }\n      }\n    }\n  },\n  {\n    type: \"function\",\n    name: \"skipSection\",\n    description: \"skips this area of the webpage because the current goal cannot be accomplished here\",\n    parameters: {\n      type: \"object\",\n      properties: {\n        reason: {\n          type: \"string\",\n          description: \"reason that no action is taken\"\n        }\n      }\n    }\n  }\n];\nfunction buildExtractSystemPrompt(isUsingPrintExtractedDataTool = false, useTextExtract = true, userProvidedInstructions) {\n  const baseContent = `You are extracting content on behalf of a user.\n  If a user asks you to extract a 'list' of information, or 'all' information, \n  YOU MUST EXTRACT ALL OF THE INFORMATION THAT THE USER REQUESTS.\n   \n  You will be given:\n1. An instruction\n2. `;\n  const contentDetail = useTextExtract ? `A text representation of a webpage to extract information from.` : `A list of DOM elements to extract from.`;\n  const instructions = `\nPrint the exact text from the ${useTextExtract ? \"text-rendered webpage\" : \"DOM elements\"} with all symbols, characters, and endlines as is.\nPrint null or an empty string if no new information is found.\n  `.trim();\n  const toolInstructions = isUsingPrintExtractedDataTool ? `\nONLY print the content using the print_extracted_data tool provided.\nONLY print the content using the print_extracted_data tool provided.\n  `.trim() : \"\";\n  const additionalInstructions = useTextExtract ? `Once you are given the text-rendered webpage, \n    you must thoroughly and meticulously analyze it. Be very careful to ensure that you\n    do not miss any important information.` : \"\";\n  const userInstructions = buildUserInstructionsString(\n    userProvidedInstructions\n  );\n  const content = `${baseContent}${contentDetail}\n\n${instructions}\n${toolInstructions}${additionalInstructions ? `\n\n${additionalInstructions}` : \"\"}${userInstructions ? `\n\n${userInstructions}` : \"\"}`.replace(/\\s+/g, \" \");\n  return {\n    role: \"system\",\n    content\n  };\n}\nfunction buildExtractUserPrompt(instruction, domElements, isUsingPrintExtractedDataTool = false) {\n  let content = `Instruction: ${instruction}\nDOM: ${domElements}`;\n  if (isUsingPrintExtractedDataTool) {\n    content += `\nONLY print the content using the print_extracted_data tool provided.\nONLY print the content using the print_extracted_data tool provided.`;\n  }\n  return {\n    role: \"user\",\n    content\n  };\n}\nvar refineSystemPrompt = `You are tasked with refining and filtering information for the final output based on newly extracted and previously extracted content. Your responsibilities are:\n1. Remove exact duplicates for elements in arrays and objects.\n2. For text fields, append or update relevant text if the new content is an extension, replacement, or continuation.\n3. For non-text fields (e.g., numbers, booleans), update with new values if they differ.\n4. Add any completely new fields or objects ONLY IF they correspond to the provided schema.\n\nReturn the updated content that includes both the previous content and the new, non-duplicate, or extended information.`;\nfunction buildRefineSystemPrompt() {\n  return {\n    role: \"system\",\n    content: refineSystemPrompt\n  };\n}\nfunction buildRefineUserPrompt(instruction, previouslyExtractedContent, newlyExtractedContent) {\n  return {\n    role: \"user\",\n    content: `Instruction: ${instruction}\nPreviously extracted content: ${JSON.stringify(previouslyExtractedContent, null, 2)}\nNewly extracted content: ${JSON.stringify(newlyExtractedContent, null, 2)}\nRefined content:`\n  };\n}\nvar metadataSystemPrompt = `You are an AI assistant tasked with evaluating the progress and completion status of an extraction task.\nAnalyze the extraction response and determine if the task is completed or if more information is needed.\n\nStrictly abide by the following criteria:\n1. Once the instruction has been satisfied by the current extraction response, ALWAYS set completion status to true and stop processing, regardless of remaining chunks.\n2. Only set completion status to false if BOTH of these conditions are true:\n   - The instruction has not been satisfied yet\n   - There are still chunks left to process (chunksTotal > chunksSeen)`;\nfunction buildMetadataSystemPrompt() {\n  return {\n    role: \"system\",\n    content: metadataSystemPrompt\n  };\n}\nfunction buildMetadataPrompt(instruction, extractionResponse, chunksSeen, chunksTotal) {\n  return {\n    role: \"user\",\n    content: `Instruction: ${instruction}\nExtracted content: ${JSON.stringify(extractionResponse, null, 2)}\nchunksSeen: ${chunksSeen}\nchunksTotal: ${chunksTotal}`\n  };\n}\nfunction buildObserveSystemPrompt(userProvidedInstructions, isUsingAccessibilityTree = false) {\n  const observeSystemPrompt = `\nYou are helping the user automate the browser by finding elements based on what the user wants to observe in the page.\nYou will be given:\n1. a instruction of elements to observe\n2. ${isUsingAccessibilityTree ? \"a hierarchical accessibility tree showing the semantic structure of the page. The tree is a hybrid of the DOM and the accessibility tree.\" : \"a numbered list of possible elements\"}\n\nReturn an array of elements that match the instruction if they exist, otherwise return an empty array.`;\n  const content = observeSystemPrompt.replace(/\\s+/g, \" \");\n  return {\n    role: \"system\",\n    content: [content, buildUserInstructionsString(userProvidedInstructions)].filter(Boolean).join(\"\\n\\n\")\n  };\n}\nfunction buildObserveUserMessage(instruction, domElements, isUsingAccessibilityTree = false) {\n  return {\n    role: \"user\",\n    content: `instruction: ${instruction}\n${isUsingAccessibilityTree ? \"Accessibility Tree\" : \"DOM\"}: ${domElements}`\n  };\n}\n\n// lib/inference.ts\nfunction verifyActCompletion(_0) {\n  return __async(this, arguments, function* ({\n    goal,\n    steps,\n    llmClient,\n    domElements,\n    logger,\n    requestId\n  }) {\n    const verificationSchema = import_zod2.z.object({\n      completed: import_zod2.z.boolean().describe(\"true if the goal is accomplished\")\n    });\n    const response = yield llmClient.createChatCompletion({\n      options: {\n        messages: [\n          buildVerifyActCompletionSystemPrompt(),\n          buildVerifyActCompletionUserPrompt(goal, steps, domElements)\n        ],\n        temperature: 0.1,\n        top_p: 1,\n        frequency_penalty: 0,\n        presence_penalty: 0,\n        response_model: {\n          name: \"Verification\",\n          schema: verificationSchema\n        },\n        requestId\n      },\n      logger\n    });\n    if (!response || typeof response !== \"object\") {\n      logger({\n        category: \"VerifyAct\",\n        message: \"Unexpected response format: \" + JSON.stringify(response)\n      });\n      return false;\n    }\n    if (response.completed === void 0) {\n      logger({\n        category: \"VerifyAct\",\n        message: \"Missing 'completed' field in response\"\n      });\n      return false;\n    }\n    return response.completed;\n  });\n}\nfunction fillInVariables(text, variables) {\n  let processedText = text;\n  Object.entries(variables).forEach(([key, value]) => {\n    const placeholder = `<|${key.toUpperCase()}|>`;\n    processedText = processedText.replace(placeholder, value);\n  });\n  return processedText;\n}\nfunction act(_0) {\n  return __async(this, arguments, function* ({\n    action,\n    domElements,\n    steps,\n    llmClient,\n    retries = 0,\n    logger,\n    requestId,\n    variables,\n    userProvidedInstructions\n  }) {\n    const messages = [\n      buildActSystemPrompt(userProvidedInstructions),\n      buildActUserPrompt(action, steps, domElements, variables)\n    ];\n    const response = yield llmClient.createChatCompletion({\n      options: {\n        messages,\n        temperature: 0.1,\n        top_p: 1,\n        frequency_penalty: 0,\n        presence_penalty: 0,\n        tool_choice: \"auto\",\n        tools: actTools,\n        requestId\n      },\n      logger\n    });\n    const toolCalls = response.choices[0].message.tool_calls;\n    if (toolCalls && toolCalls.length > 0) {\n      if (toolCalls[0].function.name === \"skipSection\") {\n        return null;\n      }\n      return JSON.parse(toolCalls[0].function.arguments);\n    } else {\n      if (retries >= 2) {\n        logger({\n          category: \"Act\",\n          message: \"No tool calls found in response\"\n        });\n        return null;\n      }\n      return act({\n        action,\n        domElements,\n        steps,\n        llmClient,\n        retries: retries + 1,\n        logger,\n        requestId\n      });\n    }\n  });\n}\nfunction extract(_0) {\n  return __async(this, arguments, function* ({\n    instruction,\n    previouslyExtractedContent,\n    domElements,\n    schema,\n    llmClient,\n    chunksSeen,\n    chunksTotal,\n    requestId,\n    logger,\n    isUsingTextExtract,\n    userProvidedInstructions\n  }) {\n    const isUsingAnthropic = llmClient.type === \"anthropic\";\n    const extractionResponse = yield llmClient.createChatCompletion({\n      options: {\n        messages: [\n          buildExtractSystemPrompt(\n            isUsingAnthropic,\n            isUsingTextExtract,\n            userProvidedInstructions\n          ),\n          buildExtractUserPrompt(instruction, domElements, isUsingAnthropic)\n        ],\n        response_model: {\n          schema,\n          name: \"Extraction\"\n        },\n        temperature: 0.1,\n        top_p: 1,\n        frequency_penalty: 0,\n        presence_penalty: 0,\n        requestId\n      },\n      logger\n    });\n    const refinedResponse = yield llmClient.createChatCompletion({\n      options: {\n        messages: [\n          buildRefineSystemPrompt(),\n          buildRefineUserPrompt(\n            instruction,\n            previouslyExtractedContent,\n            extractionResponse\n          )\n        ],\n        response_model: {\n          schema,\n          name: \"RefinedExtraction\"\n        },\n        temperature: 0.1,\n        top_p: 1,\n        frequency_penalty: 0,\n        presence_penalty: 0,\n        requestId\n      },\n      logger\n    });\n    const metadataSchema = import_zod2.z.object({\n      progress: import_zod2.z.string().describe(\n        \"progress of what has been extracted so far, as concise as possible\"\n      ),\n      completed: import_zod2.z.boolean().describe(\n        \"true if the goal is now accomplished. Use this conservatively, only when you are sure that the goal has been completed.\"\n      )\n    });\n    const metadataResponse = yield llmClient.createChatCompletion({\n      options: {\n        messages: [\n          buildMetadataSystemPrompt(),\n          buildMetadataPrompt(\n            instruction,\n            refinedResponse,\n            chunksSeen,\n            chunksTotal\n          )\n        ],\n        response_model: {\n          name: \"Metadata\",\n          schema: metadataSchema\n        },\n        temperature: 0.1,\n        top_p: 1,\n        frequency_penalty: 0,\n        presence_penalty: 0,\n        requestId\n      },\n      logger\n    });\n    return __spreadProps(__spreadValues({}, refinedResponse), {\n      metadata: metadataResponse\n    });\n  });\n}\nfunction observe(_0) {\n  return __async(this, arguments, function* ({\n    instruction,\n    domElements,\n    llmClient,\n    requestId,\n    isUsingAccessibilityTree,\n    userProvidedInstructions,\n    logger,\n    returnAction = false\n  }) {\n    var _a, _b;\n    const observeSchema = import_zod2.z.object({\n      elements: import_zod2.z.array(\n        import_zod2.z.object(__spreadValues({\n          elementId: import_zod2.z.number().describe(\"the number of the element\"),\n          description: import_zod2.z.string().describe(\n            isUsingAccessibilityTree ? \"a description of the accessible element and its purpose\" : \"a description of the element and what it is relevant for\"\n          )\n        }, returnAction ? {\n          method: import_zod2.z.string().describe(\n            \"the candidate method/action to interact with the element. Select one of the available Playwright interaction methods.\"\n          ),\n          arguments: import_zod2.z.array(\n            import_zod2.z.string().describe(\n              \"the arguments to pass to the method. For example, for a click, the arguments are empty, but for a fill, the arguments are the value to fill in.\"\n            )\n          )\n        } : {}))\n      ).describe(\n        isUsingAccessibilityTree ? \"an array of accessible elements that match the instruction\" : \"an array of elements that match the instruction\"\n      )\n    });\n    const observationResponse = yield llmClient.createChatCompletion({\n      options: {\n        messages: [\n          buildObserveSystemPrompt(\n            userProvidedInstructions,\n            isUsingAccessibilityTree\n          ),\n          buildObserveUserMessage(\n            instruction,\n            domElements,\n            isUsingAccessibilityTree\n          )\n        ],\n        response_model: {\n          schema: observeSchema,\n          name: \"Observation\"\n        },\n        temperature: 0.1,\n        top_p: 1,\n        frequency_penalty: 0,\n        presence_penalty: 0,\n        requestId\n      },\n      logger\n    });\n    const parsedResponse = {\n      elements: (_b = (_a = observationResponse.elements) == null ? void 0 : _a.map((el) => {\n        const base = {\n          elementId: Number(el.elementId),\n          description: String(el.description)\n        };\n        return returnAction ? __spreadProps(__spreadValues({}, base), {\n          method: String(el.method),\n          arguments: el.arguments\n        }) : base;\n      })) != null ? _b : []\n    };\n    return parsedResponse;\n  });\n}\n\n// lib/utils.ts\nvar import_crypto = __toESM(require(\"crypto\"));\nvar HEURISTIC_CHAR_WIDTH = 5;\nfunction generateId(operation) {\n  return import_crypto.default.createHash(\"sha256\").update(operation).digest(\"hex\");\n}\nfunction formatText(textAnnotations, pageWidth) {\n  const sortedAnnotations = [...textAnnotations].sort(\n    (a, b) => a.bottom_left.y - b.bottom_left.y\n  );\n  const epsilon = 1;\n  const lineMap = /* @__PURE__ */ new Map();\n  for (const annotation of sortedAnnotations) {\n    let foundLineY;\n    for (const key of lineMap.keys()) {\n      if (Math.abs(key - annotation.bottom_left.y) < epsilon) {\n        foundLineY = key;\n        break;\n      }\n    }\n    if (foundLineY !== void 0) {\n      lineMap.get(foundLineY).push(annotation);\n    } else {\n      lineMap.set(annotation.bottom_left.y, [annotation]);\n    }\n  }\n  const lineYs = Array.from(lineMap.keys()).sort((a, b) => a - b);\n  const finalLines = [];\n  for (const lineY of lineYs) {\n    const lineAnnotations = lineMap.get(lineY);\n    lineAnnotations.sort((a, b) => a.bottom_left.x - b.bottom_left.x);\n    const groupedLineAnnotations = groupWordsInSentence(lineAnnotations);\n    finalLines.push(groupedLineAnnotations);\n  }\n  let maxLineWidthInChars = 0;\n  for (const line of finalLines) {\n    let lineMaxEnd = 0;\n    for (const ann of line) {\n      const startXInChars = Math.round(\n        ann.bottom_left_normalized.x * (pageWidth / HEURISTIC_CHAR_WIDTH)\n      );\n      const endXInChars = startXInChars + ann.text.length;\n      if (endXInChars > lineMaxEnd) {\n        lineMaxEnd = endXInChars;\n      }\n    }\n    if (lineMaxEnd > maxLineWidthInChars) {\n      maxLineWidthInChars = lineMaxEnd;\n    }\n  }\n  maxLineWidthInChars += 20;\n  const canvasWidth = Math.max(maxLineWidthInChars, 1);\n  const lineBaselines = finalLines.map(\n    (line) => Math.min(...line.map((a) => a.bottom_left.y))\n  );\n  const verticalGaps = [];\n  for (let i = 1; i < lineBaselines.length; i++) {\n    verticalGaps.push(lineBaselines[i] - lineBaselines[i - 1]);\n  }\n  const normalLineSpacing = verticalGaps.length > 0 ? median(verticalGaps) : 0;\n  let canvas = [];\n  let lineIndex = -1;\n  for (let i = 0; i < finalLines.length; i++) {\n    if (i === 0) {\n      lineIndex++;\n      ensureLineExists(canvas, lineIndex, canvasWidth);\n    } else {\n      const gap = lineBaselines[i] - lineBaselines[i - 1];\n      let extraLines = 0;\n      if (normalLineSpacing > 0 && gap > 1.2 * normalLineSpacing) {\n        extraLines = Math.max(Math.round(gap / normalLineSpacing) - 1, 0);\n      }\n      for (let e = 0; e < extraLines; e++) {\n        lineIndex++;\n        ensureLineExists(canvas, lineIndex, canvasWidth);\n      }\n      lineIndex++;\n      ensureLineExists(canvas, lineIndex, canvasWidth);\n    }\n    const lineAnnotations = finalLines[i];\n    for (const annotation of lineAnnotations) {\n      const text = annotation.text;\n      const startXInChars = Math.round(\n        annotation.bottom_left_normalized.x * (pageWidth / HEURISTIC_CHAR_WIDTH)\n      );\n      for (let j = 0; j < text.length; j++) {\n        const xPos = startXInChars + j;\n        if (xPos < canvasWidth) {\n          canvas[lineIndex][xPos] = text[j];\n        }\n      }\n    }\n  }\n  canvas = canvas.map((row) => {\n    const lineStr = row.join(\"\");\n    return Array.from(lineStr.trimEnd());\n  });\n  let pageText = canvas.map((line) => line.join(\"\")).join(\"\\n\");\n  pageText = pageText.trimEnd();\n  pageText = \"-\".repeat(canvasWidth) + \"\\n\" + pageText + \"\\n\" + \"-\".repeat(canvasWidth);\n  return pageText;\n}\nfunction ensureLineExists(canvas, lineIndex, width) {\n  while (lineIndex >= canvas.length) {\n    canvas.push(new Array(width).fill(\" \"));\n  }\n}\nfunction groupWordsInSentence(lineAnnotations) {\n  const groupedAnnotations = [];\n  let currentGroup = [];\n  for (const annotation of lineAnnotations) {\n    if (currentGroup.length === 0) {\n      currentGroup.push(annotation);\n      continue;\n    }\n    const padding = 1;\n    const lastAnn = currentGroup[currentGroup.length - 1];\n    const characterWidth = lastAnn.width / lastAnn.text.length * padding;\n    const isWithinHorizontalRange = annotation.bottom_left.x <= lastAnn.bottom_left.x + lastAnn.width + characterWidth;\n    if (Math.abs(annotation.height - currentGroup[0].height) <= 4 && isWithinHorizontalRange) {\n      currentGroup.push(annotation);\n    } else {\n      if (currentGroup.length > 0) {\n        const groupedAnnotation = createGroupedAnnotation(currentGroup);\n        if (groupedAnnotation.text.length > 0) {\n          groupedAnnotations.push(groupedAnnotation);\n          currentGroup = [annotation];\n        }\n      }\n    }\n  }\n  if (currentGroup.length > 0) {\n    const groupedAnnotation = createGroupedAnnotation(currentGroup);\n    groupedAnnotations.push(groupedAnnotation);\n  }\n  return groupedAnnotations;\n}\nfunction createGroupedAnnotation(group) {\n  let text = \"\";\n  for (const word of group) {\n    if ([\".\", \",\", '\"', \"'\", \":\", \";\", \"!\", \"?\", \"{\", \"}\", \"\\u2019\", \"\\u201D\"].includes(\n      word.text\n    )) {\n      text += word.text;\n    } else {\n      text += text !== \"\" ? \" \" + word.text : word.text;\n    }\n  }\n  const isWord = /[a-zA-Z0-9]/.test(text);\n  const medianHeight = median(group.map((word) => word.height));\n  if (isWord && medianHeight > 25) {\n    text = \"**\" + text + \"**\";\n  }\n  return {\n    text,\n    bottom_left: {\n      x: group[0].bottom_left.x,\n      y: group[0].bottom_left.y\n    },\n    bottom_left_normalized: {\n      x: group[0].bottom_left_normalized.x,\n      y: group[0].bottom_left_normalized.y\n    },\n    width: group.reduce((sum, a) => sum + a.width, 0),\n    height: group[0].height\n  };\n}\nfunction median(values) {\n  if (values.length === 0) return 0;\n  const sorted = [...values].sort((a, b) => a - b);\n  const middle = Math.floor(sorted.length / 2);\n  if (sorted.length % 2 === 0) {\n    return (sorted[middle - 1] + sorted[middle]) / 2;\n  } else {\n    return sorted[middle];\n  }\n}\nfunction logLineToString(logLine) {\n  var _a;\n  try {\n    const timestamp = logLine.timestamp || (/* @__PURE__ */ new Date()).toISOString();\n    if ((_a = logLine.auxiliary) == null ? void 0 : _a.error) {\n      return `${timestamp}::[stagehand:${logLine.category}] ${logLine.message}\n ${logLine.auxiliary.error.value}\n ${logLine.auxiliary.trace.value}`;\n    }\n    return `${timestamp}::[stagehand:${logLine.category}] ${logLine.message} ${logLine.auxiliary ? JSON.stringify(logLine.auxiliary) : \"\"}`;\n  } catch (error) {\n    console.error(`Error logging line:`, error);\n    return \"error logging line\";\n  }\n}\nfunction validateZodSchema(schema, data) {\n  try {\n    schema.parse(data);\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\nfunction drawObserveOverlay(page, results) {\n  return __async(this, null, function* () {\n    const xpathList = results.map((result) => result.selector);\n    const validXpaths = xpathList.filter((xpath) => xpath !== \"xpath=\");\n    yield page.evaluate((selectors) => {\n      selectors.forEach((selector) => {\n        let element;\n        if (selector.startsWith(\"xpath=\")) {\n          const xpath = selector.substring(6);\n          element = document.evaluate(\n            xpath,\n            document,\n            null,\n            XPathResult.FIRST_ORDERED_NODE_TYPE,\n            null\n          ).singleNodeValue;\n        } else {\n          element = document.querySelector(selector);\n        }\n        if (element instanceof HTMLElement) {\n          const overlay = document.createElement(\"div\");\n          overlay.setAttribute(\"stagehandObserve\", \"true\");\n          const rect = element.getBoundingClientRect();\n          overlay.style.position = \"absolute\";\n          overlay.style.left = rect.left + \"px\";\n          overlay.style.top = rect.top + \"px\";\n          overlay.style.width = rect.width + \"px\";\n          overlay.style.height = rect.height + \"px\";\n          overlay.style.backgroundColor = \"rgba(255, 255, 0, 0.3)\";\n          overlay.style.pointerEvents = \"none\";\n          overlay.style.zIndex = \"10000\";\n          document.body.appendChild(overlay);\n        }\n      });\n    }, validXpaths);\n  });\n}\nfunction clearOverlays(page) {\n  return __async(this, null, function* () {\n    yield page.evaluate(() => {\n      const elements = document.querySelectorAll('[stagehandObserve=\"true\"]');\n      elements.forEach((el) => {\n        const parent = el.parentNode;\n        while (el.firstChild) {\n          parent == null ? void 0 : parent.insertBefore(el.firstChild, el);\n        }\n        parent == null ? void 0 : parent.removeChild(el);\n      });\n    });\n  });\n}\n\n// lib/handlers/actHandler.ts\nvar StagehandActHandler = class {\n  constructor({\n    verbose,\n    llmProvider,\n    enableCaching,\n    logger,\n    stagehandPage,\n    userProvidedInstructions,\n    selfHeal\n  }) {\n    this.verbose = verbose;\n    this.llmProvider = llmProvider;\n    this.enableCaching = enableCaching;\n    this.logger = logger;\n    this.actionCache = enableCaching ? new ActionCache(this.logger) : void 0;\n    this.actions = {};\n    this.stagehandPage = stagehandPage;\n    this.userProvidedInstructions = userProvidedInstructions;\n    this.selfHeal = selfHeal;\n  }\n  /**\n   * Perform an immediate Playwright action based on an ObserveResult object\n   * that was returned from `page.observe(...)`.\n   */\n  actFromObserveResult(observe2) {\n    return __async(this, null, function* () {\n      var _a;\n      this.logger({\n        category: \"action\",\n        message: \"Performing act from an ObserveResult\",\n        level: 1,\n        auxiliary: {\n          observeResult: {\n            value: JSON.stringify(observe2),\n            type: \"object\"\n          }\n        }\n      });\n      const method = observe2.method;\n      const args = (_a = observe2.arguments) != null ? _a : [];\n      const selector = observe2.selector.replace(\"xpath=\", \"\");\n      try {\n        yield this._performPlaywrightMethod(method, args, selector);\n        return {\n          success: true,\n          message: `Action [${method}] performed successfully on selector: ${selector}`,\n          action: observe2.description || `ObserveResult action (${method})`\n        };\n      } catch (err) {\n        if (!this.selfHeal) {\n          this.logger({\n            category: \"action\",\n            message: \"Error performing act from an ObserveResult\",\n            level: 1,\n            auxiliary: {\n              error: { value: err.message, type: \"string\" },\n              trace: { value: err.stack, type: \"string\" }\n            }\n          });\n          return {\n            success: false,\n            message: `Failed to perform act: ${err.message}`,\n            action: observe2.description || `ObserveResult action (${method})`\n          };\n        }\n        this.logger({\n          category: \"action\",\n          message: \"Error performing act from an ObserveResult. Trying again with regular act method\",\n          level: 1,\n          auxiliary: {\n            error: { value: err.message, type: \"string\" },\n            trace: { value: err.stack, type: \"string\" },\n            observeResult: { value: JSON.stringify(observe2), type: \"object\" }\n          }\n        });\n        try {\n          const actCommand = observe2.description.toLowerCase().startsWith(method.toLowerCase()) ? observe2.description : method ? `${method} ${observe2.description}` : observe2.description;\n          yield this.stagehandPage.act(actCommand);\n        } catch (err2) {\n          this.logger({\n            category: \"action\",\n            message: \"Error performing act from an ObserveResult\",\n            level: 1,\n            auxiliary: {\n              error: { value: err2.message, type: \"string\" },\n              trace: { value: err2.stack, type: \"string\" }\n            }\n          });\n          return {\n            success: false,\n            message: `Failed to perform act: ${err2.message}`,\n            action: observe2.description || `ObserveResult action (${method})`\n          };\n        }\n      }\n    });\n  }\n  _recordAction(action, result) {\n    return __async(this, null, function* () {\n      const id = generateId(action);\n      this.actions[id] = { result, action };\n      return id;\n    });\n  }\n  _verifyActionCompletion(_0) {\n    return __async(this, arguments, function* ({\n      completed,\n      requestId,\n      action,\n      steps,\n      llmClient,\n      domSettleTimeoutMs\n    }) {\n      if (!completed) {\n        return false;\n      }\n      yield this.stagehandPage._waitForSettledDom(domSettleTimeoutMs);\n      let verifyLLmClient = llmClient;\n      if (llmClient.modelName.startsWith(\"o1\") || llmClient.modelName.startsWith(\"o3\")) {\n        verifyLLmClient = this.llmProvider.getClient(\n          \"gpt-4o\",\n          llmClient.clientOptions\n        );\n      }\n      const { outputString: domElements } = yield this.stagehandPage.page.evaluate(() => {\n        return window.processAllOfDom();\n      });\n      let actionCompleted = false;\n      if (completed) {\n        this.logger({\n          category: \"action\",\n          message: \"action marked as completed, verifying if this is true...\",\n          level: 1,\n          auxiliary: {\n            action: {\n              value: action,\n              type: \"string\"\n            }\n          }\n        });\n        actionCompleted = yield verifyActCompletion({\n          goal: action,\n          steps,\n          llmProvider: this.llmProvider,\n          llmClient: verifyLLmClient,\n          domElements,\n          logger: this.logger,\n          requestId\n        });\n        this.logger({\n          category: \"action\",\n          message: \"action completion verification result\",\n          level: 1,\n          auxiliary: {\n            action: {\n              value: action,\n              type: \"string\"\n            },\n            result: {\n              value: actionCompleted.toString(),\n              type: \"boolean\"\n            }\n          }\n        });\n      }\n      return actionCompleted;\n    });\n  }\n  _performPlaywrightMethod(method, args, xpath, domSettleTimeoutMs) {\n    return __async(this, null, function* () {\n      var _a, _b, _c, _d;\n      const locator = this.stagehandPage.page.locator(`xpath=${xpath}`).first();\n      const initialUrl = this.stagehandPage.page.url();\n      this.logger({\n        category: \"action\",\n        message: \"performing playwright method\",\n        level: 2,\n        auxiliary: {\n          xpath: {\n            value: xpath,\n            type: \"string\"\n          },\n          method: {\n            value: method,\n            type: \"string\"\n          }\n        }\n      });\n      if (method === \"scrollIntoView\") {\n        this.logger({\n          category: \"action\",\n          message: \"scrolling element into view\",\n          level: 2,\n          auxiliary: {\n            xpath: {\n              value: xpath,\n              type: \"string\"\n            }\n          }\n        });\n        try {\n          yield locator.evaluate((element) => {\n            element.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\n          }).catch((e) => {\n            this.logger({\n              category: \"action\",\n              message: \"error scrolling element into view\",\n              level: 1,\n              auxiliary: {\n                error: {\n                  value: e.message,\n                  type: \"string\"\n                },\n                trace: {\n                  value: e.stack,\n                  type: \"string\"\n                },\n                xpath: {\n                  value: xpath,\n                  type: \"string\"\n                }\n              }\n            });\n          });\n        } catch (e) {\n          this.logger({\n            category: \"action\",\n            message: \"error scrolling element into view\",\n            level: 1,\n            auxiliary: {\n              error: {\n                value: e.message,\n                type: \"string\"\n              },\n              trace: {\n                value: e.stack,\n                type: \"string\"\n              },\n              xpath: {\n                value: xpath,\n                type: \"string\"\n              }\n            }\n          });\n          throw new PlaywrightCommandException(e.message);\n        }\n      } else if (method === \"fill\" || method === \"type\") {\n        try {\n          yield locator.fill(\"\");\n          yield locator.click();\n          const text = (_a = args[0]) == null ? void 0 : _a.toString();\n          for (const char of text) {\n            yield this.stagehandPage.page.keyboard.type(char, {\n              delay: Math.random() * 50 + 25\n            });\n          }\n        } catch (e) {\n          this.logger({\n            category: \"action\",\n            message: \"error filling element\",\n            level: 1,\n            auxiliary: {\n              error: {\n                value: e.message,\n                type: \"string\"\n              },\n              trace: {\n                value: e.stack,\n                type: \"string\"\n              },\n              xpath: {\n                value: xpath,\n                type: \"string\"\n              }\n            }\n          });\n          throw new PlaywrightCommandException(e.message);\n        }\n      } else if (method === \"press\") {\n        try {\n          const key = (_b = args[0]) == null ? void 0 : _b.toString();\n          yield this.stagehandPage.page.keyboard.press(key);\n        } catch (e) {\n          this.logger({\n            category: \"action\",\n            message: \"error pressing key\",\n            level: 1,\n            auxiliary: {\n              error: {\n                value: e.message,\n                type: \"string\"\n              },\n              trace: {\n                value: e.stack,\n                type: \"string\"\n              },\n              key: {\n                value: (_d = (_c = args[0]) == null ? void 0 : _c.toString()) != null ? _d : \"unknown\",\n                type: \"string\"\n              }\n            }\n          });\n          throw new PlaywrightCommandException(e.message);\n        }\n      } else if (method === \"click\") {\n        this.logger({\n          category: \"action\",\n          message: \"page URL before click\",\n          level: 2,\n          auxiliary: {\n            url: {\n              value: this.stagehandPage.page.url(),\n              type: \"string\"\n            }\n          }\n        });\n        try {\n          const isRadio = yield locator.evaluate((el) => {\n            return el instanceof HTMLInputElement && el.type === \"radio\";\n          });\n          const clickArg = args.length ? args[0] : void 0;\n          if (isRadio) {\n            const inputId = yield locator.evaluate((el) => el.id);\n            let labelLocator;\n            if (inputId) {\n              labelLocator = this.stagehandPage.page.locator(\n                `label[for=\"${inputId}\"]`\n              );\n            }\n            if (!labelLocator || (yield labelLocator.count()) < 1) {\n              labelLocator = this.stagehandPage.page.locator(`xpath=${xpath}/ancestor::label`).first();\n            }\n            if ((yield labelLocator.count()) < 1) {\n              labelLocator = locator.locator(`xpath=following-sibling::label`).first();\n              if ((yield labelLocator.count()) < 1) {\n                labelLocator = locator.locator(`xpath=preceding-sibling::label`).first();\n              }\n            }\n            if ((yield labelLocator.count()) > 0) {\n              yield labelLocator.click(clickArg);\n            } else {\n              yield locator.click(clickArg);\n            }\n          } else {\n            const clickArg2 = args.length ? args[0] : void 0;\n            yield locator.click(clickArg2);\n          }\n        } catch (e) {\n          this.logger({\n            category: \"action\",\n            message: \"error performing click\",\n            level: 1,\n            auxiliary: {\n              error: {\n                value: e.message,\n                type: \"string\"\n              },\n              trace: {\n                value: e.stack,\n                type: \"string\"\n              },\n              xpath: {\n                value: xpath,\n                type: \"string\"\n              },\n              method: {\n                value: method,\n                type: \"string\"\n              },\n              args: {\n                value: JSON.stringify(args),\n                type: \"object\"\n              }\n            }\n          });\n          throw new PlaywrightCommandException(e.message);\n        }\n        this.logger({\n          category: \"action\",\n          message: \"clicking element, checking for page navigation\",\n          level: 1,\n          auxiliary: {\n            xpath: {\n              value: xpath,\n              type: \"string\"\n            }\n          }\n        });\n        const newOpenedTab = yield Promise.race([\n          new Promise((resolve) => {\n            this.stagehandPage.context.once(\"page\", (page) => resolve(page));\n            setTimeout(() => resolve(null), 1500);\n          })\n        ]);\n        this.logger({\n          category: \"action\",\n          message: \"clicked element\",\n          level: 1,\n          auxiliary: {\n            newOpenedTab: {\n              value: newOpenedTab ? \"opened a new tab\" : \"no new tabs opened\",\n              type: \"string\"\n            }\n          }\n        });\n        if (newOpenedTab) {\n          this.logger({\n            category: \"action\",\n            message: \"new page detected (new tab) with URL\",\n            level: 1,\n            auxiliary: {\n              url: {\n                value: newOpenedTab.url(),\n                type: \"string\"\n              }\n            }\n          });\n          yield newOpenedTab.close();\n          yield this.stagehandPage.page.goto(newOpenedTab.url());\n          yield this.stagehandPage.page.waitForLoadState(\"domcontentloaded\");\n          yield this.stagehandPage._waitForSettledDom(domSettleTimeoutMs);\n        }\n        yield Promise.race([\n          this.stagehandPage.page.waitForLoadState(\"networkidle\"),\n          new Promise((resolve) => setTimeout(resolve, 5e3))\n        ]).catch((e) => {\n          this.logger({\n            category: \"action\",\n            message: \"network idle timeout hit\",\n            level: 1,\n            auxiliary: {\n              trace: {\n                value: e.stack,\n                type: \"string\"\n              },\n              message: {\n                value: e.message,\n                type: \"string\"\n              }\n            }\n          });\n        });\n        this.logger({\n          category: \"action\",\n          message: \"finished waiting for (possible) page navigation\",\n          level: 1\n        });\n        if (this.stagehandPage.page.url() !== initialUrl) {\n          this.logger({\n            category: \"action\",\n            message: \"new page detected with URL\",\n            level: 1,\n            auxiliary: {\n              url: {\n                value: this.stagehandPage.page.url(),\n                type: \"string\"\n              }\n            }\n          });\n        }\n      } else if (typeof locator[method] === \"function\") {\n        this.logger({\n          category: \"action\",\n          message: \"page URL before action\",\n          level: 2,\n          auxiliary: {\n            url: {\n              value: this.stagehandPage.page.url(),\n              type: \"string\"\n            }\n          }\n        });\n        try {\n          yield locator[method](...args.map((arg) => (arg == null ? void 0 : arg.toString()) || \"\"));\n        } catch (e) {\n          this.logger({\n            category: \"action\",\n            message: \"error performing method\",\n            level: 1,\n            auxiliary: {\n              error: {\n                value: e.message,\n                type: \"string\"\n              },\n              trace: {\n                value: e.stack,\n                type: \"string\"\n              },\n              xpath: {\n                value: xpath,\n                type: \"string\"\n              },\n              method: {\n                value: method,\n                type: \"string\"\n              },\n              args: {\n                value: JSON.stringify(args),\n                type: \"object\"\n              }\n            }\n          });\n          throw new PlaywrightCommandException(e.message);\n        }\n      } else {\n        this.logger({\n          category: \"action\",\n          message: \"chosen method is invalid\",\n          level: 1,\n          auxiliary: {\n            method: {\n              value: method,\n              type: \"string\"\n            }\n          }\n        });\n        throw new PlaywrightCommandMethodNotSupportedException(\n          `Method ${method} not supported`\n        );\n      }\n      yield this.stagehandPage._waitForSettledDom(domSettleTimeoutMs);\n    });\n  }\n  _getComponentString(locator) {\n    return __async(this, null, function* () {\n      return yield locator.evaluate((el) => {\n        const clone = el.cloneNode(true);\n        const attributesToKeep = [\n          \"type\",\n          \"name\",\n          \"placeholder\",\n          \"aria-label\",\n          \"role\",\n          \"href\",\n          \"title\",\n          \"alt\"\n        ];\n        Array.from(clone.attributes).forEach((attr) => {\n          if (!attributesToKeep.includes(attr.name)) {\n            clone.removeAttribute(attr.name);\n          }\n        });\n        const outerHtml = clone.outerHTML;\n        return outerHtml.trim().replace(/\\s+/g, \" \");\n      });\n    });\n  }\n  getElement(xpath, timeout = 5e3) {\n    return __async(this, null, function* () {\n      try {\n        const element = this.stagehandPage.page.locator(`xpath=${xpath}`).first();\n        yield element.waitFor({ state: \"attached\", timeout });\n        return element;\n      } catch (e) {\n        this.logger({\n          category: \"action\",\n          message: \"element not found within timeout\",\n          level: 1,\n          auxiliary: {\n            xpath: {\n              value: xpath,\n              type: \"string\"\n            },\n            timeout_ms: {\n              value: timeout.toString(),\n              type: \"integer\"\n            }\n          }\n        });\n        return null;\n      }\n    });\n  }\n  _checkIfCachedStepIsValid_oneXpath(cachedStep) {\n    return __async(this, null, function* () {\n      this.logger({\n        category: \"action\",\n        message: \"checking if cached step is valid\",\n        level: 1,\n        auxiliary: {\n          xpath: {\n            value: cachedStep.xpath,\n            type: \"string\"\n          },\n          savedComponentString: {\n            value: cachedStep.savedComponentString,\n            type: \"string\"\n          }\n        }\n      });\n      try {\n        const locator = yield this.getElement(cachedStep.xpath);\n        if (!locator) {\n          this.logger({\n            category: \"action\",\n            message: \"locator not found for xpath\",\n            level: 1,\n            auxiliary: {\n              xpath: {\n                value: cachedStep.xpath,\n                type: \"string\"\n              }\n            }\n          });\n          return false;\n        }\n        this.logger({\n          category: \"action\",\n          message: \"locator element\",\n          level: 1,\n          auxiliary: {\n            componentString: {\n              value: yield this._getComponentString(locator),\n              type: \"string\"\n            }\n          }\n        });\n        const currentComponent = yield this._getComponentString(locator);\n        this.logger({\n          category: \"action\",\n          message: \"current text\",\n          level: 1,\n          auxiliary: {\n            componentString: {\n              value: currentComponent,\n              type: \"string\"\n            }\n          }\n        });\n        if (!currentComponent || !cachedStep.savedComponentString) {\n          this.logger({\n            category: \"action\",\n            message: \"current text or cached text is undefined\",\n            level: 1\n          });\n          return false;\n        }\n        const normalizedCurrentText = currentComponent.trim().replace(/\\s+/g, \" \");\n        const normalizedCachedText = cachedStep.savedComponentString.trim().replace(/\\s+/g, \" \");\n        if (normalizedCurrentText !== normalizedCachedText) {\n          this.logger({\n            category: \"action\",\n            message: \"current text and cached text do not match\",\n            level: 1,\n            auxiliary: {\n              currentText: {\n                value: normalizedCurrentText,\n                type: \"string\"\n              },\n              cachedText: {\n                value: normalizedCachedText,\n                type: \"string\"\n              }\n            }\n          });\n          return false;\n        }\n        return true;\n      } catch (e) {\n        this.logger({\n          category: \"action\",\n          message: \"error checking if cached step is valid\",\n          level: 1,\n          auxiliary: {\n            error: {\n              value: e.message,\n              type: \"string\"\n            },\n            trace: {\n              value: e.stack,\n              type: \"string\"\n            }\n          }\n        });\n        return false;\n      }\n    });\n  }\n  _getValidCachedStepXpath(cachedStep) {\n    return __async(this, null, function* () {\n      const reversedXpaths = [...cachedStep.xpaths].reverse();\n      for (const xpath of reversedXpaths) {\n        const isValid = yield this._checkIfCachedStepIsValid_oneXpath({\n          xpath,\n          savedComponentString: cachedStep.savedComponentString\n        });\n        if (isValid) {\n          return xpath;\n        }\n      }\n      return null;\n    });\n  }\n  _runCachedActionIfAvailable(_0) {\n    return __async(this, arguments, function* ({\n      action,\n      previousSelectors,\n      requestId,\n      steps,\n      chunksSeen,\n      llmClient,\n      retries,\n      variables,\n      domSettleTimeoutMs\n    }) {\n      var _a, _b;\n      if (!this.enableCaching) {\n        return null;\n      }\n      const cacheObj = {\n        url: this.stagehandPage.page.url(),\n        action,\n        previousSelectors,\n        requestId\n      };\n      this.logger({\n        category: \"action\",\n        message: \"checking action cache\",\n        level: 1,\n        auxiliary: {\n          cacheObj: {\n            value: JSON.stringify(cacheObj),\n            type: \"object\"\n          }\n        }\n      });\n      const cachedStep = yield this.actionCache.getActionStep(cacheObj);\n      if (!cachedStep) {\n        this.logger({\n          category: \"action\",\n          message: \"action cache miss\",\n          level: 1,\n          auxiliary: {\n            cacheObj: {\n              value: JSON.stringify(cacheObj),\n              type: \"object\"\n            }\n          }\n        });\n        return null;\n      }\n      this.logger({\n        category: \"action\",\n        message: \"action cache semi-hit\",\n        level: 1,\n        auxiliary: {\n          playwrightCommand: {\n            value: JSON.stringify(cachedStep.playwrightCommand),\n            type: \"object\"\n          }\n        }\n      });\n      try {\n        const validXpath = yield this._getValidCachedStepXpath({\n          xpaths: cachedStep.xpaths,\n          savedComponentString: cachedStep.componentString\n        });\n        this.logger({\n          category: \"action\",\n          message: \"cached action step is valid\",\n          level: 1,\n          auxiliary: {\n            validXpath: {\n              value: validXpath,\n              type: \"string\"\n            }\n          }\n        });\n        if (!validXpath) {\n          this.logger({\n            category: \"action\",\n            message: \"cached action step is invalid, removing...\",\n            level: 1,\n            auxiliary: {\n              cacheObj: {\n                value: JSON.stringify(cacheObj),\n                type: \"object\"\n              }\n            }\n          });\n          yield (_a = this.actionCache) == null ? void 0 : _a.removeActionStep(cacheObj);\n          return null;\n        }\n        this.logger({\n          category: \"action\",\n          message: \"action cache hit\",\n          level: 1,\n          auxiliary: {\n            playwrightCommand: {\n              value: JSON.stringify(cachedStep.playwrightCommand),\n              type: \"object\"\n            }\n          }\n        });\n        cachedStep.playwrightCommand.args = cachedStep.playwrightCommand.args.map(\n          (arg) => {\n            return fillInVariables(arg, variables);\n          }\n        );\n        yield this._performPlaywrightMethod(\n          cachedStep.playwrightCommand.method,\n          cachedStep.playwrightCommand.args,\n          validXpath,\n          domSettleTimeoutMs\n        );\n        steps = steps + cachedStep.newStepString;\n        yield this.stagehandPage.page.evaluate(\n          ({ chunksSeen: chunksSeen2 }) => {\n            return window.processDom(chunksSeen2);\n          },\n          { chunksSeen }\n        );\n        if (cachedStep.completed) {\n          const actionCompleted = yield this._verifyActionCompletion({\n            completed: true,\n            llmClient,\n            steps,\n            requestId,\n            action,\n            domSettleTimeoutMs\n          });\n          this.logger({\n            category: \"action\",\n            message: \"action completion verification result from cache\",\n            level: 1,\n            auxiliary: {\n              actionCompleted: {\n                value: actionCompleted.toString(),\n                type: \"boolean\"\n              }\n            }\n          });\n          if (actionCompleted) {\n            return {\n              success: true,\n              message: \"action completed successfully using cached step\",\n              action\n            };\n          }\n        }\n        return this.act({\n          action,\n          steps,\n          chunksSeen,\n          llmClient,\n          retries,\n          requestId,\n          variables,\n          previousSelectors: [...previousSelectors, cachedStep.xpaths[0]],\n          skipActionCacheForThisStep: false,\n          domSettleTimeoutMs\n        });\n      } catch (exception) {\n        this.logger({\n          category: \"action\",\n          message: \"error performing cached action step\",\n          level: 1,\n          auxiliary: {\n            error: {\n              value: exception.message,\n              type: \"string\"\n            },\n            trace: {\n              value: exception.stack,\n              type: \"string\"\n            }\n          }\n        });\n        yield (_b = this.actionCache) == null ? void 0 : _b.removeActionStep(cacheObj);\n        return null;\n      }\n    });\n  }\n  act(_0) {\n    return __async(this, arguments, function* ({\n      action,\n      steps = \"\",\n      chunksSeen,\n      llmClient,\n      retries = 0,\n      requestId,\n      variables,\n      previousSelectors,\n      skipActionCacheForThisStep = false,\n      domSettleTimeoutMs\n    }) {\n      var _a, _b;\n      try {\n        yield this.stagehandPage._waitForSettledDom(domSettleTimeoutMs);\n        yield this.stagehandPage.startDomDebug();\n        if (this.enableCaching && !skipActionCacheForThisStep) {\n          const response2 = yield this._runCachedActionIfAvailable({\n            action,\n            previousSelectors,\n            requestId,\n            steps,\n            chunksSeen,\n            llmClient,\n            retries,\n            variables,\n            domSettleTimeoutMs\n          });\n          if (response2 !== null) {\n            return response2;\n          } else {\n            return this.act({\n              action,\n              steps,\n              chunksSeen,\n              llmClient,\n              retries,\n              requestId,\n              variables,\n              previousSelectors,\n              skipActionCacheForThisStep: true,\n              domSettleTimeoutMs\n            });\n          }\n        }\n        this.logger({\n          category: \"action\",\n          message: \"running / continuing action\",\n          level: 2,\n          auxiliary: {\n            action: {\n              value: action,\n              type: \"string\"\n            },\n            pageUrl: {\n              value: this.stagehandPage.page.url(),\n              type: \"string\"\n            }\n          }\n        });\n        this.logger({\n          category: \"action\",\n          message: \"processing DOM\",\n          level: 2\n        });\n        const { outputString, selectorMap, chunk, chunks } = yield this.stagehandPage.page.evaluate(\n          ({ chunksSeen: chunksSeen2 }) => {\n            return window.processDom(chunksSeen2);\n          },\n          { chunksSeen }\n        );\n        this.logger({\n          category: \"action\",\n          message: \"looking at chunk\",\n          level: 1,\n          auxiliary: {\n            chunk: {\n              value: chunk.toString(),\n              type: \"integer\"\n            },\n            chunks: {\n              value: chunks.length.toString(),\n              type: \"integer\"\n            },\n            chunksSeen: {\n              value: chunksSeen.length.toString(),\n              type: \"integer\"\n            },\n            chunksLeft: {\n              value: (chunks.length - chunksSeen.length).toString(),\n              type: \"integer\"\n            }\n          }\n        });\n        const response = yield act({\n          action,\n          domElements: outputString,\n          steps,\n          llmClient,\n          logger: this.logger,\n          requestId,\n          variables,\n          userProvidedInstructions: this.userProvidedInstructions\n        });\n        this.logger({\n          category: \"action\",\n          message: \"received response from LLM\",\n          level: 1,\n          auxiliary: {\n            response: {\n              value: JSON.stringify(response),\n              type: \"object\"\n            }\n          }\n        });\n        yield this.stagehandPage.cleanupDomDebug();\n        if (!response) {\n          if (chunksSeen.length + 1 < chunks.length) {\n            chunksSeen.push(chunk);\n            this.logger({\n              category: \"action\",\n              message: \"no action found in current chunk\",\n              level: 1,\n              auxiliary: {\n                chunksSeen: {\n                  value: chunksSeen.length.toString(),\n                  type: \"integer\"\n                }\n              }\n            });\n            return this.act({\n              action,\n              steps: steps + (!steps.endsWith(\"\\n\") ? \"\\n\" : \"\") + \"## Step: Scrolled to another section\\n\",\n              chunksSeen,\n              llmClient,\n              requestId,\n              variables,\n              previousSelectors,\n              skipActionCacheForThisStep,\n              domSettleTimeoutMs\n            });\n          } else {\n            if (this.enableCaching) {\n              this.llmProvider.cleanRequestCache(requestId);\n              (_a = this.actionCache) == null ? void 0 : _a.deleteCacheForRequestId(requestId);\n            }\n            return {\n              success: false,\n              message: `Action was not able to be completed.`,\n              action\n            };\n          }\n        }\n        const elementId = response[\"element\"];\n        const xpaths = selectorMap[elementId];\n        const method = response[\"method\"];\n        const args = response[\"args\"];\n        const elementLines = outputString.split(\"\\n\");\n        const elementText = ((_b = elementLines.find((line) => line.startsWith(`${elementId}:`))) == null ? void 0 : _b.split(\":\")[1]) || \"Element not found\";\n        this.logger({\n          category: \"action\",\n          message: \"executing method\",\n          level: 1,\n          auxiliary: {\n            method: {\n              value: method,\n              type: \"string\"\n            },\n            elementId: {\n              value: elementId.toString(),\n              type: \"integer\"\n            },\n            xpaths: {\n              value: JSON.stringify(xpaths),\n              type: \"object\"\n            },\n            args: {\n              value: JSON.stringify(args),\n              type: \"object\"\n            }\n          }\n        });\n        try {\n          const initialUrl = this.stagehandPage.page.url();\n          let foundXpath = null;\n          let locator = null;\n          for (const xp of xpaths) {\n            const candidate = this.stagehandPage.page.locator(`xpath=${xp}`).first();\n            try {\n              yield candidate.waitFor({ state: \"attached\", timeout: 2e3 });\n              foundXpath = xp;\n              locator = candidate;\n              break;\n            } catch (e) {\n              this.logger({\n                category: \"action\",\n                message: \"XPath not yet located; moving on\",\n                level: 1,\n                auxiliary: {\n                  xpath: {\n                    value: xp,\n                    type: \"string\"\n                  },\n                  error: {\n                    value: e.message,\n                    type: \"string\"\n                  }\n                }\n              });\n            }\n          }\n          if (!foundXpath || !locator) {\n            throw new Error(\"None of the provided XPaths could be located.\");\n          }\n          const originalUrl = this.stagehandPage.page.url();\n          const componentString = yield this._getComponentString(locator);\n          const responseArgs = [...args];\n          if (variables) {\n            responseArgs.forEach((arg, index) => {\n              if (typeof arg === \"string\") {\n                args[index] = fillInVariables(arg, variables);\n              }\n            });\n          }\n          yield this._performPlaywrightMethod(\n            method,\n            args,\n            foundXpath,\n            domSettleTimeoutMs\n          );\n          const newStepString = (!steps.endsWith(\"\\n\") ? \"\\n\" : \"\") + `## Step: ${response.step}\n  Element: ${elementText}\n  Action: ${response.method}\n  Reasoning: ${response.why}\n`;\n          steps += newStepString;\n          if (this.enableCaching) {\n            this.actionCache.addActionStep({\n              action,\n              url: originalUrl,\n              previousSelectors,\n              playwrightCommand: {\n                method,\n                args: responseArgs.map((arg) => (arg == null ? void 0 : arg.toString()) || \"\")\n              },\n              componentString,\n              requestId,\n              xpaths,\n              newStepString,\n              completed: response.completed\n            }).catch((e) => {\n              this.logger({\n                category: \"action\",\n                message: \"error adding action step to cache\",\n                level: 1,\n                auxiliary: {\n                  error: {\n                    value: e.message,\n                    type: \"string\"\n                  },\n                  trace: {\n                    value: e.stack,\n                    type: \"string\"\n                  }\n                }\n              });\n            });\n          }\n          if (this.stagehandPage.page.url() !== initialUrl) {\n            steps += `  Result (Important): Page URL changed from ${initialUrl} to ${this.stagehandPage.page.url()}\n\n`;\n          }\n          const actionCompleted = yield this._verifyActionCompletion({\n            completed: response.completed,\n            requestId,\n            action,\n            steps,\n            llmClient,\n            domSettleTimeoutMs\n          }).catch((error) => {\n            this.logger({\n              category: \"action\",\n              message: \"error verifying action completion. Assuming action completed.\",\n              level: 1,\n              auxiliary: {\n                error: {\n                  value: error.message,\n                  type: \"string\"\n                },\n                trace: {\n                  value: error.stack,\n                  type: \"string\"\n                }\n              }\n            });\n            return true;\n          });\n          if (!actionCompleted) {\n            this.logger({\n              category: \"action\",\n              message: \"continuing to next action step\",\n              level: 1\n            });\n            return this.act({\n              action,\n              steps,\n              llmClient,\n              chunksSeen,\n              requestId,\n              variables,\n              previousSelectors: [...previousSelectors, foundXpath],\n              skipActionCacheForThisStep: false,\n              domSettleTimeoutMs\n            });\n          } else {\n            this.logger({\n              category: \"action\",\n              message: \"action completed successfully\",\n              level: 1\n            });\n            yield this._recordAction(action, response.step);\n            return {\n              success: true,\n              message: `Action completed successfully: ${steps}${response.step}`,\n              action\n            };\n          }\n        } catch (error) {\n          this.logger({\n            category: \"action\",\n            message: \"error performing action - d\",\n            level: 1,\n            auxiliary: {\n              error: {\n                value: error.message,\n                type: \"string\"\n              },\n              trace: {\n                value: error.stack,\n                type: \"string\"\n              },\n              retries: {\n                value: retries.toString(),\n                type: \"integer\"\n              }\n            }\n          });\n          if (retries < 2) {\n            return this.act({\n              action,\n              steps,\n              llmClient,\n              retries: retries + 1,\n              chunksSeen,\n              requestId,\n              variables,\n              previousSelectors,\n              skipActionCacheForThisStep,\n              domSettleTimeoutMs\n            });\n          }\n          yield this._recordAction(action, \"\");\n          if (this.enableCaching) {\n            this.llmProvider.cleanRequestCache(requestId);\n            this.actionCache.deleteCacheForRequestId(requestId);\n          }\n          return {\n            success: false,\n            message: \"error performing action - a\",\n            action\n          };\n        }\n      } catch (error) {\n        this.logger({\n          category: \"action\",\n          message: \"error performing action - b\",\n          level: 1,\n          auxiliary: {\n            error: {\n              value: error.message,\n              type: \"string\"\n            },\n            trace: {\n              value: error.stack,\n              type: \"string\"\n            }\n          }\n        });\n        if (this.enableCaching) {\n          this.llmProvider.cleanRequestCache(requestId);\n          this.actionCache.deleteCacheForRequestId(requestId);\n        }\n        return {\n          success: false,\n          message: `Error performing action - C: ${error.message}`,\n          action\n        };\n      }\n    });\n  }\n};\n\n// lib/handlers/extractHandler.ts\nvar PROXIMITY_THRESHOLD = 15;\nvar StagehandExtractHandler = class {\n  constructor({\n    stagehand,\n    logger,\n    stagehandPage,\n    userProvidedInstructions\n  }) {\n    this.stagehand = stagehand;\n    this.logger = logger;\n    this.stagehandPage = stagehandPage;\n    this.userProvidedInstructions = userProvidedInstructions;\n  }\n  extract(_0) {\n    return __async(this, arguments, function* ({\n      instruction,\n      schema,\n      content = {},\n      chunksSeen = [],\n      llmClient,\n      requestId,\n      domSettleTimeoutMs,\n      useTextExtract = false\n    }) {\n      if (useTextExtract) {\n        return this.textExtract({\n          instruction,\n          schema,\n          content,\n          llmClient,\n          requestId,\n          domSettleTimeoutMs\n        });\n      } else {\n        return this.domExtract({\n          instruction,\n          schema,\n          content,\n          chunksSeen,\n          llmClient,\n          requestId,\n          domSettleTimeoutMs\n        });\n      }\n    });\n  }\n  textExtract(_0) {\n    return __async(this, arguments, function* ({\n      instruction,\n      schema,\n      content = {},\n      llmClient,\n      requestId,\n      domSettleTimeoutMs\n    }) {\n      this.logger({\n        category: \"extraction\",\n        message: \"starting extraction\",\n        level: 1,\n        auxiliary: {\n          instruction: {\n            value: instruction,\n            type: \"string\"\n          }\n        }\n      });\n      yield this.stagehandPage._waitForSettledDom(domSettleTimeoutMs);\n      yield this.stagehandPage.startDomDebug();\n      const originalDOM = yield this.stagehandPage.page.evaluate(\n        () => window.storeDOM()\n      );\n      const { selectorMap } = yield this.stagehand.page.evaluate(() => window.processAllOfDom());\n      this.logger({\n        category: \"extraction\",\n        message: `received output from processAllOfDom. selectorMap has ${Object.keys(selectorMap).length} entries`,\n        level: 1\n      });\n      yield this.stagehand.page.evaluate(() => window.createTextBoundingBoxes());\n      const pageWidth = yield this.stagehand.page.evaluate(\n        () => window.innerWidth\n      );\n      const pageHeight = yield this.stagehand.page.evaluate(\n        () => window.innerHeight\n      );\n      const allAnnotations = [];\n      for (const xpaths of Object.values(selectorMap)) {\n        const xpath = xpaths[0];\n        const boundingBoxes = yield this.stagehandPage.page.evaluate(\n          (xpath2) => window.getElementBoundingBoxes(xpath2),\n          xpath\n        );\n        for (const box of boundingBoxes) {\n          const bottom_left = {\n            x: box.left,\n            y: box.top + box.height\n          };\n          const bottom_left_normalized = {\n            x: box.left / pageWidth,\n            y: (box.top + box.height) / pageHeight\n          };\n          const annotation = {\n            text: box.text,\n            bottom_left,\n            bottom_left_normalized,\n            width: box.width,\n            height: box.height\n          };\n          if (annotation.text.length > 0) {\n            allAnnotations.push(annotation);\n          }\n        }\n      }\n      const annotationsGroupedByText = /* @__PURE__ */ new Map();\n      for (const annotation of allAnnotations) {\n        if (!annotationsGroupedByText.has(annotation.text)) {\n          annotationsGroupedByText.set(annotation.text, []);\n        }\n        annotationsGroupedByText.get(annotation.text).push(annotation);\n      }\n      const deduplicatedTextAnnotations = [];\n      for (const [text, annotations] of annotationsGroupedByText.entries()) {\n        for (const annotation of annotations) {\n          const isDuplicate = deduplicatedTextAnnotations.some(\n            (existingAnnotation) => {\n              if (existingAnnotation.text !== text) return false;\n              const dx = existingAnnotation.bottom_left.x - annotation.bottom_left.x;\n              const dy = existingAnnotation.bottom_left.y - annotation.bottom_left.y;\n              const distance = Math.hypot(dx, dy);\n              return distance < PROXIMITY_THRESHOLD;\n            }\n          );\n          if (!isDuplicate) {\n            deduplicatedTextAnnotations.push(annotation);\n          }\n        }\n      }\n      yield this.stagehandPage.page.evaluate(\n        (dom) => window.restoreDOM(dom),\n        originalDOM\n      );\n      const formattedText = formatText(deduplicatedTextAnnotations, pageWidth);\n      const extractionResponse = yield extract({\n        instruction,\n        previouslyExtractedContent: content,\n        domElements: formattedText,\n        schema,\n        chunksSeen: 1,\n        chunksTotal: 1,\n        llmClient,\n        requestId,\n        userProvidedInstructions: this.userProvidedInstructions,\n        logger: this.logger\n      });\n      const _a = extractionResponse, {\n        metadata: { completed }\n      } = _a, output = __objRest(_a, [\n        \"metadata\"\n      ]);\n      yield this.stagehandPage.cleanupDomDebug();\n      this.logger({\n        category: \"extraction\",\n        message: \"received extraction response\",\n        auxiliary: {\n          extraction_response: {\n            value: JSON.stringify(extractionResponse),\n            type: \"object\"\n          }\n        }\n      });\n      if (completed) {\n        this.logger({\n          category: \"extraction\",\n          message: \"extraction completed successfully\",\n          level: 1,\n          auxiliary: {\n            extraction_response: {\n              value: JSON.stringify(extractionResponse),\n              type: \"object\"\n            }\n          }\n        });\n      } else {\n        this.logger({\n          category: \"extraction\",\n          message: \"extraction incomplete after processing all data\",\n          level: 1,\n          auxiliary: {\n            extraction_response: {\n              value: JSON.stringify(extractionResponse),\n              type: \"object\"\n            }\n          }\n        });\n      }\n      return output;\n    });\n  }\n  domExtract(_0) {\n    return __async(this, arguments, function* ({\n      instruction,\n      schema,\n      content = {},\n      chunksSeen = [],\n      llmClient,\n      requestId,\n      domSettleTimeoutMs\n    }) {\n      this.logger({\n        category: \"extraction\",\n        message: \"starting extraction using old approach\",\n        level: 1,\n        auxiliary: {\n          instruction: {\n            value: instruction,\n            type: \"string\"\n          }\n        }\n      });\n      yield this.stagehandPage._waitForSettledDom(domSettleTimeoutMs);\n      yield this.stagehandPage.startDomDebug();\n      const { outputString, chunk, chunks } = yield this.stagehand.page.evaluate(\n        (chunksSeen2) => window.processDom(chunksSeen2 != null ? chunksSeen2 : []),\n        chunksSeen\n      );\n      this.logger({\n        category: \"extraction\",\n        message: \"received output from processDom.\",\n        auxiliary: {\n          chunk: {\n            value: chunk.toString(),\n            type: \"integer\"\n          },\n          chunks_left: {\n            value: (chunks.length - chunksSeen.length).toString(),\n            type: \"integer\"\n          },\n          chunks_total: {\n            value: chunks.length.toString(),\n            type: \"integer\"\n          }\n        }\n      });\n      const extractionResponse = yield extract({\n        instruction,\n        previouslyExtractedContent: content,\n        domElements: outputString,\n        schema,\n        llmClient,\n        chunksSeen: chunksSeen.length,\n        chunksTotal: chunks.length,\n        requestId,\n        isUsingTextExtract: false,\n        userProvidedInstructions: this.userProvidedInstructions,\n        logger: this.logger\n      });\n      const _a = extractionResponse, {\n        metadata: { completed }\n      } = _a, output = __objRest(_a, [\n        \"metadata\"\n      ]);\n      yield this.stagehandPage.cleanupDomDebug();\n      this.logger({\n        category: \"extraction\",\n        message: \"received extraction response\",\n        auxiliary: {\n          extraction_response: {\n            value: JSON.stringify(extractionResponse),\n            type: \"object\"\n          }\n        }\n      });\n      chunksSeen.push(chunk);\n      if (completed || chunksSeen.length === chunks.length) {\n        this.logger({\n          category: \"extraction\",\n          message: \"got response\",\n          auxiliary: {\n            extraction_response: {\n              value: JSON.stringify(extractionResponse),\n              type: \"object\"\n            }\n          }\n        });\n        return output;\n      } else {\n        this.logger({\n          category: \"extraction\",\n          message: \"continuing extraction\",\n          auxiliary: {\n            extraction_response: {\n              value: JSON.stringify(extractionResponse),\n              type: \"object\"\n            }\n          }\n        });\n        yield this.stagehandPage._waitForSettledDom(domSettleTimeoutMs);\n        return this.domExtract({\n          instruction,\n          schema,\n          content: output,\n          chunksSeen,\n          llmClient,\n          domSettleTimeoutMs\n        });\n      }\n    });\n  }\n};\n\n// lib/a11y/utils.ts\nfunction formatSimplifiedTree(node, level = 0) {\n  var _a;\n  const indent = \"  \".repeat(level);\n  let result = `${indent}[${node.nodeId}] ${node.role}${node.name ? `: ${node.name}` : \"\"}\n`;\n  if ((_a = node.children) == null ? void 0 : _a.length) {\n    result += node.children.map((child) => formatSimplifiedTree(child, level + 1)).join(\"\");\n  }\n  return result;\n}\nfunction cleanStructuralNodes(node, page, logger) {\n  return __async(this, null, function* () {\n    if (node.nodeId && parseInt(node.nodeId) < 0) {\n      return null;\n    }\n    if (!node.children || node.children.length === 0) {\n      return node.role === \"generic\" || node.role === \"none\" ? null : node;\n    }\n    const cleanedChildrenPromises = node.children.map(\n      (child) => cleanStructuralNodes(child, page, logger)\n    );\n    const resolvedChildren = yield Promise.all(cleanedChildrenPromises);\n    const cleanedChildren = resolvedChildren.filter(\n      (child) => child !== null\n    );\n    if (node.role === \"generic\" || node.role === \"none\") {\n      if (cleanedChildren.length === 1) {\n        return cleanedChildren[0];\n      } else if (cleanedChildren.length === 0) {\n        return null;\n      }\n    }\n    if (page && logger && node.backendDOMNodeId !== void 0 && (node.role === \"generic\" || node.role === \"none\")) {\n      try {\n        const { object } = yield page.sendCDP(\"DOM.resolveNode\", {\n          backendNodeId: node.backendDOMNodeId\n        });\n        if (object && object.objectId) {\n          try {\n            const { result } = yield page.sendCDP(\"Runtime.callFunctionOn\", {\n              objectId: object.objectId,\n              functionDeclaration: `\n              function() {\n                return this.tagName ? this.tagName.toLowerCase() : \"\";\n              }\n            `,\n              returnByValue: true\n            });\n            if (result == null ? void 0 : result.value) {\n              node.role = result.value;\n            }\n          } catch (tagNameError) {\n            logger({\n              category: \"observation\",\n              message: `Could not fetch tagName for node ${node.backendDOMNodeId}`,\n              level: 2,\n              auxiliary: {\n                error: {\n                  value: tagNameError.message,\n                  type: \"string\"\n                }\n              }\n            });\n          }\n        }\n      } catch (resolveError) {\n        logger({\n          category: \"observation\",\n          message: `Could not resolve DOM node ID ${node.backendDOMNodeId}`,\n          level: 2,\n          auxiliary: {\n            error: {\n              value: resolveError.message,\n              type: \"string\"\n            }\n          }\n        });\n      }\n    }\n    return cleanedChildren.length > 0 ? __spreadProps(__spreadValues({}, node), { children: cleanedChildren }) : node;\n  });\n}\nfunction buildHierarchicalTree(nodes, page, logger) {\n  return __async(this, null, function* () {\n    const nodeMap = /* @__PURE__ */ new Map();\n    const iframe_list = [];\n    nodes.forEach((node) => {\n      const nodeIdValue = parseInt(node.nodeId, 10);\n      if (nodeIdValue < 0) {\n        return;\n      }\n      const hasChildren = node.childIds && node.childIds.length > 0;\n      const hasValidName = node.name && node.name.trim() !== \"\";\n      const isInteractive = node.role !== \"none\" && node.role !== \"generic\" && node.role !== \"InlineTextBox\";\n      if (!hasValidName && !hasChildren && !isInteractive) {\n        return;\n      }\n      nodeMap.set(node.nodeId, __spreadValues(__spreadValues(__spreadValues(__spreadValues({\n        role: node.role,\n        nodeId: node.nodeId\n      }, hasValidName && { name: node.name }), node.description && { description: node.description }), node.value && { value: node.value }), node.backendDOMNodeId !== void 0 && {\n        backendDOMNodeId: node.backendDOMNodeId\n      }));\n    });\n    nodes.forEach((node) => {\n      const isIframe = node.role === \"Iframe\";\n      if (isIframe) {\n        const iframeNode = {\n          role: node.role,\n          nodeId: node.nodeId\n        };\n        iframe_list.push(iframeNode);\n      }\n      if (node.parentId && nodeMap.has(node.nodeId)) {\n        const parentNode = nodeMap.get(node.parentId);\n        const currentNode = nodeMap.get(node.nodeId);\n        if (parentNode && currentNode) {\n          if (!parentNode.children) {\n            parentNode.children = [];\n          }\n          parentNode.children.push(currentNode);\n        }\n      }\n    });\n    const rootNodes = nodes.filter((node) => !node.parentId && nodeMap.has(node.nodeId)).map((node) => nodeMap.get(node.nodeId)).filter(Boolean);\n    const cleanedTreePromises = rootNodes.map(\n      (node) => cleanStructuralNodes(node, page, logger)\n    );\n    const finalTree = (yield Promise.all(cleanedTreePromises)).filter(\n      Boolean\n    );\n    const simplifiedFormat = finalTree.map((node) => formatSimplifiedTree(node)).join(\"\\n\");\n    return {\n      tree: finalTree,\n      simplified: simplifiedFormat,\n      iframes: iframe_list\n    };\n  });\n}\nfunction getAccessibilityTree(page, logger) {\n  return __async(this, null, function* () {\n    yield page.enableCDP(\"Accessibility\");\n    try {\n      const scrollableBackendIds = yield findScrollableElementIds(page);\n      const { nodes } = yield page.sendCDP(\n        \"Accessibility.getFullAXTree\"\n      );\n      const startTime = Date.now();\n      const hierarchicalTree = yield buildHierarchicalTree(\n        nodes.map((node) => {\n          var _a, _b, _c, _d;\n          let roleValue = ((_a = node.role) == null ? void 0 : _a.value) || \"\";\n          if (scrollableBackendIds.has(node.backendDOMNodeId)) {\n            if (roleValue === \"generic\" || roleValue === \"none\") {\n              roleValue = \"scrollable\";\n            } else {\n              roleValue = roleValue ? `scrollable, ${roleValue}` : \"scrollable\";\n            }\n          }\n          return {\n            role: roleValue,\n            name: (_b = node.name) == null ? void 0 : _b.value,\n            description: (_c = node.description) == null ? void 0 : _c.value,\n            value: (_d = node.value) == null ? void 0 : _d.value,\n            nodeId: node.nodeId,\n            backendDOMNodeId: node.backendDOMNodeId,\n            parentId: node.parentId,\n            childIds: node.childIds\n          };\n        }),\n        page,\n        logger\n      );\n      logger({\n        category: \"observation\",\n        message: `got accessibility tree in ${Date.now() - startTime}ms`,\n        level: 1\n      });\n      return hierarchicalTree;\n    } catch (error) {\n      logger({\n        category: \"observation\",\n        message: \"Error getting accessibility tree\",\n        level: 1,\n        auxiliary: {\n          error: {\n            value: error.message,\n            type: \"string\"\n          },\n          trace: {\n            value: error.stack,\n            type: \"string\"\n          }\n        }\n      });\n      throw error;\n    } finally {\n      yield page.disableCDP(\"Accessibility\");\n    }\n  });\n}\nvar functionString = `\nfunction getNodePath(el) {\n  if (!el || (el.nodeType !== Node.ELEMENT_NODE && el.nodeType !== Node.TEXT_NODE)) {\n    console.log(\"el is not a valid node type\");\n    return \"\";\n  }\n\n  const parts = [];\n  let current = el;\n\n  while (current && (current.nodeType === Node.ELEMENT_NODE || current.nodeType === Node.TEXT_NODE)) {\n    let index = 0;\n    let hasSameTypeSiblings = false;\n    const siblings = current.parentElement\n      ? Array.from(current.parentElement.childNodes)\n      : [];\n\n    for (let i = 0; i < siblings.length; i++) {\n      const sibling = siblings[i];\n      if (\n        sibling.nodeType === current.nodeType &&\n        sibling.nodeName === current.nodeName\n      ) {\n        index = index + 1;\n        hasSameTypeSiblings = true;\n        if (sibling.isSameNode(current)) {\n          break;\n        }\n      }\n    }\n\n    if (!current || !current.parentNode) break;\n    if (current.nodeName.toLowerCase() === \"html\"){\n      parts.unshift(\"html\");\n      break;\n    }\n\n    // text nodes are handled differently in XPath\n    if (current.nodeName !== \"#text\") {\n      const tagName = current.nodeName.toLowerCase();\n      const pathIndex = hasSameTypeSiblings ? \\`[\\${index}]\\` : \"\";\n      parts.unshift(\\`\\${tagName}\\${pathIndex}\\`);\n    }\n    \n    current = current.parentElement;\n  }\n\n  return parts.length ? \\`/\\${parts.join(\"/\")}\\` : \"\";\n}`;\nfunction getXPathByResolvedObjectId(cdpClient, resolvedObjectId) {\n  return __async(this, null, function* () {\n    const { result } = yield cdpClient.send(\"Runtime.callFunctionOn\", {\n      objectId: resolvedObjectId,\n      functionDeclaration: `function() {\n      ${functionString}\n      return getNodePath(this);\n    }`,\n      returnByValue: true\n    });\n    return result.value || \"\";\n  });\n}\nfunction findScrollableElementIds(stagehandPage) {\n  return __async(this, null, function* () {\n    const xpaths = yield stagehandPage.page.evaluate(() => {\n      return window.getScrollableElementXpaths();\n    });\n    const scrollableBackendIds = /* @__PURE__ */ new Set();\n    for (const xpath of xpaths) {\n      if (!xpath) continue;\n      const { result } = yield stagehandPage.sendCDP(\"Runtime.evaluate\", {\n        expression: `\n        (function() {\n          const res = document.evaluate(${JSON.stringify(\n          xpath\n        )}, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null);\n          return res.singleNodeValue;\n        })();\n      `,\n        returnByValue: false\n      });\n      if (result == null ? void 0 : result.objectId) {\n        const { node } = yield stagehandPage.sendCDP(\"DOM.describeNode\", {\n          objectId: result.objectId\n        });\n        if (node == null ? void 0 : node.backendNodeId) {\n          scrollableBackendIds.add(node.backendNodeId);\n        }\n      }\n    }\n    return scrollableBackendIds;\n  });\n}\n\n// lib/handlers/observeHandler.ts\nvar StagehandObserveHandler = class {\n  constructor({\n    stagehand,\n    logger,\n    stagehandPage,\n    userProvidedInstructions\n  }) {\n    this.stagehand = stagehand;\n    this.logger = logger;\n    this.stagehandPage = stagehandPage;\n    this.userProvidedInstructions = userProvidedInstructions;\n    this.observations = {};\n  }\n  _recordObservation(instruction, result) {\n    return __async(this, null, function* () {\n      const id = generateId(instruction);\n      this.observations[id] = { result, instruction };\n      return id;\n    });\n  }\n  observe(_0) {\n    return __async(this, arguments, function* ({\n      instruction,\n      llmClient,\n      requestId,\n      returnAction,\n      onlyVisible,\n      drawOverlay\n    }) {\n      if (!instruction) {\n        instruction = `Find elements that can be used for any future actions in the page. These may be navigation links, related pages, section/subsection links, buttons, or other interactive elements. Be comprehensive: if there are multiple elements that may be relevant for future actions, return all of them.`;\n      }\n      this.logger({\n        category: \"observation\",\n        message: \"starting observation\",\n        level: 1,\n        auxiliary: {\n          instruction: {\n            value: instruction,\n            type: \"string\"\n          }\n        }\n      });\n      let selectorMap = {};\n      let outputString;\n      let iframes = [];\n      const useAccessibilityTree = !onlyVisible;\n      if (useAccessibilityTree) {\n        yield this.stagehandPage._waitForSettledDom();\n        const tree = yield getAccessibilityTree(this.stagehandPage, this.logger);\n        this.logger({\n          category: \"observation\",\n          message: \"Getting accessibility tree data\",\n          level: 1\n        });\n        outputString = tree.simplified;\n        iframes = tree.iframes;\n      } else {\n        const evalResult = yield this.stagehand.page.evaluate(() => {\n          return window.processAllOfDom().then((result) => result);\n        });\n        ({ outputString, selectorMap } = evalResult);\n      }\n      const observationResponse = yield observe({\n        instruction,\n        domElements: outputString,\n        llmClient,\n        requestId,\n        userProvidedInstructions: this.userProvidedInstructions,\n        logger: this.logger,\n        isUsingAccessibilityTree: useAccessibilityTree,\n        returnAction\n      });\n      if (iframes.length > 0) {\n        iframes.forEach((iframe) => {\n          observationResponse.elements.push({\n            elementId: Number(iframe.nodeId),\n            description: \"an iframe\",\n            method: \"not-supported\",\n            arguments: []\n          });\n        });\n      }\n      const elementsWithSelectors = yield Promise.all(\n        observationResponse.elements.map((element) => __async(this, null, function* () {\n          const _a = element, { elementId } = _a, rest = __objRest(_a, [\"elementId\"]);\n          if (useAccessibilityTree) {\n            this.logger({\n              category: \"observation\",\n              message: \"Getting xpath for element\",\n              level: 1,\n              auxiliary: {\n                elementId: {\n                  value: elementId.toString(),\n                  type: \"string\"\n                }\n              }\n            });\n            const args = { backendNodeId: elementId };\n            const { object } = yield this.stagehandPage.sendCDP(\"DOM.resolveNode\", args);\n            if (!object || !object.objectId) {\n              this.logger({\n                category: \"observation\",\n                message: `Invalid object ID returned for element: ${elementId}`,\n                level: 1\n              });\n            }\n            const xpath = yield getXPathByResolvedObjectId(\n              yield this.stagehandPage.getCDPClient(),\n              object.objectId\n            );\n            if (!xpath || xpath === \"\") {\n              this.logger({\n                category: \"observation\",\n                message: `Empty xpath returned for element: ${elementId}`,\n                level: 1\n              });\n            }\n            return __spreadProps(__spreadValues({}, rest), {\n              selector: `xpath=${xpath}`\n              // Provisioning or future use if we want to use direct CDP\n              // backendNodeId: elementId,\n            });\n          }\n          return __spreadProps(__spreadValues({}, rest), {\n            selector: `xpath=${selectorMap[elementId][0]}`\n            // backendNodeId: backendNodeIdMap[elementId],\n          });\n        }))\n      );\n      yield this.stagehandPage.cleanupDomDebug();\n      this.logger({\n        category: \"observation\",\n        message: \"found elements\",\n        level: 1,\n        auxiliary: {\n          elements: {\n            value: JSON.stringify(elementsWithSelectors),\n            type: \"object\"\n          }\n        }\n      });\n      if (drawOverlay) {\n        yield drawObserveOverlay(this.stagehandPage.page, elementsWithSelectors);\n      }\n      yield this._recordObservation(instruction, elementsWithSelectors);\n      return elementsWithSelectors;\n    });\n  }\n};\n\n// lib/StagehandPage.ts\nvar BROWSERBASE_REGION_DOMAIN = {\n  \"us-west-2\": \"wss://connect.usw2.browserbase.com\",\n  \"us-east-1\": \"wss://connect.use1.browserbase.com\",\n  \"eu-central-1\": \"wss://connect.euc1.browserbase.com\",\n  \"ap-southeast-1\": \"wss://connect.apse1.browserbase.com\"\n};\nvar StagehandPage = class _StagehandPage {\n  constructor(page, stagehand, context, llmClient, userProvidedInstructions, api) {\n    this.cdpClient = null;\n    this.intPage = Object.assign(page, {\n      act: () => {\n        throw new Error(\n          \"You seem to be calling `act` on a page in an uninitialized `Stagehand` object. Ensure you are running `await stagehand.init()` on the Stagehand object before referencing the `page` object.\"\n        );\n      },\n      extract: () => {\n        throw new Error(\n          \"You seem to be calling `extract` on a page in an uninitialized `Stagehand` object. Ensure you are running `await stagehand.init()` on the Stagehand object before referencing the `page` object.\"\n        );\n      },\n      observe: () => {\n        throw new Error(\n          \"You seem to be calling `observe` on a page in an uninitialized `Stagehand` object. Ensure you are running `await stagehand.init()` on the Stagehand object before referencing the `page` object.\"\n        );\n      },\n      on: () => {\n        throw new Error(\n          \"You seem to be referencing a page in an uninitialized `Stagehand` object. Ensure you are running `await stagehand.init()` on the Stagehand object before referencing the `page` object.\"\n        );\n      }\n    });\n    this.stagehand = stagehand;\n    this.intContext = context;\n    this.llmClient = llmClient;\n    this.api = api;\n    this.userProvidedInstructions = userProvidedInstructions;\n    if (this.llmClient) {\n      this.actHandler = new StagehandActHandler({\n        verbose: this.stagehand.verbose,\n        llmProvider: this.stagehand.llmProvider,\n        enableCaching: this.stagehand.enableCaching,\n        logger: this.stagehand.logger,\n        stagehandPage: this,\n        stagehandContext: this.intContext,\n        llmClient,\n        userProvidedInstructions,\n        selfHeal: this.stagehand.selfHeal\n      });\n      this.extractHandler = new StagehandExtractHandler({\n        stagehand: this.stagehand,\n        logger: this.stagehand.logger,\n        stagehandPage: this,\n        userProvidedInstructions\n      });\n      this.observeHandler = new StagehandObserveHandler({\n        stagehand: this.stagehand,\n        logger: this.stagehand.logger,\n        stagehandPage: this,\n        userProvidedInstructions\n      });\n    }\n  }\n  _refreshPageFromAPI() {\n    return __async(this, null, function* () {\n      if (!this.api) return;\n      const sessionId = this.stagehand.browserbaseSessionID;\n      if (!sessionId) {\n        throw new Error(\"No Browserbase session ID found\");\n      }\n      const browserbase = new import_sdk.Browserbase({\n        apiKey: process.env.BROWSERBASE_API_KEY\n      });\n      const sessionStatus = yield browserbase.sessions.retrieve(sessionId);\n      const browserbaseDomain = BROWSERBASE_REGION_DOMAIN[sessionStatus.region] || \"wss://connect.browserbase.com\";\n      const connectUrl = `${browserbaseDomain}?apiKey=${process.env.BROWSERBASE_API_KEY}&sessionId=${sessionId}`;\n      const browser = yield import_test.chromium.connectOverCDP(connectUrl);\n      const context = browser.contexts()[0];\n      const newPage = context.pages()[0];\n      const newStagehandPage = yield new _StagehandPage(\n        newPage,\n        this.stagehand,\n        this.intContext,\n        this.llmClient,\n        this.userProvidedInstructions,\n        this.api\n      ).init();\n      this.intPage = newStagehandPage.page;\n      if (this.stagehand.debugDom) {\n        yield this.intPage.evaluate(\n          (debugDom) => window.showChunks = debugDom,\n          this.stagehand.debugDom\n        );\n      }\n      yield this.intPage.waitForLoadState(\"domcontentloaded\");\n      yield this._waitForSettledDom();\n    });\n  }\n  init() {\n    return __async(this, null, function* () {\n      const page = this.intPage;\n      const stagehand = this.stagehand;\n      this.intPage = new Proxy(page, {\n        get: (target, prop) => {\n          if (prop === \"goto\")\n            return (url, options) => __async(this, null, function* () {\n              const result = this.api ? yield this.api.goto(url, options) : yield page.goto(url, options);\n              if (this.api) {\n                yield this._refreshPageFromAPI();\n              } else {\n                if (stagehand.debugDom) {\n                  yield page.evaluate(\n                    (debugDom) => window.showChunks = debugDom,\n                    stagehand.debugDom\n                  );\n                }\n                yield this.intPage.waitForLoadState(\"domcontentloaded\");\n                yield this._waitForSettledDom();\n              }\n              return result;\n            });\n          if (this.llmClient) {\n            if (prop === \"act\") {\n              return (options) => __async(this, null, function* () {\n                return this.act(options);\n              });\n            }\n            if (prop === \"extract\") {\n              return (options) => __async(this, null, function* () {\n                return this.extract(options);\n              });\n            }\n            if (prop === \"observe\") {\n              return (options) => __async(this, null, function* () {\n                return this.observe(options);\n              });\n            }\n          } else {\n            if (prop === \"act\" || prop === \"extract\" || prop === \"observe\") {\n              return () => {\n                throw new Error(\n                  \"No LLM API key or LLM Client configured. An LLM API key or a custom LLM Client is required to use act, extract, or observe.\"\n                );\n              };\n            }\n          }\n          if (prop === \"on\") {\n            return (event, listener) => {\n              if (event === \"popup\") {\n                return this.context.on(\"page\", (page2) => __async(this, null, function* () {\n                  const newContext = yield StagehandContext.init(\n                    page2.context(),\n                    stagehand\n                  );\n                  const newStagehandPage = new _StagehandPage(\n                    page2,\n                    stagehand,\n                    newContext,\n                    this.llmClient\n                  );\n                  yield newStagehandPage.init();\n                  listener(newStagehandPage.page);\n                }));\n              }\n              return this.context.on(\n                event,\n                listener\n              );\n            };\n          }\n          return target[prop];\n        }\n      });\n      yield this._waitForSettledDom();\n      return this;\n    });\n  }\n  get page() {\n    return this.intPage;\n  }\n  get context() {\n    return this.intContext.context;\n  }\n  // We can make methods public because StagehandPage is private to the Stagehand class.\n  // When a user gets stagehand.page, they are getting a proxy to the Playwright page.\n  // We can override the methods on the proxy to add our own behavior\n  _waitForSettledDom(timeoutMs) {\n    return __async(this, null, function* () {\n      try {\n        const timeout = timeoutMs != null ? timeoutMs : this.stagehand.domSettleTimeoutMs;\n        let timeoutHandle;\n        yield this.page.waitForLoadState(\"domcontentloaded\");\n        const timeoutPromise = new Promise((resolve) => {\n          timeoutHandle = setTimeout(() => {\n            this.stagehand.log({\n              category: \"dom\",\n              message: \"DOM settle timeout exceeded, continuing anyway\",\n              level: 1,\n              auxiliary: {\n                timeout_ms: {\n                  value: timeout.toString(),\n                  type: \"integer\"\n                }\n              }\n            });\n            resolve();\n          }, timeout);\n        });\n        try {\n          yield Promise.race([\n            this.page.evaluate(() => {\n              return new Promise((resolve) => {\n                if (typeof window.waitForDomSettle === \"function\") {\n                  window.waitForDomSettle().then(resolve);\n                } else {\n                  console.warn(\n                    \"waitForDomSettle is not defined, considering DOM as settled\"\n                  );\n                  resolve();\n                }\n              });\n            }),\n            this.page.waitForLoadState(\"domcontentloaded\"),\n            this.page.waitForSelector(\"body\"),\n            timeoutPromise\n          ]);\n        } finally {\n          clearTimeout(timeoutHandle);\n        }\n      } catch (e) {\n        this.stagehand.log({\n          category: \"dom\",\n          message: \"Error in waitForSettledDom\",\n          level: 1,\n          auxiliary: {\n            error: {\n              value: e.message,\n              type: \"string\"\n            },\n            trace: {\n              value: e.stack,\n              type: \"string\"\n            }\n          }\n        });\n      }\n    });\n  }\n  startDomDebug() {\n    return __async(this, null, function* () {\n      if (this.stagehand.debugDom) {\n        try {\n          yield this.page.evaluate(() => {\n            if (typeof window.debugDom === \"function\") {\n              window.debugDom();\n            } else {\n              this.stagehand.log({\n                category: \"dom\",\n                message: \"debugDom is not defined\",\n                level: 1\n              });\n            }\n          }).catch(() => {\n          });\n        } catch (e) {\n          this.stagehand.log({\n            category: \"dom\",\n            message: \"Error in startDomDebug\",\n            level: 1,\n            auxiliary: {\n              error: {\n                value: e.message,\n                type: \"string\"\n              },\n              trace: {\n                value: e.stack,\n                type: \"string\"\n              }\n            }\n          });\n        }\n      }\n    });\n  }\n  cleanupDomDebug() {\n    return __async(this, null, function* () {\n      if (this.stagehand.debugDom) {\n        yield this.page.evaluate(() => window.cleanupDebug()).catch(() => {\n        });\n      }\n    });\n  }\n  act(actionOrOptions) {\n    return __async(this, null, function* () {\n      if (!this.actHandler) {\n        throw new Error(\"Act handler not initialized\");\n      }\n      yield clearOverlays(this.page);\n      if (typeof actionOrOptions === \"object\" && actionOrOptions !== null) {\n        if (\"selector\" in actionOrOptions && \"method\" in actionOrOptions) {\n          const observeResult = actionOrOptions;\n          return this.actHandler.actFromObserveResult(observeResult);\n        } else {\n          if (!(\"action\" in actionOrOptions)) {\n            throw new Error(\n              \"Invalid argument. Valid arguments are: a string, an ActOptions object, or an ObserveResult WITH 'selector' and 'method' fields.\"\n            );\n          }\n        }\n      } else if (typeof actionOrOptions === \"string\") {\n        actionOrOptions = { action: actionOrOptions };\n      } else {\n        throw new Error(\n          \"Invalid argument: you may have called act with an empty ObserveResult.\\nValid arguments are: a string, an ActOptions object, or an ObserveResult WITH 'selector' and 'method' fields.\"\n        );\n      }\n      const {\n        action,\n        modelName,\n        modelClientOptions,\n        useVision,\n        // still destructure this but will not pass it on\n        variables = {},\n        domSettleTimeoutMs\n      } = actionOrOptions;\n      if (typeof useVision !== \"undefined\") {\n        this.stagehand.log({\n          category: \"deprecation\",\n          message: \"Warning: vision is not supported in this version of Stagehand\",\n          level: 1\n        });\n      }\n      if (this.api) {\n        const result = yield this.api.act(actionOrOptions);\n        yield this._refreshPageFromAPI();\n        return result;\n      }\n      const requestId = Math.random().toString(36).substring(2);\n      const llmClient = modelName ? this.stagehand.llmProvider.getClient(modelName, modelClientOptions) : this.llmClient;\n      this.stagehand.log({\n        category: \"act\",\n        message: \"running act\",\n        level: 1,\n        auxiliary: {\n          action: {\n            value: action,\n            type: \"string\"\n          },\n          requestId: {\n            value: requestId,\n            type: \"string\"\n          },\n          modelName: {\n            value: llmClient.modelName,\n            type: \"string\"\n          }\n        }\n      });\n      return this.actHandler.act({\n        action,\n        llmClient,\n        chunksSeen: [],\n        requestId,\n        variables,\n        previousSelectors: [],\n        skipActionCacheForThisStep: false,\n        domSettleTimeoutMs\n      }).catch((e) => {\n        this.stagehand.log({\n          category: \"act\",\n          message: \"error acting\",\n          level: 1,\n          auxiliary: {\n            error: {\n              value: e.message,\n              type: \"string\"\n            },\n            trace: {\n              value: e.stack,\n              type: \"string\"\n            }\n          }\n        });\n        return {\n          success: false,\n          message: `Internal error: Error acting: ${e.message}`,\n          action\n        };\n      });\n    });\n  }\n  extract(instructionOrOptions) {\n    return __async(this, null, function* () {\n      if (!this.extractHandler) {\n        throw new Error(\"Extract handler not initialized\");\n      }\n      yield clearOverlays(this.page);\n      const options = typeof instructionOrOptions === \"string\" ? {\n        instruction: instructionOrOptions,\n        schema: defaultExtractSchema\n      } : instructionOrOptions;\n      const {\n        instruction,\n        schema,\n        modelName,\n        modelClientOptions,\n        domSettleTimeoutMs,\n        useTextExtract\n      } = options;\n      if (this.api) {\n        return this.api.extract(options);\n      }\n      const requestId = Math.random().toString(36).substring(2);\n      const llmClient = modelName ? this.stagehand.llmProvider.getClient(modelName, modelClientOptions) : this.llmClient;\n      this.stagehand.log({\n        category: \"extract\",\n        message: \"running extract\",\n        level: 1,\n        auxiliary: {\n          instruction: {\n            value: instruction,\n            type: \"string\"\n          },\n          requestId: {\n            value: requestId,\n            type: \"string\"\n          },\n          modelName: {\n            value: llmClient.modelName,\n            type: \"string\"\n          }\n        }\n      });\n      return this.extractHandler.extract({\n        instruction,\n        schema,\n        llmClient,\n        requestId,\n        domSettleTimeoutMs,\n        useTextExtract\n      }).catch((e) => {\n        this.stagehand.log({\n          category: \"extract\",\n          message: \"error extracting\",\n          level: 1,\n          auxiliary: {\n            error: {\n              value: e.message,\n              type: \"string\"\n            },\n            trace: {\n              value: e.stack,\n              type: \"string\"\n            }\n          }\n        });\n        if (this.stagehand.enableCaching) {\n          this.stagehand.llmProvider.cleanRequestCache(requestId);\n        }\n        throw e;\n      });\n    });\n  }\n  observe(instructionOrOptions) {\n    return __async(this, null, function* () {\n      if (!this.observeHandler) {\n        throw new Error(\"Observe handler not initialized\");\n      }\n      yield clearOverlays(this.page);\n      const options = typeof instructionOrOptions === \"string\" ? { instruction: instructionOrOptions } : instructionOrOptions || {};\n      const {\n        instruction,\n        modelName,\n        modelClientOptions,\n        useVision,\n        // still destructure but will not pass it on\n        domSettleTimeoutMs,\n        returnAction = true,\n        onlyVisible = false,\n        useAccessibilityTree,\n        drawOverlay\n      } = options;\n      if (useAccessibilityTree !== void 0) {\n        this.stagehand.log({\n          category: \"deprecation\",\n          message: \"useAccessibilityTree is deprecated.\\n  To use accessibility tree as context:\\n    1. Set onlyVisible to false (default)\\n    2. Don't declare useAccessibilityTree\",\n          level: 1\n        });\n        throw new Error(\n          \"useAccessibilityTree is deprecated. Use onlyVisible instead.\"\n        );\n      }\n      if (typeof useVision !== \"undefined\") {\n        this.stagehand.log({\n          category: \"deprecation\",\n          message: \"Warning: vision is not supported in this version of Stagehand\",\n          level: 1\n        });\n      }\n      if (this.api) {\n        return this.api.observe(options);\n      }\n      const requestId = Math.random().toString(36).substring(2);\n      const llmClient = modelName ? this.stagehand.llmProvider.getClient(modelName, modelClientOptions) : this.llmClient;\n      this.stagehand.log({\n        category: \"observe\",\n        message: \"running observe\",\n        level: 1,\n        auxiliary: {\n          instruction: {\n            value: instruction,\n            type: \"string\"\n          },\n          requestId: {\n            value: requestId,\n            type: \"string\"\n          },\n          modelName: {\n            value: llmClient.modelName,\n            type: \"string\"\n          },\n          onlyVisible: {\n            value: onlyVisible ? \"true\" : \"false\",\n            type: \"boolean\"\n          }\n        }\n      });\n      return this.observeHandler.observe({\n        instruction,\n        llmClient,\n        requestId,\n        domSettleTimeoutMs,\n        returnAction,\n        onlyVisible,\n        drawOverlay\n      }).catch((e) => {\n        this.stagehand.log({\n          category: \"observe\",\n          message: \"error observing\",\n          level: 1,\n          auxiliary: {\n            error: {\n              value: e.message,\n              type: \"string\"\n            },\n            trace: {\n              value: e.stack,\n              type: \"string\"\n            },\n            requestId: {\n              value: requestId,\n              type: \"string\"\n            },\n            instruction: {\n              value: instruction,\n              type: \"string\"\n            }\n          }\n        });\n        if (this.stagehand.enableCaching) {\n          this.stagehand.llmProvider.cleanRequestCache(requestId);\n        }\n        throw e;\n      });\n    });\n  }\n  getCDPClient() {\n    return __async(this, null, function* () {\n      if (!this.cdpClient) {\n        this.cdpClient = yield this.context.newCDPSession(this.page);\n      }\n      return this.cdpClient;\n    });\n  }\n  sendCDP(command, args) {\n    return __async(this, null, function* () {\n      const client = yield this.getCDPClient();\n      return client.send(\n        command,\n        args || {}\n      );\n    });\n  }\n  enableCDP(domain) {\n    return __async(this, null, function* () {\n      yield this.sendCDP(`${domain}.enable`, {});\n    });\n  }\n  disableCDP(domain) {\n    return __async(this, null, function* () {\n      yield this.sendCDP(`${domain}.disable`, {});\n    });\n  }\n};\n\n// lib/api.ts\nvar import_zod_to_json_schema = __toESM(require(\"zod-to-json-schema\"));\nvar StagehandAPI = class {\n  constructor({ apiKey, projectId, logger }) {\n    this.apiKey = apiKey;\n    this.projectId = projectId;\n    this.logger = logger;\n  }\n  init(_0) {\n    return __async(this, arguments, function* ({\n      modelName,\n      modelApiKey,\n      domSettleTimeoutMs,\n      verbose,\n      debugDom,\n      systemPrompt,\n      browserbaseSessionCreateParams\n    }) {\n      const whitelistResponse = yield this.request(\"/healthcheck\");\n      if (whitelistResponse.status === 401) {\n        throw new Error(\n          \"Unauthorized. Ensure you provided a valid API key and that it is whitelisted.\"\n        );\n      } else if (whitelistResponse.status !== 200) {\n        throw new Error(`Unknown error: ${whitelistResponse.status}`);\n      }\n      const sessionResponse = yield this.request(\"/sessions/start\", {\n        method: \"POST\",\n        body: JSON.stringify({\n          modelName,\n          domSettleTimeoutMs,\n          verbose,\n          debugDom,\n          systemPrompt,\n          browserbaseSessionCreateParams\n        }),\n        headers: {\n          \"x-model-api-key\": modelApiKey\n        }\n      });\n      if (sessionResponse.status !== 200) {\n        console.log(yield sessionResponse.text());\n        throw new Error(`Unknown error: ${sessionResponse.status}`);\n      }\n      const sessionResponseBody = yield sessionResponse.json();\n      if (sessionResponseBody.success === false) {\n        throw new Error(sessionResponseBody.message);\n      }\n      this.sessionId = sessionResponseBody.data.sessionId;\n      return sessionResponseBody.data;\n    });\n  }\n  act(options) {\n    return __async(this, null, function* () {\n      return this.execute({\n        method: \"act\",\n        args: __spreadValues({}, options)\n      });\n    });\n  }\n  extract(options) {\n    return __async(this, null, function* () {\n      const parsedSchema = (0, import_zod_to_json_schema.default)(options.schema);\n      return this.execute({\n        method: \"extract\",\n        args: __spreadProps(__spreadValues({}, options), { schemaDefinition: parsedSchema })\n      });\n    });\n  }\n  observe(options) {\n    return __async(this, null, function* () {\n      return this.execute({\n        method: \"observe\",\n        args: __spreadValues({}, options)\n      });\n    });\n  }\n  goto(url, options) {\n    return __async(this, null, function* () {\n      return this.execute({\n        method: \"navigate\",\n        args: { url, options }\n      });\n    });\n  }\n  end() {\n    return __async(this, null, function* () {\n      return this.execute({\n        method: \"end\"\n      });\n    });\n  }\n  execute(_0) {\n    return __async(this, arguments, function* ({\n      method,\n      args,\n      params\n    }) {\n      const urlParams = new URLSearchParams(params);\n      const queryString = urlParams.toString();\n      const url = `/sessions/${this.sessionId}/${method}${queryString ? `?${queryString}` : \"\"}`;\n      const response = yield this.request(url, {\n        method: \"POST\",\n        body: JSON.stringify(args)\n      });\n      if (!response.ok) {\n        const errorBody = yield response.text();\n        throw new Error(\n          `HTTP error! status: ${response.status}, body: ${errorBody}`\n        );\n      }\n      if (!response.body) {\n        throw new Error(\"Response body is null\");\n      }\n      const reader = response.body.getReader();\n      const decoder = new TextDecoder();\n      let buffer = \"\";\n      while (true) {\n        const { value, done } = yield reader.read();\n        if (done && !buffer) {\n          return null;\n        }\n        buffer += decoder.decode(value, { stream: true });\n        const lines = buffer.split(\"\\n\\n\");\n        buffer = lines.pop() || \"\";\n        for (const line of lines) {\n          if (!line.startsWith(\"data: \")) continue;\n          try {\n            const eventData = JSON.parse(line.slice(6));\n            if (eventData.type === \"system\") {\n              if (eventData.data.status === \"error\") {\n                throw new Error(eventData.data.error);\n              }\n              if (eventData.data.status === \"finished\") {\n                return eventData.data.result;\n              }\n            } else if (eventData.type === \"log\") {\n              this.logger(eventData.data.message);\n            }\n          } catch (e) {\n            console.error(\"Error parsing event data:\", e);\n            throw new Error(\"Failed to parse server response\");\n          }\n        }\n        if (done) break;\n      }\n    });\n  }\n  request(_0) {\n    return __async(this, arguments, function* (path3, options = {}) {\n      const defaultHeaders = {\n        \"x-bb-api-key\": this.apiKey,\n        \"x-bb-project-id\": this.projectId,\n        \"x-bb-session-id\": this.sessionId,\n        // we want real-time logs, so we stream the response\n        \"x-stream-response\": \"true\"\n      };\n      if (options.method === \"POST\" && options.body) {\n        defaultHeaders[\"Content-Type\"] = \"application/json\";\n      }\n      const response = yield fetch(`${process.env.STAGEHAND_API_URL}${path3}`, __spreadProps(__spreadValues({}, options), {\n        headers: __spreadValues(__spreadValues({}, defaultHeaders), options.headers)\n      }));\n      return response;\n    });\n  }\n};\n\n// lib/dom/build/scriptContent.ts\nvar scriptContent = '(() => {\\n  // lib/dom/xpathUtils.ts\\n  function getParentElement(node) {\\n    return isElementNode(node) ? node.parentElement : node.parentNode;\\n  }\\n  function getCombinations(attributes, size) {\\n    const results = [];\\n    function helper(start, combo) {\\n      if (combo.length === size) {\\n        results.push([...combo]);\\n        return;\\n      }\\n      for (let i = start; i < attributes.length; i++) {\\n        combo.push(attributes[i]);\\n        helper(i + 1, combo);\\n        combo.pop();\\n      }\\n    }\\n    helper(0, []);\\n    return results;\\n  }\\n  function isXPathFirstResultElement(xpath, target) {\\n    try {\\n      const result = document.evaluate(\\n        xpath,\\n        document.documentElement,\\n        null,\\n        XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,\\n        null\\n      );\\n      return result.snapshotItem(0) === target;\\n    } catch (error) {\\n      console.warn(`Invalid XPath expression: ${xpath}`, error);\\n      return false;\\n    }\\n  }\\n  function escapeXPathString(value) {\\n    if (value.includes(\"\\'\")) {\\n      if (value.includes(\\'\"\\')) {\\n        return \"concat(\" + value.split(/(\\'+)/).map((part) => {\\n          if (part === \"\\'\") {\\n            return `\"\\'\"`;\\n          } else if (part.startsWith(\"\\'\") && part.endsWith(\"\\'\")) {\\n            return `\"${part}\"`;\\n          } else {\\n            return `\\'${part}\\'`;\\n          }\\n        }).join(\",\") + \")\";\\n      } else {\\n        return `\"${value}\"`;\\n      }\\n    } else {\\n      return `\\'${value}\\'`;\\n    }\\n  }\\n  async function generateXPathsForElement(element) {\\n    if (!element) return [];\\n    const [complexXPath, standardXPath, idBasedXPath] = await Promise.all([\\n      generateComplexXPath(element),\\n      generateStandardXPath(element),\\n      generatedIdBasedXPath(element)\\n    ]);\\n    return [standardXPath, ...idBasedXPath ? [idBasedXPath] : [], complexXPath];\\n  }\\n  async function generateComplexXPath(element) {\\n    const parts = [];\\n    let currentElement = element;\\n    while (currentElement && (isTextNode(currentElement) || isElementNode(currentElement))) {\\n      if (isElementNode(currentElement)) {\\n        const el = currentElement;\\n        let selector = el.tagName.toLowerCase();\\n        const attributePriority = [\\n          \"data-qa\",\\n          \"data-component\",\\n          \"data-role\",\\n          \"role\",\\n          \"aria-role\",\\n          \"type\",\\n          \"name\",\\n          \"aria-label\",\\n          \"placeholder\",\\n          \"title\",\\n          \"alt\"\\n        ];\\n        const attributes = attributePriority.map((attr) => {\\n          let value = el.getAttribute(attr);\\n          if (attr === \"href-full\" && value) {\\n            value = el.getAttribute(\"href\");\\n          }\\n          return value ? { attr: attr === \"href-full\" ? \"href\" : attr, value } : null;\\n        }).filter((attr) => attr !== null);\\n        let uniqueSelector = \"\";\\n        for (let i = 1; i <= attributes.length; i++) {\\n          const combinations = getCombinations(attributes, i);\\n          for (const combo of combinations) {\\n            const conditions = combo.map((a) => `@${a.attr}=${escapeXPathString(a.value)}`).join(\" and \");\\n            const xpath2 = `//${selector}[${conditions}]`;\\n            if (isXPathFirstResultElement(xpath2, el)) {\\n              uniqueSelector = xpath2;\\n              break;\\n            }\\n          }\\n          if (uniqueSelector) break;\\n        }\\n        if (uniqueSelector) {\\n          parts.unshift(uniqueSelector.replace(\"//\", \"\"));\\n          break;\\n        } else {\\n          const parent = getParentElement(el);\\n          if (parent) {\\n            const siblings = Array.from(parent.children).filter(\\n              (sibling) => sibling.tagName === el.tagName\\n            );\\n            const index = siblings.indexOf(el) + 1;\\n            selector += siblings.length > 1 ? `[${index}]` : \"\";\\n          }\\n          parts.unshift(selector);\\n        }\\n      }\\n      currentElement = getParentElement(currentElement);\\n    }\\n    const xpath = \"//\" + parts.join(\"/\");\\n    return xpath;\\n  }\\n  async function generateStandardXPath(element) {\\n    const parts = [];\\n    while (element && (isTextNode(element) || isElementNode(element))) {\\n      let index = 0;\\n      let hasSameTypeSiblings = false;\\n      const siblings = element.parentElement ? Array.from(element.parentElement.childNodes) : [];\\n      for (let i = 0; i < siblings.length; i++) {\\n        const sibling = siblings[i];\\n        if (sibling.nodeType === element.nodeType && sibling.nodeName === element.nodeName) {\\n          index = index + 1;\\n          hasSameTypeSiblings = true;\\n          if (sibling.isSameNode(element)) {\\n            break;\\n          }\\n        }\\n      }\\n      if (element.nodeName !== \"#text\") {\\n        const tagName = element.nodeName.toLowerCase();\\n        const pathIndex = hasSameTypeSiblings ? `[${index}]` : \"\";\\n        parts.unshift(`${tagName}${pathIndex}`);\\n      }\\n      element = element.parentElement;\\n    }\\n    return parts.length ? `/${parts.join(\"/\")}` : \"\";\\n  }\\n  async function generatedIdBasedXPath(element) {\\n    if (isElementNode(element) && element.id) {\\n      return `//*[@id=\\'${element.id}\\']`;\\n    }\\n    return null;\\n  }\\n\\n  // lib/dom/utils.ts\\n  async function waitForDomSettle() {\\n    return new Promise((resolve) => {\\n      const createTimeout = () => {\\n        return setTimeout(() => {\\n          resolve();\\n        }, 2e3);\\n      };\\n      let timeout = createTimeout();\\n      const observer = new MutationObserver(() => {\\n        clearTimeout(timeout);\\n        timeout = createTimeout();\\n      });\\n      observer.observe(window.document.body, { childList: true, subtree: true });\\n    });\\n  }\\n  window.waitForDomSettle = waitForDomSettle;\\n  function calculateViewportHeight() {\\n    return Math.ceil(window.innerHeight * 0.75);\\n  }\\n  function canElementScroll(elem) {\\n    if (typeof elem.scrollTo !== \"function\") {\\n      console.warn(\"canElementScroll: .scrollTo is not a function.\");\\n      return false;\\n    }\\n    try {\\n      const originalTop = elem.scrollTop;\\n      elem.scrollTo({\\n        top: originalTop + 100,\\n        left: 0,\\n        behavior: \"instant\"\\n      });\\n      if (elem.scrollTop === originalTop) {\\n        throw new Error(\"scrollTop did not change\");\\n      }\\n      elem.scrollTo({\\n        top: originalTop,\\n        left: 0,\\n        behavior: \"instant\"\\n      });\\n      return true;\\n    } catch (error) {\\n      console.warn(\"canElementScroll error:\", error.message || error);\\n      return false;\\n    }\\n  }\\n\\n  // lib/dom/GlobalPageContainer.ts\\n  var GlobalPageContainer = class {\\n    getViewportHeight() {\\n      return calculateViewportHeight();\\n    }\\n    getScrollHeight() {\\n      return document.documentElement.scrollHeight;\\n    }\\n    async scrollTo(offset) {\\n      await new Promise((resolve) => setTimeout(resolve, 1500));\\n      window.scrollTo({ top: offset, left: 0, behavior: \"smooth\" });\\n      await this.waitForScrollEnd();\\n    }\\n    async waitForScrollEnd() {\\n      return new Promise((resolve) => {\\n        let scrollEndTimer;\\n        const handleScroll = () => {\\n          clearTimeout(scrollEndTimer);\\n          scrollEndTimer = window.setTimeout(() => {\\n            window.removeEventListener(\"scroll\", handleScroll);\\n            resolve();\\n          }, 100);\\n        };\\n        window.addEventListener(\"scroll\", handleScroll, { passive: true });\\n        handleScroll();\\n      });\\n    }\\n  };\\n\\n  // lib/dom/ElementContainer.ts\\n  var ElementContainer = class {\\n    constructor(el) {\\n      this.el = el;\\n    }\\n    getViewportHeight() {\\n      return this.el.clientHeight;\\n    }\\n    getScrollHeight() {\\n      return this.el.scrollHeight;\\n    }\\n    async scrollTo(offset) {\\n      await new Promise((resolve) => setTimeout(resolve, 1500));\\n      this.el.scrollTo({ top: offset, left: 0, behavior: \"smooth\" });\\n      await this.waitForScrollEnd();\\n    }\\n    async waitForScrollEnd() {\\n      return new Promise((resolve) => {\\n        let scrollEndTimer;\\n        const handleScroll = () => {\\n          clearTimeout(scrollEndTimer);\\n          scrollEndTimer = window.setTimeout(() => {\\n            this.el.removeEventListener(\"scroll\", handleScroll);\\n            resolve();\\n          }, 100);\\n        };\\n        this.el.addEventListener(\"scroll\", handleScroll, { passive: true });\\n        handleScroll();\\n      });\\n    }\\n  };\\n\\n  // lib/dom/containerFactory.ts\\n  function createStagehandContainer(obj) {\\n    if (obj instanceof Window) {\\n      return new GlobalPageContainer();\\n    } else {\\n      return new ElementContainer(obj);\\n    }\\n  }\\n\\n  // lib/dom/process.ts\\n  function isElementNode(node) {\\n    return node.nodeType === Node.ELEMENT_NODE;\\n  }\\n  function isTextNode(node) {\\n    return node.nodeType === Node.TEXT_NODE && Boolean(node.textContent?.trim());\\n  }\\n  function getScrollableElements(topN) {\\n    const docEl = document.documentElement;\\n    const scrollableElements = [docEl];\\n    const allElements = document.querySelectorAll(\"*\");\\n    for (const elem of allElements) {\\n      const style = window.getComputedStyle(elem);\\n      const overflowY = style.overflowY;\\n      const isPotentiallyScrollable = overflowY === \"auto\" || overflowY === \"scroll\" || overflowY === \"overlay\";\\n      if (isPotentiallyScrollable) {\\n        const candidateScrollDiff = elem.scrollHeight - elem.clientHeight;\\n        if (candidateScrollDiff > 0 && canElementScroll(elem)) {\\n          scrollableElements.push(elem);\\n        }\\n      }\\n    }\\n    scrollableElements.sort((a, b) => b.scrollHeight - a.scrollHeight);\\n    if (topN !== void 0) {\\n      return scrollableElements.slice(0, topN);\\n    }\\n    return scrollableElements;\\n  }\\n  async function getScrollableElementXpaths(topN) {\\n    const scrollableElems = getScrollableElements(topN);\\n    const xpaths = [];\\n    for (const elem of scrollableElems) {\\n      const allXPaths = await generateXPathsForElement(elem);\\n      const firstXPath = allXPaths?.[0] || \"\";\\n      xpaths.push(firstXPath);\\n    }\\n    return xpaths;\\n  }\\n  async function processDom(chunksSeen) {\\n    const { chunk, chunksArray } = await pickChunk(chunksSeen);\\n    const container = createStagehandContainer(window);\\n    const { outputString, selectorMap } = await processElements(\\n      chunk,\\n      true,\\n      0,\\n      container\\n    );\\n    console.log(\\n      `Stagehand (Browser Process): Extracted dom elements:\\n${outputString}`\\n    );\\n    return {\\n      outputString,\\n      selectorMap,\\n      chunk,\\n      chunks: chunksArray\\n    };\\n  }\\n  async function processAllOfDom() {\\n    console.log(\"Stagehand (Browser Process): Processing all of DOM\");\\n    const mainScrollableElements = getScrollableElements(1);\\n    const mainScrollable = mainScrollableElements[0];\\n    const container = mainScrollable === document.documentElement ? createStagehandContainer(window) : createStagehandContainer(mainScrollable);\\n    const viewportHeight = container.getViewportHeight();\\n    const documentHeight = container.getScrollHeight();\\n    const totalChunks = Math.ceil(documentHeight / viewportHeight);\\n    let index = 0;\\n    const results = [];\\n    for (let chunk = 0; chunk < totalChunks; chunk++) {\\n      const result = await processElements(chunk, true, index, container);\\n      results.push(result);\\n      index += Object.keys(result.selectorMap).length;\\n    }\\n    await container.scrollTo(0);\\n    const allOutputString = results.map((result) => result.outputString).join(\"\");\\n    const allSelectorMap = results.reduce(\\n      (acc, result) => ({ ...acc, ...result.selectorMap }),\\n      {}\\n    );\\n    console.log(\\n      `Stagehand (Browser Process): All dom elements: ${allOutputString}`\\n    );\\n    return {\\n      outputString: allOutputString,\\n      selectorMap: allSelectorMap\\n    };\\n  }\\n  var xpathCache = /* @__PURE__ */ new Map();\\n  async function processElements(chunk, scrollToChunk = true, indexOffset = 0, container) {\\n    console.time(\"processElements:total\");\\n    const stagehandContainer = container ?? createStagehandContainer(window);\\n    const viewportHeight = stagehandContainer.getViewportHeight();\\n    const totalScrollHeight = stagehandContainer.getScrollHeight();\\n    const chunkHeight = viewportHeight * chunk;\\n    const maxScrollTop = totalScrollHeight - viewportHeight;\\n    const offsetTop = Math.min(chunkHeight, maxScrollTop);\\n    if (scrollToChunk) {\\n      console.time(\"processElements:scroll\");\\n      await stagehandContainer.scrollTo(offsetTop);\\n      console.timeEnd(\"processElements:scroll\");\\n    }\\n    console.log(\"Stagehand (Browser Process): Generating candidate elements\");\\n    console.time(\"processElements:findCandidates\");\\n    const DOMQueue = [...document.body.childNodes];\\n    const candidateElements = [];\\n    while (DOMQueue.length > 0) {\\n      const element = DOMQueue.pop();\\n      let shouldAddElement = false;\\n      if (element && isElementNode(element)) {\\n        const childrenCount = element.childNodes.length;\\n        for (let i = childrenCount - 1; i >= 0; i--) {\\n          const child = element.childNodes[i];\\n          DOMQueue.push(child);\\n        }\\n        if (isInteractiveElement(element)) {\\n          if (isActive(element) && isVisible(element)) {\\n            shouldAddElement = true;\\n          }\\n        }\\n        if (isLeafElement(element)) {\\n          if (isActive(element) && isVisible(element)) {\\n            shouldAddElement = true;\\n          }\\n        }\\n      }\\n      if (element && isTextNode(element) && isTextVisible(element)) {\\n        shouldAddElement = true;\\n      }\\n      if (shouldAddElement) {\\n        candidateElements.push(element);\\n      }\\n    }\\n    console.timeEnd(\"processElements:findCandidates\");\\n    const selectorMap = {};\\n    let outputString = \"\";\\n    console.log(\\n      `Stagehand (Browser Process): Processing candidate elements: ${candidateElements.length}`\\n    );\\n    console.time(\"processElements:processCandidates\");\\n    console.time(\"processElements:generateXPaths\");\\n    const xpathLists = await Promise.all(\\n      candidateElements.map(async (element) => {\\n        if (xpathCache.has(element)) {\\n          return xpathCache.get(element);\\n        }\\n        const xpaths = await generateXPathsForElement(element);\\n        xpathCache.set(element, xpaths);\\n        return xpaths;\\n      })\\n    );\\n    console.timeEnd(\"processElements:generateXPaths\");\\n    candidateElements.forEach((element, index) => {\\n      const xpaths = xpathLists[index];\\n      let elementOutput = \"\";\\n      if (isTextNode(element)) {\\n        const textContent = element.textContent?.trim();\\n        if (textContent) {\\n          elementOutput += `${index + indexOffset}:${textContent}\\n`;\\n        }\\n      } else if (isElementNode(element)) {\\n        const tagName = element.tagName.toLowerCase();\\n        const attributes = collectEssentialAttributes(element);\\n        const openingTag = `<${tagName}${attributes ? \" \" + attributes : \"\"}>`;\\n        const closingTag = `</${tagName}>`;\\n        const textContent = element.textContent?.trim() || \"\";\\n        elementOutput += `${index + indexOffset}:${openingTag}${textContent}${closingTag}\\n`;\\n      }\\n      outputString += elementOutput;\\n      selectorMap[index + indexOffset] = xpaths;\\n    });\\n    console.timeEnd(\"processElements:processCandidates\");\\n    console.timeEnd(\"processElements:total\");\\n    return {\\n      outputString,\\n      selectorMap\\n    };\\n  }\\n  function collectEssentialAttributes(element) {\\n    const essentialAttributes = [\\n      \"id\",\\n      \"class\",\\n      \"href\",\\n      \"src\",\\n      \"aria-label\",\\n      \"aria-name\",\\n      \"aria-role\",\\n      \"aria-description\",\\n      \"aria-expanded\",\\n      \"aria-haspopup\",\\n      \"type\",\\n      \"value\"\\n    ];\\n    const attrs = essentialAttributes.map((attr) => {\\n      const value = element.getAttribute(attr);\\n      return value ? `${attr}=\"${value}\"` : \"\";\\n    }).filter((attr) => attr !== \"\");\\n    Array.from(element.attributes).forEach((attr) => {\\n      if (attr.name.startsWith(\"data-\")) {\\n        attrs.push(`${attr.name}=\"${attr.value}\"`);\\n      }\\n    });\\n    return attrs.join(\" \");\\n  }\\n  function storeDOM() {\\n    const originalDOM = document.body.cloneNode(true);\\n    console.log(\"DOM state stored.\");\\n    return originalDOM.outerHTML;\\n  }\\n  function restoreDOM(storedDOM) {\\n    console.log(\"Restoring DOM\");\\n    if (storedDOM) {\\n      document.body.innerHTML = storedDOM;\\n    } else {\\n      console.error(\"No DOM state was provided.\");\\n    }\\n  }\\n  function createTextBoundingBoxes() {\\n    const style = document.createElement(\"style\");\\n    document.head.appendChild(style);\\n    if (style.sheet) {\\n      style.sheet.insertRule(\\n        `\\n      .stagehand-highlighted-word, .stagehand-space {\\n        border: 0px solid orange;\\n        display: inline-block !important;\\n        visibility: visible;\\n      }\\n    `,\\n        0\\n      );\\n      style.sheet.insertRule(\\n        `\\n        code .stagehand-highlighted-word, code .stagehand-space,\\n        pre .stagehand-highlighted-word, pre .stagehand-space {\\n          white-space: pre-wrap;\\n          display: inline !important;\\n      }\\n     `,\\n        1\\n      );\\n    }\\n    function applyHighlighting(root) {\\n      root.querySelectorAll(\"body *\").forEach((element) => {\\n        if (element.closest(\".stagehand-nav, .stagehand-marker\")) {\\n          return;\\n        }\\n        if ([\"SCRIPT\", \"STYLE\", \"IFRAME\", \"INPUT\"].includes(element.tagName)) {\\n          return;\\n        }\\n        const childNodes = Array.from(element.childNodes);\\n        childNodes.forEach((node) => {\\n          if (node.nodeType === 3 && node.textContent?.trim().length > 0) {\\n            const textContent = node.textContent.replace(/\\\\u00A0/g, \" \");\\n            const tokens = textContent.split(/(\\\\s+)/g);\\n            const fragment = document.createDocumentFragment();\\n            const parentIsCode = element.tagName === \"CODE\";\\n            tokens.forEach((token) => {\\n              const span = document.createElement(\"span\");\\n              span.textContent = token;\\n              if (parentIsCode) {\\n                span.style.whiteSpace = \"pre-wrap\";\\n                span.style.display = \"inline\";\\n              }\\n              span.className = token.trim().length === 0 ? \"stagehand-space\" : \"stagehand-highlighted-word\";\\n              fragment.appendChild(span);\\n            });\\n            if (fragment.childNodes.length > 0 && node.parentNode) {\\n              element.insertBefore(fragment, node);\\n              node.remove();\\n            }\\n          }\\n        });\\n      });\\n    }\\n    applyHighlighting(document);\\n    document.querySelectorAll(\"iframe\").forEach((iframe) => {\\n      try {\\n        iframe.contentWindow?.postMessage({ action: \"highlight\" }, \"*\");\\n      } catch (error) {\\n        console.error(\"Error accessing iframe content: \", error);\\n      }\\n    });\\n  }\\n  function getElementBoundingBoxes(xpath) {\\n    const element = document.evaluate(\\n      xpath,\\n      document,\\n      null,\\n      XPathResult.FIRST_ORDERED_NODE_TYPE,\\n      null\\n    ).singleNodeValue;\\n    if (!element) return [];\\n    const isValidText = (text) => text && text.trim().length > 0;\\n    let dropDownElem = element.querySelector(\"option[selected]\");\\n    if (!dropDownElem) {\\n      dropDownElem = element.querySelector(\"option\");\\n    }\\n    if (dropDownElem) {\\n      const elemText = dropDownElem.textContent || \"\";\\n      if (isValidText(elemText)) {\\n        const parentRect = element.getBoundingClientRect();\\n        return [\\n          {\\n            text: elemText.trim(),\\n            top: parentRect.top + window.scrollY,\\n            left: parentRect.left + window.scrollX,\\n            width: parentRect.width,\\n            height: parentRect.height\\n          }\\n        ];\\n      } else {\\n        return [];\\n      }\\n    }\\n    let placeholderText = \"\";\\n    if ((element.tagName.toLowerCase() === \"input\" || element.tagName.toLowerCase() === \"textarea\") && element.placeholder) {\\n      placeholderText = element.placeholder;\\n    } else if (element.tagName.toLowerCase() === \"a\") {\\n      placeholderText = \"\";\\n    } else if (element.tagName.toLowerCase() === \"img\") {\\n      placeholderText = element.alt || \"\";\\n    }\\n    const words = element.querySelectorAll(\\n      \".stagehand-highlighted-word\"\\n    );\\n    const boundingBoxes = Array.from(words).map((word) => {\\n      const rect = word.getBoundingClientRect();\\n      return {\\n        text: word.innerText || \"\",\\n        top: rect.top + window.scrollY,\\n        left: rect.left + window.scrollX,\\n        width: rect.width,\\n        height: rect.height * 0.75\\n      };\\n    }).filter(\\n      (box) => box.width > 0 && box.height > 0 && box.top >= 0 && box.left >= 0 && isValidText(box.text)\\n    );\\n    if (boundingBoxes.length === 0) {\\n      const elementRect = element.getBoundingClientRect();\\n      return [\\n        {\\n          text: placeholderText,\\n          top: elementRect.top + window.scrollY,\\n          left: elementRect.left + window.scrollX,\\n          width: elementRect.width,\\n          height: elementRect.height * 0.75\\n        }\\n      ];\\n    }\\n    return boundingBoxes;\\n  }\\n  window.processDom = processDom;\\n  window.processAllOfDom = processAllOfDom;\\n  window.processElements = processElements;\\n  window.storeDOM = storeDOM;\\n  window.restoreDOM = restoreDOM;\\n  window.createTextBoundingBoxes = createTextBoundingBoxes;\\n  window.getElementBoundingBoxes = getElementBoundingBoxes;\\n  window.createStagehandContainer = createStagehandContainer;\\n  window.getScrollableElementXpaths = getScrollableElementXpaths;\\n  var leafElementDenyList = [\"SVG\", \"IFRAME\", \"SCRIPT\", \"STYLE\", \"LINK\"];\\n  var interactiveElementTypes = [\\n    \"A\",\\n    \"BUTTON\",\\n    \"DETAILS\",\\n    \"EMBED\",\\n    \"INPUT\",\\n    \"LABEL\",\\n    \"MENU\",\\n    \"MENUITEM\",\\n    \"OBJECT\",\\n    \"SELECT\",\\n    \"TEXTAREA\",\\n    \"SUMMARY\"\\n  ];\\n  var interactiveRoles = [\\n    \"button\",\\n    \"menu\",\\n    \"menuitem\",\\n    \"link\",\\n    \"checkbox\",\\n    \"radio\",\\n    \"slider\",\\n    \"tab\",\\n    \"tabpanel\",\\n    \"textbox\",\\n    \"combobox\",\\n    \"grid\",\\n    \"listbox\",\\n    \"option\",\\n    \"progressbar\",\\n    \"scrollbar\",\\n    \"searchbox\",\\n    \"switch\",\\n    \"tree\",\\n    \"treeitem\",\\n    \"spinbutton\",\\n    \"tooltip\"\\n  ];\\n  var interactiveAriaRoles = [\"menu\", \"menuitem\", \"button\"];\\n  var isVisible = (element) => {\\n    const rect = element.getBoundingClientRect();\\n    if (rect.width === 0 || rect.height === 0 || rect.top < 0 || rect.top > window.innerHeight) {\\n      return false;\\n    }\\n    if (!isTopElement(element, rect)) {\\n      return false;\\n    }\\n    const visible = element.checkVisibility({\\n      checkOpacity: true,\\n      checkVisibilityCSS: true\\n    });\\n    return visible;\\n  };\\n  var isTextVisible = (element) => {\\n    const range = document.createRange();\\n    range.selectNodeContents(element);\\n    const rect = range.getBoundingClientRect();\\n    if (rect.width === 0 || rect.height === 0 || rect.top < 0 || rect.top > window.innerHeight) {\\n      return false;\\n    }\\n    const parent = element.parentElement;\\n    if (!parent) {\\n      return false;\\n    }\\n    const visible = parent.checkVisibility({\\n      checkOpacity: true,\\n      checkVisibilityCSS: true\\n    });\\n    return visible;\\n  };\\n  function isTopElement(elem, rect) {\\n    const points = [\\n      { x: rect.left + rect.width * 0.25, y: rect.top + rect.height * 0.25 },\\n      { x: rect.left + rect.width * 0.75, y: rect.top + rect.height * 0.25 },\\n      { x: rect.left + rect.width * 0.25, y: rect.top + rect.height * 0.75 },\\n      { x: rect.left + rect.width * 0.75, y: rect.top + rect.height * 0.75 },\\n      { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 }\\n    ];\\n    return points.some((point) => {\\n      const topEl = document.elementFromPoint(point.x, point.y);\\n      let current = topEl;\\n      while (current && current !== document.body) {\\n        if (current.isSameNode(elem)) {\\n          return true;\\n        }\\n        current = current.parentElement;\\n      }\\n      return false;\\n    });\\n  }\\n  var isActive = (element) => {\\n    if (element.hasAttribute(\"disabled\") || element.hasAttribute(\"hidden\") || element.getAttribute(\"aria-disabled\") === \"true\") {\\n      return false;\\n    }\\n    return true;\\n  };\\n  var isInteractiveElement = (element) => {\\n    const elementType = element.tagName;\\n    const elementRole = element.getAttribute(\"role\");\\n    const elementAriaRole = element.getAttribute(\"aria-role\");\\n    return elementType && interactiveElementTypes.includes(elementType) || elementRole && interactiveRoles.includes(elementRole) || elementAriaRole && interactiveAriaRoles.includes(elementAriaRole);\\n  };\\n  var isLeafElement = (element) => {\\n    if (element.textContent === \"\") {\\n      return false;\\n    }\\n    if (element.childNodes.length === 0) {\\n      return !leafElementDenyList.includes(element.tagName);\\n    }\\n    if (element.childNodes.length === 1 && isTextNode(element.childNodes[0])) {\\n      return true;\\n    }\\n    return false;\\n  };\\n  async function pickChunk(chunksSeen) {\\n    const viewportHeight = calculateViewportHeight();\\n    const documentHeight = document.documentElement.scrollHeight;\\n    const chunks = Math.ceil(documentHeight / viewportHeight);\\n    const chunksArray = Array.from({ length: chunks }, (_, i) => i);\\n    const chunksRemaining = chunksArray.filter((chunk2) => {\\n      return !chunksSeen.includes(chunk2);\\n    });\\n    const currentScrollPosition = window.scrollY;\\n    const closestChunk = chunksRemaining.reduce((closest, current) => {\\n      const currentChunkTop = viewportHeight * current;\\n      const closestChunkTop = viewportHeight * closest;\\n      return Math.abs(currentScrollPosition - currentChunkTop) < Math.abs(currentScrollPosition - closestChunkTop) ? current : closest;\\n    }, chunksRemaining[0]);\\n    const chunk = closestChunk;\\n    if (chunk === void 0) {\\n      throw new Error(`No chunks remaining to check: ${chunksRemaining}`);\\n    }\\n    return {\\n      chunk,\\n      chunksArray\\n    };\\n  }\\n\\n  // lib/dom/debug.ts\\n  async function debugDom() {\\n    window.chunkNumber = 0;\\n    const { selectorMap: multiSelectorMap } = await window.processElements(\\n      window.chunkNumber\\n    );\\n    const selectorMap = multiSelectorMapToSelectorMap(multiSelectorMap);\\n    drawChunk(selectorMap);\\n  }\\n  function multiSelectorMapToSelectorMap(multiSelectorMap) {\\n    return Object.fromEntries(\\n      Object.entries(multiSelectorMap).map(([key, selectors]) => [\\n        Number(key),\\n        selectors[0]\\n      ])\\n    );\\n  }\\n  function drawChunk(selectorMap) {\\n    if (!window.showChunks) return;\\n    cleanupMarkers();\\n    Object.values(selectorMap).forEach((selector) => {\\n      const element = document.evaluate(\\n        selector,\\n        document,\\n        null,\\n        XPathResult.FIRST_ORDERED_NODE_TYPE,\\n        null\\n      ).singleNodeValue;\\n      if (element) {\\n        let rect;\\n        if (element.nodeType === Node.ELEMENT_NODE) {\\n          rect = element.getBoundingClientRect();\\n        } else {\\n          const range = document.createRange();\\n          range.selectNodeContents(element);\\n          rect = range.getBoundingClientRect();\\n        }\\n        const color = \"grey\";\\n        const overlay = document.createElement(\"div\");\\n        overlay.style.position = \"absolute\";\\n        overlay.style.left = `${rect.left + window.scrollX}px`;\\n        overlay.style.top = `${rect.top + window.scrollY}px`;\\n        overlay.style.padding = \"2px\";\\n        overlay.style.width = `${rect.width}px`;\\n        overlay.style.height = `${rect.height}px`;\\n        overlay.style.backgroundColor = color;\\n        overlay.className = \"stagehand-marker\";\\n        overlay.style.opacity = \"0.3\";\\n        overlay.style.zIndex = \"1000000000\";\\n        overlay.style.border = \"1px solid\";\\n        overlay.style.pointerEvents = \"none\";\\n        document.body.appendChild(overlay);\\n      }\\n    });\\n  }\\n  async function cleanupDebug() {\\n    cleanupMarkers();\\n  }\\n  function cleanupMarkers() {\\n    const markers = document.querySelectorAll(\".stagehand-marker\");\\n    markers.forEach((marker) => {\\n      marker.remove();\\n    });\\n  }\\n  window.debugDom = debugDom;\\n  window.cleanupDebug = cleanupDebug;\\n})();\\n';\n\n// lib/cache/LLMCache.ts\nvar LLMCache = class _LLMCache extends BaseCache {\n  constructor(logger, cacheDir, cacheFile) {\n    super(logger, cacheDir, cacheFile || \"llm_calls.json\");\n  }\n  /**\n   * Overrides the get method to track used hashes by requestId.\n   * @param options - The options used to generate the cache key.\n   * @param requestId - The identifier for the current request.\n   * @returns The cached data if available, otherwise null.\n   */\n  get(options, requestId) {\n    return __async(this, null, function* () {\n      const data = yield __superGet(_LLMCache.prototype, this, \"get\").call(this, options, requestId);\n      return data;\n    });\n  }\n  /**\n   * Overrides the set method to include cache cleanup logic.\n   * @param options - The options used to generate the cache key.\n   * @param data - The data to be cached.\n   * @param requestId - The identifier for the current request.\n   */\n  set(options, data, requestId) {\n    return __async(this, null, function* () {\n      yield __superGet(_LLMCache.prototype, this, \"set\").call(this, options, data, requestId);\n      this.logger({\n        category: \"llm_cache\",\n        message: \"Cache miss - saved new response\",\n        level: 1\n      });\n    });\n  }\n};\n\n// lib/llm/AnthropicClient.ts\nvar import_sdk2 = __toESM(require(\"@anthropic-ai/sdk\"));\nvar import_zod_to_json_schema2 = require(\"zod-to-json-schema\");\n\n// lib/llm/LLMClient.ts\nvar AnnotatedScreenshotText = \"This is a screenshot of the current page state with the elements annotated on it. Each element id is annotated with a number to the top left of it. Duplicate annotations at the same location are under each other vertically.\";\nvar LLMClient = class {\n  constructor(modelName, userProvidedInstructions) {\n    this.modelName = modelName;\n    this.userProvidedInstructions = userProvidedInstructions;\n  }\n};\n\n// lib/llm/AnthropicClient.ts\nvar AnthropicClient = class extends LLMClient {\n  constructor({\n    enableCaching = false,\n    cache,\n    modelName,\n    clientOptions,\n    userProvidedInstructions\n  }) {\n    super(modelName);\n    this.type = \"anthropic\";\n    this.client = new import_sdk2.default(clientOptions);\n    this.cache = cache;\n    this.enableCaching = enableCaching;\n    this.modelName = modelName;\n    this.clientOptions = clientOptions;\n    this.userProvidedInstructions = userProvidedInstructions;\n  }\n  createChatCompletion(_0) {\n    return __async(this, arguments, function* ({\n      options,\n      retries,\n      logger\n    }) {\n      var _a, _b;\n      const optionsWithoutImage = __spreadValues({}, options);\n      delete optionsWithoutImage.image;\n      logger({\n        category: \"anthropic\",\n        message: \"creating chat completion\",\n        level: 1,\n        auxiliary: {\n          options: {\n            value: JSON.stringify(optionsWithoutImage),\n            type: \"object\"\n          }\n        }\n      });\n      const cacheOptions = {\n        model: this.modelName,\n        messages: options.messages,\n        temperature: options.temperature,\n        image: options.image,\n        response_model: options.response_model,\n        tools: options.tools,\n        retries\n      };\n      if (this.enableCaching) {\n        const cachedResponse = yield this.cache.get(\n          cacheOptions,\n          options.requestId\n        );\n        if (cachedResponse) {\n          logger({\n            category: \"llm_cache\",\n            message: \"LLM cache hit - returning cached response\",\n            level: 1,\n            auxiliary: {\n              cachedResponse: {\n                value: JSON.stringify(cachedResponse),\n                type: \"object\"\n              },\n              requestId: {\n                value: options.requestId,\n                type: \"string\"\n              },\n              cacheOptions: {\n                value: JSON.stringify(cacheOptions),\n                type: \"object\"\n              }\n            }\n          });\n          return cachedResponse;\n        } else {\n          logger({\n            category: \"llm_cache\",\n            message: \"LLM cache miss - no cached response found\",\n            level: 1,\n            auxiliary: {\n              cacheOptions: {\n                value: JSON.stringify(cacheOptions),\n                type: \"object\"\n              },\n              requestId: {\n                value: options.requestId,\n                type: \"string\"\n              }\n            }\n          });\n        }\n      }\n      const systemMessage = options.messages.find((msg) => {\n        if (msg.role === \"system\") {\n          if (typeof msg.content === \"string\") {\n            return true;\n          } else if (Array.isArray(msg.content)) {\n            return msg.content.every((content) => content.type !== \"image_url\");\n          }\n        }\n        return false;\n      });\n      const userMessages = options.messages.filter(\n        (msg) => msg.role !== \"system\"\n      );\n      const formattedMessages = userMessages.map((msg) => {\n        if (typeof msg.content === \"string\") {\n          return {\n            role: msg.role,\n            // ensure its not checking for system types\n            content: msg.content\n          };\n        } else {\n          return {\n            role: msg.role,\n            content: msg.content.map((content) => {\n              if (\"image_url\" in content) {\n                const formattedContent = {\n                  type: \"image\",\n                  source: {\n                    type: \"base64\",\n                    media_type: \"image/jpeg\",\n                    data: content.image_url.url\n                  }\n                };\n                return formattedContent;\n              } else {\n                return { type: \"text\", text: content.text };\n              }\n            })\n          };\n        }\n      });\n      if (options.image) {\n        const screenshotMessage = {\n          role: \"user\",\n          content: [\n            {\n              type: \"image\",\n              source: {\n                type: \"base64\",\n                media_type: \"image/jpeg\",\n                data: options.image.buffer.toString(\"base64\")\n              }\n            }\n          ]\n        };\n        if (options.image.description && Array.isArray(screenshotMessage.content)) {\n          screenshotMessage.content.push({\n            type: \"text\",\n            text: options.image.description\n          });\n        }\n        formattedMessages.push(screenshotMessage);\n      }\n      let anthropicTools = (_a = options.tools) == null ? void 0 : _a.map((tool) => {\n        return {\n          name: tool.name,\n          description: tool.description,\n          input_schema: {\n            type: \"object\",\n            properties: tool.parameters.properties,\n            required: tool.parameters.required\n          }\n        };\n      });\n      let toolDefinition;\n      if (options.response_model) {\n        const jsonSchema = (0, import_zod_to_json_schema2.zodToJsonSchema)(options.response_model.schema);\n        const { properties: schemaProperties, required: schemaRequired } = extractSchemaProperties(jsonSchema);\n        toolDefinition = {\n          name: \"print_extracted_data\",\n          description: \"Prints the extracted data based on the provided schema.\",\n          input_schema: {\n            type: \"object\",\n            properties: schemaProperties,\n            required: schemaRequired\n          }\n        };\n      }\n      if (toolDefinition) {\n        anthropicTools = anthropicTools != null ? anthropicTools : [];\n        anthropicTools.push(toolDefinition);\n      }\n      const response = yield this.client.messages.create({\n        model: this.modelName,\n        max_tokens: options.maxTokens || 8192,\n        messages: formattedMessages,\n        tools: anthropicTools,\n        system: systemMessage ? systemMessage.content : void 0,\n        temperature: options.temperature\n      });\n      logger({\n        category: \"anthropic\",\n        message: \"response\",\n        level: 1,\n        auxiliary: {\n          response: {\n            value: JSON.stringify(response),\n            type: \"object\"\n          },\n          requestId: {\n            value: options.requestId,\n            type: \"string\"\n          }\n        }\n      });\n      const transformedResponse = {\n        id: response.id,\n        object: \"chat.completion\",\n        created: Date.now(),\n        model: response.model,\n        choices: [\n          {\n            index: 0,\n            message: {\n              role: \"assistant\",\n              content: ((_b = response.content.find((c) => c.type === \"text\")) == null ? void 0 : _b.text) || null,\n              tool_calls: response.content.filter((c) => c.type === \"tool_use\").map((toolUse) => ({\n                id: toolUse.id,\n                type: \"function\",\n                function: {\n                  name: toolUse.name,\n                  arguments: JSON.stringify(toolUse.input)\n                }\n              }))\n            },\n            finish_reason: response.stop_reason\n          }\n        ],\n        usage: {\n          prompt_tokens: response.usage.input_tokens,\n          completion_tokens: response.usage.output_tokens,\n          total_tokens: response.usage.input_tokens + response.usage.output_tokens\n        }\n      };\n      logger({\n        category: \"anthropic\",\n        message: \"transformed response\",\n        level: 1,\n        auxiliary: {\n          transformedResponse: {\n            value: JSON.stringify(transformedResponse),\n            type: \"object\"\n          },\n          requestId: {\n            value: options.requestId,\n            type: \"string\"\n          }\n        }\n      });\n      if (options.response_model) {\n        const toolUse = response.content.find((c) => c.type === \"tool_use\");\n        if (toolUse && \"input\" in toolUse) {\n          const result = toolUse.input;\n          if (this.enableCaching) {\n            this.cache.set(cacheOptions, result, options.requestId);\n          }\n          return result;\n        } else {\n          if (!retries || retries < 5) {\n            return this.createChatCompletion({\n              options,\n              logger,\n              retries: (retries != null ? retries : 0) + 1\n            });\n          }\n          logger({\n            category: \"anthropic\",\n            message: \"error creating chat completion\",\n            level: 1,\n            auxiliary: {\n              requestId: {\n                value: options.requestId,\n                type: \"string\"\n              }\n            }\n          });\n          throw new Error(\n            \"Create Chat Completion Failed: No tool use with input in response\"\n          );\n        }\n      }\n      if (this.enableCaching) {\n        this.cache.set(cacheOptions, transformedResponse, options.requestId);\n        logger({\n          category: \"anthropic\",\n          message: \"cached response\",\n          level: 1,\n          auxiliary: {\n            requestId: {\n              value: options.requestId,\n              type: \"string\"\n            },\n            transformedResponse: {\n              value: JSON.stringify(transformedResponse),\n              type: \"object\"\n            },\n            cacheOptions: {\n              value: JSON.stringify(cacheOptions),\n              type: \"object\"\n            }\n          }\n        });\n      }\n      return transformedResponse;\n    });\n  }\n};\nvar extractSchemaProperties = (jsonSchema) => {\n  var _a;\n  const schemaRoot = ((_a = jsonSchema.definitions) == null ? void 0 : _a.MySchema) || jsonSchema;\n  return {\n    properties: schemaRoot.properties,\n    required: schemaRoot.required\n  };\n};\n\n// lib/llm/OpenAIClient.ts\nvar import_openai = __toESM(require(\"openai\"));\nvar import_zod3 = require(\"openai/helpers/zod\");\nvar import_zod_to_json_schema3 = __toESM(require(\"zod-to-json-schema\"));\nvar OpenAIClient = class extends LLMClient {\n  constructor({\n    enableCaching = false,\n    cache,\n    modelName,\n    clientOptions\n  }) {\n    super(modelName);\n    this.type = \"openai\";\n    this.clientOptions = clientOptions;\n    this.client = new import_openai.default(clientOptions);\n    this.cache = cache;\n    this.enableCaching = enableCaching;\n    this.modelName = modelName;\n  }\n  createChatCompletion(_0) {\n    return __async(this, arguments, function* ({\n      options: optionsInitial,\n      logger,\n      retries = 3\n    }) {\n      var _a, _b, _e;\n      let options = optionsInitial;\n      let isToolsOverridedForO1 = false;\n      if (this.modelName.startsWith(\"o1\") || this.modelName.startsWith(\"o3\")) {\n        let {\n          tool_choice,\n          top_p,\n          frequency_penalty,\n          presence_penalty,\n          temperature\n        } = options;\n        _a = options, {\n          tool_choice,\n          top_p,\n          frequency_penalty,\n          presence_penalty,\n          temperature\n        } = _a, options = __objRest(_a, [\n          \"tool_choice\",\n          \"top_p\",\n          \"frequency_penalty\",\n          \"presence_penalty\",\n          \"temperature\"\n        ]);\n        options.messages = options.messages.map((message) => __spreadProps(__spreadValues({}, message), {\n          role: \"user\"\n        }));\n        if (options.tools && options.response_model) {\n          throw new Error(\n            \"Cannot use both tool and response_model for o1 models\"\n          );\n        }\n        if (options.tools) {\n          let { tools } = options;\n          _b = options, { tools } = _b, options = __objRest(_b, [\"tools\"]);\n          isToolsOverridedForO1 = true;\n          options.messages.push({\n            role: \"user\",\n            content: `You have the following tools available to you:\n${JSON.stringify(\n              tools\n            )}\n\n          Respond with the following zod schema format to use a method: {\n            \"name\": \"<tool_name>\",\n            \"arguments\": <tool_args>\n          }\n          \n          Do not include any other text or formattings like \\`\\`\\` in your response. Just the JSON object.`\n          });\n        }\n      }\n      if (options.temperature && (this.modelName.startsWith(\"o1\") || this.modelName.startsWith(\"o3\"))) {\n        throw new Error(\"Temperature is not supported for o1 models\");\n      }\n      const _c = options, { image, requestId } = _c, optionsWithoutImageAndRequestId = __objRest(_c, [\"image\", \"requestId\"]);\n      logger({\n        category: \"openai\",\n        message: \"creating chat completion\",\n        level: 1,\n        auxiliary: {\n          options: {\n            value: JSON.stringify(__spreadProps(__spreadValues({}, optionsWithoutImageAndRequestId), {\n              requestId\n            })),\n            type: \"object\"\n          },\n          modelName: {\n            value: this.modelName,\n            type: \"string\"\n          }\n        }\n      });\n      const cacheOptions = {\n        model: this.modelName,\n        messages: options.messages,\n        temperature: options.temperature,\n        top_p: options.top_p,\n        frequency_penalty: options.frequency_penalty,\n        presence_penalty: options.presence_penalty,\n        image,\n        response_model: options.response_model\n      };\n      if (this.enableCaching) {\n        const cachedResponse = yield this.cache.get(\n          cacheOptions,\n          options.requestId\n        );\n        if (cachedResponse) {\n          logger({\n            category: \"llm_cache\",\n            message: \"LLM cache hit - returning cached response\",\n            level: 1,\n            auxiliary: {\n              requestId: {\n                value: options.requestId,\n                type: \"string\"\n              },\n              cachedResponse: {\n                value: JSON.stringify(cachedResponse),\n                type: \"object\"\n              }\n            }\n          });\n          return cachedResponse;\n        } else {\n          logger({\n            category: \"llm_cache\",\n            message: \"LLM cache miss - no cached response found\",\n            level: 1,\n            auxiliary: {\n              requestId: {\n                value: options.requestId,\n                type: \"string\"\n              }\n            }\n          });\n        }\n      }\n      if (options.image) {\n        const screenshotMessage = {\n          role: \"user\",\n          content: [\n            {\n              type: \"image_url\",\n              image_url: {\n                url: `data:image/jpeg;base64,${options.image.buffer.toString(\"base64\")}`\n              }\n            },\n            ...options.image.description ? [{ type: \"text\", text: options.image.description }] : []\n          ]\n        };\n        options.messages.push(screenshotMessage);\n      }\n      let responseFormat = void 0;\n      if (options.response_model) {\n        if (this.modelName.startsWith(\"o1\") || this.modelName.startsWith(\"o3\")) {\n          try {\n            const parsedSchema = JSON.stringify(\n              (0, import_zod_to_json_schema3.default)(options.response_model.schema)\n            );\n            options.messages.push({\n              role: \"user\",\n              content: `Respond in this zod schema format:\n${parsedSchema}\n\n\n          Do not include any other text, formatting or markdown in your output. Do not include \\`\\`\\` or \\`\\`\\`json in your response. Only the JSON object itself.`\n            });\n          } catch (error) {\n            logger({\n              category: \"openai\",\n              message: \"Failed to parse response model schema\",\n              level: 0\n            });\n            if (retries > 0) {\n              return this.createChatCompletion({\n                options,\n                logger,\n                retries: retries - 1\n              });\n            }\n            throw error;\n          }\n        } else {\n          responseFormat = (0, import_zod3.zodResponseFormat)(\n            options.response_model.schema,\n            options.response_model.name\n          );\n        }\n      }\n      const _d = __spreadProps(__spreadValues({}, optionsWithoutImageAndRequestId), {\n        model: this.modelName\n      }), { response_model } = _d, openAiOptions = __objRest(_d, [\"response_model\"]);\n      logger({\n        category: \"openai\",\n        message: \"creating chat completion\",\n        level: 1,\n        auxiliary: {\n          openAiOptions: {\n            value: JSON.stringify(openAiOptions),\n            type: \"object\"\n          }\n        }\n      });\n      const formattedMessages = options.messages.map((message) => {\n        if (Array.isArray(message.content)) {\n          const contentParts = message.content.map((content) => {\n            if (\"image_url\" in content) {\n              const imageContent = {\n                image_url: {\n                  url: content.image_url.url\n                },\n                type: \"image_url\"\n              };\n              return imageContent;\n            } else {\n              const textContent = {\n                text: content.text,\n                type: \"text\"\n              };\n              return textContent;\n            }\n          });\n          if (message.role === \"system\") {\n            const formattedMessage2 = __spreadProps(__spreadValues({}, message), {\n              role: \"system\",\n              content: contentParts.filter(\n                (content) => content.type === \"text\"\n              )\n            });\n            return formattedMessage2;\n          } else if (message.role === \"user\") {\n            const formattedMessage2 = __spreadProps(__spreadValues({}, message), {\n              role: \"user\",\n              content: contentParts\n            });\n            return formattedMessage2;\n          } else {\n            const formattedMessage2 = __spreadProps(__spreadValues({}, message), {\n              role: \"assistant\",\n              content: contentParts.filter(\n                (content) => content.type === \"text\"\n              )\n            });\n            return formattedMessage2;\n          }\n        }\n        const formattedMessage = {\n          role: \"user\",\n          content: message.content\n        };\n        return formattedMessage;\n      });\n      const body = __spreadProps(__spreadValues({}, openAiOptions), {\n        model: this.modelName,\n        messages: formattedMessages,\n        response_format: responseFormat,\n        stream: false,\n        tools: (_e = options.tools) == null ? void 0 : _e.map((tool) => ({\n          function: {\n            name: tool.name,\n            description: tool.description,\n            parameters: tool.parameters\n          },\n          type: \"function\"\n        }))\n      });\n      const response = yield this.client.chat.completions.create(body);\n      if (isToolsOverridedForO1) {\n        try {\n          const parsedContent = JSON.parse(response.choices[0].message.content);\n          response.choices[0].message.tool_calls = [\n            {\n              function: {\n                name: parsedContent[\"name\"],\n                arguments: JSON.stringify(parsedContent[\"arguments\"])\n              },\n              type: \"function\",\n              id: \"-1\"\n            }\n          ];\n          response.choices[0].message.content = null;\n        } catch (error) {\n          logger({\n            category: \"openai\",\n            message: \"Failed to parse tool call response\",\n            level: 0,\n            auxiliary: {\n              error: {\n                value: error.message,\n                type: \"string\"\n              },\n              content: {\n                value: response.choices[0].message.content,\n                type: \"string\"\n              }\n            }\n          });\n          if (retries > 0) {\n            return this.createChatCompletion({\n              options,\n              logger,\n              retries: retries - 1\n            });\n          }\n          throw error;\n        }\n      }\n      logger({\n        category: \"openai\",\n        message: \"response\",\n        level: 1,\n        auxiliary: {\n          response: {\n            value: JSON.stringify(response),\n            type: \"object\"\n          },\n          requestId: {\n            value: requestId,\n            type: \"string\"\n          }\n        }\n      });\n      if (options.response_model) {\n        const extractedData = response.choices[0].message.content;\n        const parsedData = JSON.parse(extractedData);\n        if (!validateZodSchema(options.response_model.schema, parsedData)) {\n          if (retries > 0) {\n            return this.createChatCompletion({\n              options,\n              logger,\n              retries: retries - 1\n            });\n          }\n          throw new Error(\"Invalid response schema\");\n        }\n        if (this.enableCaching) {\n          this.cache.set(\n            cacheOptions,\n            __spreadValues({}, parsedData),\n            options.requestId\n          );\n        }\n        return parsedData;\n      }\n      if (this.enableCaching) {\n        logger({\n          category: \"llm_cache\",\n          message: \"caching response\",\n          level: 1,\n          auxiliary: {\n            requestId: {\n              value: options.requestId,\n              type: \"string\"\n            },\n            cacheOptions: {\n              value: JSON.stringify(cacheOptions),\n              type: \"object\"\n            },\n            response: {\n              value: JSON.stringify(response),\n              type: \"object\"\n            }\n          }\n        });\n        this.cache.set(cacheOptions, response, options.requestId);\n      }\n      return response;\n    });\n  }\n};\n\n// lib/llm/LLMProvider.ts\nvar modelToProviderMap = {\n  \"gpt-4o\": \"openai\",\n  \"gpt-4o-mini\": \"openai\",\n  \"gpt-4o-2024-08-06\": \"openai\",\n  \"gpt-4o-2024-11-20\": \"openai\",\n  \"gpt-4o-2024-05-13\": \"openai\",\n  \"o1-mini\": \"openai\",\n  \"o1-preview\": \"openai\",\n  \"o3-mini\": \"openai\",\n  \"claude-3-5-sonnet-latest\": \"anthropic\",\n  \"claude-3-5-sonnet-20240620\": \"anthropic\",\n  \"claude-3-5-sonnet-20241022\": \"anthropic\"\n};\nvar LLMProvider = class {\n  constructor(logger, enableCaching) {\n    this.logger = logger;\n    this.enableCaching = enableCaching;\n    this.cache = enableCaching ? new LLMCache(logger) : void 0;\n  }\n  cleanRequestCache(requestId) {\n    if (!this.enableCaching) {\n      return;\n    }\n    this.logger({\n      category: \"llm_cache\",\n      message: \"cleaning up cache\",\n      level: 1,\n      auxiliary: {\n        requestId: {\n          value: requestId,\n          type: \"string\"\n        }\n      }\n    });\n    this.cache.deleteCacheForRequestId(requestId);\n  }\n  getClient(modelName, clientOptions) {\n    const provider = modelToProviderMap[modelName];\n    if (!provider) {\n      throw new Error(`Unsupported model: ${modelName}`);\n    }\n    switch (provider) {\n      case \"openai\":\n        return new OpenAIClient({\n          logger: this.logger,\n          enableCaching: this.enableCaching,\n          cache: this.cache,\n          modelName,\n          clientOptions\n        });\n      case \"anthropic\":\n        return new AnthropicClient({\n          logger: this.logger,\n          enableCaching: this.enableCaching,\n          cache: this.cache,\n          modelName,\n          clientOptions\n        });\n      default:\n        throw new Error(`Unsupported provider: ${provider}`);\n    }\n  }\n  static getModelProvider(modelName) {\n    const provider = modelToProviderMap[modelName];\n    return provider;\n  }\n};\n\n// types/model.ts\nvar import_zod4 = require(\"zod\");\nvar AvailableModelSchema = import_zod4.z.enum([\n  \"gpt-4o\",\n  \"gpt-4o-mini\",\n  \"gpt-4o-2024-11-20\",\n  \"gpt-4o-2024-08-06\",\n  \"gpt-4o-2024-05-13\",\n  \"claude-3-5-sonnet-latest\",\n  \"claude-3-5-sonnet-20241022\",\n  \"claude-3-5-sonnet-20240620\",\n  \"o1-mini\",\n  \"o1-preview\",\n  \"o3-mini\"\n]);\n\n// lib/index.ts\nimport_dotenv.default.config({ path: \".env\" });\nvar DEFAULT_MODEL_NAME = \"gpt-4o\";\nvar BROWSERBASE_REGION_DOMAIN2 = {\n  \"us-west-2\": \"wss://connect.usw2.browserbase.com\",\n  \"us-east-1\": \"wss://connect.use1.browserbase.com\",\n  \"eu-central-1\": \"wss://connect.euc1.browserbase.com\",\n  \"ap-southeast-1\": \"wss://connect.apse1.browserbase.com\"\n};\nfunction getBrowser(apiKey, projectId, env = \"LOCAL\", headless = false, logger, browserbaseSessionCreateParams, browserbaseSessionID, localBrowserLaunchOptions) {\n  return __async(this, null, function* () {\n    var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r;\n    if (env === \"BROWSERBASE\") {\n      if (!apiKey) {\n        logger({\n          category: \"init\",\n          message: \"BROWSERBASE_API_KEY is required to use BROWSERBASE env. Defaulting to LOCAL.\",\n          level: 0\n        });\n        env = \"LOCAL\";\n      }\n      if (!projectId) {\n        logger({\n          category: \"init\",\n          message: \"BROWSERBASE_PROJECT_ID is required for some Browserbase features that may not work without it.\",\n          level: 1\n        });\n      }\n    }\n    if (env === \"BROWSERBASE\") {\n      if (!apiKey) {\n        throw new Error(\"BROWSERBASE_API_KEY is required.\");\n      }\n      let debugUrl = void 0;\n      let sessionUrl = void 0;\n      let sessionId;\n      let connectUrl;\n      const browserbase = new import_sdk3.Browserbase({\n        apiKey\n      });\n      if (browserbaseSessionID) {\n        try {\n          const sessionStatus = yield browserbase.sessions.retrieve(browserbaseSessionID);\n          if (sessionStatus.status !== \"RUNNING\") {\n            throw new Error(\n              `Session ${browserbaseSessionID} is not running (status: ${sessionStatus.status})`\n            );\n          }\n          sessionId = browserbaseSessionID;\n          const browserbaseDomain = BROWSERBASE_REGION_DOMAIN2[sessionStatus.region] || \"wss://connect.browserbase.com\";\n          connectUrl = `${browserbaseDomain}?apiKey=${apiKey}&sessionId=${sessionId}`;\n          logger({\n            category: \"init\",\n            message: \"resuming existing browserbase session...\",\n            level: 1,\n            auxiliary: {\n              sessionId: {\n                value: sessionId,\n                type: \"string\"\n              }\n            }\n          });\n        } catch (error) {\n          logger({\n            category: \"init\",\n            message: \"failed to resume session\",\n            level: 1,\n            auxiliary: {\n              error: {\n                value: error.message,\n                type: \"string\"\n              },\n              trace: {\n                value: error.stack,\n                type: \"string\"\n              }\n            }\n          });\n          throw error;\n        }\n      } else {\n        logger({\n          category: \"init\",\n          message: \"creating new browserbase session...\",\n          level: 0\n        });\n        if (!projectId) {\n          throw new Error(\n            \"BROWSERBASE_PROJECT_ID is required for new Browserbase sessions.\"\n          );\n        }\n        const session = yield browserbase.sessions.create(__spreadValues({\n          projectId\n        }, browserbaseSessionCreateParams));\n        sessionId = session.id;\n        connectUrl = session.connectUrl;\n        logger({\n          category: \"init\",\n          message: \"created new browserbase session\",\n          level: 1,\n          auxiliary: {\n            sessionId: {\n              value: sessionId,\n              type: \"string\"\n            }\n          }\n        });\n      }\n      const browser = yield import_test2.chromium.connectOverCDP(connectUrl);\n      const { debuggerUrl } = yield browserbase.sessions.debug(sessionId);\n      debugUrl = debuggerUrl;\n      sessionUrl = `https://www.browserbase.com/sessions/${sessionId}`;\n      logger({\n        category: \"init\",\n        message: browserbaseSessionID ? \"browserbase session resumed\" : \"browserbase session started\",\n        level: 0,\n        auxiliary: {\n          sessionUrl: {\n            value: sessionUrl,\n            type: \"string\"\n          },\n          debugUrl: {\n            value: debugUrl,\n            type: \"string\"\n          },\n          sessionId: {\n            value: sessionId,\n            type: \"string\"\n          }\n        }\n      });\n      const context = browser.contexts()[0];\n      return { browser, context, debugUrl, sessionUrl, sessionId, env };\n    } else {\n      logger({\n        category: \"init\",\n        message: \"launching local browser\",\n        level: 0,\n        auxiliary: {\n          headless: {\n            value: headless.toString(),\n            type: \"boolean\"\n          }\n        }\n      });\n      if (localBrowserLaunchOptions) {\n        logger({\n          category: \"init\",\n          message: \"local browser launch options\",\n          level: 0,\n          auxiliary: {\n            localLaunchOptions: {\n              value: JSON.stringify(localBrowserLaunchOptions),\n              type: \"string\"\n            }\n          }\n        });\n      }\n      let userDataDir = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.userDataDir;\n      if (!userDataDir) {\n        const tmpDirPath = import_path.default.join(import_os.default.tmpdir(), \"stagehand\");\n        if (!import_fs.default.existsSync(tmpDirPath)) {\n          import_fs.default.mkdirSync(tmpDirPath, { recursive: true });\n        }\n        const tmpDir = import_fs.default.mkdtempSync(import_path.default.join(tmpDirPath, \"ctx_\"));\n        import_fs.default.mkdirSync(import_path.default.join(tmpDir, \"userdir/Default\"), { recursive: true });\n        const defaultPreferences = {\n          plugins: {\n            always_open_pdf_externally: true\n          }\n        };\n        import_fs.default.writeFileSync(\n          import_path.default.join(tmpDir, \"userdir/Default/Preferences\"),\n          JSON.stringify(defaultPreferences)\n        );\n        userDataDir = import_path.default.join(tmpDir, \"userdir\");\n      }\n      let downloadsPath = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.downloadsPath;\n      if (!downloadsPath) {\n        downloadsPath = import_path.default.join(process.cwd(), \"downloads\");\n        import_fs.default.mkdirSync(downloadsPath, { recursive: true });\n      }\n      const context = yield import_test2.chromium.launchPersistentContext(userDataDir, {\n        acceptDownloads: (_a = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.acceptDownloads) != null ? _a : true,\n        headless: (_b = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.headless) != null ? _b : headless,\n        viewport: {\n          width: (_d = (_c = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.viewport) == null ? void 0 : _c.width) != null ? _d : 1250,\n          height: (_f = (_e = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.viewport) == null ? void 0 : _e.height) != null ? _f : 800\n        },\n        locale: (_g = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.locale) != null ? _g : \"en-US\",\n        timezoneId: (_h = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.timezoneId) != null ? _h : \"America/New_York\",\n        deviceScaleFactor: (_i = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.deviceScaleFactor) != null ? _i : 1,\n        args: (_j = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.args) != null ? _j : [\n          \"--enable-webgl\",\n          \"--use-gl=swiftshader\",\n          \"--enable-accelerated-2d-canvas\",\n          \"--disable-blink-features=AutomationControlled\",\n          \"--disable-web-security\"\n        ],\n        bypassCSP: (_k = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.bypassCSP) != null ? _k : true,\n        proxy: localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.proxy,\n        geolocation: localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.geolocation,\n        hasTouch: (_l = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.hasTouch) != null ? _l : true,\n        ignoreHTTPSErrors: (_m = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.ignoreHTTPSErrors) != null ? _m : true,\n        permissions: localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.permissions,\n        recordHar: localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.recordHar,\n        recordVideo: localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.recordVideo,\n        tracesDir: localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.tracesDir,\n        extraHTTPHeaders: localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.extraHTTPHeaders,\n        chromiumSandbox: (_n = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.chromiumSandbox) != null ? _n : false,\n        devtools: (_o = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.devtools) != null ? _o : false,\n        env: localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.env,\n        executablePath: localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.executablePath,\n        handleSIGHUP: (_p = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.handleSIGHUP) != null ? _p : true,\n        handleSIGINT: (_q = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.handleSIGINT) != null ? _q : true,\n        handleSIGTERM: (_r = localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.handleSIGTERM) != null ? _r : true,\n        ignoreDefaultArgs: localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.ignoreDefaultArgs\n      });\n      if (localBrowserLaunchOptions == null ? void 0 : localBrowserLaunchOptions.cookies) {\n        context.addCookies(localBrowserLaunchOptions.cookies);\n      }\n      logger({\n        category: \"init\",\n        message: \"local browser started successfully.\"\n      });\n      yield applyStealthScripts(context);\n      return { context, contextPath: userDataDir, env: \"LOCAL\" };\n    }\n  });\n}\nfunction applyStealthScripts(context) {\n  return __async(this, null, function* () {\n    yield context.addInitScript(() => {\n      Object.defineProperty(navigator, \"webdriver\", {\n        get: () => void 0\n      });\n      Object.defineProperty(navigator, \"languages\", {\n        get: () => [\"en-US\", \"en\"]\n      });\n      Object.defineProperty(navigator, \"plugins\", {\n        get: () => [1, 2, 3, 4, 5]\n      });\n      delete window.__playwright;\n      delete window.__pw_manual;\n      delete window.__PW_inspect;\n      Object.defineProperty(navigator, \"headless\", {\n        get: () => false\n      });\n      const originalQuery = window.navigator.permissions.query;\n      window.navigator.permissions.query = (parameters) => parameters.name === \"notifications\" ? Promise.resolve({\n        state: Notification.permission\n      }) : originalQuery(parameters);\n    });\n  });\n}\nvar defaultLogger = (logLine) => __async(void 0, null, function* () {\n  console.log(logLineToString(logLine));\n});\nvar Stagehand = class {\n  constructor({\n    env,\n    apiKey,\n    projectId,\n    verbose,\n    debugDom,\n    llmProvider,\n    llmClient,\n    headless,\n    logger,\n    browserbaseSessionCreateParams,\n    domSettleTimeoutMs,\n    enableCaching,\n    browserbaseSessionID,\n    modelName,\n    modelClientOptions,\n    systemPrompt,\n    useAPI,\n    localBrowserLaunchOptions,\n    selfHeal = true\n  } = {\n    env: \"BROWSERBASE\"\n  }) {\n    this.pending_logs_to_send_to_browserbase = [];\n    this.is_processing_browserbase_logs = false;\n    this.externalLogger = logger || defaultLogger;\n    this.enableCaching = enableCaching != null ? enableCaching : process.env.ENABLE_CACHING && process.env.ENABLE_CACHING === \"true\";\n    this.llmProvider = llmProvider || new LLMProvider(this.logger, this.enableCaching);\n    this.intEnv = env;\n    this.apiKey = apiKey != null ? apiKey : process.env.BROWSERBASE_API_KEY;\n    this.projectId = projectId != null ? projectId : process.env.BROWSERBASE_PROJECT_ID;\n    this.verbose = verbose != null ? verbose : 0;\n    this.debugDom = debugDom != null ? debugDom : false;\n    if (llmClient) {\n      this.llmClient = llmClient;\n    } else {\n      try {\n        this.llmClient = this.llmProvider.getClient(\n          modelName != null ? modelName : DEFAULT_MODEL_NAME,\n          modelClientOptions\n        );\n      } catch (e) {\n        this.llmClient = void 0;\n      }\n    }\n    this.domSettleTimeoutMs = domSettleTimeoutMs != null ? domSettleTimeoutMs : 3e4;\n    this.headless = headless != null ? headless : false;\n    this.browserbaseSessionCreateParams = browserbaseSessionCreateParams;\n    this.browserbaseSessionID = browserbaseSessionID;\n    this.userProvidedInstructions = systemPrompt;\n    this.usingAPI = useAPI != null ? useAPI : false;\n    this.modelName = modelName != null ? modelName : DEFAULT_MODEL_NAME;\n    if (this.usingAPI && env === \"LOCAL\") {\n      throw new Error(\"API mode can only be used with BROWSERBASE environment\");\n    } else if (this.usingAPI && !process.env.STAGEHAND_API_URL) {\n      throw new Error(\n        \"STAGEHAND_API_URL is required when using the API. Please set it in your environment variables.\"\n      );\n    }\n    this.selfHeal = selfHeal;\n    this.localBrowserLaunchOptions = localBrowserLaunchOptions;\n  }\n  get logger() {\n    return (logLine) => {\n      this.log(logLine);\n    };\n  }\n  get page() {\n    if (!this.stagehandPage) {\n      throw new Error(\n        \"Stagehand not initialized. Make sure to await stagehand.init() first.\"\n      );\n    }\n    return this.stagehandPage.page;\n  }\n  get env() {\n    if (this.intEnv === \"BROWSERBASE\" && this.apiKey && this.projectId) {\n      return \"BROWSERBASE\";\n    }\n    return \"LOCAL\";\n  }\n  get context() {\n    if (!this.stagehandContext) {\n      throw new Error(\n        \"Stagehand not initialized. Make sure to await stagehand.init() first.\"\n      );\n    }\n    return this.stagehandContext.context;\n  }\n  init(initOptions) {\n    return __async(this, null, function* () {\n      if (initOptions) {\n        console.warn(\n          \"Passing parameters to init() is deprecated and will be removed in the next major version. Use constructor options instead.\"\n        );\n      }\n      if (this.usingAPI) {\n        this.apiClient = new StagehandAPI({\n          apiKey: this.apiKey,\n          projectId: this.projectId,\n          logger: this.logger\n        });\n        const { sessionId: sessionId2 } = yield this.apiClient.init({\n          modelName: this.modelName,\n          modelApiKey: LLMProvider.getModelProvider(this.modelName) === \"openai\" ? process.env.OPENAI_API_KEY : process.env.ANTHROPIC_API_KEY,\n          domSettleTimeoutMs: this.domSettleTimeoutMs,\n          verbose: this.verbose,\n          debugDom: this.debugDom,\n          systemPrompt: this.userProvidedInstructions,\n          browserbaseSessionCreateParams: this.browserbaseSessionCreateParams\n        });\n        this.browserbaseSessionID = sessionId2;\n      }\n      const { context, debugUrl, sessionUrl, contextPath, sessionId, env } = yield getBrowser(\n        this.apiKey,\n        this.projectId,\n        this.env,\n        this.headless,\n        this.logger,\n        this.browserbaseSessionCreateParams,\n        this.browserbaseSessionID,\n        this.localBrowserLaunchOptions\n      ).catch((e) => {\n        console.error(\"Error in init:\", e);\n        const br = {\n          context: void 0,\n          debugUrl: void 0,\n          sessionUrl: void 0,\n          sessionId: void 0,\n          env: this.env\n        };\n        return br;\n      });\n      this.intEnv = env;\n      this.contextPath = contextPath;\n      this.stagehandContext = yield StagehandContext.init(context, this);\n      const defaultPage = this.context.pages()[0];\n      this.stagehandPage = yield new StagehandPage(\n        defaultPage,\n        this,\n        this.stagehandContext,\n        this.llmClient,\n        this.userProvidedInstructions,\n        this.apiClient\n      ).init();\n      if (this.headless) {\n        yield this.page.setViewportSize({ width: 1280, height: 720 });\n      }\n      yield this.context.addInitScript({\n        content: scriptContent\n      });\n      this.browserbaseSessionID = sessionId;\n      return { debugUrl, sessionUrl, sessionId };\n    });\n  }\n  /** @deprecated initFromPage is deprecated and will be removed in the next major version. */\n  initFromPage(_0) {\n    return __async(this, arguments, function* ({\n      page\n    }) {\n      console.warn(\n        \"initFromPage is deprecated and will be removed in the next major version. To instantiate from a page, use `browserbaseSessionID` in the constructor.\"\n      );\n      this.stagehandPage = yield new StagehandPage(\n        page,\n        this,\n        this.stagehandContext,\n        this.llmClient\n      ).init();\n      this.stagehandContext = yield StagehandContext.init(page.context(), this);\n      const originalGoto = this.page.goto.bind(this.page);\n      this.page.goto = (url, options) => __async(this, null, function* () {\n        const result = yield originalGoto(url, options);\n        if (this.debugDom) {\n          yield this.page.evaluate(() => window.showChunks = this.debugDom);\n        }\n        yield this.page.waitForLoadState(\"domcontentloaded\");\n        yield this.stagehandPage._waitForSettledDom();\n        return result;\n      });\n      if (this.headless) {\n        yield this.page.setViewportSize({ width: 1280, height: 720 });\n      }\n      yield this.context.addInitScript({\n        content: scriptContent\n      });\n      return { context: this.context };\n    });\n  }\n  log(logObj) {\n    var _a;\n    logObj.level = (_a = logObj.level) != null ? _a : 1;\n    if (this.externalLogger) {\n      this.externalLogger(logObj);\n    }\n    this.pending_logs_to_send_to_browserbase.push(__spreadProps(__spreadValues({}, logObj), {\n      id: (0, import_crypto2.randomUUID)()\n    }));\n    this._run_browserbase_log_processing_cycle();\n  }\n  _run_browserbase_log_processing_cycle() {\n    return __async(this, null, function* () {\n      if (this.is_processing_browserbase_logs) {\n        return;\n      }\n      this.is_processing_browserbase_logs = true;\n      const pending_logs = [...this.pending_logs_to_send_to_browserbase];\n      for (const logObj of pending_logs) {\n        yield this._log_to_browserbase(logObj);\n      }\n      this.is_processing_browserbase_logs = false;\n    });\n  }\n  _log_to_browserbase(logObj) {\n    return __async(this, null, function* () {\n      var _a;\n      logObj.level = (_a = logObj.level) != null ? _a : 1;\n      if (!this.stagehandPage) {\n        return;\n      }\n      if (this.verbose >= logObj.level) {\n        yield this.page.evaluate((logObj2) => {\n          const logMessage = logLineToString(logObj2);\n          if (logObj2.message.toLowerCase().includes(\"trace\") || logObj2.message.toLowerCase().includes(\"error:\")) {\n            console.error(logMessage);\n          } else {\n            console.log(logMessage);\n          }\n        }, logObj).then(() => {\n          this.pending_logs_to_send_to_browserbase = this.pending_logs_to_send_to_browserbase.filter(\n            (log) => log.id !== logObj.id\n          );\n        }).catch(() => {\n        });\n      }\n    });\n  }\n  /** @deprecated Use stagehand.page.act() instead. This will be removed in the next major release. */\n  act(options) {\n    return __async(this, null, function* () {\n      return yield this.stagehandPage.act(options);\n    });\n  }\n  /** @deprecated Use stagehand.page.extract() instead. This will be removed in the next major release. */\n  extract(options) {\n    return __async(this, null, function* () {\n      return yield this.stagehandPage.extract(options);\n    });\n  }\n  /** @deprecated Use stagehand.page.observe() instead. This will be removed in the next major release. */\n  observe(options) {\n    return __async(this, null, function* () {\n      return yield this.stagehandPage.observe(options);\n    });\n  }\n  close() {\n    return __async(this, null, function* () {\n      if (this.apiClient) {\n        yield this.apiClient.end();\n        return;\n      } else {\n        yield this.context.close();\n      }\n      if (this.contextPath) {\n        try {\n          import_fs.default.rmSync(this.contextPath, { recursive: true, force: true });\n        } catch (e) {\n          console.error(\"Error deleting context directory:\", e);\n        }\n      }\n    });\n  }\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n  AnnotatedScreenshotText,\n  AvailableModelSchema,\n  LLMClient,\n  PlaywrightCommandException,\n  PlaywrightCommandMethodNotSupportedException,\n  Stagehand,\n  defaultExtractSchema\n});\n"]}