openmagic 0.19.0 → 0.20.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 ue=`
2
+ "use strict";var OpenMagicToolbar=(()=>{var he=`
3
3
  :host {
4
4
  all: initial;
5
5
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
@@ -321,80 +321,80 @@
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 w=null,b=new Map,D=[],Y=[],R=!1,ge=!1,X=null,J=0;function Q(){return Math.random().toString(36).slice(2)+Date.now().toString(36)}function Z(e,t){return ge=!0,new Promise((o,s)=>{let r=!1,a=setTimeout(()=>{r||(r=!0,s(new Error("Handshake timeout")),w?.close())},1e4);try{let i=window.location.hostname||"127.0.0.1",l=window.location.protocol==="https:"?"wss:":"ws:";w=new WebSocket(`${l}//${i}:${e}/__openmagic__/ws`),w.onopen=()=>{let c=Q();w.send(JSON.stringify({id:c,type:"handshake",payload:{token:t}})),b.set(c,d=>{if(d.type==="handshake.ok"){clearTimeout(a),R=!0,J=0;for(let p of Y)w?.send(p);Y=[],r||(r=!0,o())}else d.type==="error"&&(clearTimeout(a),r||(r=!0,s(new Error(d.payload?.message||"Handshake failed"))))})},w.onmessage=c=>{try{let d=JSON.parse(c.data);d.id&&b.has(d.id)&&(b.get(d.id)(d),(d.type==="llm.done"||d.type==="llm.error"||!d.type.startsWith("llm."))&&b.delete(d.id));for(let p of D)p(d)}catch{}},w.onclose=()=>{let c=R;if(R=!1,b.forEach((d,p)=>{d({type:"error",id:p,payload:{message:"Connection lost"}})}),b.clear(),!c&&!r){clearTimeout(a),r=!0,s(new Error("WebSocket closed before handshake"));return}if(c&&ge&&!X){let d=Math.min(2e3*Math.pow(1.5,J),3e4);J++,X=setTimeout(()=>{X=null,Z(e,t).then(()=>{for(let p of D)p({type:"reconnected",payload:{}})}).catch(()=>{})},d)}},w.onerror=()=>{!R&&!r&&(clearTimeout(a),r=!0,s(new Error("WebSocket connection failed")))}}catch(i){clearTimeout(a),r||(r=!0,s(i))}})}function he(e){let t=JSON.stringify(e);w&&w.readyState===WebSocket.OPEN&&R?w.send(t):Y.push(t)}function L(e,t){return new Promise((o,s)=>{let r=Q(),a=setTimeout(()=>{b.delete(r),s(new Error("Request timeout"))},3e4);b.set(r,i=>{clearTimeout(a),i.type==="error"?s(new Error(i.payload?.message||"Unknown error")):o(i)}),he({id:r,type:e,payload:t})})}function fe(e,t,o){return new Promise((s,r)=>{let a=Q(),i=setTimeout(()=>{b.delete(a),r(new Error("Stream timeout"))},12e4);b.set(a,l=>{l.type==="llm.chunk"?o(l.payload?.delta||""):l.type==="llm.done"?(clearTimeout(i),b.delete(a),s(l.payload)):(l.type==="llm.error"||l.type==="error")&&(clearTimeout(i),b.delete(a),r(new Error(l.payload?.message||"Stream error")))}),he({id:a,type:e,payload:t})})}function ye(e){return D.push(e),()=>{D=D.filter(t=>t!==e)}}function be(){return R}var xe=["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 ve(e){let t=window.getComputedStyle(e),o={};for(let p of xe)o[p]=t.getPropertyValue(p);let s=e.getBoundingClientRect(),r={};if(e.parentElement&&e.parentElement!==document.body){let p=window.getComputedStyle(e.parentElement);for(let g of xe)r[g]=p.getPropertyValue(g)}let a=[];if(e.parentElement){let p=Array.from(e.parentElement.children);for(let g of p.slice(0,8))g===e?a.push(`[SELECTED] <${g.tagName.toLowerCase()} class="${(g.className||"").toString().slice(0,60)}">`):a.push(`<${g.tagName.toLowerCase()} class="${(g.className||"").toString().slice(0,60)}">`);p.length>8&&a.push(`... +${p.length-8} more`)}let i=Ke(e),l={};for(let p of Array.from(e.attributes))(p.name.startsWith("aria-")||p.name==="role"||p.name==="tabindex")&&(l[p.name]=p.value);let c=[];for(let p of Array.from(e.attributes))p.name.startsWith("on")&&c.push(p.name);let d=We(e);return{tagName:e.tagName.toLowerCase(),id:e.id||"",className:e.className||"",textContent:(e.textContent||"").trim().slice(0,200),outerHTML:Ue(e),cssSelector:Fe(e),xpath:Ge(e),computedStyles:o,ancestry:Ie(e),componentHint:ze(e),rect:{x:s.x,y:s.y,width:s.width,height:s.height},parentStyles:r,siblings:a,matchedCssRules:i,viewport:{width:window.innerWidth,height:window.innerHeight},ariaAttributes:l,eventHandlers:c,reactProps:d}}function Ie(e,t=5){let o=[],s=e.parentElement;for(;s&&s!==document.body&&o.length<t;){let r=s.tagName.toLowerCase(),a=(typeof s.className=="string"?s.className:"").split(/\s+/).filter(i=>i.length>1&&!i.startsWith("_")).slice(0,3).join(".");o.push(a?`${r}.${a}`:r),s=s.parentElement}return o}function ze(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 r of s)if(r.startsWith("__reactFiber")||r.startsWith("__reactInternalInstance"))try{let a=t[r],i=a?.type?.name||a?.type?.displayName||a?.return?.type?.name||a?.return?.type?.displayName;if(i&&i!=="div"&&i!=="span"&&i.length>1)return i}catch{}t=t.parentElement}return""}function Ue(e){let t=e.cloneNode(!0);t.querySelectorAll("script, style, svg").forEach(r=>r.remove());let s=t.outerHTML;if(s.length>2e3){let r=e.tagName.toLowerCase(),a=Array.from(e.attributes).map(l=>`${l.name}="${l.value}"`).join(" "),i=Array.from(e.children).slice(0,5).map(l=>`<${l.tagName.toLowerCase()} .../>`).join(`
325
- `);s=`<${r} ${a}>
324
+ `;var k=null,y=new Map,B=[],Z=[],A=!1,fe=!1,Y=null,Q=0;function ee(){return Math.random().toString(36).slice(2)+Date.now().toString(36)}function te(e,n){return fe=!0,new Promise((o,s)=>{let a=!1,r=setTimeout(()=>{a||(a=!0,s(new Error("Handshake timeout")),k?.close())},1e4);try{let i=window.location.hostname||"127.0.0.1",c=window.location.protocol==="https:"?"wss:":"ws:";k=new WebSocket(`${c}//${i}:${e}/__openmagic__/ws`),k.onopen=()=>{let p=ee();k.send(JSON.stringify({id:p,type:"handshake",payload:{token:n}})),y.set(p,d=>{if(d.type==="handshake.ok"){clearTimeout(r),A=!0,Q=0;for(let l of Z)k?.send(l);Z=[],a||(a=!0,o())}else d.type==="error"&&(clearTimeout(r),a||(a=!0,s(new Error(d.payload?.message||"Handshake failed"))))})},k.onmessage=p=>{try{let d=JSON.parse(p.data);d.id&&y.has(d.id)&&(y.get(d.id)(d),(d.type==="llm.done"||d.type==="llm.error"||!d.type.startsWith("llm."))&&y.delete(d.id));for(let l of B)l(d)}catch{}},k.onclose=()=>{let p=A;if(A=!1,y.forEach((d,l)=>{d({type:"error",id:l,payload:{message:"Connection lost"}})}),y.clear(),!p&&!a){clearTimeout(r),a=!0,s(new Error("WebSocket closed before handshake"));return}if(p&&fe&&!Y){let d=Math.min(2e3*Math.pow(1.5,Q),3e4);Q++,Y=setTimeout(()=>{Y=null,te(e,n).then(()=>{for(let l of B)l({type:"reconnected",payload:{}})}).catch(()=>{})},d)}},k.onerror=()=>{!A&&!a&&(clearTimeout(r),a=!0,s(new Error("WebSocket connection failed")))}}catch(i){clearTimeout(r),a||(a=!0,s(i))}})}function ye(e){let n=JSON.stringify(e);k&&k.readyState===WebSocket.OPEN&&A?k.send(n):Z.push(n)}function M(e,n){return new Promise((o,s)=>{let a=ee(),r=setTimeout(()=>{y.delete(a),s(new Error("Request timeout"))},3e4);y.set(a,i=>{clearTimeout(r),i.type==="error"?s(new Error(i.payload?.message||"Unknown error")):o(i)}),ye({id:a,type:e,payload:n})})}function be(e,n,o){return new Promise((s,a)=>{let r=ee(),i=setTimeout(()=>{y.delete(r),a(new Error("Stream timeout"))},12e4);y.set(r,c=>{c.type==="llm.chunk"?o(c.payload?.delta||""):c.type==="llm.done"?(clearTimeout(i),y.delete(r),s(c.payload)):(c.type==="llm.error"||c.type==="error")&&(clearTimeout(i),y.delete(r),a(new Error(c.payload?.message||"Stream error")))}),ye({id:r,type:e,payload:n})})}function xe(e){return B.push(e),()=>{B=B.filter(n=>n!==e)}}function ve(){return A}var we=["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 ke(e){let n=window.getComputedStyle(e),o={};for(let l of we)o[l]=n.getPropertyValue(l);let s=e.getBoundingClientRect(),a={};if(e.parentElement&&e.parentElement!==document.body){let l=window.getComputedStyle(e.parentElement);for(let u of we)a[u]=l.getPropertyValue(u)}let r=[];if(e.parentElement){let l=Array.from(e.parentElement.children);for(let u of l.slice(0,8))u===e?r.push(`[SELECTED] <${u.tagName.toLowerCase()} class="${(u.className||"").toString().slice(0,60)}">`):r.push(`<${u.tagName.toLowerCase()} class="${(u.className||"").toString().slice(0,60)}">`);l.length>8&&r.push(`... +${l.length-8} more`)}let i=Ve(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=Xe(e);return{tagName:e.tagName.toLowerCase(),id:e.id||"",className:e.className||"",textContent:(e.textContent||"").trim().slice(0,200),outerHTML:Ge(e),cssSelector:Ke(e),xpath:We(e),computedStyles:o,ancestry:Fe(e),componentHint:Ue(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 Fe(e,n=5){let o=[],s=e.parentElement;for(;s&&s!==document.body&&o.length<n;){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 Ue(e){let n=e;for(;n&&n!==document.body;){let o=n.getAttribute("data-component")||n.getAttribute("data-testid")||n.getAttribute("data-cy");if(o)return o;let s=Object.keys(n);for(let a of s)if(a.startsWith("__reactFiber")||a.startsWith("__reactInternalInstance"))try{let r=n[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{}n=n.parentElement}return""}function Ge(e){let n=e.cloneNode(!0);n.querySelectorAll("script, style, svg").forEach(a=>a.remove());let s=n.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
+ `);s=`<${a} ${r}>
326
326
  ${i}
327
327
  ${e.children.length>5?`<!-- +${e.children.length-5} more children -->`:""}
328
- </${r}>`}return s}function Fe(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 a=o.className.trim().split(/\s+/).filter(i=>!i.startsWith("__")&&i.length<30).slice(0,2).map(i=>CSS.escape(i));a.length>0&&(s+="."+a.join("."))}let r=o.parentElement;if(r){let a=Array.from(r.children).filter(i=>i.tagName===o.tagName);if(a.length>1){let i=a.indexOf(o)+1;s+=`:nth-of-type(${i})`}}t.unshift(s),o=o.parentElement}return t.join(" > ")}function Ge(e){let t=[],o=e;for(;o&&o!==document;){if(o.nodeType===Node.ELEMENT_NODE){let s=o,r=1,a=s.previousElementSibling;for(;a;)a.tagName===s.tagName&&r++,a=a.previousElementSibling;t.unshift(`${s.tagName.toLowerCase()}[${r}]`)}o=o.parentNode}return"/"+t.join("/")}function Ke(e){let t=[];try{for(let o of Array.from(document.styleSheets))try{let s=o.cssRules||o.rules;if(!s)continue;for(let r of Array.from(s))if(r instanceof CSSStyleRule)try{if(e.matches(r.selectorText)){let a=r.cssText;a.length>10&&a.length<500&&t.push(a)}}catch{}}catch{}}catch{}return t.slice(0,15)}function We(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 r=s.memoizedProps,a={},i=0;for(let[l,c]of Object.entries(r)){if(i>=10)break;if(l==="children")continue;let d=typeof c;d==="string"||d==="number"||d==="boolean"||c===null?(a[l]=c,i++):d==="function"?(a[l]="[function]",i++):Array.isArray(c)&&(a[l]=`[Array(${c.length})]`,i++)}return Object.keys(a).length>0?a:null}}catch{}return null}var x=null;function we(e){x||(x=document.createElement("div"),x.style.cssText=`
328
+ </${a}>`}return s}function Ke(e){if(e.id)return`#${CSS.escape(e.id)}`;let n=[],o=e;for(;o&&o!==document.body;){let s=o.tagName.toLowerCase();if(o.id){n.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})`}}n.unshift(s),o=o.parentElement}return n.join(" > ")}function We(e){let n=[],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;n.unshift(`${s.tagName.toLowerCase()}[${a}]`)}o=o.parentNode}return"/"+n.join("/")}function Ve(e){let n=[];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&&n.push(r)}}catch{}}catch{}}catch{}return n.slice(0,15)}function Xe(e){try{let n=Object.keys(e);for(let o of n)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 b=null;function Se(e){b||(b=document.createElement("div"),b.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
- `,x.dataset.openmagic="highlight",document.body.appendChild(x)),x.style.left=`${e.x}px`,x.style.top=`${e.y}px`,x.style.width=`${e.width}px`,x.style.height=`${e.height}px`,x.style.display="block"}function ke(){x&&(x.style.display="none")}async function Se(e){try{return e?await Xe(e):await Ve()}catch(t){return console.warn("[OpenMagic] Screenshot capture failed:",t),null}}async function Ve(){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 Ee(document.body),r=await Me(s,window.innerWidth,window.innerHeight);return o.drawImage(r,0,0),e.toDataURL("image/png")}catch{return null}}async function Xe(e){let t=e.getBoundingClientRect(),o=document.createElement("canvas"),s=window.devicePixelRatio||1;o.width=t.width*s,o.height=t.height*s;let r=o.getContext("2d");r.scale(s,s);try{let a=await Ee(e),i=await Me(a,t.width,t.height);return r.drawImage(i,0,0),o.toDataURL("image/png")}catch{return null}}function Ee(e){return new Promise(t=>{let o=e.cloneNode(!0);Le(e,o);let s=e.getBoundingClientRect(),r=s.width,a=s.height,i=`
336
- <svg xmlns="http://www.w3.org/2000/svg" width="${r}" height="${a}">
335
+ `,b.dataset.openmagic="highlight",document.body.appendChild(b)),b.style.left=`${e.x}px`,b.style.top=`${e.y}px`,b.style.width=`${e.width}px`,b.style.height=`${e.height}px`,b.style.display="block"}function Ee(){b&&(b.style.display="none")}async function Le(e){try{return e?await Ye(e):await Je()}catch(n){return console.warn("[OpenMagic] Screenshot capture failed:",n),null}}async function Je(){let e=document.createElement("canvas"),n=window.devicePixelRatio||1;e.width=window.innerWidth*n,e.height=window.innerHeight*n;let o=e.getContext("2d");o.scale(n,n);try{let s=await Me(document.body),a=await $e(s,window.innerWidth,window.innerHeight);return o.drawImage(a,0,0),e.toDataURL("image/png")}catch{return null}}async function Ye(e){let n=e.getBoundingClientRect(),o=document.createElement("canvas"),s=window.devicePixelRatio||1;o.width=n.width*s,o.height=n.height*s;let a=o.getContext("2d");a.scale(s,s);try{let r=await Me(e),i=await $e(r,n.width,n.height);return a.drawImage(i,0,0),o.toDataURL("image/png")}catch{return null}}function Me(e){return new Promise(n=>{let o=e.cloneNode(!0);Te(e,o);let s=e.getBoundingClientRect(),a=s.width,r=s.height,i=`
336
+ <svg xmlns="http://www.w3.org/2000/svg" width="${a}" height="${r}">
337
337
  <foreignObject width="100%" height="100%">
338
- <div xmlns="http://www.w3.org/1999/xhtml" style="width:${r}px;height:${a}px;overflow:hidden;">
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 Le(e,t){let o=window.getComputedStyle(e),s="";for(let i=0;i<o.length;i++){let l=o[i];s+=`${l}:${o.getPropertyValue(l)};`}t.style.cssText=s;let r=e.children,a=t.children;for(let i=0;i<r.length&&i<a.length;i++)Le(r[i],a[i])}function Me(e,t,o){return new Promise((s,r)=>{let a=new Image,i=new Blob([e],{type:"image/svg+xml;charset=utf-8"}),l=URL.createObjectURL(i);a.onload=()=>{URL.revokeObjectURL(l),s(a)},a.onerror=()=>{URL.revokeObjectURL(l),r(new Error("Failed to load SVG image"))},a.width=t,a.height=o,a.src=l})}var F=[];var Te=!1;function Ce(){if(Te)return;Te=!0;let e=window.fetch;window.fetch=async function(...s){let r=new Request(...s),a={method:r.method,url:r.url,timestamp:Date.now()};try{let i=await e.apply(this,s);return a.status=i.status,a.duration=Date.now()-a.timestamp,ee(a),i}catch(i){throw a.status=0,a.duration=Date.now()-a.timestamp,ee(a),i}};let t=XMLHttpRequest.prototype.open,o=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(s,r,...a){return this.__om_method=s,this.__om_url=r,this.__om_start=Date.now(),t.apply(this,[s,r,...a])},XMLHttpRequest.prototype.send=function(...s){return this.addEventListener("loadend",()=>{ee({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 ee(e){e.url.includes("__openmagic__")||(F.push(e),F.length>50&&F.shift())}function te(){return[...F]}var G=[],Je=100,$e=!1;function He(){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){G.push({level:t,args:s.map(r=>{try{return typeof r=="object"?JSON.stringify(r).slice(0,500):String(r)}catch{return String(r)}}),timestamp:Date.now()}),G.length>Je&&G.shift(),o.apply(console,s)}}}function ne(){return[...G]}function Pe(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:te().map(o=>({method:o.method,url:o.url,status:o.status,duration:o.duration,timestamp:o.timestamp})),consoleLogs:ne().map(o=>({level:o.level,args:o.args,timestamp:o.timestamp}))}}var u={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>'},A={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 ae(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 re(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 Ne="0.19.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:[]},k,y,H,Re,ce,M;function Ye(){try{sessionStorage.setItem("__om_state__",JSON.stringify({messages:n.messages,provider:n.provider,model:n.model,panelOpen:n.panelOpen,activePanel:n.activePanel}))}catch{}}function Qe(){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 _e(){if(document.querySelector("openmagic-toolbar"))return;Qe();let e=document.createElement("openmagic-toolbar");e.dataset.openmagic="true",k=e.attachShadow({mode:"closed"});let t=document.createElement("style");t.textContent=ue,k.appendChild(t);let o=document.createElement("div");k.appendChild(o),o.innerHTML=Ze(),y=o.querySelector(".om-toolbar"),H=o.querySelector(".om-prompt-input"),Re=o.querySelector(".om-prompt-context"),ce=o.querySelector(".om-panel"),M=o.querySelector(".om-panel-body"),document.body.appendChild(e),et(o),mt();try{let i=JSON.parse(localStorage.getItem("__om_pos__")||"");i?.left&&i?.top&&(y.style.left=i.left,y.style.top=i.top,y.style.right="auto",y.style.bottom="auto")}catch{}Ce(),He(),ut();let r=document.querySelector("script[data-openmagic-token]")?.dataset.openmagicToken||window.__OPENMAGIC_TOKEN__,a=parseInt(window.location.port,10)||(window.location.protocol==="https:"?443:80);r&&Z(a,r).then(()=>(n.connected=!0,ie(),L("config.get"))).then(i=>{let l=i.payload?.provider||"",c=i.payload?.model||"";n.provider=n.provider||l,n.model=n.model||c,n.configuredProviders=i.payload?.apiKeys||{},n.hasApiKey=n.configuredProviders[n.provider]||!1,n.roots=i.payload?.roots||[],n.panelOpen&&n.activePanel?P(n.activePanel):(!n.provider||!n.hasApiKey&&!Object.values(n.configuredProviders).some(Boolean))&&P("settings"),I()}).catch(()=>{n.connected=!1,ie()})}function Ze(){return`
342
+ </svg>`;n(i)})}function Te(e,n){let o=window.getComputedStyle(e),s="";for(let i=0;i<o.length;i++){let c=o[i];s+=`${c}:${o.getPropertyValue(c)};`}n.style.cssText=s;let a=e.children,r=n.children;for(let i=0;i<a.length&&i<r.length;i++)Te(a[i],r[i])}function $e(e,n,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=n,r.height=o,r.src=c})}var K=[];var Ce=!1;function Pe(){if(Ce)return;Ce=!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,ne(r),i}catch(i){throw r.status=0,r.duration=Date.now()-r.timestamp,ne(r),i}};let n=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(),n.apply(this,[s,a,...r])},XMLHttpRequest.prototype.send=function(...s){return this.addEventListener("loadend",()=>{ne({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 ne(e){e.url.includes("__openmagic__")||(K.push(e),K.length>50&&K.shift())}function oe(){return[...K]}var W=[],Qe=100,He=!1;function _e(){if(He)return;He=!0;let e=["log","warn","error","info","debug"];for(let n of e){let o=console[n];console[n]=function(...s){W.push({level:n,args:s.map(a=>{try{return typeof a=="object"?JSON.stringify(a).slice(0,500):String(a)}catch{return String(a)}}),timestamp:Date.now()}),W.length>Qe&&W.shift(),o.apply(console,s)}}}function se(){return[...W]}function Ne(e,n){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:n||void 0,networkLogs:oe().map(o=>({method:o.method,url:o.url,status:o.status,duration:o.duration,timestamp:o.timestamp})),consoleLogs:se().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>'},O={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 ie(e){let n=new TextEncoder().encode(e),o="";for(let s=0;s<n.length;s+=32768)o+=String.fromCharCode(...n.subarray(s,s+32768));return btoa(o)}function le(e){let n=atob(e),o=new Uint8Array(n.length);for(let s=0;s<n.length;s++)o[s]=n.charCodeAt(s);return new TextDecoder().decode(o)}var Ae="0.20.0",t={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:[]},S,f,_,Oe,pe,T;function Ze(){try{sessionStorage.setItem("__om_state__",JSON.stringify({messages:t.messages,provider:t.provider,model:t.model,panelOpen:t.panelOpen,activePanel:t.activePanel}))}catch{}}function et(){try{let e=JSON.parse(sessionStorage.getItem("__om_state__")||"{}");e.messages?.length&&(t.messages=e.messages),e.provider&&(t.provider=e.provider),e.model&&(t.model=e.model),e.panelOpen&&(t.panelOpen=e.panelOpen,t.activePanel=e.activePanel||"")}catch{}}function Re(){if(document.querySelector("openmagic-toolbar"))return;et();let e=document.createElement("openmagic-toolbar");e.dataset.openmagic="true",S=e.attachShadow({mode:"closed"});let n=document.createElement("style");n.textContent=he,S.appendChild(n);let o=document.createElement("div");S.appendChild(o),o.innerHTML=tt(),f=o.querySelector(".om-toolbar"),_=o.querySelector(".om-prompt-input"),Oe=o.querySelector(".om-prompt-context"),pe=o.querySelector(".om-panel"),T=o.querySelector(".om-panel-body"),document.body.appendChild(e),nt(o),gt();try{let i=JSON.parse(localStorage.getItem("__om_pos__")||"");i?.left&&i?.top&&(f.style.left=i.left,f.style.top=i.top,f.style.right="auto",f.style.bottom="auto")}catch{}Pe(),_e(),ht();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&&te(r,a).then(()=>(t.connected=!0,ce(),M("config.get"))).then(i=>{let c=i.payload?.provider||"",p=i.payload?.model||"";t.provider=t.provider||c,t.model=t.model||p,t.configuredProviders=i.payload?.apiKeys||{},t.hasApiKey=t.configuredProviders[t.provider]||!1,t.roots=i.payload?.roots||[],t.panelOpen&&t.activePanel?N(t.activePanel):(!t.provider||!t.hasApiKey&&!Object.values(t.configuredProviders).some(Boolean))&&N("settings"),F()}).catch(()=>{t.connected=!1,ce()})}function tt(){return`
343
343
  <div class="om-toolbar">
344
344
  <div class="om-toolbar-header">
345
- <span class="om-grab">${u.grip}</span>
345
+ <span class="om-grab">${g.grip}</span>
346
346
  <span class="om-pill-brand">
347
- <span class="om-pill-icon">${u.sparkle}</span>
347
+ <span class="om-pill-icon">${g.sparkle}</span>
348
348
  <span class="om-pill-text">OpenMagic</span>
349
349
  </span>
350
350
  <span class="om-pill-divider"></span>
351
- <button class="om-pill-btn" data-action="select" title="Select element">${u.crosshair}</button>
352
- <button class="om-pill-btn" data-action="screenshot" title="Screenshot">${u.camera}</button>
353
- <button class="om-pill-btn" data-action="network" title="Network & Performance">${u.activity}</button>
351
+ <button class="om-pill-btn" data-action="select" title="Select element">${g.crosshair}</button>
352
+ <button class="om-pill-btn" data-action="screenshot" title="Screenshot">${g.camera}</button>
353
+ <button class="om-pill-btn" data-action="network" title="Network & Performance">${g.activity}</button>
354
354
  <span class="om-pill-divider"></span>
355
- <button class="om-pill-btn" data-action="chat" title="Chat">${u.chat}</button>
356
- <button class="om-pill-btn" data-action="settings" title="Settings">${u.settings}</button>
355
+ <button class="om-pill-btn" data-action="chat" title="Chat">${g.chat}</button>
356
+ <button class="om-pill-btn" data-action="settings" title="Settings">${g.settings}</button>
357
357
  <span class="om-status-dot disconnected"></span>
358
358
  </div>
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${Ne}</span>
363
- <button class="om-panel-close" data-action="close-panel">${u.x}</button>
362
+ <span class="om-panel-version">v${Ae}</span>
363
+ <button class="om-panel-close" data-action="close-panel">${g.x}</button>
364
364
  </div>
365
365
  <div class="om-panel-body"></div>
366
366
  </div>
367
367
  <div class="om-prompt-attachments"></div>
368
368
  <div class="om-prompt-row">
369
369
  <div class="om-prompt-context"></div>
370
- <button class="om-prompt-attach" data-action="attach-image" title="Attach image">${u.paperclip}</button>
370
+ <button class="om-prompt-attach" data-action="attach-image" title="Attach image">${g.paperclip}</button>
371
371
  <input class="om-prompt-input" type="text" placeholder="Describe what to change..." autocomplete="off" />
372
- <button class="om-prompt-send" data-action="prompt-send">${u.send}</button>
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 et(e){e.addEventListener("click",s=>{let r=s.target.closest("[data-action]");if(!r)return;s.preventDefault(),s.stopPropagation();let a=r.dataset.action;st(a,r)}),e.addEventListener("change",s=>{let r=s.target,a=r.dataset.field;a&&(a==="provider"?(n.provider=r.value,n.model=A[n.provider]?.models[0]?.id||"",n.hasApiKey=n.configuredProviders[n.provider]||A[n.provider]?.local||!1,n.saveStatus="",E()):a==="model"&&(n.model=r.value))}),H.addEventListener("keydown",s=>{s.key==="Enter"&&!s.shiftKey&&(s.preventDefault(),Oe())});let t=e.querySelector(".om-file-input");t&&t.addEventListener("change",()=>{se(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 r=s.dataTransfer;r?.files?.length&&se(r.files)}),H.addEventListener("paste",s=>{let r=s.clipboardData?.items;if(r){for(let a=0;a<r.length;a++)if(r[a].type.startsWith("image/")){let i=r[a].getAsFile();if(i){let l=new DataTransfer;l.items.add(i),se(l.files)}}}})),ye(s=>{s.type==="reconnected"&&(n.connected=!0,ie())})}function tt(e){return n.roots.length>0?n.roots[0]+"/"+e:e}async function nt(e){let t=e.dataset.file,o=e.dataset.search,s=e.dataset.replace;if(!t||!o||!s)return;let r,a;try{r=re(o),a=re(s)}catch{n.messages.push({role:"system",content:`Failed to decode diff data for ${t}`}),E();return}let i=e.closest(".om-diff-card"),l=tt(t);if(i){let c=i.querySelector(".om-diff-actions");c&&(c.innerHTML='<span class="om-spinner"></span> Applying...')}try{let d=(await L("fs.read",{path:l}))?.payload?.content;if(!d)n.messages.push({role:"system",content:`Could not read ${t} \u2014 file may not exist at ${l}`});else{let p=d.split(r).length-1;if(p===0)n.messages.push({role:"system",content:`No matching code found in ${t}. The file may have changed since the suggestion was made.`});else if(p>1)n.messages.push({role:"system",content:`Found ${p} matches in ${t} \u2014 expected exactly 1. Edit not applied for safety.`});else{let g=await L("fs.write",{path:l,content:d.replace(r,a)});if(g?.payload?.ok===!1)n.messages.push({role:"system",content:`Write failed: ${t} - ${g.payload?.error||"unknown"}`});else{let T=i?.dataset.diffIdx;T!==void 0?n.messages[parseInt(T)]={role:"system",content:`Applied change to ${t}`}:n.messages.push({role:"system",content:`Applied change to ${t}`})}}}}catch(c){n.messages.push({role:"system",content:`Failed to apply: ${t} \u2014 ${c.message}`})}E(),O()}function ot(e){let t=e.dataset.idx;if(t!==void 0){let o=parseInt(t),r=n.messages[o]?.content.split("__")?.[3]||"file";n.messages[o]={role:"system",content:`Rejected change to ${r}`}}E(),O()}function st(e,t){switch(e){case"select":dt();break;case"screenshot":pt();break;case"chat":oe("chat");break;case"settings":oe("settings");break;case"close-panel":Ae();break;case"prompt-send":Oe();break;case"save-settings":it();break;case"get-key":{let o=t.dataset.url;o&&window.open(o,"_blank","noopener");break}case"change-key":{let o=k.querySelector("[data-key-change]");o&&o.classList.remove("om-hidden"),t.style.display="none";break}case"network":oe("chat"),lt();break;case"attach-image":ct();break;case"remove-attachment":{let o=parseInt(t.dataset.idx||"0",10);n.attachments.splice(o,1),de();break}case"apply-diff":nt(t);break;case"reject-diff":ot(t);break;case"clear-element":n.selectedElement=null,j();break;case"clear-screenshot":n.screenshot=null,j();break}}function ie(){let e=k.querySelector(".om-status-dot");e&&(e.className=`om-status-dot ${n.connected?"connected":"disconnected"}`)}function I(){k.querySelectorAll(".om-pill-btn").forEach(e=>{let t=e.dataset.action;e.classList.toggle("active",t===n.activePanel||t==="select"&&n.selecting)})}function j(){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">${u.x}</button></span>`),n.screenshot&&e.push(`<span class="om-prompt-chip">Screenshot <button class="om-prompt-chip-x" data-action="clear-screenshot">${u.x}</button></span>`),n.attachments.length&&e.push(`<span class="om-prompt-chip">${n.attachments.length} image${n.attachments.length>1?"s":""}</span>`),Re.innerHTML=e.join("")}function P(e){n.panelOpen=!0,n.activePanel=e,ce.classList.remove("om-hidden");let t=k.querySelector(".om-panel-title");t&&(t.textContent=e==="settings"?"Settings":"Chat"),E(),I()}function Ae(){n.panelOpen=!1,n.activePanel="",ce.classList.add("om-hidden"),I()}function oe(e){n.panelOpen&&n.activePanel===e?Ae():P(e)}function E(){n.activePanel==="settings"?M.innerHTML=at():n.activePanel==="chat"&&(M.innerHTML=rt(),O()),Ye()}function at(){let e=Object.entries(A).map(([f,_])=>{let m=n.configuredProviders[f]||_.local?" \u2713":"";return`<option value="${f}" ${n.provider===f?"selected":""}>${_.name}${m}</option>`}).join(""),t=A[n.provider],o=t?t.models.map(f=>`<option value="${f.id}" ${n.model===f.id?"selected":""}>${f.name}</option>`).join(""):'<option value="">Select provider first</option>',s=t?.local||!1,r=t?.keyUrl||"",a=t?.keyPlaceholder||"Enter API key...",i=n.configuredProviders[n.provider]||!1,l=n.updateAvailable?`<div class="om-update-banner">v${n.latestVersion} available <code class="om-update-cmd">npx openmagic@latest</code></div>`:"",c=i||s?`<div class="om-status om-status-success">${u.check} ${t?.name||"Provider"} connected</div>`:"",d=n.saveStatus==="saving"?'<span class="om-spinner"></span> Saving...':n.saveStatus==="saved"?`${u.check} Saved`:"Save",p=n.saveStatus==="saving"?"om-btn om-btn-saving":n.saveStatus==="saved"?"om-btn om-btn-saved":"om-btn",g=n.saveStatus==="saving"?"disabled":"",T="";return!s&&n.provider&&(i?T=`
375
+ </div>`}function nt(e){e.addEventListener("click",s=>{let a=s.target.closest("[data-action]");if(!a)return;s.preventDefault(),s.stopPropagation();let r=a.dataset.action;rt(r,a)}),e.addEventListener("change",s=>{let a=s.target,r=a.dataset.field;r&&(r==="provider"?(t.provider=a.value,t.model=O[t.provider]?.models[0]?.id||"",t.hasApiKey=t.configuredProviders[t.provider]||O[t.provider]?.local||!1,t.saveStatus="",E()):r==="model"&&(t.model=a.value))}),_.addEventListener("keydown",s=>{s.key==="Enter"&&!s.shiftKey&&(s.preventDefault(),qe())});let n=e.querySelector(".om-file-input");n&&n.addEventListener("change",()=>{re(n.files),n.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&&re(a.files)}),_.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),re(c.files)}}}})),xe(s=>{s.type==="reconnected"&&(t.connected=!0,ce())})}function ot(e){return t.roots.length>0?t.roots[0]+"/"+e:e}async function st(e){let n=e.dataset.file,o=e.dataset.search,s=e.dataset.replace;if(!n||!o||!s)return;let a,r;try{a=le(o),r=le(s)}catch{t.messages.push({role:"system",content:`Failed to decode diff data for ${n}`}),E();return}let i=e.closest(".om-diff-card"),c=ot(n);if(i){let p=i.querySelector(".om-diff-actions");p&&(p.innerHTML='<span class="om-spinner"></span> Applying...')}try{let d=(await M("fs.read",{path:c}))?.payload?.content;if(!d)t.messages.push({role:"system",content:`Could not read ${n} \u2014 file may not exist at ${c}`});else{let l=d.split(a).length-1;if(l===0)t.messages.push({role:"system",content:`No matching code found in ${n}. The file may have changed since the suggestion was made.`});else if(l>1)t.messages.push({role:"system",content:`Found ${l} matches in ${n} \u2014 expected exactly 1. Edit not applied for safety.`});else{let u=await M("fs.write",{path:c,content:d.replace(a,r)});if(u?.payload?.ok===!1)t.messages.push({role:"system",content:`Write failed: ${n} - ${u.payload?.error||"unknown"}`});else{let x=i?.dataset.diffIdx;x!==void 0?t.messages[parseInt(x)]={role:"system",content:`Applied change to ${n}`}:t.messages.push({role:"system",content:`Applied change to ${n}`})}}}}catch(p){t.messages.push({role:"system",content:`Failed to apply: ${n} \u2014 ${p.message}`})}E(),D()}function at(e){let n=e.dataset.idx;if(n!==void 0){let o=parseInt(n),a=t.messages[o]?.content.split("__")?.[3]||"file";t.messages[o]={role:"system",content:`Rejected change to ${a}`}}E(),D()}function rt(e,n){switch(e){case"select":mt();break;case"screenshot":ut();break;case"chat":ae("chat");break;case"settings":ae("settings");break;case"close-panel":De();break;case"prompt-send":qe();break;case"save-settings":ct();break;case"get-key":{let o=n.dataset.url;o&&window.open(o,"_blank","noopener");break}case"change-key":{let o=S.querySelector("[data-key-change]");o&&o.classList.remove("om-hidden"),n.style.display="none";break}case"network":ae("chat"),dt();break;case"attach-image":pt();break;case"remove-attachment":{let o=parseInt(n.dataset.idx||"0",10);t.attachments.splice(o,1),me();break}case"apply-diff":st(n);break;case"reject-diff":at(n);break;case"clear-element":t.selectedElement=null,z();break;case"clear-screenshot":t.screenshot=null,z();break}}function ce(){let e=S.querySelector(".om-status-dot");e&&(e.className=`om-status-dot ${t.connected?"connected":"disconnected"}`)}function F(){S.querySelectorAll(".om-pill-btn").forEach(e=>{let n=e.dataset.action;e.classList.toggle("active",n===t.activePanel||n==="select"&&t.selecting)})}function z(){let e=[];t.selectedElement&&e.push(`<span class="om-prompt-chip">${t.selectedElement.tagName}${t.selectedElement.id?"#"+t.selectedElement.id:""} <button class="om-prompt-chip-x" data-action="clear-element">${g.x}</button></span>`),t.screenshot&&e.push(`<span class="om-prompt-chip">Screenshot <button class="om-prompt-chip-x" data-action="clear-screenshot">${g.x}</button></span>`),t.attachments.length&&e.push(`<span class="om-prompt-chip">${t.attachments.length} image${t.attachments.length>1?"s":""}</span>`),Oe.innerHTML=e.join("")}function N(e){t.panelOpen=!0,t.activePanel=e,pe.classList.remove("om-hidden");let n=S.querySelector(".om-panel-title");n&&(n.textContent=e==="settings"?"Settings":"Chat"),E(),F()}function De(){t.panelOpen=!1,t.activePanel="",pe.classList.add("om-hidden"),F()}function ae(e){t.panelOpen&&t.activePanel===e?De():N(e)}function E(){t.activePanel==="settings"?T.innerHTML=it():t.activePanel==="chat"&&(T.innerHTML=lt(),D()),Ze()}function it(){let e=Object.entries(O).map(([v,$])=>{let q=t.configuredProviders[v]||$.local?" \u2713":"";return`<option value="${v}" ${t.provider===v?"selected":""}>${$.name}${q}</option>`}).join(""),n=O[t.provider],o=n?n.models.map(v=>`<option value="${v.id}" ${t.model===v.id?"selected":""}>${v.name}</option>`).join(""):'<option value="">Select provider first</option>',s=n?.local||!1,a=n?.keyUrl||"",r=n?.keyPlaceholder||"Enter API key...",i=t.configuredProviders[t.provider]||!1,c=t.updateAvailable?`<div class="om-update-banner">v${t.latestVersion} available <code class="om-update-cmd">npx openmagic@latest</code></div>`:"",p=i||s?`<div class="om-status om-status-success">${g.check} ${n?.name||"Provider"} connected</div>`:"",d=t.saveStatus==="saving"?'<span class="om-spinner"></span> Saving...':t.saveStatus==="saved"?`${g.check} Saved`:"Save",l=t.saveStatus==="saving"?"om-btn om-btn-saving":t.saveStatus==="saved"?"om-btn om-btn-saved":"om-btn",u=t.saveStatus==="saving"?"disabled":"",x="";return!s&&t.provider&&(i?x=`
376
376
  <div class="om-field">
377
377
  <label class="om-label">API Key</label>
378
378
  <div class="om-key-configured">
379
- ${u.check} <span>Key configured</span>
379
+ ${g.check} <span>Key configured</span>
380
380
  <button class="om-btn-change-key" data-action="change-key">Change</button>
381
381
  </div>
382
382
  <div class="om-key-change-row om-hidden" data-key-change>
383
383
  <div class="om-key-row">
384
- <input type="text" class="om-input om-key-input" data-field="apiKey" placeholder="${a}" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true" data-form-type="other" />
385
- ${r?`<button class="om-btn-get-key" data-action="get-key" data-url="${r}">${u.externalLink} Get key</button>`:""}
384
+ <input type="text" class="om-input om-key-input" data-field="apiKey" placeholder="${r}" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true" data-form-type="other" />
385
+ ${a?`<button class="om-btn-get-key" data-action="get-key" data-url="${a}">${g.externalLink} Get key</button>`:""}
386
386
  </div>
387
387
  </div>
388
- </div>`:T=`
388
+ </div>`:x=`
389
389
  <div class="om-field">
390
390
  <label class="om-label">API Key</label>
391
391
  <div class="om-key-row">
392
- <input type="text" class="om-input om-key-input" data-field="apiKey" placeholder="${a}" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true" data-form-type="other" />
393
- ${r?`<button class="om-btn-get-key" data-action="get-key" data-url="${r}">${u.externalLink} Get key</button>`:""}
392
+ <input type="text" class="om-input om-key-input" data-field="apiKey" placeholder="${r}" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true" data-form-type="other" />
393
+ ${a?`<button class="om-btn-get-key" data-action="get-key" data-url="${a}">${g.externalLink} Get key</button>`:""}
394
394
  </div>
395
- ${r?`<div class="om-key-hint"><a data-action="get-key" data-url="${r}">Get your ${t?.name||""} API key here</a></div>`:""}
395
+ ${a?`<div class="om-key-hint"><a data-action="get-key" data-url="${a}">Get your ${n?.name||""} API key here</a></div>`:""}
396
396
  </div>`),`
397
- ${l}
397
+ ${c}
398
398
  <div class="om-settings">
399
399
  <div class="om-field">
400
400
  <label class="om-label">Provider</label>
@@ -404,23 +404,23 @@
404
404
  <label class="om-label">Model</label>
405
405
  <select class="om-select" data-field="model"><option value="">Select Model...</option>${o}</select>
406
406
  </div>
407
- ${T}
408
- <button class="${p}" data-action="save-settings" ${g}>${d}</button>
409
- ${c}
410
- </div>`}function rt(){if(!n.provider||!n.hasApiKey&&!A[n.provider]?.local)return'<div class="om-status om-status-error">Configure your provider in Settings first</div>';let e=n.messages.map((s,r)=>{if(s.content.startsWith("__DIFF__"))try{let a=JSON.parse(re(s.content.slice(8))),i=ae(a.search),l=ae(a.replace);return`<div class="om-diff-card" data-diff-idx="${r}">
411
- <div class="om-diff-file">${C(a.file)}</div>
412
- <div class="om-diff-removed">${C(a.search.slice(0,200))}</div>
413
- <div class="om-diff-added">${C(a.replace.slice(0,200))}</div>
407
+ ${x}
408
+ <button class="${l}" data-action="save-settings" ${u}>${d}</button>
409
+ ${p}
410
+ </div>`}function lt(){if(!t.provider||!t.hasApiKey&&!O[t.provider]?.local)return'<div class="om-status om-status-error">Configure your provider in Settings first</div>';let e=t.messages.map((s,a)=>{if(s.content.startsWith("__DIFF__"))try{let r=JSON.parse(le(s.content.slice(8))),i=ie(r.search),c=ie(r.replace);return`<div class="om-diff-card" data-diff-idx="${a}">
411
+ <div class="om-diff-file">${P(r.file)}</div>
412
+ <div class="om-diff-removed">${P(r.search.slice(0,200))}</div>
413
+ <div class="om-diff-added">${P(r.replace.slice(0,200))}</div>
414
414
  <div class="om-diff-actions">
415
- <button class="om-btn om-btn-sm" data-action="apply-diff" data-file="${C(a.file)}" data-search="${i}" data-replace="${l}">Apply</button>
416
- <button class="om-btn-secondary om-btn-sm" data-action="reject-diff" data-idx="${r}">Reject</button>
415
+ <button class="om-btn om-btn-sm" data-action="apply-diff" data-file="${P(r.file)}" data-search="${i}" data-replace="${c}">Apply</button>
416
+ <button class="om-btn-secondary om-btn-sm" data-action="reject-diff" data-idx="${a}">Reject</button>
417
417
  </div>
418
- </div>`}catch{return'<div class="om-msg om-msg-system">Malformed diff data</div>'}return`<div class="om-msg om-msg-${s.role}">${C(s.content)}</div>`}).join(""),t=n.streaming?`<div class="om-msg om-msg-assistant"><span class="om-spinner"></span>${C(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 O(){requestAnimationFrame(()=>{let e=M.querySelector(".om-chat-messages");e&&(e.scrollTop=e.scrollHeight)})}async function it(){let t=M.querySelector('[data-field="apiKey"]')?.value||"";if(!n.provider){n.saveStatus="error",K(),setTimeout(()=>{n.saveStatus="",E()},2e3);return}if(!be()){n.saveStatus="error",K();let s=M.querySelector('[data-action="save-settings"]');s&&(s.innerHTML="Not connected - check terminal"),setTimeout(()=>{n.saveStatus="",E()},3e3);return}let o={provider:n.provider,model:n.model};t&&(o.apiKey=t),n.saveStatus="saving",K();try{let s=await Promise.race([L("config.set",o),new Promise((r,a)=>setTimeout(()=>a(new Error("Save timed out")),8e3))]);t&&n.provider&&(n.configuredProviders[n.provider]=!0),n.hasApiKey=!!(t||n.configuredProviders[n.provider]),n.saveStatus="saved",K(),setTimeout(()=>{n.saveStatus="",n.activePanel==="settings"&&P("chat")},1200)}catch(s){n.saveStatus="error";let r=M.querySelector('[data-action="save-settings"]'),a=(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"}`;r&&(r.innerHTML=a,r.className="om-btn",r.disabled=!1),setTimeout(()=>{n.saveStatus="",E()},4e3)}}function K(){let e=M.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=`${u.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 Oe(){let e=H.value.trim();if(!e||n.streaming)return;if(!n.provider||!n.hasApiKey&&!A[n.provider]?.local){P("settings");return}n.messages.push({role:"user",content:e}),n.streaming=!0,n.streamContent="",H.value="",P("chat");let t=Pe(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,r=/\.(?:[cm]?[jt]sx?|svelte|vue|astro|html?|css|scss|less|php|py)$/i;try{let a=await L("fs.list",{});a?.payload?.projectTree&&(t.projectTree=a.payload.projectTree);let l=(a?.payload?.files||[]).filter(m=>m.type==="file"&&r.test(m.path)),c=[e];if(n.selectedElement&&(n.selectedElement.id&&c.push(n.selectedElement.id),n.selectedElement.className&&c.push(n.selectedElement.className),n.selectedElement.textContent&&c.push(n.selectedElement.textContent.slice(0,100)),n.selectedElement.componentHint&&c.push(n.selectedElement.componentHint),n.selectedElement.ancestry))for(let m of n.selectedElement.ancestry)c.push(m);let d=c.filter(Boolean).join(" ").toLowerCase().split(/[^a-z0-9_-]+/).filter(m=>m.length>=2&&!["the","to","in","of","and","div","span","class","style"].includes(m)),g=window.location.pathname.split("/").filter(m=>m.length>1&&!/^\d+$/.test(m)),T=l.map(m=>{let h=0,v=m.path.toLowerCase();for(let S of g)v.includes(S.toLowerCase())&&(h+=15);if(n.selectedElement?.componentHint){let S=n.selectedElement.componentHint.toLowerCase();v.includes(S)&&(h+=12)}for(let S of d)v.includes(S)&&(h+=5);return/(component|page|route|layout|template|view)/.test(v)&&(h+=3),/page\.[jt]sx?$|layout\.[jt]sx?$|\+page\.svelte$/.test(v)&&(h+=5),{...m,score:h}}).sort((m,h)=>h.score-m.score),f=[],_=new Set,$=0;for(let m of T.slice(0,o)){if(m.score<=0||$>=s)break;try{let h=n.roots[0]||"",v=h?`${h}/${m.path}`:m.path,S=await L("fs.read",{path:v}),z=String(S?.payload?.content||"");if(!z)continue;let U=z.slice(0,Math.min(8e3,s-$));f.push({path:m.path,content:U}),_.add(m.path),$+=U.length;let De=m.path.replace(/\.[^.]+$/,""),qe=[".module.css",".module.scss",".css",".scss",".styles.ts"];for(let Be of qe){let N=De+Be;if(_.has(N)||$>=s)continue;if(l.find(V=>V.path===N)){try{let V=await L("fs.read",{path:h?`${h}/${N}`:N}),pe=String(V?.payload?.content||"");if(pe){let me=pe.slice(0,Math.min(4e3,s-$));f.push({path:N,content:me}),_.add(N),$+=me.length}}catch{}break}}}catch{}}if($<s)try{let m=n.roots[0]||"",h=await L("fs.read",{path:m?`${m}/package.json`:"package.json"}),v=String(h?.payload?.content||"");if(v)try{let S=JSON.parse(v),z={...S.dependencies,...S.devDependencies},U=JSON.stringify(z,null,2);f.push({path:"package.json (dependencies)",content:U.slice(0,2e3)})}catch{f.push({path:"package.json",content:v.slice(0,2e3)})}}catch{}f.length&&(t.files=f)}catch{}try{let a=await fe("llm.chat",{provider:n.provider,model:n.model,messages:n.messages.map(i=>({role:i.role,content:i.content})),context:t},i=>{n.streamContent+=i;let l=M.querySelector(".om-msg-assistant:last-child");l&&(l.innerHTML=`<span class="om-spinner"></span>${C(n.streamContent)}`,O())});if(n.messages.push({role:"assistant",content:n.streamContent||a?.content||""}),a?.modifications?.length){for(let i of a.modifications)if(i.type==="edit"&&i.file&&i.search&&i.replace){let l=Math.random().toString(36).slice(2),c=JSON.stringify({id:l,file:i.file,search:i.search,replace:i.replace});n.messages.push({role:"system",content:`__DIFF__${ae(c)}`})}}}catch(a){n.messages.push({role:"system",content:`Error: ${a.message}`})}n.streaming=!1,n.streamContent="",n.attachments=[],de(),E(),O()}function lt(){let e=window.performance,t=e.getEntriesByType("navigation")[0],o=e.getEntriesByType("paint"),s=e.getEntriesByType("resource").slice(-20),r=te(),a=ne(),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 l=o.find(c=>c.name==="first-contentful-paint");if(l&&i.push(`FCP: ${Math.round(l.startTime)}ms`),r.length){i.push(`
419
- Recent requests (${r.length}):`);for(let c of r.slice(-15))i.push(` ${c.method} ${c.url.slice(0,80)} \u2192 ${c.status||"pending"} (${c.duration||"?"}ms)`)}if(a.length){let c=a.filter(p=>p.level==="error"),d=a.filter(p=>p.level==="warn");c.length&&i.push(`
420
- Console errors: ${c.length}`),d.length&&i.push(`Console warnings: ${d.length}`)}if(s.length){let c=[...s].sort((d,p)=>p.duration-d.duration).slice(0,5);i.push(`
421
- Slowest resources:`);for(let d of c)i.push(` ${Math.round(d.duration)}ms \u2014 ${d.name.split("/").pop()?.slice(0,50)}`)}n.messages.push({role:"system",content:i.join(`
422
- `)}),E(),O(),j()}function ct(){let e=k.querySelector(".om-file-input");e&&e.click()}function se(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),de())},s.readAsDataURL(o)}}function de(){let e=k.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">
423
- <img src="${t}" alt="attachment" />
424
- <button class="om-attachment-remove" data-action="remove-attachment" data-idx="${o}">${u.x}</button>
425
- </div>`).join("")}}var q=null,B=null;function dt(){n.selecting?le():W()}function W(){n.selecting=!0,document.body.style.cursor="crosshair",I(),B=t=>{let o=t.target;if(o.closest("openmagic-toolbar")||o.dataset?.openmagic)return;let s=o.getBoundingClientRect();we({x:s.x,y:s.y,width:s.width,height:s.height})},q=t=>{t.preventDefault(),t.stopPropagation();let o=t.target;o.closest("openmagic-toolbar")||o.dataset?.openmagic||(n.selectedElement=ve(o),le(),j(),H.focus())};let e=t=>{t.key==="Escape"&&le()};document.addEventListener("mousemove",B,!0),document.addEventListener("click",q,!0),document.addEventListener("keydown",e,!0),W._escHandler=e}function le(){n.selecting=!1,document.body.style.cursor="",ke(),B&&(document.removeEventListener("mousemove",B,!0),B=null),q&&(document.removeEventListener("click",q,!0),q=null);let e=W._escHandler;e&&(document.removeEventListener("keydown",e,!0),W._escHandler=null),I()}async function pt(){let e;try{let o=n.selectedElement?.cssSelector?.trim();o&&(e=document.querySelector(o)||void 0)}catch{}let t=await Se(e||void 0);t&&(n.screenshot=t,j(),H.focus())}function mt(){let e=!1,t=0,o=0,s=0,r=0;y.addEventListener("mousedown",a=>{let i=a.target;if(i.closest("[data-action]")||!i.closest(".om-grab")&&!i.closest(".om-pill-brand"))return;e=!0,t=a.clientX,o=a.clientY;let l=y.getBoundingClientRect();s=l.left,r=l.top,a.preventDefault()}),document.addEventListener("mousemove",a=>{e&&(y.style.left=s+a.clientX-t+"px",y.style.top=r+a.clientY-o+"px",y.style.right="auto",y.style.bottom="auto")}),document.addEventListener("mouseup",()=>{if(e){e=!1;try{localStorage.setItem("__om_pos__",JSON.stringify({left:y.style.left,top:y.style.top}))}catch{}}})}function C(e){let t=document.createElement("div");return t.textContent=e,t.innerHTML}function ut(){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=Ne.split(".").map(Number);for(let s=0;s<3;s++){if((t[s]||0)>(o[s]||0)){n.updateAvailable=!0,n.latestVersion=e.version,gt();return}if((t[s]||0)<(o[s]||0))return}}).catch(()=>{})}function gt(){if(k.querySelector(".om-update-dot"))return;let t=document.createElement("span");t.className="om-update-dot",t.title=`v${n.latestVersion} available`,t.addEventListener("click",()=>P("settings"));let o=k.querySelector(".om-toolbar-header");o&&o.appendChild(t)}typeof window<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",_e):_e());})();
418
+ </div>`}catch{return'<div class="om-msg om-msg-system">Malformed diff data</div>'}return`<div class="om-msg om-msg-${s.role}">${P(s.content)}</div>`}).join(""),n=t.streaming?`<div class="om-msg om-msg-assistant"><span class="om-spinner"></span>${P(t.streamContent)}</div>`:"";return`<div class="om-chat-messages">${!t.messages.length&&!t.streaming?'<div class="om-chat-empty">Select an element or type below to start</div>':""}${e}${n}</div>`}function D(){requestAnimationFrame(()=>{let e=T.querySelector(".om-chat-messages");e&&(e.scrollTop=e.scrollHeight)})}async function ct(){let n=T.querySelector('[data-field="apiKey"]')?.value||"";if(!t.provider){t.saveStatus="error",V(),setTimeout(()=>{t.saveStatus="",E()},2e3);return}if(!ve()){t.saveStatus="error",V();let s=T.querySelector('[data-action="save-settings"]');s&&(s.innerHTML="Not connected - check terminal"),setTimeout(()=>{t.saveStatus="",E()},3e3);return}let o={provider:t.provider,model:t.model};n&&(o.apiKey=n),t.saveStatus="saving",V();try{let s=await Promise.race([M("config.set",o),new Promise((a,r)=>setTimeout(()=>r(new Error("Save timed out")),8e3))]);n&&t.provider&&(t.configuredProviders[t.provider]=!0),t.hasApiKey=!!(n||t.configuredProviders[t.provider]),t.saveStatus="saved",V(),setTimeout(()=>{t.saveStatus="",t.activePanel==="settings"&&N("chat")},1200)}catch(s){t.saveStatus="error";let a=T.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(()=>{t.saveStatus="",E()},4e3)}}function V(){let e=T.querySelector('[data-action="save-settings"]');e&&(t.saveStatus==="saving"?(e.innerHTML='<span class="om-spinner"></span> Saving...',e.className="om-btn om-btn-saving",e.disabled=!0):t.saveStatus==="saved"?(e.innerHTML=`${g.check} Saved`,e.className="om-btn om-btn-saved",e.disabled=!1):t.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=_.value.trim();if(!e||t.streaming)return;if(!t.provider||!t.hasApiKey&&!O[t.provider]?.local){N("settings");return}t.messages.push({role:"user",content:e}),t.streaming=!0,t.streamContent="",_.value="",N("chat");let n=Ne(t.selectedElement,t.screenshot);n.pageUrl=window.location.href,n.pageTitle=document.title,t.attachments.length>0&&(n.screenshot||(n.screenshot=t.attachments[0]),n.attachments=[...t.attachments]);let o=5,s=32e3,a=/\.(?:[cm]?[jt]sx?|svelte|vue|astro|html?|css|scss|less|php|py)$/i;try{let c=await M("fs.list",{});c?.payload?.projectTree&&(n.projectTree=c.payload.projectTree);let d=(c?.payload?.files||[]).filter(m=>m.type==="file"&&a.test(m.path)),l=[e];if(t.selectedElement&&(t.selectedElement.id&&l.push(t.selectedElement.id),t.selectedElement.className&&l.push(t.selectedElement.className),t.selectedElement.textContent&&l.push(t.selectedElement.textContent.slice(0,100)),t.selectedElement.componentHint&&l.push(t.selectedElement.componentHint),t.selectedElement.ancestry))for(let m of t.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)),v=window.location.pathname.split("/").filter(m=>m.length>1&&!/^\d+$/.test(m)),$=d.map(m=>{let h=0,w=m.path.toLowerCase();for(let L of v)w.includes(L.toLowerCase())&&(h+=15);if(t.selectedElement?.componentHint){let L=t.selectedElement.componentHint.toLowerCase();w.includes(L)&&(h+=12)}for(let L of u)w.includes(L)&&(h+=5);return/(component|page|route|layout|template|view)/.test(w)&&(h+=3),/page\.[jt]sx?$|layout\.[jt]sx?$|\+page\.svelte$/.test(w)&&(h+=5),{...m,score:h}}).sort((m,h)=>h.score-m.score),C=[],q=new Set,H=0;for(let m of $.slice(0,o)){if(m.score<=0||H>=s)break;try{let h=t.roots[0]||"",w=h?`${h}/${m.path}`:m.path,L=await M("fs.read",{path:w}),U=String(L?.payload?.content||"");if(!U)continue;let G=U.slice(0,Math.min(8e3,s-H));C.push({path:m.path,content:G}),q.add(m.path),H+=G.length;let Be=m.path.replace(/\.[^.]+$/,""),Ie=[".module.css",".module.scss",".css",".scss",".styles.ts"];for(let je of Ie){let R=Be+je;if(q.has(R)||H>=s)continue;if(d.find(J=>J.path===R)){try{let J=await M("fs.read",{path:h?`${h}/${R}`:R}),ue=String(J?.payload?.content||"");if(ue){let ge=ue.slice(0,Math.min(4e3,s-H));C.push({path:R,content:ge}),q.add(R),H+=ge.length}}catch{}break}}}catch{}}if(H<s)try{let m=t.roots[0]||"",h=await M("fs.read",{path:m?`${m}/package.json`:"package.json"}),w=String(h?.payload?.content||"");if(w)try{let L=JSON.parse(w),U={...L.dependencies,...L.devDependencies},G=JSON.stringify(U,null,2);C.push({path:"package.json (dependencies)",content:G.slice(0,2e3)})}catch{C.push({path:"package.json",content:w.slice(0,2e3)})}}catch{}C.length&&(n.files=C)}catch{}let r=2,i=0;try{for(;i<=r;){t.streamContent="";let c=await be("llm.chat",{provider:t.provider,model:t.model,messages:t.messages.map(l=>({role:l.role,content:l.content})),context:n},l=>{t.streamContent+=l;let u=T.querySelector(".om-msg-assistant:last-child");u&&(u.innerHTML=`<span class="om-spinner"></span>${P(t.streamContent)}`,D())}),p=t.streamContent||c?.content||"",d=p.match(/NEED_FILE:\s*([^\s"}\]]+)/);if(d&&!c?.modifications?.length&&i<r){let l=d[1].trim();i++,t.messages.push({role:"system",content:`Reading ${l}...`}),E();try{let u=t.roots[0]||"",x=u?`${u}/${l}`:l,v=await M("fs.read",{path:x}),$=String(v?.payload?.content||"");if($)n.files||(n.files=[]),n.files.push({path:l,content:$.slice(0,8e3)}),t.messages.push({role:"assistant",content:p}),t.messages.push({role:"user",content:`Here is ${l}. Now please make the edit.`});else{t.messages.push({role:"system",content:`Could not read ${l}`});break}}catch{t.messages.push({role:"system",content:`File not found: ${l}`});break}continue}if(t.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),x=JSON.stringify({id:u,file:l.file,search:l.search,replace:l.replace});t.messages.push({role:"system",content:`__DIFF__${ie(x)}`})}}break}}catch(c){t.messages.push({role:"system",content:`Error: ${c.message}`})}t.streaming=!1,t.streamContent="",t.attachments=[],me(),E(),D()}function dt(){let e=window.performance,n=e.getEntriesByType("navigation")[0],o=e.getEntriesByType("paint"),s=e.getEntriesByType("resource").slice(-20),a=oe(),r=se(),i=[];i.push("--- Network & Performance Capture ---"),n&&(i.push(`Page load: ${Math.round(n.loadEventEnd-n.startTime)}ms`),i.push(`DOM ready: ${Math.round(n.domContentLoadedEventEnd-n.startTime)}ms`),i.push(`TTFB: ${Math.round(n.responseStart-n.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(`
419
+ 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(`
420
+ 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(`
421
+ Slowest resources:`);for(let d of p)i.push(` ${Math.round(d.duration)}ms \u2014 ${d.name.split("/").pop()?.slice(0,50)}`)}t.messages.push({role:"system",content:i.join(`
422
+ `)}),E(),D(),z()}function pt(){let e=S.querySelector(".om-file-input");e&&e.click()}function re(e){if(e)for(let n=0;n<e.length&&t.attachments.length<5;n++){let o=e[n];if(!o.type.startsWith("image/")||o.size>10*1024*1024)continue;let s=new FileReader;s.onload=()=>{typeof s.result=="string"&&(t.attachments.push(s.result),me())},s.readAsDataURL(o)}}function me(){let e=S.querySelector(".om-prompt-attachments");if(e){if(!t.attachments.length){e.innerHTML="",e.classList.add("om-hidden");return}e.classList.remove("om-hidden"),e.innerHTML=t.attachments.map((n,o)=>`<div class="om-attachment-thumb">
423
+ <img src="${n}" alt="attachment" />
424
+ <button class="om-attachment-remove" data-action="remove-attachment" data-idx="${o}">${g.x}</button>
425
+ </div>`).join("")}}var I=null,j=null;function mt(){t.selecting?de():X()}function X(){t.selecting=!0,document.body.style.cursor="crosshair",F(),j=n=>{let o=n.target;if(o.closest("openmagic-toolbar")||o.dataset?.openmagic)return;let s=o.getBoundingClientRect();Se({x:s.x,y:s.y,width:s.width,height:s.height})},I=n=>{n.preventDefault(),n.stopPropagation();let o=n.target;o.closest("openmagic-toolbar")||o.dataset?.openmagic||(t.selectedElement=ke(o),de(),z(),_.focus())};let e=n=>{n.key==="Escape"&&de()};document.addEventListener("mousemove",j,!0),document.addEventListener("click",I,!0),document.addEventListener("keydown",e,!0),X._escHandler=e}function de(){t.selecting=!1,document.body.style.cursor="",Ee(),j&&(document.removeEventListener("mousemove",j,!0),j=null),I&&(document.removeEventListener("click",I,!0),I=null);let e=X._escHandler;e&&(document.removeEventListener("keydown",e,!0),X._escHandler=null),F()}async function ut(){let e;try{let o=t.selectedElement?.cssSelector?.trim();o&&(e=document.querySelector(o)||void 0)}catch{}let n=await Le(e||void 0);n&&(t.screenshot=n,z(),_.focus())}function gt(){let e=!1,n=0,o=0,s=0,a=0;f.addEventListener("mousedown",r=>{let i=r.target;if(i.closest("[data-action]")||!i.closest(".om-grab")&&!i.closest(".om-pill-brand"))return;e=!0,n=r.clientX,o=r.clientY;let c=f.getBoundingClientRect();s=c.left,a=c.top,r.preventDefault()}),document.addEventListener("mousemove",r=>{e&&(f.style.left=s+r.clientX-n+"px",f.style.top=a+r.clientY-o+"px",f.style.right="auto",f.style.bottom="auto")}),document.addEventListener("mouseup",()=>{if(e){e=!1;try{localStorage.setItem("__om_pos__",JSON.stringify({left:f.style.left,top:f.style.top}))}catch{}}})}function P(e){let n=document.createElement("div");return n.textContent=e,n.innerHTML}function ht(){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 n=e.version.split(".").map(Number),o=Ae.split(".").map(Number);for(let s=0;s<3;s++){if((n[s]||0)>(o[s]||0)){t.updateAvailable=!0,t.latestVersion=e.version,ft();return}if((n[s]||0)<(o[s]||0))return}}).catch(()=>{})}function ft(){if(S.querySelector(".om-update-dot"))return;let n=document.createElement("span");n.className="om-update-dot",n.title=`v${t.latestVersion} available`,n.addEventListener("click",()=>N("settings"));let o=S.querySelector(".om-toolbar-header");o&&o.appendChild(n)}typeof window<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Re):Re());})();
426
426
  //# sourceMappingURL=index.global.js.map