openmagic 0.21.0 → 0.22.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.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var OpenMagicToolbar=(()=>{var ye=`
2
+ "use strict";var OpenMagicToolbar=(()=>{var ke=`
3
3
  :host {
4
4
  all: initial;
5
5
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
@@ -321,25 +321,25 @@
321
321
  .om-btn-secondary:hover { background: rgba(255,255,255,0.08); color: #ccc; }
322
322
  .om-diff-applied { opacity: 0.5; }
323
323
  .om-diff-applied .om-diff-actions { display: none; }
324
- `;var S=null,v=new Map,j=[],oe=[],D=!1,be=!1,te=null,ne=0;function se(){return Math.random().toString(36).slice(2)+Date.now().toString(36)}function ae(e,t){return be=!0,new Promise((o,s)=>{let a=!1,r=setTimeout(()=>{a||(a=!0,s(new Error("Handshake timeout")),S?.close())},1e4);try{let i=window.location.hostname||"127.0.0.1",c=window.location.protocol==="https:"?"wss:":"ws:";S=new WebSocket(`${c}//${i}:${e}/__openmagic__/ws`),S.onopen=()=>{let d=se();S.send(JSON.stringify({id:d,type:"handshake",payload:{token:t}})),v.set(d,p=>{if(p.type==="handshake.ok"){clearTimeout(r),D=!0,ne=0;for(let l of oe)S?.send(l);oe=[],a||(a=!0,o())}else p.type==="error"&&(clearTimeout(r),a||(a=!0,s(new Error(p.payload?.message||"Handshake failed"))))})},S.onmessage=d=>{try{let p=JSON.parse(d.data);p.id&&v.has(p.id)&&(v.get(p.id)(p),(p.type==="llm.done"||p.type==="llm.error"||!p.type.startsWith("llm."))&&v.delete(p.id));for(let l of j)l(p)}catch{}},S.onclose=()=>{let d=D;if(D=!1,v.forEach((p,l)=>{p({type:"error",id:l,payload:{message:"Connection lost"}})}),v.clear(),!d&&!a){clearTimeout(r),a=!0,s(new Error("WebSocket closed before handshake"));return}if(d&&be&&!te){let p=Math.min(2e3*Math.pow(1.5,ne),3e4);ne++,te=setTimeout(()=>{te=null,ae(e,t).then(()=>{for(let l of j)l({type:"reconnected",payload:{}})}).catch(()=>{})},p)}},S.onerror=()=>{!D&&!a&&(clearTimeout(r),a=!0,s(new Error("WebSocket connection failed")))}}catch(i){clearTimeout(r),a||(a=!0,s(i))}})}function xe(e){let t=JSON.stringify(e);S&&S.readyState===WebSocket.OPEN&&D?S.send(t):oe.push(t)}function L(e,t){return new Promise((o,s)=>{let a=se(),r=setTimeout(()=>{v.delete(a),s(new Error("Request timeout"))},3e4);v.set(a,i=>{clearTimeout(r),i.type==="error"?s(new Error(i.payload?.message||"Unknown error")):o(i)}),xe({id:a,type:e,payload:t})})}function ve(e,t,o){return new Promise((s,a)=>{let r=se(),i=setTimeout(()=>{v.delete(r),a(new Error("Stream timeout"))},12e4);v.set(r,c=>{c.type==="llm.chunk"?o(c.payload?.delta||""):c.type==="llm.done"?(clearTimeout(i),v.delete(r),s(c.payload)):(c.type==="llm.error"||c.type==="error")&&(clearTimeout(i),v.delete(r),a(new Error(c.payload?.message||"Stream error")))}),xe({id:r,type:e,payload:t})})}function we(e){return j.push(e),()=>{j=j.filter(t=>t!==e)}}function ke(){return D}var Ee=["display","position","width","height","margin","padding","color","background-color","background","font-size","font-weight","font-family","border","border-radius","box-shadow","flex-direction","justify-content","align-items","gap","grid-template-columns","grid-template-rows","overflow","opacity","z-index","text-align","line-height","letter-spacing"];function Se(e){let t=window.getComputedStyle(e),o={};for(let l of Ee)o[l]=t.getPropertyValue(l);let s=e.getBoundingClientRect(),a={};if(e.parentElement&&e.parentElement!==document.body){let l=window.getComputedStyle(e.parentElement);for(let u of Ee)a[u]=l.getPropertyValue(u)}let r=[];if(e.parentElement){let l=Array.from(e.parentElement.children),u=l.indexOf(e),f=Math.max(0,u-3),h=Math.min(l.length,u+4);f>0&&r.push(`... ${f} elements before ...`);for(let b=f;b<h;b++){let k=l[b],P=k.tagName.toLowerCase(),T=(k.className||"").toString().slice(0,60);k===e?r.push(`[SELECTED] <${P} class="${T}">`):r.push(`<${P} class="${T}">`)}h<l.length&&r.push(`... ${l.length-h} elements after ...`)}let i=Je(e),c={};for(let l of Array.from(e.attributes))(l.name.startsWith("aria-")||l.name==="role"||l.name==="tabindex")&&(c[l.name]=l.value);let d=[];for(let l of Array.from(e.attributes))l.name.startsWith("on")&&d.push(l.name);let p=Ye(e);return{tagName:e.tagName.toLowerCase(),id:e.id||"",className:e.className||"",textContent:(e.textContent||"").trim().slice(0,200),outerHTML:We(e),cssSelector:Ve(e),xpath:Xe(e),computedStyles:o,ancestry:Ge(e),componentHint:Ke(e),rect:{x:s.x,y:s.y,width:s.width,height:s.height},parentStyles:a,siblings:r,matchedCssRules:i,viewport:{width:window.innerWidth,height:window.innerHeight},ariaAttributes:c,eventHandlers:d,reactProps:p}}function Ge(e,t=5){let o=[],s=e.parentElement;for(;s&&s!==document.body&&o.length<t;){let a=s.tagName.toLowerCase(),r=(typeof s.className=="string"?s.className:"").split(/\s+/).filter(i=>i.length>1&&!i.startsWith("_")).slice(0,3).join(".");o.push(r?`${a}.${r}`:a),s=s.parentElement}return o}function Ke(e){let t=e;for(;t&&t!==document.body;){let o=t.getAttribute("data-component")||t.getAttribute("data-testid")||t.getAttribute("data-cy");if(o)return o;let s=Object.keys(t);for(let a of s)if(a.startsWith("__reactFiber")||a.startsWith("__reactInternalInstance"))try{let r=t[a],i=r?.type?.name||r?.type?.displayName||r?.return?.type?.name||r?.return?.type?.displayName;if(i&&i!=="div"&&i!=="span"&&i.length>1)return i}catch{}t=t.parentElement}return""}function We(e){let t=e.cloneNode(!0);t.querySelectorAll("script, style, svg").forEach(a=>a.remove());let s=t.outerHTML;if(s.length>2e3){let a=e.tagName.toLowerCase(),r=Array.from(e.attributes).map(c=>`${c.name}="${c.value}"`).join(" "),i=Array.from(e.children).slice(0,5).map(c=>`<${c.tagName.toLowerCase()} .../>`).join(`
324
+ `;var T=null,E=new Map,G=[],le=[],z=!1,Ee=!1,re=null,ie=0;function ce(){return Math.random().toString(36).slice(2)+Date.now().toString(36)}function de(e,t){return Ee=!0,new Promise((o,s)=>{let a=!1,r=setTimeout(()=>{a||(a=!0,s(new Error("Handshake timeout")),T?.close())},1e4);try{let i=window.location.hostname||"127.0.0.1",c=window.location.protocol==="https:"?"wss:":"ws:";T=new WebSocket(`${c}//${i}:${e}/__openmagic__/ws`),T.onopen=()=>{let p=ce();T.send(JSON.stringify({id:p,type:"handshake",payload:{token:t}})),E.set(p,d=>{if(d.type==="handshake.ok"){clearTimeout(r),z=!0,ie=0;for(let l of le)T?.send(l);le=[],a||(a=!0,o())}else d.type==="error"&&(clearTimeout(r),a||(a=!0,s(new Error(d.payload?.message||"Handshake failed"))))})},T.onmessage=p=>{try{let d=JSON.parse(p.data);d.id&&E.has(d.id)&&(E.get(d.id)(d),(d.type==="llm.done"||d.type==="llm.error"||!d.type.startsWith("llm."))&&E.delete(d.id));for(let l of G)l(d)}catch{}},T.onclose=()=>{let p=z;if(z=!1,E.forEach((d,l)=>{d({type:"error",id:l,payload:{message:"Connection lost"}})}),E.clear(),!p&&!a){clearTimeout(r),a=!0,s(new Error("WebSocket closed before handshake"));return}if(p&&Ee&&!re){let d=Math.min(2e3*Math.pow(1.5,ie),3e4);ie++,re=setTimeout(()=>{re=null,de(e,t).then(()=>{for(let l of G)l({type:"reconnected",payload:{}})}).catch(()=>{})},d)}},T.onerror=()=>{!z&&!a&&(clearTimeout(r),a=!0,s(new Error("WebSocket connection failed")))}}catch(i){clearTimeout(r),a||(a=!0,s(i))}})}function Se(e){let t=JSON.stringify(e);T&&T.readyState===WebSocket.OPEN&&z?T.send(t):le.push(t)}function S(e,t){return new Promise((o,s)=>{let a=ce(),r=setTimeout(()=>{E.delete(a),s(new Error("Request timeout"))},3e4);E.set(a,i=>{clearTimeout(r),i.type==="error"?s(new Error(i.payload?.message||"Unknown error")):o(i)}),Se({id:a,type:e,payload:t})})}function $e(e,t,o){return new Promise((s,a)=>{let r=ce(),i=setTimeout(()=>{E.delete(r),a(new Error("Stream timeout"))},12e4);E.set(r,c=>{c.type==="llm.chunk"?o(c.payload?.delta||""):c.type==="llm.done"?(clearTimeout(i),E.delete(r),s(c.payload)):(c.type==="llm.error"||c.type==="error")&&(clearTimeout(i),E.delete(r),a(new Error(c.payload?.message||"Stream error")))}),Se({id:r,type:e,payload:t})})}function Le(e){return G.push(e),()=>{G=G.filter(t=>t!==e)}}function Me(){return z}var Te=["display","position","width","height","margin","padding","color","background-color","background","font-size","font-weight","font-family","border","border-radius","box-shadow","flex-direction","justify-content","align-items","gap","grid-template-columns","grid-template-rows","overflow","opacity","z-index","text-align","line-height","letter-spacing"];function Ce(e){let t=window.getComputedStyle(e),o={};for(let l of Te)o[l]=t.getPropertyValue(l);let s=e.getBoundingClientRect(),a={};if(e.parentElement&&e.parentElement!==document.body){let l=window.getComputedStyle(e.parentElement);for(let u of Te)a[u]=l.getPropertyValue(u)}let r=[];if(e.parentElement){let l=Array.from(e.parentElement.children),u=l.indexOf(e),f=Math.max(0,u-3),h=Math.min(l.length,u+4);f>0&&r.push(`... ${f} elements before ...`);for(let b=f;b<h;b++){let k=l[b],P=k.tagName.toLowerCase(),v=(k.className||"").toString().slice(0,60);k===e?r.push(`[SELECTED] <${P} class="${v}">`):r.push(`<${P} class="${v}">`)}h<l.length&&r.push(`... ${l.length-h} elements after ...`)}let i=tt(e),c={};for(let l of Array.from(e.attributes))(l.name.startsWith("aria-")||l.name==="role"||l.name==="tabindex")&&(c[l.name]=l.value);let p=[];for(let l of Array.from(e.attributes))l.name.startsWith("on")&&p.push(l.name);let d=nt(e);return{tagName:e.tagName.toLowerCase(),id:e.id||"",className:e.className||"",textContent:(e.textContent||"").trim().slice(0,200),outerHTML:Ze(e),cssSelector:Qe(e),xpath:et(e),computedStyles:o,ancestry:Je(e),componentHint:Ye(e),rect:{x:s.x,y:s.y,width:s.width,height:s.height},parentStyles:a,siblings:r,matchedCssRules:i,viewport:{width:window.innerWidth,height:window.innerHeight},ariaAttributes:c,eventHandlers:p,reactProps:d}}function Je(e,t=5){let o=[],s=e.parentElement;for(;s&&s!==document.body&&o.length<t;){let a=s.tagName.toLowerCase(),r=(typeof s.className=="string"?s.className:"").split(/\s+/).filter(i=>i.length>1&&!i.startsWith("_")).slice(0,3).join(".");o.push(r?`${a}.${r}`:a),s=s.parentElement}return o}function Ye(e){let t=e;for(;t&&t!==document.body;){let o=t.getAttribute("data-component")||t.getAttribute("data-testid")||t.getAttribute("data-cy");if(o)return o;let s=Object.keys(t);for(let a of s)if(a.startsWith("__reactFiber")||a.startsWith("__reactInternalInstance"))try{let r=t[a],i=r?.type?.name||r?.type?.displayName||r?.return?.type?.name||r?.return?.type?.displayName;if(i&&i!=="div"&&i!=="span"&&i.length>1)return i}catch{}t=t.parentElement}return""}function Ze(e){let t=e.cloneNode(!0);t.querySelectorAll("script, style, svg").forEach(a=>a.remove());let s=t.outerHTML;if(s.length>2e3){let a=e.tagName.toLowerCase(),r=Array.from(e.attributes).map(c=>`${c.name}="${c.value}"`).join(" "),i=Array.from(e.children).slice(0,5).map(c=>`<${c.tagName.toLowerCase()} .../>`).join(`
325
325
  `);s=`<${a} ${r}>
326
326
  ${i}
327
327
  ${e.children.length>5?`<!-- +${e.children.length-5} more children -->`:""}
328
- </${a}>`}return s}function Ve(e){if(e.id)return`#${CSS.escape(e.id)}`;let t=[],o=e;for(;o&&o!==document.body;){let s=o.tagName.toLowerCase();if(o.id){t.unshift(`#${CSS.escape(o.id)}`);break}if(o.className&&typeof o.className=="string"){let r=o.className.trim().split(/\s+/).filter(i=>!i.startsWith("__")&&i.length<30).slice(0,2).map(i=>CSS.escape(i));r.length>0&&(s+="."+r.join("."))}let a=o.parentElement;if(a){let r=Array.from(a.children).filter(i=>i.tagName===o.tagName);if(r.length>1){let i=r.indexOf(o)+1;s+=`:nth-of-type(${i})`}}t.unshift(s),o=o.parentElement}return t.join(" > ")}function Xe(e){let t=[],o=e;for(;o&&o!==document;){if(o.nodeType===Node.ELEMENT_NODE){let s=o,a=1,r=s.previousElementSibling;for(;r;)r.tagName===s.tagName&&a++,r=r.previousElementSibling;t.unshift(`${s.tagName.toLowerCase()}[${a}]`)}o=o.parentNode}return"/"+t.join("/")}function Je(e){let t=[];try{for(let o of Array.from(document.styleSheets))try{let s=o.cssRules||o.rules;if(!s)continue;for(let a of Array.from(s))if(a instanceof CSSStyleRule)try{if(e.matches(a.selectorText)){let r=a.cssText;r.length>10&&r.length<500&&t.push(r)}}catch{}}catch{}}catch{}return t.slice(0,15)}function Ye(e){try{let t=Object.keys(e);for(let o of t)if(o.startsWith("__reactFiber")||o.startsWith("__reactInternalInstance")){let s=e[o];if(!s?.memoizedProps)continue;let a=s.memoizedProps,r={},i=0;for(let[c,d]of Object.entries(a)){if(i>=10)break;if(c==="children")continue;let p=typeof d;p==="string"||p==="number"||p==="boolean"||d===null?(r[c]=d,i++):p==="function"?(r[c]="[function]",i++):Array.isArray(d)&&(r[c]=`[Array(${d.length})]`,i++)}return Object.keys(r).length>0?r:null}}catch{}return null}var w=null;function Le(e){w||(w=document.createElement("div"),w.style.cssText=`
328
+ </${a}>`}return s}function Qe(e){if(e.id)return`#${CSS.escape(e.id)}`;let t=[],o=e;for(;o&&o!==document.body;){let s=o.tagName.toLowerCase();if(o.id){t.unshift(`#${CSS.escape(o.id)}`);break}if(o.className&&typeof o.className=="string"){let r=o.className.trim().split(/\s+/).filter(i=>!i.startsWith("__")&&i.length<30).slice(0,2).map(i=>CSS.escape(i));r.length>0&&(s+="."+r.join("."))}let a=o.parentElement;if(a){let r=Array.from(a.children).filter(i=>i.tagName===o.tagName);if(r.length>1){let i=r.indexOf(o)+1;s+=`:nth-of-type(${i})`}}t.unshift(s),o=o.parentElement}return t.join(" > ")}function et(e){let t=[],o=e;for(;o&&o!==document;){if(o.nodeType===Node.ELEMENT_NODE){let s=o,a=1,r=s.previousElementSibling;for(;r;)r.tagName===s.tagName&&a++,r=r.previousElementSibling;t.unshift(`${s.tagName.toLowerCase()}[${a}]`)}o=o.parentNode}return"/"+t.join("/")}function tt(e){let t=[];try{for(let o of Array.from(document.styleSheets))try{let s=o.cssRules||o.rules;if(!s)continue;for(let a of Array.from(s))if(a instanceof CSSStyleRule)try{if(e.matches(a.selectorText)){let r=a.cssText;r.length>10&&r.length<500&&t.push(r)}}catch{}}catch{}}catch{}return t.slice(0,15)}function nt(e){try{let t=Object.keys(e);for(let o of t)if(o.startsWith("__reactFiber")||o.startsWith("__reactInternalInstance")){let s=e[o];if(!s?.memoizedProps)continue;let a=s.memoizedProps,r={},i=0;for(let[c,p]of Object.entries(a)){if(i>=10)break;if(c==="children")continue;let d=typeof p;d==="string"||d==="number"||d==="boolean"||p===null?(r[c]=p,i++):d==="function"?(r[c]="[function]",i++):Array.isArray(p)&&(r[c]=`[Array(${p.length})]`,i++)}return Object.keys(r).length>0?r:null}}catch{}return null}var $=null;function He(e){$||($=document.createElement("div"),$.style.cssText=`
329
329
  position: fixed;
330
330
  pointer-events: none;
331
331
  z-index: 2147483646;
332
332
  border: 2px solid #6c5ce7;
333
333
  background: rgba(108, 92, 231, 0.1);
334
334
  transition: all 0.1s ease;
335
- `,w.dataset.openmagic="highlight",document.body.appendChild(w)),w.style.left=`${e.x}px`,w.style.top=`${e.y}px`,w.style.width=`${e.width}px`,w.style.height=`${e.height}px`,w.style.display="block"}function Me(){w&&(w.style.display="none")}async function $e(e){try{return e?await Qe(e):await Ze()}catch(t){return console.warn("[OpenMagic] Screenshot capture failed:",t),null}}async function Ze(){let e=document.createElement("canvas"),t=window.devicePixelRatio||1;e.width=window.innerWidth*t,e.height=window.innerHeight*t;let o=e.getContext("2d");o.scale(t,t);try{let s=await Te(document.body),a=await He(s,window.innerWidth,window.innerHeight);return o.drawImage(a,0,0),e.toDataURL("image/png")}catch{return null}}async function Qe(e){let t=e.getBoundingClientRect(),o=document.createElement("canvas"),s=window.devicePixelRatio||1;o.width=t.width*s,o.height=t.height*s;let a=o.getContext("2d");a.scale(s,s);try{let r=await Te(e),i=await He(r,t.width,t.height);return a.drawImage(i,0,0),o.toDataURL("image/png")}catch{return null}}function Te(e){return new Promise(t=>{let o=e.cloneNode(!0);Ce(e,o);let s=e.getBoundingClientRect(),a=s.width,r=s.height,i=`
335
+ `,$.dataset.openmagic="highlight",document.body.appendChild($)),$.style.left=`${e.x}px`,$.style.top=`${e.y}px`,$.style.width=`${e.width}px`,$.style.height=`${e.height}px`,$.style.display="block"}function Pe(){$&&($.style.display="none")}async function _e(e){try{return e?await st(e):await ot()}catch(t){return console.warn("[OpenMagic] Screenshot capture failed:",t),null}}async function ot(){let e=document.createElement("canvas"),t=window.devicePixelRatio||1;e.width=window.innerWidth*t,e.height=window.innerHeight*t;let o=e.getContext("2d");o.scale(t,t);try{let s=await Ne(document.body),a=await Ae(s,window.innerWidth,window.innerHeight);return o.drawImage(a,0,0),e.toDataURL("image/png")}catch{return null}}async function st(e){let t=e.getBoundingClientRect(),o=document.createElement("canvas"),s=window.devicePixelRatio||1;o.width=t.width*s,o.height=t.height*s;let a=o.getContext("2d");a.scale(s,s);try{let r=await Ne(e),i=await Ae(r,t.width,t.height);return a.drawImage(i,0,0),o.toDataURL("image/png")}catch{return null}}function Ne(e){return new Promise(t=>{let o=e.cloneNode(!0);Re(e,o);let s=e.getBoundingClientRect(),a=s.width,r=s.height,i=`
336
336
  <svg xmlns="http://www.w3.org/2000/svg" width="${a}" height="${r}">
337
337
  <foreignObject width="100%" height="100%">
338
338
  <div xmlns="http://www.w3.org/1999/xhtml" style="width:${a}px;height:${r}px;overflow:hidden;">
339
339
  ${o.outerHTML}
340
340
  </div>
341
341
  </foreignObject>
342
- </svg>`;t(i)})}function Ce(e,t){let o=window.getComputedStyle(e),s="";for(let i=0;i<o.length;i++){let c=o[i];s+=`${c}:${o.getPropertyValue(c)};`}t.style.cssText=s;let a=e.children,r=t.children;for(let i=0;i<a.length&&i<r.length;i++)Ce(a[i],r[i])}function He(e,t,o){return new Promise((s,a)=>{let r=new Image,i=new Blob([e],{type:"image/svg+xml;charset=utf-8"}),c=URL.createObjectURL(i);r.onload=()=>{URL.revokeObjectURL(c),s(r)},r.onerror=()=>{URL.revokeObjectURL(c),a(new Error("Failed to load SVG image"))},r.width=t,r.height=o,r.src=c})}var W=[];var Pe=!1;function Ne(){if(Pe)return;Pe=!0;let e=window.fetch;window.fetch=async function(...s){let a=new Request(...s),r={method:a.method,url:a.url,timestamp:Date.now()};try{let i=await e.apply(this,s);return r.status=i.status,r.duration=Date.now()-r.timestamp,re(r),i}catch(i){throw r.status=0,r.duration=Date.now()-r.timestamp,re(r),i}};let t=XMLHttpRequest.prototype.open,o=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(s,a,...r){return this.__om_method=s,this.__om_url=a,this.__om_start=Date.now(),t.apply(this,[s,a,...r])},XMLHttpRequest.prototype.send=function(...s){return this.addEventListener("loadend",()=>{re({method:this.__om_method||"GET",url:this.__om_url||"",status:this.status,duration:Date.now()-(this.__om_start||Date.now()),timestamp:this.__om_start||Date.now()})}),o.apply(this,s)}}function re(e){e.url.includes("__openmagic__")||(W.push(e),W.length>50&&W.shift())}function ie(){return[...W]}var V=[],et=100,_e=!1;function Re(){if(_e)return;_e=!0;let e=["log","warn","error","info","debug"];for(let t of e){let o=console[t];console[t]=function(...s){V.push({level:t,args:s.map(a=>{try{return typeof a=="object"?JSON.stringify(a).slice(0,500):String(a)}catch{return String(a)}}),timestamp:Date.now()}),V.length>et&&V.shift(),o.apply(console,s)}}}function le(){return[...V]}function Ae(e,t){return{selectedElement:e?{tagName:e.tagName,id:e.id,className:e.className,textContent:e.textContent,outerHTML:e.outerHTML,cssSelector:e.cssSelector,computedStyles:e.computedStyles}:void 0,screenshot:t||void 0,networkLogs:ie().map(o=>({method:o.method,url:o.url,status:o.status,duration:o.duration,timestamp:o.timestamp})),consoleLogs:le().map(o=>({level:o.level,args:o.args,timestamp:o.timestamp}))}}var g={sparkle:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.582a.5.5 0 0 1 0 .962L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"/></svg>',crosshair:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="22" y1="12" x2="18" y2="12"/><line x1="6" y1="12" x2="2" y2="12"/><line x1="12" y1="6" x2="12" y2="2"/><line x1="12" y1="22" x2="12" y2="18"/></svg>',camera:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z"/><circle cx="12" cy="13" r="3"/></svg>',chat:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>',settings:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/><circle cx="12" cy="12" r="3"/></svg>',send:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg>',x:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',externalLink:'<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>',check:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg>',grip:'<svg width="7" height="14" viewBox="0 0 8 14" fill="currentColor"><circle cx="2" cy="2" r="1.2"/><circle cx="6" cy="2" r="1.2"/><circle cx="2" cy="7" r="1.2"/><circle cx="6" cy="7" r="1.2"/><circle cx="2" cy="12" r="1.2"/><circle cx="6" cy="12" r="1.2"/></svg>',network:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 20h9"/><path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"/></svg>',activity:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>',paperclip:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48"/></svg>',image:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"/></svg>'},I={openai:{name:"OpenAI",keyUrl:"https://platform.openai.com/api-keys",keyPlaceholder:"sk-...",models:[{id:"gpt-5.4",name:"GPT-5.4"},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini"},{id:"gpt-5.2",name:"GPT-5.2 Thinking"},{id:"o3",name:"o3"},{id:"o4-mini",name:"o4-mini"},{id:"gpt-4.1",name:"GPT-4.1"},{id:"gpt-4.1-mini",name:"GPT-4.1 Mini"}]},anthropic:{name:"Anthropic",keyUrl:"https://console.anthropic.com/settings/keys",keyPlaceholder:"sk-ant-...",models:[{id:"claude-opus-4-6",name:"Claude Opus 4.6"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6"},{id:"claude-haiku-4-5-20251001",name:"Claude Haiku 4.5"}]},google:{name:"Google Gemini",keyUrl:"https://aistudio.google.com/apikey",keyPlaceholder:"AIza...",models:[{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro"},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"}]},xai:{name:"xAI (Grok)",keyUrl:"https://console.x.ai/team/default/api-keys",keyPlaceholder:"xai-...",models:[{id:"grok-4.20-0309-reasoning",name:"Grok 4.20 Reasoning"},{id:"grok-4-1-fast-non-reasoning",name:"Grok 4.1 Fast"}]},deepseek:{name:"DeepSeek",keyUrl:"https://platform.deepseek.com/api_keys",keyPlaceholder:"sk-...",models:[{id:"deepseek-chat",name:"DeepSeek V3.2"},{id:"deepseek-reasoner",name:"DeepSeek R1"}]},mistral:{name:"Mistral",keyUrl:"https://console.mistral.ai/api-keys",keyPlaceholder:"...",models:[{id:"mistral-large-3-25-12",name:"Mistral Large 3"},{id:"codestral-2508",name:"Codestral"},{id:"devstral-2-25-12",name:"Devstral 2"}]},groq:{name:"Groq",keyUrl:"https://console.groq.com/keys",keyPlaceholder:"gsk_...",models:[{id:"meta-llama/llama-4-scout-17b-16e-instruct",name:"Llama 4 Scout"},{id:"llama-3.3-70b-versatile",name:"Llama 3.3 70B"}]},minimax:{name:"MiniMax",keyUrl:"https://platform.minimax.chat/user-center/basic-information/interface-key",keyPlaceholder:"MiniMax key...",models:[{id:"MiniMax-M2.7",name:"MiniMax M2.7"},{id:"MiniMax-M2.5",name:"MiniMax M2.5"}]},moonshot:{name:"Kimi (Moonshot)",keyUrl:"https://platform.moonshot.cn/console/api-keys",keyPlaceholder:"Moonshot key...",models:[{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"kimi-k2-thinking",name:"Kimi K2 Thinking"}]},qwen:{name:"Qwen (Alibaba)",keyUrl:"https://dashscope.console.aliyun.com/apiKey",keyPlaceholder:"DashScope key...",models:[{id:"qwen3.5-plus",name:"Qwen 3.5 Plus"},{id:"qwen-max",name:"Qwen Max"}]},zhipu:{name:"Zhipu AI (GLM)",keyUrl:"https://open.bigmodel.cn/usercenter/apikeys",keyPlaceholder:"Zhipu key...",models:[{id:"glm-5",name:"GLM-5"},{id:"glm-4.7",name:"GLM-4.7"}]},doubao:{name:"Doubao (ByteDance)",keyUrl:"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey",keyPlaceholder:"Volcano key...",models:[{id:"doubao-seed-2-0-pro",name:"Doubao Seed 2.0 Pro"},{id:"doubao-seed-2-0-code",name:"Doubao Seed 2.0 Code"}]},ollama:{name:"Ollama (Local)",keyPlaceholder:"not required",local:!0,models:[]},openrouter:{name:"OpenRouter",keyUrl:"https://openrouter.ai/settings/keys",keyPlaceholder:"sk-or-...",models:[]}};function pe(e){let t=new TextEncoder().encode(e),o="";for(let s=0;s<t.length;s+=32768)o+=String.fromCharCode(...t.subarray(s,s+32768));return btoa(o)}function me(e){let t=atob(e),o=new Uint8Array(t.length);for(let s=0;s<t.length;s++)o[s]=t.charCodeAt(s);return new TextDecoder().decode(o)}var De="0.21.0",n={connected:!1,panelOpen:!1,activePanel:"",selecting:!1,selectedElement:null,screenshot:null,messages:[],streaming:!1,streamContent:"",provider:"",model:"",hasApiKey:!1,configuredProviders:{},roots:[],updateAvailable:!1,latestVersion:"",saveStatus:"",networkCapture:!1,attachments:[]},M,x,N,Ie,he,H;function tt(){try{sessionStorage.setItem("__om_state__",JSON.stringify({messages:n.messages,provider:n.provider,model:n.model,panelOpen:n.panelOpen,activePanel:n.activePanel}))}catch{}}function nt(){try{let e=JSON.parse(sessionStorage.getItem("__om_state__")||"{}");e.messages?.length&&(n.messages=e.messages),e.provider&&(n.provider=e.provider),e.model&&(n.model=e.model),e.panelOpen&&(n.panelOpen=e.panelOpen,n.activePanel=e.activePanel||"")}catch{}}function Oe(){if(document.querySelector("openmagic-toolbar"))return;nt();let e=document.createElement("openmagic-toolbar");e.dataset.openmagic="true",M=e.attachShadow({mode:"closed"});let t=document.createElement("style");t.textContent=ye,M.appendChild(t);let o=document.createElement("div");M.appendChild(o),o.innerHTML=ot(),x=o.querySelector(".om-toolbar"),N=o.querySelector(".om-prompt-input"),Ie=o.querySelector(".om-prompt-context"),he=o.querySelector(".om-panel"),H=o.querySelector(".om-panel-body"),document.body.appendChild(e),st(o),yt();try{let i=JSON.parse(localStorage.getItem("__om_pos__")||"");i?.left&&i?.top&&(x.style.left=i.left,x.style.top=i.top,x.style.right="auto",x.style.bottom="auto")}catch{}Ne(),Re(),bt();let a=document.querySelector("script[data-openmagic-token]")?.dataset.openmagicToken||window.__OPENMAGIC_TOKEN__,r=parseInt(window.location.port,10)||(window.location.protocol==="https:"?443:80);a&&ae(r,a).then(()=>(n.connected=!0,ue(),L("config.get"))).then(i=>{let c=i.payload?.provider||"",d=i.payload?.model||"";n.provider=n.provider||c,n.model=n.model||d,n.configuredProviders=i.payload?.apiKeys||{},n.hasApiKey=n.configuredProviders[n.provider]||!1,n.roots=i.payload?.roots||[],n.panelOpen&&n.activePanel?R(n.activePanel):(!n.provider||!n.hasApiKey&&!Object.values(n.configuredProviders).some(Boolean))&&R("settings"),G()}).catch(()=>{n.connected=!1,ue()})}function ot(){return`
342
+ </svg>`;t(i)})}function Re(e,t){let o=window.getComputedStyle(e),s="";for(let i=0;i<o.length;i++){let c=o[i];s+=`${c}:${o.getPropertyValue(c)};`}t.style.cssText=s;let a=e.children,r=t.children;for(let i=0;i<a.length&&i<r.length;i++)Re(a[i],r[i])}function Ae(e,t,o){return new Promise((s,a)=>{let r=new Image,i=new Blob([e],{type:"image/svg+xml;charset=utf-8"}),c=URL.createObjectURL(i);r.onload=()=>{URL.revokeObjectURL(c),s(r)},r.onerror=()=>{URL.revokeObjectURL(c),a(new Error("Failed to load SVG image"))},r.width=t,r.height=o,r.src=c})}var Z=[];var Oe=!1;function Ie(){if(Oe)return;Oe=!0;let e=window.fetch;window.fetch=async function(...s){let a=new Request(...s),r={method:a.method,url:a.url,timestamp:Date.now()};try{let i=await e.apply(this,s);return r.status=i.status,r.duration=Date.now()-r.timestamp,pe(r),i}catch(i){throw r.status=0,r.duration=Date.now()-r.timestamp,pe(r),i}};let t=XMLHttpRequest.prototype.open,o=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(s,a,...r){return this.__om_method=s,this.__om_url=a,this.__om_start=Date.now(),t.apply(this,[s,a,...r])},XMLHttpRequest.prototype.send=function(...s){return this.addEventListener("loadend",()=>{pe({method:this.__om_method||"GET",url:this.__om_url||"",status:this.status,duration:Date.now()-(this.__om_start||Date.now()),timestamp:this.__om_start||Date.now()})}),o.apply(this,s)}}function pe(e){e.url.includes("__openmagic__")||(Z.push(e),Z.length>50&&Z.shift())}function me(){return[...Z]}var Q=[],at=100,De=!1;function qe(){if(De)return;De=!0;let e=["log","warn","error","info","debug"];for(let t of e){let o=console[t];console[t]=function(...s){Q.push({level:t,args:s.map(a=>{try{return typeof a=="object"?JSON.stringify(a).slice(0,500):String(a)}catch{return String(a)}}),timestamp:Date.now()}),Q.length>at&&Q.shift(),o.apply(console,s)}}}function ue(){return[...Q]}function ze(e,t){return{selectedElement:e?{tagName:e.tagName,id:e.id,className:e.className,textContent:e.textContent,outerHTML:e.outerHTML,cssSelector:e.cssSelector,computedStyles:e.computedStyles}:void 0,screenshot:t||void 0,networkLogs:me().map(o=>({method:o.method,url:o.url,status:o.status,duration:o.duration,timestamp:o.timestamp})),consoleLogs:ue().map(o=>({level:o.level,args:o.args,timestamp:o.timestamp}))}}var g={sparkle:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9.937 15.5A2 2 0 0 0 8.5 14.063l-6.135-1.582a.5.5 0 0 1 0-.962L8.5 9.936A2 2 0 0 0 9.937 8.5l1.582-6.135a.5.5 0 0 1 .963 0L14.063 8.5A2 2 0 0 0 15.5 9.937l6.135 1.582a.5.5 0 0 1 0 .962L15.5 14.063a2 2 0 0 0-1.437 1.437l-1.582 6.135a.5.5 0 0 1-.963 0z"/></svg>',crosshair:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="22" y1="12" x2="18" y2="12"/><line x1="6" y1="12" x2="2" y2="12"/><line x1="12" y1="6" x2="12" y2="2"/><line x1="12" y1="22" x2="12" y2="18"/></svg>',camera:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M14.5 4h-5L7 7H4a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2h-3l-2.5-3z"/><circle cx="12" cy="13" r="3"/></svg>',chat:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>',settings:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/><circle cx="12" cy="12" r="3"/></svg>',send:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/></svg>',x:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>',externalLink:'<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>',check:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"/></svg>',grip:'<svg width="7" height="14" viewBox="0 0 8 14" fill="currentColor"><circle cx="2" cy="2" r="1.2"/><circle cx="6" cy="2" r="1.2"/><circle cx="2" cy="7" r="1.2"/><circle cx="6" cy="7" r="1.2"/><circle cx="2" cy="12" r="1.2"/><circle cx="6" cy="12" r="1.2"/></svg>',network:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 20h9"/><path d="M16.5 3.5a2.12 2.12 0 0 1 3 3L7 19l-4 1 1-4Z"/></svg>',activity:'<svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>',paperclip:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48"/></svg>',image:'<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"/></svg>'},j={openai:{name:"OpenAI",keyUrl:"https://platform.openai.com/api-keys",keyPlaceholder:"sk-...",models:[{id:"gpt-5.4",name:"GPT-5.4"},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini"},{id:"gpt-5.2",name:"GPT-5.2 Thinking"},{id:"o3",name:"o3"},{id:"o4-mini",name:"o4-mini"},{id:"gpt-4.1",name:"GPT-4.1"},{id:"gpt-4.1-mini",name:"GPT-4.1 Mini"}]},anthropic:{name:"Anthropic",keyUrl:"https://console.anthropic.com/settings/keys",keyPlaceholder:"sk-ant-...",models:[{id:"claude-opus-4-6",name:"Claude Opus 4.6"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6"},{id:"claude-haiku-4-5-20251001",name:"Claude Haiku 4.5"}]},google:{name:"Google Gemini",keyUrl:"https://aistudio.google.com/apikey",keyPlaceholder:"AIza...",models:[{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro"},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"}]},xai:{name:"xAI (Grok)",keyUrl:"https://console.x.ai/team/default/api-keys",keyPlaceholder:"xai-...",models:[{id:"grok-4.20-0309-reasoning",name:"Grok 4.20 Reasoning"},{id:"grok-4-1-fast-non-reasoning",name:"Grok 4.1 Fast"}]},deepseek:{name:"DeepSeek",keyUrl:"https://platform.deepseek.com/api_keys",keyPlaceholder:"sk-...",models:[{id:"deepseek-chat",name:"DeepSeek V3.2"},{id:"deepseek-reasoner",name:"DeepSeek R1"}]},mistral:{name:"Mistral",keyUrl:"https://console.mistral.ai/api-keys",keyPlaceholder:"...",models:[{id:"mistral-large-3-25-12",name:"Mistral Large 3"},{id:"codestral-2508",name:"Codestral"},{id:"devstral-2-25-12",name:"Devstral 2"}]},groq:{name:"Groq",keyUrl:"https://console.groq.com/keys",keyPlaceholder:"gsk_...",models:[{id:"meta-llama/llama-4-scout-17b-16e-instruct",name:"Llama 4 Scout"},{id:"llama-3.3-70b-versatile",name:"Llama 3.3 70B"}]},minimax:{name:"MiniMax",keyUrl:"https://platform.minimax.chat/user-center/basic-information/interface-key",keyPlaceholder:"MiniMax key...",models:[{id:"MiniMax-M2.7",name:"MiniMax M2.7"},{id:"MiniMax-M2.5",name:"MiniMax M2.5"}]},moonshot:{name:"Kimi (Moonshot)",keyUrl:"https://platform.moonshot.cn/console/api-keys",keyPlaceholder:"Moonshot key...",models:[{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"kimi-k2-thinking",name:"Kimi K2 Thinking"}]},qwen:{name:"Qwen (Alibaba)",keyUrl:"https://dashscope.console.aliyun.com/apiKey",keyPlaceholder:"DashScope key...",models:[{id:"qwen3.5-plus",name:"Qwen 3.5 Plus"},{id:"qwen-max",name:"Qwen Max"}]},zhipu:{name:"Zhipu AI (GLM)",keyUrl:"https://open.bigmodel.cn/usercenter/apikeys",keyPlaceholder:"Zhipu key...",models:[{id:"glm-5",name:"GLM-5"},{id:"glm-4.7",name:"GLM-4.7"}]},doubao:{name:"Doubao (ByteDance)",keyUrl:"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey",keyPlaceholder:"Volcano key...",models:[{id:"doubao-seed-2-0-pro",name:"Doubao Seed 2.0 Pro"},{id:"doubao-seed-2-0-code",name:"Doubao Seed 2.0 Code"}]},ollama:{name:"Ollama (Local)",keyPlaceholder:"not required",local:!0,models:[]},openrouter:{name:"OpenRouter",keyUrl:"https://openrouter.ai/settings/keys",keyPlaceholder:"sk-or-...",models:[]}};function fe(e){let t=new TextEncoder().encode(e),o="";for(let s=0;s<t.length;s+=32768)o+=String.fromCharCode(...t.subarray(s,s+32768));return btoa(o)}function ye(e){let t=atob(e),o=new Uint8Array(t.length);for(let s=0;s<t.length;s++)o[s]=t.charCodeAt(s);return new TextDecoder().decode(o)}var Be="0.22.0",n={connected:!1,panelOpen:!1,activePanel:"",selecting:!1,selectedElement:null,screenshot:null,messages:[],streaming:!1,streamContent:"",provider:"",model:"",hasApiKey:!1,configuredProviders:{},roots:[],updateAvailable:!1,latestVersion:"",saveStatus:"",networkCapture:!1,attachments:[]},C,w,I,Fe,ve,N;function rt(){try{sessionStorage.setItem("__om_state__",JSON.stringify({messages:n.messages,provider:n.provider,model:n.model,panelOpen:n.panelOpen,activePanel:n.activePanel}))}catch{}}function it(){try{let e=JSON.parse(sessionStorage.getItem("__om_state__")||"{}");e.messages?.length&&(n.messages=e.messages),e.provider&&(n.provider=e.provider),e.model&&(n.model=e.model),e.panelOpen&&(n.panelOpen=e.panelOpen,n.activePanel=e.activePanel||"")}catch{}}function je(){if(document.querySelector("openmagic-toolbar"))return;it();let e=document.createElement("openmagic-toolbar");e.dataset.openmagic="true",C=e.attachShadow({mode:"closed"});let t=document.createElement("style");t.textContent=ke,C.appendChild(t);let o=document.createElement("div");C.appendChild(o),o.innerHTML=lt(),w=o.querySelector(".om-toolbar"),I=o.querySelector(".om-prompt-input"),Fe=o.querySelector(".om-prompt-context"),ve=o.querySelector(".om-panel"),N=o.querySelector(".om-panel-body"),document.body.appendChild(e),ct(o),kt();try{let i=JSON.parse(localStorage.getItem("__om_pos__")||"");i?.left&&i?.top&&(w.style.left=i.left,w.style.top=i.top,w.style.right="auto",w.style.bottom="auto")}catch{}Ie(),qe(),Et();let a=document.querySelector("script[data-openmagic-token]")?.dataset.openmagicToken||window.__OPENMAGIC_TOKEN__,r=parseInt(window.location.port,10)||(window.location.protocol==="https:"?443:80);a&&de(r,a).then(()=>(n.connected=!0,be(),S("config.get"))).then(i=>{let c=i.payload?.provider||"",p=i.payload?.model||"";n.provider=n.provider||c,n.model=n.model||p,n.configuredProviders=i.payload?.apiKeys||{},n.hasApiKey=n.configuredProviders[n.provider]||!1,n.roots=i.payload?.roots||[],n.panelOpen&&n.activePanel?q(n.activePanel):(!n.provider||!n.hasApiKey&&!Object.values(n.configuredProviders).some(Boolean))&&q("settings"),X()}).catch(()=>{n.connected=!1,be()})}function lt(){return`
343
343
  <div class="om-toolbar">
344
344
  <div class="om-toolbar-header">
345
345
  <span class="om-grab">${g.grip}</span>
@@ -359,7 +359,7 @@
359
359
  <div class="om-panel om-hidden">
360
360
  <div class="om-panel-header">
361
361
  <span class="om-panel-title"></span>
362
- <span class="om-panel-version">v${De}</span>
362
+ <span class="om-panel-version">v${Be}</span>
363
363
  <button class="om-panel-close" data-action="close-panel">${g.x}</button>
364
364
  </div>
365
365
  <div class="om-panel-body"></div>
@@ -372,10 +372,10 @@
372
372
  <button class="om-prompt-send" data-action="prompt-send">${g.send}</button>
373
373
  <input type="file" class="om-file-input om-hidden" accept="image/*" multiple />
374
374
  </div>
375
- </div>`}function st(e){e.addEventListener("click",s=>{let a=s.target.closest("[data-action]");if(!a)return;s.preventDefault(),s.stopPropagation();let r=a.dataset.action;ct(r,a)}),e.addEventListener("change",s=>{let a=s.target,r=a.dataset.field;r&&(r==="provider"?(n.provider=a.value,n.model=I[n.provider]?.models[0]?.id||"",n.hasApiKey=n.configuredProviders[n.provider]||I[n.provider]?.local||!1,n.saveStatus="",$()):r==="model"&&(n.model=a.value))}),N.addEventListener("keydown",s=>{s.key==="Enter"&&!s.shiftKey&&(s.preventDefault(),qe())});let t=e.querySelector(".om-file-input");t&&t.addEventListener("change",()=>{de(t.files),t.value=""});let o=e.querySelector(".om-prompt-row");o&&(o.addEventListener("dragover",s=>{s.preventDefault(),o.style.borderColor="rgba(108, 92, 231, 0.5)"}),o.addEventListener("dragleave",()=>{o.style.borderColor=""}),o.addEventListener("drop",s=>{s.preventDefault(),o.style.borderColor="";let a=s.dataTransfer;a?.files?.length&&de(a.files)}),N.addEventListener("paste",s=>{let a=s.clipboardData?.items;if(a){for(let r=0;r<a.length;r++)if(a[r].type.startsWith("image/")){let i=a[r].getAsFile();if(i){let c=new DataTransfer;c.items.add(i),de(c.files)}}}})),we(s=>{s.type==="reconnected"&&(n.connected=!0,ue())})}function at(e){return n.roots.length>0?n.roots[0]+"/"+e:e}function rt(e,t){let o=t.split(`
375
+ </div>`}function ct(e){e.addEventListener("click",s=>{let a=s.target.closest("[data-action]");if(!a)return;s.preventDefault(),s.stopPropagation();let r=a.dataset.action;gt(r,a)}),e.addEventListener("change",s=>{let a=s.target,r=a.dataset.field;r&&(r==="provider"?(n.provider=a.value,n.model=j[n.provider]?.models[0]?.id||"",n.hasApiKey=n.configuredProviders[n.provider]||j[n.provider]?.local||!1,n.saveStatus="",H()):r==="model"&&(n.model=a.value))}),I.addEventListener("keydown",s=>{s.key==="Enter"&&!s.shiftKey&&(s.preventDefault(),Ge())});let t=e.querySelector(".om-file-input");t&&t.addEventListener("change",()=>{he(t.files),t.value=""});let o=e.querySelector(".om-prompt-row");o&&(o.addEventListener("dragover",s=>{s.preventDefault(),o.style.borderColor="rgba(108, 92, 231, 0.5)"}),o.addEventListener("dragleave",()=>{o.style.borderColor=""}),o.addEventListener("drop",s=>{s.preventDefault(),o.style.borderColor="";let a=s.dataTransfer;a?.files?.length&&he(a.files)}),I.addEventListener("paste",s=>{let a=s.clipboardData?.items;if(a){for(let r=0;r<a.length;r++)if(a[r].type.startsWith("image/")){let i=a[r].getAsFile();if(i){let c=new DataTransfer;c.items.add(i),he(c.files)}}}})),Le(s=>{s.type==="reconnected"&&(n.connected=!0,be())})}function dt(e){return n.roots.length>0?n.roots[0]+"/"+e:e}function pt(e,t){let o=t.split(`
376
376
  `).map(i=>i.trim()).filter(i=>i.length>0);if(o.length===0)return null;let s=e.split(`
377
- `),a=o[0],r=o[o.length-1];for(let i=0;i<s.length;i++){if(s[i].trim()!==a||i+o.length>s.length)continue;let c=!0;for(let d=0;d<o.length;d++)if(s[i+d].trim()!==o[d]){c=!1;break}if(c){let d=0;for(let l=0;l<i;l++)d+=s[l].length+1;let p=d;for(let l=i;l<i+o.length;l++)p+=s[l].length+1;return p>0&&p<=e.length&&e[p-1]===`
378
- `&&p--,{start:d,end:p}}}return null}async function it(e){let t=e.dataset.file,o=e.dataset.search,s=e.dataset.replace;if(!t||!o||!s)return;let a,r;try{a=me(o),r=me(s)}catch{n.messages.push({role:"system",content:`Failed to decode diff data for ${t}`}),$();return}let i=e.closest(".om-diff-card"),c=at(t);if(i){let d=i.querySelector(".om-diff-actions");d&&(d.innerHTML='<span class="om-spinner"></span> Applying...')}try{let p=(await L("fs.read",{path:c}))?.payload?.content;if(!p)n.messages.push({role:"system",content:`Could not read ${t} \u2014 file may not exist at ${c}`});else{let l=p.split(a).length-1;if(l===1){let u=await L("fs.write",{path:c,content:p.replace(a,r)});if(u?.payload?.ok===!1)n.messages.push({role:"system",content:`Write failed: ${t} - ${u.payload?.error||"unknown"}`});else{let f=i?.dataset.diffIdx;f!==void 0?n.messages[parseInt(f)]={role:"system",content:`Applied change to ${t}`}:n.messages.push({role:"system",content:`Applied change to ${t}`})}}else if(l>1)n.messages.push({role:"system",content:`Found ${l} exact matches in ${t} \u2014 expected 1. Edit not applied.`});else{let u=rt(p,a);if(u){let f=p.slice(0,u.start)+r+p.slice(u.end),h=await L("fs.write",{path:c,content:f});if(h?.payload?.ok===!1)n.messages.push({role:"system",content:`Write failed: ${t} - ${h.payload?.error||"unknown"}`});else{let b=i?.dataset.diffIdx;b!==void 0?n.messages[parseInt(b)]={role:"system",content:`Applied change to ${t} (fuzzy match \u2014 whitespace adjusted)`}:n.messages.push({role:"system",content:`Applied change to ${t} (fuzzy match)`})}}else n.messages.push({role:"system",content:`No matching code found in ${t}. The file may have changed since the suggestion.`})}}}catch(d){n.messages.push({role:"system",content:`Failed to apply: ${t} \u2014 ${d.message}`})}$(),z()}function lt(e){let t=e.dataset.idx;if(t!==void 0){let o=parseInt(t),a=n.messages[o]?.content.split("__")?.[3]||"file";n.messages[o]={role:"system",content:`Rejected change to ${a}`}}$(),z()}function ct(e,t){switch(e){case"select":ht();break;case"screenshot":ft();break;case"chat":ce("chat");break;case"settings":ce("settings");break;case"close-panel":ze();break;case"prompt-send":qe();break;case"save-settings":mt();break;case"get-key":{let o=t.dataset.url;o&&window.open(o,"_blank","noopener");break}case"change-key":{let o=M.querySelector("[data-key-change]");o&&o.classList.remove("om-hidden"),t.style.display="none";break}case"network":ce("chat"),ut();break;case"attach-image":gt();break;case"remove-attachment":{let o=parseInt(t.dataset.idx||"0",10);n.attachments.splice(o,1),fe();break}case"apply-diff":it(t);break;case"reject-diff":lt(t);break;case"clear-element":n.selectedElement=null,U();break;case"clear-screenshot":n.screenshot=null,U();break}}function ue(){let e=M.querySelector(".om-status-dot");e&&(e.className=`om-status-dot ${n.connected?"connected":"disconnected"}`)}function G(){M.querySelectorAll(".om-pill-btn").forEach(e=>{let t=e.dataset.action;e.classList.toggle("active",t===n.activePanel||t==="select"&&n.selecting)})}function U(){let e=[];n.selectedElement&&e.push(`<span class="om-prompt-chip">${n.selectedElement.tagName}${n.selectedElement.id?"#"+n.selectedElement.id:""} <button class="om-prompt-chip-x" data-action="clear-element">${g.x}</button></span>`),n.screenshot&&e.push(`<span class="om-prompt-chip">Screenshot <button class="om-prompt-chip-x" data-action="clear-screenshot">${g.x}</button></span>`),n.attachments.length&&e.push(`<span class="om-prompt-chip">${n.attachments.length} image${n.attachments.length>1?"s":""}</span>`),Ie.innerHTML=e.join("")}function R(e){n.panelOpen=!0,n.activePanel=e,he.classList.remove("om-hidden");let t=M.querySelector(".om-panel-title");t&&(t.textContent=e==="settings"?"Settings":"Chat"),$(),G()}function ze(){n.panelOpen=!1,n.activePanel="",he.classList.add("om-hidden"),G()}function ce(e){n.panelOpen&&n.activePanel===e?ze():R(e)}function $(){n.activePanel==="settings"?H.innerHTML=dt():n.activePanel==="chat"&&(H.innerHTML=pt(),z()),tt()}function dt(){let e=Object.entries(I).map(([h,b])=>{let P=n.configuredProviders[h]||b.local?" \u2713":"";return`<option value="${h}" ${n.provider===h?"selected":""}>${b.name}${P}</option>`}).join(""),t=I[n.provider],o=t?t.models.map(h=>`<option value="${h.id}" ${n.model===h.id?"selected":""}>${h.name}</option>`).join(""):'<option value="">Select provider first</option>',s=t?.local||!1,a=t?.keyUrl||"",r=t?.keyPlaceholder||"Enter API key...",i=n.configuredProviders[n.provider]||!1,c=n.updateAvailable?`<div class="om-update-banner">v${n.latestVersion} available <code class="om-update-cmd">npx openmagic@latest</code></div>`:"",d=i||s?`<div class="om-status om-status-success">${g.check} ${t?.name||"Provider"} connected</div>`:"",p=n.saveStatus==="saving"?'<span class="om-spinner"></span> Saving...':n.saveStatus==="saved"?`${g.check} Saved`:"Save",l=n.saveStatus==="saving"?"om-btn om-btn-saving":n.saveStatus==="saved"?"om-btn om-btn-saved":"om-btn",u=n.saveStatus==="saving"?"disabled":"",f="";return!s&&n.provider&&(i?f=`
377
+ `),a=o[0],r=o[o.length-1];for(let i=0;i<s.length;i++){if(s[i].trim()!==a||i+o.length>s.length)continue;let c=!0;for(let p=0;p<o.length;p++)if(s[i+p].trim()!==o[p]){c=!1;break}if(c){let p=0;for(let l=0;l<i;l++)p+=s[l].length+1;let d=p;for(let l=i;l<i+o.length;l++)d+=s[l].length+1;return d>0&&d<=e.length&&e[d-1]===`
378
+ `&&d--,{start:p,end:d}}}return null}async function mt(e){let t=e.dataset.file,o=e.dataset.search,s=e.dataset.replace;if(!t||!o||!s)return;let a,r;try{a=ye(o),r=ye(s)}catch{n.messages.push({role:"system",content:`Failed to decode diff data for ${t}`}),H();return}let i=e.closest(".om-diff-card"),c=dt(t);if(i){let p=i.querySelector(".om-diff-actions");p&&(p.innerHTML='<span class="om-spinner"></span> Applying...')}try{let d=(await S("fs.read",{path:c}))?.payload?.content;if(!d)n.messages.push({role:"system",content:`Could not read ${t} \u2014 file may not exist at ${c}`});else{let l=d.split(a).length-1;if(l===1){let u=await S("fs.write",{path:c,content:d.replace(a,r)});if(u?.payload?.ok===!1)n.messages.push({role:"system",content:`Write failed: ${t} - ${u.payload?.error||"unknown"}`});else{let f=i?.dataset.diffIdx;f!==void 0?n.messages[parseInt(f)]={role:"system",content:`Applied change to ${t}`}:n.messages.push({role:"system",content:`Applied change to ${t}`})}}else if(l>1)n.messages.push({role:"system",content:`Found ${l} exact matches in ${t} \u2014 expected 1. Edit not applied.`});else{let u=pt(d,a);if(u){let f=d.slice(0,u.start)+r+d.slice(u.end),h=await S("fs.write",{path:c,content:f});if(h?.payload?.ok===!1)n.messages.push({role:"system",content:`Write failed: ${t} - ${h.payload?.error||"unknown"}`});else{let b=i?.dataset.diffIdx;b!==void 0?n.messages[parseInt(b)]={role:"system",content:`Applied change to ${t} (fuzzy match \u2014 whitespace adjusted)`}:n.messages.push({role:"system",content:`Applied change to ${t} (fuzzy match)`})}}else n.messages.push({role:"system",content:`No matching code found in ${t}. The file may have changed since the suggestion.`})}}}catch(p){n.messages.push({role:"system",content:`Failed to apply: ${t} \u2014 ${p.message}`})}H(),B()}function ut(e){let t=e.dataset.idx;if(t!==void 0){let o=parseInt(t),a=n.messages[o]?.content.split("__")?.[3]||"file";n.messages[o]={role:"system",content:`Rejected change to ${a}`}}H(),B()}function gt(e,t){switch(e){case"select":vt();break;case"screenshot":wt();break;case"chat":ge("chat");break;case"settings":ge("settings");break;case"close-panel":Ue();break;case"prompt-send":Ge();break;case"save-settings":yt();break;case"get-key":{let o=t.dataset.url;o&&window.open(o,"_blank","noopener");break}case"change-key":{let o=C.querySelector("[data-key-change]");o&&o.classList.remove("om-hidden"),t.style.display="none";break}case"network":ge("chat"),bt();break;case"attach-image":xt();break;case"remove-attachment":{let o=parseInt(t.dataset.idx||"0",10);n.attachments.splice(o,1),we();break}case"apply-diff":mt(t);break;case"reject-diff":ut(t);break;case"clear-element":n.selectedElement=null,V();break;case"clear-screenshot":n.screenshot=null,V();break}}function be(){let e=C.querySelector(".om-status-dot");e&&(e.className=`om-status-dot ${n.connected?"connected":"disconnected"}`)}function X(){C.querySelectorAll(".om-pill-btn").forEach(e=>{let t=e.dataset.action;e.classList.toggle("active",t===n.activePanel||t==="select"&&n.selecting)})}function V(){let e=[];n.selectedElement&&e.push(`<span class="om-prompt-chip">${n.selectedElement.tagName}${n.selectedElement.id?"#"+n.selectedElement.id:""} <button class="om-prompt-chip-x" data-action="clear-element">${g.x}</button></span>`),n.screenshot&&e.push(`<span class="om-prompt-chip">Screenshot <button class="om-prompt-chip-x" data-action="clear-screenshot">${g.x}</button></span>`),n.attachments.length&&e.push(`<span class="om-prompt-chip">${n.attachments.length} image${n.attachments.length>1?"s":""}</span>`),Fe.innerHTML=e.join("")}function q(e){n.panelOpen=!0,n.activePanel=e,ve.classList.remove("om-hidden");let t=C.querySelector(".om-panel-title");t&&(t.textContent=e==="settings"?"Settings":"Chat"),H(),X()}function Ue(){n.panelOpen=!1,n.activePanel="",ve.classList.add("om-hidden"),X()}function ge(e){n.panelOpen&&n.activePanel===e?Ue():q(e)}function H(){n.activePanel==="settings"?N.innerHTML=ht():n.activePanel==="chat"&&(N.innerHTML=ft(),B()),rt()}function ht(){let e=Object.entries(j).map(([h,b])=>{let P=n.configuredProviders[h]||b.local?" \u2713":"";return`<option value="${h}" ${n.provider===h?"selected":""}>${b.name}${P}</option>`}).join(""),t=j[n.provider],o=t?t.models.map(h=>`<option value="${h.id}" ${n.model===h.id?"selected":""}>${h.name}</option>`).join(""):'<option value="">Select provider first</option>',s=t?.local||!1,a=t?.keyUrl||"",r=t?.keyPlaceholder||"Enter API key...",i=n.configuredProviders[n.provider]||!1,c=n.updateAvailable?`<div class="om-update-banner">v${n.latestVersion} available <code class="om-update-cmd">npx openmagic@latest</code></div>`:"",p=i||s?`<div class="om-status om-status-success">${g.check} ${t?.name||"Provider"} connected</div>`:"",d=n.saveStatus==="saving"?'<span class="om-spinner"></span> Saving...':n.saveStatus==="saved"?`${g.check} Saved`:"Save",l=n.saveStatus==="saving"?"om-btn om-btn-saving":n.saveStatus==="saved"?"om-btn om-btn-saved":"om-btn",u=n.saveStatus==="saving"?"disabled":"",f="";return!s&&n.provider&&(i?f=`
379
379
  <div class="om-field">
380
380
  <label class="om-label">API Key</label>
381
381
  <div class="om-key-configured">
@@ -408,24 +408,25 @@
408
408
  <select class="om-select" data-field="model"><option value="">Select Model...</option>${o}</select>
409
409
  </div>
410
410
  ${f}
411
- <button class="${l}" data-action="save-settings" ${u}>${p}</button>
412
- ${d}
413
- </div>`}function pt(){if(!n.provider||!n.hasApiKey&&!I[n.provider]?.local)return'<div class="om-status om-status-error">Configure your provider in Settings first</div>';let e=n.messages.map((s,a)=>{if(s.content.startsWith("__DIFF__"))try{let r=JSON.parse(me(s.content.slice(8))),i=pe(r.search),c=pe(r.replace);return`<div class="om-diff-card" data-diff-idx="${a}">
414
- <div class="om-diff-file">${_(r.file)}</div>
415
- <div class="om-diff-removed">${_(r.search.slice(0,200))}</div>
416
- <div class="om-diff-added">${_(r.replace.slice(0,200))}</div>
411
+ <button class="${l}" data-action="save-settings" ${u}>${d}</button>
412
+ ${p}
413
+ </div>`}function ft(){if(!n.provider||!n.hasApiKey&&!j[n.provider]?.local)return'<div class="om-status om-status-error">Configure your provider in Settings first</div>';let e=n.messages.map((s,a)=>{if(s.content.startsWith("__DIFF__"))try{let r=JSON.parse(ye(s.content.slice(8))),i=fe(r.search),c=fe(r.replace);return`<div class="om-diff-card" data-diff-idx="${a}">
414
+ <div class="om-diff-file">${D(r.file)}</div>
415
+ <div class="om-diff-removed">${D(r.search.slice(0,200))}</div>
416
+ <div class="om-diff-added">${D(r.replace.slice(0,200))}</div>
417
417
  <div class="om-diff-actions">
418
- <button class="om-btn om-btn-sm" data-action="apply-diff" data-file="${_(r.file)}" data-search="${i}" data-replace="${c}">Apply</button>
418
+ <button class="om-btn om-btn-sm" data-action="apply-diff" data-file="${D(r.file)}" data-search="${i}" data-replace="${c}">Apply</button>
419
419
  <button class="om-btn-secondary om-btn-sm" data-action="reject-diff" data-idx="${a}">Reject</button>
420
420
  </div>
421
- </div>`}catch{return'<div class="om-msg om-msg-system">Malformed diff data</div>'}return`<div class="om-msg om-msg-${s.role}">${_(s.content)}</div>`}).join(""),t=n.streaming?`<div class="om-msg om-msg-assistant"><span class="om-spinner"></span>${_(n.streamContent)}</div>`:"";return`<div class="om-chat-messages">${!n.messages.length&&!n.streaming?'<div class="om-chat-empty">Select an element or type below to start</div>':""}${e}${t}</div>`}function z(){requestAnimationFrame(()=>{let e=H.querySelector(".om-chat-messages");e&&(e.scrollTop=e.scrollHeight)})}async function mt(){let t=H.querySelector('[data-field="apiKey"]')?.value||"";if(!n.provider){n.saveStatus="error",X(),setTimeout(()=>{n.saveStatus="",$()},2e3);return}if(!ke()){n.saveStatus="error",X();let s=H.querySelector('[data-action="save-settings"]');s&&(s.innerHTML="Not connected - check terminal"),setTimeout(()=>{n.saveStatus="",$()},3e3);return}let o={provider:n.provider,model:n.model};t&&(o.apiKey=t),n.saveStatus="saving",X();try{let s=await Promise.race([L("config.set",o),new Promise((a,r)=>setTimeout(()=>r(new Error("Save timed out")),8e3))]);t&&n.provider&&(n.configuredProviders[n.provider]=!0),n.hasApiKey=!!(t||n.configuredProviders[n.provider]),n.saveStatus="saved",X(),setTimeout(()=>{n.saveStatus="",n.activePanel==="settings"&&R("chat")},1200)}catch(s){n.saveStatus="error";let a=H.querySelector('[data-action="save-settings"]'),r=(s?.message||"").includes("timeout")?"Connection timeout - is the CLI running?":(s?.message||"").includes("connected")?"Not connected to OpenMagic server":`Save failed: ${s?.message||"Unknown error"}`;a&&(a.innerHTML=r,a.className="om-btn",a.disabled=!1),setTimeout(()=>{n.saveStatus="",$()},4e3)}}function X(){let e=H.querySelector('[data-action="save-settings"]');e&&(n.saveStatus==="saving"?(e.innerHTML='<span class="om-spinner"></span> Saving...',e.className="om-btn om-btn-saving",e.disabled=!0):n.saveStatus==="saved"?(e.innerHTML=`${g.check} Saved`,e.className="om-btn om-btn-saved",e.disabled=!1):n.saveStatus==="error"?(e.innerHTML="Save failed - try again",e.className="om-btn",e.disabled=!1):(e.innerHTML="Save",e.className="om-btn",e.disabled=!1))}async function qe(){let e=N.value.trim();if(!e||n.streaming)return;if(!n.provider||!n.hasApiKey&&!I[n.provider]?.local){R("settings");return}n.messages.push({role:"user",content:e}),n.streaming=!0,n.streamContent="",N.value="",R("chat");let t=Ae(n.selectedElement,n.screenshot);t.pageUrl=window.location.href,t.pageTitle=document.title,n.attachments.length>0&&(t.screenshot||(t.screenshot=n.attachments[0]),t.attachments=[...n.attachments]);let o=5,s=32e3,a=/\.(?:[cm]?[jt]sx?|svelte|vue|astro|html?|css|scss|less|php|py)$/i;try{let c=await L("fs.list",{});c?.payload?.projectTree&&(t.projectTree=c.payload.projectTree);let p=(c?.payload?.files||[]).filter(m=>m.type==="file"&&a.test(m.path)),l=[e];if(n.selectedElement&&(n.selectedElement.id&&l.push(n.selectedElement.id),n.selectedElement.className&&l.push(n.selectedElement.className),n.selectedElement.textContent&&l.push(n.selectedElement.textContent.slice(0,100)),n.selectedElement.componentHint&&l.push(n.selectedElement.componentHint),n.selectedElement.ancestry))for(let m of n.selectedElement.ancestry)l.push(m);let u=l.filter(Boolean).join(" ").toLowerCase().split(/[^a-z0-9_-]+/).filter(m=>m.length>=2&&!["the","to","in","of","and","div","span","class","style"].includes(m)),h=window.location.pathname.split("/").filter(m=>m.length>1&&!/^\d+$/.test(m)),b=p.map(m=>{let y=0,E=m.path.toLowerCase();for(let C of h)E.includes(C.toLowerCase())&&(y+=15);if(n.selectedElement?.componentHint){let C=n.selectedElement.componentHint.toLowerCase();E.includes(C)&&(y+=12)}for(let C of u)E.includes(C)&&(y+=5);return/(component|page|route|layout|template|view)/.test(E)&&(y+=3),/page\.[jt]sx?$|layout\.[jt]sx?$|\+page\.svelte$/.test(E)&&(y+=5),{...m,score:y}}).sort((m,y)=>y.score-m.score),k=[],P=new Set,T=0;for(let m of b.slice(0,o)){if(m.score<=0||T>=s)break;try{let y=n.roots[0]||"",E=y?`${y}/${m.path}`:m.path,C=await L("fs.read",{path:E}),A=String(C?.payload?.content||"");if(!A)continue;let q=Math.min(8e3,s-T),Y=A.slice(0,q);A.length>q&&(Y+=`
422
- // [FILE TRUNCATED \u2014 showing ${q} of ${A.length} chars]`),k.push({path:m.path,content:Y}),P.add(m.path),T+=Y.length;let je=m.path.replace(/\.[^.]+$/,""),Be=[".module.css",".module.scss",".css",".scss",".styles.ts"];for(let Fe of Be){let O=je+Fe;if(P.has(O)||T>=s)continue;if(p.find(Z=>Z.path===O)){try{let Z=await L("fs.read",{path:y?`${y}/${O}`:O}),K=String(Z?.payload?.content||"");if(K){let Q=Math.min(4e3,s-T),ee=K.slice(0,Q);K.length>Q&&(ee+=`
423
- // [FILE TRUNCATED \u2014 showing ${Q} of ${K.length} chars]`),k.push({path:O,content:ee}),P.add(O),T+=ee.length}}catch{}break}}}catch{}}if(T<s)try{let m=n.roots[0]||"",y=await L("fs.read",{path:m?`${m}/package.json`:"package.json"}),E=String(y?.payload?.content||"");if(E)try{let C=JSON.parse(E),A={...C.dependencies,...C.devDependencies},q=JSON.stringify(A,null,2);k.push({path:"package.json (dependencies)",content:q.slice(0,2e3)})}catch{k.push({path:"package.json",content:E.slice(0,2e3)})}}catch{}k.length&&(t.files=k)}catch{}let r=2,i=0;try{for(;i<=r;){n.streamContent="";let c=await ve("llm.chat",{provider:n.provider,model:n.model,messages:n.messages.map(l=>({role:l.role,content:l.content})),context:t},l=>{n.streamContent+=l;let u=H.querySelector(".om-msg-assistant:last-child");u&&(u.innerHTML=`<span class="om-spinner"></span>${_(n.streamContent)}`,z())}),d=n.streamContent||c?.content||"",p=d.match(/NEED_FILE:\s*"?([^\s"}\]]+)"?/)||d.match(/(?:need|provide|show|read|see|contents?\s+of)\s+(?:the\s+)?(?:file\s+)?[`"']?([a-zA-Z0-9_/.@-]+\.[a-z]{1,5})[`"']?/i)||d.match(/(?:source\s+(?:file|code)\s+(?:for|of|at))\s+[`"']?([a-zA-Z0-9_/.@-]+\.[a-z]{1,5})[`"']?/i);if(p&&!c?.modifications?.length&&i<r){let l=p[1].trim();i++,n.messages.push({role:"system",content:`Reading ${l}...`}),$();try{let u=n.roots[0]||"",f=u?`${u}/${l}`:l,h=await L("fs.read",{path:f}),b=String(h?.payload?.content||"");if(b)t.files||(t.files=[]),t.files.push({path:l,content:b.slice(0,8e3)}),n.messages.push({role:"assistant",content:d}),n.messages.push({role:"user",content:`Here is ${l}. Now please make the edit.`});else{n.messages.push({role:"system",content:`Could not read ${l}`});break}}catch{n.messages.push({role:"system",content:`File not found: ${l}`});break}continue}if(n.messages.push({role:"assistant",content:d}),c?.modifications?.length){for(let l of c.modifications)if(l.type==="edit"&&l.file&&l.search&&l.replace){let u=Math.random().toString(36).slice(2),f=JSON.stringify({id:u,file:l.file,search:l.search,replace:l.replace});n.messages.push({role:"system",content:`__DIFF__${pe(f)}`})}}break}}catch(c){n.messages.push({role:"system",content:`Error: ${c.message}`})}n.streaming=!1,n.streamContent="",n.attachments=[],fe(),$(),z()}function ut(){let e=window.performance,t=e.getEntriesByType("navigation")[0],o=e.getEntriesByType("paint"),s=e.getEntriesByType("resource").slice(-20),a=ie(),r=le(),i=[];i.push("--- Network & Performance Capture ---"),t&&(i.push(`Page load: ${Math.round(t.loadEventEnd-t.startTime)}ms`),i.push(`DOM ready: ${Math.round(t.domContentLoadedEventEnd-t.startTime)}ms`),i.push(`TTFB: ${Math.round(t.responseStart-t.startTime)}ms`));let c=o.find(d=>d.name==="first-contentful-paint");if(c&&i.push(`FCP: ${Math.round(c.startTime)}ms`),a.length){i.push(`
424
- Recent requests (${a.length}):`);for(let d of a.slice(-15))i.push(` ${d.method} ${d.url.slice(0,80)} \u2192 ${d.status||"pending"} (${d.duration||"?"}ms)`)}if(r.length){let d=r.filter(l=>l.level==="error"),p=r.filter(l=>l.level==="warn");d.length&&i.push(`
425
- Console errors: ${d.length}`),p.length&&i.push(`Console warnings: ${p.length}`)}if(s.length){let d=[...s].sort((p,l)=>l.duration-p.duration).slice(0,5);i.push(`
426
- Slowest resources:`);for(let p of d)i.push(` ${Math.round(p.duration)}ms \u2014 ${p.name.split("/").pop()?.slice(0,50)}`)}n.messages.push({role:"system",content:i.join(`
427
- `)}),$(),z(),U()}function gt(){let e=M.querySelector(".om-file-input");e&&e.click()}function de(e){if(e)for(let t=0;t<e.length&&n.attachments.length<5;t++){let o=e[t];if(!o.type.startsWith("image/")||o.size>10*1024*1024)continue;let s=new FileReader;s.onload=()=>{typeof s.result=="string"&&(n.attachments.push(s.result),fe())},s.readAsDataURL(o)}}function fe(){let e=M.querySelector(".om-prompt-attachments");if(e){if(!n.attachments.length){e.innerHTML="",e.classList.add("om-hidden");return}e.classList.remove("om-hidden"),e.innerHTML=n.attachments.map((t,o)=>`<div class="om-attachment-thumb">
421
+ </div>`}catch{return'<div class="om-msg om-msg-system">Malformed diff data</div>'}return`<div class="om-msg om-msg-${s.role}">${D(s.content)}</div>`}).join(""),t=n.streaming?`<div class="om-msg om-msg-assistant"><span class="om-spinner"></span>${D(n.streamContent)}</div>`:"";return`<div class="om-chat-messages">${!n.messages.length&&!n.streaming?'<div class="om-chat-empty">Select an element or type below to start</div>':""}${e}${t}</div>`}function B(){requestAnimationFrame(()=>{let e=N.querySelector(".om-chat-messages");e&&(e.scrollTop=e.scrollHeight)})}async function yt(){let t=N.querySelector('[data-field="apiKey"]')?.value||"";if(!n.provider){n.saveStatus="error",ee(),setTimeout(()=>{n.saveStatus="",H()},2e3);return}if(!Me()){n.saveStatus="error",ee();let s=N.querySelector('[data-action="save-settings"]');s&&(s.innerHTML="Not connected - check terminal"),setTimeout(()=>{n.saveStatus="",H()},3e3);return}let o={provider:n.provider,model:n.model};t&&(o.apiKey=t),n.saveStatus="saving",ee();try{let s=await Promise.race([S("config.set",o),new Promise((a,r)=>setTimeout(()=>r(new Error("Save timed out")),8e3))]);t&&n.provider&&(n.configuredProviders[n.provider]=!0),n.hasApiKey=!!(t||n.configuredProviders[n.provider]),n.saveStatus="saved",ee(),setTimeout(()=>{n.saveStatus="",n.activePanel==="settings"&&q("chat")},1200)}catch(s){n.saveStatus="error";let a=N.querySelector('[data-action="save-settings"]'),r=(s?.message||"").includes("timeout")?"Connection timeout - is the CLI running?":(s?.message||"").includes("connected")?"Not connected to OpenMagic server":`Save failed: ${s?.message||"Unknown error"}`;a&&(a.innerHTML=r,a.className="om-btn",a.disabled=!1),setTimeout(()=>{n.saveStatus="",H()},4e3)}}function ee(){let e=N.querySelector('[data-action="save-settings"]');e&&(n.saveStatus==="saving"?(e.innerHTML='<span class="om-spinner"></span> Saving...',e.className="om-btn om-btn-saving",e.disabled=!0):n.saveStatus==="saved"?(e.innerHTML=`${g.check} Saved`,e.className="om-btn om-btn-saved",e.disabled=!1):n.saveStatus==="error"?(e.innerHTML="Save failed - try again",e.className="om-btn",e.disabled=!1):(e.innerHTML="Save",e.className="om-btn",e.disabled=!1))}async function Ge(){let e=I.value.trim();if(!e||n.streaming)return;if(!n.provider||!n.hasApiKey&&!j[n.provider]?.local){q("settings");return}n.messages.push({role:"user",content:e}),n.streaming=!0,n.streamContent="",I.value="",q("chat");let t=ze(n.selectedElement,n.screenshot);t.pageUrl=window.location.href,t.pageTitle=document.title,n.attachments.length>0&&(t.screenshot||(t.screenshot=n.attachments[0]),t.attachments=[...n.attachments]);let o=5,s=32e3,a=/\.(?:[cm]?[jt]sx?|svelte|vue|astro|html?|css|scss|less|php|py)$/i;try{let c=await S("fs.list",{});c?.payload?.projectTree&&(t.projectTree=c.payload.projectTree);let d=(c?.payload?.files||[]).filter(m=>m.type==="file"&&a.test(m.path)),l=[e];if(n.selectedElement&&(n.selectedElement.id&&l.push(n.selectedElement.id),n.selectedElement.className&&l.push(n.selectedElement.className),n.selectedElement.textContent&&l.push(n.selectedElement.textContent.slice(0,100)),n.selectedElement.componentHint&&l.push(n.selectedElement.componentHint),n.selectedElement.ancestry))for(let m of n.selectedElement.ancestry)l.push(m);let u=l.filter(Boolean).join(" ").toLowerCase().split(/[^a-z0-9_-]+/).filter(m=>m.length>=2&&!["the","to","in","of","and","div","span","class","style"].includes(m)),h=window.location.pathname.split("/").filter(m=>m.length>1&&!/^\d+$/.test(m)),b=d.map(m=>{let y=0,L=m.path.toLowerCase();for(let _ of h)L.includes(_.toLowerCase())&&(y+=15);if(n.selectedElement?.componentHint){let _=n.selectedElement.componentHint.toLowerCase();L.includes(_)&&(y+=12)}for(let _ of u)L.includes(_)&&(y+=5);return/(component|page|route|layout|template|view)/.test(L)&&(y+=3),/page\.[jt]sx?$|layout\.[jt]sx?$|\+page\.svelte$/.test(L)&&(y+=5),{...m,score:y}}).sort((m,y)=>y.score-m.score),k=[],P=new Set,v=0;for(let m of b.slice(0,o)){if(m.score<=0||v>=s)break;try{let y=n.roots[0]||"",L=y?`${y}/${m.path}`:m.path,_=await S("fs.read",{path:L}),A=String(_?.payload?.content||"");if(!A)continue;let F=Math.min(8e3,s-v),ne=A.slice(0,F);A.length>F&&(ne+=`
422
+ // [FILE TRUNCATED \u2014 showing ${F} of ${A.length} chars]`),k.push({path:m.path,content:ne}),P.add(m.path),v+=ne.length;let Ke=m.path.replace(/\.[^.]+$/,""),We=[".module.css",".module.scss",".css",".scss",".styles.ts"];for(let oe of We){let x=Ke+oe;if(P.has(x)||v>=s)continue;if(d.find(U=>U.path===x)){try{let U=await S("fs.read",{path:y?`${y}/${x}`:x}),M=String(U?.payload?.content||"");if(M){let J=Math.min(4e3,s-v),O=M.slice(0,J);M.length>J&&(O+=`
423
+ // [FILE TRUNCATED \u2014 showing ${J} of ${M.length} chars]`),k.push({path:x,content:O}),P.add(x),v+=O.length}}catch{}break}}let Ve=A.matchAll(/(?:import|from)\s+['"]\.?\.\/([\w/.-]+)['"]/g);for(let oe of Ve){if(v>=s)break;let x=oe[1],R=m.path.replace(/\/[^/]+$/,""),U=[`${R}/${x}`,`${R}/${x}.tsx`,`${R}/${x}.ts`,`${R}/${x}.jsx`,`${R}/${x}.js`,`${R}/${x}/index.tsx`,`${R}/${x}/index.ts`];for(let M of U){if(P.has(M))break;if(d.find(O=>O.path===M)){try{let O=await S("fs.read",{path:y?`${y}/${M}`:M}),Y=String(O?.payload?.content||"");if(Y){let se=Math.min(8e3,s-v),ae=Y.slice(0,se);Y.length>se&&(ae+=`
424
+ // [FILE TRUNCATED \u2014 showing ${se} of ${Y.length} chars]`),k.push({path:M,content:ae}),P.add(M),v+=ae.length}}catch{}break}}}}catch{}}if(v<s)try{let m=n.roots[0]||"",y=await S("fs.read",{path:m?`${m}/package.json`:"package.json"}),L=String(y?.payload?.content||"");if(L)try{let _=JSON.parse(L),A={..._.dependencies,..._.devDependencies},F=JSON.stringify(A,null,2);k.push({path:"package.json (dependencies)",content:F.slice(0,2e3)})}catch{k.push({path:"package.json",content:L.slice(0,2e3)})}}catch{}k.length&&(t.files=k)}catch{}let r=4,i=0;try{for(;i<=r;){n.streamContent="";let c=await $e("llm.chat",{provider:n.provider,model:n.model,messages:n.messages.map(l=>({role:l.role,content:l.content})),context:t},l=>{n.streamContent+=l;let u=N.querySelector(".om-msg-assistant:last-child");u&&(u.innerHTML=`<span class="om-spinner"></span>${D(n.streamContent)}`,B())}),p=n.streamContent||c?.content||"",d=p.match(/NEED_FILE:\s*"?([^\s"}\]]+)"?/)||p.match(/(?:need|provide|show|read|see|contents?\s+of)\s+(?:the\s+)?(?:file\s+)?[`"']?([a-zA-Z0-9_/.@-]+\.[a-z]{1,5})[`"']?/i)||p.match(/(?:source\s+(?:file|code)\s+(?:for|of|at))\s+[`"']?([a-zA-Z0-9_/.@-]+\.[a-z]{1,5})[`"']?/i);if(d&&!c?.modifications?.length&&i<r){let l=d[1].trim();i++,n.messages.push({role:"system",content:`Reading ${l}...`}),H();try{let u=n.roots[0]||"",f=u?`${u}/${l}`:l,h=await S("fs.read",{path:f}),b=String(h?.payload?.content||"");if(b)t.files||(t.files=[]),t.files.push({path:l,content:b.slice(0,8e3)}),n.messages.push({role:"assistant",content:p}),n.messages.push({role:"user",content:`Here is ${l}. Now please make the edit.`});else{n.messages.push({role:"system",content:`Could not read ${l}`});break}}catch{n.messages.push({role:"system",content:`File not found: ${l}`});break}continue}if(n.messages.push({role:"assistant",content:p}),c?.modifications?.length){for(let l of c.modifications)if(l.type==="edit"&&l.file&&l.search&&l.replace){let u=Math.random().toString(36).slice(2),f=JSON.stringify({id:u,file:l.file,search:l.search,replace:l.replace});n.messages.push({role:"system",content:`__DIFF__${fe(f)}`})}}break}}catch(c){n.messages.push({role:"system",content:`Error: ${c.message}`})}n.streaming=!1,n.streamContent="",n.attachments=[],we(),H(),B()}function bt(){let e=window.performance,t=e.getEntriesByType("navigation")[0],o=e.getEntriesByType("paint"),s=e.getEntriesByType("resource").slice(-20),a=me(),r=ue(),i=[];i.push("--- Network & Performance Capture ---"),t&&(i.push(`Page load: ${Math.round(t.loadEventEnd-t.startTime)}ms`),i.push(`DOM ready: ${Math.round(t.domContentLoadedEventEnd-t.startTime)}ms`),i.push(`TTFB: ${Math.round(t.responseStart-t.startTime)}ms`));let c=o.find(p=>p.name==="first-contentful-paint");if(c&&i.push(`FCP: ${Math.round(c.startTime)}ms`),a.length){i.push(`
425
+ Recent requests (${a.length}):`);for(let p of a.slice(-15))i.push(` ${p.method} ${p.url.slice(0,80)} \u2192 ${p.status||"pending"} (${p.duration||"?"}ms)`)}if(r.length){let p=r.filter(l=>l.level==="error"),d=r.filter(l=>l.level==="warn");p.length&&i.push(`
426
+ Console errors: ${p.length}`),d.length&&i.push(`Console warnings: ${d.length}`)}if(s.length){let p=[...s].sort((d,l)=>l.duration-d.duration).slice(0,5);i.push(`
427
+ Slowest resources:`);for(let d of p)i.push(` ${Math.round(d.duration)}ms \u2014 ${d.name.split("/").pop()?.slice(0,50)}`)}n.messages.push({role:"system",content:i.join(`
428
+ `)}),H(),B(),V()}function xt(){let e=C.querySelector(".om-file-input");e&&e.click()}function he(e){if(e)for(let t=0;t<e.length&&n.attachments.length<5;t++){let o=e[t];if(!o.type.startsWith("image/")||o.size>10*1024*1024)continue;let s=new FileReader;s.onload=()=>{typeof s.result=="string"&&(n.attachments.push(s.result),we())},s.readAsDataURL(o)}}function we(){let e=C.querySelector(".om-prompt-attachments");if(e){if(!n.attachments.length){e.innerHTML="",e.classList.add("om-hidden");return}e.classList.remove("om-hidden"),e.innerHTML=n.attachments.map((t,o)=>`<div class="om-attachment-thumb">
428
429
  <img src="${t}" alt="attachment" />
429
430
  <button class="om-attachment-remove" data-action="remove-attachment" data-idx="${o}">${g.x}</button>
430
- </div>`).join("")}}var B=null,F=null;function ht(){n.selecting?ge():J()}function J(){n.selecting=!0,document.body.style.cursor="crosshair",G(),F=t=>{let o=t.target;if(o.closest("openmagic-toolbar")||o.dataset?.openmagic)return;let s=o.getBoundingClientRect();Le({x:s.x,y:s.y,width:s.width,height:s.height})},B=t=>{t.preventDefault(),t.stopPropagation();let o=t.target;o.closest("openmagic-toolbar")||o.dataset?.openmagic||(n.selectedElement=Se(o),ge(),U(),N.focus())};let e=t=>{t.key==="Escape"&&ge()};document.addEventListener("mousemove",F,!0),document.addEventListener("click",B,!0),document.addEventListener("keydown",e,!0),J._escHandler=e}function ge(){n.selecting=!1,document.body.style.cursor="",Me(),F&&(document.removeEventListener("mousemove",F,!0),F=null),B&&(document.removeEventListener("click",B,!0),B=null);let e=J._escHandler;e&&(document.removeEventListener("keydown",e,!0),J._escHandler=null),G()}async function ft(){let e;try{let o=n.selectedElement?.cssSelector?.trim();o&&(e=document.querySelector(o)||void 0)}catch{}let t=await $e(e||void 0);t&&(n.screenshot=t,U(),N.focus())}function yt(){let e=!1,t=0,o=0,s=0,a=0;x.addEventListener("mousedown",r=>{let i=r.target;if(i.closest("[data-action]")||!i.closest(".om-grab")&&!i.closest(".om-pill-brand"))return;e=!0,t=r.clientX,o=r.clientY;let c=x.getBoundingClientRect();s=c.left,a=c.top,r.preventDefault()}),document.addEventListener("mousemove",r=>{e&&(x.style.left=s+r.clientX-t+"px",x.style.top=a+r.clientY-o+"px",x.style.right="auto",x.style.bottom="auto")}),document.addEventListener("mouseup",()=>{if(e){e=!1;try{localStorage.setItem("__om_pos__",JSON.stringify({left:x.style.left,top:x.style.top}))}catch{}}})}function _(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function bt(){fetch("https://registry.npmjs.org/openmagic/latest",{headers:{Accept:"application/json"},signal:AbortSignal.timeout(5e3)}).then(e=>e.ok?e.json():null).then(e=>{if(!e?.version)return;let t=e.version.split(".").map(Number),o=De.split(".").map(Number);for(let s=0;s<3;s++){if((t[s]||0)>(o[s]||0)){n.updateAvailable=!0,n.latestVersion=e.version,xt();return}if((t[s]||0)<(o[s]||0))return}}).catch(()=>{})}function xt(){if(M.querySelector(".om-update-dot"))return;let t=document.createElement("span");t.className="om-update-dot",t.title=`v${n.latestVersion} available`,t.addEventListener("click",()=>R("settings"));let o=M.querySelector(".om-toolbar-header");o&&o.appendChild(t)}typeof window<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Oe):Oe());})();
431
+ </div>`).join("")}}var K=null,W=null;function vt(){n.selecting?xe():te()}function te(){n.selecting=!0,document.body.style.cursor="crosshair",X(),W=t=>{let o=t.target;if(o.closest("openmagic-toolbar")||o.dataset?.openmagic)return;let s=o.getBoundingClientRect();He({x:s.x,y:s.y,width:s.width,height:s.height})},K=t=>{t.preventDefault(),t.stopPropagation();let o=t.target;o.closest("openmagic-toolbar")||o.dataset?.openmagic||(n.selectedElement=Ce(o),xe(),V(),I.focus())};let e=t=>{t.key==="Escape"&&xe()};document.addEventListener("mousemove",W,!0),document.addEventListener("click",K,!0),document.addEventListener("keydown",e,!0),te._escHandler=e}function xe(){n.selecting=!1,document.body.style.cursor="",Pe(),W&&(document.removeEventListener("mousemove",W,!0),W=null),K&&(document.removeEventListener("click",K,!0),K=null);let e=te._escHandler;e&&(document.removeEventListener("keydown",e,!0),te._escHandler=null),X()}async function wt(){let e;try{let o=n.selectedElement?.cssSelector?.trim();o&&(e=document.querySelector(o)||void 0)}catch{}let t=await _e(e||void 0);t&&(n.screenshot=t,V(),I.focus())}function kt(){let e=!1,t=0,o=0,s=0,a=0;w.addEventListener("mousedown",r=>{let i=r.target;if(i.closest("[data-action]")||!i.closest(".om-grab")&&!i.closest(".om-pill-brand"))return;e=!0,t=r.clientX,o=r.clientY;let c=w.getBoundingClientRect();s=c.left,a=c.top,r.preventDefault()}),document.addEventListener("mousemove",r=>{e&&(w.style.left=s+r.clientX-t+"px",w.style.top=a+r.clientY-o+"px",w.style.right="auto",w.style.bottom="auto")}),document.addEventListener("mouseup",()=>{if(e){e=!1;try{localStorage.setItem("__om_pos__",JSON.stringify({left:w.style.left,top:w.style.top}))}catch{}}})}function D(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function Et(){fetch("https://registry.npmjs.org/openmagic/latest",{headers:{Accept:"application/json"},signal:AbortSignal.timeout(5e3)}).then(e=>e.ok?e.json():null).then(e=>{if(!e?.version)return;let t=e.version.split(".").map(Number),o=Be.split(".").map(Number);for(let s=0;s<3;s++){if((t[s]||0)>(o[s]||0)){n.updateAvailable=!0,n.latestVersion=e.version,St();return}if((t[s]||0)<(o[s]||0))return}}).catch(()=>{})}function St(){if(C.querySelector(".om-update-dot"))return;let t=document.createElement("span");t.className="om-update-dot",t.title=`v${n.latestVersion} available`,t.addEventListener("click",()=>q("settings"));let o=C.querySelector(".om-toolbar-header");o&&o.appendChild(t)}typeof window<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",je):je());})();
431
432
  //# sourceMappingURL=index.global.js.map