@browserbasehq/orca 3.5.0-vertex-test → 3.5.1-preview.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -3
- package/dist/cjs/lib/utils.d.ts +2 -0
- package/dist/cjs/lib/utils.js +20 -0
- package/dist/cjs/lib/utils.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AgentProvider.js +1 -0
- package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +1 -0
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/utils/captureAriaTreeProbe.d.ts +35 -0
- package/dist/cjs/lib/v3/agent/utils/captureAriaTreeProbe.js +38 -0
- package/dist/cjs/lib/v3/agent/utils/captureAriaTreeProbe.js.map +1 -0
- package/dist/cjs/lib/v3/agent/utils/postStepProbeEvidence.d.ts +19 -0
- package/dist/cjs/lib/v3/agent/utils/postStepProbeEvidence.js +54 -0
- package/dist/cjs/lib/v3/agent/utils/postStepProbeEvidence.js.map +1 -0
- package/dist/cjs/lib/v3/agent/utils/toolOutputEvidence.d.ts +2 -0
- package/dist/cjs/lib/v3/agent/utils/toolOutputEvidence.js +62 -0
- package/dist/cjs/lib/v3/agent/utils/toolOutputEvidence.js.map +1 -0
- package/dist/cjs/lib/v3/agent/utils/wrapEvidenceCallback.d.ts +3 -0
- package/dist/cjs/lib/v3/agent/utils/wrapEvidenceCallback.js +25 -0
- package/dist/cjs/lib/v3/agent/utils/wrapEvidenceCallback.js.map +1 -0
- package/dist/cjs/lib/v3/api.d.ts +1 -0
- package/dist/cjs/lib/v3/api.js +37 -16
- package/dist/cjs/lib/v3/api.js.map +1 -1
- package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.d.ts +24 -24
- package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.js +24 -24
- package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.js.map +1 -1
- package/dist/cjs/lib/v3/dom/build/selectorRuntime.generated.d.ts +24 -0
- package/dist/cjs/lib/v3/dom/build/selectorRuntime.generated.js +31 -0
- package/dist/cjs/lib/v3/dom/build/selectorRuntime.generated.js.map +1 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/xpathResolver.js +79 -10
- package/dist/cjs/lib/v3/dom/locatorScripts/xpathResolver.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +1 -0
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +83 -7
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.d.ts +11 -0
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +119 -5
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/index.d.ts +13 -1
- package/dist/cjs/lib/v3/index.js +19 -1
- package/dist/cjs/lib/v3/index.js.map +1 -1
- package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +3 -0
- package/dist/cjs/lib/v3/llm/LLMProvider.js +44 -3
- package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/agent.d.ts +8 -2
- package/dist/cjs/lib/v3/types/public/agent.js +1 -0
- package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/agentEvidenceEvents.d.ts +85 -0
- package/dist/cjs/lib/v3/types/public/agentEvidenceEvents.js +15 -0
- package/dist/cjs/lib/v3/types/public/agentEvidenceEvents.js.map +1 -0
- package/dist/cjs/lib/v3/types/public/api.d.ts +925 -182
- package/dist/cjs/lib/v3/types/public/api.js +138 -20
- package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/clipboard.d.ts +15 -0
- package/dist/cjs/lib/v3/types/public/clipboard.js +3 -0
- package/dist/cjs/lib/v3/types/public/clipboard.js.map +1 -0
- package/dist/cjs/lib/v3/types/public/index.d.ts +2 -0
- package/dist/cjs/lib/v3/types/public/index.js +2 -0
- package/dist/cjs/lib/v3/types/public/index.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/model.d.ts +30 -6
- package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/page.d.ts +29 -0
- package/dist/cjs/lib/v3/types/public/page.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/sdkErrors.d.ts +3 -0
- package/dist/cjs/lib/v3/types/public/sdkErrors.js +8 -2
- package/dist/cjs/lib/v3/types/public/sdkErrors.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/clipboard.d.ts +24 -0
- package/dist/cjs/lib/v3/understudy/clipboard.js +166 -0
- package/dist/cjs/lib/v3/understudy/clipboard.js.map +1 -0
- package/dist/cjs/lib/v3/understudy/context.d.ts +3 -0
- package/dist/cjs/lib/v3/understudy/context.js +15 -0
- package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/page.d.ts +23 -1
- package/dist/cjs/lib/v3/understudy/page.js +283 -0
- package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
- package/dist/cjs/lib/v3/v3.js +15 -6
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/cjs/lib/v3/verifier/evidenceNormalization.d.ts +7 -0
- package/dist/cjs/lib/v3/verifier/evidenceNormalization.js +100 -0
- package/dist/cjs/lib/v3/verifier/evidenceNormalization.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/index.d.ts +6 -0
- package/dist/cjs/lib/v3/verifier/index.js +16 -0
- package/dist/cjs/lib/v3/verifier/index.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/trajectory.d.ts +50 -0
- package/dist/cjs/lib/v3/verifier/trajectory.js +316 -0
- package/dist/cjs/lib/v3/verifier/trajectory.js.map +1 -0
- package/dist/cjs/lib/v3/verifier/types.d.ts +281 -0
- package/dist/cjs/lib/v3/verifier/types.js +10 -0
- package/dist/cjs/lib/v3/verifier/types.js.map +1 -0
- package/dist/cjs/lib/v3Evaluator.d.ts +9 -4
- package/dist/cjs/lib/v3Evaluator.js +148 -0
- package/dist/cjs/lib/v3Evaluator.js.map +1 -1
- package/dist/cjs/lib/v3LegacyEvaluator.js +5 -1
- package/dist/cjs/lib/v3LegacyEvaluator.js.map +1 -1
- package/dist/cjs/lib/version.d.ts +1 -1
- package/dist/cjs/lib/version.js +1 -1
- package/dist/cjs/lib/version.js.map +1 -1
- package/dist/esm/lib/utils.d.ts +2 -0
- package/dist/esm/lib/utils.js +18 -0
- package/dist/esm/lib/utils.js.map +1 -1
- package/dist/esm/lib/v3/agent/AgentProvider.js +1 -0
- package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +1 -0
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/utils/captureAriaTreeProbe.d.ts +35 -0
- package/dist/esm/lib/v3/agent/utils/captureAriaTreeProbe.js +35 -0
- package/dist/esm/lib/v3/agent/utils/captureAriaTreeProbe.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/postStepProbeEvidence.d.ts +19 -0
- package/dist/esm/lib/v3/agent/utils/postStepProbeEvidence.js +50 -0
- package/dist/esm/lib/v3/agent/utils/postStepProbeEvidence.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/toolOutputEvidence.d.ts +2 -0
- package/dist/esm/lib/v3/agent/utils/toolOutputEvidence.js +59 -0
- package/dist/esm/lib/v3/agent/utils/toolOutputEvidence.js.map +1 -0
- package/dist/esm/lib/v3/agent/utils/wrapEvidenceCallback.d.ts +3 -0
- package/dist/esm/lib/v3/agent/utils/wrapEvidenceCallback.js +22 -0
- package/dist/esm/lib/v3/agent/utils/wrapEvidenceCallback.js.map +1 -0
- package/dist/esm/lib/v3/api.d.ts +1 -0
- package/dist/esm/lib/v3/api.js +38 -17
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/dom/build/locatorScripts.generated.d.ts +24 -24
- package/dist/esm/lib/v3/dom/build/locatorScripts.generated.js +24 -24
- package/dist/esm/lib/v3/dom/build/locatorScripts.generated.js.map +1 -1
- package/dist/esm/lib/v3/dom/build/selectorRuntime.generated.d.ts +24 -0
- package/dist/esm/lib/v3/dom/build/selectorRuntime.generated.js +28 -0
- package/dist/esm/lib/v3/dom/build/selectorRuntime.generated.js.map +1 -0
- package/dist/esm/lib/v3/dom/locatorScripts/xpathResolver.js +79 -10
- package/dist/esm/lib/v3/dom/locatorScripts/xpathResolver.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +1 -0
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +83 -7
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.d.ts +11 -0
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +119 -5
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/index.d.ts +13 -1
- package/dist/esm/lib/v3/index.js +10 -0
- package/dist/esm/lib/v3/index.js.map +1 -1
- package/dist/esm/lib/v3/llm/LLMProvider.d.ts +3 -0
- package/dist/esm/lib/v3/llm/LLMProvider.js +43 -3
- package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/esm/lib/v3/types/public/agent.d.ts +8 -2
- package/dist/esm/lib/v3/types/public/agent.js +1 -0
- package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
- package/dist/esm/lib/v3/types/public/agentEvidenceEvents.d.ts +85 -0
- package/dist/esm/lib/v3/types/public/agentEvidenceEvents.js +14 -0
- package/dist/esm/lib/v3/types/public/agentEvidenceEvents.js.map +1 -0
- package/dist/esm/lib/v3/types/public/api.d.ts +925 -182
- package/dist/esm/lib/v3/types/public/api.js +136 -18
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/clipboard.d.ts +15 -0
- package/dist/esm/lib/v3/types/public/clipboard.js +2 -0
- package/dist/esm/lib/v3/types/public/clipboard.js.map +1 -0
- package/dist/esm/lib/v3/types/public/index.d.ts +2 -0
- package/dist/esm/lib/v3/types/public/index.js +2 -0
- package/dist/esm/lib/v3/types/public/index.js.map +1 -1
- package/dist/esm/lib/v3/types/public/model.d.ts +30 -6
- package/dist/esm/lib/v3/types/public/model.js.map +1 -1
- package/dist/esm/lib/v3/types/public/page.d.ts +29 -0
- package/dist/esm/lib/v3/types/public/page.js.map +1 -1
- package/dist/esm/lib/v3/types/public/sdkErrors.d.ts +3 -0
- package/dist/esm/lib/v3/types/public/sdkErrors.js +5 -0
- package/dist/esm/lib/v3/types/public/sdkErrors.js.map +1 -1
- package/dist/esm/lib/v3/understudy/clipboard.d.ts +24 -0
- package/dist/esm/lib/v3/understudy/clipboard.js +163 -0
- package/dist/esm/lib/v3/understudy/clipboard.js.map +1 -0
- package/dist/esm/lib/v3/understudy/context.d.ts +3 -0
- package/dist/esm/lib/v3/understudy/context.js +15 -0
- package/dist/esm/lib/v3/understudy/context.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.d.ts +23 -1
- package/dist/esm/lib/v3/understudy/page.js +284 -1
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/v3.js +16 -7
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/lib/v3/verifier/evidenceNormalization.d.ts +7 -0
- package/dist/esm/lib/v3/verifier/evidenceNormalization.js +93 -0
- package/dist/esm/lib/v3/verifier/evidenceNormalization.js.map +1 -0
- package/dist/esm/lib/v3/verifier/index.d.ts +6 -0
- package/dist/esm/lib/v3/verifier/index.js +3 -0
- package/dist/esm/lib/v3/verifier/index.js.map +1 -0
- package/dist/esm/lib/v3/verifier/trajectory.d.ts +50 -0
- package/dist/esm/lib/v3/verifier/trajectory.js +273 -0
- package/dist/esm/lib/v3/verifier/trajectory.js.map +1 -0
- package/dist/esm/lib/v3/verifier/types.d.ts +281 -0
- package/dist/esm/lib/v3/verifier/types.js +9 -0
- package/dist/esm/lib/v3/verifier/types.js.map +1 -0
- package/dist/esm/lib/v3Evaluator.d.ts +9 -4
- package/dist/esm/lib/v3Evaluator.js +148 -0
- package/dist/esm/lib/v3Evaluator.js.map +1 -1
- package/dist/esm/lib/v3LegacyEvaluator.js +5 -1
- package/dist/esm/lib/v3LegacyEvaluator.js.map +1 -1
- package/dist/esm/lib/version.d.ts +1 -1
- package/dist/esm/lib/version.js +1 -1
- package/dist/esm/lib/version.js.map +1 -1
- package/package.json +16 -10
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.selectorRuntimeGlobalRefs = exports.selectorRuntimeSources = exports.selectorRuntimeBootstrap = void 0;
|
|
4
|
+
/*
|
|
5
|
+
* AUTO-GENERATED FILE. DO NOT EDIT.
|
|
6
|
+
* Run `pnpm run build-dom-scripts` to regenerate.
|
|
7
|
+
*/
|
|
8
|
+
exports.selectorRuntimeBootstrap = "if (!globalThis.__stagehandSelectorRuntime) { var __stagehandSelectorRuntimeFactory=(()=>{var P=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var $=(t,e)=>{for(var n in e)P(t,n,{get:e[n],enumerable:!0})},C=(t,e,n,r)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let s of N(e))!D.call(t,s)&&s!==n&&P(t,s,{get:()=>e[s],enumerable:!(r=A(e,s))||r.enumerable});return t};var k=t=>C(P({},\"__esModule\",{value:!0}),t);var j={};$(j,{countCssWithRoots:()=>B,countTextWithRoots:()=>Y,countXPathNative:()=>U,countXPathWithRoots:()=>K,hasOpenShadowRoots:()=>V,queryCssWithRoots:()=>X,queryTextWithRoots:()=>M,queryXPathNative:()=>Z,queryXPathWithRoots:()=>z});function R(t){let e=String(t||\"\").trim().replace(/^xpath=/i,\"\");if(!e)return[];let n=[],r=0;for(;r<e.length;){let s=\"child\";e.startsWith(\"//\",r)?(s=\"desc\",r+=2):e[r]===\"/\"&&(s=\"child\",r+=1);let o=r,a=0,i=null;for(;r<e.length;){let l=e[r];if(i)l===i&&(i=null);else if(l===\"'\"||l==='\"')i=l;else if(l===\"[\")a++;else if(l===\"]\")a--;else if(l===\"/\"&&a===0)break;r+=1}let u=e.slice(o,r).trim();if(!u)continue;let{tag:c,predicates:f}=W(u);n.push({axis:s,tag:c,predicates:f})}return n}function q(t){let e=[],n=0;for(;n<t.length;){if(t[n]!==\"[\"){n++;continue}n++;let r=n,s=null;for(;n<t.length;){let o=t[n];if(s)o===s&&(s=null);else if(o===\"'\"||o==='\"')s=o;else if(o===\"]\")break;n++}e.push(t.slice(r,n).trim()),n++}return e}function W(t){let e=t.indexOf(\"[\");if(e===-1)return{tag:t===\"\"?\"*\":t.toLowerCase(),predicates:[]};let n=t.slice(0,e).trim(),r=n===\"\"?\"*\":n.toLowerCase(),s=t.slice(e),o=[];for(let a of q(s)){let i=d(a);i&&o.push(i)}return{tag:r,predicates:o}}function d(t){let e=t.trim();if(!e)return null;let n=y(e,\"or\");if(n.length>1){let o=n.map(a=>d(a)).filter(Boolean);return o.length!==n.length?null:{type:\"or\",predicates:o}}let r=y(e,\"and\");if(r.length>1){let o=r.map(a=>d(a)).filter(Boolean);return o.length!==r.length?null:{type:\"and\",predicates:o}}let s=O(e,\"not\");if(s!=null){let o=d(s);return o?{type:\"not\",predicate:o}:null}return _(e)}function _(t){let e=/^(?:'([^']*)'|\"([^\"]*)\")$/,n=\"[a-zA-Z_][\\\\w.-]*\",r=`(?:'([^']*)'|\"([^\"]*)\")`;if(/^\\d+$/.test(t))return{type:\"index\",index:Math.max(1,Number(t))};let s=t.match(new RegExp(`^normalize-space\\\\(\\\\s*@(${n})\\\\s*\\\\)\\\\s*=\\\\s*${r}$`));if(s)return{type:\"attrEquals\",name:s[1],value:s[2]??s[3]??\"\",normalize:!0};let o=t.match(new RegExp(`^normalize-space\\\\(\\\\s*(?:text\\\\(\\\\)|\\\\.)\\\\s*\\\\)\\\\s*=\\\\s*${r}$`));if(o)return{type:\"textEquals\",value:o[1]??o[2]??\"\",normalize:!0};let a=t.match(new RegExp(`^@(${n})\\\\s*=\\\\s*${r}$`));if(a)return{type:\"attrEquals\",name:a[1],value:a[2]??a[3]??\"\"};let i=t.match(new RegExp(`^@(${n})$`));if(i)return{type:\"attrExists\",name:i[1]};let u=t.match(new RegExp(`^contains\\\\(\\\\s*@(${n})\\\\s*,\\\\s*${r}\\\\s*\\\\)$`));if(u)return{type:\"attrContains\",name:u[1],value:u[2]??u[3]??\"\"};let c=t.match(new RegExp(`^starts-with\\\\(\\\\s*@(${n})\\\\s*,\\\\s*${r}\\\\s*\\\\)$`));if(c)return{type:\"attrStartsWith\",name:c[1],value:c[2]??c[3]??\"\"};let f=t.match(new RegExp(`^(?:text\\\\(\\\\)|\\\\.)\\\\s*=\\\\s*${r}$`));if(f)return{type:\"textEquals\",value:f[1]??f[2]??\"\"};let l=t.match(new RegExp(`^contains\\\\(\\\\s*(?:text\\\\(\\\\)|\\\\.)\\\\s*,\\\\s*${r}\\\\s*\\\\)$`));return l?{type:\"textContains\",value:l[1]??l[2]??\"\"}:(e.test(t),null)}function y(t,e){let n=[],r=0,s=0,o=null,a=0;for(;a<t.length;){let i=t[a];if(o){i===o&&(o=null),a+=1;continue}if(i===\"'\"||i==='\"'){o=i,a+=1;continue}if(i===\"(\"){s+=1,a+=1;continue}if(i===\")\"){s=Math.max(0,s-1),a+=1;continue}if(s===0&&L(t,a,e)){n.push(t.slice(r,a).trim()),a+=e.length,r=a;continue}a+=1}return n.push(t.slice(r).trim()),n.filter(i=>i.length>0)}function L(t,e,n){if(!t.startsWith(n,e))return!1;let r=e>0?t[e-1]:\" \";if(r===\"@\")return!1;let s=e+n.length<t.length?t[e+n.length]:\" \";return S(r)&&S(s)}function S(t){return!/[a-zA-Z0-9_.-]/.test(t)}function O(t,e){let n=`${e}(`;if(!t.startsWith(n)||!t.endsWith(\")\"))return null;let r=t.slice(n.length,-1);return I(r)?r:null}function I(t){let e=0,n=null;for(let r=0;r<t.length;r+=1){let s=t[r];if(n){s===n&&(n=null);continue}if(s===\"'\"||s==='\"'){n=s;continue}if(s===\"(\"?e+=1:s===\")\"&&(e-=1),e<0)return!1}return e===0}var F=t=>t.replace(/\\s+/g,\" \").trim();function b(t){return String(t.textContent??\"\")}function m(t,e){return e?F(t):t}function x(t,e){switch(e.type){case\"and\":return e.predicates.every(n=>x(t,n));case\"or\":return e.predicates.some(n=>x(t,n));case\"not\":return!x(t,e.predicate);case\"attrExists\":return t.getAttribute(e.name)!==null;case\"attrEquals\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize)===m(e.value,e.normalize)}case\"attrContains\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize).includes(m(e.value,e.normalize))}case\"attrStartsWith\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize).startsWith(m(e.value,e.normalize))}case\"textEquals\":return m(b(t),e.normalize)===m(e.value,e.normalize);case\"textContains\":return m(b(t),e.normalize).includes(m(e.value,e.normalize));case\"index\":return!0;default:return!0}}function v(t,e){let n=t;for(let r of e){if(!n.length)return[];if(r.type===\"index\"){let s=r.index-1;n=s>=0&&s<n.length?[n[s]]:[];continue}n=n.filter(s=>x(s,r))}return n}function w(t){let e=new Map;for(let n=0;n<t.length;n+=2){let r=t[n],s=t[n+1];r instanceof Element&&s instanceof ShadowRoot&&e.set(r,s)}return e}function E(t,e){if(!t)return[];if(t instanceof Document)return t.documentElement?[t.documentElement]:[];if(t instanceof ShadowRoot||t instanceof DocumentFragment)return Array.from(t.children||[]);if(!(t instanceof Element))return[];let n=Array.from(t.children||[]);t.shadowRoot&&n.push(...Array.from(t.shadowRoot.children||[]));let r=e.get(t);return r&&n.push(...Array.from(r.children||[])),n}function H(t,e){let n=[],r=new Set,s=[...E(t,e)].reverse();for(;s.length;){let o=s.pop();if(!(o instanceof Element)||r.has(o))continue;r.add(o),n.push(o);let a=E(o,e);for(let i=a.length-1;i>=0;i-=1)s.push(a[i])}return n}function X(t,e,...n){let r=w(n),s=[],o=new Set,a=[...E(this,r)].reverse();for(;a.length&&s.length<e;){let i=a.pop();if(!(i instanceof Element)||o.has(i))continue;o.add(i);try{if(i.matches(t)&&(s.push(i),s.length>=e))break}catch{return[]}let u=E(i,r);for(let c=u.length-1;c>=0;c-=1)a.push(u[c])}return s}function B(t,...e){return X.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function M(t,e,...n){let r=w(n),s=new Set([\"SCRIPT\",\"STYLE\",\"TEMPLATE\",\"NOSCRIPT\",\"HEAD\",\"TITLE\",\"LINK\",\"META\",\"HTML\",\"BODY\"]),o=String(t||\"\").toLowerCase();if(!o)return[];let a=l=>{let g=l.tagName?l.tagName.toUpperCase():\"\";if(s.has(g))return\"\";try{let p=l.innerText;if(typeof p==\"string\"&&p.trim())return p.trim()}catch{}let h=l.textContent;return typeof h==\"string\"?h.trim():\"\"},i=[],u=new Set,c=[...E(this,r)].reverse();for(;c.length;){let l=c.pop();if(!(l instanceof Element)||u.has(l))continue;u.add(l);let g=a(l);g&&g.toLowerCase().includes(o)&&i.push(l);let h=E(l,r);for(let p=h.length-1;p>=0;p-=1)c.push(h[p])}let f=[];for(let l of i){let g=!1;for(let h of i)if(l!==h)try{if(l.contains(h)){g=!0;break}}catch{}if(!g&&(f.push(l),f.length>=e))break}return f}function Y(t,...e){return M.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function T(t){let e=String(t||\"\").trim();return e?e.replace(/^xpath=/i,\"\").trim():\"\"}function G(t,e){return e.tag===\"*\"?!0:t.localName===e.tag}function z(t,e,...n){let r=w(n),s=R(t);if(!s.length)return[];let o=[this];for(let a of s){let i=[],u=new Set;for(let c of o){let l=(a.axis===\"child\"?E(c,r):H(c,r)).filter(h=>G(h,a)),g=v(l,a.predicates);for(let h of g)if(!u.has(h)&&(u.add(h),i.push(h),i.length>=e&&a===s[s.length-1]))break}if(!i.length)return[];o=i}return o.slice(0,e)}function K(t,...e){return z.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function Z(t,e){let n=T(t);if(!n||!Number.isFinite(e)||e<=0)return[];try{let r=this.evaluate(n,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),s=[],o=Math.min(r.snapshotLength,Math.floor(e));for(let a=0;a<o;a+=1){let i=r.snapshotItem(a);i instanceof Element&&s.push(i)}return s}catch{return[]}}function U(t){let e=T(t);if(!e)return 0;try{let n=this.evaluate(e,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),r=0;for(let s=0;s<n.snapshotLength;s+=1)n.snapshotItem(s)instanceof Element&&(r+=1);return r}catch{return 0}}function V(){try{let t=this.createTreeWalker(this,NodeFilter.SHOW_ELEMENT);for(;t.nextNode();){let e=t.currentNode;if(e instanceof Element&&e.shadowRoot)return!0}}catch{return!1}return!1}return k(j);})();\n globalThis.__stagehandSelectorRuntime = __stagehandSelectorRuntimeFactory;\n}";
|
|
9
|
+
exports.selectorRuntimeSources = {
|
|
10
|
+
"countCssWithRoots": "function O(t,...e){return C.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}",
|
|
11
|
+
"countTextWithRoots": "function I(t,...e){return k.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}",
|
|
12
|
+
"countXPathNative": "function B(t){let e=v(t);if(!e)return 0;try{let n=this.evaluate(e,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),r=0;for(let s=0;s<n.snapshotLength;s+=1)n.snapshotItem(s)instanceof Element&&(r+=1);return r}catch{return 0}}",
|
|
13
|
+
"countXPathWithRoots": "function F(t,...e){return W.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}",
|
|
14
|
+
"hasOpenShadowRoots": "function Y(){try{let t=this.createTreeWalker(this,NodeFilter.SHOW_ELEMENT);for(;t.nextNode();){let e=t.currentNode;if(e instanceof Element&&e.shadowRoot)return!0}}catch{return!1}return!1}",
|
|
15
|
+
"queryCssWithRoots": "function C(t,e,...n){let r=P(n),s=[],o=new Set,a=[...E(this,r)].reverse();for(;a.length&&s.length<e;){let i=a.pop();if(!(i instanceof Element)||o.has(i))continue;o.add(i);try{if(i.matches(t)&&(s.push(i),s.length>=e))break}catch{return[]}let u=E(i,r);for(let c=u.length-1;c>=0;c-=1)a.push(u[c])}return s}",
|
|
16
|
+
"queryTextWithRoots": "function k(t,e,...n){let r=P(n),s=new Set([\"SCRIPT\",\"STYLE\",\"TEMPLATE\",\"NOSCRIPT\",\"HEAD\",\"TITLE\",\"LINK\",\"META\",\"HTML\",\"BODY\"]),o=String(t||\"\").toLowerCase();if(!o)return[];let a=l=>{let g=l.tagName?l.tagName.toUpperCase():\"\";if(s.has(g))return\"\";try{let p=l.innerText;if(typeof p==\"string\"&&p.trim())return p.trim()}catch{}let h=l.textContent;return typeof h==\"string\"?h.trim():\"\"},i=[],u=new Set,c=[...E(this,r)].reverse();for(;c.length;){let l=c.pop();if(!(l instanceof Element)||u.has(l))continue;u.add(l);let g=a(l);g&&g.toLowerCase().includes(o)&&i.push(l);let h=E(l,r);for(let p=h.length-1;p>=0;p-=1)c.push(h[p])}let f=[];for(let l of i){let g=!1;for(let h of i)if(l!==h)try{if(l.contains(h)){g=!0;break}}catch{}if(!g&&(f.push(l),f.length>=e))break}return f}",
|
|
17
|
+
"queryXPathNative": "function H(t,e){let n=v(t);if(!n||!Number.isFinite(e)||e<=0)return[];try{let r=this.evaluate(n,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),s=[],o=Math.min(r.snapshotLength,Math.floor(e));for(let a=0;a<o;a+=1){let i=r.snapshotItem(a);i instanceof Element&&s.push(i)}return s}catch{return[]}}",
|
|
18
|
+
"queryXPathWithRoots": "function W(t,e,...n){let r=P(n),s=b(t);if(!s.length)return[];let o=[this];for(let a of s){let i=[],u=new Set;for(let c of o){let l=(a.axis===\"child\"?E(c,r):$(c,r)).filter(h=>q(h,a)),g=R(l,a.predicates);for(let h of g)if(!u.has(h)&&(u.add(h),i.push(h),i.length>=e&&a===s[s.length-1]))break}if(!i.length)return[];o=i}return o.slice(0,e)}"
|
|
19
|
+
};
|
|
20
|
+
exports.selectorRuntimeGlobalRefs = {
|
|
21
|
+
"countCssWithRoots": "globalThis.__stagehandSelectorRuntime.countCssWithRoots",
|
|
22
|
+
"countTextWithRoots": "globalThis.__stagehandSelectorRuntime.countTextWithRoots",
|
|
23
|
+
"countXPathNative": "globalThis.__stagehandSelectorRuntime.countXPathNative",
|
|
24
|
+
"countXPathWithRoots": "globalThis.__stagehandSelectorRuntime.countXPathWithRoots",
|
|
25
|
+
"hasOpenShadowRoots": "globalThis.__stagehandSelectorRuntime.hasOpenShadowRoots",
|
|
26
|
+
"queryCssWithRoots": "globalThis.__stagehandSelectorRuntime.queryCssWithRoots",
|
|
27
|
+
"queryTextWithRoots": "globalThis.__stagehandSelectorRuntime.queryTextWithRoots",
|
|
28
|
+
"queryXPathNative": "globalThis.__stagehandSelectorRuntime.queryXPathNative",
|
|
29
|
+
"queryXPathWithRoots": "globalThis.__stagehandSelectorRuntime.queryXPathWithRoots"
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=selectorRuntime.generated.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectorRuntime.generated.js","sourceRoot":"","sources":["../../../../../../lib/v3/dom/build/selectorRuntime.generated.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,wBAAwB,GAAG,0oRAA0oR,CAAC;AACtqR,QAAA,sBAAsB,GAAG;IACpC,mBAAmB,EAAE,+EAA+E;IACpG,oBAAoB,EAAE,+EAA+E;IACrG,kBAAkB,EAAE,wOAAwO;IAC5P,qBAAqB,EAAE,+EAA+E;IACtG,oBAAoB,EAAE,6LAA6L;IACnN,mBAAmB,EAAE,iTAAiT;IACtU,oBAAoB,EAAE,8xBAA8xB;IACpzB,kBAAkB,EAAE,+SAA+S;IACnU,qBAAqB,EAAE,mVAAmV;CAClW,CAAC;AACE,QAAA,yBAAyB,GAAG;IACvC,mBAAmB,EAAE,yDAAyD;IAC9E,oBAAoB,EAAE,0DAA0D;IAChF,kBAAkB,EAAE,wDAAwD;IAC5E,qBAAqB,EAAE,2DAA2D;IAClF,oBAAoB,EAAE,0DAA0D;IAChF,mBAAmB,EAAE,yDAAyD;IAC9E,oBAAoB,EAAE,0DAA0D;IAChF,kBAAkB,EAAE,wDAAwD;IAC5E,qBAAqB,EAAE,2DAA2D;CAC1E,CAAC","sourcesContent":["/*\n * AUTO-GENERATED FILE. DO NOT EDIT.\n * Run `pnpm run build-dom-scripts` to regenerate.\n */\nexport const selectorRuntimeBootstrap = \"if (!globalThis.__stagehandSelectorRuntime) { var __stagehandSelectorRuntimeFactory=(()=>{var P=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var $=(t,e)=>{for(var n in e)P(t,n,{get:e[n],enumerable:!0})},C=(t,e,n,r)=>{if(e&&typeof e==\\\"object\\\"||typeof e==\\\"function\\\")for(let s of N(e))!D.call(t,s)&&s!==n&&P(t,s,{get:()=>e[s],enumerable:!(r=A(e,s))||r.enumerable});return t};var k=t=>C(P({},\\\"__esModule\\\",{value:!0}),t);var j={};$(j,{countCssWithRoots:()=>B,countTextWithRoots:()=>Y,countXPathNative:()=>U,countXPathWithRoots:()=>K,hasOpenShadowRoots:()=>V,queryCssWithRoots:()=>X,queryTextWithRoots:()=>M,queryXPathNative:()=>Z,queryXPathWithRoots:()=>z});function R(t){let e=String(t||\\\"\\\").trim().replace(/^xpath=/i,\\\"\\\");if(!e)return[];let n=[],r=0;for(;r<e.length;){let s=\\\"child\\\";e.startsWith(\\\"//\\\",r)?(s=\\\"desc\\\",r+=2):e[r]===\\\"/\\\"&&(s=\\\"child\\\",r+=1);let o=r,a=0,i=null;for(;r<e.length;){let l=e[r];if(i)l===i&&(i=null);else if(l===\\\"'\\\"||l==='\\\"')i=l;else if(l===\\\"[\\\")a++;else if(l===\\\"]\\\")a--;else if(l===\\\"/\\\"&&a===0)break;r+=1}let u=e.slice(o,r).trim();if(!u)continue;let{tag:c,predicates:f}=W(u);n.push({axis:s,tag:c,predicates:f})}return n}function q(t){let e=[],n=0;for(;n<t.length;){if(t[n]!==\\\"[\\\"){n++;continue}n++;let r=n,s=null;for(;n<t.length;){let o=t[n];if(s)o===s&&(s=null);else if(o===\\\"'\\\"||o==='\\\"')s=o;else if(o===\\\"]\\\")break;n++}e.push(t.slice(r,n).trim()),n++}return e}function W(t){let e=t.indexOf(\\\"[\\\");if(e===-1)return{tag:t===\\\"\\\"?\\\"*\\\":t.toLowerCase(),predicates:[]};let n=t.slice(0,e).trim(),r=n===\\\"\\\"?\\\"*\\\":n.toLowerCase(),s=t.slice(e),o=[];for(let a of q(s)){let i=d(a);i&&o.push(i)}return{tag:r,predicates:o}}function d(t){let e=t.trim();if(!e)return null;let n=y(e,\\\"or\\\");if(n.length>1){let o=n.map(a=>d(a)).filter(Boolean);return o.length!==n.length?null:{type:\\\"or\\\",predicates:o}}let r=y(e,\\\"and\\\");if(r.length>1){let o=r.map(a=>d(a)).filter(Boolean);return o.length!==r.length?null:{type:\\\"and\\\",predicates:o}}let s=O(e,\\\"not\\\");if(s!=null){let o=d(s);return o?{type:\\\"not\\\",predicate:o}:null}return _(e)}function _(t){let e=/^(?:'([^']*)'|\\\"([^\\\"]*)\\\")$/,n=\\\"[a-zA-Z_][\\\\\\\\w.-]*\\\",r=`(?:'([^']*)'|\\\"([^\\\"]*)\\\")`;if(/^\\\\d+$/.test(t))return{type:\\\"index\\\",index:Math.max(1,Number(t))};let s=t.match(new RegExp(`^normalize-space\\\\\\\\(\\\\\\\\s*@(${n})\\\\\\\\s*\\\\\\\\)\\\\\\\\s*=\\\\\\\\s*${r}$`));if(s)return{type:\\\"attrEquals\\\",name:s[1],value:s[2]??s[3]??\\\"\\\",normalize:!0};let o=t.match(new RegExp(`^normalize-space\\\\\\\\(\\\\\\\\s*(?:text\\\\\\\\(\\\\\\\\)|\\\\\\\\.)\\\\\\\\s*\\\\\\\\)\\\\\\\\s*=\\\\\\\\s*${r}$`));if(o)return{type:\\\"textEquals\\\",value:o[1]??o[2]??\\\"\\\",normalize:!0};let a=t.match(new RegExp(`^@(${n})\\\\\\\\s*=\\\\\\\\s*${r}$`));if(a)return{type:\\\"attrEquals\\\",name:a[1],value:a[2]??a[3]??\\\"\\\"};let i=t.match(new RegExp(`^@(${n})$`));if(i)return{type:\\\"attrExists\\\",name:i[1]};let u=t.match(new RegExp(`^contains\\\\\\\\(\\\\\\\\s*@(${n})\\\\\\\\s*,\\\\\\\\s*${r}\\\\\\\\s*\\\\\\\\)$`));if(u)return{type:\\\"attrContains\\\",name:u[1],value:u[2]??u[3]??\\\"\\\"};let c=t.match(new RegExp(`^starts-with\\\\\\\\(\\\\\\\\s*@(${n})\\\\\\\\s*,\\\\\\\\s*${r}\\\\\\\\s*\\\\\\\\)$`));if(c)return{type:\\\"attrStartsWith\\\",name:c[1],value:c[2]??c[3]??\\\"\\\"};let f=t.match(new RegExp(`^(?:text\\\\\\\\(\\\\\\\\)|\\\\\\\\.)\\\\\\\\s*=\\\\\\\\s*${r}$`));if(f)return{type:\\\"textEquals\\\",value:f[1]??f[2]??\\\"\\\"};let l=t.match(new RegExp(`^contains\\\\\\\\(\\\\\\\\s*(?:text\\\\\\\\(\\\\\\\\)|\\\\\\\\.)\\\\\\\\s*,\\\\\\\\s*${r}\\\\\\\\s*\\\\\\\\)$`));return l?{type:\\\"textContains\\\",value:l[1]??l[2]??\\\"\\\"}:(e.test(t),null)}function y(t,e){let n=[],r=0,s=0,o=null,a=0;for(;a<t.length;){let i=t[a];if(o){i===o&&(o=null),a+=1;continue}if(i===\\\"'\\\"||i==='\\\"'){o=i,a+=1;continue}if(i===\\\"(\\\"){s+=1,a+=1;continue}if(i===\\\")\\\"){s=Math.max(0,s-1),a+=1;continue}if(s===0&&L(t,a,e)){n.push(t.slice(r,a).trim()),a+=e.length,r=a;continue}a+=1}return n.push(t.slice(r).trim()),n.filter(i=>i.length>0)}function L(t,e,n){if(!t.startsWith(n,e))return!1;let r=e>0?t[e-1]:\\\" \\\";if(r===\\\"@\\\")return!1;let s=e+n.length<t.length?t[e+n.length]:\\\" \\\";return S(r)&&S(s)}function S(t){return!/[a-zA-Z0-9_.-]/.test(t)}function O(t,e){let n=`${e}(`;if(!t.startsWith(n)||!t.endsWith(\\\")\\\"))return null;let r=t.slice(n.length,-1);return I(r)?r:null}function I(t){let e=0,n=null;for(let r=0;r<t.length;r+=1){let s=t[r];if(n){s===n&&(n=null);continue}if(s===\\\"'\\\"||s==='\\\"'){n=s;continue}if(s===\\\"(\\\"?e+=1:s===\\\")\\\"&&(e-=1),e<0)return!1}return e===0}var F=t=>t.replace(/\\\\s+/g,\\\" \\\").trim();function b(t){return String(t.textContent??\\\"\\\")}function m(t,e){return e?F(t):t}function x(t,e){switch(e.type){case\\\"and\\\":return e.predicates.every(n=>x(t,n));case\\\"or\\\":return e.predicates.some(n=>x(t,n));case\\\"not\\\":return!x(t,e.predicate);case\\\"attrExists\\\":return t.getAttribute(e.name)!==null;case\\\"attrEquals\\\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize)===m(e.value,e.normalize)}case\\\"attrContains\\\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize).includes(m(e.value,e.normalize))}case\\\"attrStartsWith\\\":{let n=t.getAttribute(e.name);return n===null?!1:m(n,e.normalize).startsWith(m(e.value,e.normalize))}case\\\"textEquals\\\":return m(b(t),e.normalize)===m(e.value,e.normalize);case\\\"textContains\\\":return m(b(t),e.normalize).includes(m(e.value,e.normalize));case\\\"index\\\":return!0;default:return!0}}function v(t,e){let n=t;for(let r of e){if(!n.length)return[];if(r.type===\\\"index\\\"){let s=r.index-1;n=s>=0&&s<n.length?[n[s]]:[];continue}n=n.filter(s=>x(s,r))}return n}function w(t){let e=new Map;for(let n=0;n<t.length;n+=2){let r=t[n],s=t[n+1];r instanceof Element&&s instanceof ShadowRoot&&e.set(r,s)}return e}function E(t,e){if(!t)return[];if(t instanceof Document)return t.documentElement?[t.documentElement]:[];if(t instanceof ShadowRoot||t instanceof DocumentFragment)return Array.from(t.children||[]);if(!(t instanceof Element))return[];let n=Array.from(t.children||[]);t.shadowRoot&&n.push(...Array.from(t.shadowRoot.children||[]));let r=e.get(t);return r&&n.push(...Array.from(r.children||[])),n}function H(t,e){let n=[],r=new Set,s=[...E(t,e)].reverse();for(;s.length;){let o=s.pop();if(!(o instanceof Element)||r.has(o))continue;r.add(o),n.push(o);let a=E(o,e);for(let i=a.length-1;i>=0;i-=1)s.push(a[i])}return n}function X(t,e,...n){let r=w(n),s=[],o=new Set,a=[...E(this,r)].reverse();for(;a.length&&s.length<e;){let i=a.pop();if(!(i instanceof Element)||o.has(i))continue;o.add(i);try{if(i.matches(t)&&(s.push(i),s.length>=e))break}catch{return[]}let u=E(i,r);for(let c=u.length-1;c>=0;c-=1)a.push(u[c])}return s}function B(t,...e){return X.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function M(t,e,...n){let r=w(n),s=new Set([\\\"SCRIPT\\\",\\\"STYLE\\\",\\\"TEMPLATE\\\",\\\"NOSCRIPT\\\",\\\"HEAD\\\",\\\"TITLE\\\",\\\"LINK\\\",\\\"META\\\",\\\"HTML\\\",\\\"BODY\\\"]),o=String(t||\\\"\\\").toLowerCase();if(!o)return[];let a=l=>{let g=l.tagName?l.tagName.toUpperCase():\\\"\\\";if(s.has(g))return\\\"\\\";try{let p=l.innerText;if(typeof p==\\\"string\\\"&&p.trim())return p.trim()}catch{}let h=l.textContent;return typeof h==\\\"string\\\"?h.trim():\\\"\\\"},i=[],u=new Set,c=[...E(this,r)].reverse();for(;c.length;){let l=c.pop();if(!(l instanceof Element)||u.has(l))continue;u.add(l);let g=a(l);g&&g.toLowerCase().includes(o)&&i.push(l);let h=E(l,r);for(let p=h.length-1;p>=0;p-=1)c.push(h[p])}let f=[];for(let l of i){let g=!1;for(let h of i)if(l!==h)try{if(l.contains(h)){g=!0;break}}catch{}if(!g&&(f.push(l),f.length>=e))break}return f}function Y(t,...e){return M.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function T(t){let e=String(t||\\\"\\\").trim();return e?e.replace(/^xpath=/i,\\\"\\\").trim():\\\"\\\"}function G(t,e){return e.tag===\\\"*\\\"?!0:t.localName===e.tag}function z(t,e,...n){let r=w(n),s=R(t);if(!s.length)return[];let o=[this];for(let a of s){let i=[],u=new Set;for(let c of o){let l=(a.axis===\\\"child\\\"?E(c,r):H(c,r)).filter(h=>G(h,a)),g=v(l,a.predicates);for(let h of g)if(!u.has(h)&&(u.add(h),i.push(h),i.length>=e&&a===s[s.length-1]))break}if(!i.length)return[];o=i}return o.slice(0,e)}function K(t,...e){return z.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}function Z(t,e){let n=T(t);if(!n||!Number.isFinite(e)||e<=0)return[];try{let r=this.evaluate(n,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),s=[],o=Math.min(r.snapshotLength,Math.floor(e));for(let a=0;a<o;a+=1){let i=r.snapshotItem(a);i instanceof Element&&s.push(i)}return s}catch{return[]}}function U(t){let e=T(t);if(!e)return 0;try{let n=this.evaluate(e,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),r=0;for(let s=0;s<n.snapshotLength;s+=1)n.snapshotItem(s)instanceof Element&&(r+=1);return r}catch{return 0}}function V(){try{let t=this.createTreeWalker(this,NodeFilter.SHOW_ELEMENT);for(;t.nextNode();){let e=t.currentNode;if(e instanceof Element&&e.shadowRoot)return!0}}catch{return!1}return!1}return k(j);})();\\n globalThis.__stagehandSelectorRuntime = __stagehandSelectorRuntimeFactory;\\n}\";\nexport const selectorRuntimeSources = {\n \"countCssWithRoots\": \"function O(t,...e){return C.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}\",\n \"countTextWithRoots\": \"function I(t,...e){return k.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}\",\n \"countXPathNative\": \"function B(t){let e=v(t);if(!e)return 0;try{let n=this.evaluate(e,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),r=0;for(let s=0;s<n.snapshotLength;s+=1)n.snapshotItem(s)instanceof Element&&(r+=1);return r}catch{return 0}}\",\n \"countXPathWithRoots\": \"function F(t,...e){return W.call(this,t,Number.MAX_SAFE_INTEGER,...e).length}\",\n \"hasOpenShadowRoots\": \"function Y(){try{let t=this.createTreeWalker(this,NodeFilter.SHOW_ELEMENT);for(;t.nextNode();){let e=t.currentNode;if(e instanceof Element&&e.shadowRoot)return!0}}catch{return!1}return!1}\",\n \"queryCssWithRoots\": \"function C(t,e,...n){let r=P(n),s=[],o=new Set,a=[...E(this,r)].reverse();for(;a.length&&s.length<e;){let i=a.pop();if(!(i instanceof Element)||o.has(i))continue;o.add(i);try{if(i.matches(t)&&(s.push(i),s.length>=e))break}catch{return[]}let u=E(i,r);for(let c=u.length-1;c>=0;c-=1)a.push(u[c])}return s}\",\n \"queryTextWithRoots\": \"function k(t,e,...n){let r=P(n),s=new Set([\\\"SCRIPT\\\",\\\"STYLE\\\",\\\"TEMPLATE\\\",\\\"NOSCRIPT\\\",\\\"HEAD\\\",\\\"TITLE\\\",\\\"LINK\\\",\\\"META\\\",\\\"HTML\\\",\\\"BODY\\\"]),o=String(t||\\\"\\\").toLowerCase();if(!o)return[];let a=l=>{let g=l.tagName?l.tagName.toUpperCase():\\\"\\\";if(s.has(g))return\\\"\\\";try{let p=l.innerText;if(typeof p==\\\"string\\\"&&p.trim())return p.trim()}catch{}let h=l.textContent;return typeof h==\\\"string\\\"?h.trim():\\\"\\\"},i=[],u=new Set,c=[...E(this,r)].reverse();for(;c.length;){let l=c.pop();if(!(l instanceof Element)||u.has(l))continue;u.add(l);let g=a(l);g&&g.toLowerCase().includes(o)&&i.push(l);let h=E(l,r);for(let p=h.length-1;p>=0;p-=1)c.push(h[p])}let f=[];for(let l of i){let g=!1;for(let h of i)if(l!==h)try{if(l.contains(h)){g=!0;break}}catch{}if(!g&&(f.push(l),f.length>=e))break}return f}\",\n \"queryXPathNative\": \"function H(t,e){let n=v(t);if(!n||!Number.isFinite(e)||e<=0)return[];try{let r=this.evaluate(n,this,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),s=[],o=Math.min(r.snapshotLength,Math.floor(e));for(let a=0;a<o;a+=1){let i=r.snapshotItem(a);i instanceof Element&&s.push(i)}return s}catch{return[]}}\",\n \"queryXPathWithRoots\": \"function W(t,e,...n){let r=P(n),s=b(t);if(!s.length)return[];let o=[this];for(let a of s){let i=[],u=new Set;for(let c of o){let l=(a.axis===\\\"child\\\"?E(c,r):$(c,r)).filter(h=>q(h,a)),g=R(l,a.predicates);for(let h of g)if(!u.has(h)&&(u.add(h),i.push(h),i.length>=e&&a===s[s.length-1]))break}if(!i.length)return[];o=i}return o.slice(0,e)}\"\n} as const;\nexport const selectorRuntimeGlobalRefs = {\n \"countCssWithRoots\": \"globalThis.__stagehandSelectorRuntime.countCssWithRoots\",\n \"countTextWithRoots\": \"globalThis.__stagehandSelectorRuntime.countTextWithRoots\",\n \"countXPathNative\": \"globalThis.__stagehandSelectorRuntime.countXPathNative\",\n \"countXPathWithRoots\": \"globalThis.__stagehandSelectorRuntime.countXPathWithRoots\",\n \"hasOpenShadowRoots\": \"globalThis.__stagehandSelectorRuntime.hasOpenShadowRoots\",\n \"queryCssWithRoots\": \"globalThis.__stagehandSelectorRuntime.queryCssWithRoots\",\n \"queryTextWithRoots\": \"globalThis.__stagehandSelectorRuntime.queryTextWithRoots\",\n \"queryXPathNative\": \"globalThis.__stagehandSelectorRuntime.queryXPathNative\",\n \"queryXPathWithRoots\": \"globalThis.__stagehandSelectorRuntime.queryXPathWithRoots\"\n} as const;\nexport type SelectorRuntimeName = keyof typeof selectorRuntimeSources;\n"]}
|
|
@@ -34,7 +34,11 @@ function resolveXPathAtIndex(rawXp, index, options) {
|
|
|
34
34
|
return composed[targetIndex] ?? null;
|
|
35
35
|
}
|
|
36
36
|
const composed = resolveXPathComposedMatches(xp, shadowCtx.getClosedRoot);
|
|
37
|
-
|
|
37
|
+
if (composed.length > 0) {
|
|
38
|
+
return composed[targetIndex] ?? null;
|
|
39
|
+
}
|
|
40
|
+
const shadowHopMatches = resolveStagehandShadowHopMatches(xp, shadowCtx.getClosedRoot);
|
|
41
|
+
return shadowHopMatches[targetIndex] ?? null;
|
|
38
42
|
}
|
|
39
43
|
function countXPathMatches(rawXp, options) {
|
|
40
44
|
const xp = normalizeXPath(rawXp);
|
|
@@ -51,7 +55,10 @@ function countXPathMatches(rawXp, options) {
|
|
|
51
55
|
return count.count;
|
|
52
56
|
return resolveXPathComposedMatches(xp, shadowCtx?.getClosedRoot).length;
|
|
53
57
|
}
|
|
54
|
-
|
|
58
|
+
const composedCount = resolveXPathComposedMatches(xp, shadowCtx.getClosedRoot).length;
|
|
59
|
+
if (composedCount > 0)
|
|
60
|
+
return composedCount;
|
|
61
|
+
return resolveStagehandShadowHopMatches(xp, shadowCtx.getClosedRoot).length;
|
|
55
62
|
}
|
|
56
63
|
function resolveXPathComposedMatches(rawXp, getClosedRoot) {
|
|
57
64
|
const xp = normalizeXPath(rawXp);
|
|
@@ -61,15 +68,11 @@ function resolveXPathComposedMatches(rawXp, getClosedRoot) {
|
|
|
61
68
|
if (!steps.length)
|
|
62
69
|
return [];
|
|
63
70
|
const closedRoot = getClosedRoot ?? null;
|
|
64
|
-
let current = [
|
|
65
|
-
document,
|
|
66
|
-
];
|
|
71
|
+
let current = [document];
|
|
67
72
|
for (const step of steps) {
|
|
68
73
|
const next = [];
|
|
69
74
|
const seen = new Set();
|
|
70
75
|
for (const root of current) {
|
|
71
|
-
if (!root)
|
|
72
|
-
continue;
|
|
73
76
|
const pool = step.axis === "child"
|
|
74
77
|
? composedChildren(root, closedRoot)
|
|
75
78
|
: composedDescendants(root, closedRoot);
|
|
@@ -90,6 +93,43 @@ function resolveXPathComposedMatches(rawXp, getClosedRoot) {
|
|
|
90
93
|
}
|
|
91
94
|
return current;
|
|
92
95
|
}
|
|
96
|
+
function resolveStagehandShadowHopMatches(rawXp, getClosedRoot) {
|
|
97
|
+
const xp = normalizeXPath(rawXp);
|
|
98
|
+
if (!xp)
|
|
99
|
+
return [];
|
|
100
|
+
const steps = (0, xpathParser_js_1.parseXPathSteps)(xp);
|
|
101
|
+
if (!steps.some((step, index) => step.axis === "desc" && index > 0)) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
const closedRoot = getClosedRoot ?? null;
|
|
105
|
+
let current = [document];
|
|
106
|
+
for (let i = 0; i < steps.length; i += 1) {
|
|
107
|
+
const step = steps[i];
|
|
108
|
+
const next = [];
|
|
109
|
+
const seen = new Set();
|
|
110
|
+
for (const root of current) {
|
|
111
|
+
const pool = step.axis === "child"
|
|
112
|
+
? domChildren(root)
|
|
113
|
+
: i === 0
|
|
114
|
+
? composedDescendants(root, closedRoot)
|
|
115
|
+
: shadowRootChildren(root, closedRoot);
|
|
116
|
+
if (!pool.length)
|
|
117
|
+
continue;
|
|
118
|
+
const tagMatches = pool.filter((candidate) => matchesTag(candidate, step));
|
|
119
|
+
const matches = (0, xpathParser_js_1.applyPredicates)(tagMatches, step.predicates);
|
|
120
|
+
for (const candidate of matches) {
|
|
121
|
+
if (!seen.has(candidate)) {
|
|
122
|
+
seen.add(candidate);
|
|
123
|
+
next.push(candidate);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (!next.length)
|
|
128
|
+
return [];
|
|
129
|
+
current = next;
|
|
130
|
+
}
|
|
131
|
+
return current;
|
|
132
|
+
}
|
|
93
133
|
function matchesTag(element, step) {
|
|
94
134
|
if (step.tag === "*")
|
|
95
135
|
return true;
|
|
@@ -136,8 +176,6 @@ function getShadowContext() {
|
|
|
136
176
|
}
|
|
137
177
|
function composedChildren(node, getClosedRoot) {
|
|
138
178
|
const out = [];
|
|
139
|
-
if (!node)
|
|
140
|
-
return out;
|
|
141
179
|
if (node instanceof Document) {
|
|
142
180
|
if (node.documentElement)
|
|
143
181
|
out.push(node.documentElement);
|
|
@@ -161,13 +199,44 @@ function composedChildren(node, getClosedRoot) {
|
|
|
161
199
|
}
|
|
162
200
|
return out;
|
|
163
201
|
}
|
|
202
|
+
function domChildren(node) {
|
|
203
|
+
const out = [];
|
|
204
|
+
if (node instanceof Document) {
|
|
205
|
+
if (node.documentElement)
|
|
206
|
+
out.push(node.documentElement);
|
|
207
|
+
return out;
|
|
208
|
+
}
|
|
209
|
+
if (node instanceof ShadowRoot || node instanceof DocumentFragment) {
|
|
210
|
+
out.push(...Array.from(node.children ?? []));
|
|
211
|
+
return out;
|
|
212
|
+
}
|
|
213
|
+
if (node instanceof Element) {
|
|
214
|
+
out.push(...Array.from(node.children ?? []));
|
|
215
|
+
return out;
|
|
216
|
+
}
|
|
217
|
+
return out;
|
|
218
|
+
}
|
|
219
|
+
function shadowRootChildren(node, getClosedRoot) {
|
|
220
|
+
const out = [];
|
|
221
|
+
if (!(node instanceof Element))
|
|
222
|
+
return out;
|
|
223
|
+
const open = node.shadowRoot;
|
|
224
|
+
if (open)
|
|
225
|
+
out.push(...Array.from(open.children ?? []));
|
|
226
|
+
if (getClosedRoot) {
|
|
227
|
+
const closed = getClosedRoot(node);
|
|
228
|
+
if (closed)
|
|
229
|
+
out.push(...Array.from(closed.children ?? []));
|
|
230
|
+
}
|
|
231
|
+
return out;
|
|
232
|
+
}
|
|
164
233
|
function composedDescendants(node, getClosedRoot) {
|
|
165
234
|
const out = [];
|
|
166
235
|
const seen = new Set();
|
|
167
236
|
const stack = [...composedChildren(node, getClosedRoot)].reverse();
|
|
168
237
|
while (stack.length) {
|
|
169
238
|
const next = stack.pop();
|
|
170
|
-
if (
|
|
239
|
+
if (seen.has(next))
|
|
171
240
|
continue;
|
|
172
241
|
seen.add(next);
|
|
173
242
|
out.push(next);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xpathResolver.js","sourceRoot":"","sources":["../../../../../../lib/v3/dom/locatorScripts/xpathResolver.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n applyPredicates,\n parseXPathSteps,\n type XPathStep,\n} from \"./xpathParser.js\";\n\ntype ClosedRootGetter = (host: Element) => ShadowRoot | null;\n\nexport type XPathResolveOptions = {\n pierceShadow?: boolean;\n};\n\ntype ShadowContext = {\n getClosedRoot: ClosedRootGetter | null;\n hasShadow: boolean;\n};\n\nconst normalizeXPath = (selector: string): string => {\n const raw = String(selector ?? \"\").trim();\n if (!raw) return \"\";\n return raw.replace(/^xpath=/i, \"\").trim();\n};\n\nexport function resolveXPathFirst(\n rawXp: string,\n options?: XPathResolveOptions,\n): Element | null {\n return resolveXPathAtIndex(rawXp, 0, options);\n}\n\nexport function resolveXPathAtIndex(\n rawXp: string,\n index: number,\n options?: XPathResolveOptions,\n): Element | null {\n if (!Number.isFinite(index) || index < 0) return null;\n const xp = normalizeXPath(rawXp);\n if (!xp) return null;\n\n const targetIndex = Math.floor(index);\n const pierceShadow = options?.pierceShadow !== false;\n const shadowCtx = pierceShadow ? getShadowContext() : null;\n\n if (!pierceShadow) {\n return resolveNativeAtIndexWithError(xp, targetIndex).value;\n }\n\n if (!shadowCtx?.hasShadow) {\n const native = resolveNativeAtIndexWithError(xp, targetIndex);\n if (!native.error) return native.value;\n const composed = resolveXPathComposedMatches(xp, shadowCtx?.getClosedRoot);\n return composed[targetIndex] ?? null;\n }\n\n const composed = resolveXPathComposedMatches(xp, shadowCtx.getClosedRoot);\n return composed[targetIndex] ?? null;\n}\n\nexport function countXPathMatches(\n rawXp: string,\n options?: XPathResolveOptions,\n): number {\n const xp = normalizeXPath(rawXp);\n if (!xp) return 0;\n\n const pierceShadow = options?.pierceShadow !== false;\n const shadowCtx = pierceShadow ? getShadowContext() : null;\n\n if (!pierceShadow) {\n return resolveNativeCountWithError(xp).count;\n }\n\n if (!shadowCtx?.hasShadow) {\n const count = resolveNativeCountWithError(xp);\n if (!count.error) return count.count;\n return resolveXPathComposedMatches(xp, shadowCtx?.getClosedRoot).length;\n }\n\n return resolveXPathComposedMatches(xp, shadowCtx.getClosedRoot).length;\n}\n\nexport function resolveXPathComposedMatches(\n rawXp: string,\n getClosedRoot?: ClosedRootGetter | null,\n): Element[] {\n const xp = normalizeXPath(rawXp);\n if (!xp) return [];\n\n const steps = parseXPathSteps(xp);\n if (!steps.length) return [];\n\n const closedRoot = getClosedRoot ?? null;\n\n let current: Array<Document | Element | ShadowRoot | DocumentFragment> = [\n document,\n ];\n\n for (const step of steps) {\n const next: Element[] = [];\n const seen = new Set<Element>();\n\n for (const root of current) {\n if (!root) continue;\n const pool =\n step.axis === \"child\"\n ? composedChildren(root, closedRoot)\n : composedDescendants(root, closedRoot);\n if (!pool.length) continue;\n\n const tagMatches = pool.filter((candidate) =>\n matchesTag(candidate, step),\n );\n const matches = applyPredicates(tagMatches, step.predicates);\n\n for (const candidate of matches) {\n if (!seen.has(candidate)) {\n seen.add(candidate);\n next.push(candidate);\n }\n }\n }\n\n if (!next.length) return [];\n current = next;\n }\n\n return current as Element[];\n}\n\nfunction matchesTag(element: Element, step: XPathStep): boolean {\n if (step.tag === \"*\") return true;\n return element.localName === step.tag;\n}\n\nfunction getShadowContext(): ShadowContext {\n const backdoor = window.__stagehandV3__;\n const getClosedRoot: ClosedRootGetter | null =\n backdoor && typeof backdoor.getClosedRoot === \"function\"\n ? (host: Element): ShadowRoot | null => {\n try {\n return backdoor.getClosedRoot(host) ?? null;\n } catch {\n return null;\n }\n }\n : null;\n\n let hasShadow = false;\n try {\n if (backdoor && typeof backdoor.stats === \"function\") {\n const stats = backdoor.stats();\n hasShadow = (stats?.open ?? 0) > 0 || (stats?.closed ?? 0) > 0;\n }\n } catch {\n // ignore stats errors\n }\n\n if (!hasShadow) {\n try {\n const walker = document.createTreeWalker(\n document,\n NodeFilter.SHOW_ELEMENT,\n );\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n if (el.shadowRoot) {\n hasShadow = true;\n break;\n }\n }\n } catch {\n // ignore scan errors\n }\n }\n\n return { getClosedRoot, hasShadow };\n}\n\nfunction composedChildren(\n node: Node | null | undefined,\n getClosedRoot: ClosedRootGetter | null,\n): Element[] {\n const out: Element[] = [];\n if (!node) return out;\n\n if (node instanceof Document) {\n if (node.documentElement) out.push(node.documentElement);\n return out;\n }\n\n if (node instanceof ShadowRoot || node instanceof DocumentFragment) {\n out.push(...Array.from(node.children ?? []));\n return out;\n }\n\n if (node instanceof Element) {\n out.push(...Array.from(node.children ?? []));\n const open = node.shadowRoot;\n if (open) out.push(...Array.from(open.children ?? []));\n if (getClosedRoot) {\n const closed = getClosedRoot(node);\n if (closed) out.push(...Array.from(closed.children ?? []));\n }\n return out;\n }\n\n return out;\n}\n\nfunction composedDescendants(\n node: Node | null | undefined,\n getClosedRoot: ClosedRootGetter | null,\n): Element[] {\n const out: Element[] = [];\n const seen = new Set<Element>();\n const stack = [...composedChildren(node, getClosedRoot)].reverse();\n\n while (stack.length) {\n const next = stack.pop();\n if (!next || seen.has(next)) continue;\n seen.add(next);\n out.push(next);\n\n const children = composedChildren(next, getClosedRoot);\n for (let i = children.length - 1; i >= 0; i -= 1) {\n stack.push(children[i]!);\n }\n }\n\n return out;\n}\n\nfunction resolveNativeAtIndexWithError(\n xp: string,\n index: number,\n): { value: Element | null; error: boolean } {\n try {\n const snapshot = document.evaluate(\n xp,\n document,\n null,\n XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,\n null,\n );\n return {\n value: snapshot.snapshotItem(index) as Element | null,\n error: false,\n };\n } catch {\n return { value: null, error: true };\n }\n}\n\nfunction resolveNativeCountWithError(xp: string): {\n count: number;\n error: boolean;\n} {\n try {\n const snapshot = document.evaluate(\n xp,\n document,\n null,\n XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,\n null,\n );\n return { count: snapshot.snapshotLength, error: false };\n } catch {\n return { count: 0, error: true };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"xpathResolver.js","sourceRoot":"","sources":["../../../../../../lib/v3/dom/locatorScripts/xpathResolver.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n applyPredicates,\n parseXPathSteps,\n type XPathStep,\n} from \"./xpathParser.js\";\n\ntype ClosedRootGetter = (host: Element) => ShadowRoot | null;\ntype TraversalRoot = Document | Element | ShadowRoot | DocumentFragment;\n\nexport type XPathResolveOptions = {\n pierceShadow?: boolean;\n};\n\ntype ShadowContext = {\n getClosedRoot: ClosedRootGetter | null;\n hasShadow: boolean;\n};\n\nconst normalizeXPath = (selector: string): string => {\n const raw = String(selector ?? \"\").trim();\n if (!raw) return \"\";\n return raw.replace(/^xpath=/i, \"\").trim();\n};\n\nexport function resolveXPathFirst(\n rawXp: string,\n options?: XPathResolveOptions,\n): Element | null {\n return resolveXPathAtIndex(rawXp, 0, options);\n}\n\nexport function resolveXPathAtIndex(\n rawXp: string,\n index: number,\n options?: XPathResolveOptions,\n): Element | null {\n if (!Number.isFinite(index) || index < 0) return null;\n const xp = normalizeXPath(rawXp);\n if (!xp) return null;\n\n const targetIndex = Math.floor(index);\n const pierceShadow = options?.pierceShadow !== false;\n const shadowCtx = pierceShadow ? getShadowContext() : null;\n\n if (!pierceShadow) {\n return resolveNativeAtIndexWithError(xp, targetIndex).value;\n }\n\n if (!shadowCtx?.hasShadow) {\n const native = resolveNativeAtIndexWithError(xp, targetIndex);\n if (!native.error) return native.value;\n const composed = resolveXPathComposedMatches(xp, shadowCtx?.getClosedRoot);\n return composed[targetIndex] ?? null;\n }\n\n const composed = resolveXPathComposedMatches(xp, shadowCtx.getClosedRoot);\n if (composed.length > 0) {\n return composed[targetIndex] ?? null;\n }\n\n const shadowHopMatches = resolveStagehandShadowHopMatches(\n xp,\n shadowCtx.getClosedRoot,\n );\n return shadowHopMatches[targetIndex] ?? null;\n}\n\nexport function countXPathMatches(\n rawXp: string,\n options?: XPathResolveOptions,\n): number {\n const xp = normalizeXPath(rawXp);\n if (!xp) return 0;\n\n const pierceShadow = options?.pierceShadow !== false;\n const shadowCtx = pierceShadow ? getShadowContext() : null;\n\n if (!pierceShadow) {\n return resolveNativeCountWithError(xp).count;\n }\n\n if (!shadowCtx?.hasShadow) {\n const count = resolveNativeCountWithError(xp);\n if (!count.error) return count.count;\n return resolveXPathComposedMatches(xp, shadowCtx?.getClosedRoot).length;\n }\n\n const composedCount = resolveXPathComposedMatches(\n xp,\n shadowCtx.getClosedRoot,\n ).length;\n if (composedCount > 0) return composedCount;\n\n return resolveStagehandShadowHopMatches(xp, shadowCtx.getClosedRoot).length;\n}\n\nexport function resolveXPathComposedMatches(\n rawXp: string,\n getClosedRoot?: ClosedRootGetter | null,\n): Element[] {\n const xp = normalizeXPath(rawXp);\n if (!xp) return [];\n\n const steps = parseXPathSteps(xp);\n if (!steps.length) return [];\n\n const closedRoot = getClosedRoot ?? null;\n\n let current: TraversalRoot[] = [document];\n\n for (const step of steps) {\n const next: Element[] = [];\n const seen = new Set<Element>();\n\n for (const root of current) {\n const pool =\n step.axis === \"child\"\n ? composedChildren(root, closedRoot)\n : composedDescendants(root, closedRoot);\n if (!pool.length) continue;\n\n const tagMatches = pool.filter((candidate) =>\n matchesTag(candidate, step),\n );\n const matches = applyPredicates(tagMatches, step.predicates);\n\n for (const candidate of matches) {\n if (!seen.has(candidate)) {\n seen.add(candidate);\n next.push(candidate);\n }\n }\n }\n\n if (!next.length) return [];\n current = next;\n }\n\n return current as Element[];\n}\n\nfunction resolveStagehandShadowHopMatches(\n rawXp: string,\n getClosedRoot?: ClosedRootGetter | null,\n): Element[] {\n const xp = normalizeXPath(rawXp);\n if (!xp) return [];\n\n const steps = parseXPathSteps(xp);\n if (!steps.some((step, index) => step.axis === \"desc\" && index > 0)) {\n return [];\n }\n\n const closedRoot = getClosedRoot ?? null;\n let current: TraversalRoot[] = [document];\n\n for (let i = 0; i < steps.length; i += 1) {\n const step = steps[i]!;\n const next: Element[] = [];\n const seen = new Set<Element>();\n\n for (const root of current) {\n const pool =\n step.axis === \"child\"\n ? domChildren(root)\n : i === 0\n ? composedDescendants(root, closedRoot)\n : shadowRootChildren(root, closedRoot);\n if (!pool.length) continue;\n\n const tagMatches = pool.filter((candidate) =>\n matchesTag(candidate, step),\n );\n const matches = applyPredicates(tagMatches, step.predicates);\n\n for (const candidate of matches) {\n if (!seen.has(candidate)) {\n seen.add(candidate);\n next.push(candidate);\n }\n }\n }\n\n if (!next.length) return [];\n current = next;\n }\n\n return current as Element[];\n}\n\nfunction matchesTag(element: Element, step: XPathStep): boolean {\n if (step.tag === \"*\") return true;\n return element.localName === step.tag;\n}\n\nfunction getShadowContext(): ShadowContext {\n const backdoor = window.__stagehandV3__;\n const getClosedRoot: ClosedRootGetter | null =\n backdoor && typeof backdoor.getClosedRoot === \"function\"\n ? (host: Element): ShadowRoot | null => {\n try {\n return backdoor.getClosedRoot(host) ?? null;\n } catch {\n return null;\n }\n }\n : null;\n\n let hasShadow = false;\n try {\n if (backdoor && typeof backdoor.stats === \"function\") {\n const stats = backdoor.stats();\n hasShadow = (stats?.open ?? 0) > 0 || (stats?.closed ?? 0) > 0;\n }\n } catch {\n // ignore stats errors\n }\n\n if (!hasShadow) {\n try {\n const walker = document.createTreeWalker(\n document,\n NodeFilter.SHOW_ELEMENT,\n );\n while (walker.nextNode()) {\n const el = walker.currentNode as Element;\n if (el.shadowRoot) {\n hasShadow = true;\n break;\n }\n }\n } catch {\n // ignore scan errors\n }\n }\n\n return { getClosedRoot, hasShadow };\n}\n\nfunction composedChildren(\n node: TraversalRoot,\n getClosedRoot: ClosedRootGetter | null,\n): Element[] {\n const out: Element[] = [];\n\n if (node instanceof Document) {\n if (node.documentElement) out.push(node.documentElement);\n return out;\n }\n\n if (node instanceof ShadowRoot || node instanceof DocumentFragment) {\n out.push(...Array.from(node.children ?? []));\n return out;\n }\n\n if (node instanceof Element) {\n out.push(...Array.from(node.children ?? []));\n const open = node.shadowRoot;\n if (open) out.push(...Array.from(open.children ?? []));\n if (getClosedRoot) {\n const closed = getClosedRoot(node);\n if (closed) out.push(...Array.from(closed.children ?? []));\n }\n return out;\n }\n\n return out;\n}\n\nfunction domChildren(node: TraversalRoot): Element[] {\n const out: Element[] = [];\n\n if (node instanceof Document) {\n if (node.documentElement) out.push(node.documentElement);\n return out;\n }\n\n if (node instanceof ShadowRoot || node instanceof DocumentFragment) {\n out.push(...Array.from(node.children ?? []));\n return out;\n }\n\n if (node instanceof Element) {\n out.push(...Array.from(node.children ?? []));\n return out;\n }\n\n return out;\n}\n\nfunction shadowRootChildren(\n node: TraversalRoot,\n getClosedRoot: ClosedRootGetter | null,\n): Element[] {\n const out: Element[] = [];\n if (!(node instanceof Element)) return out;\n\n const open = node.shadowRoot;\n if (open) out.push(...Array.from(open.children ?? []));\n if (getClosedRoot) {\n const closed = getClosedRoot(node);\n if (closed) out.push(...Array.from(closed.children ?? []));\n }\n\n return out;\n}\n\nfunction composedDescendants(\n node: TraversalRoot,\n getClosedRoot: ClosedRootGetter | null,\n): Element[] {\n const out: Element[] = [];\n const seen = new Set<Element>();\n const stack = [...composedChildren(node, getClosedRoot)].reverse();\n\n while (stack.length) {\n const next = stack.pop()!;\n if (seen.has(next)) continue;\n seen.add(next);\n out.push(next);\n\n const children = composedChildren(next, getClosedRoot);\n for (let i = children.length - 1; i >= 0; i -= 1) {\n stack.push(children[i]!);\n }\n }\n\n return out;\n}\n\nfunction resolveNativeAtIndexWithError(\n xp: string,\n index: number,\n): { value: Element | null; error: boolean } {\n try {\n const snapshot = document.evaluate(\n xp,\n document,\n null,\n XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,\n null,\n );\n return {\n value: snapshot.snapshotItem(index) as Element | null,\n error: false,\n };\n } catch {\n return { value: null, error: true };\n }\n}\n\nfunction resolveNativeCountWithError(xp: string): {\n count: number;\n error: boolean;\n} {\n try {\n const snapshot = document.evaluate(\n xp,\n document,\n null,\n XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,\n null,\n );\n return { count: snapshot.snapshotLength, error: false };\n } catch {\n return { count: 0, error: true };\n }\n}\n"]}
|
|
@@ -18,6 +18,7 @@ export declare class V3AgentHandler {
|
|
|
18
18
|
private createStepHandler;
|
|
19
19
|
execute(instructionOrOptions: string | AgentExecuteOptions): Promise<AgentResult>;
|
|
20
20
|
stream(instructionOrOptions: string | AgentStreamExecuteOptions): Promise<AgentStreamResult>;
|
|
21
|
+
private emitFinalEvidence;
|
|
21
22
|
private consolidateMetricsAndResult;
|
|
22
23
|
private createTools;
|
|
23
24
|
private handleStop;
|
|
@@ -11,6 +11,9 @@ const methods_js_1 = require("../types/public/methods.js");
|
|
|
11
11
|
const actionMapping_js_1 = require("../agent/utils/actionMapping.js");
|
|
12
12
|
const sdkErrors_js_1 = require("../types/public/sdkErrors.js");
|
|
13
13
|
const handleDoneToolCall_js_1 = require("../agent/utils/handleDoneToolCall.js");
|
|
14
|
+
const postStepProbeEvidence_js_1 = require("../agent/utils/postStepProbeEvidence.js");
|
|
15
|
+
const wrapEvidenceCallback_js_1 = require("../agent/utils/wrapEvidenceCallback.js");
|
|
16
|
+
const toolOutputEvidence_js_1 = require("../agent/utils/toolOutputEvidence.js");
|
|
14
17
|
const captchaSolver_js_1 = require("../agent/utils/captchaSolver.js");
|
|
15
18
|
function getErrorMessage(error) {
|
|
16
19
|
return error instanceof Error ? error.message : String(error);
|
|
@@ -163,13 +166,14 @@ class V3AgentHandler {
|
|
|
163
166
|
return options;
|
|
164
167
|
};
|
|
165
168
|
}
|
|
166
|
-
createStepHandler(state, userCallback) {
|
|
169
|
+
createStepHandler(state, { userCallback, evidenceCallback, onFinalAnswer }) {
|
|
167
170
|
return async (event) => {
|
|
168
171
|
this.logger({
|
|
169
172
|
category: "agent",
|
|
170
173
|
message: `Step finished: ${event.finishReason}`,
|
|
171
174
|
level: 2,
|
|
172
175
|
});
|
|
176
|
+
let lastFinalAnswer;
|
|
173
177
|
if (event.toolCalls && event.toolCalls.length > 0) {
|
|
174
178
|
for (let i = 0; i < event.toolCalls.length; i++) {
|
|
175
179
|
const toolCall = event.toolCalls[i];
|
|
@@ -192,6 +196,12 @@ class V3AgentHandler {
|
|
|
192
196
|
? `${allReasoning} ${doneReasoning}`.trim()
|
|
193
197
|
: allReasoning || "Task completed successfully";
|
|
194
198
|
}
|
|
199
|
+
lastFinalAnswer = {
|
|
200
|
+
message: state.finalMessage,
|
|
201
|
+
output: typeof args?.output === "object" && args?.output !== null
|
|
202
|
+
? args.output
|
|
203
|
+
: undefined,
|
|
204
|
+
};
|
|
195
205
|
}
|
|
196
206
|
const mappedActions = (0, actionMapping_js_1.mapToolResultToActions)({
|
|
197
207
|
toolCallName: toolCall.toolName,
|
|
@@ -204,8 +214,31 @@ class V3AgentHandler {
|
|
|
204
214
|
action.timestamp = Date.now();
|
|
205
215
|
state.actions.push(action);
|
|
206
216
|
}
|
|
217
|
+
await evidenceCallback?.({
|
|
218
|
+
type: "step_finished",
|
|
219
|
+
actionName: toolCall.toolName,
|
|
220
|
+
actionArgs: typeof args === "object" && args !== null
|
|
221
|
+
? args
|
|
222
|
+
: {},
|
|
223
|
+
reasoning: event.text ?? "",
|
|
224
|
+
toolOutput: (0, toolOutputEvidence_js_1.inferToolOutput)(toolResult),
|
|
225
|
+
});
|
|
207
226
|
}
|
|
208
227
|
state.currentPageUrl = (await this.v3.context.awaitActivePage()).url();
|
|
228
|
+
// Harness probe — one screenshot / a11y snapshot per AI SDK step.
|
|
229
|
+
// The recorder applies the probe to every step_finished received
|
|
230
|
+
// since the previous probe, so a multi-tool turn shares the same
|
|
231
|
+
// post-turn observation.
|
|
232
|
+
await (0, postStepProbeEvidence_js_1.emitPostStepProbeEvidence)({
|
|
233
|
+
v3: this.v3,
|
|
234
|
+
url: state.currentPageUrl,
|
|
235
|
+
evidenceCallback,
|
|
236
|
+
logger: this.logger,
|
|
237
|
+
warningMessage: "Warning: harness probe failed",
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
if (lastFinalAnswer) {
|
|
241
|
+
onFinalAnswer?.(lastFinalAnswer);
|
|
209
242
|
}
|
|
210
243
|
if (userCallback) {
|
|
211
244
|
await userCallback(event);
|
|
@@ -225,6 +258,7 @@ class V3AgentHandler {
|
|
|
225
258
|
completed: false,
|
|
226
259
|
currentPageUrl: "",
|
|
227
260
|
};
|
|
261
|
+
let finalAnswerFromDoneTool;
|
|
228
262
|
let messages = [];
|
|
229
263
|
let captchaSolver;
|
|
230
264
|
try {
|
|
@@ -254,6 +288,7 @@ class V3AgentHandler {
|
|
|
254
288
|
throw new sdkErrors_js_1.StreamingCallbacksInNonStreamingModeError(invalidCallbacks);
|
|
255
289
|
}
|
|
256
290
|
}
|
|
291
|
+
const evidenceCallback = (0, wrapEvidenceCallback_js_1.wrapEvidenceCallback)(callbacks?.onEvidence, this.logger);
|
|
257
292
|
const result = await this.llmClient.generateText({
|
|
258
293
|
model: wrappedModel,
|
|
259
294
|
messages: prependSystemMessage(systemPrompt, messages),
|
|
@@ -261,7 +296,13 @@ class V3AgentHandler {
|
|
|
261
296
|
stopWhen: (result) => this.handleStop(result, maxSteps),
|
|
262
297
|
toolChoice: "auto",
|
|
263
298
|
prepareStep: this.createPrepareStep(callbacks?.prepareStep, captchaSolver),
|
|
264
|
-
onStepFinish: this.createStepHandler(state,
|
|
299
|
+
onStepFinish: this.createStepHandler(state, {
|
|
300
|
+
userCallback: callbacks?.onStepFinish,
|
|
301
|
+
evidenceCallback,
|
|
302
|
+
onFinalAnswer: (answer) => {
|
|
303
|
+
finalAnswerFromDoneTool = answer;
|
|
304
|
+
},
|
|
305
|
+
}),
|
|
265
306
|
abortSignal: preparedOptions.signal,
|
|
266
307
|
providerOptions: {
|
|
267
308
|
google: { mediaResolution: "MEDIA_RESOLUTION_HIGH" },
|
|
@@ -270,7 +311,12 @@ class V3AgentHandler {
|
|
|
270
311
|
});
|
|
271
312
|
const allMessages = [...messages, ...(result.response?.messages || [])];
|
|
272
313
|
const doneResult = await this.ensureDone(state, wrappedModel, allMessages, preparedOptions.instruction, preparedOptions.output, this.logger);
|
|
273
|
-
|
|
314
|
+
const output = doneResult.output ?? finalAnswerFromDoneTool?.output;
|
|
315
|
+
await this.emitFinalEvidence(state, {
|
|
316
|
+
message: state.finalMessage,
|
|
317
|
+
output,
|
|
318
|
+
}, evidenceCallback);
|
|
319
|
+
return this.consolidateMetricsAndResult(startTime, state, doneResult.messages, result, maxSteps, output);
|
|
274
320
|
}
|
|
275
321
|
catch (error) {
|
|
276
322
|
// Re-throw validation errors that should propagate to the caller
|
|
@@ -306,6 +352,7 @@ class V3AgentHandler {
|
|
|
306
352
|
const streamOptions = typeof instructionOrOptions === "object" ? instructionOrOptions : null;
|
|
307
353
|
// Highlight cursor defaults to true for hybrid mode, can be overridden
|
|
308
354
|
const shouldHighlightCursor = streamOptions?.highlightCursor ?? this.mode === "hybrid";
|
|
355
|
+
let finalAnswerFromDoneTool;
|
|
309
356
|
const { options, maxSteps, systemPrompt, allTools, messages, wrappedModel, initialPageUrl, } = await this.prepareAgent(instructionOrOptions);
|
|
310
357
|
// Enable cursor overlay for hybrid mode (coordinate-based interactions)
|
|
311
358
|
if (shouldHighlightCursor && this.mode === "hybrid") {
|
|
@@ -343,6 +390,7 @@ class V3AgentHandler {
|
|
|
343
390
|
});
|
|
344
391
|
rejectResult(error);
|
|
345
392
|
};
|
|
393
|
+
const evidenceCallback = (0, wrapEvidenceCallback_js_1.wrapEvidenceCallback)(callbacks?.onEvidence, this.logger);
|
|
346
394
|
let streamResult;
|
|
347
395
|
try {
|
|
348
396
|
streamResult = this.llmClient.streamText({
|
|
@@ -352,7 +400,13 @@ class V3AgentHandler {
|
|
|
352
400
|
stopWhen: (result) => this.handleStop(result, maxSteps),
|
|
353
401
|
toolChoice: "auto",
|
|
354
402
|
prepareStep: this.createPrepareStep(callbacks?.prepareStep, captchaSolver),
|
|
355
|
-
onStepFinish: this.createStepHandler(state,
|
|
403
|
+
onStepFinish: this.createStepHandler(state, {
|
|
404
|
+
userCallback: callbacks?.onStepFinish,
|
|
405
|
+
evidenceCallback,
|
|
406
|
+
onFinalAnswer: (answer) => {
|
|
407
|
+
finalAnswerFromDoneTool = answer;
|
|
408
|
+
},
|
|
409
|
+
}),
|
|
356
410
|
onError: (event) => {
|
|
357
411
|
captchaSolver?.dispose();
|
|
358
412
|
if (callbacks?.onError) {
|
|
@@ -370,10 +424,17 @@ class V3AgentHandler {
|
|
|
370
424
|
...messages,
|
|
371
425
|
...(event.response?.messages || []),
|
|
372
426
|
];
|
|
373
|
-
this.ensureDone(state, wrappedModel, allMessages, options.instruction, options.output, this.logger)
|
|
374
|
-
|
|
427
|
+
this.ensureDone(state, wrappedModel, allMessages, options.instruction, options.output, this.logger)
|
|
428
|
+
.then(async (doneResult) => {
|
|
429
|
+
const output = doneResult.output ?? finalAnswerFromDoneTool?.output;
|
|
430
|
+
await this.emitFinalEvidence(state, {
|
|
431
|
+
message: state.finalMessage,
|
|
432
|
+
output,
|
|
433
|
+
}, evidenceCallback);
|
|
434
|
+
const result = this.consolidateMetricsAndResult(startTime, state, doneResult.messages, event, maxSteps, output);
|
|
375
435
|
resolveResult(result);
|
|
376
|
-
})
|
|
436
|
+
})
|
|
437
|
+
.catch(handleError);
|
|
377
438
|
},
|
|
378
439
|
onAbort: (event) => {
|
|
379
440
|
captchaSolver?.dispose();
|
|
@@ -401,6 +462,21 @@ class V3AgentHandler {
|
|
|
401
462
|
agentStreamResult.result = resultPromise;
|
|
402
463
|
return agentStreamResult;
|
|
403
464
|
}
|
|
465
|
+
async emitFinalEvidence(state, finalAnswer, evidenceCallback) {
|
|
466
|
+
if (!evidenceCallback)
|
|
467
|
+
return;
|
|
468
|
+
const observation = await (0, postStepProbeEvidence_js_1.captureProbeEvidence)({
|
|
469
|
+
v3: this.v3,
|
|
470
|
+
url: state.currentPageUrl,
|
|
471
|
+
logger: this.logger,
|
|
472
|
+
warningMessage: "Warning: final harness probe failed",
|
|
473
|
+
});
|
|
474
|
+
await evidenceCallback({
|
|
475
|
+
type: "final_answer",
|
|
476
|
+
...finalAnswer,
|
|
477
|
+
observation,
|
|
478
|
+
});
|
|
479
|
+
}
|
|
404
480
|
consolidateMetricsAndResult(startTime, state, inputMessages, result, maxSteps, output) {
|
|
405
481
|
if (!state.finalMessage) {
|
|
406
482
|
const allReasoning = state.collectedReasoning.join(" ").trim();
|