gazesight 0.4.0 → 0.5.1

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.
@@ -117,7 +117,9 @@
117
117
  ><span id="select-label">Use this tab</span>
118
118
  </button>
119
119
  <p class="hint">
120
- Select the page you want your agent to see.
120
+ Selecting a tab allows your configured coding agent to receive its
121
+ screenshots, page structure, URL, and diagnostics through your local MCP
122
+ runtime.
121
123
  <span id="shortcut">Ctrl+Shift+Y</span> also selects or reauthorizes
122
124
  a tab.
123
125
  </p>
@@ -1 +1 @@
1
- var V=Object.create;var N=Object.defineProperty;var Z=Object.getOwnPropertyDescriptor;var K=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,Q=Object.prototype.hasOwnProperty;var X=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports);var Y=(e,r,g,m)=>{if(r&&typeof r=="object"||typeof r=="function")for(let l of K(r))!Q.call(e,l)&&l!==g&&N(e,l,{get:()=>r[l],enumerable:!(m=Z(r,l))||m.enumerable});return e};var ee=(e,r,g)=>(g=e!=null?V(J(e)):{},Y(r||!e||!e.__esModule?N(g,"default",{value:e,enumerable:!0}):g,e));var _=X((B,M)=>{(function(e,r){if(typeof define=="function"&&define.amd)define("webextension-polyfill",["module"],r);else if(typeof B<"u")r(M);else{var g={exports:{}};r(g),e.browser=g.exports}})(typeof globalThis<"u"?globalThis:typeof self<"u"?self:B,function(e){"use strict";if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)e.exports=globalThis.browser;else{let r="The message port closed before a response was received.",g=m=>{let l={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(Object.keys(l).length===0)throw new Error("api-metadata.json has not been included in browser-polyfill");class w extends WeakMap{constructor(n,a=void 0){super(a),this.createItem=n}get(n){return this.has(n)||this.set(n,this.createItem(n)),super.get(n)}}let p=t=>t&&typeof t=="object"&&typeof t.then=="function",E=(t,n)=>(...a)=>{m.runtime.lastError?t.reject(new Error(m.runtime.lastError.message)):n.singleCallbackArg||a.length<=1&&n.singleCallbackArg!==!1?t.resolve(a[0]):t.resolve(a)},S=t=>t==1?"argument":"arguments",D=(t,n)=>function(i,...d){if(d.length<n.minArgs)throw new Error(`Expected at least ${n.minArgs} ${S(n.minArgs)} for ${t}(), got ${d.length}`);if(d.length>n.maxArgs)throw new Error(`Expected at most ${n.maxArgs} ${S(n.maxArgs)} for ${t}(), got ${d.length}`);return new Promise((u,A)=>{if(n.fallbackToNoCallback)try{i[t](...d,E({resolve:u,reject:A},n))}catch(s){console.warn(`${t} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,s),i[t](...d),n.fallbackToNoCallback=!1,n.noCallback=!0,u()}else n.noCallback?(i[t](...d),u()):i[t](...d,E({resolve:u,reject:A},n))})},R=(t,n,a)=>new Proxy(n,{apply(i,d,u){return a.call(d,t,...u)}}),C=Function.call.bind(Object.prototype.hasOwnProperty),T=(t,n={},a={})=>{let i=Object.create(null),d={has(A,s){return s in t||s in i},get(A,s,b){if(s in i)return i[s];if(!(s in t))return;let c=t[s];if(typeof c=="function")if(typeof n[s]=="function")c=R(t,t[s],n[s]);else if(C(a,s)){let y=D(s,a[s]);c=R(t,t[s],y)}else c=c.bind(t);else if(typeof c=="object"&&c!==null&&(C(n,s)||C(a,s)))c=T(c,n[s],a[s]);else if(C(a,"*"))c=T(c,n[s],a["*"]);else return Object.defineProperty(i,s,{configurable:!0,enumerable:!0,get(){return t[s]},set(y){t[s]=y}}),c;return i[s]=c,c},set(A,s,b,c){return s in i?i[s]=b:t[s]=b,!0},defineProperty(A,s,b){return Reflect.defineProperty(i,s,b)},deleteProperty(A,s){return Reflect.deleteProperty(i,s)}},u=Object.create(t);return new Proxy(u,d)},P=t=>({addListener(n,a,...i){n.addListener(t.get(a),...i)},hasListener(n,a){return n.hasListener(t.get(a))},removeListener(n,a){n.removeListener(t.get(a))}}),G=new w(t=>typeof t!="function"?t:function(a){let i=T(a,{},{getContent:{minArgs:0,maxArgs:0}});t(i)}),L=new w(t=>typeof t!="function"?t:function(a,i,d){let u=!1,A,s=new Promise(v=>{A=function(x){u=!0,v(x)}}),b;try{b=t(a,i,A)}catch(v){b=Promise.reject(v)}let c=b!==!0&&p(b);if(b!==!0&&!c&&!u)return!1;let y=v=>{v.then(x=>{d(x)},x=>{let I;x&&(x instanceof Error||typeof x.message=="string")?I=x.message:I="An unexpected error occurred",d({__mozWebExtensionPolyfillReject__:!0,message:I})}).catch(x=>{console.error("Failed to send onMessage rejected reply",x)})};return y(c?b:s),!0}),W=({reject:t,resolve:n},a)=>{m.runtime.lastError?m.runtime.lastError.message===r?n():t(new Error(m.runtime.lastError.message)):a&&a.__mozWebExtensionPolyfillReject__?t(new Error(a.message)):n(a)},$=(t,n,a,...i)=>{if(i.length<n.minArgs)throw new Error(`Expected at least ${n.minArgs} ${S(n.minArgs)} for ${t}(), got ${i.length}`);if(i.length>n.maxArgs)throw new Error(`Expected at most ${n.maxArgs} ${S(n.maxArgs)} for ${t}(), got ${i.length}`);return new Promise((d,u)=>{let A=W.bind(null,{resolve:d,reject:u});i.push(A),a.sendMessage(...i)})},H={devtools:{network:{onRequestFinished:P(G)}},runtime:{onMessage:P(L),onMessageExternal:P(L),sendMessage:$.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:$.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},z={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return l.privacy={network:{"*":z},services:{"*":z},websites:{"*":z}},T(m,H,l)};e.exports=g(chrome)}})});var q=ee(_(),1);globalThis.browser=q.default;function re(){return[...crypto.getRandomValues(new Uint8Array(32))].map(r=>r.toString(16).padStart(2,"0")).join("")}function te(){return location.protocol==="moz-extension:"?"firefox":"chrome"}async function O(e,r,g,m){return fetch(`http://127.0.0.1:${e}/gazesight/pairing/${r}`,{method:"POST",headers:{"Content-Type":"application/json",...m?{Authorization:`Bearer ${m}`}:{}},body:JSON.stringify(g),signal:AbortSignal.timeout(2500)})}async function j(e,r=32147){e("searching");let g=re(),m;try{m=await O(r,"request",{browser:te(),extensionId:browser.runtime.id,secret:g})}catch{return e("unavailable"),!1}if(!m.ok)return e("unavailable"),!1;let l=await m.json();for(e("pending",l.code);;){if(Date.now()>=l.expiresAt)return e("expired",l.code),!1;await new Promise(E=>setTimeout(E,800)),e("waiting_approval",l.code);let w;try{w=await O(r,"status",{requestId:l.requestId,secret:g})}catch{continue}let p=await w.json();if(p.state==="approved"&&p.credential&&p.pairingId)return await browser.storage.local.set({token:p.credential,pairingId:p.pairingId,port:r,pairingState:"connected"}),e("connected"),!0;if(p.state==="rejected")return e("reconnect_required",l.code),!1;if(p.state==="expired"||w.status===410)return e("expired",l.code),!1}}function o(e,r){document.getElementById(e).textContent=r}var k=!1,F;function U(e,r=!1){clearTimeout(F),o("feedback",e),r&&(F=setTimeout(()=>o("feedback",""),3500))}async function f(e){let r=await browser.runtime.sendMessage({type:"gazesight-ui",action:e});if(!r?.ok)throw new Error(r?.error??"GazeSight unavailable. Open settings to check pairing.");return r.value}async function h(){let e=await f("status");document.body.dataset.connected=String(e.connected),o("connection",e.connected?"Connected":"Disconnected");let r=await browser.storage.local.get(["token","port"]);document.getElementById("pairing-connect").hidden=typeof r.token=="string",document.body.dataset.background=e.backgroundCapture.enabled?"enabled":"disabled",o("background-state",e.backgroundCapture.enabled?"On":"Off"),o("background-toggle",e.backgroundCapture.enabled?"Disable":"Enable"),document.getElementById("background-toggle").setAttribute("aria-pressed",String(e.backgroundCapture.enabled)),o("background-description",e.backgroundCapture.enabled?"GazeSight can capture this target while you work elsewhere.":e.backgroundCapture.permissionGranted?"Background mode is off. Firefox still reports the optional permission; remove it in Add-ons Manager if needed.":e.backgroundMode==="permission_denied"?"Permission was not granted. Standard foreground capture remains available.":"Allow GazeSight to keep capturing the selected development tab while you work in another tab or application."),document.body.dataset.continuous=e.continuousAuthorization.enabled?"enabled":"disabled",o("continuous-state",e.continuousAuthorization.enabled?"On":"Off"),o("continuous-toggle",e.continuousAuthorization.enabled?"Disable":"Enable"),document.getElementById("continuous-toggle").setAttribute("aria-pressed",String(e.continuousAuthorization.enabled)),o("continuous-description",e.continuousAuthorization.enabled?e.continuousAuthorization.authorizedOrigin?`Staying connected to ${e.continuousAuthorization.authorizedOrigin} across reloads, navigation and previews.`:"Keeps GazeSight connected across reloads, navigation and previews once you select a tab.":"Keep GazeSight connected to this development tab across reloads, navigation and responsive previews, so you don't have to reauthorize it every time."),o("pairing",e.paired?"Paired":"Not paired"),o("target",e.targetState==="authorized"?"Authorized":e.targetState==="none"?"None":"Reauthorize"),o("url",e.url??"No target selected"),o("viewport",e.viewport?`${e.viewport.width} \xD7 ${e.viewport.height} CSS \xB7 DPR ${e.viewport.devicePixelRatio}`:"Viewport unavailable"),o("select-label",e.targetState==="reauthorization_required"?"Reauthorize this tab":"Use this tab"),o("last-capture",e.lastCapture?`${e.lastCapture.mode} \xB7 ${e.lastCapture.width} \xD7 ${e.lastCapture.height} \xB7 ${new Date(e.lastCapture.time).toLocaleTimeString()}`:"None yet"),o("last-error",e.lastError?`${e.lastError.code}: ${e.lastError.message}`:"None");for(let g of["fast","stable"])document.getElementById(g).disabled=k||!e.connected||e.targetState!=="authorized";document.getElementById("disconnect").disabled=k||e.targetState==="none"}var ne={not_connected:"Not connected.",searching:"Searching for local GazeSight\u2026",pending:"Pairing request pending.",waiting_approval:"Waiting for approval in your terminal\u2026",connected:"Connected.",unavailable:"Connection unavailable. Run gazesight pair and try again.",expired:"Pairing expired. Try again.",reconnect_required:"Reconnect required."};document.getElementById("connect").addEventListener("click",async()=>{let e=document.getElementById("connect"),r=document.getElementById("pairing-code");e.disabled=!0;let g=await browser.storage.local.get(["port"]);await j((m,l)=>{o("pairing-message",ne[m]),r.hidden=!l,r.textContent=l?`Verification code: ${l}`:""},Number(g.port??32147)),e.disabled=!1,await h()});for(let e of["select","disconnect","fast","stable","diagnostics"])document.getElementById(e).addEventListener("click",async()=>{if(!k){k=!0,document.querySelectorAll("button").forEach(r=>r.disabled=!0),o("feedback",e==="fast"||e==="stable"?"Capturing\u2026":"Working\u2026");try{if(e==="fast"&&!await browser.permissions.contains({permissions:["downloads"]})){await browser.windows.create({url:browser.runtime.getURL("permission.html?action=download"),type:"popup",focused:!0,width:600,height:700}),window.close();return}let r=await f(e);e==="diagnostics"&&(document.getElementById("diagnostics-panel").hidden=!1,o("diagnostics-output",JSON.stringify(r,null,2))),U(e==="disconnect"?"Target disconnected.":e==="select"?"Target selected.":e==="diagnostics"?"Diagnostics updated.":e==="fast"?`\u2713 Saved to Downloads/${r.filename}`:"Capture completed.",e==="fast")}catch(r){U(r instanceof Error?r.message:"Operation failed.")}finally{k=!1,document.querySelectorAll("button").forEach(r=>r.disabled=!1),await h().catch(r=>o("feedback",String(r)))}}});document.getElementById("copy-url").addEventListener("click",async()=>{let e=document.getElementById("url").textContent;if(!(!e||e==="No target selected"))try{await navigator.clipboard.writeText(e),o("feedback","URL copied.")}catch{o("feedback","Unable to copy URL. Select and copy it manually.")}});document.getElementById("background-toggle").addEventListener("click",async()=>{if((await f("status")).backgroundCapture.enabled){await f("background-disable"),await h();return}await browser.windows.create({url:browser.runtime.getURL("permission.html?action=background"),type:"popup",focused:!0,width:600,height:700}),window.close()});document.getElementById("continuous-toggle").addEventListener("click",async()=>{let e=await f("status");if(e.continuousAuthorization.enabled){await f("continuous-disable"),await h();return}if(e.continuousAuthorization.permissionGranted){await f("continuous-enable"),await h();return}await browser.windows.create({url:browser.runtime.getURL("permission.html?action=continuous"),type:"popup",focused:!0,width:600,height:700}),window.close()});browser.commands.getAll().then(e=>{let r=e.find(g=>g.name==="gazesight-select-target")?.shortcut;r&&o("shortcut",r)}).catch(()=>{});document.getElementById("settings").addEventListener("click",()=>void browser.runtime.openOptionsPage());h().catch(e=>o("feedback",String(e)));var se=setInterval(()=>{k||h().catch(e=>o("feedback",String(e)))},2e3);window.addEventListener("pagehide",()=>clearInterval(se),{once:!0});
1
+ var Q=Object.create;var $=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var ee=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty;var te=(e,r)=>()=>(r||e((r={exports:{}}).exports,r),r.exports);var ne=(e,r,a,c)=>{if(r&&typeof r=="object"||typeof r=="function")for(let l of X(r))!re.call(e,l)&&l!==a&&$(e,l,{get:()=>r[l],enumerable:!(c=Y(r,l))||c.enumerable});return e};var se=(e,r,a)=>(a=e!=null?Q(ee(e)):{},ne(r||!e||!e.__esModule?$(a,"default",{value:e,enumerable:!0}):a,e));var q=te((z,O)=>{(function(e,r){if(typeof define=="function"&&define.amd)define("webextension-polyfill",["module"],r);else if(typeof z<"u")r(O);else{var a={exports:{}};r(a),e.browser=a.exports}})(typeof globalThis<"u"?globalThis:typeof self<"u"?self:z,function(e){"use strict";if(!(globalThis.chrome&&globalThis.chrome.runtime&&globalThis.chrome.runtime.id))throw new Error("This script should only be loaded in a browser extension.");if(globalThis.browser&&globalThis.browser.runtime&&globalThis.browser.runtime.id)e.exports=globalThis.browser;else{let r="The message port closed before a response was received.",a=c=>{let l={alarms:{clear:{minArgs:0,maxArgs:1},clearAll:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getAll:{minArgs:0,maxArgs:0}},bookmarks:{create:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},getChildren:{minArgs:1,maxArgs:1},getRecent:{minArgs:1,maxArgs:1},getSubTree:{minArgs:1,maxArgs:1},getTree:{minArgs:0,maxArgs:0},move:{minArgs:2,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeTree:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}},browserAction:{disable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},enable:{minArgs:0,maxArgs:1,fallbackToNoCallback:!0},getBadgeBackgroundColor:{minArgs:1,maxArgs:1},getBadgeText:{minArgs:1,maxArgs:1},getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},openPopup:{minArgs:0,maxArgs:0},setBadgeBackgroundColor:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setBadgeText:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},browsingData:{remove:{minArgs:2,maxArgs:2},removeCache:{minArgs:1,maxArgs:1},removeCookies:{minArgs:1,maxArgs:1},removeDownloads:{minArgs:1,maxArgs:1},removeFormData:{minArgs:1,maxArgs:1},removeHistory:{minArgs:1,maxArgs:1},removeLocalStorage:{minArgs:1,maxArgs:1},removePasswords:{minArgs:1,maxArgs:1},removePluginData:{minArgs:1,maxArgs:1},settings:{minArgs:0,maxArgs:0}},commands:{getAll:{minArgs:0,maxArgs:0}},contextMenus:{remove:{minArgs:1,maxArgs:1},removeAll:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},cookies:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:1,maxArgs:1},getAllCookieStores:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},devtools:{inspectedWindow:{eval:{minArgs:1,maxArgs:2,singleCallbackArg:!1}},panels:{create:{minArgs:3,maxArgs:3,singleCallbackArg:!0},elements:{createSidebarPane:{minArgs:1,maxArgs:1}}}},downloads:{cancel:{minArgs:1,maxArgs:1},download:{minArgs:1,maxArgs:1},erase:{minArgs:1,maxArgs:1},getFileIcon:{minArgs:1,maxArgs:2},open:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},pause:{minArgs:1,maxArgs:1},removeFile:{minArgs:1,maxArgs:1},resume:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},extension:{isAllowedFileSchemeAccess:{minArgs:0,maxArgs:0},isAllowedIncognitoAccess:{minArgs:0,maxArgs:0}},history:{addUrl:{minArgs:1,maxArgs:1},deleteAll:{minArgs:0,maxArgs:0},deleteRange:{minArgs:1,maxArgs:1},deleteUrl:{minArgs:1,maxArgs:1},getVisits:{minArgs:1,maxArgs:1},search:{minArgs:1,maxArgs:1}},i18n:{detectLanguage:{minArgs:1,maxArgs:1},getAcceptLanguages:{minArgs:0,maxArgs:0}},identity:{launchWebAuthFlow:{minArgs:1,maxArgs:1}},idle:{queryState:{minArgs:1,maxArgs:1}},management:{get:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},getSelf:{minArgs:0,maxArgs:0},setEnabled:{minArgs:2,maxArgs:2},uninstallSelf:{minArgs:0,maxArgs:1}},notifications:{clear:{minArgs:1,maxArgs:1},create:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:0},getPermissionLevel:{minArgs:0,maxArgs:0},update:{minArgs:2,maxArgs:2}},pageAction:{getPopup:{minArgs:1,maxArgs:1},getTitle:{minArgs:1,maxArgs:1},hide:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setIcon:{minArgs:1,maxArgs:1},setPopup:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},setTitle:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0},show:{minArgs:1,maxArgs:1,fallbackToNoCallback:!0}},permissions:{contains:{minArgs:1,maxArgs:1},getAll:{minArgs:0,maxArgs:0},remove:{minArgs:1,maxArgs:1},request:{minArgs:1,maxArgs:1}},runtime:{getBackgroundPage:{minArgs:0,maxArgs:0},getPlatformInfo:{minArgs:0,maxArgs:0},openOptionsPage:{minArgs:0,maxArgs:0},requestUpdateCheck:{minArgs:0,maxArgs:0},sendMessage:{minArgs:1,maxArgs:3},sendNativeMessage:{minArgs:2,maxArgs:2},setUninstallURL:{minArgs:1,maxArgs:1}},sessions:{getDevices:{minArgs:0,maxArgs:1},getRecentlyClosed:{minArgs:0,maxArgs:1},restore:{minArgs:0,maxArgs:1}},storage:{local:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}},managed:{get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1}},sync:{clear:{minArgs:0,maxArgs:0},get:{minArgs:0,maxArgs:1},getBytesInUse:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}}},tabs:{captureVisibleTab:{minArgs:0,maxArgs:2},create:{minArgs:1,maxArgs:1},detectLanguage:{minArgs:0,maxArgs:1},discard:{minArgs:0,maxArgs:1},duplicate:{minArgs:1,maxArgs:1},executeScript:{minArgs:1,maxArgs:2},get:{minArgs:1,maxArgs:1},getCurrent:{minArgs:0,maxArgs:0},getZoom:{minArgs:0,maxArgs:1},getZoomSettings:{minArgs:0,maxArgs:1},goBack:{minArgs:0,maxArgs:1},goForward:{minArgs:0,maxArgs:1},highlight:{minArgs:1,maxArgs:1},insertCSS:{minArgs:1,maxArgs:2},move:{minArgs:2,maxArgs:2},query:{minArgs:1,maxArgs:1},reload:{minArgs:0,maxArgs:2},remove:{minArgs:1,maxArgs:1},removeCSS:{minArgs:1,maxArgs:2},sendMessage:{minArgs:2,maxArgs:3},setZoom:{minArgs:1,maxArgs:2},setZoomSettings:{minArgs:1,maxArgs:2},update:{minArgs:1,maxArgs:2}},topSites:{get:{minArgs:0,maxArgs:0}},webNavigation:{getAllFrames:{minArgs:1,maxArgs:1},getFrame:{minArgs:1,maxArgs:1}},webRequest:{handlerBehaviorChanged:{minArgs:0,maxArgs:0}},windows:{create:{minArgs:0,maxArgs:1},get:{minArgs:1,maxArgs:2},getAll:{minArgs:0,maxArgs:1},getCurrent:{minArgs:0,maxArgs:1},getLastFocused:{minArgs:0,maxArgs:1},remove:{minArgs:1,maxArgs:1},update:{minArgs:2,maxArgs:2}}};if(Object.keys(l).length===0)throw new Error("api-metadata.json has not been included in browser-polyfill");class h extends WeakMap{constructor(n,i=void 0){super(i),this.createItem=n}get(n){return this.has(n)||this.set(n,this.createItem(n)),super.get(n)}}let C=t=>t&&typeof t=="object"&&typeof t.then=="function",k=(t,n)=>(...i)=>{c.runtime.lastError?t.reject(new Error(c.runtime.lastError.message)):n.singleCallbackArg||i.length<=1&&n.singleCallbackArg!==!1?t.resolve(i[0]):t.resolve(i)},A=t=>t==1?"argument":"arguments",E=(t,n)=>function(o,...d){if(d.length<n.minArgs)throw new Error(`Expected at least ${n.minArgs} ${A(n.minArgs)} for ${t}(), got ${d.length}`);if(d.length>n.maxArgs)throw new Error(`Expected at most ${n.maxArgs} ${A(n.maxArgs)} for ${t}(), got ${d.length}`);return new Promise((u,b)=>{if(n.fallbackToNoCallback)try{o[t](...d,k({resolve:u,reject:b},n))}catch(s){console.warn(`${t} API method doesn't seem to support the callback parameter, falling back to call it without a callback: `,s),o[t](...d),n.fallbackToNoCallback=!1,n.noCallback=!0,u()}else n.noCallback?(o[t](...d),u()):o[t](...d,k({resolve:u,reject:b},n))})},N=(t,n,i)=>new Proxy(n,{apply(o,d,u){return i.call(d,t,...u)}}),P=Function.call.bind(Object.prototype.hasOwnProperty),I=(t,n={},i={})=>{let o=Object.create(null),d={has(b,s){return s in t||s in o},get(b,s,p){if(s in o)return o[s];if(!(s in t))return;let m=t[s];if(typeof m=="function")if(typeof n[s]=="function")m=N(t,t[s],n[s]);else if(P(i,s)){let v=E(s,i[s]);m=N(t,t[s],v)}else m=m.bind(t);else if(typeof m=="object"&&m!==null&&(P(n,s)||P(i,s)))m=I(m,n[s],i[s]);else if(P(i,"*"))m=I(m,n[s],i["*"]);else return Object.defineProperty(o,s,{configurable:!0,enumerable:!0,get(){return t[s]},set(v){t[s]=v}}),m;return o[s]=m,m},set(b,s,p,m){return s in o?o[s]=p:t[s]=p,!0},defineProperty(b,s,p){return Reflect.defineProperty(o,s,p)},deleteProperty(b,s){return Reflect.deleteProperty(o,s)}},u=Object.create(t);return new Proxy(u,d)},R=t=>({addListener(n,i,...o){n.addListener(t.get(i),...o)},hasListener(n,i){return n.hasListener(t.get(i))},removeListener(n,i){n.removeListener(t.get(i))}}),K=new h(t=>typeof t!="function"?t:function(i){let o=I(i,{},{getContent:{minArgs:0,maxArgs:0}});t(o)}),B=new h(t=>typeof t!="function"?t:function(i,o,d){let u=!1,b,s=new Promise(T=>{b=function(f){u=!0,T(f)}}),p;try{p=t(i,o,b)}catch(T){p=Promise.reject(T)}let m=p!==!0&&C(p);if(p!==!0&&!m&&!u)return!1;let v=T=>{T.then(f=>{d(f)},f=>{let M;f&&(f instanceof Error||typeof f.message=="string")?M=f.message:M="An unexpected error occurred",d({__mozWebExtensionPolyfillReject__:!0,message:M})}).catch(f=>{console.error("Failed to send onMessage rejected reply",f)})};return v(m?p:s),!0}),Z=({reject:t,resolve:n},i)=>{c.runtime.lastError?c.runtime.lastError.message===r?n():t(new Error(c.runtime.lastError.message)):i&&i.__mozWebExtensionPolyfillReject__?t(new Error(i.message)):n(i)},L=(t,n,i,...o)=>{if(o.length<n.minArgs)throw new Error(`Expected at least ${n.minArgs} ${A(n.minArgs)} for ${t}(), got ${o.length}`);if(o.length>n.maxArgs)throw new Error(`Expected at most ${n.maxArgs} ${A(n.maxArgs)} for ${t}(), got ${o.length}`);return new Promise((d,u)=>{let b=Z.bind(null,{resolve:d,reject:u});o.push(b),i.sendMessage(...o)})},J={devtools:{network:{onRequestFinished:R(K)}},runtime:{onMessage:R(B),onMessageExternal:R(B),sendMessage:L.bind(null,"sendMessage",{minArgs:1,maxArgs:3})},tabs:{sendMessage:L.bind(null,"sendMessage",{minArgs:2,maxArgs:3})}},_={clear:{minArgs:1,maxArgs:1},get:{minArgs:1,maxArgs:1},set:{minArgs:1,maxArgs:1}};return l.privacy={network:{"*":_},services:{"*":_},websites:{"*":_}},I(c,J,l)};e.exports=a(chrome)}})});var U=se(q(),1);globalThis.browser=U.default;var x="pendingPairing";function ie(){return[...crypto.getRandomValues(new Uint8Array(32))].map(r=>r.toString(16).padStart(2,"0")).join("")}function ae(){return location.protocol==="moz-extension:"?"firefox":"chrome"}async function j(e,r,a,c,l=2500){return fetch(`http://127.0.0.1:${e}/gazesight/pairing/${r}`,{method:"POST",headers:{"Content-Type":"application/json",...c?{Authorization:`Bearer ${c}`}:{}},body:JSON.stringify(a),signal:AbortSignal.timeout(l)})}async function D(e,r){let{requestId:a,proof:c,code:l,expiresAt:h,port:C}=r;for(;;){if(Date.now()>=h)return await browser.storage.local.remove(x),e("expired",l),!1;e("waiting_approval",l);let k;try{k=await j(C,"status",{requestId:a,secret:c})}catch{await new Promise(E=>setTimeout(E,800));continue}let A=await k.json();if(A.state==="approved"&&A.credential&&A.pairingId)return await browser.storage.local.set({token:A.credential,pairingId:A.pairingId,port:C,pairingState:"connected"}),await browser.storage.local.remove(x),e("connected"),!0;if(A.state==="rejected")return await browser.storage.local.remove(x),e("reconnect_required",l),!1;if(A.state==="expired"||k.status===410)return await browser.storage.local.remove(x),e("expired",l),!1;await new Promise(E=>setTimeout(E,800))}}async function F(e,r=32147){e("searching");let a=ie(),c;try{c=await j(r,"request",{browser:ae(),extensionId:browser.runtime.id,secret:a},void 0,6e4)}catch{return e("unavailable"),!1}if(!c.ok)return e("unavailable"),!1;let l=await c.json(),h={requestId:l.requestId,proof:a,code:l.code,expiresAt:l.expiresAt,port:r};return await browser.storage.local.set({[x]:h}),e("pending",l.code),D(e,h)}async function G(e){let a=(await browser.storage.local.get(x))[x];if(a){if(Date.now()>=a.expiresAt){await browser.storage.local.remove(x);return}return D(e,a)}}function g(e,r){document.getElementById(e).textContent=r}var S=!1,W;function V(e,r=!1){clearTimeout(W),g("feedback",e),r&&(W=setTimeout(()=>g("feedback",""),3500))}async function y(e){let r=await browser.runtime.sendMessage({type:"gazesight-ui",action:e});if(!r?.ok)throw new Error(r?.error??"GazeSight unavailable. Open settings to check pairing.");return r.value}async function w(){let e=await y("status");document.body.dataset.connected=String(e.connected),g("connection",e.connected?"Connected":"Disconnected");let r=await browser.storage.local.get(["token","port"]);document.getElementById("pairing-connect").hidden=typeof r.token=="string",document.body.dataset.background=e.backgroundCapture.enabled?"enabled":"disabled",g("background-state",e.backgroundCapture.enabled?"On":"Off"),g("background-toggle",e.backgroundCapture.enabled?"Disable":"Enable"),document.getElementById("background-toggle").setAttribute("aria-pressed",String(e.backgroundCapture.enabled)),g("background-description",e.backgroundCapture.enabled?"GazeSight can capture this target while you work elsewhere.":e.backgroundCapture.permissionGranted?"Background mode is off. Firefox still reports the optional permission; remove it in Add-ons Manager if needed.":e.backgroundMode==="permission_denied"?"Permission was not granted. Standard foreground capture remains available.":"Allow GazeSight to keep capturing the selected development tab while you work in another tab or application."),document.body.dataset.continuous=e.continuousAuthorization.enabled?"enabled":"disabled",g("continuous-state",e.continuousAuthorization.enabled?"On":"Off"),g("continuous-toggle",e.continuousAuthorization.enabled?"Disable":"Enable"),document.getElementById("continuous-toggle").setAttribute("aria-pressed",String(e.continuousAuthorization.enabled)),g("continuous-description",e.continuousAuthorization.enabled?e.continuousAuthorization.authorizedOrigin?`Staying connected to ${e.continuousAuthorization.authorizedOrigin} across reloads, navigation and previews.`:"Keeps GazeSight connected across reloads, navigation and previews once you select a tab.":"Keep GazeSight connected to this development tab across reloads, navigation and responsive previews, so you don't have to reauthorize it every time."),g("pairing",e.paired?"Paired":"Not paired"),g("target",e.targetState==="authorized"?"Authorized":e.targetState==="none"?"None":"Reauthorize"),g("url",e.url??"No target selected"),g("viewport",e.viewport?`${e.viewport.width} \xD7 ${e.viewport.height} CSS \xB7 DPR ${e.viewport.devicePixelRatio}`:"Viewport unavailable"),g("select-label",e.targetState==="reauthorization_required"?"Reauthorize this tab":"Use this tab"),g("last-capture",e.lastCapture?`${e.lastCapture.mode} \xB7 ${e.lastCapture.width} \xD7 ${e.lastCapture.height} \xB7 ${new Date(e.lastCapture.time).toLocaleTimeString()}`:"None yet"),g("last-error",e.lastError?`${e.lastError.code}: ${e.lastError.message}`:"None");for(let a of["fast","stable"])document.getElementById(a).disabled=S||!e.connected||e.targetState!=="authorized";document.getElementById("disconnect").disabled=S||e.targetState==="none"}var oe={not_connected:"Not connected.",searching:"Searching for local GazeSight\u2026",pending:"Pairing request pending.",waiting_approval:"Waiting for approval in your terminal\u2026",connected:"Connected.",unavailable:"Connection unavailable. Run gazesight pair and try again.",expired:"Pairing expired. Try again.",reconnect_required:"Reconnect required."};function H(e,r){let a=document.getElementById("pairing-code");g("pairing-message",oe[e]),a.hidden=!r,a.textContent=r?`Verification code: ${r}`:""}document.getElementById("connect").addEventListener("click",async()=>{let e=document.getElementById("connect");e.disabled=!0;let r=await browser.storage.local.get(["port"]);await F(H,Number(r.port??32147)),e.disabled=!1,await w()});(async()=>typeof(await browser.storage.local.get(["token"])).token!="string"&&await G(H)&&await w())();for(let e of["select","disconnect","fast","stable","diagnostics"])document.getElementById(e).addEventListener("click",async()=>{if(!S){S=!0,document.querySelectorAll("button").forEach(r=>r.disabled=!0),g("feedback",e==="fast"||e==="stable"?"Capturing\u2026":"Working\u2026");try{if(e==="fast"&&!await browser.permissions.contains({permissions:["downloads"]})){await browser.windows.create({url:browser.runtime.getURL("permission.html?action=download"),type:"popup",focused:!0,width:600,height:700}),window.close();return}let r=await y(e);e==="diagnostics"&&(document.getElementById("diagnostics-panel").hidden=!1,g("diagnostics-output",JSON.stringify(r,null,2))),V(e==="disconnect"?"Target disconnected.":e==="select"?"Target selected.":e==="diagnostics"?"Diagnostics updated.":e==="fast"?`\u2713 Saved to Downloads/${r.filename}`:"Capture completed.",e==="fast")}catch(r){V(r instanceof Error?r.message:"Operation failed.")}finally{S=!1,document.querySelectorAll("button").forEach(r=>r.disabled=!1),await w().catch(r=>g("feedback",String(r)))}}});document.getElementById("copy-url").addEventListener("click",async()=>{let e=document.getElementById("url").textContent;if(!(!e||e==="No target selected"))try{await navigator.clipboard.writeText(e),g("feedback","URL copied.")}catch{g("feedback","Unable to copy URL. Select and copy it manually.")}});document.getElementById("background-toggle").addEventListener("click",async()=>{if((await y("status")).backgroundCapture.enabled){await y("background-disable"),await w();return}await browser.windows.create({url:browser.runtime.getURL("permission.html?action=background"),type:"popup",focused:!0,width:600,height:700}),window.close()});document.getElementById("continuous-toggle").addEventListener("click",async()=>{let e=await y("status");if(e.continuousAuthorization.enabled){await y("continuous-disable"),await w();return}if(e.continuousAuthorization.permissionGranted){await y("continuous-enable"),await w();return}await browser.windows.create({url:browser.runtime.getURL("permission.html?action=continuous"),type:"popup",focused:!0,width:600,height:700}),window.close()});browser.commands.getAll().then(e=>{let r=e.find(a=>a.name==="gazesight-select-target")?.shortcut;r&&g("shortcut",r)}).catch(()=>{});document.getElementById("settings").addEventListener("click",()=>void browser.runtime.openOptionsPage());w().catch(e=>g("feedback",String(e)));var ge=setInterval(()=>{S||w().catch(e=>g("feedback",String(e)))},2e3);window.addEventListener("pagehide",()=>clearInterval(ge),{once:!0});