browserzap 0.6.1 → 0.8.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/CHANGELOG.md +201 -2
- package/README.md +31 -19
- package/THIRD_PARTY_NOTICES.md +4 -3
- package/bridge-server/background-runs.js +1 -1
- package/bridge-server/entitlements.js +8 -6
- package/bridge-server/extension-id.js +64 -1
- package/bridge-server/extension-version.js +65 -0
- package/bridge-server/feedback.js +55 -17
- package/bridge-server/index.js +36 -24
- package/bridge-server/limits.js +21 -2
- package/bridge-server/mcp-server.js +166 -16
- package/bridge-server/native-host.js +22 -3
- package/bridge-server/panel.js +10 -4
- package/bridge-server/probe.js +56 -1
- package/bridge-server/profile-labels.js +81 -0
- package/bridge-server/resolvers.js +1 -1
- package/bridge-server/secret.js +1 -1
- package/bridge-server/server.js +91 -16
- package/bridge-server/setup.js +85 -26
- package/bridge-server/tools.js +46 -2
- package/package.json +17 -7
- package/extension/background.js +0 -1
- package/extension/engine.js +0 -1
- package/extension/fonts/inter-latin-wght-normal.woff2 +0 -0
- package/extension/icons/icon128.png +0 -0
- package/extension/icons/icon16.png +0 -0
- package/extension/icons/icon32.png +0 -0
- package/extension/icons/icon48.png +0 -0
- package/extension/logo.svg +0 -7
- package/extension/manifest.json +0 -47
- package/extension/sidepanel.css +0 -2
- package/extension/sidepanel.html +0 -138
- package/extension/sidepanel.js +0 -1
package/extension/engine.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(()=>{"use strict";const e="data-browserzap-cursor",t="data-browserzap-control",n="data-browserzap-approval",o="data-browserzap-approve",r="data-browserzap-note",i="data-browserzap-handoff",a="data-browserzap-comment";function s(s){return s instanceof Element&&(s.hasAttribute(e)||s.hasAttribute(t)||s.hasAttribute(n)||s.hasAttribute(o)||s.hasAttribute(r)||s.hasAttribute(i)||s.hasAttribute(a))}function l(e,t){for(const[n,o]of Object.entries(t))e.style.setProperty(n,o)}function c(){try{return matchMedia("(prefers-reduced-motion: reduce)").matches}catch{return!1}}function u(e){if(!e)return null;let t="";try{t=getComputedStyle(e).backgroundColor}catch{return null}const n=/^rgba?\(([^)]+)\)$/.exec(t);if(!n)return null;const o=n[1].split(",").map(e=>Number(e.trim())),[r,i,a]=o,s=o.length>3?o[3]:1;return![r,i,a,s].every(Number.isFinite)||s<.5?null:.2126*r+.7152*i+.0722*a}function d(){return(u(document.body)??u(document.documentElement)??255)<110?{strong:"#ff922b",soft:"rgba(255, 146, 43, 0.30)",ink:"#1a0d04"}:{strong:"#d9480f",soft:"rgba(217, 72, 15, 0.18)",ink:"#ffffff"}}function p(e,t){const n=document.createElement("div");return l(n,e),void 0!==t&&(n.textContent=t),n}function f(e,t,n){if(e?.el.isConnected)return e;e?.el.remove();const o=document.fullscreenElement??document.documentElement;if(!o)return null;const r=document.createElement("div");r.setAttribute(t,""),n?(r.setAttribute("role",n.role),r.setAttribute("aria-label",n.label)):r.setAttribute("aria-hidden","true"),l(r,{position:"fixed",inset:"0","z-index":"2147483647","pointer-events":"none",overflow:"visible"});const i=r.attachShadow({mode:"closed"});return o.appendChild(r),{el:r,root:i}}function m(e){return(e??"").replace(/\s+/g," ").trim()}function h(e){return m(e).toLowerCase()}function g(e,t){return e.length>t?`${e.slice(0,t-1)}…`:e}function b(e,t=!1){const n=[],o=r=>{if(r.nodeType===Node.TEXT_NODE)return void n.push(r.textContent??"");if(r.nodeType!==Node.ELEMENT_NODE)return;const i=r,a=i.tagName;if("SCRIPT"===a||"STYLE"===a||"TEMPLATE"===a)return;if(t&&("INPUT"===a||"SELECT"===a||"TEXTAREA"===a||"BUTTON"===a))return;if("IMG"===a)return void n.push(` ${i.getAttribute("alt")??""} `);const s=i!==e&&function(e){const t=e.ownerDocument.defaultView?.getComputedStyle(e).display??"inline";return"inline"!==t&&"contents"!==t&&"none"!==t}(i);s&&n.push(" ");for(const e of Array.from(i.childNodes))o(e);s&&n.push(" ")};return o(e),m(n.join(""))}function*x(e){const t=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);let n=t.nextNode();for(;n;){const e=n;yield e,e.shadowRoot&&(yield*x(e.shadowRoot)),n=t.nextNode()}}function y(){const e=Array.from(document.querySelectorAll("dialog[open]"));for(let t=e.length-1;t>=0;t--)if(e[t].matches(":modal"))return e[t];return null}function v(){return"hidden"===document.visibilityState}function w(e){if(e.parentElement)return e.parentElement;const t=e.getRootNode();return t instanceof ShadowRoot?t.host:null}function k(e,t){let n=t;for(;n;){if(n===e)return!0;n=w(n)}return!1}function E(e,t){const n=e.getRootNode();try{return n.querySelector(`#${CSS.escape(t)}`)??document.getElementById(t)}catch{return null}}const T=String.raw`pass(word|code|phrase)?\b|\bpwd\b|\bpin\b|\botp\b|one[-\s]?time|2fa|\bmfa\b|security code|verification code|\bcvv\b|\bcvc\b|\bcsc\b|card ?number|credit ?card|social security|\bssn\b|\biban\b|routing number|account number|tax id|national id|passport`,A=new Set(["button","link","checkbox","radio","switch","tab","menuitem","menuitemcheckbox","menuitemradio","option","combobox","listbox","textbox","searchbox","slider","spinbutton","treeitem","gridcell"]),S=new Set(["button","link","checkbox","radio","switch","tab","menuitem","menuitemcheckbox","menuitemradio","option","treeitem","heading","gridcell","cell"]),M=new Set(["textbox","searchbox","spinbutton","combobox"]),$=/\b(delete|remove|erase|destroy|discard|deactivate|terminate|revoke|unsubscribe|close (my )?account|cancel (my |the )?(subscription|order|plan|membership))\b/i,L=/\b(pay|payment|purchase|buy|checkout|check out|place (the |my )?order|submit order|order now|complete (the )?order|donate|transfer|send money|subscribe|upgrade)\b/i,C=/\b(submit|send|post|publish|share|tweet|reply|comment|confirm|apply|book|reserve|sign up|invite|save changes|approve|accept|merge|deploy)\b/i,N=new RegExp(T,"i"),I=/\b(verify (that )?you('re| are) (a )?human|are you a robot|i'?m not a robot|human verification|security check|captcha|checking your browser)\b/i,R=/\b(two[- ]factor|2fa|multi[- ]factor|verification code|one[- ]time (pass)?code|authenticator app|enter the code)\b/i,H={checkbox:"checkbox",radio:"radio",button:"button",submit:"button",reset:"button",image:"button",range:"slider",number:"spinbutton",search:"searchbox",file:"button",color:"button"};function O(e){const t=m(e.getAttribute("role")).split(" ")[0];if(t)return t.toLowerCase();switch(e.tagName.toLowerCase()){case"a":case"area":return e.hasAttribute("href")?"link":"generic";case"button":case"summary":return"button";case"select":{const t=e;return t.multiple||t.size>1?"listbox":"combobox"}case"textarea":return"textbox";case"input":{const t=(e.type||"text").toLowerCase();return H[t]??"textbox"}case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":return"heading";case"img":return"img";default:return e.isContentEditable?"textbox":"generic"}}function P(e){return e instanceof HTMLInputElement||e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement}function _(e){return P(e)&&e.labels?Array.from(e.labels):[]}function B(e){const t=m(e.getAttribute("aria-labelledby"));if(t){const n=m(t.split(" ").map(t=>E(e,t)).filter(e=>Boolean(e)).map(e=>b(e)).join(" "));if(n)return{name:n,source:"aria-labelledby"}}const n=m(e.getAttribute("aria-label"));if(n)return{name:n,source:"aria-label"};if(e instanceof HTMLInputElement){const t=e.type.toLowerCase();if("submit"===t||"button"===t||"reset"===t){const n="submit"===t?"Submit":"reset"===t?"Reset":"";return{name:m(e.value)||n,source:"value"}}if("image"===t)return{name:m(e.alt)||"Submit",source:"alt"}}if(P(e)){const t=m(_(e).map(e=>b(e,!0)).join(" "));if(t)return{name:t,source:"label"}}if(e instanceof HTMLImageElement){const t=m(e.alt);if(t)return{name:t,source:"alt"}}const o=O(e);if(S.has(o)||"SUMMARY"===e.tagName){const t=b(e);if(t)return{name:t,source:"content"}}const r=m(e.getAttribute("title"));if(r)return{name:r,source:"title"};const i=m(e.getAttribute("placeholder"));return i?{name:i,source:"placeholder"}:{name:"",source:"none"}}function U(e){const t=e.tagName;if("INPUT"===t)return"hidden"!==e.type.toLowerCase();if("BUTTON"===t||"SELECT"===t||"TEXTAREA"===t||"SUMMARY"===t)return!0;if(("A"===t||"AREA"===t)&&e.hasAttribute("href"))return!0;const n=m(e.getAttribute("role")).split(" ")[0].toLowerCase();return!(!n||!A.has(n))||!0===e.isContentEditable&&null!==e.getAttribute("contenteditable")}const z={docId:function(){const e=new Uint8Array(8);return crypto.getRandomValues(e),Array.from(e,e=>e.toString(16).padStart(2,"0")).join("")}(),snapshotId:0,nextRef:1,refs:new Map,ids:new WeakMap,mutations:0},q={label:new Map,sibling:new Map};function D(){q.label=new Map,q.sibling=new Map}function F(e){const t=e;if("function"==typeof t.checkVisibility&&!t.checkVisibility({checkOpacity:!0,checkVisibilityCSS:!0}))return!1;const n=e.getBoundingClientRect();return!(n.width<=0||n.height<=0||e.closest('[inert],[aria-hidden="true"]'))}function G(e){return e.getClientRects()[0]??e.getBoundingClientRect()}function W(e){return F(e)?e:e instanceof HTMLInputElement&&("checkbox"===e.type||"radio"===e.type)?_(e).find(e=>F(e))??null:null}function j(e){if("true"===e.getAttribute("aria-disabled"))return!0;try{return e.matches(":disabled")}catch{return!1}}function K(e,t){if(!P(e)&&!e.isContentEditable)return null;if("password"===(e.getAttribute("type")??"").toLowerCase())return"password field";const n=(e.getAttribute("autocomplete")??"").toLowerCase();if(/\b(cc-[a-z-]+|current-password|new-password|one-time-code)\b/.test(n))return`autocomplete=${n}`;const o=[t,e.getAttribute("name"),e.id,e.getAttribute("aria-label"),e.getAttribute("placeholder")].join(" ").match(N);return o?`looks like "${o[0].toLowerCase()}"`:null}function X(e){const t={};if(j(e)&&(t.disabled=!0),e instanceof HTMLInputElement&&("checkbox"===e.type||"radio"===e.type)?t.checked=e.checked:e.hasAttribute("aria-checked")&&(t.checked="true"===e.getAttribute("aria-checked")),e.hasAttribute("aria-expanded")&&(t.expanded="true"===e.getAttribute("aria-expanded")),e.hasAttribute("aria-selected")&&(t.selected="true"===e.getAttribute("aria-selected")),e instanceof HTMLSelectElement){const n=e.selectedOptions[0];n&&(t.value=g(m(n.label||n.text),100)),t.options=e.options.length}else(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement)&&(e.required&&(t.required=!0),e instanceof HTMLInputElement&&("checkbox"===e.type||"radio"===e.type)||(t.filled=e.value.length>0),e.readOnly&&(t.readonly=!0));return t}function Y(e){const t=q.label.get(e);if(void 0!==t)return t;const n=function(e){const t=m(e.getAttribute("aria-labelledby"));if(t){const n=m(t.split(" ").map(t=>E(e,t)).filter(Boolean).map(e=>b(e)).join(" "));if(n)return n}const n=m(e.getAttribute("aria-label"));if(n)return n;if(!e.matches("section,article,aside,nav,main,form,fieldset,dialog,header,footer,li,table,tr,[role=region],[role=group],[role=dialog],[role=alertdialog],[role=form],[role=tabpanel],[role=navigation],[role=complementary],[role=listitem],[role=row]"))return function(e){const t=e.parentElement;if(!t||!e.className||"string"!=typeof e.className)return!1;let n=q.sibling.get(t);if(!n){n=new Map;for(const e of Array.from(t.children)){if("string"!=typeof e.className||!e.className)continue;const t=`${e.tagName}.${e.className}`;n.set(t,(n.get(t)??0)+1)}q.sibling.set(t,n)}return(n.get(`${e.tagName}.${e.className}`)??0)>=2&&null!==e.querySelector(Q)}(e)?ee(e):"";const o=e.querySelector(":scope > :is(h1,h2,h3,h4,h5,h6,legend,caption), :scope > header :is(h1,h2,h3,h4,h5,h6)");return o?b(o):e.matches(V)?function(e){const t=Array.from(e.children).filter(e=>e.matches("th,td,[role=cell],[role=gridcell],[role=rowheader],[role=columnheader]")).filter(e=>!e.querySelector(Q)&&b(e)),n=t.find(e=>e.matches("th,[role=rowheader]"));return n?b(n):t[0]?b(t[0]):""}(e):e.matches(Z)?ee(e):""}(e);return q.label.set(e,n),n}const V="tr,[role=row]",Z="li,[role=listitem],article",Q='a[href],button,input:not([type=hidden]),select,textarea,summary,[role=button],[role=link],[role=checkbox],[role=radio],[role=switch],[role=tab],[role=menuitem],[role=option],[role=combobox],[role=textbox],[contenteditable=""],[contenteditable=true]',J=60;function ee(e){const t=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);let n=0;for(let e=t.nextNode();e&&n<J;e=t.nextNode(),n++){const t=e;if(!(t.matches("label,script,style,template")||U(t)||t.querySelector(Q))&&(Array.from(t.childNodes).some(e=>e.nodeType===Node.TEXT_NODE&&m(e.textContent))&&F(t)))return g(b(t),60)}return""}function te(e){const t=[];let n=w(e);for(;n&&n!==document.documentElement;){const e=Y(n);e&&t.push(e),n=w(n)}return t}function ne(e){let t=w(e);for(;t&&t!==document.documentElement;){const e=Y(t);if(e)return e;t=w(t)}return""}function oe(e,t){return`${e}|${h(t)}`}function re(e,t,n,o){let r=z.ids.get(e);return r||(r="e"+z.nextRef++,z.ids.set(e,r)),z.refs.set(r,{el:new WeakRef(e),fingerprint:oe(t,n),context:o}),r}function ie(e){return e.visible??=e.proxy?null!==W(e.el):F(e.el),e.visible}function ae(){const e=[];for(const t of x(document)){if(!U(t))continue;const{name:n,source:o}=B(t);e.push({el:t,role:O(t),name:g(n,200),source:o,proxy:!0})}return e}function se(e){const t=ne(e.el);return{ref:re(e.el,e.role,e.name,t),role:e.role,name:g(e.name,100),context:t?g(t,60):void 0,visible:ie(e)}}function le(e,t,n){return P(e)&&M.has(t)?"reversible":$.test(n)?"destructive":L.test(n)?"financial":C.test(n)||(e instanceof HTMLButtonElement&&"submit"===e.type&&null!==e.form||e instanceof HTMLInputElement&&("submit"===e.type||"image"===e.type)&&null!==e.form)&&"post"===e.form.method.toLowerCase()?"external_side_effect":"reversible"}function ce(){if(document.querySelector('iframe[src*="recaptcha"],iframe[src*="hcaptcha"],iframe[src*="challenges.cloudflare.com"],iframe[title*="captcha" i],.g-recaptcha,.h-captcha,.cf-turnstile,#challenge-form,[data-sitekey]'))return{kind:"captcha",evidence:"a CAPTCHA widget is present"};const e=Array.from(document.querySelectorAll("h1,h2,h3,legend,[role=heading]")).filter(e=>F(e)).map(e=>b(e)).join(" | "),t=`${document.title} | ${e}`.match(I);if(t)return{kind:"captcha",evidence:`page asks: "${t[0]}"`};if(document.querySelector('input[autocomplete="one-time-code"]'))return{kind:"mfa",evidence:"a one-time-code field is present"};const n=e.match(R);return n?{kind:"mfa",evidence:`page asks: "${n[0]}"`}:null}function ue(e){return!(e.overlay||e.interactive||e.insideInteractive||e.insideClickableRegion)&&!!(e.cursorPointer||e.inlineOnClick||e.tabbable)&&!e.parentCursorPointer&&!e.containsInteractive&&e.visible&&e.enabled&&e.hasText}const de="clickable",pe=new Set,fe=new WeakSet;function me(e){try{return getComputedStyle(e).cursor}catch{return""}}function he(e,t){let n,o=null;const r=()=>void 0===n?n=w(e):n;let i=null,a=null,l=null;const c=()=>{if(l)return l;const e={interactive:!1,clickable:!1};for(let n=r();n;n=w(n))U(n)&&(e.interactive=!0),t.has(n)&&(e.clickable=!0);return l=e,e};return{get overlay(){return s(e)},get interactive(){return U(e)},get insideInteractive(){return c().interactive},get insideClickableRegion(){return c().clickable},get cursorPointer(){return"pointer"===(o??=me(e))},get inlineOnClick(){return e.hasAttribute("onclick")},get tabbable(){return e.tabIndex>=0},get parentCursorPointer(){const e=r();return null!==e&&"pointer"===(i??=me(e))},get containsInteractive(){return null!==e.querySelector(Q)},get visible(){return F(e)},get enabled(){return!j(e)},get hasText(){return(a??=ge(e)).length>0}}}function ge(e){const t=e.innerText;return m("string"==typeof t&&t?t:b(e))}function be(e){return g(ge(e),200)}function xe(){const e=new Set,t=[];for(const n of x(document))ue(he(n,e))&&(e.add(n),t.push({el:n,role:de,name:be(n),source:"content",proxy:!1}));return t}function ye(e){let t="";for(const n of Array.from(e.childNodes))n.nodeType===Node.TEXT_NODE&&(t+=n.textContent??"");return t}function ve(e){for(let t=w(e);t;t=w(t))if(U(t))return!0;return!1}function we(e,t,n={}){return{ok:!1,code:e,message:t,...n}}function ke(e){return`"${g(e,60)}"`}function Ee(e,t,n={}){return we("TARGET_NOT_INTERACTABLE",`${e} ${t}`,n)}function Te(){const e=y();if(e)return e;const t=Array.from(document.querySelectorAll('[aria-modal="true"]')).filter(e=>e.matches("dialog,[role=dialog],[role=alertdialog]")&&F(e));return t.length?t[t.length-1]:null}function Ae(e,t){const n=h(t),o=e.filter(e=>h(ne(e.el))===n);return o.length?o:e.filter(e=>te(e.el).some(e=>h(e)===n))}function Se(e){const t=z.refs.get(e),n=t?.el.deref();if(!t||!n)return we("STALE_SNAPSHOT",`Reference ${e} is unknown on this page. Run page_inspect again.`);if(!n.isConnected)return we("STALE_SNAPSHOT",`The element behind ${e} was removed from the page. Run page_inspect again.`,{staleFingerprint:t.fingerprint,staleContext:t.context});const o=function(e){return fe.has(e)||function(e){return ue(he(e,pe))}(e)?de:O(e)}(n),{name:r,source:i}=function(e,t){return t===de?{name:be(e),source:"content"}:B(e)}(n,o);return oe(o,r)!==t.fingerprint?we("STALE_SNAPSHOT",`The element behind ${e} changed (now ${o} "${g(r,40)}"). Run page_inspect again.`,{staleFingerprint:t.fingerprint,staleContext:t.context}):{el:n,role:o,name:r,source:i,proxy:!0}}function Me(e){if(e.ref)return Se(e.ref);const t=e.role?.toLowerCase(),n=!(t&&!A.has(t)&&"generic"!==t&&"clickable"!==t);let o=n?ae():function(e){const t=[];for(const n of x(document)){if(O(n)!==e)continue;const{name:o,source:r}=B(n);t.push({el:n,role:e,name:g(o,200),source:r,proxy:!1})}return t}(t);const r=n&&("clickable"===t||!t&&(Boolean(e.name)||Boolean(e.text)));r&&(o=o.concat(xe())),t&&(o=o.filter(e=>e.role===t)),n&&(o=function(e){const t=Te();return t?e.filter(e=>k(t,e.el)):e}(o)),e.within&&(o=Ae(o,e.within));const i=[],a=e.name??e.label??e.text;if(e.label){const t=h(e.label);i.push({label:"label",pick:e=>P(e.el)&&"placeholder"!==e.source&&h(e.name)===t})}if(e.href){const t=e.href;i.push({label:"href",pick:e=>e.el instanceof HTMLAnchorElement&&((e.el.getAttribute("href")??"")===t||e.el.href===t||e.el.pathname===t)})}if(e.name||e.text){const t=h(e.name??e.text);i.push({label:"name",pick:e=>"placeholder"!==e.source&&h(e.name)===t})}if(e.text){const t=h(e.text);i.push({label:"text",pick:e=>h(b(e.el))===t}),i.push({label:"text in a clickable region",pick:e=>"clickable"===e.role&&function(e,t){if(!t)return!1;const n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);for(let e=n.nextNode();e;e=n.nextNode()){const n=e;if(0===n.children.length&&h(b(n))===t)return!0}return!1}(e.el,t)}),i.push({label:"placeholder",pick:e=>h(e.el.getAttribute("placeholder"))===t})}if(!i.length&&e.role&&i.push({label:"role",pick:()=>!0}),!i.length)return we("INVALID_ARGUMENT","A target needs one of: ref, name, label, text, href (optionally with role and within).");for(const t of i){const n=o.filter(t.pick);if(!n.length)continue;const r=n.filter(ie),i=r.length?r:n;return 1===i.length?i[0]:we("TARGET_AMBIGUOUS",`${i.length} elements match ${$e(e)} by ${t.label}. Nothing was done. `+(i.length>50?"The first 50 are listed. ":"")+"Use a ref from the candidates, or add role/within (a candidate's context) to narrow it.",{candidates:i.slice(0,50).map(se)})}if(e.text&&r){let t=function(e,t){const n=new Set,o=[];if(!e)return o;for(const r of x(document)){if(t&&!k(t,r))continue;if(h(0===r.children.length?b(r):ye(r))!==e)continue;if(s(r)||U(r)||ve(r)||!F(r))continue;if(r.closest("th, thead, [role=columnheader]"))continue;const i=r.closest("tr, [role=row], li, [role=listitem]"),a=i&&!i.querySelector(Q)?i:r;n.has(a)||j(a)||(n.add(a),fe.add(a),o.push({el:a,role:de,name:be(a),source:"content",proxy:!1}))}return o}(h(e.text),Te());if(e.within&&(t=Ae(t,e.within)),1===t.length)return t[0];if(t.length>1)return we("TARGET_AMBIGUOUS",`${t.length} elements show ${$e(e)}. Nothing was done. Use a ref from the candidates, or add within (a candidate's context) to narrow it.`,{candidates:t.slice(0,50).map(se)})}const l=h(a??e.href??""),c=l?o.filter(e=>h(e.name).includes(l)&&ie(e)).slice(0,8).map(se):[];return we("TARGET_NOT_FOUND",`No element matches ${$e(e)}.`,c.length?{candidates:c}:{})}function $e(e){const t=[];return e.role&&t.push(`role=${e.role}`),e.name&&t.push(`name="${e.name}"`),e.label&&t.push(`label="${e.label}"`),e.text&&t.push(`text="${e.text}"`),e.href&&t.push(`href="${e.href}"`),e.within&&t.push(`within="${e.within}"`),t.join(" ")||"(empty target)"}const Le=new WeakMap,Ce=[];function Ne(e,t){const n=Le.get(e);return Boolean(n&&n.bursts.length>=3&&t-n.bursts[0]<3e3&&t-n.last<3e3)}function Ie(e){if("childList"!==e.type||0===e.addedNodes.length&&0===e.removedNodes.length)return!1;for(const t of e.addedNodes)if(!s(t))return!1;for(const t of e.removedNodes)if(!s(t))return!1;return!0}new MutationObserver(e=>{const t=performance.now();for(const n of e){if(Ie(n))continue;z.mutations+=1;let e=Le.get(n.target);e||(e={last:-1/0,bursts:[]},Le.set(n.target,e)),t-e.last>50&&(e.bursts.push(t),e.bursts.length>3&&e.bursts.shift()),e.last=t,Ce.push({seq:z.mutations,at:t,node:new WeakRef(n.target)}),Ce.length>2e3&&Ce.shift()}}).observe(document,{subtree:!0,childList:!0,attributes:!0,characterData:!0});const Re=['[aria-busy="true"]','[role="progressbar"]',"progress",'[role="status"]','[role="alert"]','[class*="spinner" i]','[class*="loading" i]','[class*="loader" i]','[id*="spinner" i]','[id*="loading" i]'].join(", "),He=/load|wait|fetch|progress|processing|please|searching|saving/i;let Oe=null,Pe=0;const _e=new WeakMap;function Be(e){D();const{name:t,source:n}=B(e),o=O(e),r=P(e)&&t&&"placeholder"!==n?{label:t}:t&&"placeholder"===n?{text:t}:{role:o,name:t},i=[ne(e),...te(e)].filter((e,t,n)=>e&&n.indexOf(e)===t);for(const n of[r,...i.map(e=>({...r,within:e}))]){if(!t)break;const o=Me(n);if("el"in o&&o.el===e)return{target:n,ambiguous:!1,name:t}}return{target:i[0]?{...r,within:i[0]}:r,ambiguous:!0,name:t}}function Ue(e,t){try{chrome.runtime.sendMessage({source:"engine-recorder",step:{...e,id:`${z.docId}-${++Pe}`},value:t})}catch{}}function ze(e){return e instanceof HTMLInputElement&&!["checkbox","radio","button","submit","reset","file","image","hidden","range","color"].includes(e.type)||e instanceof HTMLTextAreaElement}function qe(e){const t=e.value;if(_e.get(e)===t)return;_e.set(e,t);const{target:n,ambiguous:o,name:r}=Be(e),i=Boolean(K(e,r));Ue({tool:"field_fill",args:{target:n},label:`Type into "${r||"field"}"`,param:r||"value",sensitive:i,ambiguous:o},i?void 0:t)}const De="data-browserzap-comment-target";let Fe=null,Ge=0;function We(e){try{chrome.runtime.sendMessage({source:"engine-comment",...e})}catch{}}function je(e){return e.composedPath().some(e=>e instanceof Node&&s(e))}function Ke(e){const t=[];let n=e;for(;n&&t.length<6&&n!==document.documentElement&&n!==document.body;){let e=n.tagName.toLowerCase();if(n.id)e+=`#${n.id}`;else{const t=Array.from(n.classList).filter(e=>!/^\d/.test(e)).slice(0,2);t.length&&(e+=`.${t.join(".")}`);const o=w(n);if(o){const t=Array.from(o.children).filter(e=>e.tagName===n.tagName);t.length>1&&(e+=`:nth-of-type(${t.indexOf(n)+1})`)}}if(t.unshift(e),n.id)break;n=w(n)}return t.join(" > ")}function Xe(e){D();const{name:t}=B(e),{target:n,ambiguous:o}=Be(e),r=e.getBoundingClientRect(),i=P(e)||e.isContentEditable,a=e.getAttribute("data-testid")??e.getAttribute("data-test")??e.getAttribute("data-cy")??e.getAttribute("data-test-id"),s={role:O(e),name:t||null,target:n,targetUnique:!o,tag:e.tagName.toLowerCase(),id:e.id||null,testId:a||null,classes:Array.from(e.classList).slice(0,6),domPath:Ke(e),rect:{x:Math.round(r.x),y:Math.round(r.y),width:Math.round(r.width),height:Math.round(r.height)}};if(i)s.sensitive=Boolean(K(e,t));else{const t=m(e.innerText??e.textContent??"");t&&(s.text=t.length>160?`${t.slice(0,159)}…`:t)}return s}function Ye(e){D();const{name:t}=B(e),n=O(e),o=e.tagName.toLowerCase(),r=n&&"generic"!==n?n:o;return t?`${r} "${t.length>40?`${t.slice(0,39)}…`:t}"`:r}function Ve(e,t){const n=t.getBoundingClientRect();l(e,{transform:`translate(${n.left}px, ${n.top}px)`,width:`${Math.max(n.width,2)}px`,height:`${Math.max(n.height,2)}px`})}function Ze(){if(Fe){Fe.frame=0,Fe.picked&&Ve(Fe.highlight,Fe.picked);for(const e of Fe.pins.values()){if(!e.el.isConnected){e.badge.style.display="none";continue}const t=e.el.getBoundingClientRect();l(e.badge,{display:"flex",transform:`translate(${Math.max(t.left-10,2)}px, ${Math.max(t.top-10,2)}px)`})}}}function Qe(){Fe&&!Fe.frame&&(Fe.frame=requestAnimationFrame(Ze))}function Je(){Fe?.card&&(Fe.card.remove(),Fe.card=null)}function et(e){if(!Fe)return{ok:!1};const t=String(e.cid??""),n=Number(e.n)||Fe.next;let o=e.el instanceof Element?e.el:null;if(!o)try{o=document.querySelector(`[${De}="${CSS.escape(t)}"]`)}catch{o=null}if(document.querySelectorAll(`[${De}="${CSS.escape(t)}"]`).forEach(e=>e.removeAttribute(De)),!o)return{ok:!1};Fe.pins.get(t)?.badge.remove();const r=function(e){const t=d();return p({position:"fixed",left:"0",top:"0",width:"20px",height:"20px","border-radius":"50%",display:"flex","align-items":"center","justify-content":"center",background:t.strong,color:t.ink,font:"700 11px/1 system-ui, sans-serif","box-shadow":"0 1px 4px rgba(0,0,0,.4)"},String(e))}(n);return Fe.host.root.appendChild(r),Fe.pins.set(t,{n,el:o,badge:r}),Fe.next=Math.max(Fe.next,n+1),Ze(),{ok:!0}}let tt=null,nt=null,ot=null,rt=null,it=null;function at(e){e.preventDefault(),e.stopPropagation()}function st(e,t,n){const o=document.createElement("button");return o.type="button",o.tabIndex=-1,o.textContent=t,l(o,{appearance:"none",margin:"0",padding:"6px 14px",border:n?"0":"1px solid rgba(255, 255, 255, 0.35)","border-radius":"999px",background:n?e.strong:"transparent",color:n?e.ink:"#ffffff",font:'700 12px/1.5 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',cursor:"pointer","pointer-events":"auto"}),o.addEventListener("pointerdown",at),o.addEventListener("mousedown",at),o.addEventListener("click",e=>{at(e),e.isTrusted&&function(e,t){try{chrome.runtime.sendMessage({source:"engine-approval",type:"decide",approvalId:e,approve:t}).catch(()=>{})}catch{}}(ot?.approvalId??"",o===nt?.approve)}),o}function lt(e){if(!e)return null;const t=z.refs.get(e)?.el.deref();return t?.isConnected?t:null}function ct(){rt&&(removeEventListener("scroll",rt,!0),removeEventListener("resize",rt),rt=null)}function ut(){if(!nt)return;const e=nt.card,t=lt(ot?.ref),n=e.offsetWidth||300,o=e.offsetHeight||96,r=Math.max(8,innerWidth-n-8);if(!t)return void l(e,{left:`${Math.round((innerWidth-n)/2)}px`,top:`${Math.round(innerHeight-o-28)}px`});const i=t.getBoundingClientRect(),a=Math.min(Math.max(8,Math.round(i.left)),r),s=Math.round(i.bottom+8),c=Math.round(i.top-8-o);l(e,{left:`${a}px`,top:`${s+o<=innerHeight-8?s:Math.max(8,c)}px`})}function dt(){null!==it&&(clearTimeout(it),it=null)}function pt(){dt(),ct(),ot=null,tt&&(tt.el.remove(),tt=null,nt=null)}function ft(){const e=ot;if(!e)return{ok:!0,skipped:!0};const t=f(tt,o,{role:"alertdialog",label:"BrowserZap: approve this action"});if(tt=t,!t)return nt=null,{ok:!0,skipped:!0};nt||(nt=function(e){const t=d(),n=p({position:"absolute",left:"0",top:"0",width:"min(300px, calc(100vw - 24px))","box-sizing":"border-box",display:"flex","flex-direction":"column","align-items":"flex-start",gap:"6px",padding:"10px 13px 11px","border-radius":"11px",background:"rgba(17, 17, 17, 0.96)",color:"#ffffff",border:`1px solid ${t.strong}`,"box-shadow":"0 12px 32px rgba(0, 0, 0, 0.42)",font:'500 12.5px/1.45 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',"pointer-events":"auto"}),o=p({font:'700 11.5px/1.4 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',"letter-spacing":"0.06em","text-transform":"uppercase"},"Approve this action?"),r=p({"overflow-wrap":"anywhere"}),i=p({opacity:"0.7",font:'500 11px/1.4 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif'}),a=p({display:"flex",gap:"8px","align-items":"center","margin-top":"3px"}),s=st(t,"Approve once",!0),l=st(t,"Deny",!1);return a.append(s,l),n.append(o,r,i,a),c()||n.animate([{opacity:0,transform:"translate3d(0, 4px, 0)"},{opacity:1,transform:"translate3d(0, 0, 0)"}],{duration:140,easing:"ease-out"}),e.append(n),{card:n,summary:r,risk:i,approve:s,deny:l}}(t.root));const n=nt;return n.summary.textContent=function(e){const t=e.replace(/\s+/g," ").trim();return t.length>200?`${t.slice(0,199)}…`:t}(e.summary),n.risk.textContent=function(e){const t=e.replace(/_/g," ").trim();return t?`Risk: ${t}`:"Needs your OK"}(e.risk),ut(),ct(),rt=()=>{const t=lt(e.ref);!e.ref||t?ut():pt()},addEventListener("scroll",rt,{capture:!0,passive:!0}),addEventListener("resize",rt,{passive:!0}),dt(),it=setTimeout(pt,3e5),n.card.style.removeProperty("pointer-events"),{ok:!0}}document.addEventListener("visibilitychange",()=>{"visible"===document.visibilityState&&ot&&!tt?.el.isConnected&&ft()});let mt=null,ht=null,gt=null,bt=null,xt=null;function yt(){null!==gt&&(clearTimeout(gt),gt=null)}function vt(e){if(!mt?.el.isConnected||!ht)return;const t=ht.pill,n=t.getBoundingClientRect();e.x>=n.left-4&&e.x<=n.right+4&&e.y>=n.top-4&&e.y<=n.bottom+4&&(t.style.setProperty("pointer-events","none"),setTimeout(()=>{ht?.pill===t&&t.style.setProperty("pointer-events","auto")},1200))}function wt(e){if(yt(),!mt)return;const t=mt;if(mt=null,ht=null,e||c()||"function"!=typeof t.el.animate)return void t.el.remove();const n=()=>t.el.remove();t.el.animate([{opacity:1},{opacity:0}],{duration:140,easing:"ease-out"}).finished.then(n).catch(n)}function kt(){if(null!==xt&&(clearTimeout(xt),xt=null),!bt)return;const e=bt;bt=null,removeEventListener("scroll",e.follow,!0),removeEventListener("resize",e.follow),e.host.el.remove()}const Et=[404,500,502,503,504],Tt=[/\bsomething went wrong\b/,/\b(?:we(?:'ve| have) )?encountered an error\b/,/\binternal server error\b/,/\bservice (?:temporarily )?unavailable\b/,/\b(?:an )?unexpected error (?:has )?occurred\b/,/\ban error occurred\b/,/\bthis page (?:isn'?t|is not) working\b/,/\bpage not found\b/],At=/^(?:error\s+|http\s+)?(\d{3})(?!\d)/,St=/^(?:error\s+|http\s+)?\d{3}\s*$/;function Mt(e){const t=e.trim().toLowerCase().match(At);if(!t)return null;const n=Number(t[1]);return Et.includes(n)?n:null}function $t(e){const t=e.toLowerCase().match(new RegExp(Tt.map(e=>e.source).join("|")));return t?t[0].slice(0,120):null}function Lt(e){const t=document.querySelector("main")??document.body;return t?function(e){const t=e.headings.filter(e=>e.level<=2&&e.text.trim()).slice(0,2);for(const e of t){const t=Mt(e.text);if(null!==t&&!(e.level>1&&St.test(e.text.trim())))return{status:t,text:e.text.trim().slice(0,120)}}for(const e of t){const t=$t(e.text);if(t)return{status:null,text:t}}const n=$t(e.text);return n&&e.network5xx?{status:null,text:n}:null}({headings:Array.from(document.querySelectorAll("h1,h2")).filter(e=>F(e)).slice(0,2).map(e=>({level:Number(e.tagName[1]),text:g(m(b(e)),120)})),text:m(t.innerText??"").slice(0,4e3),network5xx:e}):null}function Ct(e){const t=e.target??{},n=String(e.purpose??"click"),o=Me(t);if("ok"in o)return o;const{el:r,role:i,name:a}=o,l=ne(r),c={ref:re(r,i,a,l),role:i,name:g(a,100),context:l?g(l,60):void 0};if("probe"!==n){if(j(r))return Ee(`${i} ${ke(a)}`,"is disabled.",{target:c});if(!W(r))return Ee(`${i} ${ke(a)}`,"is not visible.",{target:c})}const u={ok:!0,...c,docId:z.docId,risk:le(r,i,a),sensitive:K(r,a),state:X(r),challenge:ce(),mutations:z.mutations,url:location.href,hidden:v()},d=e.scroll?W(r):null;if(e.scroll&&d){const e=d;e.scrollIntoView({block:"center",inline:"center",behavior:"instant"});const t=G(e),n=Math.round(t.left+t.width/2),o=Math.round(t.top+t.height/2);if(n<0||o<0||n>innerWidth||o>innerHeight)return Ee(`${i} ${ke(a)}`,"could not be scrolled into view.",{target:c});const l=e.getRootNode().elementFromPoint(n,o);if(null===l||!(s(l)||k(e,l)||k(r,l)||l instanceof HTMLLabelElement&&_(r).includes(l))){const e=l?`${l.tagName.toLowerCase()} "${g(B(l).name||b(l),40)}"`:"nothing";return Ee(`${i} ${ke(a)}`,`is covered by ${e}.`,{target:c})}u.point={x:n,y:o},u.pageRect={x:t.left+scrollX,y:t.top+scrollY,width:t.width,height:t.height},u.mutations=z.mutations}return u}function Nt(e){return e instanceof HTMLTextAreaElement?e:e instanceof HTMLInputElement?["checkbox","radio","button","submit","reset","image","file","range","color","hidden"].includes(e.type)?null:e:e.isContentEditable?e:null}function It(){let e=document.activeElement;for(;e?.shadowRoot?.activeElement;)e=e.shadowRoot.activeElement;return e}function Rt(e,t){const n=e instanceof HTMLTextAreaElement?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,o=Object.getOwnPropertyDescriptor(n,"value")?.set;o?o.call(e,t):e.value=t,e.dispatchEvent(new Event("input",{bubbles:!0,composed:!0}))}function Ht(e){const t=Se(String(e.ref));if("ok"in t)return t;const n=String(e.value??""),o=t.el;let r;if(o instanceof HTMLInputElement||o instanceof HTMLTextAreaElement)o.focus({preventScroll:!0}),Rt(o,n),r="nativeSetter";else{const e=o;e.focus({preventScroll:!0});const t=document.createRange();t.selectNodeContents(e);const i=getSelection();i?.removeAllRanges(),i?.addRange(t);const a=n?document.execCommand("insertText",!1,n):document.execCommand("delete");a||(e.textContent=n),r=a?"insertText":"textContent"}o.dispatchEvent(new Event("change",{bubbles:!0}));const i=function(e){return e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement?e.value:e.innerText??""}(o);return{ok:!0,verified:o instanceof HTMLInputElement&&"number"===o.type?Number(i)===Number(n):m(i)===m(n),method:r,length:i.length,mutations:z.mutations}}let Ot=null,Pt=null,_t=null,Bt=null,Ut=!1;function zt(e){return`translate3d(${e.x-1}px, ${e.y-1}px, 0)`}function qt(e){e.getAnimations().forEach(e=>e.cancel())}function Dt(){if(Ot?.el.isConnected&&Pt)return Pt;const t=f(Ot,e);return Ot=t,t?(Pt=function(e){const t=d(),n=document.createElement("div");n.setAttribute("data-bz-marker","arrow"),l(n,{position:"absolute",left:"0",top:"0",width:"18px",height:"22px","transform-origin":"1px 1px","will-change":"transform, opacity",opacity:"0","pointer-events":"none"});const o=document.createElementNS("http://www.w3.org/2000/svg","svg");o.setAttribute("width","18"),o.setAttribute("height","22"),o.setAttribute("viewBox","0 0 18 22"),o.setAttribute("aria-hidden","true");const r=document.createElementNS("http://www.w3.org/2000/svg","path");r.setAttribute("d","M1 1v16.2l4.4-4 2.7 7.2 2.9-1.2-2.7-7.1 5.9-.5z"),r.setAttribute("fill","#ffffff"),r.setAttribute("stroke","#111111"),r.setAttribute("stroke-width","1.4"),r.setAttribute("stroke-linejoin","round"),o.appendChild(r),n.appendChild(o);const i=p({position:"absolute",left:"0",top:"0",width:"9px",height:"18px",display:"none",opacity:"0","pointer-events":"none","will-change":"transform, opacity"});i.setAttribute("data-bz-marker","caret");const a=`${t.strong}`,s="0 0 0 0.5px rgba(255, 255, 255, 0.85), 0 0 0 1.5px rgba(17, 17, 17, 0.35)",c=p({position:"absolute",left:"4px",top:"0",width:"1.5px",height:"100%",background:a,"box-shadow":s}),u=p({position:"absolute",left:"0",top:"0",width:"9px",height:"2px",background:a,"box-shadow":s}),f=p({position:"absolute",left:"0",bottom:"0",width:"9px",height:"2px",background:a,"box-shadow":s});i.append(c,u,f);const m=document.createElement("div");l(m,{position:"absolute",left:"0",top:"0",width:"30px",height:"30px","border-radius":"50%","box-sizing":"border-box",border:`2px solid ${t.strong}`,background:t.soft,opacity:"0","pointer-events":"none"});const h=document.createElement("div");l(h,{position:"absolute",left:"0",top:"0","max-width":"160px",padding:"2px 7px","border-radius":"5px",background:"rgba(17, 17, 17, 0.9)",color:"#ffffff","box-shadow":"0 2px 8px rgba(0, 0, 0, 0.28)",font:'600 10px/1.5 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',"white-space":"nowrap","text-overflow":"ellipsis",overflow:"hidden",opacity:"0","pointer-events":"none"}),h.textContent="click";const g=document.createElement("div");return l(g,{position:"absolute",left:"0",top:"0","box-sizing":"border-box",border:`2px solid ${t.strong}`,"border-radius":"6px","box-shadow":`0 0 0 3px ${t.soft}`,opacity:"0","will-change":"opacity","pointer-events":"none"}),e.append(g,m,n,i,h),{cursor:n,ripple:m,label:h,outline:g,caret:i}}(t.root),Pt):(Pt=null,null)}const Ft=new Set(["","text","search","url","tel","email","password","number"]);function Gt(e){const t=function(){const e=It();return e&&e!==document.body&&e!==document.documentElement&&Nt(e)?e:null}(),n=t?function(e){const t=e.getBoundingClientRect();if(t.width<=0||t.height<=0)return null;const n=getComputedStyle(e),o=parseFloat(n.lineHeight)||1.35*(parseFloat(n.fontSize)||13),r=t.left+(parseFloat(n.borderLeftWidth)||0)+(parseFloat(n.paddingLeft)||0),i=t.right-(parseFloat(n.borderRightWidth)||0)-(parseFloat(n.paddingRight)||0),a=Math.max(r,i-1),s=Math.min(Math.max(o,12),Math.max(t.height-2,12));if(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement){const n=e instanceof HTMLInputElement?e.type:"textarea";let o="";if(e instanceof HTMLTextAreaElement||Ft.has(n)){const t=e instanceof HTMLInputElement&&"password"===n?"•".repeat(e.value.length):e.value;o=e instanceof HTMLTextAreaElement?t.slice(t.lastIndexOf("\n")+1):t}const i=Math.min(Math.max(r+function(e,t){if(!t)return 0;const n=getComputedStyle(e);try{const e=document.createElement("canvas").getContext("2d");if(e)return e.font=n.font&&""!==n.font?n.font:`${n.fontStyle} ${n.fontWeight} ${n.fontSize} ${n.fontFamily}`,e.measureText(t).width}catch{}return t.length*(parseFloat(n.fontSize)||13)*.55}(e,o)-e.scrollLeft,r),a);return{x:i,y:t.top+(t.height-s)/2,height:s}}const l=getSelection(),c=l&&l.rangeCount?l.getRangeAt(0):null;if(c&&l?.isCollapsed&&function(e,t){for(let n=t;n;n=n.parentNode)if(n===e)return!0;return!1}(e,c.startContainer)){const e=c.getBoundingClientRect();if(e.height>0)return{x:Math.min(Math.max(e.left,r),a),y:e.top,height:Math.min(Math.max(e.height,12),t.height)}}return{x:r,y:t.top+(t.height-s)/2,height:s}}(t):null;return!(!t||!n||(qt(e.caret),e.caret.style.display="block",e.caret.style.height=`${Math.round(n.height)}px`,e.caret.style.transform=`translate3d(${Math.round(n.x-4)}px, ${Math.round(n.y)}px, 0)`,e.caret.style.opacity="1",e.cursor.style.display="none",e.cursor.style.opacity="0",c()||e.caret.animate([{opacity:1},{opacity:0}],{duration:560,iterations:1/0,direction:"alternate",easing:"steps(1, end)"}),0))}function Wt(e){qt(e.caret),e.caret.style.display="none",e.caret.style.opacity="0",e.cursor.style.display="block"}function jt(e,t){const n=_t;if(_t=t,qt(e.cursor),e.cursor.style.opacity="1",!n||c()||Math.hypot(t.x-n.x,t.y-n.y)<2)return e.cursor.style.transform=zt(t),null;const o=Math.hypot(t.x-n.x,t.y-n.y),r=Math.max(90,Math.min(240,o/3));return e.cursor.style.transform=zt(n),e.cursor.animate([{transform:zt(n)},{transform:zt(t)}],{duration:r,easing:"cubic-bezier(0.2, 0.7, 0.3, 1)",fill:"forwards"})}function Kt(e,t,n){qt(e.label),e.label.textContent=n||"click",e.label.style.transform=`translate3d(${t.x+12}px, ${t.y+14}px, 0)`,c()?e.label.style.opacity="1":e.label.animate([{opacity:0,transform:`translate3d(${t.x+12}px, ${t.y+20}px, 0)`},{opacity:1,transform:`translate3d(${t.x+12}px, ${t.y+14}px, 0)`,offset:.18},{opacity:1,transform:`translate3d(${t.x+12}px, ${t.y+14}px, 0)`,offset:.7},{opacity:0,transform:`translate3d(${t.x+12}px, ${t.y+10}px, 0)`}],{duration:700,easing:"ease-out"})}function Xt(e,t){return"click"===e.phase||"press"===e.phase?(function(e,t){const n=Dt();n&&(vt(e),function(e){if(!tt?.el.isConnected||!nt)return;const t=nt.card,n=t.getBoundingClientRect();e.x>=n.left-4&&e.x<=n.right+4&&e.y>=n.top-4&&e.y<=n.bottom+4&&(t.style.setProperty("pointer-events","none"),setTimeout(()=>{nt?.card===t&&t.style.setProperty("pointer-events","auto")},1200))}(e),qt(n.ripple),qt(n.outline),n.outline.style.opacity="0",Wt(n),n.cursor.style.opacity="1",n.cursor.style.transform=zt(e),Kt(n,e,t),c()||(qt(n.cursor),n.cursor.animate([{transform:`${zt(e)} scale(1)`},{transform:`${zt(e)} scale(0.86)`,offset:.35},{transform:`${zt(e)} scale(1)`}],{duration:180,easing:"ease-out"}),n.ripple.animate([{transform:`translate3d(${e.x-15}px, ${e.y-15}px, 0) scale(0.25)`,opacity:.9},{transform:`translate3d(${e.x-15}px, ${e.y-15}px, 0) scale(1.3)`,opacity:0}],{duration:420,easing:"cubic-bezier(0.16, 1, 0.3, 1)"})),_t=e)}(e.point,e.label),Promise.resolve()):"type"===e.phase||"label"===e.phase?(function(e,t,n,o){const r=Dt();r&&(qt(r.outline),r.outline.style.opacity="0",o&&Gt(r)||(Wt(r),jt(r,e)),Kt(r,e,t),n&&function(e,t){qt(e.outline);const n=Math.round(t.x-scrollX),o=Math.round(t.y-scrollY);l(e.outline,{width:`${Math.max(1,Math.round(t.width))}px`,height:`${Math.max(1,Math.round(t.height))}px`,transform:`translate3d(${n}px, ${o}px, 0)`}),c()?e.outline.style.opacity="1":e.outline.animate([{opacity:0},{opacity:1,offset:.15},{opacity:1,offset:.7},{opacity:0}],{duration:900,easing:"ease-out"})}(r,n))}(e.point,e.label||"type",e.rect,t),Promise.resolve()):async function(e,t){const n=Dt();if(!n)return;vt(e);const o=null===_t;if(t&&Gt(n))return void(_t=e);Wt(n);const r=jt(n,e);if(o&&!c()&&(qt(n.cursor),n.cursor.animate([{opacity:0},{opacity:1}],{duration:120,easing:"ease-out"})),!r)return;const i=Number(r.effect?.getTiming().duration)||240;await Promise.race([r.finished.catch(()=>{}),new Promise(e=>setTimeout(e,i+120))]),n.cursor.style.transform=zt(e),r.cancel()}(e.point,t)}document.addEventListener("visibilitychange",()=>{"visible"===document.visibilityState&&Ut&&Bt&&(document.fullscreenElement&&Ot&&Ot.el.parentElement!==document.fullscreenElement&&(Ot.el.remove(),Ot=null,Pt=null),Xt(Bt,"arrow"!==Bt.marker).catch(()=>{}))});let Yt=null,Vt=null,Zt=null,Qt=null,Jt="",en=!1;function tn(e){e.isTrusted&&(en=!0)}function nn(e){const t=e.replace(/\s+/g," ").trim();return t.length>420?`${t.slice(0,419)}…`:t}function on(e){e.preventDefault(),e.stopPropagation()}function rn(){Qt&&(removeEventListener("scroll",Qt,!0),removeEventListener("resize",Qt),Qt=null),Vt&&(Vt.frame.style.setProperty("opacity","0"),Vt.frame.getAnimations().forEach(e=>e.cancel()))}function an(){const e=Zt;if(!e)return{ok:!0,skipped:!0};const t=f(Yt,i,{role:"alertdialog",label:"BrowserZap: your turn"});if(Yt=t,!t)return Vt=null,{ok:!0,skipped:!0};Vt||(Vt=function(e){const t=d(),n=p({position:"absolute",left:"50%",bottom:"28px",transform:"translateX(-50%)",width:"min(440px, calc(100vw - 32px))","box-sizing":"border-box",display:"flex","flex-direction":"column","align-items":"flex-start",gap:"7px",padding:"12px 15px 13px","border-radius":"12px",background:"rgba(17, 17, 17, 0.96)",color:"#ffffff",border:`1px solid ${t.strong}`,"box-shadow":"0 12px 36px rgba(0, 0, 0, 0.42)",font:'500 13px/1.45 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',"pointer-events":"none"}),o=p({font:'700 12px/1.4 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',"letter-spacing":"0.06em","text-transform":"uppercase"},"Your turn"),r=p({"overflow-wrap":"anywhere","white-space":"pre-wrap"}),i=document.createElement("button");i.type="button",i.tabIndex=-1,i.textContent="Done",l(i,{appearance:"none",margin:"2px 0 0",padding:"6px 20px",border:"0","border-radius":"999px",background:t.strong,color:t.ink,font:'700 12.5px/1.5 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',cursor:"pointer","pointer-events":"auto"}),i.addEventListener("pointerdown",on),i.addEventListener("mousedown",on),i.addEventListener("click",e=>{if(on(e),e.isTrusted)try{chrome.runtime.sendMessage({source:"engine-handoff",type:"done",pauseId:Jt}).catch(()=>{})}catch{}}),n.append(o,r,i);const a=p({position:"absolute",left:"0",top:"0","box-sizing":"border-box","will-change":"transform",opacity:"0","pointer-events":"none"});a.setAttribute("data-bz-ring","field");const s=p({position:"absolute",inset:"0","box-sizing":"border-box",border:`2px solid ${t.strong}`,"border-radius":"8px","box-shadow":`0 0 0 3px ${t.soft}`,opacity:"0.9"});return a.append(s),e.append(a,n),{card:n,message:r,done:i,frame:a,box:s}}(t.root)),Vt.message.textContent=e.message,document.addEventListener("input",tn,!0),e.field||(e.field=function(e){if(!e)return null;if(e.ref){const t=z.refs.get(e.ref)?.el.deref();if(t?.isConnected)return t}if(e.name||e.label){const t=Me({role:e.role,name:e.name,label:e.label,within:e.within});if(!("ok"in t))return t.el}return null}(e.target));const n=e.field,o=function(e){if(!e||null===Nt(e))return!1;try{e.focus({preventScroll:!1})}catch{return!1}return It()===e}(n);return function(e){if(!Vt)return;if(rn(),!e||!e.isConnected)return;const t=Vt,n=()=>{if(!e.isConnected)return;const n=e.getBoundingClientRect();l(t.frame,{width:`${Math.round(n.width+6)}px`,height:`${Math.round(n.height+6)}px`,transform:`translate3d(${Math.round(n.left-3)}px, ${Math.round(n.top-3)}px, 0)`,opacity:"1"})};n(),Qt=n,addEventListener("scroll",Qt,{capture:!0,passive:!0}),addEventListener("resize",Qt,{passive:!0}),c()||t.box.animate([{opacity:.5,transform:"scale(1)"},{opacity:1,transform:"scale(1.015)"}],{duration:1100,iterations:1/0,direction:"alternate",easing:"ease-in-out"})}(n),{ok:!0,ringed:Boolean(n),focused:o}}document.addEventListener("visibilitychange",()=>{"visible"===document.visibilityState&&Zt&&an()});let sn=null,ln=null,cn=null,un=null;function dn(e){e.preventDefault(),e.stopPropagation()}function pn(){null!==un&&(clearTimeout(un),un=null)}function fn(){if(null===cn)return{ok:!0,skipped:!0};const e=f(sn,r,{role:"status",label:"BrowserZap"});if(sn=e,!e)return ln=null,{ok:!0,skipped:!0};ln||(ln=function(e){const t=p({position:"absolute",left:"50%",bottom:"26px",transform:"translateX(-50%)",width:"min(380px, calc(100vw - 32px))","box-sizing":"border-box",display:"flex","align-items":"center",gap:"10px",padding:"9px 10px 9px 14px","border-radius":"11px",background:"rgba(17, 17, 17, 0.94)",color:"#ffffff",border:`1px solid ${d().soft}`,"box-shadow":"0 10px 30px rgba(0, 0, 0, 0.36)",font:'500 12.5px/1.4 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',"pointer-events":"auto"}),n=p({flex:"1 1 auto","overflow-wrap":"anywhere"}),o=document.createElement("button");return o.type="button",o.tabIndex=-1,o.setAttribute("aria-label","Dismiss"),o.textContent="×",l(o,{appearance:"none",margin:"0",padding:"0 7px",border:"0","border-radius":"999px",background:"transparent",color:"#ffffff",font:'700 16px/1.4 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',cursor:"pointer","pointer-events":"auto"}),o.addEventListener("pointerdown",dn),o.addEventListener("mousedown",dn),o.addEventListener("click",e=>{dn(e),e.isTrusted&&mn()}),t.append(n,o),e.append(t),c()||t.animate([{opacity:0,transform:"translate(-50%, 6px)"},{opacity:1,transform:"translate(-50%, 0)"}],{duration:160,easing:"ease-out"}),{card:t,message:n}}(e.root));const t=cn.length>240?`${cn.slice(0,239)}…`:cn;return ln.message.textContent=t,pn(),un=setTimeout(mn,6e3),{ok:!0}}function mn(){pn(),cn=null,sn&&(sn.el.remove(),sn=null,ln=null)}function hn(e){if(!e||e===document.body||e===document.documentElement)return{};if(!F(e))return{};const t=G(e);if(t.width<=0||t.height<=0)return{};const n=Math.round(t.left+Math.min(t.width/2,18)),o=Math.round(t.top+t.height/2);if(n<0||o<0||n>innerWidth||o>innerHeight)return{};const{name:r}=B(e);return{point:{x:n,y:o},ref:re(e,O(e),r,ne(e))}}function gn(e){return!e||e instanceof HTMLTextAreaElement||e.isContentEditable?null:e.form??e.closest("form")}function bn(e){return e.querySelector("button[type=submit],button:not([type]),input[type=submit],input[type=image]")}function xn(e){return!!e&&(e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement||(e instanceof HTMLInputElement?null!==Nt(e):!0===e.isContentEditable))}document.addEventListener("visibilitychange",()=>{"visible"!==document.visibilityState||null===cn||sn?.el.isConnected||fn()});const yn={ArrowDown:()=>({top:40}),ArrowUp:()=>({top:-40}),ArrowRight:()=>({left:40}),ArrowLeft:()=>({left:-40}),PageDown:e=>({top:e}),PageUp:e=>({top:-e}),Space:e=>({top:e}),Home:()=>({to:"start"}),End:()=>({to:"end"})},vn="data-browserzap-upload",wn={loadInfo:function(){const e=performance.getEntriesByType("navigation")[0],t=e=>"number"==typeof e&&e>0?Math.round(e):null;return{ok:!0,docId:z.docId,readyState:document.readyState,httpStatus:e?.responseStatus||null,ttfbMs:t(e?.responseStart),domContentLoadedMs:t(e?.domContentLoadedEventStart),loadMs:t(e?.loadEventEnd)}},busyState:function(){let e=null;for(const t of Array.from(document.querySelectorAll(Re))){if(!F(t))continue;const n=t.getAttribute("role"),o=m(t.innerText??t.textContent);if("status"!==n&&"alert"!==n||He.test(o)){if(("progressbar"===n||"PROGRESS"===t.tagName)&&("PROGRESS"===t.tagName?t.hasAttribute("value"):t.hasAttribute("aria-valuenow"))&&!He.test(`${o} ${t.getAttribute("aria-label")??""}`))continue;e=g(o||t.getAttribute("aria-label")||n||t.tagName.toLowerCase(),60);break}}return{ok:!0,docId:z.docId,readyState:document.readyState,mutations:z.mutations,indicator:e}},recordStart:function(){if(Oe)return{ok:!0,recording:!0};const e=e=>{if(!e.isTrusted)return;const t=function(e){let t=e instanceof Element?e:null;for(;t&&!U(t);)t=w(t);return t}(e.composedPath()[0]??null);if(!t||ze(t)||t instanceof HTMLSelectElement)return;if(t instanceof HTMLInputElement&&("checkbox"===t.type||"radio"===t.type))return;const n=z.mutations,o=location.href,{target:r,ambiguous:i,name:a}=Be(t);Ue({tool:"element_click",args:{target:r},label:`Click ${O(t)} "${a||"(unnamed)"}"`,ambiguous:i,expectChange:!0});const s=`${z.docId}-${Pe}`;setTimeout(()=>{if(z.mutations===n&&location.href===o)try{chrome.runtime.sendMessage({source:"engine-recorder",patch:{id:s,expectChange:!1}})}catch{}},800)},t=e=>{if(!e.isTrusted)return;const t=e.composedPath()[0];if(t instanceof Element)if(ze(t))qe(t);else if(t instanceof HTMLInputElement&&("checkbox"===t.type||"radio"===t.type)){if("radio"===t.type&&!t.checked)return;const{target:e,ambiguous:n,name:o}=Be(t);Ue({tool:"field_fill",args:{target:e,value:String(t.checked)},label:`${t.checked?"Check":"Uncheck"} "${o}"`,ambiguous:n})}else if(t instanceof HTMLSelectElement){const e=t.selectedOptions[0];if(!e)return;const{target:n,ambiguous:o,name:r}=Be(t),i=m(e.label||e.text);Ue({tool:"select_option",args:{target:n,option:{label:i}},label:`Choose "${i}" in "${r}"`,ambiguous:o})}},n=e=>{const t=e;if(!t.isTrusted||"Enter"!==t.key||t.isComposing)return;const n=t.composedPath()[0];n instanceof HTMLInputElement&&ze(n)&&(qe(n),Ue({tool:"browser_press_key",args:{key:"Enter"},label:"Press Enter",expectChange:!0}))};return document.addEventListener("click",e,!0),document.addEventListener("change",t,!0),document.addEventListener("keydown",n,!0),Oe={off:()=>{document.removeEventListener("click",e,!0),document.removeEventListener("change",t,!0),document.removeEventListener("keydown",n,!0)}},{ok:!0,recording:!0}},recordStop:function(){return Oe?.off(),Oe=null,{ok:!0,recording:!1}},commentStart:function(e){if(Fe)return{ok:!0,on:!0};const t=f(null,a);if(!t)return{ok:!0,on:!0};const n=d(),o=p({position:"fixed",left:"0",top:"0",display:"none","box-sizing":"border-box",border:`2px solid ${n.strong}`,background:n.soft,"border-radius":"3px"}),r=p({position:"absolute",left:"0",bottom:"100%","margin-bottom":"2px",background:n.strong,color:n.ink,font:"600 11px/1.3 system-ui, sans-serif",padding:"1px 6px","border-radius":"3px","white-space":"nowrap"});o.appendChild(r);const i=p({position:"fixed",top:"8px",left:"50%",transform:"translateX(-50%)",background:"#1b1b1b",color:"#f5f5f5",font:"600 12px/1.3 system-ui, sans-serif",padding:"6px 12px","border-radius":"999px","box-shadow":"0 2px 10px rgba(0,0,0,.3)",border:`1px solid ${n.strong}`},"Comment mode — click an element to comment · Esc to finish");t.root.append(o,i);const c=e=>{const t=e.composedPath()[0];return t instanceof Element&&!s(t)?t:null},u=e=>{if(!Fe||Fe.card||je(e))return;const t=c(e);t&&t!==document.documentElement&&t!==document.body&&(Fe.picked=t,r.textContent=Ye(t),Fe.highlight.style.display="block",Ve(Fe.highlight,t))},m=e=>{je(e)||(e.preventDefault(),e.stopImmediatePropagation())},h=e=>{if(je(e))return;if(m(e),!e.isTrusted||!Fe)return;const t=c(e);t&&(Fe.picked=t,r.textContent=Ye(t),Fe.highlight.style.display="block",Ve(Fe.highlight,t),function(e){if(!Fe)return;Je();const t=d(),n=e.getBoundingClientRect(),o=p({position:"fixed",left:`${Math.min(Math.max(n.left,8),innerWidth-300-8)}px`,top:`${n.bottom+170<innerHeight?n.bottom+8:Math.max(n.top-170,8)}px`,width:"300px","box-sizing":"border-box",background:"#1b1b1b",color:"#f5f5f5","border-radius":"10px",padding:"10px","pointer-events":"auto","box-shadow":"0 8px 28px rgba(0,0,0,.35)",font:'13px/1.4 system-ui, -apple-system, "Segoe UI", sans-serif',border:`1px solid ${t.strong}`}),r=p({"font-weight":"600","margin-bottom":"6px",overflow:"hidden","text-overflow":"ellipsis","white-space":"nowrap"},`Comment on ${Ye(e)}`),i=document.createElement("textarea");i.placeholder="What should change here?",i.maxLength=2e3,i.rows=3,l(i,{width:"100%","box-sizing":"border-box",resize:"vertical","border-radius":"6px",border:"1px solid #444",background:"#262626",color:"#f5f5f5",padding:"6px",font:"inherit"});const a=p({display:"flex",gap:"6px","justify-content":"flex-end","margin-top":"8px","align-items":"center"}),s=p({"margin-right":"auto",color:"#a3a3a3","font-size":"11px"},"Ctrl+Enter to save · Esc to cancel"),c=(e,n)=>{const o=document.createElement("button");return o.type="button",o.textContent=e,l(o,{border:n?"none":"1px solid #555",background:n?t.strong:"transparent",color:n?t.ink:"#eee","border-radius":"6px",padding:"4px 12px",cursor:"pointer",font:"inherit","font-weight":"600"}),o},u=c("Cancel",!1),f=c("Save",!0),m=()=>{const e=i.value.trim();if(!e||!Fe?.picked)return;const t=Fe.picked,n=`c-${Date.now().toString(36)}-${++Ge}`;t.setAttribute(De,n),Je(),Fe.highlight.style.display="none",Fe.picked=null,We({type:"add",cid:n,text:e,info:Xe(t),page:{url:location.href,title:document.title.slice(0,200),viewport:{width:innerWidth,height:innerHeight},devicePixelRatio}})};f.addEventListener("click",e=>{e.isTrusted&&m()}),u.addEventListener("click",e=>{e.isTrusted&&(Je(),Fe&&(Fe.picked=null,Fe.highlight.style.display="none"))}),i.addEventListener("keydown",e=>{e.stopPropagation(),e.isTrusted&&("Enter"===e.key&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),m()),"Escape"===e.key&&(e.preventDefault(),Je(),Fe&&(Fe.picked=null,Fe.highlight.style.display="none")))}),a.append(s,u,f),o.append(r,i,a),Fe.host.root.appendChild(o),Fe.card=o,i.focus()}(t))},g=e=>{e.isTrusted&&"Escape"===e.key&&!je(e)&&(e.preventDefault(),Fe?.card?Je():We({type:"exit"}))},b=["pointerdown","pointerup","mousedown","mouseup","dblclick","contextmenu","auxclick","submit"];window.addEventListener("pointermove",u,!0),window.addEventListener("click",h,!0);for(const e of b)window.addEventListener(e,m,!0);window.addEventListener("keydown",g,!0),window.addEventListener("scroll",Qe,!0),window.addEventListener("resize",Qe,!0),Fe={host:t,highlight:o,label:r,card:null,picked:null,pins:new Map,masks:[],frame:0,next:1,off:()=>{window.removeEventListener("pointermove",u,!0),window.removeEventListener("click",h,!0);for(const e of b)window.removeEventListener(e,m,!0);window.removeEventListener("keydown",g,!0),window.removeEventListener("scroll",Qe,!0),window.removeEventListener("resize",Qe,!0)}};for(const t of Array.isArray(e.pins)?e.pins:[]){let e=null;try{e=t.domPath?document.querySelector(t.domPath):null}catch{e=null}e&&et({cid:t.cid,n:t.n,el:e})}return{ok:!0,on:!0}},commentStop:function(){return Fe?(Fe.off(),Fe.frame&&cancelAnimationFrame(Fe.frame),Fe.host.el.remove(),document.querySelectorAll(`[${De}]`).forEach(e=>e.removeAttribute(De)),Fe=null,{ok:!0,on:!1}):{ok:!0,on:!1}},commentPin:et,commentUnpin:function(e){const t=String(e.cid??"");return Fe?.pins.get(t)?.badge.remove(),Fe?.pins.delete(t),document.querySelectorAll(`[${De}="${CSS.escape(t)}"]`).forEach(e=>e.removeAttribute(De)),{ok:!0}},commentCaptureStart:async function(e){if(!Fe)return{ok:!1};const t=String(e.cid??"");let n=null;try{n=document.querySelector(`[${De}="${CSS.escape(t)}"]`)}catch{n=null}for(const e of Array.from(Fe.host.root.children))e.style.visibility="hidden";D();for(const e of Array.from(document.querySelectorAll('input, textarea, [contenteditable=""], [contenteditable="true"]'))){const{name:t}=B(e);if(!K(e,t))continue;const n=e.getBoundingClientRect();if(n.width<1||n.height<1||n.bottom<0||n.top>innerHeight)continue;const o=p({position:"fixed",left:`${n.left}px`,top:`${n.top}px`,width:`${n.width}px`,height:`${n.height}px`,background:"#3a3a3a"});Fe.host.root.appendChild(o),Fe.masks.push(o)}await new Promise(e=>requestAnimationFrame(()=>requestAnimationFrame(()=>e())));const o=n?.getBoundingClientRect();return{ok:!0,rect:o?{x:o.x,y:o.y,width:o.width,height:o.height}:null,viewport:{width:innerWidth,height:innerHeight},devicePixelRatio}},commentCaptureEnd:function(){if(!Fe)return{ok:!0};for(const e of Fe.masks)e.remove();Fe.masks=[];for(const e of Array.from(Fe.host.root.children))e.style.visibility="";return Fe.picked||(Fe.highlight.style.display="none"),{ok:!0}},snapshot:function(e){const t=Math.min(Number(e.maxElements)||150,400),n=!1!==e.includeText,o=Math.min(Number(e.maxTextChars)||4e3,2e4);z.snapshotId+=1;const r=ae(),i=r.filter(ie),a=Te();let s=a?i.filter(e=>k(a,e.el)):i;const l="string"==typeof e.within&&e.within?e.within:null;l&&(s=Ae(s,l)),function(){if(!(z.refs.size<2e3))for(const[e,t]of z.refs)t.el.deref()||z.refs.delete(e)}();const c=[];let u=0,d=!1;const p=e=>{if(c.length>=t)return!1;const n=(e=>{const t=ne(e.el),n={ref:re(e.el,e.role,e.name,t),role:e.role,name:g(e.name,100),...X(e.el)};"placeholder"!==e.source&&"none"!==e.source||(n.nameSource=e.source),t&&(n.context=g(t,60)),e.el instanceof HTMLAnchorElement&&e.el.href&&(n.href=g(e.el.href,200)),K(e.el,e.name)&&(n.sensitive=!0);const o=e.el.getBoundingClientRect();return(o.bottom<0||o.top>innerHeight)&&(n.offscreen=!0),n})(e),o=JSON.stringify(n).length;return!(u+o>98304||(u+=o,c.push(n),0))};for(const e of s)if(!p(e)){d=!0;break}const f=xe(),x=(a?f.filter(e=>k(a,e.el)):f).filter(ie),y=l?Ae(x,l):x;let v=0,w=!1;for(const e of y){if(v>=60||!p(e)){w=!0;break}v+=1}const E=l?h(l):null,T=Array.from(document.querySelectorAll("h1,h2,h3,h4,h5,h6")).filter(e=>F(e)).filter(e=>!E||h(b(e))===E||te(e).some(e=>h(e)===E)).slice(0,40).map(e=>({level:Number(e.tagName[1]),text:g(b(e),100)})),A=Array.from(document.querySelectorAll("iframe,frame")),S=A.filter(e=>{try{return!e.contentDocument}catch{return!0}}).length;let M,$=!1;if(n){const e=m(document.body?.innerText??"");$=e.length>o,M=e.slice(0,o)}return{ok:!0,snapshotId:`s${z.snapshotId}`,docId:z.docId,url:location.href,title:g(document.title,200),elements:c,headings:T,text:M,challenge:ce(),siteError:Lt(!0===e.network5xx),counts:{interactive:r.length,visible:i.length,returned:c.length,hidden:r.length-i.length,...a||l?{inScope:s.length}:{},...y.length?{clickable:y.length,clickableReturned:v}:{}},modal:a?{name:g(B(a).name||Y(a),100),outside:i.length-(a?i.filter(e=>k(a,e.el)).length:0)}:null,within:l,limits:{truncated:d,textTruncated:$,clickableTruncated:w,frames:A.length,crossOriginFrames:S,note:[a?"A modal dialog is open: only its controls are listed and can be targeted. Close it to reach the page behind.":"",l&&0===s.length&&0===y.length?`No visible controls are inside "${g(l,80)}".`:"",w?`Only ${v} of ${y.length} clickable region(s) are listed; use within to narrow the page.`:"",S?"Controls inside cross-origin frames are not inspected.":""].filter(Boolean).join(" ")||void 0}}},siteError:function(e){return{ok:!0,docId:z.docId,siteError:Lt(!0===e.network5xx)}},fileInput:function(e){const t=String(e.phase??"mark"),n=String(e.mark??"");if("unmark"===t)return document.querySelectorAll(`[${vn}]`).forEach(e=>e.removeAttribute(vn)),{ok:!0};const o=Se(String(e.ref));if("ok"in o)return o;const r=o.el;return r instanceof HTMLInputElement&&"file"===r.type?r.disabled?{ok:!1,code:"TARGET_NOT_INTERACTABLE",message:"The file input is disabled."}:"check"===t?{ok:!0,files:r.files?.length??0,names:Array.from(r.files??[]).map(e=>e.name).slice(0,10)}:(n&&r.setAttribute(vn,n),{ok:!0,multiple:r.multiple,accept:r.accept||null,files:r.files?.length??0}):{ok:!1,code:"TARGET_NOT_INTERACTABLE",message:`"${o.name||r.tagName.toLowerCase()}" is not a file input. Target the page's "Choose file" input itself.`}},resolve:Ct,click:function(e){const t=Se(String(e.ref));if("ok"in t)return t;const n=W(t.el);if(!n)return Ee(ke(t.name),"is not visible.");const o=G(n);return o.width<=0||o.height<=0?Ee(ke(t.name),"has no visible area."):(function(e){e.scrollIntoView({block:"center",inline:"center",behavior:"instant"});const t=e.getBoundingClientRect(),n=t.left+t.width/2,o=t.top+t.height/2,r={bubbles:!0,cancelable:!0,composed:!0,view:window,button:0,buttons:1,clientX:n,clientY:o,screenX:n,screenY:o,detail:1};try{const t={...r,pointerId:1,pointerType:"mouse",isPrimary:!0,width:1,height:1};e.dispatchEvent(new PointerEvent("pointerdown",t)),e.dispatchEvent(new MouseEvent("mousedown",r)),e.dispatchEvent(new PointerEvent("pointerup",{...t,buttons:0})),e.dispatchEvent(new MouseEvent("mouseup",{...r,buttons:0}))}catch{}"function"==typeof e.click?e.click():e.dispatchEvent(new MouseEvent("click",{...r,buttons:0}))}(n),{ok:!0,ref:e.ref,method:"dom",hidden:v(),state:X(t.el),mutations:z.mutations})},cursor:async function(e){const t=String(e.phase??"move");if("hide"===t)return function(e){if(Ut=!1,Bt=null,_t=null,!Ot)return;const t=Ot;if(Ot=null,Pt=null,e||c()||"function"!=typeof t.el.animate)return void t.el.remove();const n=()=>t.el.remove();t.el.animate([{opacity:1},{opacity:0}],{duration:140,easing:"ease-out"}).finished.then(n).catch(n),setTimeout(n,220)}(!0===e.immediate),{ok:!0};if("idle"===t)return{ok:!0};const n=e.point;if(!n||!Number.isFinite(n.x)||!Number.isFinite(n.y))return{ok:!0,skipped:!0};const o=e.rect,r={phase:t,point:n,label:"string"==typeof e.label?e.label.slice(0,24):"",rect:o&&Number.isFinite(o.width)&&Number.isFinite(o.height)?{x:o.x,y:o.y,width:o.width,height:o.height}:null,marker:"arrow"===e.marker?"arrow":"caret"};return Bt=r,"visible"!==document.visibilityState?{ok:!0,skipped:!0}:(Ut=!0,await Xt(r,"arrow"!==r.marker),"move"===t?{ok:!0,mutations:z.mutations}:{ok:!0})},indicator:function(e){const o=String(e.phase??"show");return"hide"===o?(wt(!0===e.immediate),kt(),{ok:!0}):"visible"!==document.visibilityState?{ok:!0,skipped:!0}:"ring"===o?(function(e){const t=z.refs.get(e)?.el.deref();if(!t||!t.isConnected)return void kt();kt();const o=f(null,n);if(!o)return;const r=d(),i=p({position:"absolute",left:"0",top:"0","will-change":"transform","pointer-events":"none"}),a=p({position:"absolute",inset:"0","box-sizing":"border-box",border:`2px solid ${r.strong}`,"border-radius":"8px","box-shadow":`0 0 0 3px ${r.soft}`,opacity:"0.9"});i.append(a),o.root.append(i);const s=()=>{if(!t.isConnected)return void kt();const e=t.getBoundingClientRect();l(i,{width:`${Math.round(e.width+6)}px`,height:`${Math.round(e.height+6)}px`,transform:`translate3d(${Math.round(e.left-3)}px, ${Math.round(e.top-3)}px, 0)`})};s(),bt={host:o,follow:s},xt=setTimeout(()=>kt(),12e4),c()||(a.animate([{opacity:.5,transform:"scale(1)"},{opacity:1,transform:"scale(1.015)"}],{duration:1100,iterations:1/0,direction:"alternate",easing:"ease-in-out"}),addEventListener("scroll",s,{capture:!0,passive:!0}),addEventListener("resize",s,{passive:!0}))}(String(e.ref??"")),{ok:!0}):"ringHide"===o?(kt(),{ok:!0}):(r="idle"===o?1500:3e4,function(){if(mt?.el.isConnected&&ht)return ht;const e=f(mt,t);return mt=e,e?(ht=function(e){const t=d(),n=p({position:"absolute",inset:"0","box-sizing":"border-box",border:`2px solid ${t.strong}`,"box-shadow":`inset 0 0 26px ${t.soft}`,opacity:"0.9","pointer-events":"none"}),o=p({position:"absolute",left:"0",right:"0",bottom:"22px",display:"flex","justify-content":"center","pointer-events":"none"}),r=p({display:"flex","align-items":"center",gap:"9px",padding:"5px 6px 5px 12px","border-radius":"999px",background:"rgba(17, 17, 17, 0.9)",color:"#ffffff","box-shadow":"0 4px 18px rgba(0, 0, 0, 0.3)",font:'600 11.5px/1.5 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',"white-space":"nowrap","pointer-events":"auto"}),i=p({width:"6px",height:"6px","border-radius":"50%",background:t.strong,"flex-shrink":"0"}),a=p({"letter-spacing":"0.01em",opacity:"0.94"},"BrowserZap · agent working"),s=document.createElement("button");s.type="button",s.tabIndex=-1,s.textContent="Stop",l(s,{appearance:"none",margin:"0",padding:"3px 11px",border:"0","border-radius":"999px",background:t.strong,color:t.ink,font:'700 11px/1.5 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',cursor:"pointer"});const u=e=>{e.preventDefault(),e.stopPropagation()};return s.addEventListener("pointerdown",u),s.addEventListener("mousedown",u),s.addEventListener("click",e=>{if(u(e),e.isTrusted){try{chrome.runtime.sendMessage({source:"engine-control",type:"stop"}).catch(()=>{})}catch{}wt(!1)}}),r.append(i,a,s),o.append(r),e.append(n,o),c()||r.animate([{opacity:0,transform:"translate3d(0, 6px, 0)"},{opacity:1,transform:"translate3d(0, 0, 0)"}],{duration:160,easing:"ease-out"}),{border:n,pill:r}}(e.root),c()||ht.border.animate([{opacity:.45},{opacity:1}],{duration:1500,iterations:1/0,direction:"alternate",easing:"ease-in-out"}),ht):(ht=null,null)}()&&(yt(),gt=setTimeout(()=>wt(!1),r)),{ok:!0});var r},handoff:function(e){const t=String(e.phase??"show");return"status"===t?{ok:!0,paused:Boolean(Zt),typed:en}:"hide"===t?(rn(),document.removeEventListener("input",tn,!0),Zt=null,en=!1,Yt&&(Yt.el.remove(),Yt=null,Vt=null),{ok:!0}):(Yt?.el.isConnected||(Yt=null,Vt=null),"suppress"===t?(Yt&&Yt.el.style.setProperty("display","none"),{ok:!0}):"restore"===t?(Yt&&Yt.el.style.removeProperty("display"),{ok:!0}):(Zt={message:nn(String(e.message??"The agent needs you to take over.")),target:e.target??void 0,field:null},Jt=String(e.pauseId??""),"visible"!==document.visibilityState?{ok:!0,skipped:!0}:an()))},approval:function(e){const t=String(e.phase??"show");return"hide"===t?(pt(),{ok:!0}):(tt?.el.isConnected||(tt=null,nt=null),"suppress"===t?(tt&&tt.el.style.setProperty("display","none"),{ok:!0}):"restore"===t?(tt&&tt.el.style.removeProperty("display"),{ok:!0}):(ot={approvalId:String(e.approvalId??""),summary:String(e.summary??"This action needs your OK."),risk:String(e.risk??""),ref:void 0===e.ref?void 0:String(e.ref)},"visible"!==document.visibilityState?{ok:!0,skipped:!0}:ft()))},note:function(e){return"hide"===String(e.phase??"show")?(mn(),{ok:!0}):(cn=String(e.message??"The agent finished — this tab is yours."),"visible"!==document.visibilityState?{ok:!0,skipped:!0}:fn())},fillPrepare:function(e){const t=Ct({target:e.target,purpose:"fill",scroll:!0});if(!t.ok)return t;const n=Se(t.ref);if(t.sensitive)return we("USER_ACTION_REQUIRED",`"${t.name}" is a sensitive field (${t.sensitive}). BrowserZap never types into it; ask the user to fill it.`,{target:{ref:t.ref,role:t.role,name:t.name},sensitive:t.sensitive});if(n.el instanceof HTMLInputElement&&("checkbox"===n.el.type||"radio"===n.el.type))return{...t,kind:"toggle",checked:n.el.checked};if(n.el instanceof HTMLSelectElement)return we("UNSUPPORTED_CONTROL",`"${t.name}" is a <select>. Use select_option.`,{target:t});const o=Nt(n.el);if(!o)return we("UNSUPPORTED_CONTROL",`${t.role} "${t.name}" does not accept text.`,{target:t});if(o.readOnly)return we("TARGET_NOT_INTERACTABLE",`"${t.name}" is read-only.`,{target:t});if(o.focus({preventScroll:!0}),o instanceof HTMLInputElement||o instanceof HTMLTextAreaElement)o instanceof HTMLTextAreaElement||["text","search","url","tel","password",""].includes(o.type)?o.select():o.value&&Rt(o,"");else{const e=document.createRange();e.selectNodeContents(o);const t=getSelection();t?.removeAllRanges(),t?.addRange(e)}const r=k(o,It());return"string"!=typeof e.value||t.challenge?{...t,kind:"text",focused:r}:{...t,kind:"text",focused:r,applied:Ht({ref:t.ref,value:e.value})}},fillApply:Ht,selectOption:function(e){const t=Ct({target:e.target,purpose:"select",scroll:!0});if(!t.ok)return t;const n=Se(t.ref).el;if(!(n instanceof HTMLSelectElement))return we("UNSUPPORTED_CONTROL",`${t.role} "${t.name}" is not a native <select>. Open it with element_click, then click the option.`,{target:t});const o=e.option??{},r=Array.from(n.options);let i=[];if(void 0!==o.value)i=r.filter(e=>e.value===o.value);else{if(void 0===o.label)return we("INVALID_ARGUMENT","option needs a label or a value.");{const e=h(o.label);i=r.filter(t=>h(t.label||t.text)===e)}}if(!i.length)return we("TARGET_NOT_FOUND",`No option matches in "${t.name}".`,{candidates:r.slice(0,20).map(e=>({ref:"",role:"option",name:g(m(e.label||e.text),100),value:e.value}))});if(i.length>1)return we("TARGET_AMBIGUOUS",`${i.length} options match in "${t.name}". Select by value instead.`,{candidates:i.slice(0,8).map(e=>({ref:"",role:"option",name:m(e.label||e.text),value:e.value}))});const a=i[0];if(a.disabled)return we("TARGET_NOT_INTERACTABLE",`Option "${m(a.label)}" is disabled.`);const s=n.value;n.focus({preventScroll:!0}),n.value=a.value,n.dispatchEvent(new Event("input",{bubbles:!0})),n.dispatchEvent(new Event("change",{bubbles:!0}));const l=n.value===a.value&&n.selectedOptions[0]===a;return{ok:!0,ref:t.ref,name:t.name,selected:{label:g(m(a.label||a.text),100),value:a.value},changed:s!==n.value,verified:l,sensitive:t.sensitive,point:t.point,pageRect:t.pageRect}},observe:function(e){let t;if("string"==typeof e.ref){const n=z.refs.get(e.ref),o=n?.el.deref();t=o&&o.isConnected?{connected:!0,...X(o)}:{connected:!1}}const n={ok:!0,docId:z.docId,url:location.href,title:document.title,readyState:document.readyState,mutations:z.mutations,target:t};if("number"==typeof e.since){const t=function(e){if(e>=z.mutations)return{count:0,quietMs:null};const t=performance.now();if(Ce.length&&Ce[0].seq>e+1)return{count:2e3,quietMs:0};let n=t;const o=new Set;for(let r=Ce.length-1;r>=0;r--){const i=Ce[r];if(i.seq>e)continue;if(n===t&&(n=i.at),i.at<n-1500)break;const a=i.node.deref();a&&o.add(a)}const r=new Set;let i=null,a=0;for(let n=Ce.length-1;n>=0&&Ce[n].seq>e;n--){const e=Ce[n].node.deref();if(!e||r.has(e))continue;if(r.add(e),o.has(e)||Ne(e,t))continue;a++;const s=Le.get(e)?.last??t;(null===i||s>i)&&(i=s)}return{count:a,quietMs:null===i?null:Math.round(t-i)}}(e.since);n.changes=t.count,n.changeQuietMs=t.quietMs}if(!0===e.modal){const e=Te();n.modal=e?{role:e.getAttribute("role")||"dialog",name:g(B(e).name||"",80)||null}:null}if(e.expect&&"object"==typeof e.expect){const t=function(e){const t={ok:!0,docId:z.docId,url:location.href};if("string"==typeof e.text&&(t.text=h(document.body?.innerText).includes(h(e.text))),e.target){const n=Me(e.target);t.target=!("ok"in n)&&ie(n),t.targetAmbiguous="ok"in n&&"TARGET_AMBIGUOUS"===n.code,t.targetAmbiguous&&(t.targetCandidates=("candidates"in n?n.candidates:void 0)??[])}if(e.targetGone){const n=Me(e.targetGone);t.targetGone="ok"in n?"TARGET_NOT_FOUND"===n.code||"STALE_SNAPSHOT"===n.code:!ie(n)}return t}(e.expect);n.expect={text:t.text,target:t.target,targetGone:t.targetGone,ambiguous:t.targetAmbiguous,candidates:t.targetCandidates}}return n},keyContext:function(e){const t=It(),n=String(e.key??""),o={ok:!0,docId:z.docId,url:location.href,hidden:v(),...hn(t)};if("Enter"!==n||!t)return{...o,risk:"reversible"};if(t instanceof HTMLButtonElement||t instanceof HTMLAnchorElement&&t.href||t instanceof HTMLInputElement&&["submit","image","button"].includes(t.type)){const{name:e}=B(t),n=O(t);return{...o,risk:le(t,n,e),submits:{role:n,name:g(e,100),fingerprint:oe(n,e)},challenge:ce()}}const r=gn(t);if(!r)return{...o,risk:"reversible"};const i=bn(r),a=i?B(i).name:Y(r)||"form",s=i?O(i):"form",l=i?le(i,s,a):"post"===r.method.toLowerCase()?"external_side_effect":"reversible";return{...o,risk:l,submits:{role:s,name:g(a,100),fingerprint:oe(s,a)},challenge:ce()}},pressKey:function(e){const t=String(e.key??""),n=new Set(Array.isArray(e.modifiers)?e.modifiers:[]),o=It()??document.body??document.documentElement,r=Number(e.keyCode)||0,i={key:"Space"===t?" ":t,code:String(e.code??t),keyCode:r,which:r,bubbles:!0,cancelable:!0,composed:!0,view:window,altKey:n.has("alt"),ctrlKey:n.has("ctrl"),metaKey:n.has("meta"),shiftKey:n.has("shift")},a=o.dispatchEvent(new KeyboardEvent("keydown",i));!a||"Enter"!==t&&"Space"!==t||o.dispatchEvent(new KeyboardEvent("keypress",i));let s="none";return!a||i.altKey||i.ctrlKey||i.metaKey||(s=function(e,t,n){const o=t,r=t instanceof HTMLButtonElement||"SUMMARY"===t.tagName||t instanceof HTMLInputElement&&["button","submit","reset","image","checkbox","radio"].includes(t.type);if("Enter"===e){if(t instanceof HTMLAnchorElement&&t.href)return o.click(),"activate";if(t instanceof HTMLButtonElement||"SUMMARY"===t.tagName)return o.click(),"activate";const e=gn(t);if(e&&t instanceof HTMLInputElement&&Nt(t)){const t=bn(e);if(t){if(j(t))return"none";t.click()}else e.requestSubmit();return"submit"}return"none"}if("Space"===e&&r)return o.click(),"activate";if("Tab"===e){const e=function(){const e=[];for(const t of x(document)){const n=t;"number"!=typeof n.tabIndex||n.tabIndex<0||j(t)||t instanceof HTMLInputElement&&"hidden"===t.type||F(t)&&e.push(n)}return[...e.filter(e=>e.tabIndex>0).sort((e,t)=>e.tabIndex-t.tabIndex),...e.filter(e=>0===e.tabIndex)]}();if(!e.length)return"none";const t=e.indexOf(o);return(t<0?e[n?e.length-1:0]:e[(t+(n?-1:1)+e.length)%e.length]).focus(),"focus"}if("Escape"===e){const e=y();return e&&e.dispatchEvent(new Event("cancel",{cancelable:!0}))?(e.close(),"closeDialog"):"none"}if(("Backspace"===e||"Delete"===e)&&xn(t))return document.execCommand("Backspace"===e?"delete":"forwardDelete"),"delete";const i=yn[e];if(i&&!xn(t)&&!r){const t=i(Math.round(.875*innerHeight));return t.to?scrollTo({top:"start"===t.to?0:document.documentElement.scrollHeight,behavior:"instant"}):window.scrollBy({top:(n&&"Space"===e?-1:1)*(t.top??0),left:t.left??0,behavior:"instant"}),"scroll"}return"none"}(t,o,Boolean(i.shiftKey))),o.dispatchEvent(new KeyboardEvent("keyup",i)),{ok:!0,method:"dom",prevented:!a,defaultAction:s,mutations:z.mutations}},scroll:function(e){const t=Math.min(Math.max(Number(e.amount)||600,1),5e3),n=String(e.direction??"down"),o="left"===n?-t:"right"===n?t:0,r="up"===n?-t:"down"===n?t:0;let i=window;if(e.target){const t=Me(e.target);if("ok"in t)return t;i=t.el}const a=()=>i===window?{x:scrollX,y:scrollY}:{x:i.scrollLeft,y:i.scrollTop},s=a();i.scrollBy({left:o,top:r,behavior:"instant"});const l=a();return{ok:!0,moved:s.x!==l.x||s.y!==l.y,position:l,atEnd:i===window&&innerHeight+scrollY>=document.documentElement.scrollHeight-2}}};16!==globalThis.__browserzapEngine?.version&&(globalThis.__browserzapEngine={version:16,run(e,t){const n=Object.prototype.hasOwnProperty.call(wn,e)?wn[e]:void 0;if(!n)return we("INVALID_ARGUMENT",`Unknown engine operation: ${e}`);D();try{return n(t??{})}catch(e){return we("INTERNAL",e instanceof Error?e.message:String(e))}finally{D()}}})})();
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/extension/logo.svg
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="BrowserZap">
|
|
2
|
-
<style>.w{fill:#0A0A0A}.g{fill:#FAFAFA}.gs{stroke:#FAFAFA}.p{fill:#FAFAFA;stroke:#0A0A0A}@media (prefers-color-scheme:dark){.w{fill:#FAFAFA}.g{fill:#0A0A0A}.gs{stroke:#0A0A0A}.p{fill:#0A0A0A;stroke:#FAFAFA}}</style>
|
|
3
|
-
<path class="w" d="M2 12a8 8 0 0 1 8-8h14.6a5 5 0 0 1 3.9 1.9L32 10h22a8 8 0 0 1 8 8v34a8 8 0 0 1-8 8H10a8 8 0 0 1-8-8Z"/>
|
|
4
|
-
<g class="g"><circle cx="9.5" cy="10.5" r="2"/><circle cx="15.5" cy="10.5" r="2"/><circle cx="21.5" cy="10.5" r="2"/></g>
|
|
5
|
-
<g class="gs" transform="translate(13 19.5) scale(1.3)" fill="none" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M3.4 8h17.2M3.4 16h17.2"/></g>
|
|
6
|
-
<path class="p" transform="translate(33 33.5) scale(0.9)" stroke-width="3" stroke-linejoin="round" paint-order="stroke" d="M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z"/>
|
|
7
|
-
</svg>
|
package/extension/manifest.json
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"manifest_version": 3,
|
|
3
|
-
"name": "BrowserZap",
|
|
4
|
-
"version": "0.6.1",
|
|
5
|
-
"description": "Let your AI agent use the Chrome you already use: exact clicks, your approval before anything risky, passwords stay yours.",
|
|
6
|
-
"homepage_url": "https://browserzap.com",
|
|
7
|
-
"permissions": [
|
|
8
|
-
"debugger",
|
|
9
|
-
"scripting",
|
|
10
|
-
"tabs",
|
|
11
|
-
"tabGroups",
|
|
12
|
-
"sidePanel",
|
|
13
|
-
"storage",
|
|
14
|
-
"notifications",
|
|
15
|
-
"alarms",
|
|
16
|
-
"nativeMessaging"
|
|
17
|
-
],
|
|
18
|
-
"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtCOmd/zfDzGVdWGLy4tw5nyG1AXoIyQSXWNlAxdCkyWvBQgCLInnyC3PQP/9BTmeeQbhU+7G7WaQmY1pKEnGekFO+NM8RSSi6/hg0fQzBU73eKHTi4fM7BNCrSTaq9Ax2Ij3Adjyn770F/uCrGb3uQjBHEQS1Zk4NoqXODZSLiRiiGGC4lYco3EcwdBMgn/0PT5rKdCoUI+85aVgpG85KrfvUyIc7/hILQwA9nj4OwDiOuGdIuw4voyneQUCBIl6JkiW4hmAcz9ShL/Iu20MLXPKNYyGfB5tNrxPXcBwMfmgR+/uUWsknGg+aF62JAD6yWWffJOMIZpngeme6D1+awIDAQAB",
|
|
19
|
-
"host_permissions": [
|
|
20
|
-
"<all_urls>"
|
|
21
|
-
],
|
|
22
|
-
"background": {
|
|
23
|
-
"service_worker": "background.js",
|
|
24
|
-
"type": "module"
|
|
25
|
-
},
|
|
26
|
-
"side_panel": {
|
|
27
|
-
"default_path": "sidepanel.html"
|
|
28
|
-
},
|
|
29
|
-
"action": {
|
|
30
|
-
"default_title": "BrowserZap",
|
|
31
|
-
"default_icon": {
|
|
32
|
-
"16": "icons/icon16.png",
|
|
33
|
-
"32": "icons/icon32.png",
|
|
34
|
-
"48": "icons/icon48.png",
|
|
35
|
-
"128": "icons/icon128.png"
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
"icons": {
|
|
39
|
-
"16": "icons/icon16.png",
|
|
40
|
-
"32": "icons/icon32.png",
|
|
41
|
-
"48": "icons/icon48.png",
|
|
42
|
-
"128": "icons/icon128.png"
|
|
43
|
-
},
|
|
44
|
-
"content_security_policy": {
|
|
45
|
-
"extension_pages": "script-src 'self'; object-src 'self'"
|
|
46
|
-
}
|
|
47
|
-
}
|
package/extension/sidepanel.css
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-ease:initial;--tw-divide-x-reverse:0}}}@layer theme{:root,:host{--font-sans:"Inter Variable", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;--font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--font-mono:ui-monospace, "SF Mono", "Cascadia Mono", Consolas, monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-900:oklch(37.8% .077 168.94);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-900:oklch(41% .159 10.272);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Inter Variable", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;--default-mono-font-family:ui-monospace, "SF Mono", "Cascadia Mono", Consolas, monospace}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{margin:calc(var(--spacing) * 0);background-color:var(--bz-bg-0);--tw-leading:var(--leading-snug);font-family:Inter Variable,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif;font-size:13px;line-height:var(--leading-snug);color:var(--bz-fg-0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:focus-visible{outline:2px solid var(--bz-accent);outline-offset:2px}code{background-color:var(--bz-bg-3);padding-inline:calc(var(--spacing) * 1);border-radius:.25rem;font-family:ui-monospace,SF Mono,Cascadia Mono,Consolas,monospace;font-size:11px}input[type=text],input[type=password],input[type=number],textarea{border-radius:var(--radius-md);border-style:var(--tw-border-style);border-width:1px;border-color:var(--bz-line);background-color:var(--bz-bg-2);width:100%;padding-inline:calc(var(--spacing) * 2);padding-block:calc(var(--spacing) * 1);color:var(--bz-fg-0);--tw-outline-style:none;outline-style:none;font-size:12px}:is(input[type=text],input[type=password],input[type=number],textarea):focus{border-color:var(--bz-accent)}[hidden]{display:none!important}}@layer components{.panel{margin-inline:calc(var(--spacing) * 2);margin-block:calc(var(--spacing) * 2);border-radius:var(--radius-xl);background-color:var(--bz-bg-1);padding:calc(var(--spacing) * 3);box-shadow:var(--bz-ring)}.panel-title{margin:calc(var(--spacing) * 0);--tw-font-weight:var(--font-weight-bold);font-size:11px;font-weight:var(--font-weight-bold);--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider);color:var(--bz-fg-2);text-transform:uppercase}.hint{margin:calc(var(--spacing) * 0);color:var(--bz-fg-2);font-size:11px}.btn{cursor:pointer;border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--bz-line);background-color:var(--bz-bg-1);padding-inline:calc(var(--spacing) * 2.5);padding-block:calc(var(--spacing) * 1);--tw-font-weight:var(--font-weight-medium);font-size:12px;font-weight:var(--font-weight-medium);color:var(--bz-fg-0);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.btn:hover{background-color:var(--bz-bg-2)}}.btn:disabled{opacity:.5}.btn-primary{border-color:var(--bz-ink);background-color:var(--bz-ink);color:var(--bz-ink-fg)}@media (hover:hover){.btn-primary:hover{background-color:var(--bz-ink)}@supports (color:color-mix(in lab, red, red)){.btn-primary:hover{background-color:color-mix(in oklab, var(--bz-ink) 85%, transparent)}}}.btn-ghost{background-color:#0000}@media (hover:hover){.btn-ghost:hover{background-color:var(--bz-bg-2)}}.btn-danger{border-color:var(--bz-danger)}@supports (color:color-mix(in lab, red, red)){.btn-danger{border-color:color-mix(in oklab, var(--bz-danger) 40%, transparent)}}.btn-danger{background-color:var(--bz-danger)}@supports (color:color-mix(in lab, red, red)){.btn-danger{background-color:color-mix(in oklab, var(--bz-danger) 10%, transparent)}}.btn-danger{color:var(--bz-danger)}@media (hover:hover){.btn-danger:hover{background-color:var(--bz-danger)}@supports (color:color-mix(in lab, red, red)){.btn-danger:hover{background-color:color-mix(in oklab, var(--bz-danger) 20%, transparent)}}}.card{gap:calc(var(--spacing) * 1.5);border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--bz-line);background-color:var(--bz-bg-1);padding:calc(var(--spacing) * 2.5);flex-direction:column;display:flex}.pill{padding-inline:calc(var(--spacing) * 2);--tw-font-weight:var(--font-weight-bold);font-size:10px;font-weight:var(--font-weight-bold);--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide);text-transform:uppercase;border-radius:3.40282e38px;padding-block:1px}.pill-ok{background-color:var(--bz-ok)}@supports (color:color-mix(in lab, red, red)){.pill-ok{background-color:color-mix(in oklab, var(--bz-ok) 15%, transparent)}}.pill-ok{color:var(--bz-ok)}.pill-warn{background-color:var(--bz-warn)}@supports (color:color-mix(in lab, red, red)){.pill-warn{background-color:color-mix(in oklab, var(--bz-warn) 15%, transparent)}}.pill-warn{color:var(--bz-warn)}.pill-bad{background-color:var(--bz-danger)}@supports (color:color-mix(in lab, red, red)){.pill-bad{background-color:color-mix(in oklab, var(--bz-danger) 15%, transparent)}}.pill-bad{color:var(--bz-danger)}.pill-muted{background-color:var(--bz-bg-3);color:var(--bz-fg-2)}.meta{color:var(--bz-fg-1);font-size:11px}}@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.right-0{right:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-40{z-index:40}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing) * 0)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-auto{margin-inline:auto}.my-1{margin-block:calc(var(--spacing) * 1)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-7{margin-top:calc(var(--spacing) * 7)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-9{margin-top:calc(var(--spacing) * 9)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-14{margin-top:calc(var(--spacing) * 14)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-1\.5{margin-right:calc(var(--spacing) * 1.5)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-1{margin-left:calc(var(--spacing) * 1)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.aspect-\[4\/3\]{aspect-ratio:4/3}.size-1{width:calc(var(--spacing) * 1);height:calc(var(--spacing) * 1)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-\[520px\]{height:520px}.h-full{height:100%}.max-h-20{max-height:calc(var(--spacing) * 20)}.max-h-28{max-height:calc(var(--spacing) * 28)}.max-h-72{max-height:calc(var(--spacing) * 72)}.min-h-screen{min-height:100vh}.w-1{width:calc(var(--spacing) * 1)}.w-1\/3{width:33.3333%}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[8rem\]{max-width:8rem}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-10{gap:calc(var(--spacing) * 10)}.gap-12{gap:calc(var(--spacing) * 12)}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * .5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * .5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-10{column-gap:calc(var(--spacing) * 10)}.gap-y-8{row-gap:calc(var(--spacing) * 8)}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-line>:not(:last-child)){border-color:var(--bz-line)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-\[32px\]{border-radius:32px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-accent,.border-accent\/40{border-color:var(--bz-accent)}@supports (color:color-mix(in lab, red, red)){.border-accent\/40{border-color:color-mix(in oklab, var(--bz-accent) 40%, transparent)}}.border-amber-300{border-color:var(--color-amber-300)}.border-amber-400{border-color:var(--color-amber-400)}.border-danger\/30{border-color:var(--bz-danger)}@supports (color:color-mix(in lab, red, red)){.border-danger\/30{border-color:color-mix(in oklab, var(--bz-danger) 30%, transparent)}}.border-danger\/40{border-color:var(--bz-danger)}@supports (color:color-mix(in lab, red, red)){.border-danger\/40{border-color:color-mix(in oklab, var(--bz-danger) 40%, transparent)}}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-300{border-color:var(--color-emerald-300)}.border-emerald-400{border-color:var(--color-emerald-400)}.border-emerald-500{border-color:var(--color-emerald-500)}.border-indigo-200{border-color:var(--color-indigo-200)}.border-indigo-300{border-color:var(--color-indigo-300)}.border-indigo-500{border-color:var(--color-indigo-500)}.border-line{border-color:var(--bz-line)}.border-ok\/40{border-color:var(--bz-ok)}@supports (color:color-mix(in lab, red, red)){.border-ok\/40{border-color:color-mix(in oklab, var(--bz-ok) 40%, transparent)}}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-300{border-color:var(--color-rose-300)}.border-sky-300{border-color:var(--color-sky-300)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.border-slate-600{border-color:var(--color-slate-600)}.border-warn\/40{border-color:var(--bz-warn)}@supports (color:color-mix(in lab, red, red)){.border-warn\/40{border-color:color-mix(in oklab, var(--bz-warn) 40%, transparent)}}.bg-accent\/10{background-color:var(--bz-accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/10{background-color:color-mix(in oklab, var(--bz-accent) 10%, transparent)}}.bg-accent\/15{background-color:var(--bz-accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/15{background-color:color-mix(in oklab, var(--bz-accent) 15%, transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-bg-1{background-color:var(--bz-bg-1)}.bg-danger,.bg-danger\/5{background-color:var(--bz-danger)}@supports (color:color-mix(in lab, red, red)){.bg-danger\/5{background-color:color-mix(in oklab, var(--bz-danger) 5%, transparent)}}.bg-danger\/10{background-color:var(--bz-danger)}@supports (color:color-mix(in lab, red, red)){.bg-danger\/10{background-color:color-mix(in oklab, var(--bz-danger) 10%, transparent)}}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-900{background-color:var(--color-emerald-900)}.bg-emerald-900\/40{background-color:#004e3b66}@supports (color:color-mix(in lab, red, red)){.bg-emerald-900\/40{background-color:color-mix(in oklab, var(--color-emerald-900) 40%, transparent)}}.bg-emerald-900\/60{background-color:#004e3b99}@supports (color:color-mix(in lab, red, red)){.bg-emerald-900\/60{background-color:color-mix(in oklab, var(--color-emerald-900) 60%, transparent)}}.bg-fg-2{background-color:var(--bz-fg-2)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-line{background-color:var(--bz-line)}.bg-ok,.bg-ok\/10{background-color:var(--bz-ok)}@supports (color:color-mix(in lab, red, red)){.bg-ok\/10{background-color:color-mix(in oklab, var(--bz-ok) 10%, transparent)}}.bg-rose-50{background-color:var(--color-rose-50)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-900{background-color:var(--color-sky-900)}.bg-sky-900\/60{background-color:#024a7099}@supports (color:color-mix(in lab, red, red)){.bg-sky-900\/60{background-color:color-mix(in oklab, var(--color-sky-900) 60%, transparent)}}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-warn,.bg-warn\/10{background-color:var(--bz-warn)}@supports (color:color-mix(in lab, red, red)){.bg-warn\/10{background-color:color-mix(in oklab, var(--bz-warn) 10%, transparent)}}.object-contain{object-fit:contain}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0{padding-block:calc(var(--spacing) * 0)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-5{padding-block:calc(var(--spacing) * 5)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-12{padding-block:calc(var(--spacing) * 12)}.py-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-24{padding-block:calc(var(--spacing) * 24)}.py-28{padding-block:calc(var(--spacing) * 28)}.py-px{padding-block:1px}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-20{padding-top:calc(var(--spacing) * 20)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-14{padding-bottom:calc(var(--spacing) * 14)}.pb-16{padding-bottom:calc(var(--spacing) * 16)}.pb-24{padding-bottom:calc(var(--spacing) * 24)}.pb-28{padding-bottom:calc(var(--spacing) * 28)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SF Mono,Cascadia Mono,Consolas,monospace}.font-sans{font-family:Inter Variable,-apple-system,BlinkMacSystemFont,Segoe UI,system-ui,sans-serif}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[19px\]{font-size:19px}.text-\[20px\]{font-size:20px}.text-\[38px\]{font-size:38px}.text-\[40px\]{font-size:40px}.text-\[44px\]{font-size:44px}.text-\[52px\]{font-size:52px}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-\[1\.04\]{--tw-leading:1.04;line-height:1.04}.leading-\[1\.06\]{--tw-leading:1.06;line-height:1.06}.leading-\[1\.08\]{--tw-leading:1.08;line-height:1.08}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.01em\]{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-\[-0\.03em\]{--tw-tracking:-.03em;letter-spacing:-.03em}.tracking-\[-0\.04em\]{--tw-tracking:-.04em;letter-spacing:-.04em}.tracking-\[-0\.015em\]{--tw-tracking:-.015em;letter-spacing:-.015em}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-accent{color:var(--bz-accent)}.text-amber-600{color:var(--color-amber-600)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-danger{color:var(--bz-danger)}.text-emerald-200{color:var(--color-emerald-200)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-emerald-900{color:var(--color-emerald-900)}.text-fg-1{color:var(--bz-fg-1)}.text-fg-2{color:var(--bz-fg-2)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-ok{color:var(--bz-ok)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-sky-200{color:var(--color-sky-200)}.text-sky-700{color:var(--color-sky-700)}.text-sky-800{color:var(--color-sky-800)}.text-sky-900{color:var(--color-sky-900)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-800{color:var(--color-slate-800)}.text-warn{color:var(--bz-warn)}.text-white{color:var(--color-white)}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.accent-emerald-600{accent-color:var(--color-emerald-600)}.accent-indigo-600{accent-color:var(--color-indigo-600)}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring,.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-amber-200{--tw-ring-color:var(--color-amber-200)}.ring-emerald-200{--tw-ring-color:var(--color-emerald-200)}.ring-emerald-500{--tw-ring-color:var(--color-emerald-500)}.ring-emerald-500\/40{--tw-ring-color:#00bb7f66}@supports (color:color-mix(in lab, red, red)){.ring-emerald-500\/40{--tw-ring-color:color-mix(in oklab, var(--color-emerald-500) 40%, transparent)}}.ring-rose-200{--tw-ring-color:var(--color-rose-200)}.ring-sky-200{--tw-ring-color:var(--color-sky-200)}.ring-sky-500{--tw-ring-color:var(--color-sky-500)}.ring-sky-500\/40{--tw-ring-color:#00a5ef66}@supports (color:color-mix(in lab, red, red)){.ring-sky-500\/40{--tw-ring-color:color-mix(in oklab, var(--color-sky-500) 40%, transparent)}}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.ring-slate-600{--tw-ring-color:var(--color-slate-600)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.\[bridge\:restart\]{bridge:restart}.group-open\:rotate-45:is(:where(.group):is([open],:popover-open,:open) *){rotate:45deg}@media (hover:hover){.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}}.focus\:not-sr-only:focus{clip-path:none;white-space:normal;width:auto;height:auto;margin:0;padding:0;position:static;overflow:visible}.focus\:fixed:focus{position:fixed}.focus\:top-4:focus{top:calc(var(--spacing) * 4)}.focus\:left-4:focus{left:calc(var(--spacing) * 4)}.focus\:z-50:focus{z-index:50}.focus\:rounded-lg:focus{border-radius:var(--radius-lg)}.focus\:px-3:focus{padding-inline:calc(var(--spacing) * 3)}.focus\:py-2:focus{padding-block:calc(var(--spacing) * 2)}@media (prefers-reduced-motion:reduce){.motion-reduce\:animate-none{animation:none}}@media (min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}:where(.sm\:divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px * var(--tw-divide-x-reverse));border-inline-end-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.sm\:p-7{padding:calc(var(--spacing) * 7)}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-7{padding-inline:calc(var(--spacing) * 7)}.sm\:py-16{padding-block:calc(var(--spacing) * 16)}.sm\:py-20{padding-block:calc(var(--spacing) * 20)}.sm\:py-28{padding-block:calc(var(--spacing) * 28)}.sm\:py-32{padding-block:calc(var(--spacing) * 32)}.sm\:pt-28{padding-top:calc(var(--spacing) * 28)}.sm\:pb-32{padding-bottom:calc(var(--spacing) * 32)}.sm\:pb-36{padding-bottom:calc(var(--spacing) * 36)}.sm\:text-\[48px\]{font-size:48px}.sm\:text-\[52px\]{font-size:52px}.sm\:text-\[56px\]{font-size:56px}.sm\:text-\[68px\]{font-size:68px}}@media (min-width:48rem){.md\:col-span-2{grid-column:span 2/span 2}.md\:flex{display:flex}.md\:hidden{display:none}.md\:inline-flex{display:inline-flex}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}@media (min-width:64rem){.lg\:sticky{position:sticky}.lg\:top-24{top:calc(var(--spacing) * 24)}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[1\.6fr_1fr_1\.4fr_1fr_1fr\]{grid-template-columns:1.6fr 1fr 1.4fr 1fr 1fr}.lg\:grid-cols-\[1fr_2fr\]{grid-template-columns:1fr 2fr}.lg\:grid-cols-\[1fr_300px\]{grid-template-columns:1fr 300px}.lg\:grid-cols-\[220px_1fr\]{grid-template-columns:220px 1fr}.lg\:items-center{align-items:center}.lg\:self-start{align-self:flex-start}.lg\:border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.lg\:border-l{border-left-style:var(--tw-border-style);border-left-width:1px}}}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(fonts/inter-latin-wght-normal.woff2)format("woff2-variations")}:root{--bz-bg-0:#fafafa;--bz-bg-1:#fff;--bz-bg-2:#f2f2f2;--bz-bg-3:#e8e8e8;--bz-fg-0:#0a0a0a;--bz-fg-1:#404040;--bz-fg-2:#6b6b6b;--bz-accent:#3f5fe8;--bz-ink:#171717;--bz-ink-fg:#fafafa;--bz-ok:#15803d;--bz-warn:#b45309;--bz-danger:#dc2626;--bz-line:#e5e5e5;--bz-ring:0 0 0 1px #0000000f, 0 1px 2px -1px #0000000f, 0 2px 4px 0 #0000000a;color-scheme:light}@media (prefers-color-scheme:dark){:root{--bz-bg-0:#0d0d0d;--bz-bg-1:#171717;--bz-bg-2:#1f1f1f;--bz-bg-3:#2a2a2a;--bz-fg-0:#fafafa;--bz-fg-1:#d4d4d4;--bz-fg-2:#a1a1a1;--bz-accent:#8ea2ff;--bz-ink:#ededed;--bz-ink-fg:#171717;--bz-ok:#4ade80;--bz-warn:#fbbf24;--bz-danger:#f87171;--bz-line:#ffffff1a;--bz-ring:0 0 0 1px #ffffff14;color-scheme:dark}}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@keyframes pulse{50%{opacity:.5}}
|
package/extension/sidepanel.html
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
<!doctype html><html lang=en><head><meta charset=UTF-8><meta name=viewport content="width=device-width,initial-scale=1.0"><title>BrowserZap</title><link rel=stylesheet href=sidepanel.css></head><body>
|
|
2
|
-
<div id=app class="flex min-h-screen flex-col pb-2">
|
|
3
|
-
|
|
4
|
-
<header id=header class="sticky top-0 z-10 border-b border-line bg-bg-1 px-3 py-2">
|
|
5
|
-
<div class="flex items-center justify-between">
|
|
6
|
-
<div class="flex items-center gap-2 font-bold">
|
|
7
|
-
<img src=logo.svg width=20 height=20 alt class=size-5>
|
|
8
|
-
<span class="text-[14px] font-semibold tracking-[-0.01em]">BrowserZap</span>
|
|
9
|
-
</div>
|
|
10
|
-
<div class="flex items-center gap-1.5">
|
|
11
|
-
<span id=plan-badge class="pill pill-muted">free</span>
|
|
12
|
-
<span id=status-badge class="pill pill-muted">offline</span>
|
|
13
|
-
</div>
|
|
14
|
-
</div>
|
|
15
|
-
</header>
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
<section id=connection-panel class=panel>
|
|
19
|
-
<div id=connection-status class="flex items-start gap-2">
|
|
20
|
-
<span class="status-dot mt-1 inline-block size-2 shrink-0 rounded-full bg-fg-2"></span>
|
|
21
|
-
<div class="flex flex-col gap-0.5">
|
|
22
|
-
<span id=status-message>Waiting for the bridge on port <strong id=port-display>9334</strong></span>
|
|
23
|
-
<span id=status-hint class=hint>Open your MCP client. If this stays grey, run: browserzap doctor</span>
|
|
24
|
-
</div>
|
|
25
|
-
</div>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
<div id=pairing-notice class="mt-2 rounded-md border border-warn/40 bg-warn/10 p-2 text-[12px]" hidden>
|
|
29
|
-
<strong>Not paired yet</strong>
|
|
30
|
-
<p id=pairing-setup class=my-1>
|
|
31
|
-
Run <code>npm install -g browserzap</code> and <code>browserzap setup</code> once, then reload this extension. Setup registers the helper that
|
|
32
|
-
hands this extension its pairing token; there is no token to copy.
|
|
33
|
-
</p>
|
|
34
|
-
<p id=pairing-fallback class=my-1>
|
|
35
|
-
If setup cannot be run on this machine, run <code>browserzap --print-token</code> and paste the
|
|
36
|
-
token under Settings → Pairing token. The bridge only accepts authenticated connections from this machine.
|
|
37
|
-
</p>
|
|
38
|
-
</div>
|
|
39
|
-
|
|
40
|
-
<details class=mt-2>
|
|
41
|
-
<summary class="cursor-pointer text-[12px] text-fg-1">Settings</summary>
|
|
42
|
-
<div class="mt-2 flex flex-col gap-3">
|
|
43
|
-
<div class="flex flex-col gap-1">
|
|
44
|
-
<label for=token-input class=meta>Pairing token</label>
|
|
45
|
-
<div class="flex gap-1.5">
|
|
46
|
-
<input type=password id=token-input placeholder="paste token" autocomplete=off spellcheck=false>
|
|
47
|
-
<button id=save-token-btn class=btn>Save</button>
|
|
48
|
-
</div>
|
|
49
|
-
<p class=hint>Stored in this browser profile only. Never logged, never sent anywhere but the local bridge.</p>
|
|
50
|
-
</div>
|
|
51
|
-
<div class="flex flex-col gap-1">
|
|
52
|
-
<label for=profile-input class=meta>Profile name</label>
|
|
53
|
-
<div class="flex gap-1.5">
|
|
54
|
-
<input type=text id=profile-input placeholder="e.g. Work" maxlength=40 autocomplete=off>
|
|
55
|
-
<button id=save-profile-btn class=btn>Save</button>
|
|
56
|
-
</div>
|
|
57
|
-
<p class=hint>Using BrowserZap in more than one Chrome profile? Name each one, so an agent can choose the right account.</p>
|
|
58
|
-
</div>
|
|
59
|
-
<div class="flex flex-col gap-1">
|
|
60
|
-
<label for=port-input class=meta>Bridge port</label>
|
|
61
|
-
<div class="flex gap-1.5">
|
|
62
|
-
<input type=number id=port-input value=9334 min=1024 max=65535>
|
|
63
|
-
<button id=save-port-btn class=btn>Save</button>
|
|
64
|
-
</div>
|
|
65
|
-
</div>
|
|
66
|
-
<div class="flex flex-col gap-1">
|
|
67
|
-
<label for=licence-input class=meta>Licence</label>
|
|
68
|
-
<div class="flex gap-1.5">
|
|
69
|
-
<input type=password id=licence-input placeholder="paste licence token" autocomplete=off spellcheck=false>
|
|
70
|
-
<button id=licence-save-btn class=btn>Activate</button>
|
|
71
|
-
</div>
|
|
72
|
-
<p id=licence-status class=hint>Free plan — every browser tool and every safety control. No licence needed. Pro (bulk runs, history, reports) is coming soon.</p>
|
|
73
|
-
<p class=hint>Device <code id=device-id>…</code> — this install's identity, created automatically on first run.</p>
|
|
74
|
-
<button id=licence-remove-btn class="btn btn-ghost w-full" hidden>Remove licence</button>
|
|
75
|
-
</div>
|
|
76
|
-
<button id=reconnect-btn class="btn w-full">Reconnect</button>
|
|
77
|
-
</div>
|
|
78
|
-
</details>
|
|
79
|
-
</section>
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
<div id=conflict-banner class="mx-2 rounded-md border border-danger/40 bg-danger/10 p-2 text-[12px] text-danger" hidden></div>
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
<section id=comments-panel class="panel flex flex-col gap-2">
|
|
86
|
-
<div class="flex items-center justify-between">
|
|
87
|
-
<h2 class=panel-title>Comments</h2>
|
|
88
|
-
<button id=cm-toggle-btn class=btn title="Click elements on this page and write what should change">Comment on this page</button>
|
|
89
|
-
</div>
|
|
90
|
-
<p id=cm-message class=hint role=status>Point at what is wrong on the page, write a note, and send every note to your agent at once. Saved only on this computer.</p>
|
|
91
|
-
<div id=cm-list class="flex flex-col gap-2"></div>
|
|
92
|
-
<div id=cm-footer class="flex gap-1.5" hidden>
|
|
93
|
-
<button id=cm-send-btn class="btn btn-primary flex-1">Send to agent</button>
|
|
94
|
-
<button id=cm-clear-btn class="btn btn-ghost">Clear</button>
|
|
95
|
-
</div>
|
|
96
|
-
<div id=cm-sent class="rounded-md border border-ok/40 bg-ok/10 p-2 text-[12px]" hidden>
|
|
97
|
-
<strong>Sent.</strong> Ask your agent:
|
|
98
|
-
<div class="mt-1 flex gap-1.5">
|
|
99
|
-
<code id=cm-prompt class="flex-1 break-words py-1">Apply my BrowserZap feedback</code>
|
|
100
|
-
<button id=cm-copy-btn class=btn>Copy</button>
|
|
101
|
-
</div>
|
|
102
|
-
</div>
|
|
103
|
-
</section>
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
<section id=workflows-panel class="panel flex flex-col gap-2">
|
|
107
|
-
<div class="flex items-center justify-between">
|
|
108
|
-
<h2 class=panel-title>Workflows</h2>
|
|
109
|
-
<div class="flex gap-1.5">
|
|
110
|
-
<button id=wf-record-btn class=btn title="Record what you do in the current tab">Record</button>
|
|
111
|
-
<button id=wf-refresh-btn class="btn btn-ghost">Refresh</button>
|
|
112
|
-
</div>
|
|
113
|
-
</div>
|
|
114
|
-
<div id=wf-recording></div>
|
|
115
|
-
<div id=wf-run></div>
|
|
116
|
-
<p id=wf-message class=hint role=status></p>
|
|
117
|
-
<div id=wf-list class="flex flex-col gap-2"></div>
|
|
118
|
-
</section>
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
<div id=sessions-container class="flex flex-col"></div>
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
<section id=log-panel class=panel>
|
|
125
|
-
<div class="mb-1.5 flex items-center justify-between">
|
|
126
|
-
<h2 class=panel-title>Activity</h2>
|
|
127
|
-
<button id=clear-log-btn class="btn btn-ghost">Clear</button>
|
|
128
|
-
</div>
|
|
129
|
-
<div id=action-log class="flex max-h-72 flex-col overflow-y-auto">
|
|
130
|
-
<div class="hint py-2">Waiting for an agent</div>
|
|
131
|
-
</div>
|
|
132
|
-
</section>
|
|
133
|
-
</div>
|
|
134
|
-
|
|
135
|
-
<script src=sidepanel.js></script>
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
</body></html>
|
package/extension/sidepanel.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(()=>{"use strict";const e=document.getElementById("status-badge"),t=document.querySelector(".status-dot"),n=document.getElementById("status-message"),a=document.getElementById("status-hint"),s=document.getElementById("port-display"),o=document.getElementById("port-input"),i=document.getElementById("save-port-btn"),l=document.getElementById("token-input"),r=document.getElementById("save-token-btn"),c=document.getElementById("profile-input"),d=document.getElementById("save-profile-btn"),p=document.getElementById("pairing-notice"),m=document.getElementById("pairing-setup"),u=document.getElementById("pairing-fallback"),f=document.getElementById("conflict-banner"),g=document.getElementById("reconnect-btn"),b=document.getElementById("sessions-container"),v=document.getElementById("action-log"),x=document.getElementById("clear-log-btn"),w=document.getElementById("plan-badge"),h=document.getElementById("licence-input"),$=document.getElementById("licence-save-btn"),y=document.getElementById("licence-remove-btn"),k=document.getElementById("licence-status"),E=document.getElementById("device-id"),I="pill pill-muted",C="mt-1 inline-block size-2 shrink-0 rounded-full",L={on:`status-dot connected ${C} bg-ok`,off:`status-dot disconnected ${C} bg-fg-2`},B={success:"bg-ok",error:"bg-danger",pending:"bg-warn"},_=e=>e?"active border-accent bg-accent/15 text-accent":"";let T=null;function S(e,t){return chrome.runtime.sendMessage({source:"sidepanel",type:e,...t})}function j(){if(!T)return;const o=!T.paired||Boolean(T.authorizationError);if(p.hidden=!o,o){const s=!1===T.nativeHost;m.hidden=!1,u.hidden=!s&&!T.authorizationError,e.textContent=T.paired?"token rejected":"not paired",e.className=I,t.className=L.off,n.textContent=T.authorizationError?"The bridge rejected the saved pairing token":"Pair this extension with the bridge to begin",a.textContent=s?"Run: npm install -g browserzap, then browserzap setup":null===T.nativeHost?"Starting the bridge through the native host…":"The bridge only accepts authenticated connections from this machine."}else if(T.versionError){e.textContent="update needed",e.className=I,t.className=L.off,n.textContent=T.versionError;const s=/bridge speaks protocol (\d+), the client sent (\d+)/.exec(T.versionError);a.textContent=s&&Number(s[1])<Number(s[2])?"An older BrowserZap bridge is still running. Run: browserzap restart-bridge":"Update both parts: npm install -g browserzap@latest, browserzap setup, reload the extension, then browserzap restart-bridge"}else if(T.connected){const s=A(T.sessions).length;e.textContent=s>0?`${s} agent${s>1?"s":""}`:"online",e.className="pill pill-ok",t.className=L.on,n.textContent=s>0?`${s} agent session${s>1?"s":""} active`:"Bridge connected, waiting for an agent";const o=T.profile;a.textContent=o&&o.connected>1?`This profile: ${o.label}. ${o.connected} Chrome profiles are connected; agents choose one with browser_select_profile.`:o&&o.label&&!/^Profile \d+$/.test(o.label)?`This profile: ${o.label}`:""}else T.conflictReason?(e.textContent="conflict",e.className=I,t.className=L.off,n.textContent=T.conflictReason,a.textContent="Close the other browser, or disable its BrowserZap extension, to use this one."):(e.textContent="offline",e.className=I,t.className=L.off,"bridge_foreign"===T.nativeError?(n.textContent="Another BrowserZap bridge is using the port and will not pair with this install",a.textContent="Run: browserzap restart-bridge, then press Reconnect under Settings"):(n.innerHTML=`Waiting for the bridge on port <strong>${s.textContent}</strong>`,a.textContent="The extension retries automatically"));const i=T.authorizationError??T.versionError??T.conflictReason??"";var l;f.hidden=0===i.length,f.textContent=i,0!==(l=T.sessions.filter(e=>e.id!==R||(e.approvals??[]).length>0||e.pendingUserAction)).length?b.innerHTML=l.map(e=>{const t=M(e.id),n=e.pendingUserAction?`\n <div class="user-action-alert mt-1 flex flex-col gap-1.5 rounded-md border border-warn/40 bg-warn/10 p-2">\n <h3 class="m-0 text-[12px] font-bold">Action needed</h3>\n <p>${M(e.pendingUserAction)}</p>\n <textarea data-session="${t}" placeholder="Describe what you did (optional)" rows="2"></textarea>\n <button class="btn btn-primary w-full user-done-btn" data-session="${t}">\n Hand back to AI\n </button>\n </div>\n `:"",a=(e.approvals??[]).map(e=>`\n <div class="user-action-alert approval-alert mt-1 flex flex-col gap-1.5 rounded-md border border-accent/40 bg-accent/10 p-2">\n <h3 class="m-0 text-[12px] font-bold">Approve this action?</h3>\n <p>${M(e.summary)}</p>\n <p class="meta m-0">${M(e.risk.replace(/_/g," "))} · ${M(e.origin)}</p>\n <div class="flex gap-1.5">\n <button class="btn btn-primary approval-btn" data-session="${t}" data-approval="${M(e.id)}" data-decision="approve">Approve once</button>\n <button class="btn btn-ghost approval-btn" data-session="${t}" data-approval="${M(e.id)}" data-decision="deny">Deny</button>\n </div>\n </div>\n `).join("");return`\n <section class="session-card panel flex flex-col gap-2">\n <div class="flex items-center justify-between gap-2">\n <span class="font-semibold">${M(e.name)}</span>\n <span class="font-mono text-[10px] text-fg-2">${t}</span>\n </div>\n <div class="flex gap-1">\n <button class="mode-btn btn flex-1 ${_("collaborative"===e.controlMode)}"\n data-session="${t}" data-mode="collaborative" title="Both user and AI">\n <span>Collab</span>\n </button>\n <button class="mode-btn btn flex-1 ${_("ai"===e.controlMode)}"\n data-session="${t}" data-mode="ai" title="AI has full control">\n <span>AI</span>\n </button>\n <button class="mode-btn btn flex-1 ${_("user"===e.controlMode)}"\n data-session="${t}" data-mode="user" title="User has control">\n <span>User</span>\n </button>\n </div>\n ${a}\n ${n}\n </section>\n `}).join(""):b.innerHTML=T?.connected?'<div class="hint mx-3 my-1">Waiting for agent sessions…</div>':"",function(e){if(0===e.length)return void(v.innerHTML='<div class="hint py-2">Waiting for an agent</div>');const t=e.slice(-50);v.innerHTML=t.map(e=>{const t=new Date(e.timestamp).toLocaleTimeString("en-US",{hour12:!1,hour:"2-digit",minute:"2-digit",second:"2-digit"}),n=e.session?`<span class="font-mono text-fg-2">${e.session.slice(0,4)}</span>`:"";return`\n <div class="log-entry flex items-start gap-1.5 border-b border-line py-1 text-[11px]">\n <div class="log-status ${e.status} mt-1 size-1.5 shrink-0 rounded-full ${B[e.status]??"bg-fg-2"}"></div>\n <span class="log-source ${e.source} text-[9px] font-bold uppercase text-fg-2">${e.source}</span>\n ${n}\n <div class="min-w-0 flex-1">\n <div>${M(e.action)}</div>\n ${e.details?`<div class="truncate text-fg-2" title="${M(e.details)}">${M(e.details)}</div>`:""}\n </div>\n <span class="font-mono text-[10px] text-fg-2">${t}</span>\n </div>\n `}).join(""),v.scrollTop=v.scrollHeight}(T.actionLog),X(),function(){const e=T?.comments??{activeTabId:null,comments:[]},t=null!==e.activeTabId;te.textContent=t?"Finish commenting":"Comment on this page",te.classList.toggle("btn-primary",t),se.hidden=0===e.comments.length,oe.textContent=`Send ${e.comments.length} comment${1===e.comments.length?"":"s"} to agent`,oe.disabled=!T?.connected;const n=e.comments.map(e=>`${e.cid}:${e.n}:${e.attachments.length}:${e.screenshot?1:0}`).join("|");n!==re&&(re=n,ae.innerHTML=e.comments.map(e=>{const t=M(e.cid),n=[e.screenshot?`<img src="data:image/png;base64,${e.screenshot}" alt="Screenshot of the element" class="max-h-28 max-w-full rounded border border-line object-contain">`:"",...e.attachments.map((e,n)=>`<span class="relative inline-block"><img src="data:${M(e.mimeType)};base64,${e.data}" alt="Attached image ${n+1}" class="max-h-20 max-w-[8rem] rounded border border-line object-contain"><button class="btn btn-ghost cm-detach absolute right-0 top-0 px-1 py-0 text-[10px]" data-cid="${t}" data-index="${n}" title="Remove image">×</button></span>`)].filter(Boolean).join("");return`<div class="card cm-item" data-cid="${t}">\n <div class="flex items-start justify-between gap-2">\n <span class="flex items-center gap-1.5"><span class="pill pill-warn">${e.n}</span><span class="meta break-words">${M(function(e){const t=e.component,n=t?.source?.file?`${t.source.file.split(/[\\/]/).slice(-2).join("/")}${t.source.line?`:${t.source.line}`:""}`:"";return[e.info.name?`${e.info.role??e.info.tag} "${e.info.name}"`:e.info.role&&"generic"!==e.info.role?e.info.role:e.info.tag??"element",t?.component?`<${t.component}>`:"",n].filter(Boolean).join(" · ")}(e))}</span></span>\n <button class="btn btn-ghost cm-delete px-1.5 py-0" data-cid="${t}" title="Delete comment">Delete</button>\n </div>\n <textarea class="cm-text h-16" data-cid="${t}" maxlength="2000" spellcheck="true">${M(e.text)}</textarea>\n ${n?`<div class="flex flex-wrap items-start gap-1.5">${n}</div>`:""}\n <div class="flex items-center justify-between gap-2">\n <span class="meta truncate" title="${M(e.page.url)}">${M(function(e){try{const t=new URL(e);return t.host+t.pathname}catch{return""}}(e.page.url))}</span>\n ${e.attachments.length<3?`<label class="btn btn-ghost cursor-pointer px-1.5 py-0">Add image<input type="file" accept="image/png,image/jpeg,image/webp,image/gif" class="cm-file hidden" data-cid="${t}"></label>`:""}\n </div>\n </div>`}).join(""))}()}!function e(){const t=chrome.runtime.connect({name:"sidepanel-keepalive"});t.onDisconnect.addListener(()=>{setTimeout(e,1e3)}),setTimeout(()=>{try{t.disconnect()}catch{}},2e4)}(),chrome.runtime.onMessage.addListener(e=>{"background"===e.source&&"state_update"===e.type&&(T=e.data,j())}),i.addEventListener("click",async()=>{const e=parseInt(o.value,10);e>=1024&&e<=65535&&(await chrome.storage.local.set({bridgePort:e}),s.textContent=String(e),await S("disconnect"),await S("connect",{port:e}))}),r.addEventListener("click",async()=>{const e=l.value.trim();await S("set_token",{token:e}),l.value="",l.placeholder=e?"paired — paste a new token to replace":"paste token"}),d.addEventListener("click",async()=>{await S("set_profile_label",{label:c.value})}),$.addEventListener("click",async()=>{const e=h.value.trim();if(!e)return;const t=await K("licence_activate",{token:e});h.value="",t.ok?await V():k.textContent=t.error?.message??"That licence was not accepted."}),y.addEventListener("click",async()=>{await K("licence_remove"),await V()}),chrome.storage.local.get(["bz_profile_label"]).then(e=>{"string"==typeof e.bz_profile_label&&(c.value=e.bz_profile_label)}).catch(()=>{}),g.addEventListener("click",async()=>{const e=parseInt(o.value,10);await S("disconnect"),await S("connect",{port:e})}),x.addEventListener("click",()=>{v.innerHTML='<div class="hint py-2">Log cleared</div>'}),b.addEventListener("click",e=>{const t=e.target,n=t.closest(".mode-btn");if(n)return void S("set_control_mode",{sessionId:n.dataset.session,data:n.dataset.mode});const a=t.closest(".approval-btn");if(a)return void S("decide_approval",{sessionId:a.dataset.session,approvalId:a.dataset.approval,approve:"approve"===a.dataset.decision});const s=t.closest(".user-done-btn");if(s){const e=s.dataset.session,t=b.querySelector(`textarea[data-session="${CSS.escape(e)}"]`);S("set_control_mode",{sessionId:e,data:"collaborative",userMessage:t?.value?.trim()||void 0}),t&&(t.value="")}});const R="panel",A=e=>e.filter(e=>e.id!==R);function M(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}const N=document.getElementById("workflows-panel"),D=document.getElementById("wf-recording"),H=document.getElementById("wf-run"),z=document.getElementById("wf-message"),P=document.getElementById("wf-list");let U=[],q={},F=null,O={},W="";const Z=e=>/is sensitive/.test(e?.description??"");function K(e,t={}){return S("panel",{op:e,args:t})}function Q(e,t=!1){z.textContent=e,z.classList.toggle("text-danger",t)}async function V(){const e=await K("list");e?.ok?(U=e.data?.workflows??[],q=e.data?.lastRuns??{},function(e,t){if(t?.short&&(E.textContent=t.short),!e)return;const n="pro"===e.plan;w.textContent=n?"pro":"free",w.className="pill "+(n?"pill-ok":"pill-muted");const a=n?`Pro${e.expiresAt?` until ${new Date(e.expiresAt).toLocaleDateString()}`:" — no expiry"}${e.licenseId?` · ${e.licenseId}`:""}.`:"Free plan — every browser tool and every safety control. No licence needed. Pro (bulk runs, history, reports) is coming soon.";k.textContent=[a,e.notice,e.reason].filter(Boolean).join(" "),y.hidden=!n}(e.data?.plan,e.data?.device),Q("")):(U=[],Q(e?.error?.message??"Could not load workflows.",!0)),Y()}function Y(){0!==U.length?P.innerHTML=U.map(e=>{const t=M(e.name);if(e.broken)return`<div class="card"><span class="break-words font-semibold">${t}</span><span class="meta">Cannot be used: ${M(e.broken)}</span></div>`;const n=q[e.name],a=n?`<span class="pill ${n.ok?"pill-ok":"USER_ACTION_REQUIRED"===n.code?"pill-warn":"pill-bad"}">${n.ok?"last run ok":M((n.code??"failed").toLowerCase().replace(/_/g," "))}</span>`:'<span class="pill pill-muted">never run</span>',s=F?.name===e.name?function(e){const t=M(e.name),n=Object.entries(e.params??{}).map(([e,t])=>{const n=M(e);return Z(t)?`<label class="flex flex-col gap-0.5 meta">${n}<span class="meta">Sensitive: the run pauses and you type it yourself in the page.</span></label>`:`<label class="flex flex-col gap-0.5 meta">${M(t.description||e)}\n <input type="text" data-param="${n}" value="${M(t.default??"")}" autocomplete="off" spellcheck="false"></label>`}).join(""),a=Object.entries(e.params??{}).filter(([,e])=>!Z(e)).map(([e])=>e);return`\n <div class="wf-form flex flex-col gap-1.5" data-name="${t}">\n ${n||'<span class="meta">No values needed.</span>'}\n <div class="flex flex-wrap gap-1.5">\n <button class="btn btn-primary wf-start" data-name="${t}">Start</button>\n <button class="btn btn-ghost wf-close">Close</button>\n </div>\n ${a.length?`\n <details class="wf-many">\n <summary class="meta cursor-pointer">Run for many (Pro)</summary>\n <div class="mt-1.5 flex flex-col gap-1.5">\n <label class="flex flex-col gap-0.5 meta">One row per run. First row: ${M(a.join(","))}${1===a.length?" (or just one value per line)":""}\n <textarea class="wf-many-text h-24 font-mono" spellcheck="false" placeholder="${M(a.join(","))}"></textarea></label>\n <span class="meta">Runs one after the other. A row that fails is reported and the next one runs.</span>\n <div class="flex flex-wrap gap-1.5"><button class="btn btn-primary wf-start-many" data-name="${t}">Run all</button></div>\n </div>\n </details>`:""}\n </div>`}(F.detail):"";return`\n <div class="card">\n <div class="flex items-center justify-between gap-2"><span class="break-words font-semibold">${t}</span>${a}</div>\n ${e.description?`<span class="meta">${M(e.description)}</span>`:""}\n <span class="meta">${e.steps??0} steps · ${M((e.origins??[]).join(", "))}${n?` · ${M(new Date(n.at).toLocaleString())}`:""}</span>\n ${n&&!n.ok?`<span class="meta">${M(n.summary)}</span>`:""}\n ${s||`<div class="flex flex-wrap gap-1.5"><button class="btn btn-primary wf-open" data-name="${t}">Run…</button></div>`}\n </div>`}).join(""):P.innerHTML='<div class="hint">No workflows yet. Press <b>Record</b>, do a task once in the current tab, then save it.</div>'}let G="",J=!1;function X(){T?.connected&&!J&&V(),J=Boolean(T?.connected);const e=T?.workflowRun??null;!function(e){if(!e)return void(D.innerHTML="");const t=e.steps.map((e,t)=>`\n <li>${M(e.label)}${e.sensitive?'<span class="ml-1 text-[10px] font-bold text-accent" title="You type this yourself on every run">sensitive</span>':""}${e.ambiguous?'<span class="ml-1 text-[10px] font-bold text-warn" title="This target is not unique; the run may stop here">check</span>':""}\n ${t>0?`<button class="btn btn-ghost wf-remove ml-1 px-1 py-0 text-[10px]" data-index="${t}" title="Remove this step">✕</button>`:""}</li>`).join("");e.stopped?D.innerHTML=`\n <div class="card border-accent/40 bg-accent/10">\n <div class="flex items-center justify-between gap-2"><span class="break-words font-semibold">Review and save</span><span class="meta">${e.steps.length} steps</span></div>\n <ol class="m-0 flex list-decimal flex-col gap-0.5 pl-4 text-[12px]">${t}</ol>\n <div class="wf-form flex flex-col gap-1.5">\n <label class="flex flex-col gap-0.5 meta">Name (lowercase letters, digits, - and _)<input type="text" id="wf-save-name" placeholder="e.g. enable-comments" autocomplete="off" spellcheck="false"></label>\n <label class="flex flex-col gap-0.5 meta">Description<input type="text" id="wf-save-desc" autocomplete="off"></label>\n <label class="flex flex-row items-center gap-1.5 meta"><input type="checkbox" id="wf-save-keep"> Keep what I typed as default values</label>\n <label class="flex flex-row items-center gap-1.5 meta"><input type="checkbox" id="wf-save-overwrite"> Replace a workflow with the same name</label>\n <div class="flex flex-wrap gap-1.5">\n <button class="btn btn-primary wf-rec-save">Save workflow</button>\n <button class="btn btn-ghost wf-rec-discard">Discard</button>\n </div>\n </div>\n </div>`:D.innerHTML=`\n <div class="card border-danger/40 bg-danger/10">\n <div class="flex items-center justify-between gap-2"><span class="break-words font-semibold"><span class="mr-1.5 inline-block size-2 animate-pulse rounded-full bg-danger motion-reduce:animate-none"></span>Recording</span><span class="meta">${e.steps.length} steps</span></div>\n <span class="meta">Do the task in the tab as you normally would. Only your own clicks and typing are recorded.</span>\n <ol class="m-0 flex list-decimal flex-col gap-0.5 pl-4 text-[12px]">${t}</ol>\n <div class="flex flex-wrap gap-1.5">\n <button class="btn btn-primary wf-rec-stop">Stop</button>\n <button class="btn btn-ghost wf-rec-discard">Discard</button>\n </div>\n </div>`}(T?.recording??null),function(e){if(!e)return void(H.innerHTML="");const t="running"===e.status||"awaiting_approval"===e.status,n="completed"===e.status?"ok":t||"needs_user"===e.status?"wait":"bad",a=e.batch&&!t?"":e.steps.map(e=>`<li>${e.ok?"✓":"✗"} ${M(e.tool)}${e.ok?"":` — ${M(e.summary)}`}</li>`).join(""),s=e.batch,o=s?`\n <span class="meta">${t?`Set ${s.index+1} of ${s.total} · `:""}${s.done} done${s.failed?` · ${s.failed} need attention`:""}</span>\n ${s.attention.length?`<ul class="m-0 flex list-none flex-col gap-1 p-0 text-[12px]">${s.attention.map(e=>`\n <li class="rounded-md border border-danger/30 bg-danger/5 px-2 py-1">\n <span class="font-semibold">${M(e.label)}</span>: ${e.step?`step ${e.step} (${M(e.tool??"")}${e.target?` ${M(e.target)}`:""})`:"did not start"} — ${M((e.code??"failed").toLowerCase().replace(/_/g," "))}${e.cause?`, ${M(e.cause.replace(/_/g," "))}`:""}\n ${e.screenshot?`<span class="block break-all meta" title="Saved on this computer">Screenshot: ${M(e.screenshot)}</span>`:""}\n </li>`).join("")}</ul>`:""}\n ${s.report?`<span class="meta break-all">Report: ${M(s.report)}</span>`:""}`:"";H.innerHTML=`\n <div class="card border-accent/40 bg-accent/10">\n <div class="flex items-center justify-between gap-2"><span class="break-words font-semibold">${M(e.workflow)}</span><span class="pill pill-${n}">${M(e.status.replace(/_/g," "))}</span></div>\n ${s&&!t?"":`<span class="meta">Step ${Math.min(e.stepIndex+1,e.totalSteps)} of ${e.totalSteps}</span>`}\n ${o}\n <span class="meta">${M(e.summary)}</span>\n ${"awaiting_approval"===e.status?'<span class="text-[12px] font-semibold">Approve or deny the step below, under "BrowserZap workflows".</span>':""}\n ${e.nextAction?`<span class="text-[12px] font-semibold">${M(e.nextAction)}</span>`:""}\n ${a?`<ol class="m-0 flex list-decimal flex-col gap-0.5 pl-4 text-[12px]">${a}</ol>`:""}\n <div class="flex flex-wrap gap-1.5">\n ${t?'<button class="btn btn-danger wf-cancel">Cancel run</button>':""}\n ${s?.canRerun&&!t?'<button class="btn btn-primary wf-rerun-failed">Re-run failed</button>':""}\n ${null===e.canContinueFrom||t?"":`<button class="btn btn-primary wf-continue" data-name="${M(e.workflow)}" data-start="${e.canContinueFrom}">Continue</button>`}\n ${t?"":'<button class="btn btn-ghost wf-dismiss">Dismiss</button>'}\n </div>\n </div>`}(e&&e.runId!==G?e:null);const t=e?`${e.runId}:${e.status}`:"";if(t!==W){const n=e&&!["running","awaiting_approval"].includes(e.status);W=t,n&&V()}}N.addEventListener("click",async e=>{const t=e.target.closest("button");if(t){if("wf-refresh-btn"===t.id)return V();if("wf-record-btn"===t.id){const[e]=await chrome.tabs.query({active:!0,currentWindow:!0}),t=await S("record_start",{tabId:e?.id});return void Q(t?.ok?"":t?.error??"Could not start recording.",!t?.ok)}if(t.classList.contains("wf-rec-stop"))S("record_stop");else if(t.classList.contains("wf-rec-discard"))S("record_discard");else if(t.classList.contains("wf-remove"))S("record_remove_step",{index:Number(t.dataset.index)});else{if(t.classList.contains("wf-rec-save")){const e=document.getElementById("wf-save-name").value.trim(),t=await S("record_save",{name:e,description:document.getElementById("wf-save-desc").value.trim(),keepValues:document.getElementById("wf-save-keep").checked,overwrite:document.getElementById("wf-save-overwrite").checked});return Q(t?.ok?`Saved "${e}".`:t?.error?.message??"Could not save.",!t?.ok),void(t?.ok&&V())}if(t.classList.contains("wf-open")){const e=await K("get",{name:t.dataset.name});return e?.ok?(F={name:t.dataset.name,detail:e.data.workflow},Y()):Q(e?.error?.message??"Could not open the workflow.",!0)}if(t.classList.contains("wf-close"))return F=null,Y();if(t.classList.contains("wf-start")){const e=t.closest(".wf-form"),n={};for(const[e,t]of Object.entries(F?.detail.params??{}))Z(t)&&(n[e]="");e.querySelectorAll("input[data-param]").forEach(e=>{n[e.dataset.param]=e.value}),O=n;const a=await K("run",{name:t.dataset.name,params:n});return a?.ok?(Q(""),G="",F=null,Y()):Q(a?.error?.message??"Could not start the run.",!0)}if(t.classList.contains("wf-start-many")){const e=t.closest(".wf-form").querySelector(".wf-many-text").value,n=await K("run_batch",{name:t.dataset.name,text:e});return n?.ok?(Q(""),G="",F=null,Y()):Q(n?.error?.message??"Could not start the runs.",!0)}if(t.classList.contains("wf-rerun-failed")){const e=await K("rerun_failed");return Q(e?.ok?"":e?.error?.message??"Could not run the failed sets again.",!e?.ok),void(e?.ok&&(G=""))}if(t.classList.contains("wf-continue")){const e=await K("continue",{name:t.dataset.name,params:O,startAt:Number(t.dataset.start)});return void Q(e?.ok?"":e?.error?.message??"Could not continue.",!e?.ok)}if(!t.classList.contains("wf-cancel"))return t.classList.contains("wf-dismiss")?(G=T?.workflowRun?.runId??"",O={},X()):void 0;K("cancel")}}}),async function(){const e=await chrome.storage.local.get(["bridgePort","bridgeToken"]);"number"==typeof e.bridgePort&&(o.value=String(e.bridgePort),s.textContent=String(e.bridgePort)),"string"==typeof e.bridgeToken&&e.bridgeToken&&(l.placeholder="paired — paste a new token to replace"),V();try{const e=await S("get_state");e&&(T=e,j())}catch{}}();const ee=document.getElementById("comments-panel"),te=document.getElementById("cm-toggle-btn"),ne=document.getElementById("cm-message"),ae=document.getElementById("cm-list"),se=document.getElementById("cm-footer"),oe=document.getElementById("cm-send-btn"),ie=document.getElementById("cm-sent"),le=ne.textContent??"";let re="";function ce(e,t=!1){ne.textContent=e||le,ne.classList.toggle("text-danger",t)}function de(e){return new Promise((t,n)=>{const a=new FileReader;a.onload=()=>t(String(a.result)),a.onerror=()=>n(a.error),a.readAsDataURL(e)})}async function pe(e,t){const n=await S("comment_attach",{cid:e,dataUrl:await de(t)});ce(n?.ok?"":n?.error??"Could not add the image.",!n?.ok)}ee.addEventListener("click",async e=>{const t=e.target.closest("button");if(t){if("cm-toggle-btn"===t.id){ie.hidden=!0;const e=T?.comments?.activeTabId;if(null!=e)return await S("comment_stop"),void ce("");const[t]=await chrome.tabs.query({active:!0,currentWindow:!0}),n=await S("comment_start",{tabId:t?.id});return void ce(n?.ok?"Click an element on the page, write your note, press Save. Esc finishes.":n?.error??"Could not start Comment mode.",!n?.ok)}if("cm-send-btn"===t.id){oe.disabled=!0;const e=await S("comment_send");return oe.disabled=!1,ie.hidden=!e?.ok,void ce(e?.ok?"":e?.error??"Could not send the comments.",!e?.ok)}if("cm-copy-btn"===t.id)return await navigator.clipboard.writeText(document.getElementById("cm-prompt").textContent??"").catch(()=>{}),t.textContent="Copied",void setTimeout(()=>{t.textContent="Copy"},1500);"cm-clear-btn"!==t.id?t.classList.contains("cm-delete")?S("comment_delete",{cid:t.dataset.cid}):t.classList.contains("cm-detach")&&S("comment_detach",{cid:t.dataset.cid,index:Number(t.dataset.index)}):S("comment_clear")}}),ee.addEventListener("change",e=>{const t=e.target;t.classList.contains("cm-file")&&t.files?.[0]&&pe(String(t.dataset.cid),t.files[0])}),ee.addEventListener("focusout",e=>{const t=e.target;t.classList?.contains("cm-text")&&S("comment_update",{cid:t.dataset.cid,text:t.value})}),ee.addEventListener("paste",e=>{const t=e.target;if(!t.classList?.contains("cm-text"))return;const n=Array.from(e.clipboardData?.items??[]).find(e=>e.type.startsWith("image/"))?.getAsFile();n&&(e.preventDefault(),pe(String(t.dataset.cid),n))})})();
|