openmagic 0.31.9 → 0.32.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.
@@ -372,25 +372,25 @@
372
372
  .om-msg:hover .om-copy-btn { opacity: 1; }
373
373
  .om-copy-btn:hover { color: #ccc; background: rgba(0,0,0,0.5); }
374
374
  .om-msg { position: relative; }
375
- `;var _=null,C=new Map,G=[],ge=[],B=!1,Te=!1,ue=null,he=0;function fe(){return Math.random().toString(36).slice(2)+Date.now().toString(36)}function ye(t,e){return Te=!0,new Promise((s,o)=>{let a=!1,i=setTimeout(()=>{a||(a=!0,o(new Error("Handshake timeout")),_?.close())},1e4);try{let r=window.location.hostname||"127.0.0.1",p=window.location.protocol==="https:"?"wss:":"ws:";_=new WebSocket(`${p}//${r}:${t}/__openmagic__/ws`),_.onopen=()=>{let c=fe();_.send(JSON.stringify({id:c,type:"handshake",payload:{token:e}})),C.set(c,m=>{if(m.type==="handshake.ok"){clearTimeout(i),B=!0,he=0;for(let d of ge)_?.send(d);ge=[],a||(a=!0,s())}else m.type==="error"&&(clearTimeout(i),a||(a=!0,o(new Error(m.payload?.message||"Handshake failed"))))})},_.onmessage=c=>{try{let m=JSON.parse(c.data);m.id&&C.has(m.id)&&(C.get(m.id)(m),(m.type==="llm.done"||m.type==="llm.error"||!m.type.startsWith("llm."))&&C.delete(m.id));for(let d of G)d(m)}catch{}},_.onclose=()=>{let c=B;if(B=!1,C.forEach((m,d)=>{m({type:"error",id:d,payload:{message:"Connection lost"}})}),C.clear(),!c&&!a){clearTimeout(i),a=!0,o(new Error("WebSocket closed before handshake"));return}if(c&&Te&&!ue){let m=Math.min(2e3*Math.pow(1.5,he),3e4);he++,ue=setTimeout(()=>{ue=null,ye(t,e).then(()=>{for(let d of G)d({type:"reconnected",payload:{}})}).catch(()=>{})},m)}},_.onerror=()=>{!B&&!a&&(clearTimeout(i),a=!0,o(new Error("WebSocket connection failed")))}}catch(r){clearTimeout(i),a||(a=!0,o(r))}})}function Ce(t){let e=JSON.stringify(t);_&&_.readyState===WebSocket.OPEN&&B?_.send(e):ge.push(e)}function S(t,e){return new Promise((s,o)=>{let a=fe(),i=setTimeout(()=>{C.delete(a),o(new Error("Request timeout"))},3e4);C.set(a,r=>{clearTimeout(i),r.type==="error"?o(new Error(r.payload?.message||"Unknown error")):s(r)}),Ce({id:a,type:t,payload:e})})}function He(t,e,s){return new Promise((o,a)=>{let i=fe(),r=setTimeout(()=>{C.delete(i),a(new Error("Stream timeout"))},12e4);C.set(i,p=>{p.type==="llm.chunk"?s(p.payload?.delta||""):p.type==="llm.done"?(clearTimeout(r),C.delete(i),o(p.payload)):(p.type==="llm.error"||p.type==="error")&&(clearTimeout(r),C.delete(i),a(new Error(p.payload?.message||"Stream error")))}),Ce({id:i,type:t,payload:e})})}function Pe(t){return G.push(t),()=>{G=G.filter(e=>e!==t)}}function be(){return B}var _e=["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 Re(t){let e=window.getComputedStyle(t),s={};for(let d of _e)s[d]=e.getPropertyValue(d);let o=t.getBoundingClientRect(),a={};if(t.parentElement&&t.parentElement!==document.body){let d=window.getComputedStyle(t.parentElement);for(let x of _e)a[x]=d.getPropertyValue(x)}let i=[];if(t.parentElement){let d=Array.from(t.parentElement.children),x=d.indexOf(t),g=Math.max(0,x-3),l=Math.min(d.length,x+4);g>0&&i.push(`... ${g} elements before ...`);for(let u=g;u<l;u++){let y=d[u],h=y.tagName.toLowerCase(),f=(y.className||"").toString().slice(0,60);y===t?i.push(`[SELECTED] <${h} class="${f}">`):i.push(`<${h} class="${f}">`)}l<d.length&&i.push(`... ${d.length-l} elements after ...`)}let r=at(t),p={};for(let d of Array.from(t.attributes))(d.name.startsWith("aria-")||d.name==="role"||d.name==="tabindex")&&(p[d.name]=d.value);let c=[];for(let d of Array.from(t.attributes))d.name.startsWith("on")&&c.push(d.name);let m=rt(t);return{tagName:t.tagName.toLowerCase(),id:t.id||"",className:t.className||"",textContent:(t.textContent||"").trim().slice(0,200),outerHTML:nt(t),cssSelector:ot(t),xpath:st(t),computedStyles:s,ancestry:et(t),componentHint:tt(t),rect:{x:o.x,y:o.y,width:o.width,height:o.height},parentStyles:a,siblings:i,matchedCssRules:r,viewport:{width:window.innerWidth,height:window.innerHeight},ariaAttributes:p,eventHandlers:c,reactProps:m}}function et(t,e=5){let s=[],o=t.parentElement;for(;o&&o!==document.body&&s.length<e;){let a=o.tagName.toLowerCase(),i=(typeof o.className=="string"?o.className:"").split(/\s+/).filter(r=>r.length>1&&!r.startsWith("_")).slice(0,3).join(".");s.push(i?`${a}.${i}`:a),o=o.parentElement}return s}function tt(t){let e=t;for(;e&&e!==document.body;){let s=e.getAttribute("data-component")||e.getAttribute("data-testid")||e.getAttribute("data-cy");if(s)return s;let o=Object.keys(e);for(let a of o)if(a.startsWith("__reactFiber")||a.startsWith("__reactInternalInstance"))try{let i=e[a],r=i?.type?.name||i?.type?.displayName||i?.return?.type?.name||i?.return?.type?.displayName;if(r&&r!=="div"&&r!=="span"&&r.length>1)return r}catch{}e=e.parentElement}return""}function nt(t){let e=t.cloneNode(!0);e.querySelectorAll("script, style, svg").forEach(a=>a.remove());let o=e.outerHTML;if(o.length>2e3){let a=t.tagName.toLowerCase(),i=Array.from(t.attributes).map(p=>`${p.name}="${p.value}"`).join(" "),r=Array.from(t.children).slice(0,5).map(p=>`<${p.tagName.toLowerCase()} .../>`).join(`
375
+ `;var R=null,H=new Map,G=[],ge=[],B=!1,Te=!1,ue=null,he=0;function fe(){return Math.random().toString(36).slice(2)+Date.now().toString(36)}function ye(t,e){return Te=!0,new Promise((s,o)=>{let a=!1,i=setTimeout(()=>{a||(a=!0,o(new Error("Handshake timeout")),R?.close())},1e4);try{let r=window.location.hostname||"127.0.0.1",p=window.location.protocol==="https:"?"wss:":"ws:";R=new WebSocket(`${p}//${r}:${t}/__openmagic__/ws`),R.onopen=()=>{let c=fe();R.send(JSON.stringify({id:c,type:"handshake",payload:{token:e}})),H.set(c,m=>{if(m.type==="handshake.ok"){clearTimeout(i),B=!0,he=0;for(let d of ge)R?.send(d);ge=[],a||(a=!0,s())}else m.type==="error"&&(clearTimeout(i),a||(a=!0,o(new Error(m.payload?.message||"Handshake failed"))))})},R.onmessage=c=>{try{let m=JSON.parse(c.data);m.id&&H.has(m.id)&&(H.get(m.id)(m),(m.type==="llm.done"||m.type==="llm.error"||!m.type.startsWith("llm."))&&H.delete(m.id));for(let d of G)d(m)}catch{}},R.onclose=()=>{let c=B;if(B=!1,H.forEach((m,d)=>{m({type:"error",id:d,payload:{message:"Connection lost"}})}),H.clear(),!c&&!a){clearTimeout(i),a=!0,o(new Error("WebSocket closed before handshake"));return}if(c&&Te&&!ue){let m=Math.min(2e3*Math.pow(1.5,he),3e4);he++,ue=setTimeout(()=>{ue=null,ye(t,e).then(()=>{for(let d of G)d({type:"reconnected",payload:{}})}).catch(()=>{})},m)}},R.onerror=()=>{!B&&!a&&(clearTimeout(i),a=!0,o(new Error("WebSocket connection failed")))}}catch(r){clearTimeout(i),a||(a=!0,o(r))}})}function Ce(t){let e=JSON.stringify(t);R&&R.readyState===WebSocket.OPEN&&B?R.send(e):ge.push(e)}function S(t,e){return new Promise((s,o)=>{let a=fe(),i=setTimeout(()=>{H.delete(a),o(new Error("Request timeout"))},3e4);H.set(a,r=>{clearTimeout(i),r.type==="error"?o(new Error(r.payload?.message||"Unknown error")):s(r)}),Ce({id:a,type:t,payload:e})})}function He(t,e,s){return new Promise((o,a)=>{let i=fe(),r=setTimeout(()=>{H.delete(i),a(new Error("Stream timeout"))},12e4);H.set(i,p=>{p.type==="llm.chunk"?s(p.payload?.delta||""):p.type==="llm.done"?(clearTimeout(r),H.delete(i),o(p.payload)):(p.type==="llm.error"||p.type==="error")&&(clearTimeout(r),H.delete(i),a(new Error(p.payload?.message||"Stream error")))}),Ce({id:i,type:t,payload:e})})}function Pe(t){return G.push(t),()=>{G=G.filter(e=>e!==t)}}function be(){return B}var _e=["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 Re(t){let e=window.getComputedStyle(t),s={};for(let d of _e)s[d]=e.getPropertyValue(d);let o=t.getBoundingClientRect(),a={};if(t.parentElement&&t.parentElement!==document.body){let d=window.getComputedStyle(t.parentElement);for(let x of _e)a[x]=d.getPropertyValue(x)}let i=[];if(t.parentElement){let d=Array.from(t.parentElement.children),x=d.indexOf(t),g=Math.max(0,x-3),l=Math.min(d.length,x+4);g>0&&i.push(`... ${g} elements before ...`);for(let u=g;u<l;u++){let y=d[u],h=y.tagName.toLowerCase(),f=(y.className||"").toString().slice(0,60);y===t?i.push(`[SELECTED] <${h} class="${f}">`):i.push(`<${h} class="${f}">`)}l<d.length&&i.push(`... ${d.length-l} elements after ...`)}let r=at(t),p={};for(let d of Array.from(t.attributes))(d.name.startsWith("aria-")||d.name==="role"||d.name==="tabindex")&&(p[d.name]=d.value);let c=[];for(let d of Array.from(t.attributes))d.name.startsWith("on")&&c.push(d.name);let m=rt(t);return{tagName:t.tagName.toLowerCase(),id:t.id||"",className:t.className||"",textContent:(t.textContent||"").trim().slice(0,200),outerHTML:nt(t),cssSelector:ot(t),xpath:st(t),computedStyles:s,ancestry:et(t),componentHint:tt(t),rect:{x:o.x,y:o.y,width:o.width,height:o.height},parentStyles:a,siblings:i,matchedCssRules:r,viewport:{width:window.innerWidth,height:window.innerHeight},ariaAttributes:p,eventHandlers:c,reactProps:m}}function et(t,e=5){let s=[],o=t.parentElement;for(;o&&o!==document.body&&s.length<e;){let a=o.tagName.toLowerCase(),i=(typeof o.className=="string"?o.className:"").split(/\s+/).filter(r=>r.length>1&&!r.startsWith("_")).slice(0,3).join(".");s.push(i?`${a}.${i}`:a),o=o.parentElement}return s}function tt(t){let e=t;for(;e&&e!==document.body;){let s=e.getAttribute("data-component")||e.getAttribute("data-testid")||e.getAttribute("data-cy");if(s)return s;let o=Object.keys(e);for(let a of o)if(a.startsWith("__reactFiber")||a.startsWith("__reactInternalInstance"))try{let i=e[a],r=i?.type?.name||i?.type?.displayName||i?.return?.type?.name||i?.return?.type?.displayName;if(r&&r!=="div"&&r!=="span"&&r.length>1)return r}catch{}e=e.parentElement}return""}function nt(t){let e=t.cloneNode(!0);e.querySelectorAll("script, style, svg").forEach(a=>a.remove());let o=e.outerHTML;if(o.length>2e3){let a=t.tagName.toLowerCase(),i=Array.from(t.attributes).map(p=>`${p.name}="${p.value}"`).join(" "),r=Array.from(t.children).slice(0,5).map(p=>`<${p.tagName.toLowerCase()} .../>`).join(`
376
376
  `);o=`<${a} ${i}>
377
377
  ${r}
378
378
  ${t.children.length>5?`<!-- +${t.children.length-5} more children -->`:""}
379
- </${a}>`}return o}function ot(t){if(t.id)return`#${CSS.escape(t.id)}`;let e=[],s=t;for(;s&&s!==document.body;){let o=s.tagName.toLowerCase();if(s.id){e.unshift(`#${CSS.escape(s.id)}`);break}if(s.className&&typeof s.className=="string"){let i=s.className.trim().split(/\s+/).filter(r=>!r.startsWith("__")&&r.length<30).slice(0,2).map(r=>CSS.escape(r));i.length>0&&(o+="."+i.join("."))}let a=s.parentElement;if(a){let i=Array.from(a.children).filter(r=>r.tagName===s.tagName);if(i.length>1){let r=i.indexOf(s)+1;o+=`:nth-of-type(${r})`}}e.unshift(o),s=s.parentElement}return e.join(" > ")}function st(t){let e=[],s=t;for(;s&&s!==document;){if(s.nodeType===Node.ELEMENT_NODE){let o=s,a=1,i=o.previousElementSibling;for(;i;)i.tagName===o.tagName&&a++,i=i.previousElementSibling;e.unshift(`${o.tagName.toLowerCase()}[${a}]`)}s=s.parentNode}return"/"+e.join("/")}function at(t){let e=[];try{for(let s of Array.from(document.styleSheets))try{let o=s.cssRules||s.rules;if(!o)continue;for(let a of Array.from(o))if(a instanceof CSSStyleRule)try{if(t.matches(a.selectorText)){let i=a.cssText;i.length>10&&i.length<500&&e.push(i)}}catch{}}catch{}}catch{}return e.slice(0,15)}function rt(t){try{let e=Object.keys(t);for(let s of e)if(s.startsWith("__reactFiber")||s.startsWith("__reactInternalInstance")){let o=t[s];if(!o?.memoizedProps)continue;let a=o.memoizedProps,i={},r=0;for(let[p,c]of Object.entries(a)){if(r>=10)break;if(p==="children")continue;let m=typeof c;m==="string"||m==="number"||m==="boolean"||c===null?(i[p]=c,r++):m==="function"?(i[p]="[function]",r++):Array.isArray(c)&&(i[p]=`[Array(${c.length})]`,r++)}return Object.keys(i).length>0?i:null}}catch{}return null}var H=null;function Ne(t){H||(H=document.createElement("div"),H.style.cssText=`
379
+ </${a}>`}return o}function ot(t){if(t.id)return`#${CSS.escape(t.id)}`;let e=[],s=t;for(;s&&s!==document.body;){let o=s.tagName.toLowerCase();if(s.id){e.unshift(`#${CSS.escape(s.id)}`);break}if(s.className&&typeof s.className=="string"){let i=s.className.trim().split(/\s+/).filter(r=>!r.startsWith("__")&&r.length<30).slice(0,2).map(r=>CSS.escape(r));i.length>0&&(o+="."+i.join("."))}let a=s.parentElement;if(a){let i=Array.from(a.children).filter(r=>r.tagName===s.tagName);if(i.length>1){let r=i.indexOf(s)+1;o+=`:nth-of-type(${r})`}}e.unshift(o),s=s.parentElement}return e.join(" > ")}function st(t){let e=[],s=t;for(;s&&s!==document;){if(s.nodeType===Node.ELEMENT_NODE){let o=s,a=1,i=o.previousElementSibling;for(;i;)i.tagName===o.tagName&&a++,i=i.previousElementSibling;e.unshift(`${o.tagName.toLowerCase()}[${a}]`)}s=s.parentNode}return"/"+e.join("/")}function at(t){let e=[];try{for(let s of Array.from(document.styleSheets))try{let o=s.cssRules||s.rules;if(!o)continue;for(let a of Array.from(o))if(a instanceof CSSStyleRule)try{if(t.matches(a.selectorText)){let i=a.cssText;i.length>10&&i.length<500&&e.push(i)}}catch{}}catch{}}catch{}return e.slice(0,15)}function rt(t){try{let e=Object.keys(t);for(let s of e)if(s.startsWith("__reactFiber")||s.startsWith("__reactInternalInstance")){let o=t[s];if(!o?.memoizedProps)continue;let a=o.memoizedProps,i={},r=0;for(let[p,c]of Object.entries(a)){if(r>=10)break;if(p==="children")continue;let m=typeof c;m==="string"||m==="number"||m==="boolean"||c===null?(i[p]=c,r++):m==="function"?(i[p]="[function]",r++):Array.isArray(c)&&(i[p]=`[Array(${c.length})]`,r++)}return Object.keys(i).length>0?i:null}}catch{}return null}var P=null;function Ne(t){P||(P=document.createElement("div"),P.style.cssText=`
380
380
  position: fixed;
381
381
  pointer-events: none;
382
382
  z-index: 2147483646;
383
383
  border: 2px solid #6c5ce7;
384
384
  background: rgba(108, 92, 231, 0.1);
385
385
  transition: all 0.1s ease;
386
- `,H.dataset.openmagic="highlight",document.body.appendChild(H)),H.style.left=`${t.x}px`,H.style.top=`${t.y}px`,H.style.width=`${t.width}px`,H.style.height=`${t.height}px`,H.style.display="block"}function Ae(){H&&(H.style.display="none")}async function Oe(t){try{let e=t||document.body,s=await it(e);if(s)return{data:s}}catch{}try{let e=await lt(t);if(e)return{data:e}}catch(e){return{data:null,error:`Screenshot failed: ${e.message||"unknown error"}. Try using the image attachment button instead.`}}return{data:null,error:"Screenshot capture not available on this page. Try pasting or dragging an image instead."}}async function it(t){let e=t.getBoundingClientRect(),s=Math.min(e.width||window.innerWidth,1920),o=Math.min(e.height||window.innerHeight,1080),a=De(t,0,4);if(!a)return null;let i=`
386
+ `,P.dataset.openmagic="highlight",document.body.appendChild(P)),P.style.left=`${t.x}px`,P.style.top=`${t.y}px`,P.style.width=`${t.width}px`,P.style.height=`${t.height}px`,P.style.display="block"}function Ae(){P&&(P.style.display="none")}async function Oe(t){try{let e=t||document.body,s=await it(e);if(s)return{data:s}}catch{}try{let e=await lt(t);if(e)return{data:e}}catch(e){return{data:null,error:`Screenshot failed: ${e.message||"unknown error"}. Try using the image attachment button instead.`}}return{data:null,error:"Screenshot capture not available on this page. Try pasting or dragging an image instead."}}async function it(t){let e=t.getBoundingClientRect(),s=Math.min(e.width||window.innerWidth,1920),o=Math.min(e.height||window.innerHeight,1080),a=De(t,0,4);if(!a)return null;let i=`
387
387
  <svg xmlns="http://www.w3.org/2000/svg" width="${s}" height="${o}">
388
388
  <foreignObject width="100%" height="100%">
389
389
  <div xmlns="http://www.w3.org/1999/xhtml" style="width:${s}px;height:${o}px;overflow:hidden;">
390
390
  ${a.outerHTML}
391
391
  </div>
392
392
  </foreignObject>
393
- </svg>`,r=new Blob([i],{type:"image/svg+xml;charset=utf-8"}),p=URL.createObjectURL(r);return new Promise(c=>{let m=new Image,d=document.createElement("canvas"),x=Math.min(window.devicePixelRatio||1,2);d.width=s*x,d.height=o*x,m.onload=()=>{URL.revokeObjectURL(p);let g=d.getContext("2d");if(!g){c(null);return}g.scale(x,x),g.drawImage(m,0,0);try{c(d.toDataURL("image/png",.8))}catch{c(null)}},m.onerror=()=>{URL.revokeObjectURL(p),c(null)},setTimeout(()=>{URL.revokeObjectURL(p),c(null)},5e3),m.src=p})}async function lt(t){let e=t||document.documentElement,s=e.getBoundingClientRect(),o=document.createElement("canvas");o.width=400,o.height=300;let a=o.getContext("2d");return a?(a.fillStyle="#1a1a2e",a.fillRect(0,0,400,300),a.fillStyle="#e0e0e0",a.font="14px system-ui",a.fillText(`Element: <${e.tagName.toLowerCase()}>`,20,30),a.fillStyle="#888",a.font="12px system-ui",a.fillText(`Size: ${Math.round(s.width)}x${Math.round(s.height)}`,20,55),a.fillText(`Classes: ${(e.className||"").toString().slice(0,40)}`,20,75),a.fillText(`Page: ${window.location.pathname}`,20,95),a.fillStyle="#6c5ce7",a.font="11px system-ui",a.fillText("(Full screenshot unavailable \u2014 context sent as metadata)",20,130),o.toDataURL("image/png")):null}function De(t,e,s){if(e>s)return null;try{let o=t.cloneNode(!1);if(o.tagName==="SCRIPT"||o.tagName==="STYLE"||o.tagName==="SVG"||o.tagName==="CANVAS"||o.tagName==="VIDEO"||o.tagName==="IFRAME")return null;let a=window.getComputedStyle(t),i=["display","position","width","height","margin","padding","color","background-color","background","font-size","font-weight","font-family","border","border-radius","flex-direction","justify-content","align-items","gap","grid-template-columns","text-align","overflow"],r="";for(let p of i){let c=a.getPropertyValue(p);c&&c!=="normal"&&c!=="none"&&c!=="auto"&&c!=="0px"&&(r+=`${p}:${c};`)}o.setAttribute("style",r);for(let p=0;p<t.children.length&&p<20;p++){let c=De(t.children[p],e+1,s);c&&o.appendChild(c)}return o}catch{return null}}var ee=[];var Ie=!1;function je(){if(Ie)return;Ie=!0;let t=window.fetch;window.fetch=async function(...o){let a=new Request(...o),i={method:a.method,url:a.url,timestamp:Date.now()};try{let r=await t.apply(this,o);return i.status=r.status,i.duration=Date.now()-i.timestamp,xe(i),r}catch(r){throw i.status=0,i.duration=Date.now()-i.timestamp,xe(i),r}};let e=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(o,a,...i){return this.__om_method=o,this.__om_url=a,this.__om_start=Date.now(),e.apply(this,[o,a,...i])},XMLHttpRequest.prototype.send=function(...o){return this.addEventListener("loadend",()=>{xe({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()})}),s.apply(this,o)}}function xe(t){t.url.includes("__openmagic__")||(ee.push(t),ee.length>50&&ee.shift())}function ne(){return[...ee]}var te=[],ct=100,qe=!1;function ze(){if(qe)return;qe=!0;let t=["log","warn","error","info","debug"];for(let e of t){let s=console[e];console[e]=function(...o){te.push({level:e,args:o.map(a=>{try{return typeof a=="object"?JSON.stringify(a).slice(0,500):String(a)}catch{return String(a)}}),timestamp:Date.now()}),te.length>ct&&te.shift(),s.apply(console,o)}}}function oe(){return[...te]}function Be(t,e){return{selectedElement:t?{tagName:t.tagName,id:t.id,className:t.className,textContent:t.textContent,outerHTML:t.outerHTML,cssSelector:t.cssSelector,computedStyles:t.computedStyles}:void 0,screenshot:e||void 0,networkLogs:ne().map(s=>({method:s.method,url:s.url,status:s.status,duration:s.duration,timestamp:s.timestamp})),consoleLogs:oe().map(s=>({level:s.level,args:s.args,timestamp:s.timestamp}))}}var v={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>',copy:'<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></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>',bug:'<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m8 2 1.88 1.88M14.12 3.88 16 2M9 7.13v-1a3.003 3.003 0 1 1 6 0v1"/><path d="M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6"/><path d="M12 20v-9"/><path d="M6.53 9C4.6 8.8 3 7.1 3 5"/><path d="M6 13H2"/><path d="M3 21c0-2.1 1.7-3.9 3.8-4"/><path d="M20.97 5c0 2.1-1.6 3.8-3.5 4"/><path d="M22 13h-4"/><path d="M17.2 17c2.1.1 3.8 1.9 3.8 4"/></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>',trash:'<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/></svg>',minus:'<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="5" y1="12" x2="19" y2="12"/></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 ae(t){let e=new TextEncoder().encode(t),s="";for(let o=0;o<e.length;o+=32768)s+=String.fromCharCode(...e.subarray(o,o+32768));return btoa(s)}function F(t){let e=atob(t),s=new Uint8Array(e.length);for(let o=0;o<e.length;o++)s[o]=e.charCodeAt(o);return new TextDecoder().decode(s)}var Se="0.31.9",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:[],groundedFiles:[],minimized:!1},k,E,D,Ve,Ee,N;function dt(){try{sessionStorage.setItem("__om_state__",JSON.stringify({messages:n.messages,provider:n.provider,model:n.model,panelOpen:n.panelOpen,activePanel:n.activePanel}))}catch{}}function pt(){try{let t=JSON.parse(sessionStorage.getItem("__om_state__")||"{}");t.messages?.length&&(n.messages=t.messages),t.provider&&(n.provider=t.provider),t.model&&(n.model=t.model),t.panelOpen&&(n.panelOpen=t.panelOpen,n.activePanel=t.activePanel||"")}catch{}}function Fe(){if(document.querySelector("openmagic-toolbar"))return;pt();let t=document.createElement("openmagic-toolbar");t.dataset.openmagic="true",k=t.attachShadow({mode:"closed"});let e=document.createElement("style");e.textContent=Le,k.appendChild(e);let s=document.createElement("div");k.appendChild(s),s.innerHTML=mt(),E=s.querySelector(".om-toolbar"),D=s.querySelector(".om-prompt-input"),Ve=s.querySelector(".om-prompt-context"),Ee=s.querySelector(".om-panel"),N=s.querySelector(".om-panel-body"),document.body.appendChild(t),ut(s),Et();try{let r=JSON.parse(localStorage.getItem("__om_pos__")||"");r?.left&&r?.top&&(E.style.left=r.left,E.style.top=r.top,E.style.right="auto",E.style.bottom="auto")}catch{}je(),ze(),Lt();let a=document.querySelector("script[data-openmagic-token]")?.dataset.openmagicToken||window.__OPENMAGIC_TOKEN__,i=parseInt(window.location.port,10)||(window.location.protocol==="https:"?443:80);a&&ye(i,a).then(()=>(n.connected=!0,re(),S("config.get"))).then(r=>{let p=r.payload?.provider||"",c=r.payload?.model||"";n.provider=n.provider||p,n.model=n.model||c,n.configuredProviders=r.payload?.apiKeys||{},n.hasApiKey=n.configuredProviders[n.provider]||!1,n.roots=r.payload?.roots||[],n.panelOpen&&n.activePanel?q(n.activePanel):(!n.provider||!n.hasApiKey&&!Object.values(n.configuredProviders).some(Boolean))&&q("settings"),Y()}).catch(()=>{n.connected=!1,re()})}function mt(){return`
393
+ </svg>`,r=new Blob([i],{type:"image/svg+xml;charset=utf-8"}),p=URL.createObjectURL(r);return new Promise(c=>{let m=new Image,d=document.createElement("canvas"),x=Math.min(window.devicePixelRatio||1,2);d.width=s*x,d.height=o*x,m.onload=()=>{URL.revokeObjectURL(p);let g=d.getContext("2d");if(!g){c(null);return}g.scale(x,x),g.drawImage(m,0,0);try{c(d.toDataURL("image/png",.8))}catch{c(null)}},m.onerror=()=>{URL.revokeObjectURL(p),c(null)},setTimeout(()=>{URL.revokeObjectURL(p),c(null)},5e3),m.src=p})}async function lt(t){let e=t||document.documentElement,s=e.getBoundingClientRect(),o=document.createElement("canvas");o.width=400,o.height=300;let a=o.getContext("2d");return a?(a.fillStyle="#1a1a2e",a.fillRect(0,0,400,300),a.fillStyle="#e0e0e0",a.font="14px system-ui",a.fillText(`Element: <${e.tagName.toLowerCase()}>`,20,30),a.fillStyle="#888",a.font="12px system-ui",a.fillText(`Size: ${Math.round(s.width)}x${Math.round(s.height)}`,20,55),a.fillText(`Classes: ${(e.className||"").toString().slice(0,40)}`,20,75),a.fillText(`Page: ${window.location.pathname}`,20,95),a.fillStyle="#6c5ce7",a.font="11px system-ui",a.fillText("(Full screenshot unavailable \u2014 context sent as metadata)",20,130),o.toDataURL("image/png")):null}function De(t,e,s){if(e>s)return null;try{let o=t.cloneNode(!1);if(o.tagName==="SCRIPT"||o.tagName==="STYLE"||o.tagName==="SVG"||o.tagName==="CANVAS"||o.tagName==="VIDEO"||o.tagName==="IFRAME")return null;let a=window.getComputedStyle(t),i=["display","position","width","height","margin","padding","color","background-color","background","font-size","font-weight","font-family","border","border-radius","flex-direction","justify-content","align-items","gap","grid-template-columns","text-align","overflow"],r="";for(let p of i){let c=a.getPropertyValue(p);c&&c!=="normal"&&c!=="none"&&c!=="auto"&&c!=="0px"&&(r+=`${p}:${c};`)}o.setAttribute("style",r);for(let p=0;p<t.children.length&&p<20;p++){let c=De(t.children[p],e+1,s);c&&o.appendChild(c)}return o}catch{return null}}var ee=[];var Ie=!1;function je(){if(Ie)return;Ie=!0;let t=window.fetch;window.fetch=async function(...o){let a=new Request(...o),i={method:a.method,url:a.url,timestamp:Date.now()};try{let r=await t.apply(this,o);return i.status=r.status,i.duration=Date.now()-i.timestamp,xe(i),r}catch(r){throw i.status=0,i.duration=Date.now()-i.timestamp,xe(i),r}};let e=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(o,a,...i){return this.__om_method=o,this.__om_url=a,this.__om_start=Date.now(),e.apply(this,[o,a,...i])},XMLHttpRequest.prototype.send=function(...o){return this.addEventListener("loadend",()=>{xe({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()})}),s.apply(this,o)}}function xe(t){t.url.includes("__openmagic__")||(ee.push(t),ee.length>50&&ee.shift())}function ne(){return[...ee]}var te=[],ct=100,qe=!1;function ze(){if(qe)return;qe=!0;let t=["log","warn","error","info","debug"];for(let e of t){let s=console[e];console[e]=function(...o){te.push({level:e,args:o.map(a=>{try{return typeof a=="object"?JSON.stringify(a).slice(0,500):String(a)}catch{return String(a)}}),timestamp:Date.now()}),te.length>ct&&te.shift(),s.apply(console,o)}}}function oe(){return[...te]}function Be(t,e){return{selectedElement:t?{tagName:t.tagName,id:t.id,className:t.className,textContent:t.textContent,outerHTML:t.outerHTML,cssSelector:t.cssSelector,computedStyles:t.computedStyles}:void 0,screenshot:e||void 0,networkLogs:ne().map(s=>({method:s.method,url:s.url,status:s.status,duration:s.duration,timestamp:s.timestamp})),consoleLogs:oe().map(s=>({level:s.level,args:s.args,timestamp:s.timestamp}))}}var v={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>',copy:'<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></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>',bug:'<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="m8 2 1.88 1.88M14.12 3.88 16 2M9 7.13v-1a3.003 3.003 0 1 1 6 0v1"/><path d="M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6"/><path d="M12 20v-9"/><path d="M6.53 9C4.6 8.8 3 7.1 3 5"/><path d="M6 13H2"/><path d="M3 21c0-2.1 1.7-3.9 3.8-4"/><path d="M20.97 5c0 2.1-1.6 3.8-3.5 4"/><path d="M22 13h-4"/><path d="M17.2 17c2.1.1 3.8 1.9 3.8 4"/></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>',trash:'<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6m3 0V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"/></svg>',minus:'<svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><line x1="5" y1="12" x2="19" y2="12"/></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 ae(t){let e=new TextEncoder().encode(t),s="";for(let o=0;o<e.length;o+=32768)s+=String.fromCharCode(...e.subarray(o,o+32768));return btoa(s)}function F(t){let e=atob(t),s=new Uint8Array(e.length);for(let o=0;o<e.length;o++)s[o]=e.charCodeAt(o);return new TextDecoder().decode(s)}var Se="0.32.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:[],groundedFiles:[],minimized:!1},k,E,D,Ve,Ee,N;function dt(){try{sessionStorage.setItem("__om_state__",JSON.stringify({messages:n.messages,provider:n.provider,model:n.model,panelOpen:n.panelOpen,activePanel:n.activePanel}))}catch{}}function pt(){try{let t=JSON.parse(sessionStorage.getItem("__om_state__")||"{}");t.messages?.length&&(n.messages=t.messages),t.provider&&(n.provider=t.provider),t.model&&(n.model=t.model),t.panelOpen&&(n.panelOpen=t.panelOpen,n.activePanel=t.activePanel||"")}catch{}}function Fe(){if(document.querySelector("openmagic-toolbar"))return;pt();let t=document.createElement("openmagic-toolbar");t.dataset.openmagic="true",k=t.attachShadow({mode:"closed"});let e=document.createElement("style");e.textContent=Le,k.appendChild(e);let s=document.createElement("div");k.appendChild(s),s.innerHTML=mt(),E=s.querySelector(".om-toolbar"),D=s.querySelector(".om-prompt-input"),Ve=s.querySelector(".om-prompt-context"),Ee=s.querySelector(".om-panel"),N=s.querySelector(".om-panel-body"),document.body.appendChild(t),ut(s),Et();try{let r=JSON.parse(localStorage.getItem("__om_pos__")||"");r?.left&&r?.top&&(E.style.left=r.left,E.style.top=r.top,E.style.right="auto",E.style.bottom="auto")}catch{}je(),ze(),Lt();let a=document.querySelector("script[data-openmagic-token]")?.dataset.openmagicToken||window.__OPENMAGIC_TOKEN__,i=parseInt(window.location.port,10)||(window.location.protocol==="https:"?443:80);a&&ye(i,a).then(()=>(n.connected=!0,re(),S("config.get"))).then(r=>{let p=r.payload?.provider||"",c=r.payload?.model||"";n.provider=n.provider||p,n.model=n.model||c,n.configuredProviders=r.payload?.apiKeys||{},n.hasApiKey=n.configuredProviders[n.provider]||!1,n.roots=r.payload?.roots||[],n.panelOpen&&n.activePanel?q(n.activePanel):(!n.provider||!n.hasApiKey&&!Object.values(n.configuredProviders).some(Boolean))&&q("settings"),Y()}).catch(()=>{n.connected=!1,re()})}function mt(){return`
394
394
  <div class="om-toolbar">
395
395
  <div class="om-toolbar-header">
396
396
  <span class="om-grab">${v.grip}</span>
@@ -478,10 +478,10 @@
478
478
  <button class="om-btn om-btn-sm" data-action="apply-diff" data-file="${A(r.file)}" data-search="${c}" data-replace="${m}">Apply</button>
479
479
  <button class="om-btn-secondary om-btn-sm" data-action="reject-diff" data-idx="${a}">Reject</button>
480
480
  </div>
481
- </div>`}catch{return'<div class="om-msg om-msg-system">Malformed diff data</div>'}if(o.content.startsWith("Applied change to ")){let r=o.content.replace("Applied change to ","").replace(/ \(fuzzy match.*?\)/g,"").replace(". Reloading...","");return`<div class="om-msg om-msg-system">${A(o.content)} <button class="om-undo-btn" data-action="undo-diff" data-file="${A(r)}">Undo</button></div>`}let i=o.role==="user"||o.role==="assistant"?`<button class="om-copy-btn" data-action="copy-msg" data-idx="${a}" title="Copy">${v.copy}</button>`:"";return o.role==="assistant"?`<div class="om-msg om-msg-assistant">${Mt(o.content)}${i}</div>`:`<div class="om-msg om-msg-${o.role}">${A(o.content)}${i}</div>`}).join(""),e=n.streaming?'<div class="om-msg om-msg-assistant"><span class="om-spinner"></span> Generating response...</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>':""}${t}${e}</div>`}function U(){requestAnimationFrame(()=>{let t=N.querySelector(".om-chat-messages");t&&(t.scrollTop=t.scrollHeight)})}async function vt(){let e=N.querySelector('[data-field="apiKey"]')?.value||"";if(!n.provider){n.saveStatus="error",se(),setTimeout(()=>{n.saveStatus="",M()},2e3);return}if(!be()){n.saveStatus="error",se();let o=N.querySelector('[data-action="save-settings"]');o&&(o.innerHTML="Not connected - check terminal"),setTimeout(()=>{n.saveStatus="",M()},3e3);return}let s={provider:n.provider,model:n.model};e&&(s.apiKey=e),n.saveStatus="saving",se();try{let o=await Promise.race([S("config.set",s),new Promise((a,i)=>setTimeout(()=>i(new Error("Save timed out")),8e3))]);e&&n.provider&&(n.configuredProviders[n.provider]=!0),n.hasApiKey=!!(e||n.configuredProviders[n.provider]),n.saveStatus="saved",se(),setTimeout(()=>{n.saveStatus="",n.activePanel==="settings"&&q("chat")},1200)}catch(o){n.saveStatus="error";let a=N.querySelector('[data-action="save-settings"]'),i=(o?.message||"").includes("timeout")?"Connection timeout - is the CLI running?":(o?.message||"").includes("connected")?"Not connected to OpenMagic server":`Save failed: ${o?.message||"Unknown error"}`;a&&(a.innerHTML=i,a.className="om-btn",a.disabled=!1),setTimeout(()=>{n.saveStatus="",M()},4e3)}}function se(){let t=N.querySelector('[data-action="save-settings"]');t&&(n.saveStatus==="saving"?(t.innerHTML='<span class="om-spinner"></span> Saving...',t.className="om-btn om-btn-saving",t.disabled=!0):n.saveStatus==="saved"?(t.innerHTML=`${v.check} Saved`,t.className="om-btn om-btn-saved",t.disabled=!1):n.saveStatus==="error"?(t.innerHTML="Save failed - try again",t.className="om-btn",t.disabled=!1):(t.innerHTML="Save",t.className="om-btn",t.disabled=!1))}async function ke(){let t=D.value.trim();if(!t||n.streaming)return;if(!n.provider||!n.hasApiKey&&!I[n.provider]?.local){q("settings");return}n.messages.push({role:"user",content:t}),n.streaming=!0,n.streamContent="",D.value="",q("chat");let e=Be(n.selectedElement,n.screenshot);e.pageUrl=window.location.href,e.pageTitle=document.title,n.attachments.length>0&&(e.screenshot||(e.screenshot=n.attachments[0]),e.attachments=[...n.attachments]);let s=5,o=32e3,a=/\.(?:[cm]?[jt]sx?|svelte|vue|astro|html?|css|scss|less|php|py)$/i,i=N.querySelector(".om-msg-assistant:last-child");i&&(i.innerHTML='<span class="om-spinner"></span> Reading project files...');try{let c=await S("fs.list",{});c?.payload?.projectTree&&(e.projectTree=c.payload.projectTree);let d=(c?.payload?.files||[]).filter(b=>b.type==="file"&&a.test(b.path)),x=[t];if(n.selectedElement&&(n.selectedElement.id&&x.push(n.selectedElement.id),n.selectedElement.className&&x.push(n.selectedElement.className),n.selectedElement.textContent&&x.push(n.selectedElement.textContent.slice(0,100)),n.selectedElement.componentHint&&x.push(n.selectedElement.componentHint),n.selectedElement.ancestry))for(let b of n.selectedElement.ancestry)x.push(b);let g=x.filter(Boolean).join(" ").toLowerCase().split(/[^a-z0-9_-]+/).filter(b=>b.length>=2&&!["the","to","in","of","and","div","span","class","style"].includes(b)),u=window.location.pathname.split("/").filter(b=>b.length>1&&!/^\d+$/.test(b)),y=d.map(b=>{let w=0,L=b.path.toLowerCase();for(let R of u)L.includes(R.toLowerCase())&&(w+=15);if(n.selectedElement?.componentHint){let R=n.selectedElement.componentHint.toLowerCase();L.includes(R)&&(w+=12)}for(let R of g)L.includes(R)&&(w+=5);return/(component|page|route|layout|template|view)/.test(L)&&(w+=3),/page\.[jt]sx?$|layout\.[jt]sx?$|\+page\.svelte$/.test(L)&&(w+=5),{...b,score:w}}).sort((b,w)=>w.score-b.score),h=[],f=new Set,$=0;for(let b of y.slice(0,s)){if(b.score<=0||$>=o)break;try{let w=n.roots[0]||"",L=w?`${w}/${b.path}`:b.path,R=await S("fs.read",{path:L}),j=String(R?.payload?.content||"");if(!j)continue;let W=Math.min(8e3,o-$),ce=j.slice(0,W);j.length>W&&(ce+=`
482
- // [FILE TRUNCATED \u2014 showing ${W} of ${j.length} chars]`),h.push({path:b.path,content:ce}),f.add(b.path),$+=ce.length;let Xe=b.path.replace(/\.[^.]+$/,""),Ye=[".module.css",".module.scss",".css",".scss",".styles.ts"];for(let de of Ye){let T=Xe+de;if(f.has(T)||$>=o)continue;if(d.find(K=>K.path===T)){try{let K=await S("fs.read",{path:w?`${w}/${T}`:T}),P=String(K?.payload?.content||"");if(P){let Z=Math.min(4e3,o-$),z=P.slice(0,Z);P.length>Z&&(z+=`
483
- // [FILE TRUNCATED \u2014 showing ${Z} of ${P.length} chars]`),h.push({path:T,content:z}),f.add(T),$+=z.length}}catch{}break}}let Ze=j.matchAll(/(?:import|from)\s+['"]\.?\.\/([\w/.-]+)['"]/g);for(let de of Ze){if($>=o)break;let T=de[1],O=b.path.replace(/\/[^/]+$/,""),K=[`${O}/${T}`,`${O}/${T}.tsx`,`${O}/${T}.ts`,`${O}/${T}.jsx`,`${O}/${T}.js`,`${O}/${T}/index.tsx`,`${O}/${T}/index.ts`];for(let P of K){if(f.has(P))break;if(d.find(z=>z.path===P)){try{let z=await S("fs.read",{path:w?`${w}/${P}`:P}),Q=String(z?.payload?.content||"");if(Q){let pe=Math.min(8e3,o-$),me=Q.slice(0,pe);Q.length>pe&&(me+=`
484
- // [FILE TRUNCATED \u2014 showing ${pe} of ${Q.length} chars]`),h.push({path:P,content:me}),f.add(P),$+=me.length}}catch{}break}}}}catch{}}if($<o)try{let b=n.roots[0]||"",w=await S("fs.read",{path:b?`${b}/package.json`:"package.json"}),L=String(w?.payload?.content||"");if(L)try{let R=JSON.parse(L),j={...R.dependencies,...R.devDependencies},W=JSON.stringify(j,null,2);h.push({path:"package.json (dependencies)",content:W.slice(0,2e3)})}catch{h.push({path:"package.json",content:L.slice(0,2e3)})}}catch{}if(h.length){e.files=h;let b=h.map(w=>w.path.split("/").pop()).join(", ");i&&(i.innerHTML=`<span class="om-spinner"></span> Thinking... (${h.length} files: ${b})`)}n.groundedFiles=h.map(b=>b.path)}catch{}let r=4,p=0;try{for(;p<=r;){n.streamContent="";let c=await He("llm.chat",{provider:n.provider,model:n.model,messages:n.messages.map(g=>({role:g.role,content:g.content})),context:e},g=>{n.streamContent+=g}),m=n.streamContent||c?.content||"",d=m.match(/NEED_FILE:\s*"?([^\s"}\]]+)"?/)||m.match(/(?:need|provide|show|read|see|contents?\s+of)\s+(?:the\s+)?(?:file\s+)?[`"']?([a-zA-Z0-9_/.@-]+\.[a-z]{1,5})[`"']?/i)||m.match(/(?:source\s+(?:file|code)\s+(?:for|of|at))\s+[`"']?([a-zA-Z0-9_/.@-]+\.[a-z]{1,5})[`"']?/i);if(d&&!c?.modifications?.length&&p<r){let g=d[1].trim();p++;let l=N.querySelector(".om-msg-assistant:last-child");l&&(l.innerHTML=`<span class="om-spinner"></span> Reading ${g}...`);try{let u=n.roots[0]||"",y=u?`${u}/${g}`:g,h,f=[y];g!==y&&f.push(g);let $=g.split("/").pop()||g,b=u?`${u}/${$}`:$;b!==y&&b!==g&&f.push(b);for(let w of f){let L=await S("fs.read",{path:w}).catch(()=>null);if(L?.payload?.content){h=String(L.payload.content);break}}if(h)e.files||(e.files=[]),e.files.push({path:g,content:h.slice(0,8e3)});else{n.messages.push({role:"system",content:`Could not read ${g}`});break}}catch{n.messages.push({role:"system",content:`File not found: ${g}`});break}continue}let x=m;try{let g=JSON.parse(m);g.explanation&&(x=g.explanation)}catch{let g=m.match(/```(?:json)?\s*([\s\S]*?)```/);if(g)try{let l=JSON.parse(g[1]);l.explanation&&(x=l.explanation)}catch{}}if(n.messages.push({role:"assistant",content:x}),c?.modifications?.length){let g=Math.random().toString(36).slice(2),l=c.modifications.filter(u=>u.type==="edit"&&u.file&&u.search&&u.replace||u.type==="create"&&u.file&&u.content);gt(l.length);for(let u of c.modifications)if(u.type==="edit"&&u.file&&u.search&&u.replace){let y=Math.random().toString(36).slice(2),h=JSON.stringify({id:y,file:u.file,search:u.search,replace:u.replace,groupId:g});n.messages.push({role:"system",content:`__DIFF__${ae(h)}`})}else if(u.type==="create"&&u.file&&u.content){let y=Math.random().toString(36).slice(2),h=JSON.stringify({id:y,file:u.file,search:"",replace:u.content,type:"create",groupId:g});n.messages.push({role:"system",content:`__DIFF__${ae(h)}`})}else u.type==="delete"&&u.file&&n.messages.push({role:"system",content:`LLM proposed deleting ${u.file} \u2014 skipped (use edit with search/replace instead)`})}break}}catch(c){n.messages.push({role:"system",content:`Error: ${c.message}`})}n.streaming=!1,n.streamContent="",n.attachments=[],Me(),M(),U()}function wt(){let t=window.performance,e=t.getEntriesByType("navigation")[0],s=t.getEntriesByType("paint"),o=t.getEntriesByType("resource").slice(-20),a=ne(),i=oe(),r=[];r.push("--- Network & Performance Capture ---"),e&&(r.push(`Page load: ${Math.round(e.loadEventEnd-e.startTime)}ms`),r.push(`DOM ready: ${Math.round(e.domContentLoadedEventEnd-e.startTime)}ms`),r.push(`TTFB: ${Math.round(e.responseStart-e.startTime)}ms`));let p=s.find(c=>c.name==="first-contentful-paint");if(p&&r.push(`FCP: ${Math.round(p.startTime)}ms`),o.length){let c=o.filter(d=>d.initiatorType==="fetch"||d.initiatorType==="xmlhttprequest"),m=c.length>0?c:o;r.push(`
481
+ </div>`}catch{return'<div class="om-msg om-msg-system">Malformed diff data</div>'}if(o.content.startsWith("Applied change to ")){let r=o.content.replace("Applied change to ","").replace(/ \(fuzzy match.*?\)/g,"").replace(". Reloading...","");return`<div class="om-msg om-msg-system">${A(o.content)} <button class="om-undo-btn" data-action="undo-diff" data-file="${A(r)}">Undo</button></div>`}let i=o.role==="user"||o.role==="assistant"?`<button class="om-copy-btn" data-action="copy-msg" data-idx="${a}" title="Copy">${v.copy}</button>`:"";return o.role==="assistant"?`<div class="om-msg om-msg-assistant">${Mt(o.content)}${i}</div>`:`<div class="om-msg om-msg-${o.role}">${A(o.content)}${i}</div>`}).join(""),e=n.streaming?'<div class="om-msg om-msg-assistant"><span class="om-spinner"></span> Generating response...</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>':""}${t}${e}</div>`}function U(){requestAnimationFrame(()=>{let t=N.querySelector(".om-chat-messages");t&&(t.scrollTop=t.scrollHeight)})}async function vt(){let e=N.querySelector('[data-field="apiKey"]')?.value||"";if(!n.provider){n.saveStatus="error",se(),setTimeout(()=>{n.saveStatus="",M()},2e3);return}if(!be()){n.saveStatus="error",se();let o=N.querySelector('[data-action="save-settings"]');o&&(o.innerHTML="Not connected - check terminal"),setTimeout(()=>{n.saveStatus="",M()},3e3);return}let s={provider:n.provider,model:n.model};e&&(s.apiKey=e),n.saveStatus="saving",se();try{let o=await Promise.race([S("config.set",s),new Promise((a,i)=>setTimeout(()=>i(new Error("Save timed out")),8e3))]);e&&n.provider&&(n.configuredProviders[n.provider]=!0),n.hasApiKey=!!(e||n.configuredProviders[n.provider]),n.saveStatus="saved",se(),setTimeout(()=>{n.saveStatus="",n.activePanel==="settings"&&q("chat")},1200)}catch(o){n.saveStatus="error";let a=N.querySelector('[data-action="save-settings"]'),i=(o?.message||"").includes("timeout")?"Connection timeout - is the CLI running?":(o?.message||"").includes("connected")?"Not connected to OpenMagic server":`Save failed: ${o?.message||"Unknown error"}`;a&&(a.innerHTML=i,a.className="om-btn",a.disabled=!1),setTimeout(()=>{n.saveStatus="",M()},4e3)}}function se(){let t=N.querySelector('[data-action="save-settings"]');t&&(n.saveStatus==="saving"?(t.innerHTML='<span class="om-spinner"></span> Saving...',t.className="om-btn om-btn-saving",t.disabled=!0):n.saveStatus==="saved"?(t.innerHTML=`${v.check} Saved`,t.className="om-btn om-btn-saved",t.disabled=!1):n.saveStatus==="error"?(t.innerHTML="Save failed - try again",t.className="om-btn",t.disabled=!1):(t.innerHTML="Save",t.className="om-btn",t.disabled=!1))}async function ke(){let t=D.value.trim();if(!t||n.streaming)return;if(!n.provider||!n.hasApiKey&&!I[n.provider]?.local){q("settings");return}n.messages.push({role:"user",content:t}),n.streaming=!0,n.streamContent="",D.value="",q("chat");let e=Be(n.selectedElement,n.screenshot);e.pageUrl=window.location.href,e.pageTitle=document.title,n.attachments.length>0&&(e.screenshot||(e.screenshot=n.attachments[0]),e.attachments=[...n.attachments]);let s=5,o=32e3,a=/\.(?:[cm]?[jt]sx?|svelte|vue|astro|html?|css|scss|less|php|py)$/i,i=N.querySelector(".om-msg-assistant:last-child");i&&(i.innerHTML='<span class="om-spinner"></span> Reading project files...');try{let c=await S("fs.list",{});c?.payload?.projectTree&&(e.projectTree=c.payload.projectTree);let d=(c?.payload?.files||[]).filter(b=>b.type==="file"&&a.test(b.path)),x=[t];if(n.selectedElement&&(n.selectedElement.id&&x.push(n.selectedElement.id),n.selectedElement.className&&x.push(n.selectedElement.className),n.selectedElement.textContent&&x.push(n.selectedElement.textContent.slice(0,100)),n.selectedElement.componentHint&&x.push(n.selectedElement.componentHint),n.selectedElement.ancestry))for(let b of n.selectedElement.ancestry)x.push(b);let g=x.filter(Boolean).join(" ").toLowerCase().split(/[^a-z0-9_-]+/).filter(b=>b.length>=2&&!["the","to","in","of","and","div","span","class","style"].includes(b)),u=window.location.pathname.split("/").filter(b=>b.length>1&&!/^\d+$/.test(b)),y=d.map(b=>{let w=0,L=b.path.toLowerCase(),z=L.replace(/\([^)]+\)\//g,"");for(let C of u)z.includes(C.toLowerCase())&&(w+=15);if(n.selectedElement?.componentHint){let C=n.selectedElement.componentHint.toLowerCase();L.includes(C)&&(w+=12)}for(let C of g)L.includes(C)&&(w+=5);return/(component|page|route|layout|template|view)/.test(L)&&(w+=3),/page\.[jt]sx?$|layout\.[jt]sx?$|\+page\.svelte$/.test(L)&&(w+=5),{...b,score:w}}).sort((b,w)=>w.score-b.score),h=[],f=new Set,$=0;for(let b of y.slice(0,s)){if(b.score<=0||$>=o)break;try{let w=n.roots[0]||"",L=w?`${w}/${b.path}`:b.path,z=await S("fs.read",{path:L}),C=String(z?.payload?.content||"");if(!C)continue;let W=Math.min(8e3,o-$),ce=C.slice(0,W);C.length>W&&(ce+=`
482
+ // [FILE TRUNCATED \u2014 showing ${W} of ${C.length} chars]`),h.push({path:b.path,content:ce}),f.add(b.path),$+=ce.length;let Xe=b.path.replace(/\.[^.]+$/,""),Ye=[".module.css",".module.scss",".css",".scss",".styles.ts"];for(let de of Ye){let T=Xe+de;if(f.has(T)||$>=o)continue;if(d.find(K=>K.path===T)){try{let K=await S("fs.read",{path:w?`${w}/${T}`:T}),_=String(K?.payload?.content||"");if(_){let Z=Math.min(4e3,o-$),j=_.slice(0,Z);_.length>Z&&(j+=`
483
+ // [FILE TRUNCATED \u2014 showing ${Z} of ${_.length} chars]`),h.push({path:T,content:j}),f.add(T),$+=j.length}}catch{}break}}let Ze=C.matchAll(/(?:import|from)\s+['"]\.?\.\/([\w/.-]+)['"]/g);for(let de of Ze){if($>=o)break;let T=de[1],O=b.path.replace(/\/[^/]+$/,""),K=[`${O}/${T}`,`${O}/${T}.tsx`,`${O}/${T}.ts`,`${O}/${T}.jsx`,`${O}/${T}.js`,`${O}/${T}/index.tsx`,`${O}/${T}/index.ts`];for(let _ of K){if(f.has(_))break;if(d.find(j=>j.path===_)){try{let j=await S("fs.read",{path:w?`${w}/${_}`:_}),Q=String(j?.payload?.content||"");if(Q){let pe=Math.min(8e3,o-$),me=Q.slice(0,pe);Q.length>pe&&(me+=`
484
+ // [FILE TRUNCATED \u2014 showing ${pe} of ${Q.length} chars]`),h.push({path:_,content:me}),f.add(_),$+=me.length}}catch{}break}}}}catch{}}if($<o)try{let b=n.roots[0]||"",w=await S("fs.read",{path:b?`${b}/package.json`:"package.json"}),L=String(w?.payload?.content||"");if(L)try{let z=JSON.parse(L),C={...z.dependencies,...z.devDependencies},W=JSON.stringify(C,null,2);h.push({path:"package.json (dependencies)",content:W.slice(0,2e3)})}catch{h.push({path:"package.json",content:L.slice(0,2e3)})}}catch{}if(h.length){e.files=h;let b=h.map(w=>w.path.split("/").pop()).join(", ");i&&(i.innerHTML=`<span class="om-spinner"></span> Thinking... (${h.length} files: ${b})`)}n.groundedFiles=h.map(b=>b.path)}catch{}let r=4,p=0;try{for(;p<=r;){n.streamContent="";let c=await He("llm.chat",{provider:n.provider,model:n.model,messages:n.messages.map(g=>({role:g.role,content:g.content})),context:e},g=>{n.streamContent+=g}),m=n.streamContent||c?.content||"",d=m.match(/NEED_FILE:\s*"?([^\s"}\]]+)"?/)||m.match(/(?:need|provide|show|read|see|contents?\s+of)\s+(?:the\s+)?(?:file\s+)?[`"']?([a-zA-Z0-9_/.@-]+\.[a-z]{1,5})[`"']?/i)||m.match(/(?:source\s+(?:file|code)\s+(?:for|of|at))\s+[`"']?([a-zA-Z0-9_/.@-]+\.[a-z]{1,5})[`"']?/i);if(d&&p<r){let g=d[1].trim();p++;let l=N.querySelector(".om-msg-assistant:last-child");l&&(l.innerHTML=`<span class="om-spinner"></span> Reading ${g}...`);try{let u=n.roots[0]||"",y=u?`${u}/${g}`:g,h,f=[y];g!==y&&f.push(g);let $=g.split("/").pop()||g,b=u?`${u}/${$}`:$;b!==y&&b!==g&&f.push(b);for(let w of f){let L=await S("fs.read",{path:w}).catch(()=>null);if(L?.payload?.content){h=String(L.payload.content);break}}if(h)e.files||(e.files=[]),e.files.push({path:g,content:h.slice(0,8e3)});else{n.messages.push({role:"system",content:`Could not read ${g}`});break}}catch{n.messages.push({role:"system",content:`File not found: ${g}`});break}continue}let x=m;try{let g=JSON.parse(m);g.explanation&&(x=g.explanation)}catch{let g=m.match(/```(?:json)?\s*([\s\S]*?)```/);if(g)try{let l=JSON.parse(g[1]);l.explanation&&(x=l.explanation)}catch{}}if(n.messages.push({role:"assistant",content:x}),c?.modifications?.length){let g=Math.random().toString(36).slice(2),l=c.modifications.filter(u=>u.type==="edit"&&u.file&&u.search&&u.replace||u.type==="create"&&u.file&&u.content);gt(l.length);for(let u of c.modifications)if(u.type==="edit"&&u.file&&u.search&&u.replace){let y=Math.random().toString(36).slice(2),h=JSON.stringify({id:y,file:u.file,search:u.search,replace:u.replace,groupId:g});n.messages.push({role:"system",content:`__DIFF__${ae(h)}`})}else if(u.type==="create"&&u.file&&u.content){let y=Math.random().toString(36).slice(2),h=JSON.stringify({id:y,file:u.file,search:"",replace:u.content,type:"create",groupId:g});n.messages.push({role:"system",content:`__DIFF__${ae(h)}`})}else u.type==="delete"&&u.file&&n.messages.push({role:"system",content:`LLM proposed deleting ${u.file} \u2014 skipped (use edit with search/replace instead)`})}break}}catch(c){n.messages.push({role:"system",content:`Error: ${c.message}`})}n.streaming=!1,n.streamContent="",n.attachments=[],Me(),M(),U()}function wt(){let t=window.performance,e=t.getEntriesByType("navigation")[0],s=t.getEntriesByType("paint"),o=t.getEntriesByType("resource").slice(-20),a=ne(),i=oe(),r=[];r.push("--- Network & Performance Capture ---"),e&&(r.push(`Page load: ${Math.round(e.loadEventEnd-e.startTime)}ms`),r.push(`DOM ready: ${Math.round(e.domContentLoadedEventEnd-e.startTime)}ms`),r.push(`TTFB: ${Math.round(e.responseStart-e.startTime)}ms`));let p=s.find(c=>c.name==="first-contentful-paint");if(p&&r.push(`FCP: ${Math.round(p.startTime)}ms`),o.length){let c=o.filter(d=>d.initiatorType==="fetch"||d.initiatorType==="xmlhttprequest"),m=c.length>0?c:o;r.push(`
485
485
  All network requests (${m.length}):`);for(let d of m.slice(-30)){let x=d.name.length>80?"..."+d.name.slice(-77):d.name,g=d.responseStatus||"";r.push(` ${Math.round(d.duration)}ms ${g?`[${g}]`:""} ${x}`)}}if(a.length){r.push(`
486
486
  Fetch/XHR requests (${a.length}):`);for(let c of a.slice(-20))r.push(` ${c.method} ${c.url.slice(0,80)} \u2192 ${c.status||"pending"} (${c.duration||"?"}ms)`)}if(i.length){let c=i.filter(d=>d.level==="error"),m=i.filter(d=>d.level==="warn");c.length&&r.push(`
487
487
  Console errors: ${c.length}`),m.length&&r.push(`Console warnings: ${m.length}`)}if(o.length>5){let c=[...o].sort((m,d)=>d.duration-m.duration).slice(0,5);r.push(`