surf-cli 2.0.0 → 2.2.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 +34 -6
- package/dist/content/accessibility-tree.js +8 -8
- package/dist/content/accessibility-tree.js.map +1 -1
- package/dist/service-worker/index.js +5 -5
- package/dist/service-worker/index.js.map +1 -1
- package/native/cli.cjs +65 -13
- package/native/config.cjs +3 -0
- package/native/host-helpers.cjs +62 -2
- package/native/host.cjs +3 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -168,18 +168,45 @@ surf key Escape # Press key
|
|
|
168
168
|
surf scroll.bottom # Scroll to bottom
|
|
169
169
|
```
|
|
170
170
|
|
|
171
|
+
### Forms
|
|
172
|
+
|
|
173
|
+
Select options in dropdown menus:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
surf select e5 "US" # Select by value
|
|
177
|
+
surf select "#country" "US" # Select by CSS selector
|
|
178
|
+
surf select e5 "opt1" "opt2" # Multi-select
|
|
179
|
+
surf select e5 --by label "United States" # Select by visible text
|
|
180
|
+
surf select e5 --by index 0 # Select first option
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
### Element Inspection
|
|
184
|
+
|
|
185
|
+
Get computed styles from elements:
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
surf element.styles e5 # Get styles by ref
|
|
189
|
+
surf element.styles ".header" # Get styles by CSS selector (can return multiple)
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Returns font, color, background, border, padding, and bounding box for design debugging.
|
|
193
|
+
|
|
171
194
|
### Screenshots
|
|
172
195
|
|
|
173
|
-
Screenshots
|
|
196
|
+
Screenshots auto-save to `/tmp` by default (optimized for AI agents):
|
|
174
197
|
|
|
175
198
|
```bash
|
|
176
|
-
surf screenshot
|
|
177
|
-
surf screenshot --
|
|
178
|
-
surf screenshot --
|
|
179
|
-
surf screenshot --
|
|
180
|
-
surf
|
|
199
|
+
surf screenshot # Auto-saves to /tmp/surf-snap-*.png
|
|
200
|
+
surf screenshot --output /tmp/shot.png # Save to specific path
|
|
201
|
+
surf screenshot --full --output /tmp/hd.png # Full resolution (skip resize)
|
|
202
|
+
surf screenshot --annotate # With element labels
|
|
203
|
+
surf screenshot --fullpage # Entire page
|
|
204
|
+
surf screenshot --no-save # Return base64 + ID only (no file)
|
|
205
|
+
surf snap # Alias for screenshot
|
|
181
206
|
```
|
|
182
207
|
|
|
208
|
+
To disable auto-save globally, set `autoSaveScreenshots: false` in `surf.json`.
|
|
209
|
+
|
|
183
210
|
Actions like `click`, `type`, and `scroll` automatically capture a screenshot after execution - no extra command needed.
|
|
184
211
|
|
|
185
212
|
### Tabs
|
|
@@ -356,6 +383,7 @@ echo '{"type":"tool_request","method":"execute_tool","params":{"tool":"tab.list"
|
|
|
356
383
|
| `scroll.*` | `top`, `bottom`, `to`, `info` |
|
|
357
384
|
| `page.*` | `read`, `text`, `state` |
|
|
358
385
|
| `locate.*` | `role`, `text`, `label` |
|
|
386
|
+
| `element.*` | `styles` |
|
|
359
387
|
| `frame.*` | `list`, `switch`, `main`, `js` |
|
|
360
388
|
| `wait.*` | `element`, `network`, `url`, `dom`, `load` |
|
|
361
389
|
| `cookie.*` | `list`, `get`, `set`, `clear` |
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
const J=new Set(["alert","alertdialog","application","article","banner","blockquote","button","caption","cell","checkbox","code","columnheader","combobox","complementary","contentinfo","definition","deletion","dialog","directory","document","emphasis","feed","figure","form","generic","grid","gridcell","group","heading","img","insertion","link","list","listbox","listitem","log","main","mark","marquee","math","menu","menubar","menuitem","menuitemcheckbox","menuitemradio","meter","navigation","none","note","option","paragraph","presentation","progressbar","radio","radiogroup","region","row","rowgroup","rowheader","scrollbar","search","searchbox","separator","slider","spinbutton","status","strong","subscript","superscript","switch","tab","table","tablist","tabpanel","term","textbox","time","timer","toolbar","tooltip","tree","treegrid","treeitem"]);function Q(r){const h=r.tagName.toLowerCase();if(["button","input","select","textarea"].includes(h))return!r.disabled;if(h==="a"&&r.hasAttribute("href"))return!0;if(r.hasAttribute("tabindex")){const i=parseInt(r.getAttribute("tabindex")||"",10);return!isNaN(i)&&i>=0}return r.getAttribute("contenteditable")==="true"}function Z(r){const h=r.getAttribute("role");if(!h)return null;const i=h.split(/\s+/).filter(m=>m);for(const m of i)if(J.has(m))return m;return null}function X(r){const h=r.tagName.toLowerCase(),i=r.getAttribute("type"),m={a:p=>p.hasAttribute("href")?"link":"generic",article:"article",aside:"complementary",button:"button",datalist:"listbox",dd:"definition",details:"group",dialog:"dialog",dt:"term",fieldset:"group",figure:"figure",footer:p=>p.closest("article, aside, main, nav, section")?"generic":"contentinfo",form:p=>p.hasAttribute("aria-label")||p.hasAttribute("aria-labelledby")?"form":"generic",h1:"heading",h2:"heading",h3:"heading",h4:"heading",h5:"heading",h6:"heading",header:p=>p.closest("article, aside, main, nav, section")?"generic":"banner",hr:"separator",img:p=>p.getAttribute("alt")===""?"presentation":"img",li:"listitem",main:"main",math:"math",menu:"list",meter:"meter",nav:"navigation",ol:"list",optgroup:"group",option:"option",output:"status",p:"paragraph",progress:"progressbar",search:"search",section:p=>p.hasAttribute("aria-label")||p.hasAttribute("aria-labelledby")?"region":"generic",select:p=>{const e=p;return e.hasAttribute("multiple")||e.size&&e.size>1?"listbox":"combobox"},table:"table",tbody:"rowgroup",td:"cell",textarea:"textbox",tfoot:"rowgroup",th:"columnheader",thead:"rowgroup",time:"time",tr:"row",ul:"list"};if(h==="input")return{button:"button",checkbox:"checkbox",email:"textbox",file:"button",image:"button",number:"spinbutton",radio:"radio",range:"slider",reset:"button",search:"searchbox",submit:"button",tel:"textbox",text:"textbox",url:"textbox"}[i||""]||"textbox";const g=m[h];return typeof g=="function"?g(r):g||"generic"}function U(r){const h=Z(r);return!h||(h==="none"||h==="presentation")&&Q(r)?X(r):h}window.__piElementMap||(window.__piElementMap={});let ee=0;function q(r,h,i){const m=r._piRef;if(m&&m.role===h&&m.name===i)return m.ref;const g=`e${++ee}`;return r._piRef={role:h,name:i,ref:g},g}function Y(){const r=[];return document.querySelectorAll('[role="dialog"], [role="alertdialog"], dialog[open]').forEach(i=>{var s,c;const m=window.getComputedStyle(i);if(!(m.display!=="none"&&m.visibility!=="hidden"&&m.opacity!=="0"&&i.offsetWidth>0&&i.offsetHeight>0))return;const p=i.getAttribute("role")||"dialog";let e=i.getAttribute("aria-label")||((c=(s=i.querySelector('[role="heading"], h1, h2, h3'))==null?void 0:s.textContent)==null?void 0:c.trim())||"Dialog";e.length>100&&(e=e.substring(0,100)+"..."),r.push({type:p,description:`${p}: ${e}`,clearedBy:"computer(action=key, text=Escape)"})}),r}const j={wait(r){return new Promise(h=>setTimeout(h,r))},async waitForSelector(r,h={}){const{state:i="visible",timeout:m=2e4}=h,g=e=>{if(!e)return!1;const s=window.getComputedStyle(e);return s.display!=="none"&&s.visibility!=="hidden"&&s.opacity!=="0"&&e.offsetWidth>0&&e.offsetHeight>0},p=()=>{const e=document.querySelector(r);switch(i){case"attached":return e;case"detached":return e?null:document.body;case"hidden":return e?g(e)?null:e:document.body;case"visible":default:return g(e)?e:null}};return new Promise((e,s)=>{const c=p();if(c){e(i==="detached"||i==="hidden"?null:c);return}const a=new MutationObserver(()=>{const u=p();u&&(a.disconnect(),clearTimeout(w),e(i==="detached"||i==="hidden"?null:u))}),w=setTimeout(()=>{a.disconnect(),s(new Error(`Timeout waiting for "${r}" to be ${i}`))},m);a.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["style","class","hidden"]})})},async waitForText(r,h={}){const{selector:i,timeout:m=2e4}=h,g=()=>{var s;const p=i?document.querySelector(i):document.body;if(!p)return null;const e=document.createTreeWalker(p,NodeFilter.SHOW_TEXT);for(;e.nextNode();)if((s=e.currentNode.textContent)!=null&&s.includes(r))return e.currentNode.parentElement;return null};return new Promise((p,e)=>{const s=g();if(s){p(s);return}const c=new MutationObserver(()=>{const w=g();w&&(c.disconnect(),clearTimeout(a),p(w))}),a=setTimeout(()=>{c.disconnect(),e(new Error(`Timeout waiting for text "${r}"`))},m);c.observe(document.documentElement,{childList:!0,subtree:!0,characterData:!0})})},async waitForHidden(r,h=2e4){await j.waitForSelector(r,{state:"hidden",timeout:h})},getByRole(r,h={}){var s,c,a,w;const{name:i}=h,m={button:["button",'input[type="button"]','input[type="submit"]','input[type="reset"]'],link:["a[href]"],textbox:["input:not([type])",'input[type="text"]','input[type="email"]','input[type="password"]','input[type="search"]','input[type="tel"]','input[type="url"]',"textarea"],checkbox:['input[type="checkbox"]'],radio:['input[type="radio"]'],combobox:["select"],heading:["h1","h2","h3","h4","h5","h6"],list:["ul","ol"],listitem:["li"],navigation:["nav"],main:["main"],banner:["header"],contentinfo:["footer"],form:["form"],img:["img"],table:["table"]},g=[];g.push(...document.querySelectorAll(`[role="${r}"]`));const p=m[r];if(p)for(const u of p)g.push(...document.querySelectorAll(`${u}:not([role])`));if(!i)return g[0]||null;const e=i.toLowerCase().trim();for(const u of g){const f=(s=u.getAttribute("aria-label"))==null?void 0:s.toLowerCase().trim(),b=(c=u.textContent)==null?void 0:c.toLowerCase().trim(),l=(a=u.getAttribute("title"))==null?void 0:a.toLowerCase().trim(),t=(w=u.getAttribute("placeholder"))==null?void 0:w.toLowerCase().trim();if(f===e||b===e||l===e||t===e||f!=null&&f.includes(e)||b!=null&&b.includes(e))return u}return null}};window.__piHelpers||(window.__piHelpers=j,window.piHelpers=j);function H(){return window.__piElementMap}function B(r="interactive",h=15,i,m=!1,g=!1){try{let p=function(n){return U(n)},e=function(n){var F,W;const d=n.tagName.toLowerCase(),_=n.getAttribute("aria-labelledby");if(_){const E=_.split(/\s+/).map(C=>{var P;const I=document.getElementById(C);return((P=I==null?void 0:I.textContent)==null?void 0:P.trim())||""}).filter(Boolean);if(E.length){const C=E.join(" ");return C.length>100?C.substring(0,100)+"...":C}}if(d==="select"){const E=n,C=E.querySelector("option[selected]")||(E.selectedIndex>=0?E.options[E.selectedIndex]:null);if((F=C==null?void 0:C.textContent)!=null&&F.trim())return C.textContent.trim()}const $=n.getAttribute("aria-label");if($!=null&&$.trim())return $.trim();const M=n.getAttribute("placeholder");if(M!=null&&M.trim())return M.trim();const O=n.getAttribute("title");if(O!=null&&O.trim())return O.trim();const T=n.getAttribute("alt");if(T!=null&&T.trim())return T.trim();if(n.id){const E=document.querySelector(`label[for="${n.id}"]`);if((W=E==null?void 0:E.textContent)!=null&&W.trim())return E.textContent.trim()}if(d==="input"){const E=n,C=n.getAttribute("type")||"",I=n.getAttribute("value");if(C==="submit"&&(I!=null&&I.trim()))return I.trim();if(E.value&&E.value.length<50&&E.value.trim())return E.value.trim()}if(["button","a","summary"].includes(d)){let E="";for(const C of n.childNodes)C.nodeType===Node.TEXT_NODE&&(E+=C.textContent);if(E.trim())return E.trim()}if(/^h[1-6]$/.test(d)){const E=n.textContent;if(E!=null&&E.trim()){const C=E.trim();return C.length>100?C.substring(0,100)+"...":C}}if(d==="img")return"";let N="";for(const E of n.childNodes)E.nodeType===Node.TEXT_NODE&&(N+=E.textContent);if(N!=null&&N.trim()&&N.trim().length>=3){const E=N.trim();return E.length>100?E.substring(0,100)+"...":E}return""},s=function(n){const d={},_=n.getAttribute("aria-checked");_==="true"?d.checked=!0:_==="false"?d.checked=!1:_==="mixed"?d.checked="mixed":n instanceof HTMLInputElement&&(n.type==="checkbox"||n.type==="radio")&&(n.type==="checkbox"&&n.indeterminate?d.checked="mixed":d.checked=n.checked);const $=n instanceof HTMLButtonElement||n instanceof HTMLInputElement||n instanceof HTMLSelectElement||n instanceof HTMLTextAreaElement;(n.getAttribute("aria-disabled")==="true"||$&&n.disabled||n.closest("fieldset:disabled"))&&(d.disabled=!0);const M=n.getAttribute("aria-expanded");M==="true"?d.expanded=!0:M==="false"&&(d.expanded=!1);const O=n.getAttribute("aria-pressed");O==="true"?d.pressed=!0:O==="false"?d.pressed=!1:O==="mixed"&&(d.pressed="mixed");const T=n.getAttribute("aria-selected");T==="true"?d.selected=!0:T==="false"&&(d.selected=!1);const N=n.getAttribute("aria-current");N&&N!=="false"&&(d.active=!0);const F=n.tagName.toLowerCase();if(/^h[1-6]$/.test(F))d.level=parseInt(F[1],10);else{const W=n.getAttribute("aria-level");W&&(d.level=parseInt(W,10))}return d},c=function(n){const d=[];return n.checked!==void 0&&d.push(n.checked==="mixed"?"[checked=mixed]":n.checked?"[checked]":"[unchecked]"),n.disabled&&d.push("[disabled]"),n.expanded!==void 0&&d.push(n.expanded?"[expanded]":"[collapsed]"),n.pressed!==void 0&&d.push(n.pressed==="mixed"?"[pressed=mixed]":n.pressed?"[pressed]":"[not-pressed]"),n.selected!==void 0&&d.push(n.selected?"[selected]":"[not-selected]"),n.active&&d.push("[active]"),n.level!==void 0&&d.push(`[level=${n.level}]`),d.join(" ")},a=function(n){const d=window.getComputedStyle(n);return d.display!=="none"&&d.visibility!=="hidden"&&d.opacity!=="0"&&n.offsetWidth>0&&n.offsetHeight>0},w=function(n){const d=n.tagName.toLowerCase();return["a","button","input","select","textarea","details","summary"].includes(d)||n.hasAttribute("onclick")||n.hasAttribute("tabindex")||n.getAttribute("role")==="button"||n.getAttribute("role")==="link"||n.getAttribute("contenteditable")==="true"},u=function(n){const d=n.tagName.toLowerCase();return["h1","h2","h3","h4","h5","h6","nav","main","header","footer","section","article","aside"].includes(d)||n.hasAttribute("role")},f=function(n){return window.getComputedStyle(n).cursor==="pointer"},b=function(n,d){const _=n.tagName.toLowerCase();if(["script","style","meta","link","title","noscript"].includes(_)||d.filter!=="all"&&n.getAttribute("aria-hidden")==="true"||d.filter!=="all"&&!a(n))return!1;if(d.filter!=="all"&&!d.refId){const M=n.getBoundingClientRect();if(!(M.top<window.innerHeight&&M.bottom>0&&M.left<window.innerWidth&&M.right>0))return!1}if(d.filter==="interactive")return w(n);if(w(n)||u(n)||e(n).length>0)return!0;const $=p(n);return d.compact&&new Set(["generic","group","region","article","section","complementary"]).has($)&&e(n).length===0?!1:$!=="generic"&&$!=="img"},l=function(n,d){const _=[],$={filter:r,refId:i||null,compact:g},M=H(),O=b(n,$)||i&&d===0;if(O){const T=p(n),N=e(n),F=s(n),W=q(n,T,N);window.__piRefs[W]=n,M[W]={element:new WeakRef(n),role:T,name:N};let C=`${" ".repeat(d)}${T}`;if(N){const K=N.replace(/\s+/g," ").replace(/"/g,'\\"');C+=` "${K}"`}C+=` [${W}]`;const I=c(F);I&&(C+=` ${I}`),f(n)&&(C+=" [cursor=pointer]");const P=n.getAttribute("href");P&&(C+=` href="${P}"`);const G=n.getAttribute("type");G&&(C+=` type="${G}"`);const V=n.getAttribute("placeholder");V&&(C+=` placeholder="${V}"`),_.push(C)}if(d<h)for(const T of n.children)_.push(...l(T,O?d+1:d));return _},t=function(n){return n.replace(/\[e\d+\]/g,"[REF]")},o=function(n){const d=new Map;for(const _ of n){if(!_.trim())continue;const $=t(_);d.set($,(d.get($)||0)+1)}return d},y=function(n,d){const _=n.split(`
|
|
2
|
-
`),$=
|
|
3
|
-
`),M=o(
|
|
4
|
-
`),hasChanges:!0}};window.__piRefs={};const v=
|
|
5
|
-
`);if(
|
|
1
|
+
const J=new Set(["alert","alertdialog","application","article","banner","blockquote","button","caption","cell","checkbox","code","columnheader","combobox","complementary","contentinfo","definition","deletion","dialog","directory","document","emphasis","feed","figure","form","generic","grid","gridcell","group","heading","img","insertion","link","list","listbox","listitem","log","main","mark","marquee","math","menu","menubar","menuitem","menuitemcheckbox","menuitemradio","meter","navigation","none","note","option","paragraph","presentation","progressbar","radio","radiogroup","region","row","rowgroup","rowheader","scrollbar","search","searchbox","separator","slider","spinbutton","status","strong","subscript","superscript","switch","tab","table","tablist","tabpanel","term","textbox","time","timer","toolbar","tooltip","tree","treegrid","treeitem"]);function Q(i){const m=i.tagName.toLowerCase();if(["button","input","select","textarea"].includes(m))return!i.disabled;if(m==="a"&&i.hasAttribute("href"))return!0;if(i.hasAttribute("tabindex")){const r=parseInt(i.getAttribute("tabindex")||"",10);return!isNaN(r)&&r>=0}return i.getAttribute("contenteditable")==="true"}function Z(i){const m=i.getAttribute("role");if(!m)return null;const r=m.split(/\s+/).filter(w=>w);for(const w of r)if(J.has(w))return w;return null}function X(i){const m=i.tagName.toLowerCase(),r=i.getAttribute("type"),w={a:g=>g.hasAttribute("href")?"link":"generic",article:"article",aside:"complementary",button:"button",datalist:"listbox",dd:"definition",details:"group",dialog:"dialog",dt:"term",fieldset:"group",figure:"figure",footer:g=>g.closest("article, aside, main, nav, section")?"generic":"contentinfo",form:g=>g.hasAttribute("aria-label")||g.hasAttribute("aria-labelledby")?"form":"generic",h1:"heading",h2:"heading",h3:"heading",h4:"heading",h5:"heading",h6:"heading",header:g=>g.closest("article, aside, main, nav, section")?"generic":"banner",hr:"separator",img:g=>g.getAttribute("alt")===""?"presentation":"img",li:"listitem",main:"main",math:"math",menu:"list",meter:"meter",nav:"navigation",ol:"list",optgroup:"group",option:"option",output:"status",p:"paragraph",progress:"progressbar",search:"search",section:g=>g.hasAttribute("aria-label")||g.hasAttribute("aria-labelledby")?"region":"generic",select:g=>{const e=g;return e.hasAttribute("multiple")||e.size&&e.size>1?"listbox":"combobox"},table:"table",tbody:"rowgroup",td:"cell",textarea:"textbox",tfoot:"rowgroup",th:"columnheader",thead:"rowgroup",time:"time",tr:"row",ul:"list"};if(m==="input")return{button:"button",checkbox:"checkbox",email:"textbox",file:"button",image:"button",number:"spinbutton",radio:"radio",range:"slider",reset:"button",search:"searchbox",submit:"button",tel:"textbox",text:"textbox",url:"textbox"}[r||""]||"textbox";const y=w[m];return typeof y=="function"?y(i):y||"generic"}function U(i){const m=Z(i);return!m||(m==="none"||m==="presentation")&&Q(i)?X(i):m}window.__piElementMap||(window.__piElementMap={});let ee=0;function q(i,m,r){const w=i._piRef;if(w&&w.role===m&&w.name===r)return w.ref;const y=`e${++ee}`;return i._piRef={role:m,name:r,ref:y},y}function Y(){const i=[];return document.querySelectorAll('[role="dialog"], [role="alertdialog"], dialog[open]').forEach(r=>{var c,l;const w=window.getComputedStyle(r);if(!(w.display!=="none"&&w.visibility!=="hidden"&&w.opacity!=="0"&&r.offsetWidth>0&&r.offsetHeight>0))return;const g=r.getAttribute("role")||"dialog";let e=r.getAttribute("aria-label")||((l=(c=r.querySelector('[role="heading"], h1, h2, h3'))==null?void 0:c.textContent)==null?void 0:l.trim())||"Dialog";e.length>100&&(e=e.substring(0,100)+"..."),i.push({type:g,description:`${g}: ${e}`,clearedBy:"computer(action=key, text=Escape)"})}),i}const j={wait(i){return new Promise(m=>setTimeout(m,i))},async waitForSelector(i,m={}){const{state:r="visible",timeout:w=2e4}=m,y=e=>{if(!e)return!1;const c=window.getComputedStyle(e);return c.display!=="none"&&c.visibility!=="hidden"&&c.opacity!=="0"&&e.offsetWidth>0&&e.offsetHeight>0},g=()=>{const e=document.querySelector(i);switch(r){case"attached":return e;case"detached":return e?null:document.body;case"hidden":return e?y(e)?null:e:document.body;case"visible":default:return y(e)?e:null}};return new Promise((e,c)=>{const l=g();if(l){e(r==="detached"||r==="hidden"?null:l);return}const s=new MutationObserver(()=>{const u=g();u&&(s.disconnect(),clearTimeout(d),e(r==="detached"||r==="hidden"?null:u))}),d=setTimeout(()=>{s.disconnect(),c(new Error(`Timeout waiting for "${i}" to be ${r}`))},w);s.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["style","class","hidden"]})})},async waitForText(i,m={}){const{selector:r,timeout:w=2e4}=m,y=()=>{var c;const g=r?document.querySelector(r):document.body;if(!g)return null;const e=document.createTreeWalker(g,NodeFilter.SHOW_TEXT);for(;e.nextNode();)if((c=e.currentNode.textContent)!=null&&c.includes(i))return e.currentNode.parentElement;return null};return new Promise((g,e)=>{const c=y();if(c){g(c);return}const l=new MutationObserver(()=>{const d=y();d&&(l.disconnect(),clearTimeout(s),g(d))}),s=setTimeout(()=>{l.disconnect(),e(new Error(`Timeout waiting for text "${i}"`))},w);l.observe(document.documentElement,{childList:!0,subtree:!0,characterData:!0})})},async waitForHidden(i,m=2e4){await j.waitForSelector(i,{state:"hidden",timeout:m})},getByRole(i,m={}){var c,l,s,d;const{name:r}=m,w={button:["button",'input[type="button"]','input[type="submit"]','input[type="reset"]'],link:["a[href]"],textbox:["input:not([type])",'input[type="text"]','input[type="email"]','input[type="password"]','input[type="search"]','input[type="tel"]','input[type="url"]',"textarea"],checkbox:['input[type="checkbox"]'],radio:['input[type="radio"]'],combobox:["select"],heading:["h1","h2","h3","h4","h5","h6"],list:["ul","ol"],listitem:["li"],navigation:["nav"],main:["main"],banner:["header"],contentinfo:["footer"],form:["form"],img:["img"],table:["table"]},y=[];y.push(...document.querySelectorAll(`[role="${i}"]`));const g=w[i];if(g)for(const u of g)y.push(...document.querySelectorAll(`${u}:not([role])`));if(!r)return y[0]||null;const e=r.toLowerCase().trim();for(const u of y){const h=(c=u.getAttribute("aria-label"))==null?void 0:c.toLowerCase().trim(),b=(l=u.textContent)==null?void 0:l.toLowerCase().trim(),a=(s=u.getAttribute("title"))==null?void 0:s.toLowerCase().trim(),t=(d=u.getAttribute("placeholder"))==null?void 0:d.toLowerCase().trim();if(h===e||b===e||a===e||t===e||h!=null&&h.includes(e)||b!=null&&b.includes(e))return u}return null}};window.__piHelpers||(window.__piHelpers=j,window.piHelpers=j);function O(){return window.__piElementMap}function B(i="interactive",m=15,r,w=!1,y=!1){try{let g=function(n){return U(n)},e=function(n){var R,F;const f=n.tagName.toLowerCase(),k=n.getAttribute("aria-labelledby");if(k){const E=k.split(/\s+/).map(C=>{var P;const I=document.getElementById(C);return((P=I==null?void 0:I.textContent)==null?void 0:P.trim())||""}).filter(Boolean);if(E.length){const C=E.join(" ");return C.length>100?C.substring(0,100)+"...":C}}if(f==="select"){const E=n,C=E.querySelector("option[selected]")||(E.selectedIndex>=0?E.options[E.selectedIndex]:null);if((R=C==null?void 0:C.textContent)!=null&&R.trim())return C.textContent.trim()}const $=n.getAttribute("aria-label");if($!=null&&$.trim())return $.trim();const M=n.getAttribute("placeholder");if(M!=null&&M.trim())return M.trim();const H=n.getAttribute("title");if(H!=null&&H.trim())return H.trim();const T=n.getAttribute("alt");if(T!=null&&T.trim())return T.trim();if(n.id){const E=document.querySelector(`label[for="${n.id}"]`);if((F=E==null?void 0:E.textContent)!=null&&F.trim())return E.textContent.trim()}if(f==="input"){const E=n,C=n.getAttribute("type")||"",I=n.getAttribute("value");if(C==="submit"&&(I!=null&&I.trim()))return I.trim();if(E.value&&E.value.length<50&&E.value.trim())return E.value.trim()}if(["button","a","summary"].includes(f)){let E="";for(const C of n.childNodes)C.nodeType===Node.TEXT_NODE&&(E+=C.textContent);if(E.trim())return E.trim()}if(/^h[1-6]$/.test(f)){const E=n.textContent;if(E!=null&&E.trim()){const C=E.trim();return C.length>100?C.substring(0,100)+"...":C}}if(f==="img")return"";let N="";for(const E of n.childNodes)E.nodeType===Node.TEXT_NODE&&(N+=E.textContent);if(N!=null&&N.trim()&&N.trim().length>=3){const E=N.trim();return E.length>100?E.substring(0,100)+"...":E}return""},c=function(n){const f={},k=n.getAttribute("aria-checked");k==="true"?f.checked=!0:k==="false"?f.checked=!1:k==="mixed"?f.checked="mixed":n instanceof HTMLInputElement&&(n.type==="checkbox"||n.type==="radio")&&(n.type==="checkbox"&&n.indeterminate?f.checked="mixed":f.checked=n.checked);const $=n instanceof HTMLButtonElement||n instanceof HTMLInputElement||n instanceof HTMLSelectElement||n instanceof HTMLTextAreaElement;(n.getAttribute("aria-disabled")==="true"||$&&n.disabled||n.closest("fieldset:disabled"))&&(f.disabled=!0);const M=n.getAttribute("aria-expanded");M==="true"?f.expanded=!0:M==="false"&&(f.expanded=!1);const H=n.getAttribute("aria-pressed");H==="true"?f.pressed=!0:H==="false"?f.pressed=!1:H==="mixed"&&(f.pressed="mixed");const T=n.getAttribute("aria-selected");T==="true"?f.selected=!0:T==="false"&&(f.selected=!1);const N=n.getAttribute("aria-current");N&&N!=="false"&&(f.active=!0);const R=n.tagName.toLowerCase();if(/^h[1-6]$/.test(R))f.level=parseInt(R[1],10);else{const F=n.getAttribute("aria-level");F&&(f.level=parseInt(F,10))}return f},l=function(n){const f=[];return n.checked!==void 0&&f.push(n.checked==="mixed"?"[checked=mixed]":n.checked?"[checked]":"[unchecked]"),n.disabled&&f.push("[disabled]"),n.expanded!==void 0&&f.push(n.expanded?"[expanded]":"[collapsed]"),n.pressed!==void 0&&f.push(n.pressed==="mixed"?"[pressed=mixed]":n.pressed?"[pressed]":"[not-pressed]"),n.selected!==void 0&&f.push(n.selected?"[selected]":"[not-selected]"),n.active&&f.push("[active]"),n.level!==void 0&&f.push(`[level=${n.level}]`),f.join(" ")},s=function(n){const f=window.getComputedStyle(n);return f.display!=="none"&&f.visibility!=="hidden"&&f.opacity!=="0"&&n.offsetWidth>0&&n.offsetHeight>0},d=function(n){const f=n.tagName.toLowerCase();return["a","button","input","select","textarea","details","summary"].includes(f)||n.hasAttribute("onclick")||n.hasAttribute("tabindex")||n.getAttribute("role")==="button"||n.getAttribute("role")==="link"||n.getAttribute("contenteditable")==="true"},u=function(n){const f=n.tagName.toLowerCase();return["h1","h2","h3","h4","h5","h6","nav","main","header","footer","section","article","aside"].includes(f)||n.hasAttribute("role")},h=function(n){return window.getComputedStyle(n).cursor==="pointer"},b=function(n,f){const k=n.tagName.toLowerCase();if(["script","style","meta","link","title","noscript"].includes(k)||f.filter!=="all"&&n.getAttribute("aria-hidden")==="true"||f.filter!=="all"&&!s(n))return!1;if(f.filter!=="all"&&!f.refId){const M=n.getBoundingClientRect();if(!(M.top<window.innerHeight&&M.bottom>0&&M.left<window.innerWidth&&M.right>0))return!1}if(f.filter==="interactive")return d(n);if(d(n)||u(n)||e(n).length>0)return!0;const $=g(n);return f.compact&&new Set(["generic","group","region","article","section","complementary"]).has($)&&e(n).length===0?!1:$!=="generic"&&$!=="img"},a=function(n,f){const k=[],$={filter:i,refId:r||null,compact:y},M=O(),H=b(n,$)||r&&f===0;if(H){const T=g(n),N=e(n),R=c(n),F=q(n,T,N);window.__piRefs[F]=n,M[F]={element:new WeakRef(n),role:T,name:N};let C=`${" ".repeat(f)}${T}`;if(N){const K=N.replace(/\s+/g," ").replace(/"/g,'\\"');C+=` "${K}"`}C+=` [${F}]`;const I=l(R);I&&(C+=` ${I}`),h(n)&&(C+=" [cursor=pointer]");const P=n.getAttribute("href");P&&(C+=` href="${P}"`);const G=n.getAttribute("type");G&&(C+=` type="${G}"`);const V=n.getAttribute("placeholder");V&&(C+=` placeholder="${V}"`),k.push(C)}if(f<m)for(const T of n.children)k.push(...a(T,H?f+1:f));return k},t=function(n){return n.replace(/\[e\d+\]/g,"[REF]")},o=function(n){const f=new Map;for(const k of n){if(!k.trim())continue;const $=t(k);f.set($,(f.get($)||0)+1)}return f},p=function(n,f){const k=n.split(`
|
|
2
|
+
`),$=f.split(`
|
|
3
|
+
`),M=o(k),H=o($),T=[],N=[];for(const E of $){if(!E.trim())continue;const C=t(E),I=M.get(C)||0;(H.get(C)||0)>I&&(T.push(E),M.set(C,I+1))}const R=o(k);for(const E of k){if(!E.trim())continue;const C=t(E),I=R.get(C)||0,P=H.get(C)||0;I>P&&(N.push(E),R.set(C,I-1))}if(T.length===0&&N.length===0)return{diff:"[NO CHANGES]",hasChanges:!1};const F=[];return N.length>0&&F.push(...N.map(E=>`- ${E}`)),T.length>0&&F.push(...T.map(E=>`+ ${E}`)),{diff:F.join(`
|
|
4
|
+
`),hasChanges:!0}};window.__piRefs={};const v=O();let _=null;if(r){const n=v[r];if(!n)return{error:`Element with ref_id '${r}' not found. Use read_page without ref_id to get current elements.`,pageContent:"",viewport:{width:window.innerWidth,height:window.innerHeight}};const f=n.element.deref();if(!f)return delete v[r],{error:`Element with ref_id '${r}' no longer exists. Use read_page without ref_id to get current elements.`,pageContent:"",viewport:{width:window.innerWidth,height:window.innerHeight}};_=f}else _=document.body;const S=_?a(_,0):[];for(const n of Object.keys(v))v[n].element.deref()||delete v[n];const A=S.join(`
|
|
5
|
+
`);if(A.length>5e4)return{error:`Output exceeds 50000 character limit (${A.length} characters). Try using filter="interactive" or specify a ref_id.`,pageContent:"",viewport:{width:window.innerWidth,height:window.innerHeight}};const L=Y();let D,W=!1;const x=window.__piLastSnapshot;return!w&&!r&&x&&Date.now()-x.timestamp<5e3&&(D=p(x.content,A).diff,W=!0),window.__piLastSnapshot={content:A,timestamp:Date.now()},{pageContent:A+`
|
|
6
6
|
|
|
7
|
-
[Viewport: ${window.innerWidth}x${window.innerHeight}]`,diff:
|
|
8
|
-
`);return
|
|
7
|
+
[Viewport: ${window.innerWidth}x${window.innerHeight}]`,diff:W?D:void 0,viewport:{width:window.innerWidth,height:window.innerHeight},modalStates:L.length>0?L:void 0,modalLimitations:"Only custom modals ([role=dialog]) detected. Native alert/confirm/prompt dialogs and system file choosers cannot be detected from content scripts.",isIncremental:W}}catch(g){return{error:`Error generating accessibility tree: ${g instanceof Error?g.message:"Unknown error"}`,pageContent:"",viewport:{width:window.innerWidth,height:window.innerHeight}}}}function z(i){return i.length?/[\n\r]/.test(i)||/^[\s]/.test(i)||/[\s]$/.test(i)||/[:"{}[\]]/.test(i)?'"'+i.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r")+'"':i:'""'}function te(i="interactive",m=15){try{let r=function(t){return U(t)},w=function(t){var D,W;const o=t.tagName.toLowerCase(),p=t.getAttribute("aria-labelledby");if(p){const x=p.split(/\s+/).map(n=>{var k;const f=document.getElementById(n);return((k=f==null?void 0:f.textContent)==null?void 0:k.trim())||""}).filter(Boolean);if(x.length){const n=x.join(" ");return n.length>100?n.substring(0,100)+"...":n}}if(o==="select"){const x=t,n=x.querySelector("option[selected]")||(x.selectedIndex>=0?x.options[x.selectedIndex]:null);if((D=n==null?void 0:n.textContent)!=null&&D.trim())return n.textContent.trim()}const v=t.getAttribute("aria-label");if(v!=null&&v.trim())return v.trim();const _=t.getAttribute("placeholder");if(_!=null&&_.trim())return _.trim();const S=t.getAttribute("title");if(S!=null&&S.trim())return S.trim();const A=t.getAttribute("alt");if(A!=null&&A.trim())return A.trim();if(t.id){const x=document.querySelector(`label[for="${t.id}"]`);if((W=x==null?void 0:x.textContent)!=null&&W.trim())return x.textContent.trim()}if(o==="input"){const x=t,n=t.getAttribute("type")||"",f=t.getAttribute("value");if(n==="submit"&&(f!=null&&f.trim()))return f.trim();if(x.value&&x.value.length<50&&x.value.trim())return x.value.trim()}if(["button","a","summary"].includes(o)){let x="";for(const n of t.childNodes)n.nodeType===Node.TEXT_NODE&&(x+=n.textContent);if(x.trim())return x.trim()}if(/^h[1-6]$/.test(o)){const x=t.textContent;if(x!=null&&x.trim()){const n=x.trim();return n.length>100?n.substring(0,100)+"...":n}}if(o==="img")return"";let L="";for(const x of t.childNodes)x.nodeType===Node.TEXT_NODE&&(L+=x.textContent);if(L!=null&&L.trim()&&L.trim().length>=3){const x=L.trim();return x.length>100?x.substring(0,100)+"...":x}return""},y=function(t){const o={},p=t.getAttribute("aria-checked");p==="true"?o.checked=!0:p==="false"?o.checked=!1:p==="mixed"?o.checked="mixed":t instanceof HTMLInputElement&&(t.type==="checkbox"||t.type==="radio")&&(t.type==="checkbox"&&t.indeterminate?o.checked="mixed":o.checked=t.checked);const v=t instanceof HTMLButtonElement||t instanceof HTMLInputElement||t instanceof HTMLSelectElement||t instanceof HTMLTextAreaElement;(t.getAttribute("aria-disabled")==="true"||v&&t.disabled||t.closest("fieldset:disabled"))&&(o.disabled=!0);const _=t.getAttribute("aria-expanded");_==="true"?o.expanded=!0:_==="false"&&(o.expanded=!1);const S=t.getAttribute("aria-pressed");S==="true"?o.pressed=!0:S==="false"?o.pressed=!1:S==="mixed"&&(o.pressed="mixed");const A=t.getAttribute("aria-selected");A==="true"?o.selected=!0:A==="false"&&(o.selected=!1);const L=t.getAttribute("aria-current");L&&L!=="false"&&(o.active=!0);const D=t.tagName.toLowerCase();if(/^h[1-6]$/.test(D))o.level=parseInt(D[1],10);else{const W=t.getAttribute("aria-level");W&&(o.level=parseInt(W,10))}return o},g=function(t){const o=[];return t.checked!==void 0&&o.push(t.checked==="mixed"?"[checked=mixed]":t.checked?"[checked]":"[unchecked]"),t.disabled&&o.push("[disabled]"),t.expanded!==void 0&&o.push(t.expanded?"[expanded]":"[collapsed]"),t.pressed!==void 0&&o.push(t.pressed==="mixed"?"[pressed=mixed]":t.pressed?"[pressed]":"[not-pressed]"),t.selected!==void 0&&o.push(t.selected?"[selected]":"[not-selected]"),t.active&&o.push("[active]"),t.level!==void 0&&o.push(`[level=${t.level}]`),o.join(" ")},e=function(t){const o=window.getComputedStyle(t);return o.display!=="none"&&o.visibility!=="hidden"&&o.opacity!=="0"&&t.offsetWidth>0&&t.offsetHeight>0},c=function(t){const o=t.tagName.toLowerCase();return["a","button","input","select","textarea","details","summary"].includes(o)||t.hasAttribute("onclick")||t.hasAttribute("tabindex")||t.getAttribute("role")==="button"||t.getAttribute("role")==="link"||t.getAttribute("contenteditable")==="true"},l=function(t){const o=t.tagName.toLowerCase();return["h1","h2","h3","h4","h5","h6","nav","main","header","footer","section","article","aside"].includes(o)||t.hasAttribute("role")},s=function(t){return window.getComputedStyle(t).cursor==="pointer"},d=function(t,o,p,v){let _=t;o&&(_+=" "+z(o));const S=q(p,t,o);window.__piRefs[S]=p,_+=` [ref=${S}]`;const A=g(v);return A&&(_+=` ${A}`),s(p)&&(_+=" [cursor=pointer]"),_},u=function(t){const o={},p=t.getAttribute("href");p&&(o.url=p);const v=t.getAttribute("placeholder");return v&&(o.placeholder=v),o},h=function(t,o,p){if(o>m)return;const v=t.tagName.toLowerCase();if(["script","style","meta","link","title","noscript"].includes(v)||i!=="all"&&t.getAttribute("aria-hidden")==="true"||i!=="all"&&!e(t))return;if(i!=="all"){const n=t.getBoundingClientRect();if(!(n.top<window.innerHeight&&n.bottom>0&&n.left<window.innerWidth&&n.right>0))return}const _=r(t),S=w(t),A=y(t),L=c(t),D=l(t),W=S.length>0;let x;if(i==="interactive"?x=L:i==="all"?x=!0:x=L||D||W||_!=="generic"&&_!=="img",x){const n=" ".repeat(o),f=d(_,S,t,A),k=u(t),$=[];for(const T of t.children)$.push(T);const M=$.length>0,H=Object.keys(k).length>0;if(!M&&!H)b.push(`${n}- ${f}`);else{b.push(`${n}- ${f}:`);for(const[T,N]of Object.entries(k))b.push(`${n} - /${T}: ${z(N)}`);for(const T of $)h(T,o+1,!0)}}else for(const n of t.children)h(n,o,p)};window.__piRefs={};const b=[];h(document.body,0,!1);const a=b.join(`
|
|
8
|
+
`);return a.length>5e4?{error:`Output exceeds 50000 character limit (${a.length} characters). Try using filter="interactive".`,yaml:"",viewport:{width:window.innerWidth,height:window.innerHeight}}:{yaml:a+`
|
|
9
9
|
|
|
10
|
-
[Viewport: ${window.innerWidth}x${window.innerHeight}]`,viewport:{width:window.innerWidth,height:window.innerHeight}}}catch(i){return{error:`Error generating YAML tree: ${i instanceof Error?i.message:"Unknown error"}`,yaml:"",viewport:{width:window.innerWidth,height:window.innerHeight}}}}function ne(r){const h=H(),i=h[r];let m;if(i&&(m=i.element.deref(),m||delete h[r]),!m&&window.__piRefs&&(m=window.__piRefs[r]),!m)return{x:0,y:0,error:`Element ${r} not found. Use read_page to get current elements.`};const g=m.getBoundingClientRect(),p=Math.round(g.left+g.width/2),e=Math.round(g.top+g.height/2);return{x:p,y:e}}function re(r,h){var e;const i=H(),m=i[r];let g;if(m&&(g=m.element.deref(),g||delete i[r]),!g&&window.__piRefs&&(g=window.__piRefs[r]),!g)return{success:!1,error:`Element ${r} not found. Use read_page to get current elements.`};const p=g.tagName.toLowerCase();try{if(p==="input"){const s=g,c=s.type.toLowerCase();c==="checkbox"||c==="radio"?(s.checked=!!h,s.dispatchEvent(new Event("change",{bubbles:!0}))):(s.value=String(h),s.dispatchEvent(new Event("input",{bubbles:!0})),s.dispatchEvent(new Event("change",{bubbles:!0})))}else if(p==="textarea"){const s=g;s.value=String(h),s.dispatchEvent(new Event("input",{bubbles:!0})),s.dispatchEvent(new Event("change",{bubbles:!0}))}else if(p==="select"){const s=g,c=String(h);let a=!1;for(const w of s.options)if(w.value===c||((e=w.textContent)==null?void 0:e.trim())===c){s.value=w.value,a=!0;break}if(!a)return{success:!1,error:`Option "${h}" not found in select element ${r}`};s.dispatchEvent(new Event("change",{bubbles:!0}))}else if(g.getAttribute("contenteditable")==="true")g.textContent=String(h),g.dispatchEvent(new Event("input",{bubbles:!0}));else return{success:!1,error:`Element ${r} (${p}) is not a form field`};return{success:!0}}catch(s){return{success:!1,error:`Failed to set value: ${s instanceof Error?s.message:"Unknown error"}`}}}function ie(){var r;try{const h=document.querySelector("article"),i=document.querySelector("main");return{text:((r=(h||i||document.body).textContent)==null?void 0:r.replace(/\s+/g," ").trim().substring(0,5e4))||"",title:document.title,url:window.location.href}}catch(h){return{text:"",title:"",url:"",error:`Failed to extract text: ${h instanceof Error?h.message:"Unknown error"}`}}}function oe(r){const h=H(),i=h[r];let m;return i&&(m=i.element.deref(),m||delete h[r]),!m&&window.__piRefs&&(m=window.__piRefs[r]),m?(m.scrollIntoView({behavior:"smooth",block:"center"}),{success:!0}):{success:!1,error:`Element ${r} not found. Run read_page to get current element refs.`}}function se(r,h,i,m="screenshot.png"){try{const g=atob(r),p=new ArrayBuffer(g.length),e=new Uint8Array(p);for(let f=0;f<g.length;f++)e[f]=g.charCodeAt(f);const s=new Blob([p],{type:"image/png"}),c=new File([s],m,{type:"image/png"});let a=null;if(h){const f=H(),b=f[h];if(b&&(a=b.element.deref(),a||delete f[h]),!a&&window.__piRefs&&(a=window.__piRefs[h]),!a)return{success:!1,error:`Element ${h} not found. Run read_page to get current element refs.`}}else if(i&&(a=document.elementFromPoint(i[0],i[1]),!a))return{success:!1,error:`No element at (${i[0]}, ${i[1]})`};if(!a)return{success:!1,error:"No target element"};if(a.tagName==="INPUT"&&a.type==="file"){const f=a,b=new DataTransfer;return b.items.add(c),f.files=b.files,f.dispatchEvent(new Event("change",{bubbles:!0})),{success:!0}}const w=new DataTransfer;w.items.add(c);const u=new DragEvent("drop",{bubbles:!0,cancelable:!0,dataTransfer:w});return a.dispatchEvent(u),{success:!0}}catch(g){return{success:!1,error:g instanceof Error?g.message:"Upload failed"}}}chrome.runtime.onMessage.addListener((r,h,i)=>{var m,g,p;switch(r.type){case"GENERATE_ACCESSIBILITY_TREE":{const e=r.options||{};if(e.format==="yaml"){const s=te(e.filter||"interactive",e.depth??15),c=Y();s.error?i({error:s.error,pageContent:"",viewport:s.viewport}):i({pageContent:s.yaml,viewport:s.viewport,modalStates:c.length>0?c:void 0,modalLimitations:"Only custom modals ([role=dialog]) detected. Native alert/confirm/prompt dialogs and system file choosers cannot be detected from content scripts."})}else{const s=B(e.filter||"interactive",e.depth??15,e.refId,e.forceFullSnapshot??!1,e.compact??!1);i(s)}break}case"GET_ELEMENT_COORDINATES":{const e=ne(r.ref);i(e);break}case"CLICK_ELEMENT":{const e=H(),s=e[r.ref];let c;if(s&&(c=s.element.deref(),c||delete e[r.ref]),!c&&window.__piRefs&&(c=window.__piRefs[r.ref]),!c){i({error:`Element ${r.ref} not found. Use read_page to get current elements.`});break}if(r.button==="triple"){const a=new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window,detail:3});c.dispatchEvent(a)}else r.button==="double"?c.dispatchEvent(new MouseEvent("dblclick",{bubbles:!0,cancelable:!0,view:window})):r.button==="right"?c.dispatchEvent(new MouseEvent("contextmenu",{bubbles:!0,cancelable:!0,view:window})):c.click();i({success:!0});break}case"FORM_INPUT":{const e=re(r.ref,r.value);i(e);break}case"EVAL_IN_PAGE":{try{const e=document.createElement("script");e.textContent=`(function() { ${r.code} })();`,document.documentElement.appendChild(e),e.remove(),i({success:!0})}catch(e){i({success:!1,error:e instanceof Error?e.message:String(e)})}break}case"GET_PAGE_TEXT":{const e=ie();i(e);break}case"GET_FRAME_BY_SELECTOR":{try{const e=document.querySelector(r.selector);if(!e||e.tagName.toLowerCase()!=="iframe"){i({error:`No iframe found with selector "${r.selector}"`});break}i({url:e.src,name:e.name||void 0})}catch(e){i({error:e instanceof Error?e.message:String(e)})}break}case"GET_FRAME_NAME":{try{i({name:window.name||null})}catch{i({name:null})}break}case"LOCATE_ROLE":{try{const{role:e,name:s,all:c}=r,a=H(),u={button:["button",'input[type="button"]','input[type="submit"]','input[type="reset"]','[role="button"]'],link:["a[href]",'[role="link"]'],textbox:["input:not([type])",'input[type="text"]','input[type="email"]','input[type="password"]','input[type="search"]','input[type="tel"]','input[type="url"]',"textarea",'[role="textbox"]'],checkbox:['input[type="checkbox"]','[role="checkbox"]'],radio:['input[type="radio"]','[role="radio"]'],combobox:["select",'[role="combobox"]'],listbox:['[role="listbox"]',"select[multiple]"],option:["option",'[role="option"]'],heading:["h1","h2","h3","h4","h5","h6",'[role="heading"]'],navigation:["nav",'[role="navigation"]'],main:["main",'[role="main"]'],img:["img[alt]",'[role="img"]'],dialog:["dialog",'[role="dialog"]','[role="alertdialog"]'],tab:['[role="tab"]'],tabpanel:['[role="tabpanel"]'],menu:['[role="menu"]'],menuitem:['[role="menuitem"]']}[e]||[`[role="${e}"]`],f=[];for(const o of u)try{f.push(...document.querySelectorAll(o))}catch{}const b=f.filter(o=>{const y=window.getComputedStyle(o);return y.display!=="none"&&y.visibility!=="hidden"&&o.offsetWidth>0&&o.offsetHeight>0});let l=b;if(s){const o=s.toLowerCase();l=b.filter(y=>{var D,R,x,n,d;const v=(D=y.getAttribute("aria-label"))==null?void 0:D.toLowerCase(),A=(R=y.textContent)==null?void 0:R.trim().toLowerCase(),S=(x=y.getAttribute("title"))==null?void 0:x.toLowerCase(),k=(n=y.placeholder)==null?void 0:n.toLowerCase(),L=(d=y.value)==null?void 0:d.toLowerCase();return(v==null?void 0:v.includes(o))||(A==null?void 0:A.includes(o))||(S==null?void 0:S.includes(o))||(k==null?void 0:k.includes(o))||(L==null?void 0:L.includes(o))})}if(l.length===0){i({error:`No element found with role "${e}"${s?` and name "${s}"`:""}`});break}const t=l.map(o=>{var v;const y=q(o,e,s||"");return window.__piRefs=window.__piRefs||{},window.__piRefs[y]=o,a[y]={element:new WeakRef(o),role:e,name:s||""},{ref:y,text:(v=o.textContent)==null?void 0:v.trim().slice(0,50)}});i(c?{matches:t}:{ref:t[0].ref,text:t[0].text})}catch(e){i({error:e instanceof Error?e.message:String(e)})}break}case"LOCATE_TEXT":{try{const{text:e,exact:s}=r,c=H(),a=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT),w=[];for(;a.nextNode();){const l=a.currentNode.textContent||"";if(s?l.trim()===e:l.toLowerCase().includes(e.toLowerCase())){const o=a.currentNode.parentElement;if(o&&!w.includes(o)){const y=window.getComputedStyle(o);y.display!=="none"&&y.visibility!=="hidden"&&w.push(o)}}}if(w.length===0){i({error:`No element found with text "${e}"`});break}const u=w.sort((l,t)=>{var o,y;return(((o=l.textContent)==null?void 0:o.length)||0)-(((y=t.textContent)==null?void 0:y.length)||0)})[0],f=U(u),b=q(u,f,e);window.__piRefs=window.__piRefs||{},window.__piRefs[b]=u,c[b]={element:new WeakRef(u),role:f,name:e},i({ref:b,text:(m=u.textContent)==null?void 0:m.trim().slice(0,50)})}catch(e){i({error:e instanceof Error?e.message:String(e)})}break}case"LOCATE_LABEL":{try{const{label:e}=r,s=H(),c=document.querySelectorAll("label");let a=null;for(const f of c){const b=(g=f.textContent)==null?void 0:g.trim().toLowerCase();if(b!=null&&b.includes(e.toLowerCase())){const l=f.getAttribute("for");if(l&&(a=document.getElementById(l)),a||(a=f.querySelector("input, select, textarea")),a)break}}if(!a){const f=e.toLowerCase();a=document.querySelector(`input[aria-label*="${e}" i], input[placeholder*="${e}" i], textarea[aria-label*="${e}" i], textarea[placeholder*="${e}" i], select[aria-label*="${e}" i]`)}if(!a){i({error:`No form field found with label "${e}"`});break}const w=U(a),u=q(a,w,e);window.__piRefs=window.__piRefs||{},window.__piRefs[u]=a,s[u]={element:new WeakRef(a),role:w,name:e},i({ref:u,label:e})}catch(e){i({error:e instanceof Error?e.message:String(e)})}break}case"GET_ELEMENT_TEXT":{try{const{ref:e}=r,s=H(),c=s[e];let a;if(c&&(a=c.element.deref(),a||delete s[e]),!a&&window.__piRefs&&(a=window.__piRefs[e]),!a){i({error:`Element ${e} not found`});break}i({text:((p=a.textContent)==null?void 0:p.trim())||""})}catch(e){i({error:e instanceof Error?e.message:String(e)})}break}case"SCROLL_TO_ELEMENT":{const e=oe(r.ref);i(e);break}case"UPLOAD_IMAGE":{const e=se(r.base64,r.ref,r.coordinate,r.filename);i(e);break}case"WAIT_FOR_ELEMENT":{const{selector:e,state:s="visible",timeout:c=2e4}=r,a=Math.min(c,6e4),w=l=>{if(!l)return!1;const t=window.getComputedStyle(l);return t.display!=="none"&&t.visibility!=="hidden"&&t.opacity!=="0"&&l.offsetWidth>0&&l.offsetHeight>0},u=()=>{const l=document.querySelector(e);switch(s){case"attached":return!!l;case"detached":return!l;case"hidden":return!l||!w(l);case"visible":default:return w(l)}},f=Date.now();return new Promise(l=>{if(u()){l({success:!0,waited:Date.now()-f});return}const t=new MutationObserver(()=>{u()&&(t.disconnect(),clearTimeout(o),l({success:!0,waited:Date.now()-f}))}),o=setTimeout(()=>{t.disconnect(),l({success:!1,waited:Date.now()-f,error:`Timeout waiting for "${e}" to be ${s}`})},a);t.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["style","class","hidden","disabled"]})}).then(l=>{if(!l.success){i({error:l.error,waited:l.waited,pageContent:"",viewport:{width:window.innerWidth,height:window.innerHeight}});return}const t=B("interactive",15,void 0,!0);i({...t,waited:l.waited})}),!0}case"WAIT_FOR_URL":{const{pattern:e,timeout:s=2e4}=r,c=Math.min(s,6e4),a=f=>{if(e.includes("*")){const b=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"<<<GLOBSTAR>>>").replace(/\*/g,"[^/]*").replace(/<<<GLOBSTAR>>>/g,".*");return new RegExp(`^${b}$`).test(f)}return f.includes(e)},w=Date.now();return new Promise(f=>{if(a(window.location.href)){f({success:!0,waited:Date.now()-w});return}let b=!1;const l=()=>{b||a(window.location.href)&&(b=!0,clearInterval(t),clearTimeout(o),window.removeEventListener("popstate",l),window.removeEventListener("hashchange",l),f({success:!0,waited:Date.now()-w}))},t=setInterval(l,100),o=setTimeout(()=>{b||(b=!0,clearInterval(t),window.removeEventListener("popstate",l),window.removeEventListener("hashchange",l),f({success:!1,waited:Date.now()-w,error:`Timeout waiting for URL to match "${e}". Current: ${window.location.href}`}))},c);window.addEventListener("popstate",l),window.addEventListener("hashchange",l)}).then(f=>{if(!f.success){i({error:f.error,waited:f.waited,pageContent:"",viewport:{width:window.innerWidth,height:window.innerHeight}});return}const b=B("interactive",15,void 0,!0);i({...b,waited:f.waited})}),!0}case"WAIT_FOR_DOM_STABLE":{const{stable:e=100,timeout:s=5e3}=r,c=Math.min(s,3e4),a=Date.now();return new Promise(u=>{let f=Date.now(),b=!1;const l=()=>{if(b)return;Date.now()-f>=e&&(b=!0,t.disconnect(),clearTimeout(o),clearInterval(y),u({success:!0,waited:Date.now()-a}))},t=new MutationObserver(()=>{f=Date.now()}),o=setTimeout(()=>{b||(b=!0,t.disconnect(),clearInterval(y),u({success:!1,waited:Date.now()-a,error:`Timeout: DOM did not stabilize within ${c}ms`}))},c),y=setInterval(l,Math.max(10,Math.min(50,e/2)));t.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,characterData:!0}),l()}).then(u=>{if(!u.success){i({error:u.error,waited:u.waited,pageContent:"",viewport:{width:window.innerWidth,height:window.innerHeight}});return}const f=B("interactive",15,void 0,!0);i({...f,waited:u.waited})}),!0}case"FORM_FILL":{const{data:e}=r;if(!Array.isArray(e))return i({error:"data must be an array of {ref, value} pairs"}),!0;const s=H(),c=[];for(const w of e){const{ref:u,value:f}=w;if(!u){c.push({ref:u||"unknown",success:!1,error:"Missing ref"});continue}const b=s[u];if(!b){c.push({ref:u,success:!1,error:"Element not found (run page.read first)"});continue}const l=b.element.deref();if(!l){delete s[u],c.push({ref:u,success:!1,error:"Element no longer exists"});continue}try{if(l instanceof HTMLInputElement){const t=l.type.toLowerCase();if(t==="checkbox"||t==="radio"){const o=f===!0||f==="true"||f==="1"||f==="checked";l.checked=o,l.dispatchEvent(new Event("change",{bubbles:!0}))}else l.focus(),l.value=String(f),l.dispatchEvent(new Event("input",{bubbles:!0})),l.dispatchEvent(new Event("change",{bubbles:!0}));c.push({ref:u,success:!0})}else l instanceof HTMLTextAreaElement?(l.focus(),l.value=String(f),l.dispatchEvent(new Event("input",{bubbles:!0})),l.dispatchEvent(new Event("change",{bubbles:!0})),c.push({ref:u,success:!0})):l instanceof HTMLSelectElement?(l.value=String(f),l.dispatchEvent(new Event("change",{bubbles:!0})),c.push({ref:u,success:!0})):l.isContentEditable?(l.focus(),l.textContent=String(f),l.dispatchEvent(new Event("input",{bubbles:!0})),c.push({ref:u,success:!0})):c.push({ref:u,success:!1,error:"Element is not fillable"})}catch(t){c.push({ref:u,success:!1,error:t instanceof Error?t.message:String(t)})}}const a=c.filter(w=>!w.success);return i({success:a.length===0,filled:c.filter(w=>w.success).length,failed:a.length,results:c}),!0}case"GET_FILE_INPUT_SELECTOR":{const{ref:e}=r;if(!e)return i({error:"No ref provided"}),!0;const s=H(),c=s[e];if(!c)return i({error:"Element not found (run page.read first)"}),!0;const a=c.element.deref();if(!a)return delete s[e],i({error:"Element no longer exists"}),!0;if(!(a instanceof HTMLInputElement)||a.type!=="file")return i({error:"Element is not a file input"}),!0;const w=`__pi_file_${Date.now()}`;return a.setAttribute("data-pi-file-id",w),i({selector:`[data-pi-file-id="${w}"]`}),!0}case"WAIT_FOR_NETWORK_IDLE":{const{timeout:e=1e4}=r,s=Math.min(e,6e4),c=["doubleclick.net","googlesyndication.com","googletagmanager.com","google-analytics.com","facebook.net","connect.facebook.net","analytics","ads","tracking","pixel","hotjar.com","clarity.ms","mixpanel.com","segment.com","newrelic.com","nr-data.net","/tracker/","/collector/","/beacon/","/telemetry/","/log/","/events/","/track.","/metrics/"],a=["img","image","font","icon"],w=t=>c.some(o=>t.includes(o)),u=t=>{const o=t.initiatorType||"unknown";return!!(a.includes(o)||/\.(jpg|jpeg|png|gif|webp|svg|ico|woff|woff2|ttf|eot)(\?|$)/i.test(t.name))},f=()=>{const t=performance.now();return performance.getEntriesByType("resource").filter(y=>{if(y.responseEnd!==0||y.name.startsWith("data:")||y.name.length>500||w(y.name))return!1;const v=t-y.startTime;return!(v>1e4||u(y)&&v>3e3)})},b=Date.now();return new Promise(t=>{const o=()=>{const y=f(),v=Date.now()-b;if(y.length===0){t({success:!0,waited:v});return}if(v>=s){t({success:!1,waited:v,pendingCount:y.length});return}setTimeout(o,100)};o()}).then(t=>{if(!t.success){i({error:`Network not idle after ${t.waited}ms (${t.pendingCount} requests pending)`,waited:t.waited,pageContent:"",viewport:{width:window.innerWidth,height:window.innerHeight}});return}const o=B("interactive",15,void 0,!0);i({...o,waited:t.waited})}),!0}case"SEARCH_PAGE":{const{term:e,caseSensitive:s,limit:c}=r,a=ce(e,s||!1,c||10);i({query:e,count:a.length,matches:a});break}case"GET_ELEMENT_BOUNDS_FOR_ANNOTATION":{const e=H(),s=[];for(const[c,a]of Object.entries(e)){const w=a.element.deref();if(!w)continue;const u=w.getBoundingClientRect();u.width<=0||u.height<=0||u.bottom<0||u.top>window.innerHeight||u.right<0||u.left>window.innerWidth||s.push({ref:c,tag:w.tagName.toLowerCase(),bounds:{x:u.x,y:u.y,width:u.width,height:u.height}})}i({elements:s});break}default:return!1}return!1});function ce(r,h,i){const m=[],g=h?r:r.toLowerCase(),p=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT),e=H();let s=0;for(;p.nextNode()&&m.length<i;){const c=p.currentNode,a=c.textContent||"",w=h?a:a.toLowerCase();let u=0;for(;(u=w.indexOf(g,u))!==-1&&m.length<i;){const f=c.parentElement;if(!f){u++;continue}const b=document.createRange();b.setStart(c,u),b.setEnd(c,Math.min(u+r.length,a.length));const l=b.getBoundingClientRect();if(l.width===0||l.height===0){u++;continue}const t=c.textContent||"",o=Math.max(0,u-30),y=Math.min(t.length,u+r.length+30),v=t.slice(o,y).trim();let A=null;for(const[S,k]of Object.entries(e)){const L=k.element.deref();if(L&&(L===f||L.contains(f))){A=S;break}}m.push({ref:`m${++s}`,text:t.slice(u,u+r.length),context:v,bounds:{x:Math.round(l.x),y:Math.round(l.y),width:Math.round(l.width),height:Math.round(l.height)},elementRef:A}),u++}}return m}
|
|
10
|
+
[Viewport: ${window.innerWidth}x${window.innerHeight}]`,viewport:{width:window.innerWidth,height:window.innerHeight}}}catch(r){return{error:`Error generating YAML tree: ${r instanceof Error?r.message:"Unknown error"}`,yaml:"",viewport:{width:window.innerWidth,height:window.innerHeight}}}}function ne(i){const m=O(),r=m[i];let w;if(r&&(w=r.element.deref(),w||delete m[i]),!w&&window.__piRefs&&(w=window.__piRefs[i]),!w)return{x:0,y:0,error:`Element ${i} not found. Use read_page to get current elements.`};const y=w.getBoundingClientRect(),g=Math.round(y.left+y.width/2),e=Math.round(y.top+y.height/2);return{x:g,y:e}}function re(i,m){var e;const r=O(),w=r[i];let y;if(w&&(y=w.element.deref(),y||delete r[i]),!y&&window.__piRefs&&(y=window.__piRefs[i]),!y)return{success:!1,error:`Element ${i} not found. Use read_page to get current elements.`};const g=y.tagName.toLowerCase();try{if(g==="input"){const c=y,l=c.type.toLowerCase();l==="checkbox"||l==="radio"?(c.checked=!!m,c.dispatchEvent(new Event("change",{bubbles:!0}))):(c.value=String(m),c.dispatchEvent(new Event("input",{bubbles:!0})),c.dispatchEvent(new Event("change",{bubbles:!0})))}else if(g==="textarea"){const c=y;c.value=String(m),c.dispatchEvent(new Event("input",{bubbles:!0})),c.dispatchEvent(new Event("change",{bubbles:!0}))}else if(g==="select"){const c=y,l=String(m);let s=!1;for(const d of c.options)if(d.value===l||((e=d.textContent)==null?void 0:e.trim())===l){c.value=d.value,s=!0;break}if(!s)return{success:!1,error:`Option "${m}" not found in select element ${i}`};c.dispatchEvent(new Event("change",{bubbles:!0}))}else if(y.getAttribute("contenteditable")==="true")y.textContent=String(m),y.dispatchEvent(new Event("input",{bubbles:!0}));else return{success:!1,error:`Element ${i} (${g}) is not a form field`};return{success:!0}}catch(c){return{success:!1,error:`Failed to set value: ${c instanceof Error?c.message:"Unknown error"}`}}}function ie(){var i;try{const m=document.querySelector("article"),r=document.querySelector("main");return{text:((i=(m||r||document.body).textContent)==null?void 0:i.replace(/\s+/g," ").trim().substring(0,5e4))||"",title:document.title,url:window.location.href}}catch(m){return{text:"",title:"",url:"",error:`Failed to extract text: ${m instanceof Error?m.message:"Unknown error"}`}}}function oe(i){const m=O(),r=m[i];let w;return r&&(w=r.element.deref(),w||delete m[i]),!w&&window.__piRefs&&(w=window.__piRefs[i]),w?(w.scrollIntoView({behavior:"smooth",block:"center"}),{success:!0}):{success:!1,error:`Element ${i} not found. Run read_page to get current element refs.`}}function se(i,m,r,w="screenshot.png"){try{const y=atob(i),g=new ArrayBuffer(y.length),e=new Uint8Array(g);for(let h=0;h<y.length;h++)e[h]=y.charCodeAt(h);const c=new Blob([g],{type:"image/png"}),l=new File([c],w,{type:"image/png"});let s=null;if(m){const h=O(),b=h[m];if(b&&(s=b.element.deref(),s||delete h[m]),!s&&window.__piRefs&&(s=window.__piRefs[m]),!s)return{success:!1,error:`Element ${m} not found. Run read_page to get current element refs.`}}else if(r&&(s=document.elementFromPoint(r[0],r[1]),!s))return{success:!1,error:`No element at (${r[0]}, ${r[1]})`};if(!s)return{success:!1,error:"No target element"};if(s.tagName==="INPUT"&&s.type==="file"){const h=s,b=new DataTransfer;return b.items.add(l),h.files=b.files,h.dispatchEvent(new Event("change",{bubbles:!0})),{success:!0}}const d=new DataTransfer;d.items.add(l);const u=new DragEvent("drop",{bubbles:!0,cancelable:!0,dataTransfer:d});return s.dispatchEvent(u),{success:!0}}catch(y){return{success:!1,error:y instanceof Error?y.message:"Upload failed"}}}chrome.runtime.onMessage.addListener((i,m,r)=>{var w,y,g;switch(i.type){case"GENERATE_ACCESSIBILITY_TREE":{const e=i.options||{};if(e.format==="yaml"){const c=te(e.filter||"interactive",e.depth??15),l=Y();c.error?r({error:c.error,pageContent:"",viewport:c.viewport}):r({pageContent:c.yaml,viewport:c.viewport,modalStates:l.length>0?l:void 0,modalLimitations:"Only custom modals ([role=dialog]) detected. Native alert/confirm/prompt dialogs and system file choosers cannot be detected from content scripts."})}else{const c=B(e.filter||"interactive",e.depth??15,e.refId,e.forceFullSnapshot??!1,e.compact??!1);r(c)}break}case"GET_ELEMENT_COORDINATES":{const e=ne(i.ref);r(e);break}case"CLICK_ELEMENT":{const e=O(),c=e[i.ref];let l;if(c&&(l=c.element.deref(),l||delete e[i.ref]),!l&&window.__piRefs&&(l=window.__piRefs[i.ref]),!l){r({error:`Element ${i.ref} not found. Use read_page to get current elements.`});break}if(i.button==="triple"){const s=new MouseEvent("click",{bubbles:!0,cancelable:!0,view:window,detail:3});l.dispatchEvent(s)}else i.button==="double"?l.dispatchEvent(new MouseEvent("dblclick",{bubbles:!0,cancelable:!0,view:window})):i.button==="right"?l.dispatchEvent(new MouseEvent("contextmenu",{bubbles:!0,cancelable:!0,view:window})):l.click();r({success:!0});break}case"FORM_INPUT":{const e=re(i.ref,i.value);r(e);break}case"EVAL_IN_PAGE":{try{const e=document.createElement("script");e.textContent=`(function() { ${i.code} })();`,document.documentElement.appendChild(e),e.remove(),r({success:!0})}catch(e){r({success:!1,error:e instanceof Error?e.message:String(e)})}break}case"GET_PAGE_TEXT":{const e=ie();r(e);break}case"GET_FRAME_BY_SELECTOR":{try{const e=document.querySelector(i.selector);if(!e||e.tagName.toLowerCase()!=="iframe"){r({error:`No iframe found with selector "${i.selector}"`});break}r({url:e.src,name:e.name||void 0})}catch(e){r({error:e instanceof Error?e.message:String(e)})}break}case"GET_FRAME_NAME":{try{r({name:window.name||null})}catch{r({name:null})}break}case"LOCATE_ROLE":{try{const{role:e,name:c,all:l}=i,s=O(),u={button:["button",'input[type="button"]','input[type="submit"]','input[type="reset"]','[role="button"]'],link:["a[href]",'[role="link"]'],textbox:["input:not([type])",'input[type="text"]','input[type="email"]','input[type="password"]','input[type="search"]','input[type="tel"]','input[type="url"]',"textarea",'[role="textbox"]'],checkbox:['input[type="checkbox"]','[role="checkbox"]'],radio:['input[type="radio"]','[role="radio"]'],combobox:["select",'[role="combobox"]'],listbox:['[role="listbox"]',"select[multiple]"],option:["option",'[role="option"]'],heading:["h1","h2","h3","h4","h5","h6",'[role="heading"]'],navigation:["nav",'[role="navigation"]'],main:["main",'[role="main"]'],img:["img[alt]",'[role="img"]'],dialog:["dialog",'[role="dialog"]','[role="alertdialog"]'],tab:['[role="tab"]'],tabpanel:['[role="tabpanel"]'],menu:['[role="menu"]'],menuitem:['[role="menuitem"]']}[e]||[`[role="${e}"]`],h=[];for(const o of u)try{h.push(...document.querySelectorAll(o))}catch{}const b=h.filter(o=>{const p=window.getComputedStyle(o);return p.display!=="none"&&p.visibility!=="hidden"&&o.offsetWidth>0&&o.offsetHeight>0});let a=b;if(c){const o=c.toLowerCase();a=b.filter(p=>{var D,W,x,n,f;const v=(D=p.getAttribute("aria-label"))==null?void 0:D.toLowerCase(),_=(W=p.textContent)==null?void 0:W.trim().toLowerCase(),S=(x=p.getAttribute("title"))==null?void 0:x.toLowerCase(),A=(n=p.placeholder)==null?void 0:n.toLowerCase(),L=(f=p.value)==null?void 0:f.toLowerCase();return(v==null?void 0:v.includes(o))||(_==null?void 0:_.includes(o))||(S==null?void 0:S.includes(o))||(A==null?void 0:A.includes(o))||(L==null?void 0:L.includes(o))})}if(a.length===0){r({error:`No element found with role "${e}"${c?` and name "${c}"`:""}`});break}const t=a.map(o=>{var v;const p=q(o,e,c||"");return window.__piRefs=window.__piRefs||{},window.__piRefs[p]=o,s[p]={element:new WeakRef(o),role:e,name:c||""},{ref:p,text:(v=o.textContent)==null?void 0:v.trim().slice(0,50)}});r(l?{matches:t}:{ref:t[0].ref,text:t[0].text})}catch(e){r({error:e instanceof Error?e.message:String(e)})}break}case"LOCATE_TEXT":{try{const{text:e,exact:c}=i,l=O(),s=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT),d=[];for(;s.nextNode();){const a=s.currentNode.textContent||"";if(c?a.trim()===e:a.toLowerCase().includes(e.toLowerCase())){const o=s.currentNode.parentElement;if(o&&!d.includes(o)){const p=window.getComputedStyle(o);p.display!=="none"&&p.visibility!=="hidden"&&d.push(o)}}}if(d.length===0){r({error:`No element found with text "${e}"`});break}const u=d.sort((a,t)=>{var o,p;return(((o=a.textContent)==null?void 0:o.length)||0)-(((p=t.textContent)==null?void 0:p.length)||0)})[0],h=U(u),b=q(u,h,e);window.__piRefs=window.__piRefs||{},window.__piRefs[b]=u,l[b]={element:new WeakRef(u),role:h,name:e},r({ref:b,text:(w=u.textContent)==null?void 0:w.trim().slice(0,50)})}catch(e){r({error:e instanceof Error?e.message:String(e)})}break}case"LOCATE_LABEL":{try{const{label:e}=i,c=O(),l=document.querySelectorAll("label");let s=null;for(const h of l){const b=(y=h.textContent)==null?void 0:y.trim().toLowerCase();if(b!=null&&b.includes(e.toLowerCase())){const a=h.getAttribute("for");if(a&&(s=document.getElementById(a)),s||(s=h.querySelector("input, select, textarea")),s)break}}if(!s){const h=e.toLowerCase();s=document.querySelector(`input[aria-label*="${e}" i], input[placeholder*="${e}" i], textarea[aria-label*="${e}" i], textarea[placeholder*="${e}" i], select[aria-label*="${e}" i]`)}if(!s){r({error:`No form field found with label "${e}"`});break}const d=U(s),u=q(s,d,e);window.__piRefs=window.__piRefs||{},window.__piRefs[u]=s,c[u]={element:new WeakRef(s),role:d,name:e},r({ref:u,label:e})}catch(e){r({error:e instanceof Error?e.message:String(e)})}break}case"GET_ELEMENT_STYLES":{try{const{selector:e}=i,c=O(),l=s=>{var h;const d=getComputedStyle(s),u=s.getBoundingClientRect();return{tag:s.tagName.toLowerCase(),text:((h=s.innerText)==null?void 0:h.trim().slice(0,80))||null,box:{x:Math.round(u.x),y:Math.round(u.y),width:Math.round(u.width),height:Math.round(u.height)},styles:{fontSize:d.fontSize,fontWeight:d.fontWeight,fontFamily:d.fontFamily.split(",")[0].trim().replace(/"/g,""),color:d.color,backgroundColor:d.backgroundColor,borderRadius:d.borderRadius,border:d.border!=="none"&&d.borderWidth!=="0px"?d.border:null,boxShadow:d.boxShadow!=="none"?d.boxShadow:null,padding:d.padding}}};if(/^e\d+$/.test(e)){const s=c[e];let d;if(s&&(d=s.element.deref(),d||delete c[e]),!d&&window.__piRefs&&(d=window.__piRefs[e]),!d){r({error:`Element ${e} not found`});break}r({styles:[l(d)]})}else{const s=document.querySelectorAll(e);if(s.length===0){r({error:`No elements found matching "${e}"`});break}const d=Array.from(s).map(l);r({styles:d})}}catch(e){r({error:e instanceof Error?e.message:String(e)})}break}case"SELECT_OPTION":{try{const{selector:e,values:c,by:l}=i,s=O();let d=null;if(/^e\d+$/.test(e)){const a=s[e];let t;if(a&&(t=a.element.deref(),t||delete s[e]),!t&&window.__piRefs&&(t=window.__piRefs[e]),!t){r({error:`Element ${e} not found`});break}if(t.tagName!=="SELECT"){r({error:`Element ${e} is not a <select>`});break}d=t}else{if(d=document.querySelector(e),!d){r({error:`No element found matching "${e}"`});break}if(d.tagName!=="SELECT"){r({error:`Element "${e}" is not a <select>`});break}}if(d.multiple)for(const a of d.options)a.selected=!1;const u=[],h=[],b=d.multiple?c:[c[0]];for(const a of b){let t=!1;for(const o of d.options){let p=!1;if(l==="index"?p=o.index===parseInt(a,10):l==="label"?p=o.text.toLowerCase().includes(a.toLowerCase()):p=o.value===a,p){o.selected=!0,u.push(o.value),t=!0;break}}t||h.push(a)}d.dispatchEvent(new Event("change",{bubbles:!0})),h.length>0?r({selected:u,warning:`Values not found: ${h.join(", ")}`}):r({selected:u})}catch(e){r({error:e instanceof Error?e.message:String(e)})}break}case"GET_ELEMENT_TEXT":{try{const{ref:e}=i,c=O(),l=c[e];let s;if(l&&(s=l.element.deref(),s||delete c[e]),!s&&window.__piRefs&&(s=window.__piRefs[e]),!s){r({error:`Element ${e} not found`});break}r({text:((g=s.textContent)==null?void 0:g.trim())||""})}catch(e){r({error:e instanceof Error?e.message:String(e)})}break}case"SCROLL_TO_ELEMENT":{const e=oe(i.ref);r(e);break}case"UPLOAD_IMAGE":{const e=se(i.base64,i.ref,i.coordinate,i.filename);r(e);break}case"WAIT_FOR_ELEMENT":{const{selector:e,state:c="visible",timeout:l=2e4}=i,s=Math.min(l,6e4),d=a=>{if(!a)return!1;const t=window.getComputedStyle(a);return t.display!=="none"&&t.visibility!=="hidden"&&t.opacity!=="0"&&a.offsetWidth>0&&a.offsetHeight>0},u=()=>{const a=document.querySelector(e);switch(c){case"attached":return!!a;case"detached":return!a;case"hidden":return!a||!d(a);case"visible":default:return d(a)}},h=Date.now();return new Promise(a=>{if(u()){a({success:!0,waited:Date.now()-h});return}const t=new MutationObserver(()=>{u()&&(t.disconnect(),clearTimeout(o),a({success:!0,waited:Date.now()-h}))}),o=setTimeout(()=>{t.disconnect(),a({success:!1,waited:Date.now()-h,error:`Timeout waiting for "${e}" to be ${c}`})},s);t.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["style","class","hidden","disabled"]})}).then(a=>{if(!a.success){r({error:a.error,waited:a.waited,pageContent:"",viewport:{width:window.innerWidth,height:window.innerHeight}});return}const t=B("interactive",15,void 0,!0);r({...t,waited:a.waited})}),!0}case"WAIT_FOR_URL":{const{pattern:e,timeout:c=2e4}=i,l=Math.min(c,6e4),s=h=>{if(e.includes("*")){const b=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*\*/g,"<<<GLOBSTAR>>>").replace(/\*/g,"[^/]*").replace(/<<<GLOBSTAR>>>/g,".*");return new RegExp(`^${b}$`).test(h)}return h.includes(e)},d=Date.now();return new Promise(h=>{if(s(window.location.href)){h({success:!0,waited:Date.now()-d});return}let b=!1;const a=()=>{b||s(window.location.href)&&(b=!0,clearInterval(t),clearTimeout(o),window.removeEventListener("popstate",a),window.removeEventListener("hashchange",a),h({success:!0,waited:Date.now()-d}))},t=setInterval(a,100),o=setTimeout(()=>{b||(b=!0,clearInterval(t),window.removeEventListener("popstate",a),window.removeEventListener("hashchange",a),h({success:!1,waited:Date.now()-d,error:`Timeout waiting for URL to match "${e}". Current: ${window.location.href}`}))},l);window.addEventListener("popstate",a),window.addEventListener("hashchange",a)}).then(h=>{if(!h.success){r({error:h.error,waited:h.waited,pageContent:"",viewport:{width:window.innerWidth,height:window.innerHeight}});return}const b=B("interactive",15,void 0,!0);r({...b,waited:h.waited})}),!0}case"WAIT_FOR_DOM_STABLE":{const{stable:e=100,timeout:c=5e3}=i,l=Math.min(c,3e4),s=Date.now();return new Promise(u=>{let h=Date.now(),b=!1;const a=()=>{if(b)return;Date.now()-h>=e&&(b=!0,t.disconnect(),clearTimeout(o),clearInterval(p),u({success:!0,waited:Date.now()-s}))},t=new MutationObserver(()=>{h=Date.now()}),o=setTimeout(()=>{b||(b=!0,t.disconnect(),clearInterval(p),u({success:!1,waited:Date.now()-s,error:`Timeout: DOM did not stabilize within ${l}ms`}))},l),p=setInterval(a,Math.max(10,Math.min(50,e/2)));t.observe(document.documentElement,{childList:!0,subtree:!0,attributes:!0,characterData:!0}),a()}).then(u=>{if(!u.success){r({error:u.error,waited:u.waited,pageContent:"",viewport:{width:window.innerWidth,height:window.innerHeight}});return}const h=B("interactive",15,void 0,!0);r({...h,waited:u.waited})}),!0}case"FORM_FILL":{const{data:e}=i;if(!Array.isArray(e))return r({error:"data must be an array of {ref, value} pairs"}),!0;const c=O(),l=[];for(const d of e){const{ref:u,value:h}=d;if(!u){l.push({ref:u||"unknown",success:!1,error:"Missing ref"});continue}const b=c[u];if(!b){l.push({ref:u,success:!1,error:"Element not found (run page.read first)"});continue}const a=b.element.deref();if(!a){delete c[u],l.push({ref:u,success:!1,error:"Element no longer exists"});continue}try{if(a instanceof HTMLInputElement){const t=a.type.toLowerCase();if(t==="checkbox"||t==="radio"){const o=h===!0||h==="true"||h==="1"||h==="checked";a.checked=o,a.dispatchEvent(new Event("change",{bubbles:!0}))}else a.focus(),a.value=String(h),a.dispatchEvent(new Event("input",{bubbles:!0})),a.dispatchEvent(new Event("change",{bubbles:!0}));l.push({ref:u,success:!0})}else a instanceof HTMLTextAreaElement?(a.focus(),a.value=String(h),a.dispatchEvent(new Event("input",{bubbles:!0})),a.dispatchEvent(new Event("change",{bubbles:!0})),l.push({ref:u,success:!0})):a instanceof HTMLSelectElement?(a.value=String(h),a.dispatchEvent(new Event("change",{bubbles:!0})),l.push({ref:u,success:!0})):a.isContentEditable?(a.focus(),a.textContent=String(h),a.dispatchEvent(new Event("input",{bubbles:!0})),l.push({ref:u,success:!0})):l.push({ref:u,success:!1,error:"Element is not fillable"})}catch(t){l.push({ref:u,success:!1,error:t instanceof Error?t.message:String(t)})}}const s=l.filter(d=>!d.success);return r({success:s.length===0,filled:l.filter(d=>d.success).length,failed:s.length,results:l}),!0}case"GET_FILE_INPUT_SELECTOR":{const{ref:e}=i;if(!e)return r({error:"No ref provided"}),!0;const c=O(),l=c[e];if(!l)return r({error:"Element not found (run page.read first)"}),!0;const s=l.element.deref();if(!s)return delete c[e],r({error:"Element no longer exists"}),!0;if(!(s instanceof HTMLInputElement)||s.type!=="file")return r({error:"Element is not a file input"}),!0;const d=`__pi_file_${Date.now()}`;return s.setAttribute("data-pi-file-id",d),r({selector:`[data-pi-file-id="${d}"]`}),!0}case"WAIT_FOR_NETWORK_IDLE":{const{timeout:e=1e4}=i,c=Math.min(e,6e4),l=["doubleclick.net","googlesyndication.com","googletagmanager.com","google-analytics.com","facebook.net","connect.facebook.net","analytics","ads","tracking","pixel","hotjar.com","clarity.ms","mixpanel.com","segment.com","newrelic.com","nr-data.net","/tracker/","/collector/","/beacon/","/telemetry/","/log/","/events/","/track.","/metrics/"],s=["img","image","font","icon"],d=t=>l.some(o=>t.includes(o)),u=t=>{const o=t.initiatorType||"unknown";return!!(s.includes(o)||/\.(jpg|jpeg|png|gif|webp|svg|ico|woff|woff2|ttf|eot)(\?|$)/i.test(t.name))},h=()=>{const t=performance.now();return performance.getEntriesByType("resource").filter(p=>{if(p.responseEnd!==0||p.name.startsWith("data:")||p.name.length>500||d(p.name))return!1;const v=t-p.startTime;return!(v>1e4||u(p)&&v>3e3)})},b=Date.now();return new Promise(t=>{const o=()=>{const p=h(),v=Date.now()-b;if(p.length===0){t({success:!0,waited:v});return}if(v>=c){t({success:!1,waited:v,pendingCount:p.length});return}setTimeout(o,100)};o()}).then(t=>{if(!t.success){r({error:`Network not idle after ${t.waited}ms (${t.pendingCount} requests pending)`,waited:t.waited,pageContent:"",viewport:{width:window.innerWidth,height:window.innerHeight}});return}const o=B("interactive",15,void 0,!0);r({...o,waited:t.waited})}),!0}case"SEARCH_PAGE":{const{term:e,caseSensitive:c,limit:l}=i,s=ce(e,c||!1,l||10);r({query:e,count:s.length,matches:s});break}case"GET_ELEMENT_BOUNDS_FOR_ANNOTATION":{const e=O(),c=[];for(const[l,s]of Object.entries(e)){const d=s.element.deref();if(!d)continue;const u=d.getBoundingClientRect();u.width<=0||u.height<=0||u.bottom<0||u.top>window.innerHeight||u.right<0||u.left>window.innerWidth||c.push({ref:l,tag:d.tagName.toLowerCase(),bounds:{x:u.x,y:u.y,width:u.width,height:u.height}})}r({elements:c});break}default:return!1}return!1});function ce(i,m,r){const w=[],y=m?i:i.toLowerCase(),g=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT),e=O();let c=0;for(;g.nextNode()&&w.length<r;){const l=g.currentNode,s=l.textContent||"",d=m?s:s.toLowerCase();let u=0;for(;(u=d.indexOf(y,u))!==-1&&w.length<r;){const h=l.parentElement;if(!h){u++;continue}const b=document.createRange();b.setStart(l,u),b.setEnd(l,Math.min(u+i.length,s.length));const a=b.getBoundingClientRect();if(a.width===0||a.height===0){u++;continue}const t=l.textContent||"",o=Math.max(0,u-30),p=Math.min(t.length,u+i.length+30),v=t.slice(o,p).trim();let _=null;for(const[S,A]of Object.entries(e)){const L=A.element.deref();if(L&&(L===h||L.contains(h))){_=S;break}}w.push({ref:`m${++c}`,text:t.slice(u,u+i.length),context:v,bounds:{x:Math.round(a.x),y:Math.round(a.y),width:Math.round(a.width),height:Math.round(a.height)},elementRef:_}),u++}}return w}
|
|
11
11
|
//# sourceMappingURL=accessibility-tree.js.map
|