openmagic 0.33.5 → 0.33.6

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 Ce=`
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;
@@ -372,48 +372,48 @@
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 D=null,R=new Map,ee=[],ye=[],J=!1,He=!1,ge=null,fe=0;function be(){return Math.random().toString(36).slice(2)+Date.now().toString(36)}function xe(t,e){return He=!0,new Promise((s,o)=>{let a=!1,i=setTimeout(()=>{a||(a=!0,o(new Error("Handshake timeout")),D?.close())},1e4);try{let r=window.location.hostname||"127.0.0.1",d=window.location.protocol==="https:"?"wss:":"ws:";D=new WebSocket(`${d}//${r}:${t}/__openmagic__/ws`),D.onopen=()=>{let c=be();D.send(JSON.stringify({id:c,type:"handshake",payload:{token:e}})),R.set(c,u=>{if(u.type==="handshake.ok"){clearTimeout(i),J=!0,fe=0;for(let h of ye)D?.send(h);ye=[],a||(a=!0,s())}else u.type==="error"&&(clearTimeout(i),a||(a=!0,o(new Error(u.payload?.message||"Handshake failed"))))})},D.onmessage=c=>{try{let u=JSON.parse(c.data);u.id&&R.has(u.id)&&(R.get(u.id)(u),(u.type==="llm.done"||u.type==="llm.error"||!u.type.startsWith("llm."))&&R.delete(u.id));for(let h of ee)h(u)}catch{}},D.onclose=()=>{let c=J;if(J=!1,R.forEach((u,h)=>{u({type:"error",id:h,payload:{message:"Connection lost"}})}),R.clear(),!c&&!a){clearTimeout(i),a=!0,o(new Error("WebSocket closed before handshake"));return}if(c&&He&&!ge){let u=Math.min(2e3*Math.pow(1.5,fe),3e4);fe++,ge=setTimeout(()=>{ge=null,xe(t,e).then(()=>{for(let h of ee)h({type:"reconnected",payload:{}})}).catch(()=>{})},u)}},D.onerror=()=>{!J&&!a&&(clearTimeout(i),a=!0,o(new Error("WebSocket connection failed")))}}catch(r){clearTimeout(i),a||(a=!0,o(r))}})}function Pe(t){let e=JSON.stringify(t);D&&D.readyState===WebSocket.OPEN&&J?D.send(e):ye.push(e)}function E(t,e){return new Promise((s,o)=>{let a=be(),i=setTimeout(()=>{R.delete(a),o(new Error("Request timeout"))},3e4);R.set(a,r=>{clearTimeout(i),r.type==="error"?o(new Error(r.payload?.message||"Unknown error")):s(r)}),Pe({id:a,type:t,payload:e})})}function Ne(t,e,s){return new Promise((o,a)=>{let i=be(),r=setTimeout(()=>{R.delete(i),a(new Error("Stream timeout"))},12e4);R.set(i,d=>{d.type==="llm.chunk"?s(d.payload?.delta||""):d.type==="llm.done"?(clearTimeout(r),R.delete(i),o(d.payload)):(d.type==="llm.error"||d.type==="error")&&(clearTimeout(r),R.delete(i),a(new Error(d.payload?.message||"Stream error")))}),Pe({id:i,type:t,payload:e})})}function _e(t){return ee.push(t),()=>{ee=ee.filter(e=>e!==t)}}function ve(){return J}var Re=["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 Ae(t){let e=window.getComputedStyle(t),s={};for(let l of Re)s[l]=e.getPropertyValue(l);let o=t.getBoundingClientRect(),a={};if(t.parentElement&&t.parentElement!==document.body){let l=window.getComputedStyle(t.parentElement);for(let f of Re)a[f]=l.getPropertyValue(f)}let i=[];if(t.parentElement){let l=Array.from(t.parentElement.children),f=l.indexOf(t),m=Math.max(0,f-3),g=Math.min(l.length,f+4);m>0&&i.push(`... ${m} elements before ...`);for(let p=m;p<g;p++){let b=l[p],y=b.tagName.toLowerCase(),x=(b.className||"").toString().slice(0,60);b===t?i.push(`[SELECTED] <${y} class="${x}">`):i.push(`<${y} class="${x}">`)}g<l.length&&i.push(`... ${l.length-g} elements after ...`)}let r=[],d=Array.from(t.children).slice(0,12);for(let l=0;l<d.length;l++){let f=d[l],m=f.getBoundingClientRect(),g=window.getComputedStyle(f),p=null;if(l<d.length-1){let b=d[l+1].getBoundingClientRect();p={vertical:Math.round(b.top-m.bottom),horizontal:Math.round(b.left-m.right)}}r.push({tag:f.tagName.toLowerCase(),className:(f.className||"").toString().slice(0,80),rect:{x:Math.round(m.x),y:Math.round(m.y),width:Math.round(m.width),height:Math.round(m.height)},gapToNext:p,margin:g.margin,padding:g.padding})}let c=rt(t),u=lt(t,c),h={};for(let l of Array.from(t.attributes))(l.name.startsWith("aria-")||l.name==="role"||l.name==="tabindex")&&(h[l.name]=l.value);let v=[];for(let l of Array.from(t.attributes))l.name.startsWith("on")&&v.push(l.name);let w=it(t);return{tagName:t.tagName.toLowerCase(),id:t.id||"",className:t.className||"",textContent:(t.textContent||"").trim().slice(0,200),outerHTML:ot(t),cssSelector:st(t),xpath:at(t),computedStyles:s,ancestry:tt(t),componentHint:nt(t),rect:{x:o.x,y:o.y,width:o.width,height:o.height},parentStyles:a,siblings:i,childrenLayout:r,matchedCssRules:c,resolvedClasses:u,viewport:{width:window.innerWidth,height:window.innerHeight},ariaAttributes:h,eventHandlers:v,reactProps:w}}function tt(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 nt(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 ot(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(d=>`${d.name}="${d.value}"`).join(" "),r=Array.from(t.children).slice(0,5).map(d=>`<${d.tagName.toLowerCase()} .../>`).join(`
376
- `);o=`<${a} ${i}>
375
+ `;var I=null,A=new Map,te=[],be=[],X=!1,Pe=!1,fe=null,ye=0;function xe(){return Math.random().toString(36).slice(2)+Date.now().toString(36)}function ve(t,e){return Pe=!0,new Promise((s,o)=>{let a=!1,l=setTimeout(()=>{a||(a=!0,o(new Error("Handshake timeout")),I?.close())},1e4);try{let r=window.location.hostname||"127.0.0.1",p=window.location.protocol==="https:"?"wss:":"ws:";I=new WebSocket(`${p}//${r}:${t}/__openmagic__/ws`),I.onopen=()=>{let c=xe();I.send(JSON.stringify({id:c,type:"handshake",payload:{token:e}})),A.set(c,m=>{if(m.type==="handshake.ok"){clearTimeout(l),X=!0,ye=0;for(let u of be)I?.send(u);be=[],a||(a=!0,s())}else m.type==="error"&&(clearTimeout(l),a||(a=!0,o(new Error(m.payload?.message||"Handshake failed"))))})},I.onmessage=c=>{try{let m=JSON.parse(c.data);m.id&&A.has(m.id)&&(A.get(m.id)(m),(m.type==="llm.done"||m.type==="llm.error"||!m.type.startsWith("llm."))&&A.delete(m.id));for(let u of te)u(m)}catch{}},I.onclose=()=>{let c=X;if(X=!1,A.forEach((m,u)=>{m({type:"error",id:u,payload:{message:"Connection lost"}})}),A.clear(),!c&&!a){clearTimeout(l),a=!0,o(new Error("WebSocket closed before handshake"));return}if(c&&Pe&&!fe){let m=Math.min(2e3*Math.pow(1.5,ye),3e4);ye++,fe=setTimeout(()=>{fe=null,ve(t,e).then(()=>{for(let u of te)u({type:"reconnected",payload:{}})}).catch(()=>{})},m)}},I.onerror=()=>{!X&&!a&&(clearTimeout(l),a=!0,o(new Error("WebSocket connection failed")))}}catch(r){clearTimeout(l),a||(a=!0,o(r))}})}function Ne(t){let e=JSON.stringify(t);I&&I.readyState===WebSocket.OPEN&&X?I.send(e):be.push(e)}function L(t,e){return new Promise((s,o)=>{let a=xe(),l=setTimeout(()=>{A.delete(a),o(new Error("Request timeout"))},3e4);A.set(a,r=>{clearTimeout(l),r.type==="error"?o(new Error(r.payload?.message||"Unknown error")):s(r)}),Ne({id:a,type:t,payload:e})})}function _e(t,e,s){return new Promise((o,a)=>{let l=xe(),r=setTimeout(()=>{A.delete(l),a(new Error("Stream timeout"))},12e4);A.set(l,p=>{p.type==="llm.chunk"?s(p.payload?.delta||""):p.type==="llm.done"?(clearTimeout(r),A.delete(l),o(p.payload)):(p.type==="llm.error"||p.type==="error")&&(clearTimeout(r),A.delete(l),a(new Error(p.payload?.message||"Stream error")))}),Ne({id:l,type:t,payload:e})})}function Re(t){return te.push(t),()=>{te=te.filter(e=>e!==t)}}function we(){return X}var Ae=["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 Oe(t){let e=window.getComputedStyle(t),s={};for(let i of Ae)s[i]=e.getPropertyValue(i);let o=t.getBoundingClientRect(),a={};if(t.parentElement&&t.parentElement!==document.body){let i=window.getComputedStyle(t.parentElement);for(let y of Ae)a[y]=i.getPropertyValue(y)}let l=[];if(t.parentElement){let i=Array.from(t.parentElement.children),y=i.indexOf(t),b=Math.max(0,y-3),d=Math.min(i.length,y+4);b>0&&l.push(`... ${b} elements before ...`);for(let h=b;h<d;h++){let g=i[h],w=g.tagName.toLowerCase(),f=(g.className||"").toString().slice(0,60);g===t?l.push(`[SELECTED] <${w} class="${f}">`):l.push(`<${w} class="${f}">`)}d<i.length&&l.push(`... ${i.length-d} elements after ...`)}let r=[],p=Array.from(t.children).slice(0,12);for(let i=0;i<p.length;i++){let y=p[i],b=y.getBoundingClientRect(),d=window.getComputedStyle(y),h=null;if(i<p.length-1){let g=p[i+1].getBoundingClientRect();h={vertical:Math.round(g.top-b.bottom),horizontal:Math.round(g.left-b.right)}}r.push({tag:y.tagName.toLowerCase(),className:(y.className||"").toString().slice(0,80),rect:{x:Math.round(b.x),y:Math.round(b.y),width:Math.round(b.width),height:Math.round(b.height)},gapToNext:h,margin:d.margin,padding:d.padding})}let c=it(t),m=ct(t,c),u={};for(let i of Array.from(t.attributes))(i.name.startsWith("aria-")||i.name==="role"||i.name==="tabindex")&&(u[i.name]=i.value);let x=[];for(let i of Array.from(t.attributes))i.name.startsWith("on")&&x.push(i.name);let v=lt(t);return{tagName:t.tagName.toLowerCase(),id:t.id||"",className:t.className||"",textContent:(t.textContent||"").trim().slice(0,200),outerHTML:st(t),cssSelector:at(t),xpath:rt(t),computedStyles:s,ancestry:nt(t),componentHint:ot(t),rect:{x:o.x,y:o.y,width:o.width,height:o.height},parentStyles:a,siblings:l,childrenLayout:r,matchedCssRules:c,resolvedClasses:m,viewport:{width:window.innerWidth,height:window.innerHeight},ariaAttributes:u,eventHandlers:x,reactProps:v}}function nt(t,e=5){let s=[],o=t.parentElement;for(;o&&o!==document.body&&s.length<e;){let a=o.tagName.toLowerCase(),l=(typeof o.className=="string"?o.className:"").split(/\s+/).filter(r=>r.length>1&&!r.startsWith("_")).slice(0,3).join(".");s.push(l?`${a}.${l}`:a),o=o.parentElement}return s}function ot(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 l=e[a],r=l?.type?.name||l?.type?.displayName||l?.return?.type?.name||l?.return?.type?.displayName;if(r&&r!=="div"&&r!=="span"&&r.length>1)return r}catch{}e=e.parentElement}return""}function st(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(),l=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
+ `);o=`<${a} ${l}>
377
377
  ${r}
378
378
  ${t.children.length>5?`<!-- +${t.children.length-5} more children -->`:""}
379
- </${a}>`}return o}function st(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 at(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 rt(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 it(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[d,c]of Object.entries(a)){if(r>=10)break;if(d==="children")continue;let u=typeof c;u==="string"||u==="number"||u==="boolean"||c===null?(i[d]=c,r++):u==="function"?(i[d]="[function]",r++):Array.isArray(c)&&(i[d]=`[Array(${c.length})]`,r++)}return Object.keys(i).length>0?i:null}}catch{}return null}function lt(t,e){let s=[],o=(t.className||"").toString().trim().split(/\s+/).filter(Boolean);for(let a of o){let i=CSS.escape(a);for(let r of e)if(r.includes(`.${i}`)&&r.length<200){s.push({className:a,css:r});break}if(s.length>=20)break}return s}var A=null;function Oe(t){A||(A=document.createElement("div"),A.style.cssText=`
379
+ </${a}>`}return o}function at(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 l=s.className.trim().split(/\s+/).filter(r=>!r.startsWith("__")&&r.length<30).slice(0,2).map(r=>CSS.escape(r));l.length>0&&(o+="."+l.join("."))}let a=s.parentElement;if(a){let l=Array.from(a.children).filter(r=>r.tagName===s.tagName);if(l.length>1){let r=l.indexOf(s)+1;o+=`:nth-of-type(${r})`}}e.unshift(o),s=s.parentElement}return e.join(" > ")}function rt(t){let e=[],s=t;for(;s&&s!==document;){if(s.nodeType===Node.ELEMENT_NODE){let o=s,a=1,l=o.previousElementSibling;for(;l;)l.tagName===o.tagName&&a++,l=l.previousElementSibling;e.unshift(`${o.tagName.toLowerCase()}[${a}]`)}s=s.parentNode}return"/"+e.join("/")}function it(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 l=a.cssText;l.length>10&&l.length<500&&e.push(l)}}catch{}}catch{}}catch{}return e.slice(0,15)}function lt(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,l={},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?(l[p]=c,r++):m==="function"?(l[p]="[function]",r++):Array.isArray(c)&&(l[p]=`[Array(${c.length})]`,r++)}return Object.keys(l).length>0?l:null}}catch{}return null}function ct(t,e){let s=[],o=(t.className||"").toString().trim().split(/\s+/).filter(Boolean);for(let a of o){let l=CSS.escape(a);for(let r of e)if(r.includes(`.${l}`)&&r.length<200){s.push({className:a,css:r});break}if(s.length>=20)break}return s}var O=null;function De(t){O||(O=document.createElement("div"),O.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
- `,A.dataset.openmagic="highlight",document.body.appendChild(A)),A.style.left=`${t.x}px`,A.style.top=`${t.y}px`,A.style.width=`${t.width}px`,A.style.height=`${t.height}px`,A.style.display="block"}function De(){A&&(A.style.display="none")}async function Ie(t){try{let e=t||document.body,s=await ct(e);if(s)return{data:s}}catch{}try{let e=await dt(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 ct(t){let e=t.getBoundingClientRect(),s=Math.min(e.width||window.innerWidth,1920),o=Math.min(e.height||window.innerHeight,1080),a=qe(t,0,4);if(!a)return null;let i=`
386
+ `,O.dataset.openmagic="highlight",document.body.appendChild(O)),O.style.left=`${t.x}px`,O.style.top=`${t.y}px`,O.style.width=`${t.width}px`,O.style.height=`${t.height}px`,O.style.display="block"}function Ie(){O&&(O.style.display="none")}async function qe(t){try{let e=t||document.body,s=await dt(e);if(s)return{data:s}}catch{}try{let e=await pt(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 dt(t){let e=t.getBoundingClientRect(),s=Math.min(e.width||window.innerWidth,1920),o=Math.min(e.height||window.innerHeight,1080),a=je(t,0,4);if(!a)return null;let l=`
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"}),d=URL.createObjectURL(r);return new Promise(c=>{let u=new Image,h=document.createElement("canvas"),v=Math.min(window.devicePixelRatio||1,2);h.width=s*v,h.height=o*v,u.onload=()=>{URL.revokeObjectURL(d);let w=h.getContext("2d");if(!w){c(null);return}w.scale(v,v),w.drawImage(u,0,0);try{c(h.toDataURL("image/png",.8))}catch{c(null)}},u.onerror=()=>{URL.revokeObjectURL(d),c(null)},setTimeout(()=>{URL.revokeObjectURL(d),c(null)},5e3),u.src=d})}async function dt(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 qe(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 d of i){let c=a.getPropertyValue(d);c&&c!=="normal"&&c!=="none"&&c!=="auto"&&c!=="0px"&&(r+=`${d}:${c};`)}o.setAttribute("style",r);for(let d=0;d<t.children.length&&d<20;d++){let c=qe(t.children[d],e+1,s);c&&o.appendChild(c)}return o}catch{return null}}var ae=[];var je=!1;function Be(){if(je)return;je=!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,we(i),r}catch(r){throw i.status=0,i.duration=Date.now()-i.timestamp,we(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",()=>{we({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 we(t){t.url.includes("__openmagic__")||(ae.push(t),ae.length>50&&ae.shift())}function ie(){return[...ae]}var re=[],pt=100,ze=!1;function Fe(){if(ze)return;ze=!0;let t=["log","warn","error","info","debug"];for(let e of t){let s=console[e];console[e]=function(...o){re.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()}),re.length>pt&&re.shift(),s.apply(console,o)}}}function le(){return[...re]}function Ue(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:ie().map(s=>({method:s.method,url:s.url,status:s.status,duration:s.duration,timestamp:s.timestamp})),consoleLogs:le().map(s=>({level:s.level,args:s.args,timestamp:s.timestamp}))}}var k={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>'},B={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 de(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 X(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 Me="0.33.5",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},L,C,z,Xe,Le,I;function mt(){try{sessionStorage.setItem("__om_state__",JSON.stringify({messages:n.messages,provider:n.provider,model:n.model,panelOpen:n.panelOpen,activePanel:n.activePanel}))}catch{}}function ut(){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 We(){if(document.querySelector("openmagic-toolbar"))return;ut();let t=document.createElement("openmagic-toolbar");t.dataset.openmagic="true",L=t.attachShadow({mode:"closed"});let e=document.createElement("style");e.textContent=Ce,L.appendChild(e);let s=document.createElement("div");L.appendChild(s),s.innerHTML=ht(),C=s.querySelector(".om-toolbar"),z=s.querySelector(".om-prompt-input"),Xe=s.querySelector(".om-prompt-context"),Le=s.querySelector(".om-panel"),I=s.querySelector(".om-panel-body"),document.body.appendChild(t),gt(s),Lt();try{let r=JSON.parse(localStorage.getItem("__om_pos__")||"");r?.left&&r?.top&&(C.style.left=r.left,C.style.top=r.top,C.style.right="auto",C.style.bottom="auto")}catch{}Be(),Fe(),Ct();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&&xe(i,a).then(()=>(n.connected=!0,pe(),E("config.get"))).then(r=>{let d=r.payload?.provider||"",c=r.payload?.model||"";n.provider=n.provider||d,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?F(n.activePanel):(!n.provider||!n.hasApiKey&&!Object.values(n.configuredProviders).some(Boolean))&&F("settings"),se()}).catch(()=>{n.connected=!1,pe()})}function ht(){return`
393
+ </svg>`,r=new Blob([l],{type:"image/svg+xml;charset=utf-8"}),p=URL.createObjectURL(r);return new Promise(c=>{let m=new Image,u=document.createElement("canvas"),x=Math.min(window.devicePixelRatio||1,2);u.width=s*x,u.height=o*x,m.onload=()=>{URL.revokeObjectURL(p);let v=u.getContext("2d");if(!v){c(null);return}v.scale(x,x),v.drawImage(m,0,0);try{c(u.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 pt(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 je(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),l=["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 l){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=je(t.children[p],e+1,s);c&&o.appendChild(c)}return o}catch{return null}}var re=[];var ze=!1;function Fe(){if(ze)return;ze=!0;let t=window.fetch;window.fetch=async function(...o){let a=new Request(...o),l={method:a.method,url:a.url,timestamp:Date.now()};try{let r=await t.apply(this,o);return l.status=r.status,l.duration=Date.now()-l.timestamp,ke(l),r}catch(r){throw l.status=0,l.duration=Date.now()-l.timestamp,ke(l),r}};let e=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(o,a,...l){return this.__om_method=o,this.__om_url=a,this.__om_start=Date.now(),e.apply(this,[o,a,...l])},XMLHttpRequest.prototype.send=function(...o){return this.addEventListener("loadend",()=>{ke({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 ke(t){t.url.includes("__openmagic__")||(re.push(t),re.length>50&&re.shift())}function le(){return[...re]}var ie=[],mt=100,Be=!1;function Ue(){if(Be)return;Be=!0;let t=["log","warn","error","info","debug"];for(let e of t){let s=console[e];console[e]=function(...o){ie.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()}),ie.length>mt&&ie.shift(),s.apply(console,o)}}}function ce(){return[...ie]}function We(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:le().map(s=>({method:s.method,url:s.url,status:s.status,duration:s.duration,timestamp:s.timestamp})),consoleLogs:ce().map(s=>({level:s.level,args:s.args,timestamp:s.timestamp}))}}var $={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>'},U={openai:{name:"OpenAI",keyUrl:"https://platform.openai.com/api-keys",keyPlaceholder:"sk-...",models:[{id:"gpt-5.4",name:"GPT-5.4"},{id:"gpt-5.4-mini",name:"GPT-5.4 Mini"},{id:"gpt-5.2",name:"GPT-5.2 Thinking"},{id:"o3",name:"o3"},{id:"o4-mini",name:"o4-mini"},{id:"gpt-4.1",name:"GPT-4.1"},{id:"gpt-4.1-mini",name:"GPT-4.1 Mini"}]},anthropic:{name:"Anthropic",keyUrl:"https://console.anthropic.com/settings/keys",keyPlaceholder:"sk-ant-...",models:[{id:"claude-opus-4-6",name:"Claude Opus 4.6"},{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6"},{id:"claude-haiku-4-5-20251001",name:"Claude Haiku 4.5"}]},google:{name:"Google Gemini",keyUrl:"https://aistudio.google.com/apikey",keyPlaceholder:"AIza...",models:[{id:"gemini-3.1-pro-preview",name:"Gemini 3.1 Pro"},{id:"gemini-3-flash-preview",name:"Gemini 3 Flash"},{id:"gemini-2.5-pro",name:"Gemini 2.5 Pro"},{id:"gemini-2.5-flash",name:"Gemini 2.5 Flash"}]},xai:{name:"xAI (Grok)",keyUrl:"https://console.x.ai/team/default/api-keys",keyPlaceholder:"xai-...",models:[{id:"grok-4.20-0309-reasoning",name:"Grok 4.20 Reasoning"},{id:"grok-4-1-fast-non-reasoning",name:"Grok 4.1 Fast"}]},deepseek:{name:"DeepSeek",keyUrl:"https://platform.deepseek.com/api_keys",keyPlaceholder:"sk-...",models:[{id:"deepseek-chat",name:"DeepSeek V3.2"},{id:"deepseek-reasoner",name:"DeepSeek R1"}]},mistral:{name:"Mistral",keyUrl:"https://console.mistral.ai/api-keys",keyPlaceholder:"...",models:[{id:"mistral-large-3-25-12",name:"Mistral Large 3"},{id:"codestral-2508",name:"Codestral"},{id:"devstral-2-25-12",name:"Devstral 2"}]},groq:{name:"Groq",keyUrl:"https://console.groq.com/keys",keyPlaceholder:"gsk_...",models:[{id:"meta-llama/llama-4-scout-17b-16e-instruct",name:"Llama 4 Scout"},{id:"llama-3.3-70b-versatile",name:"Llama 3.3 70B"}]},minimax:{name:"MiniMax",keyUrl:"https://platform.minimax.chat/user-center/basic-information/interface-key",keyPlaceholder:"MiniMax key...",models:[{id:"MiniMax-M2.7",name:"MiniMax M2.7"},{id:"MiniMax-M2.5",name:"MiniMax M2.5"}]},moonshot:{name:"Kimi (Moonshot)",keyUrl:"https://platform.moonshot.cn/console/api-keys",keyPlaceholder:"Moonshot key...",models:[{id:"kimi-k2.5",name:"Kimi K2.5"},{id:"kimi-k2-thinking",name:"Kimi K2 Thinking"}]},qwen:{name:"Qwen (Alibaba)",keyUrl:"https://dashscope.console.aliyun.com/apiKey",keyPlaceholder:"DashScope key...",models:[{id:"qwen3.5-plus",name:"Qwen 3.5 Plus"},{id:"qwen-max",name:"Qwen Max"}]},zhipu:{name:"Zhipu AI (GLM)",keyUrl:"https://open.bigmodel.cn/usercenter/apikeys",keyPlaceholder:"Zhipu key...",models:[{id:"glm-5",name:"GLM-5"},{id:"glm-4.7",name:"GLM-4.7"}]},doubao:{name:"Doubao (ByteDance)",keyUrl:"https://console.volcengine.com/ark/region:ark+cn-beijing/apiKey",keyPlaceholder:"Volcano key...",models:[{id:"doubao-seed-2-0-pro",name:"Doubao Seed 2.0 Pro"},{id:"doubao-seed-2-0-code",name:"Doubao Seed 2.0 Code"}]},ollama:{name:"Ollama (Local)",keyPlaceholder:"not required",local:!0,models:[]},openrouter:{name:"OpenRouter",keyUrl:"https://openrouter.ai/settings/keys",keyPlaceholder:"sk-or-...",models:[]}};function pe(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 Y(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 Le="0.33.6",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},T,P,F,Ye,Te,q;function ut(){try{sessionStorage.setItem("__om_state__",JSON.stringify({messages:n.messages,provider:n.provider,model:n.model,panelOpen:n.panelOpen,activePanel:n.activePanel}))}catch{}}function ht(){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 Ge(){if(document.querySelector("openmagic-toolbar"))return;ht();let t=document.createElement("openmagic-toolbar");t.dataset.openmagic="true",T=t.attachShadow({mode:"closed"});let e=document.createElement("style");e.textContent=He,T.appendChild(e);let s=document.createElement("div");T.appendChild(s),s.innerHTML=gt(),P=s.querySelector(".om-toolbar"),F=s.querySelector(".om-prompt-input"),Ye=s.querySelector(".om-prompt-context"),Te=s.querySelector(".om-panel"),q=s.querySelector(".om-panel-body"),document.body.appendChild(t),ft(s),Tt();try{let r=JSON.parse(localStorage.getItem("__om_pos__")||"");r?.left&&r?.top&&(P.style.left=r.left,P.style.top=r.top,P.style.right="auto",P.style.bottom="auto")}catch{}Fe(),Ue(),Ht();let a=document.querySelector("script[data-openmagic-token]")?.dataset.openmagicToken||window.__OPENMAGIC_TOKEN__,l=parseInt(window.location.port,10)||(window.location.protocol==="https:"?443:80);a&&ve(l,a).then(()=>(n.connected=!0,me(),L("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?W(n.activePanel):(!n.provider||!n.hasApiKey&&!Object.values(n.configuredProviders).some(Boolean))&&W("settings"),ae()}).catch(()=>{n.connected=!1,me()})}function gt(){return`
394
394
  <div class="om-toolbar">
395
395
  <div class="om-toolbar-header">
396
- <span class="om-grab">${k.grip}</span>
396
+ <span class="om-grab">${$.grip}</span>
397
397
  <span class="om-pill-brand">
398
398
  <span class="om-pill-text">\u2728OpenMagic\u{1FA84}</span>
399
399
  </span>
400
400
  <span class="om-pill-divider"></span>
401
- <button class="om-pill-btn" data-action="select" title="Select element">${k.crosshair}</button>
402
- <button class="om-pill-btn" data-action="screenshot" title="Screenshot">${k.camera}</button>
403
- <button class="om-pill-btn" data-action="network" title="Network & Performance">${k.activity}</button>
401
+ <button class="om-pill-btn" data-action="select" title="Select element">${$.crosshair}</button>
402
+ <button class="om-pill-btn" data-action="screenshot" title="Screenshot">${$.camera}</button>
403
+ <button class="om-pill-btn" data-action="network" title="Network & Performance">${$.activity}</button>
404
404
  <span class="om-pill-divider"></span>
405
- <button class="om-pill-btn" data-action="chat" title="Chat">${k.chat}</button>
406
- <button class="om-pill-btn" data-action="settings" title="Settings">${k.settings}</button>
407
- <button class="om-pill-btn" data-action="minimize" title="Minimize">${k.minus}</button>
405
+ <button class="om-pill-btn" data-action="chat" title="Chat">${$.chat}</button>
406
+ <button class="om-pill-btn" data-action="settings" title="Settings">${$.settings}</button>
407
+ <button class="om-pill-btn" data-action="minimize" title="Minimize">${$.minus}</button>
408
408
  <span class="om-status-dot disconnected"></span>
409
409
  </div>
410
410
  <div class="om-panel om-hidden">
411
411
  <div class="om-panel-header">
412
412
  <span class="om-panel-title"></span>
413
- <span class="om-panel-version">v${Me}</span>
414
- <button class="om-panel-bug" data-action="report-issue" title="Report a bug on GitHub">${k.bug}</button>
415
- <button class="om-panel-clear" data-action="clear-chat" title="Clear chat">${k.trash}</button>
416
- <button class="om-panel-close" data-action="close-panel">${k.x}</button>
413
+ <span class="om-panel-version">v${Le}</span>
414
+ <button class="om-panel-bug" data-action="report-issue" title="Report a bug on GitHub">${$.bug}</button>
415
+ <button class="om-panel-clear" data-action="clear-chat" title="Clear chat">${$.trash}</button>
416
+ <button class="om-panel-close" data-action="close-panel">${$.x}</button>
417
417
  </div>
418
418
  <div class="om-panel-body"></div>
419
419
  </div>
@@ -427,37 +427,37 @@
427
427
  <div class="om-prompt-attachments"></div>
428
428
  <div class="om-prompt-row">
429
429
  <div class="om-prompt-context"></div>
430
- <button class="om-prompt-attach" data-action="attach-image" title="Attach image">${k.paperclip}</button>
430
+ <button class="om-prompt-attach" data-action="attach-image" title="Attach image">${$.paperclip}</button>
431
431
  <input class="om-prompt-input" type="text" placeholder="Describe what to change..." autocomplete="off" />
432
- <button class="om-prompt-send" data-action="prompt-send">${k.send}</button>
432
+ <button class="om-prompt-send" data-action="prompt-send">${$.send}</button>
433
433
  <input type="file" class="om-file-input om-hidden" accept="image/*" multiple />
434
434
  </div>
435
- </div>`}function gt(t){t.addEventListener("click",o=>{let a=o.target.closest("[data-action]");if(!a)return;o.preventDefault(),o.stopPropagation();let i=a.dataset.action;xt(i,a)}),t.addEventListener("change",o=>{let a=o.target,i=a.dataset.field;i&&(i==="provider"?(n.provider=a.value,n.model=B[n.provider]?.models[0]?.id||"",n.hasApiKey=n.configuredProviders[n.provider]||B[n.provider]?.local||!1,n.saveStatus="",H()):i==="model"&&(n.model=a.value))}),z.addEventListener("keydown",o=>{o.key==="Enter"&&!o.shiftKey&&(o.preventDefault(),Se())});let e=t.querySelector(".om-file-input");e&&e.addEventListener("change",()=>{$e(e.files),e.value=""});let s=t.querySelector(".om-prompt-row");s&&(s.addEventListener("dragover",o=>{o.preventDefault(),s.style.borderColor="rgba(108, 92, 231, 0.5)"}),s.addEventListener("dragleave",()=>{s.style.borderColor=""}),s.addEventListener("drop",o=>{o.preventDefault(),s.style.borderColor="";let a=o.dataTransfer;a?.files?.length&&$e(a.files)}),z.addEventListener("paste",o=>{let a=o.clipboardData?.items;if(a){for(let i=0;i<a.length;i++)if(a[i].type.startsWith("image/")){let r=a[i].getAsFile();if(r){let d=new DataTransfer;d.items.add(r),$e(d.files)}}}})),_e(o=>{o.type==="reconnected"&&(n.connected=!0,pe())}),document.addEventListener("keydown",o=>{if((o.ctrlKey||o.metaKey)&&o.shiftKey&&(o.key==="O"||o.key==="o")){if(o.preventDefault(),n.minimized){n.minimized=!1,C.querySelectorAll(".om-pill-btn:not([data-action='minimize']), .om-pill-divider, .om-status-dot").forEach(r=>r.style.display="");let i=L.querySelector(".om-prompt-row");i&&i.classList.remove("om-hidden")}else n.panelOpen?me():F("chat");return}if(o.key==="Escape"){if(n.selecting)return;n.panelOpen&&(me(),o.preventDefault())}}),z.addEventListener("keydown",o=>{(o.ctrlKey||o.metaKey)&&o.key==="Enter"&&(o.preventDefault(),Se())})}function Ye(t){return n.roots.length>0?n.roots[0]+"/"+t:t}function ft(t,e){let s=e.split(`
435
+ </div>`}function ft(t){t.addEventListener("click",o=>{let a=o.target.closest("[data-action]");if(!a)return;o.preventDefault(),o.stopPropagation();let l=a.dataset.action;vt(l,a)}),t.addEventListener("change",o=>{let a=o.target,l=a.dataset.field;l&&(l==="provider"?(n.provider=a.value,n.model=U[n.provider]?.models[0]?.id||"",n.hasApiKey=n.configuredProviders[n.provider]||U[n.provider]?.local||!1,n.saveStatus="",N()):l==="model"&&(n.model=a.value))}),F.addEventListener("keydown",o=>{o.key==="Enter"&&!o.shiftKey&&(o.preventDefault(),Ee())});let e=t.querySelector(".om-file-input");e&&e.addEventListener("change",()=>{Se(e.files),e.value=""});let s=t.querySelector(".om-prompt-row");s&&(s.addEventListener("dragover",o=>{o.preventDefault(),s.style.borderColor="rgba(108, 92, 231, 0.5)"}),s.addEventListener("dragleave",()=>{s.style.borderColor=""}),s.addEventListener("drop",o=>{o.preventDefault(),s.style.borderColor="";let a=o.dataTransfer;a?.files?.length&&Se(a.files)}),F.addEventListener("paste",o=>{let a=o.clipboardData?.items;if(a){for(let l=0;l<a.length;l++)if(a[l].type.startsWith("image/")){let r=a[l].getAsFile();if(r){let p=new DataTransfer;p.items.add(r),Se(p.files)}}}})),Re(o=>{o.type==="reconnected"&&(n.connected=!0,me())}),document.addEventListener("keydown",o=>{if((o.ctrlKey||o.metaKey)&&o.shiftKey&&(o.key==="O"||o.key==="o")){if(o.preventDefault(),n.minimized){n.minimized=!1,P.querySelectorAll(".om-pill-btn:not([data-action='minimize']), .om-pill-divider, .om-status-dot").forEach(r=>r.style.display="");let l=T.querySelector(".om-prompt-row");l&&l.classList.remove("om-hidden")}else n.panelOpen?ue():W("chat");return}if(o.key==="Escape"){if(n.selecting)return;n.panelOpen&&(ue(),o.preventDefault())}}),F.addEventListener("keydown",o=>{(o.ctrlKey||o.metaKey)&&o.key==="Enter"&&(o.preventDefault(),Ee())})}function Ze(t){return n.roots.length>0?n.roots[0]+"/"+t:t}function yt(t,e){let s=e.split(`
436
436
  `).map(r=>r.trim()).filter(r=>r.length>0);if(s.length===0)return null;let o=t.split(`
437
- `),a=s[0],i=s[s.length-1];for(let r=0;r<o.length;r++){if(o[r].trim()!==a||r+s.length>o.length)continue;let d=!0;for(let c=0;c<s.length;c++)if(o[r+c].trim()!==s[c]){d=!1;break}if(d){let c=0;for(let h=0;h<r;h++)c+=o[h].length+1;let u=c;for(let h=r;h<r+s.length;h++)u+=o[h].length+1;return u>0&&u<=t.length&&t[u-1]===`
438
- `&&u--,{start:c,end:u}}}return null}async function Ge(t){let e=t.dataset.file,s=t.dataset.search,o=t.dataset.replace;if(!e||!s||!o)return;t.disabled=!0,t.innerHTML='<span class="om-spinner"></span>',t.style.opacity="0.5",t.style.pointerEvents="none";let a=t.closest(".om-diff-card");if(a){let c=a.querySelector(".om-diff-actions");c&&(c.innerHTML='<span class="om-spinner"></span> Applying...')}await new Promise(c=>requestAnimationFrame(c));let i,r;try{i=X(s),r=X(o)}catch{n.messages.push({role:"system",content:`Failed to decode diff data for ${e}`}),H();return}let d=Ye(e);try{if(!i&&r){if((await E("fs.write",{path:d,content:r}))?.payload?.ok===!1)n.messages.push({role:"system",content:`Write failed: ${e}`});else{let m=a?.dataset.diffIdx;m!==void 0?n.messages[parseInt(m)]={role:"system",content:`Created ${e}`}:n.messages.push({role:"system",content:`Created ${e}`})}H(),Y();return}let c,u=d,h=[d];e!==d&&h.push(e);let v=e.split("/").pop()||e,w=n.roots[0]||"",l=w?`${w}/${v}`:v;l!==d&&l!==e&&h.push(l);for(let f of h){let g=(await E("fs.read",{path:f}).catch(()=>null))?.payload?.content;if(g!=null&&String(g).length>0){c=String(g),u=f;break}}if(!c)n.messages.push({role:"system",content:`Could not read ${e} \u2014 tried: ${h.join(", ")}`});else{let f=c.split(i).length-1;if(f===1){let m=await E("fs.write",{path:u,content:c.replace(i,r)});if(m?.payload?.ok===!1)n.messages.push({role:"system",content:`Write failed: ${e} - ${m.payload?.error||"unknown"}`});else{let g=a?.dataset.diffIdx;g!==void 0?n.messages[parseInt(g)]={role:"system",content:`Applied change to ${e}. Reloading...`}:n.messages.push({role:"system",content:`Applied change to ${e}. Reloading...`})}}else if(f>1)n.messages.push({role:"system",content:`Found ${f} exact matches in ${e} \u2014 expected 1. Edit not applied.`});else{let m=ft(c,i);if(m){let g=c.slice(0,m.start)+r+c.slice(m.end),p=await E("fs.write",{path:u,content:g});if(p?.payload?.ok===!1)n.messages.push({role:"system",content:`Write failed: ${e} - ${p.payload?.error||"unknown"}`});else{let b=a?.dataset.diffIdx;b!==void 0?n.messages[parseInt(b)]={role:"system",content:`Applied change to ${e} (fuzzy match). Reloading...`}:n.messages.push({role:"system",content:`Applied change to ${e} (fuzzy match). Reloading...`})}}else n.messages.push({role:"system",content:`No matching code found in ${e}. The file may have changed since the suggestion.`})}}}catch(c){n.messages.push({role:"system",content:`Failed to apply: ${e} \u2014 ${c.message}`})}H(),Y(),setTimeout(()=>{window.location.reload()},1500)}function Ke(t){t.disabled=!0,t.style.opacity="0.5";let e=t.dataset.idx;if(e!==void 0){let s=parseInt(e);try{let o=JSON.parse(X(n.messages[s]?.content.slice(8)||""));n.messages[s]={role:"system",content:`Rejected change to ${o.file||"file"}`}}catch{n.messages[s]={role:"system",content:"Change rejected"}}}H(),Y()}function yt(t){let e=L.querySelector(".om-apply-bar");if(e)if(t>0){e.classList.remove("om-hidden");let s=e.querySelector(".om-apply-bar-text");s&&(s.textContent=`${t} change${t>1?"s":""} ready`)}else e.classList.add("om-hidden")}function Ve(){let t=L.querySelector(".om-apply-bar");t&&t.classList.add("om-hidden")}async function bt(t){let e=t.dataset.file;if(!e)return;let s=Ye(e);try{(await E("fs.undo",{path:s}))?.payload?.ok?n.messages.push({role:"system",content:`Reverted change to ${e}`}):n.messages.push({role:"system",content:`No backup found for ${e}`})}catch{n.messages.push({role:"system",content:`Could not revert ${e} \u2014 backup may not exist`})}H()}function xt(t,e){switch(t){case"select":Et();break;case"screenshot":Mt();break;case"chat":ke("chat");break;case"settings":ke("settings");break;case"close-panel":me();break;case"prompt-send":Se();break;case"save-settings":kt();break;case"get-key":{let s=e.dataset.url;s&&window.open(s,"_blank","noopener");break}case"change-key":{let s=L.querySelector("[data-key-change]");s&&s.classList.remove("om-hidden"),e.style.display="none";break}case"network":ke("chat"),$t();break;case"attach-image":St();break;case"remove-attachment":{let s=parseInt(e.dataset.idx||"0",10);n.attachments.splice(s,1),Te();break}case"apply-diff":Ge(e);break;case"reject-diff":Ke(e);break;case"apply-all":{let s=L.querySelectorAll('[data-action="apply-diff"]');for(let o of Array.from(s))Ge(o);Ve();break}case"reject-all":{let s=L.querySelectorAll('[data-action="reject-diff"]');for(let o of Array.from(s))Ke(o);Ve();break}case"undo-diff":bt(e);break;case"clear-chat":{n.messages=[];try{sessionStorage.removeItem("__om_state__")}catch{}H();break}case"copy-msg":{let s=parseInt(e.dataset.idx||"0",10);e.innerHTML='<span class="om-spinner"></span>',Je(s).then(o=>{try{navigator.clipboard.writeText(o)}catch{}e.innerHTML=k.check,setTimeout(()=>{e.innerHTML=k.copy},1500)});break}case"report-issue":{e.innerHTML='<span class="om-spinner"></span>',Je().then(s=>{try{navigator.clipboard.writeText(s)}catch{}e.innerHTML=k.bug,window.open("https://github.com/Kalmuraee/OpenMagic/issues/new?template=bug_report.yml","_blank","noopener"),n.messages.push({role:"system",content:"Debug info copied to clipboard. Paste it in the Debug Info field on GitHub."}),n.panelOpen&&H()});break}case"clear-element":n.selectedElement=null,oe();break;case"clear-screenshot":n.screenshot=null,oe();break;case"minimize":{n.minimized=!n.minimized;let s=L.querySelector(".om-panel"),o=L.querySelector(".om-prompt-row"),a=L.querySelector(".om-prompt-attachments"),i=C.querySelectorAll(".om-pill-btn:not([data-action='minimize']), .om-pill-divider, .om-status-dot");n.minimized?(s&&s.classList.add("om-hidden"),o&&o.classList.add("om-hidden"),a&&a.classList.add("om-hidden"),i.forEach(r=>r.style.display="none")):(o&&o.classList.remove("om-hidden"),a&&a.classList.remove("om-hidden"),i.forEach(r=>r.style.display=""),n.panelOpen&&n.activePanel&&s&&s.classList.remove("om-hidden"));break}}}function pe(){let t=L.querySelector(".om-status-dot");if(t){let e=n.updateAvailable?"outdated":n.connected?"connected":"disconnected";t.className=`om-status-dot ${e}`,t.setAttribute("title",n.updateAvailable?`v${n.latestVersion} available \u2014 run npx openmagic@latest`:n.connected?"Connected":"Disconnected")}}function se(){L.querySelectorAll(".om-pill-btn").forEach(t=>{let e=t.dataset.action;t.classList.toggle("active",e===n.activePanel||e==="select"&&n.selecting)})}function oe(){let t=[];n.selectedElement&&t.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">${k.x}</button></span>`),n.screenshot&&t.push(`<span class="om-prompt-chip">Screenshot <button class="om-prompt-chip-x" data-action="clear-screenshot">${k.x}</button></span>`),n.attachments.length&&t.push(`<span class="om-prompt-chip">${n.attachments.length} image${n.attachments.length>1?"s":""}</span>`),n.groundedFiles.length&&t.push(`<span class="om-prompt-chip">${n.groundedFiles.length} files grounded</span>`),Xe.innerHTML=t.join("")}function F(t){n.panelOpen=!0,n.activePanel=t,Le.classList.remove("om-hidden");let e=L.querySelector(".om-panel-title");e&&(e.textContent=t==="settings"?"Settings":"Chat"),H(),se()}function me(){n.panelOpen=!1,n.activePanel="",Le.classList.add("om-hidden"),se()}function ke(t){n.panelOpen&&n.activePanel===t?me():F(t)}function H(){n.activePanel==="settings"?I.innerHTML=vt():n.activePanel==="chat"&&(I.innerHTML=wt(),Y()),mt()}function vt(){let t=Object.entries(B).map(([l,f])=>{let g=n.configuredProviders[l]||f.local?" \u2713":"";return`<option value="${l}" ${n.provider===l?"selected":""}>${f.name}${g}</option>`}).join(""),e=B[n.provider],s=e?e.models.map(l=>`<option value="${l.id}" ${n.model===l.id?"selected":""}>${l.name}</option>`).join(""):'<option value="">Select provider first</option>',o=e?.local||!1,a=e?.keyUrl||"",i=e?.keyPlaceholder||"Enter API key...",r=n.configuredProviders[n.provider]||!1,d=n.updateAvailable?`<div class="om-update-banner">v${n.latestVersion} available <code class="om-update-cmd">npx openmagic@latest</code></div>`:"",c=r||o?`<div class="om-status om-status-success">${k.check} ${e?.name||"Provider"} connected</div>`:"",u=n.saveStatus==="saving"?'<span class="om-spinner"></span> Saving...':n.saveStatus==="saved"?`${k.check} Saved`:"Save",h=n.saveStatus==="saving"?"om-btn om-btn-saving":n.saveStatus==="saved"?"om-btn om-btn-saved":"om-btn",v=n.saveStatus==="saving"?"disabled":"",w="";return!o&&n.provider&&(r?w=`
437
+ `),a=s[0],l=s[s.length-1];for(let r=0;r<o.length;r++){if(o[r].trim()!==a||r+s.length>o.length)continue;let p=!0;for(let c=0;c<s.length;c++)if(o[r+c].trim()!==s[c]){p=!1;break}if(p){let c=0;for(let u=0;u<r;u++)c+=o[u].length+1;let m=c;for(let u=r;u<r+s.length;u++)m+=o[u].length+1;return m>0&&m<=t.length&&t[m-1]===`
438
+ `&&m--,{start:c,end:m}}}return null}async function Ke(t){let e=t.dataset.file,s=t.dataset.search,o=t.dataset.replace;if(!e||!s||!o)return;t.disabled=!0,t.innerHTML='<span class="om-spinner"></span>',t.style.opacity="0.5",t.style.pointerEvents="none";let a=t.closest(".om-diff-card");if(a){let c=a.querySelector(".om-diff-actions");c&&(c.innerHTML='<span class="om-spinner"></span> Applying...')}await new Promise(c=>requestAnimationFrame(c));let l,r;try{l=Y(s),r=Y(o)}catch{n.messages.push({role:"system",content:`Failed to decode diff data for ${e}`}),N();return}let p=Ze(e);try{if(!l&&r){if((await L("fs.write",{path:p,content:r}))?.payload?.ok===!1)n.messages.push({role:"system",content:`Write failed: ${e}`});else{let b=a?.dataset.diffIdx;b!==void 0?n.messages[parseInt(b)]={role:"system",content:`Created ${e}`}:n.messages.push({role:"system",content:`Created ${e}`})}N(),Z();return}let c,m=p,u=[p];e!==p&&u.push(e);let x=e.split("/").pop()||e,v=n.roots[0]||"",i=v?`${v}/${x}`:x;i!==p&&i!==e&&u.push(i);for(let y of u){let d=(await L("fs.read",{path:y}).catch(()=>null))?.payload?.content;if(d!=null&&String(d).length>0){c=String(d),m=y;break}}if(!c)n.messages.push({role:"system",content:`Could not read ${e} \u2014 tried: ${u.join(", ")}`});else{let y=c.split(l).length-1;if(y===1){let b=await L("fs.write",{path:m,content:c.replace(l,r)});if(b?.payload?.ok===!1)n.messages.push({role:"system",content:`Write failed: ${e} - ${b.payload?.error||"unknown"}`});else{let d=a?.dataset.diffIdx;d!==void 0?n.messages[parseInt(d)]={role:"system",content:`Applied change to ${e}. Reloading...`}:n.messages.push({role:"system",content:`Applied change to ${e}. Reloading...`})}}else if(y>1)n.messages.push({role:"system",content:`Found ${y} exact matches in ${e} \u2014 expected 1. Edit not applied.`});else{let b=yt(c,l);if(b){let d=c.slice(0,b.start)+r+c.slice(b.end),h=await L("fs.write",{path:m,content:d});if(h?.payload?.ok===!1)n.messages.push({role:"system",content:`Write failed: ${e} - ${h.payload?.error||"unknown"}`});else{let g=a?.dataset.diffIdx;g!==void 0?n.messages[parseInt(g)]={role:"system",content:`Applied change to ${e} (fuzzy match). Reloading...`}:n.messages.push({role:"system",content:`Applied change to ${e} (fuzzy match). Reloading...`})}}else n.messages.push({role:"system",content:`No matching code found in ${e}. The file may have changed since the suggestion.`})}}}catch(c){n.messages.push({role:"system",content:`Failed to apply: ${e} \u2014 ${c.message}`})}N(),Z(),setTimeout(()=>{window.location.reload()},1500)}function Ve(t){t.disabled=!0,t.style.opacity="0.5";let e=t.dataset.idx;if(e!==void 0){let s=parseInt(e);try{let o=JSON.parse(Y(n.messages[s]?.content.slice(8)||""));n.messages[s]={role:"system",content:`Rejected change to ${o.file||"file"}`}}catch{n.messages[s]={role:"system",content:"Change rejected"}}}N(),Z()}function bt(t){let e=T.querySelector(".om-apply-bar");if(e)if(t>0){e.classList.remove("om-hidden");let s=e.querySelector(".om-apply-bar-text");s&&(s.textContent=`${t} change${t>1?"s":""} ready`)}else e.classList.add("om-hidden")}function Je(){let t=T.querySelector(".om-apply-bar");t&&t.classList.add("om-hidden")}async function xt(t){let e=t.dataset.file;if(!e)return;let s=Ze(e);try{(await L("fs.undo",{path:s}))?.payload?.ok?n.messages.push({role:"system",content:`Reverted change to ${e}`}):n.messages.push({role:"system",content:`No backup found for ${e}`})}catch{n.messages.push({role:"system",content:`Could not revert ${e} \u2014 backup may not exist`})}N()}function vt(t,e){switch(t){case"select":Mt();break;case"screenshot":Lt();break;case"chat":$e("chat");break;case"settings":$e("settings");break;case"close-panel":ue();break;case"prompt-send":Ee();break;case"save-settings":$t();break;case"get-key":{let s=e.dataset.url;s&&window.open(s,"_blank","noopener");break}case"change-key":{let s=T.querySelector("[data-key-change]");s&&s.classList.remove("om-hidden"),e.style.display="none";break}case"network":$e("chat"),St();break;case"attach-image":Et();break;case"remove-attachment":{let s=parseInt(e.dataset.idx||"0",10);n.attachments.splice(s,1),Ce();break}case"apply-diff":Ke(e);break;case"reject-diff":Ve(e);break;case"apply-all":{let s=T.querySelectorAll('[data-action="apply-diff"]');for(let o of Array.from(s))Ke(o);Je();break}case"reject-all":{let s=T.querySelectorAll('[data-action="reject-diff"]');for(let o of Array.from(s))Ve(o);Je();break}case"undo-diff":xt(e);break;case"clear-chat":{n.messages=[];try{sessionStorage.removeItem("__om_state__")}catch{}N();break}case"copy-msg":{let s=parseInt(e.dataset.idx||"0",10);e.innerHTML='<span class="om-spinner"></span>',Xe(s).then(o=>{try{navigator.clipboard.writeText(o)}catch{}e.innerHTML=$.check,setTimeout(()=>{e.innerHTML=$.copy},1500)});break}case"report-issue":{e.innerHTML='<span class="om-spinner"></span>',Xe().then(s=>{try{navigator.clipboard.writeText(s)}catch{}e.innerHTML=$.bug,window.open("https://github.com/Kalmuraee/OpenMagic/issues/new?template=bug_report.yml","_blank","noopener"),n.messages.push({role:"system",content:"Debug info copied to clipboard. Paste it in the Debug Info field on GitHub."}),n.panelOpen&&N()});break}case"clear-element":n.selectedElement=null,se();break;case"clear-screenshot":n.screenshot=null,se();break;case"minimize":{n.minimized=!n.minimized;let s=T.querySelector(".om-panel"),o=T.querySelector(".om-prompt-row"),a=T.querySelector(".om-prompt-attachments"),l=P.querySelectorAll(".om-pill-btn:not([data-action='minimize']), .om-pill-divider, .om-status-dot");n.minimized?(s&&s.classList.add("om-hidden"),o&&o.classList.add("om-hidden"),a&&a.classList.add("om-hidden"),l.forEach(r=>r.style.display="none")):(o&&o.classList.remove("om-hidden"),a&&a.classList.remove("om-hidden"),l.forEach(r=>r.style.display=""),n.panelOpen&&n.activePanel&&s&&s.classList.remove("om-hidden"));break}}}function me(){let t=T.querySelector(".om-status-dot");if(t){let e=n.updateAvailable?"outdated":n.connected?"connected":"disconnected";t.className=`om-status-dot ${e}`,t.setAttribute("title",n.updateAvailable?`v${n.latestVersion} available \u2014 run npx openmagic@latest`:n.connected?"Connected":"Disconnected")}}function ae(){T.querySelectorAll(".om-pill-btn").forEach(t=>{let e=t.dataset.action;t.classList.toggle("active",e===n.activePanel||e==="select"&&n.selecting)})}function se(){let t=[];n.selectedElement&&t.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">${$.x}</button></span>`),n.screenshot&&t.push(`<span class="om-prompt-chip">Screenshot <button class="om-prompt-chip-x" data-action="clear-screenshot">${$.x}</button></span>`),n.attachments.length&&t.push(`<span class="om-prompt-chip">${n.attachments.length} image${n.attachments.length>1?"s":""}</span>`),n.groundedFiles.length&&t.push(`<span class="om-prompt-chip">${n.groundedFiles.length} files grounded</span>`),Ye.innerHTML=t.join("")}function W(t){n.panelOpen=!0,n.activePanel=t,Te.classList.remove("om-hidden");let e=T.querySelector(".om-panel-title");e&&(e.textContent=t==="settings"?"Settings":"Chat"),N(),ae()}function ue(){n.panelOpen=!1,n.activePanel="",Te.classList.add("om-hidden"),ae()}function $e(t){n.panelOpen&&n.activePanel===t?ue():W(t)}function N(){n.activePanel==="settings"?q.innerHTML=wt():n.activePanel==="chat"&&(q.innerHTML=kt(),Z()),ut()}function wt(){let t=Object.entries(U).map(([i,y])=>{let d=n.configuredProviders[i]||y.local?" \u2713":"";return`<option value="${i}" ${n.provider===i?"selected":""}>${y.name}${d}</option>`}).join(""),e=U[n.provider],s=e?e.models.map(i=>`<option value="${i.id}" ${n.model===i.id?"selected":""}>${i.name}</option>`).join(""):'<option value="">Select provider first</option>',o=e?.local||!1,a=e?.keyUrl||"",l=e?.keyPlaceholder||"Enter API key...",r=n.configuredProviders[n.provider]||!1,p=n.updateAvailable?`<div class="om-update-banner">v${n.latestVersion} available <code class="om-update-cmd">npx openmagic@latest</code></div>`:"",c=r||o?`<div class="om-status om-status-success">${$.check} ${e?.name||"Provider"} connected</div>`:"",m=n.saveStatus==="saving"?'<span class="om-spinner"></span> Saving...':n.saveStatus==="saved"?`${$.check} Saved`:"Save",u=n.saveStatus==="saving"?"om-btn om-btn-saving":n.saveStatus==="saved"?"om-btn om-btn-saved":"om-btn",x=n.saveStatus==="saving"?"disabled":"",v="";return!o&&n.provider&&(r?v=`
439
439
  <div class="om-field">
440
440
  <label class="om-label">API Key</label>
441
441
  <div class="om-key-configured">
442
- ${k.check} <span>Key configured</span>
442
+ ${$.check} <span>Key configured</span>
443
443
  <button class="om-btn-change-key" data-action="change-key">Change</button>
444
444
  </div>
445
445
  <div class="om-key-change-row om-hidden" data-key-change>
446
446
  <div class="om-key-row">
447
- <input type="text" class="om-input om-key-input" data-field="apiKey" placeholder="${i}" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true" data-form-type="other" />
448
- ${a?`<button class="om-btn-get-key" data-action="get-key" data-url="${a}">${k.externalLink} Get key</button>`:""}
447
+ <input type="text" class="om-input om-key-input" data-field="apiKey" placeholder="${l}" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true" data-form-type="other" />
448
+ ${a?`<button class="om-btn-get-key" data-action="get-key" data-url="${a}">${$.externalLink} Get key</button>`:""}
449
449
  </div>
450
450
  </div>
451
- </div>`:w=`
451
+ </div>`:v=`
452
452
  <div class="om-field">
453
453
  <label class="om-label">API Key</label>
454
454
  <div class="om-key-row">
455
- <input type="text" class="om-input om-key-input" data-field="apiKey" placeholder="${i}" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true" data-form-type="other" />
456
- ${a?`<button class="om-btn-get-key" data-action="get-key" data-url="${a}">${k.externalLink} Get key</button>`:""}
455
+ <input type="text" class="om-input om-key-input" data-field="apiKey" placeholder="${l}" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" data-lpignore="true" data-1p-ignore="true" data-form-type="other" />
456
+ ${a?`<button class="om-btn-get-key" data-action="get-key" data-url="${a}">${$.externalLink} Get key</button>`:""}
457
457
  </div>
458
458
  ${a?`<div class="om-key-hint"><a data-action="get-key" data-url="${a}">Get your ${e?.name||""} API key here</a></div>`:""}
459
459
  </div>`),`
460
- ${d}
460
+ ${p}
461
461
  <div class="om-settings">
462
462
  <div class="om-field">
463
463
  <label class="om-label">Provider</label>
@@ -467,31 +467,31 @@
467
467
  <label class="om-label">Model</label>
468
468
  <select class="om-select" data-field="model"><option value="">Select Model...</option>${s}</select>
469
469
  </div>
470
- ${w}
471
- <button class="${h}" data-action="save-settings" ${v}>${u}</button>
470
+ ${v}
471
+ <button class="${u}" data-action="save-settings" ${x}>${m}</button>
472
472
  ${c}
473
- </div>`}function wt(){if(!n.provider||!n.hasApiKey&&!B[n.provider]?.local)return'<div class="om-status om-status-error">Configure your provider in Settings first</div>';let t=n.messages.map((o,a)=>{if(o.content.startsWith("__DIFFGROUP__"))return"";if(o.content.startsWith("__DIFF__"))try{let r=JSON.parse(X(o.content.slice(8))),d=r.type==="create"||!r.search&&r.replace,c=de(r.search||""),u=de(r.replace||"");return`<div class="om-diff-card" data-diff-idx="${a}">
474
- <div class="om-diff-file">${q(d?"Create new file":"Edit")}: ${q(r.file)}</div>
475
- ${r.search?`<div class="om-diff-removed">${q(r.search.slice(0,200))}</div>`:""}
476
- <div class="om-diff-added">${q((r.replace||"").slice(0,300))}</div>
473
+ </div>`}function kt(){if(!n.provider||!n.hasApiKey&&!U[n.provider]?.local)return'<div class="om-status om-status-error">Configure your provider in Settings first</div>';let t=n.messages.map((o,a)=>{if(o.content.startsWith("__DIFFGROUP__"))return"";if(o.content.startsWith("__DIFF__"))try{let r=JSON.parse(Y(o.content.slice(8))),p=r.type==="create"||!r.search&&r.replace,c=pe(r.search||""),m=pe(r.replace||"");return`<div class="om-diff-card" data-diff-idx="${a}">
474
+ <div class="om-diff-file">${z(p?"Create new file":"Edit")}: ${z(r.file)}</div>
475
+ ${r.search?`<div class="om-diff-removed">${z(r.search.slice(0,200))}</div>`:""}
476
+ <div class="om-diff-added">${z((r.replace||"").slice(0,300))}</div>
477
477
  <div class="om-diff-actions">
478
- <button class="om-btn om-btn-sm" data-action="apply-diff" data-file="${q(r.file)}" data-search="${c}" data-replace="${u}">Apply</button>
478
+ <button class="om-btn om-btn-sm" data-action="apply-diff" data-file="${z(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">${q(o.content)} <button class="om-undo-btn" data-action="undo-diff" data-file="${q(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">${k.copy}</button>`:"";return o.role==="assistant"?`<div class="om-msg om-msg-assistant">${Tt(o.content)}${i}</div>`:`<div class="om-msg om-msg-${o.role}">${q(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 Y(){requestAnimationFrame(()=>{let t=I.querySelector(".om-chat-messages");t&&(t.scrollTop=t.scrollHeight)})}async function kt(){let e=I.querySelector('[data-field="apiKey"]')?.value||"";if(!n.provider){n.saveStatus="error",ce(),setTimeout(()=>{n.saveStatus="",H()},2e3);return}if(!ve()){n.saveStatus="error",ce();let o=I.querySelector('[data-action="save-settings"]');o&&(o.innerHTML="Not connected - check terminal"),setTimeout(()=>{n.saveStatus="",H()},3e3);return}let s={provider:n.provider,model:n.model};e&&(s.apiKey=e),n.saveStatus="saving",ce();try{let o=await Promise.race([E("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",ce(),setTimeout(()=>{n.saveStatus="",n.activePanel==="settings"&&F("chat")},1200)}catch(o){n.saveStatus="error";let a=I.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="",H()},4e3)}}function ce(){let t=I.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=`${k.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 Se(){let t=z.value.trim();if(!t||n.streaming)return;if(!n.provider||!n.hasApiKey&&!B[n.provider]?.local){F("settings");return}n.messages.push({role:"user",content:t}),n.streaming=!0,n.streamContent="",z.value="",F("chat");let e=Ue(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=I.querySelector(".om-msg-assistant:last-child");i&&(i.innerHTML='<span class="om-spinner"></span> Reading project files...');try{let c=await E("fs.list",{});c?.payload?.projectTree&&(e.projectTree=c.payload.projectTree);let h=(c?.payload?.files||[]).filter(y=>y.type==="file"&&a.test(y.path)),v=[t];if(n.selectedElement&&(n.selectedElement.id&&v.push(n.selectedElement.id),n.selectedElement.className&&v.push(n.selectedElement.className),n.selectedElement.textContent&&v.push(n.selectedElement.textContent.slice(0,100)),n.selectedElement.componentHint&&v.push(n.selectedElement.componentHint),n.selectedElement.ancestry))for(let y of n.selectedElement.ancestry)v.push(y);let w=v.filter(Boolean).join(" ").toLowerCase().split(/[^a-z0-9_-]+/).filter(y=>y.length>=2&&!["the","to","in","of","and","div","span","class","style"].includes(y)),f=window.location.pathname.split("/").filter(y=>y.length>1&&!/^\d+$/.test(y)),m=h.map(y=>{let x=0,$=y.path.toLowerCase(),N=$.replace(/\([^)]+\)\//g,"");for(let M of f)N.includes(M.toLowerCase())&&(x+=15);if(n.selectedElement?.componentHint){let M=n.selectedElement.componentHint.toLowerCase();$.includes(M)&&(x+=12)}for(let M of w)$.includes(M)&&(x+=5);return/(component|page|route|layout|template|view)/.test($)&&(x+=3),/page\.[jt]sx?$|layout\.[jt]sx?$|\+page\.svelte$/.test($)&&(x+=5),{...y,score:x}}).sort((y,x)=>x.score-y.score),g=[],p=new Set,b=0;for(let y of m.slice(0,s)){if(y.score<=0||b>=o)break;try{let x=n.roots[0]||"",$=x?`${x}/${y.path}`:y.path,N=await E("fs.read",{path:$}),M=String(N?.payload?.content||"");if(!M)continue;let _=Math.min(8e3,o-b),W=M.slice(0,_);M.length>_&&(W+=`
482
- // [FILE TRUNCATED \u2014 showing ${_} of ${M.length} chars]`),g.push({path:y.path,content:W}),p.add(y.path),b+=W.length;let Z=y.path.replace(/\.[^.]+$/,""),Ze=[".module.css",".module.scss",".css",".scss",".styles.ts"];for(let Q of Ze){let S=Z+Q;if(p.has(S)||b>=o)continue;if(h.find(j=>j.path===S)){try{let j=await E("fs.read",{path:x?`${x}/${S}`:S}),T=String(j?.payload?.content||"");if(T){let G=Math.min(4e3,o-b),P=T.slice(0,G);T.length>G&&(P+=`
483
- // [FILE TRUNCATED \u2014 showing ${G} of ${T.length} chars]`),g.push({path:S,content:P}),p.add(S),b+=P.length}}catch{}break}}if(g.length<=2&&b<o){let Q=["layout.tsx","layout.jsx","layout.js","layout.ts"],S=y.path.replace(/\/[^/]+$/,""),O=0;for(;S&&O<4&&b<o;){let j=!1;for(let G of Q){let P=`${S}/${G}`;if(p.has(P)){j=!0;break}try{let K=await E("fs.read",{path:x?`${x}/${P}`:P}).catch(()=>null),U=String(K?.payload?.content||"");if(U){let V=Math.min(4e3,o-b),he=U.slice(0,V);U.length>V&&(he+=`
484
- // [TRUNCATED]`),g.push({path:P,content:he}),p.add(P),b+=he.length,j=!0;break}}catch{}}let T=S.replace(/\/[^/]+$/,"");if(T===S||!T)break;S=T,O++}}let Qe=M.matchAll(/(?:import|from)\s+['"]\.?\.\/([\w/.-]+)['"]/g);for(let Q of Qe){if(b>=o)break;let S=Q[1],O=y.path.replace(/\/[^/]+$/,""),j=[`${O}/${S}`,`${O}/${S}.tsx`,`${O}/${S}.ts`,`${O}/${S}.jsx`,`${O}/${S}.js`,`${O}/${S}/index.tsx`,`${O}/${S}/index.ts`];for(let T of j){if(p.has(T))break;if(h.find(P=>P.path===T)){try{let P=await E("fs.read",{path:x?`${x}/${T}`:T}),K=String(P?.payload?.content||"");if(K){let U=Math.min(8e3,o-b),V=K.slice(0,U);K.length>U&&(V+=`
485
- // [FILE TRUNCATED \u2014 showing ${U} of ${K.length} chars]`),g.push({path:T,content:V}),p.add(T),b+=V.length}}catch{}break}}}}catch{}}if(b<o)try{let y=n.roots[0]||"",x=await E("fs.read",{path:y?`${y}/package.json`:"package.json"}),$=String(x?.payload?.content||"");if($)try{let N=JSON.parse($),M={...N.dependencies,...N.devDependencies},_=JSON.stringify(M,null,2);g.push({path:"package.json (dependencies)",content:_.slice(0,2e3)})}catch{g.push({path:"package.json",content:$.slice(0,2e3)})}}catch{}if(b<o){let y=n.roots[0]||"",x=["tailwind.config.ts","tailwind.config.js","tailwind.config.mjs","src/app/globals.css","src/styles/globals.css","styles/globals.css","app/globals.css","src/index.css","src/global.css"];for(let $ of x)if(!(b>=o||p.has($)))try{let N=y?`${y}/${$}`:$,M=await E("fs.read",{path:N}).catch(()=>null),_=String(M?.payload?.content||"");if(_){let W=Math.min(4e3,o-b),Z=_.slice(0,W);_.length>W&&(Z+=`
486
- /* [TRUNCATED] */`),g.push({path:$,content:Z}),p.add($),b+=Z.length}}catch{}}if(g.length){e.files=g;let y=g.map(x=>x.path.split("/").pop()).join(", ");i&&(i.innerHTML=`<span class="om-spinner"></span> Thinking... (${g.length} files: ${y})`)}n.groundedFiles=g.map(y=>y.path)}catch{}let r=4,d=0;try{for(;d<=r;){n.streamContent="";let c=await Ne("llm.chat",{provider:n.provider,model:n.model,messages:n.messages.map(m=>({role:m.role,content:m.content})),context:e},m=>{n.streamContent+=m}),u=n.streamContent||c?.content||"",h=u;try{let m=JSON.parse(u);m.explanation&&(h=m.explanation)}catch{let m=u.match(/```(?:json)?\s*([\s\S]*?)```/);if(m)try{let g=JSON.parse(m[1]);g.explanation&&(h=g.explanation)}catch{}}let v=h.match(/NEED_FILE:\s*"?([^\s"}\]]+)"?/)||h.match(/(?:need|provide|show|read|see|contents?\s+of)\s+(?:the\s+)?(?:file\s+)?[`"']?([a-zA-Z0-9_/.@-]+\.[a-z]{1,5})[`"']?/i)||h.match(/(?:source\s+(?:file|code)\s+(?:for|of|at))\s+[`"']?([a-zA-Z0-9_/.@-]+\.[a-z]{1,5})[`"']?/i);if(v&&d<r){let m=v[1].trim();d++;let g=I.querySelector(".om-msg-assistant:last-child");g&&(g.innerHTML=`<span class="om-spinner"></span> Reading ${m}...`);try{let p=n.roots[0]||"",b=p?`${p}/${m}`:m,y,x=[b];m!==b&&x.push(m);let $=m.split("/").pop()||m,N=p?`${p}/${$}`:$;N!==b&&N!==m&&x.push(N);for(let M of x){let _=await E("fs.read",{path:M}).catch(()=>null);if(_?.payload?.content){y=String(_.payload.content);break}}if(y)e.files||(e.files=[]),e.files.push({path:m,content:y.slice(0,8e3)});else{n.messages.push({role:"system",content:`Could not read ${m}`});break}}catch{n.messages.push({role:"system",content:`File not found: ${m}`});break}continue}let w=h.match(/SEARCH_FILES:\s*"([^"]+)"(?:\s+in\s+(\S+))?/)||u.match(/SEARCH_FILES:\s*\\?"([^"\\]+)\\?"(?:\s+in\s+(\S+))?/),l=e.searchResults?.some(m=>m.query===w?.[1]);if(w&&d<r&&!l){let m=w[1],g=w[2]||"";d++;let p=I.querySelector(".om-msg-assistant:last-child");p&&(p.innerHTML=`<span class="om-spinner"></span> Searching: "${m}"...`);try{let y=(await Promise.race([E("fs.grep",{pattern:m,path:g}),new Promise((x,$)=>setTimeout(()=>$(new Error("grep timeout")),5e3))]))?.payload?.results||[];y.length&&(e.searchResults||(e.searchResults=[]),e.searchResults.push({query:m,matches:y}))}catch{}continue}let f=h;if(n.messages.push({role:"assistant",content:f}),c?.modifications?.length){let m=Math.random().toString(36).slice(2),g=c.modifications.filter(p=>p.type==="edit"&&p.file&&p.search&&p.replace||p.type==="create"&&p.file&&p.content);yt(g.length);for(let p of c.modifications)if(p.type==="edit"&&p.file&&p.search&&p.replace){let b=Math.random().toString(36).slice(2),y=JSON.stringify({id:b,file:p.file,search:p.search,replace:p.replace,groupId:m});n.messages.push({role:"system",content:`__DIFF__${de(y)}`})}else if(p.type==="create"&&p.file&&p.content){let b=Math.random().toString(36).slice(2),y=JSON.stringify({id:b,file:p.file,search:"",replace:p.content,type:"create",groupId:m});n.messages.push({role:"system",content:`__DIFF__${de(y)}`})}else p.type==="delete"&&p.file&&n.messages.push({role:"system",content:`LLM proposed deleting ${p.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=[],Te(),H(),Y()}function $t(){let t=window.performance,e=t.getEntriesByType("navigation")[0],s=t.getEntriesByType("paint"),o=t.getEntriesByType("resource").slice(-20),a=ie(),i=le(),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 d=s.find(c=>c.name==="first-contentful-paint");if(d&&r.push(`FCP: ${Math.round(d.startTime)}ms`),o.length){let c=o.filter(h=>h.initiatorType==="fetch"||h.initiatorType==="xmlhttprequest"),u=c.length>0?c:o;r.push(`
487
- All network requests (${u.length}):`);for(let h of u.slice(-30)){let v=h.name.length>80?"..."+h.name.slice(-77):h.name,w=h.responseStatus||"";r.push(` ${Math.round(h.duration)}ms ${w?`[${w}]`:""} ${v}`)}}if(a.length){r.push(`
488
- 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(h=>h.level==="error"),u=i.filter(h=>h.level==="warn");c.length&&r.push(`
489
- Console errors: ${c.length}`),u.length&&r.push(`Console warnings: ${u.length}`)}if(o.length>5){let c=[...o].sort((u,h)=>h.duration-u.duration).slice(0,5);r.push(`
490
- Slowest resources:`);for(let u of c)r.push(` ${Math.round(u.duration)}ms \u2014 ${u.name.split("/").pop()?.slice(0,60)}`)}n.messages.push({role:"system",content:r.join(`
491
- `)}),H(),Y(),oe()}function St(){let t=L.querySelector(".om-file-input");t&&t.click()}function $e(t){if(t)for(let e=0;e<t.length&&n.attachments.length<5;e++){let s=t[e];if(!s.type.startsWith("image/")||s.size>10*1024*1024)continue;let o=new FileReader;o.onload=()=>{typeof o.result=="string"&&(n.attachments.push(o.result),Te())},o.readAsDataURL(s)}}function Te(){let t=L.querySelector(".om-prompt-attachments");if(t){if(!n.attachments.length){t.innerHTML="",t.classList.add("om-hidden");return}t.classList.remove("om-hidden"),t.innerHTML=n.attachments.map((e,s)=>`<div class="om-attachment-thumb">
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">${z(o.content)} <button class="om-undo-btn" data-action="undo-diff" data-file="${z(r)}">Undo</button></div>`}let l=o.role==="user"||o.role==="assistant"?`<button class="om-copy-btn" data-action="copy-msg" data-idx="${a}" title="Copy">${$.copy}</button>`:"";return o.role==="assistant"?`<div class="om-msg om-msg-assistant">${Ct(o.content)}${l}</div>`:`<div class="om-msg om-msg-${o.role}">${z(o.content)}${l}</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 Z(){requestAnimationFrame(()=>{let t=q.querySelector(".om-chat-messages");t&&(t.scrollTop=t.scrollHeight)})}async function $t(){let e=q.querySelector('[data-field="apiKey"]')?.value||"";if(!n.provider){n.saveStatus="error",de(),setTimeout(()=>{n.saveStatus="",N()},2e3);return}if(!we()){n.saveStatus="error",de();let o=q.querySelector('[data-action="save-settings"]');o&&(o.innerHTML="Not connected - check terminal"),setTimeout(()=>{n.saveStatus="",N()},3e3);return}let s={provider:n.provider,model:n.model};e&&(s.apiKey=e),n.saveStatus="saving",de();try{let o=await Promise.race([L("config.set",s),new Promise((a,l)=>setTimeout(()=>l(new Error("Save timed out")),8e3))]);e&&n.provider&&(n.configuredProviders[n.provider]=!0),n.hasApiKey=!!(e||n.configuredProviders[n.provider]),n.saveStatus="saved",de(),setTimeout(()=>{n.saveStatus="",n.activePanel==="settings"&&W("chat")},1200)}catch(o){n.saveStatus="error";let a=q.querySelector('[data-action="save-settings"]'),l=(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=l,a.className="om-btn",a.disabled=!1),setTimeout(()=>{n.saveStatus="",N()},4e3)}}function de(){let t=q.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=`${$.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 Ee(){let t=F.value.trim();if(!t||n.streaming)return;if(!n.provider||!n.hasApiKey&&!U[n.provider]?.local){W("settings");return}n.messages.push({role:"user",content:t}),n.streaming=!0,n.streamContent="",F.value="",W("chat");let e=We(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,l=q.querySelector(".om-msg-assistant:last-child");l&&(l.innerHTML='<span class="om-spinner"></span> Reading project files...');try{let m=await L("fs.list",{});m?.payload?.projectTree&&(e.projectTree=m.payload.projectTree);let x=(m?.payload?.files||[]).filter(f=>f.type==="file"&&a.test(f.path)),v=[t];if(n.selectedElement&&(n.selectedElement.id&&v.push(n.selectedElement.id),n.selectedElement.className&&v.push(n.selectedElement.className),n.selectedElement.textContent&&v.push(n.selectedElement.textContent.slice(0,100)),n.selectedElement.componentHint&&v.push(n.selectedElement.componentHint),n.selectedElement.ancestry))for(let f of n.selectedElement.ancestry)v.push(f);let i=v.filter(Boolean).join(" ").toLowerCase().split(/[^a-z0-9_-]+/).filter(f=>f.length>=2&&!["the","to","in","of","and","div","span","class","style"].includes(f)),b=window.location.pathname.split("/").filter(f=>f.length>1&&!/^\d+$/.test(f)),d=x.map(f=>{let k=0,S=f.path.toLowerCase(),R=S.replace(/\([^)]+\)\//g,"");for(let E of b)R.includes(E.toLowerCase())&&(k+=15);if(n.selectedElement?.componentHint){let E=n.selectedElement.componentHint.toLowerCase();S.includes(E)&&(k+=12)}for(let E of i)S.includes(E)&&(k+=5);return/(component|page|route|layout|template|view)/.test(S)&&(k+=3),/page\.[jt]sx?$|layout\.[jt]sx?$|\+page\.svelte$/.test(S)&&(k+=5),{...f,score:k}}).sort((f,k)=>k.score-f.score),h=[],g=new Set,w=0;for(let f of d.slice(0,s)){if(f.score<=0||w>=o)break;try{let k=n.roots[0]||"",S=k?`${k}/${f.path}`:f.path,R=await L("fs.read",{path:S}),E=String(R?.payload?.content||"");if(!E)continue;let C=Math.min(8e3,o-w),j=E.slice(0,C);E.length>C&&(j+=`
482
+ // [FILE TRUNCATED \u2014 showing ${C} of ${E.length} chars]`),h.push({path:f.path,content:j}),g.add(f.path),w+=j.length;let Q=f.path.replace(/\.[^.]+$/,""),Qe=[".module.css",".module.scss",".css",".scss",".styles.ts"];for(let ee of Qe){let M=Q+ee;if(g.has(M)||w>=o)continue;if(x.find(B=>B.path===M)){try{let B=await L("fs.read",{path:k?`${k}/${M}`:M}),H=String(B?.payload?.content||"");if(H){let K=Math.min(4e3,o-w),_=H.slice(0,K);H.length>K&&(_+=`
483
+ // [FILE TRUNCATED \u2014 showing ${K} of ${H.length} chars]`),h.push({path:M,content:_}),g.add(M),w+=_.length}}catch{}break}}if(h.length<=2&&w<o){let ee=["layout.tsx","layout.jsx","layout.js","layout.ts"],M=f.path.replace(/\/[^/]+$/,""),D=0;for(;M&&D<4&&w<o;){let B=!1;for(let K of ee){let _=`${M}/${K}`;if(g.has(_)){B=!0;break}try{let V=await L("fs.read",{path:k?`${k}/${_}`:_}).catch(()=>null),G=String(V?.payload?.content||"");if(G){let J=Math.min(4e3,o-w),ge=G.slice(0,J);G.length>J&&(ge+=`
484
+ // [TRUNCATED]`),h.push({path:_,content:ge}),g.add(_),w+=ge.length,B=!0;break}}catch{}}let H=M.replace(/\/[^/]+$/,"");if(H===M||!H)break;M=H,D++}}let et=E.matchAll(/(?:import|from)\s+['"]\.?\.\/([\w/.-]+)['"]/g);for(let ee of et){if(w>=o)break;let M=ee[1],D=f.path.replace(/\/[^/]+$/,""),B=[`${D}/${M}`,`${D}/${M}.tsx`,`${D}/${M}.ts`,`${D}/${M}.jsx`,`${D}/${M}.js`,`${D}/${M}/index.tsx`,`${D}/${M}/index.ts`];for(let H of B){if(g.has(H))break;if(x.find(_=>_.path===H)){try{let _=await L("fs.read",{path:k?`${k}/${H}`:H}),V=String(_?.payload?.content||"");if(V){let G=Math.min(8e3,o-w),J=V.slice(0,G);V.length>G&&(J+=`
485
+ // [FILE TRUNCATED \u2014 showing ${G} of ${V.length} chars]`),h.push({path:H,content:J}),g.add(H),w+=J.length}}catch{}break}}}}catch{}}if(w<o)try{let f=n.roots[0]||"",k=await L("fs.read",{path:f?`${f}/package.json`:"package.json"}),S=String(k?.payload?.content||"");if(S)try{let R=JSON.parse(S),E={...R.dependencies,...R.devDependencies},C=JSON.stringify(E,null,2);h.push({path:"package.json (dependencies)",content:C.slice(0,2e3)})}catch{h.push({path:"package.json",content:S.slice(0,2e3)})}}catch{}if(w<o){let f=n.roots[0]||"",k=["tailwind.config.ts","tailwind.config.js","tailwind.config.mjs","src/app/globals.css","src/styles/globals.css","styles/globals.css","app/globals.css","src/index.css","src/global.css"];for(let S of k)if(!(w>=o||g.has(S)))try{let R=f?`${f}/${S}`:S,E=await L("fs.read",{path:R}).catch(()=>null),C=String(E?.payload?.content||"");if(C){let j=Math.min(4e3,o-w),Q=C.slice(0,j);C.length>j&&(Q+=`
486
+ /* [TRUNCATED] */`),h.push({path:S,content:Q}),g.add(S),w+=Q.length}}catch{}}if(h.length){e.files=h;let f=h.map(k=>k.path.split("/").pop()).join(", ");l&&(l.innerHTML=`<span class="om-spinner"></span> Thinking... (${h.length} files: ${f})`)}n.groundedFiles=h.map(f=>f.path)}catch{}let r=4,p=0,c=new Set;try{for(;p<=r;){n.streamContent="";let m=await _e("llm.chat",{provider:n.provider,model:n.model,messages:n.messages.map(d=>({role:d.role,content:d.content})),context:e},d=>{n.streamContent+=d}),u=n.streamContent||m?.content||"",x=u;try{let d=JSON.parse(u);d.explanation&&(x=d.explanation)}catch{let d=u.match(/```(?:json)?\s*([\s\S]*?)```/);if(d)try{let h=JSON.parse(d[1]);h.explanation&&(x=h.explanation)}catch{}}let v=x.match(/NEED_FILE:\s*"?([^\s"}\]]+)"?/)||x.match(/(?:need|provide|show|read|see|contents?\s+of)\s+(?:the\s+)?(?:file\s+)?[`"']?([a-zA-Z0-9_/.@-]+\.[a-z]{1,5})[`"']?/i)||x.match(/(?:source\s+(?:file|code)\s+(?:for|of|at))\s+[`"']?([a-zA-Z0-9_/.@-]+\.[a-z]{1,5})[`"']?/i)||u.match(/NEED_FILE:\s*\\?"?([^\s"\\}\]]+)"?/);if(v&&p<r&&!c.has(v[1].trim())){let d=v[1].trim();c.add(d),p++;let h=q.querySelector(".om-msg-assistant:last-child");h&&(h.innerHTML=`<span class="om-spinner"></span> Reading ${d}...`);try{let g=n.roots[0]||"",w=g?`${g}/${d}`:d,f,k=[w];d!==w&&k.push(d);let S=d.split("/").pop()||d,R=g?`${g}/${S}`:S;R!==w&&R!==d&&k.push(R);for(let E of k){let C=await L("fs.read",{path:E}).catch(()=>null);if(C?.payload?.content){f=String(C.payload.content);break}}if(f){e.files||(e.files=[]);let E=e.files.findIndex(j=>j.path===d||j.path.endsWith("/"+d)||d.endsWith("/"+j.path)),C=f.slice(0,16e3);E>=0?e.files[E]={path:d,content:C}:e.files.push({path:d,content:C})}else{n.messages.push({role:"system",content:`Could not read ${d}`});break}}catch{n.messages.push({role:"system",content:`File not found: ${d}`});break}continue}let i=x.match(/SEARCH_FILES:\s*"([^"]+)"(?:\s+in\s+(\S+))?/)||u.match(/SEARCH_FILES:\s*\\?"([^"\\]+)\\?"(?:\s+in\s+(\S+))?/),y=e.searchResults?.some(d=>d.query===i?.[1]);if(i&&p<r&&!y){let d=i[1],h=i[2]||"";p++;let g=q.querySelector(".om-msg-assistant:last-child");g&&(g.innerHTML=`<span class="om-spinner"></span> Searching: "${d}"...`);try{let f=(await Promise.race([L("fs.grep",{pattern:d,path:h}),new Promise((k,S)=>setTimeout(()=>S(new Error("grep timeout")),5e3))]))?.payload?.results||[];f.length&&(e.searchResults||(e.searchResults=[]),e.searchResults.push({query:d,matches:f}))}catch{}continue}let b=x;if(n.messages.push({role:"assistant",content:b}),m?.modifications?.length){let d=Math.random().toString(36).slice(2),h=m.modifications.filter(g=>g.type==="edit"&&g.file&&g.search&&g.replace||g.type==="create"&&g.file&&g.content);bt(h.length);for(let g of m.modifications)if(g.type==="edit"&&g.file&&g.search&&g.replace){let w=Math.random().toString(36).slice(2),f=JSON.stringify({id:w,file:g.file,search:g.search,replace:g.replace,groupId:d});n.messages.push({role:"system",content:`__DIFF__${pe(f)}`})}else if(g.type==="create"&&g.file&&g.content){let w=Math.random().toString(36).slice(2),f=JSON.stringify({id:w,file:g.file,search:"",replace:g.content,type:"create",groupId:d});n.messages.push({role:"system",content:`__DIFF__${pe(f)}`})}else g.type==="delete"&&g.file&&n.messages.push({role:"system",content:`LLM proposed deleting ${g.file} \u2014 skipped (use edit with search/replace instead)`})}break}}catch(m){n.messages.push({role:"system",content:`Error: ${m.message}`})}n.streaming=!1,n.streamContent="",n.attachments=[],Ce(),N(),Z()}function St(){let t=window.performance,e=t.getEntriesByType("navigation")[0],s=t.getEntriesByType("paint"),o=t.getEntriesByType("resource").slice(-20),a=le(),l=ce(),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(u=>u.initiatorType==="fetch"||u.initiatorType==="xmlhttprequest"),m=c.length>0?c:o;r.push(`
487
+ All network requests (${m.length}):`);for(let u of m.slice(-30)){let x=u.name.length>80?"..."+u.name.slice(-77):u.name,v=u.responseStatus||"";r.push(` ${Math.round(u.duration)}ms ${v?`[${v}]`:""} ${x}`)}}if(a.length){r.push(`
488
+ 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(l.length){let c=l.filter(u=>u.level==="error"),m=l.filter(u=>u.level==="warn");c.length&&r.push(`
489
+ Console errors: ${c.length}`),m.length&&r.push(`Console warnings: ${m.length}`)}if(o.length>5){let c=[...o].sort((m,u)=>u.duration-m.duration).slice(0,5);r.push(`
490
+ Slowest resources:`);for(let m of c)r.push(` ${Math.round(m.duration)}ms \u2014 ${m.name.split("/").pop()?.slice(0,60)}`)}n.messages.push({role:"system",content:r.join(`
491
+ `)}),N(),Z(),se()}function Et(){let t=T.querySelector(".om-file-input");t&&t.click()}function Se(t){if(t)for(let e=0;e<t.length&&n.attachments.length<5;e++){let s=t[e];if(!s.type.startsWith("image/")||s.size>10*1024*1024)continue;let o=new FileReader;o.onload=()=>{typeof o.result=="string"&&(n.attachments.push(o.result),Ce())},o.readAsDataURL(s)}}function Ce(){let t=T.querySelector(".om-prompt-attachments");if(t){if(!n.attachments.length){t.innerHTML="",t.classList.add("om-hidden");return}t.classList.remove("om-hidden"),t.innerHTML=n.attachments.map((e,s)=>`<div class="om-attachment-thumb">
492
492
  <img src="${e}" alt="attachment" />
493
- <button class="om-attachment-remove" data-action="remove-attachment" data-idx="${s}">${k.x}</button>
494
- </div>`).join("")}}var te=null,ne=null;function Et(){n.selecting?Ee():ue()}function ue(){n.selecting=!0,document.body.style.cursor="crosshair",se(),ne=e=>{let s=e.target;if(s.closest("openmagic-toolbar")||s.dataset?.openmagic)return;let o=s.getBoundingClientRect();Oe({x:o.x,y:o.y,width:o.width,height:o.height})},te=e=>{e.preventDefault(),e.stopPropagation();let s=e.target;s.closest("openmagic-toolbar")||s.dataset?.openmagic||(n.selectedElement=Ae(s),Ee(),oe(),z.focus())};let t=e=>{e.key==="Escape"&&Ee()};document.addEventListener("mousemove",ne,!0),document.addEventListener("click",te,!0),document.addEventListener("keydown",t,!0),ue._escHandler=t}function Ee(){n.selecting=!1,document.body.style.cursor="",De(),ne&&(document.removeEventListener("mousemove",ne,!0),ne=null),te&&(document.removeEventListener("click",te,!0),te=null);let t=ue._escHandler;t&&(document.removeEventListener("keydown",t,!0),ue._escHandler=null),se()}async function Mt(){let t;try{let o=n.selectedElement?.cssSelector?.trim();o&&(t=document.querySelector(o)||void 0)}catch{}let e=await Ie(t||void 0);e.data&&e.data.length>5e3?(n.screenshot=e.data,oe(),z.focus()):(n.messages.push({role:"system",content:"Take a screenshot manually (Cmd+Shift+4 on Mac, Win+Shift+S on Windows), then paste it here (Ctrl+V) or drag it onto the prompt bar."}),F("chat"),H())}function Lt(){let t=!1,e=0,s=0,o=0,a=0;C.addEventListener("mousedown",i=>{let r=i.target;if(r.closest("[data-action]")||!r.closest(".om-grab")&&!r.closest(".om-pill-brand"))return;t=!0,e=i.clientX,s=i.clientY;let d=C.getBoundingClientRect();o=d.left,a=d.top,i.preventDefault()}),document.addEventListener("mousemove",i=>{t&&(C.style.left=o+i.clientX-e+"px",C.style.top=a+i.clientY-s+"px",C.style.right="auto",C.style.bottom="auto")}),document.addEventListener("mouseup",()=>{if(t){t=!1;try{localStorage.setItem("__om_pos__",JSON.stringify({left:C.style.left,top:C.style.top}))}catch{}}})}function q(t){let e=document.createElement("div");return e.textContent=t,e.innerHTML}function Tt(t){let e=t.replace(/\\n/g,`
495
- `),s=q(e);return s=s.replace(/```(\w*)\n([\s\S]*?)```/g,'<pre class="om-code-block"><code>$2</code></pre>'),s=s.replace(/`([^`]+)`/g,'<code class="om-inline-code">$1</code>'),s=s.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),s=s.replace(/([^*]|^)\*([^*]+)\*([^*]|$)/g,"$1<em>$2</em>$3"),s=s.replace(/^- (.+)$/gm,"&#8226; $1"),s=s.replace(/\n/g,"<br>"),s}async function Je(t){let e=[],s=null;try{ve()&&(s=(await Promise.race([E("debug.logs"),new Promise((f,m)=>setTimeout(()=>m(new Error("timeout")),3e3))]))?.payload||null)}catch{}e.push("## Environment"),e.push(""),e.push(`- **OpenMagic**: v${Me}${n.updateAvailable?` (v${n.latestVersion} available)`:""}`),e.push(`- **Browser**: ${navigator.userAgent}`),e.push(`- **Platform**: ${navigator.platform}`),e.push(`- **Viewport**: ${window.innerWidth}x${window.innerHeight} (devicePixelRatio: ${window.devicePixelRatio})`),e.push(`- **Page URL**: ${window.location.href}`),e.push(`- **Page Title**: ${document.title}`),s&&(e.push(`- **Node.js**: ${s.nodeVersion} (${s.platform}/${s.arch})`),e.push(`- **Server PID**: ${s.pid}`),e.push(`- **Server Uptime**: ${s.uptime}s`),e.push(`- **Server Memory**: ${s.memoryMB}MB RSS`),e.push(`- **Server CWD**: ${s.cwd}`)),e.push(""),e.push("## Configuration"),e.push(""),e.push(`- **WebSocket**: ${n.connected?"connected":"disconnected"}`),e.push(`- **Provider**: ${B[n.provider]?.name||n.provider||"not set"}`),e.push(`- **Model**: ${n.model||"not set"}`),e.push(`- **API Key Set**: ${n.hasApiKey?"yes":"no"}`);let o=Object.entries(n.configuredProviders).filter(([,l])=>l).map(([l])=>B[l]?.name||l);if(o.length&&e.push(`- **Configured Providers**: ${o.join(", ")}`),n.roots.length&&e.push(`- **Project Roots**: ${n.roots.join(", ")}`),n.selectedElement){let l=n.selectedElement;e.push(""),e.push("## Selected Element"),e.push(""),e.push(`- **Selector**: \`${l.cssSelector||""}\``),e.push(`- **Tag**: \`${l.tagName}\``),l.id&&e.push(`- **ID**: \`${l.id}\``),l.className&&e.push(`- **Class**: \`${l.className}\``),l.componentHint&&e.push(`- **Component**: \`${l.componentHint}\``),l.ancestry?.length&&e.push(`- **Ancestry**: ${l.ancestry.join(" > ")}`),l.textContent&&e.push(`- **Text**: ${l.textContent.slice(0,150)}`)}if(n.groundedFiles.length){e.push(""),e.push("## Files Sent to LLM"),e.push("");for(let l of n.groundedFiles)e.push(`- \`${l}\``)}let a=[];for(let l of n.messages)if(l.content.startsWith("__DIFF__"))try{let f=JSON.parse(X(l.content.slice(8)));a.push({file:f.file,type:f.type||"edit"})}catch{}if(a.length){e.push(""),e.push("## Proposed Changes"),e.push("");for(let l of a)e.push(`- \`${l.file}\` (${l.type})`)}let i=n.messages.filter(l=>l.role==="system"&&(l.content.startsWith("Applied change to ")||l.content.startsWith("Rejected change to ")||l.content.startsWith("Reverted change to ")||l.content.startsWith("Created ")||l.content.startsWith("Change rejected")||l.content.startsWith("No matching code")||l.content.startsWith("Write failed")||l.content.startsWith("Could not read")));if(i.length){e.push(""),e.push("## Applied/Rejected Changes"),e.push("");for(let l of i)e.push(`- ${l.content.slice(0,200)}`)}let r=window.performance,d=r.getEntriesByType("navigation")[0],c=r.getEntriesByType("paint");if(d){e.push(""),e.push("## Page Performance"),e.push(""),e.push(`- **Page Load**: ${Math.round(d.loadEventEnd-d.startTime)}ms`),e.push(`- **DOM Ready**: ${Math.round(d.domContentLoadedEventEnd-d.startTime)}ms`),e.push(`- **TTFB**: ${Math.round(d.responseStart-d.startTime)}ms`);let l=c.find(f=>f.name==="first-contentful-paint");l&&e.push(`- **FCP**: ${Math.round(l.startTime)}ms`)}let u=le();if(u.length){let l=u.filter(g=>g.level==="error"),f=u.filter(g=>g.level==="warn"),m=u.filter(g=>g.level==="log"||g.level==="info"||g.level==="debug");if(e.push(""),e.push("## Browser Console"),e.push(""),e.push(`Total: ${u.length} entries (${l.length} errors, ${f.length} warnings, ${m.length} log/info/debug)`),l.length){e.push(""),e.push(`### Errors (${l.length})`),e.push("```");for(let g of l.slice(-15))e.push(`[${new Date(g.timestamp).toISOString()}] ${g.args.map(p=>String(p)).join(" ").slice(0,300)}`);e.push("```")}if(f.length){e.push(""),e.push(`### Warnings (${f.length})`),e.push("```");for(let g of f.slice(-10))e.push(`[${new Date(g.timestamp).toISOString()}] ${g.args.map(p=>String(p)).join(" ").slice(0,200)}`);e.push("```")}if(m.length){e.push(""),e.push("<details><summary>Log/Info/Debug ("+m.length+" entries)</summary>"),e.push(""),e.push("```");for(let g of m.slice(-30))e.push(`[${new Date(g.timestamp).toISOString()}] [${g.level}] ${g.args.map(p=>String(p)).join(" ").slice(0,200)}`);e.push("```"),e.push("</details>")}}let h=ie(),v=h.filter(l=>l.status&&l.status>=400),w=h.filter(l=>l.duration&&l.duration>2e3);if(v.length||w.length){if(e.push(""),e.push("## Network Issues"),e.push(""),v.length){e.push(`### Failed Requests (${v.length})`),e.push("```");for(let l of v.slice(-15))e.push(`${l.method} ${l.url.slice(0,120)} \u2192 ${l.status} (${l.duration||"?"}ms)`);e.push("```")}if(w.length){e.push(`### Slow Requests >2s (${w.length})`),e.push("```");for(let l of w.slice(-10))e.push(`${l.method} ${l.url.slice(0,120)} \u2192 ${l.status} (${l.duration}ms)`);e.push("```")}}if(s?.logs?.length){let l=s.logs,f=l.filter(p=>p.level==="error"),m=l.filter(p=>p.level==="warn"),g=l.filter(p=>p.level==="log"||p.level==="info");if(e.push(""),e.push("## Server Logs (Terminal)"),e.push(""),e.push(`Total: ${l.length} entries (${f.length} errors, ${m.length} warnings, ${g.length} log/info)`),f.length){e.push(""),e.push(`### Server Errors (${f.length})`),e.push("```");for(let p of f.slice(-15))e.push(`[${new Date(p.ts).toISOString()}] ${p.msg.slice(0,300)}`);e.push("```")}if(m.length){e.push(""),e.push(`### Server Warnings (${m.length})`),e.push("```");for(let p of m.slice(-10))e.push(`[${new Date(p.ts).toISOString()}] ${p.msg.slice(0,200)}`);e.push("```")}e.push(""),e.push("<details><summary>All server logs ("+l.length+" entries)</summary>"),e.push(""),e.push("```");for(let p of l.slice(-50))e.push(`[${new Date(p.ts).toISOString()}] [${p.level}] ${p.msg.slice(0,200)}`);e.push("```"),e.push("</details>")}if(n.messages.length){e.push(""),e.push("## Chat History"),e.push(""),e.push("<details><summary>Full conversation ("+n.messages.length+" messages)</summary>"),e.push(""),e.push("```");for(let l of n.messages)if(!l.content.startsWith("__DIFFGROUP__")){if(l.content.startsWith("__DIFF__")){try{let f=JSON.parse(X(l.content.slice(8)));e.push(`[diff] ${f.type||"edit"}: ${f.file}`),f.search&&e.push(` - search: ${f.search.slice(0,100)}...`),f.replace&&e.push(` + replace: ${f.replace.slice(0,100)}...`)}catch{e.push("[diff] (parse error)")}continue}e.push(`[${l.role}] ${l.content.slice(0,500)}`)}e.push("```"),e.push("</details>")}if(t!==void 0){let l=n.messages[t];l&&(e.push(""),e.push("## Copied Message"),e.push(""),e.push("```"),e.push(`[${l.role}] ${l.content.slice(0,2e3)}`),e.push("```"))}return e.join(`
496
- `)}function Ct(){fetch("https://registry.npmjs.org/openmagic/latest",{headers:{Accept:"application/json"},signal:AbortSignal.timeout(5e3)}).then(t=>t.ok?t.json():null).then(t=>{if(!t||typeof t.version!="string"||!/^\d+\.\d+\.\d+/.test(t.version))return;let e=t.version.split(".").map(Number),s=Me.split(".").map(Number);for(let o=0;o<3;o++){if((e[o]||0)>(s[o]||0)){n.updateAvailable=!0,n.latestVersion=t.version,Ht();return}if((e[o]||0)<(s[o]||0))return}}).catch(()=>{})}function Ht(){pe()}typeof window<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",We):We());})();
493
+ <button class="om-attachment-remove" data-action="remove-attachment" data-idx="${s}">${$.x}</button>
494
+ </div>`).join("")}}var ne=null,oe=null;function Mt(){n.selecting?Me():he()}function he(){n.selecting=!0,document.body.style.cursor="crosshair",ae(),oe=e=>{let s=e.target;if(s.closest("openmagic-toolbar")||s.dataset?.openmagic)return;let o=s.getBoundingClientRect();De({x:o.x,y:o.y,width:o.width,height:o.height})},ne=e=>{e.preventDefault(),e.stopPropagation();let s=e.target;s.closest("openmagic-toolbar")||s.dataset?.openmagic||(n.selectedElement=Oe(s),Me(),se(),F.focus())};let t=e=>{e.key==="Escape"&&Me()};document.addEventListener("mousemove",oe,!0),document.addEventListener("click",ne,!0),document.addEventListener("keydown",t,!0),he._escHandler=t}function Me(){n.selecting=!1,document.body.style.cursor="",Ie(),oe&&(document.removeEventListener("mousemove",oe,!0),oe=null),ne&&(document.removeEventListener("click",ne,!0),ne=null);let t=he._escHandler;t&&(document.removeEventListener("keydown",t,!0),he._escHandler=null),ae()}async function Lt(){let t;try{let o=n.selectedElement?.cssSelector?.trim();o&&(t=document.querySelector(o)||void 0)}catch{}let e=await qe(t||void 0);e.data&&e.data.length>5e3?(n.screenshot=e.data,se(),F.focus()):(n.messages.push({role:"system",content:"Take a screenshot manually (Cmd+Shift+4 on Mac, Win+Shift+S on Windows), then paste it here (Ctrl+V) or drag it onto the prompt bar."}),W("chat"),N())}function Tt(){let t=!1,e=0,s=0,o=0,a=0;P.addEventListener("mousedown",l=>{let r=l.target;if(r.closest("[data-action]")||!r.closest(".om-grab")&&!r.closest(".om-pill-brand"))return;t=!0,e=l.clientX,s=l.clientY;let p=P.getBoundingClientRect();o=p.left,a=p.top,l.preventDefault()}),document.addEventListener("mousemove",l=>{t&&(P.style.left=o+l.clientX-e+"px",P.style.top=a+l.clientY-s+"px",P.style.right="auto",P.style.bottom="auto")}),document.addEventListener("mouseup",()=>{if(t){t=!1;try{localStorage.setItem("__om_pos__",JSON.stringify({left:P.style.left,top:P.style.top}))}catch{}}})}function z(t){let e=document.createElement("div");return e.textContent=t,e.innerHTML}function Ct(t){let e=t.replace(/\\n/g,`
495
+ `),s=z(e);return s=s.replace(/```(\w*)\n([\s\S]*?)```/g,'<pre class="om-code-block"><code>$2</code></pre>'),s=s.replace(/`([^`]+)`/g,'<code class="om-inline-code">$1</code>'),s=s.replace(/\*\*([^*]+)\*\*/g,"<strong>$1</strong>"),s=s.replace(/([^*]|^)\*([^*]+)\*([^*]|$)/g,"$1<em>$2</em>$3"),s=s.replace(/^- (.+)$/gm,"&#8226; $1"),s=s.replace(/\n/g,"<br>"),s}async function Xe(t){let e=[],s=null;try{we()&&(s=(await Promise.race([L("debug.logs"),new Promise((y,b)=>setTimeout(()=>b(new Error("timeout")),3e3))]))?.payload||null)}catch{}e.push("## Environment"),e.push(""),e.push(`- **OpenMagic**: v${Le}${n.updateAvailable?` (v${n.latestVersion} available)`:""}`),e.push(`- **Browser**: ${navigator.userAgent}`),e.push(`- **Platform**: ${navigator.platform}`),e.push(`- **Viewport**: ${window.innerWidth}x${window.innerHeight} (devicePixelRatio: ${window.devicePixelRatio})`),e.push(`- **Page URL**: ${window.location.href}`),e.push(`- **Page Title**: ${document.title}`),s&&(e.push(`- **Node.js**: ${s.nodeVersion} (${s.platform}/${s.arch})`),e.push(`- **Server PID**: ${s.pid}`),e.push(`- **Server Uptime**: ${s.uptime}s`),e.push(`- **Server Memory**: ${s.memoryMB}MB RSS`),e.push(`- **Server CWD**: ${s.cwd}`)),e.push(""),e.push("## Configuration"),e.push(""),e.push(`- **WebSocket**: ${n.connected?"connected":"disconnected"}`),e.push(`- **Provider**: ${U[n.provider]?.name||n.provider||"not set"}`),e.push(`- **Model**: ${n.model||"not set"}`),e.push(`- **API Key Set**: ${n.hasApiKey?"yes":"no"}`);let o=Object.entries(n.configuredProviders).filter(([,i])=>i).map(([i])=>U[i]?.name||i);if(o.length&&e.push(`- **Configured Providers**: ${o.join(", ")}`),n.roots.length&&e.push(`- **Project Roots**: ${n.roots.join(", ")}`),n.selectedElement){let i=n.selectedElement;e.push(""),e.push("## Selected Element"),e.push(""),e.push(`- **Selector**: \`${i.cssSelector||""}\``),e.push(`- **Tag**: \`${i.tagName}\``),i.id&&e.push(`- **ID**: \`${i.id}\``),i.className&&e.push(`- **Class**: \`${i.className}\``),i.componentHint&&e.push(`- **Component**: \`${i.componentHint}\``),i.ancestry?.length&&e.push(`- **Ancestry**: ${i.ancestry.join(" > ")}`),i.textContent&&e.push(`- **Text**: ${i.textContent.slice(0,150)}`)}if(n.groundedFiles.length){e.push(""),e.push("## Files Sent to LLM"),e.push("");for(let i of n.groundedFiles)e.push(`- \`${i}\``)}let a=[];for(let i of n.messages)if(i.content.startsWith("__DIFF__"))try{let y=JSON.parse(Y(i.content.slice(8)));a.push({file:y.file,type:y.type||"edit"})}catch{}if(a.length){e.push(""),e.push("## Proposed Changes"),e.push("");for(let i of a)e.push(`- \`${i.file}\` (${i.type})`)}let l=n.messages.filter(i=>i.role==="system"&&(i.content.startsWith("Applied change to ")||i.content.startsWith("Rejected change to ")||i.content.startsWith("Reverted change to ")||i.content.startsWith("Created ")||i.content.startsWith("Change rejected")||i.content.startsWith("No matching code")||i.content.startsWith("Write failed")||i.content.startsWith("Could not read")));if(l.length){e.push(""),e.push("## Applied/Rejected Changes"),e.push("");for(let i of l)e.push(`- ${i.content.slice(0,200)}`)}let r=window.performance,p=r.getEntriesByType("navigation")[0],c=r.getEntriesByType("paint");if(p){e.push(""),e.push("## Page Performance"),e.push(""),e.push(`- **Page Load**: ${Math.round(p.loadEventEnd-p.startTime)}ms`),e.push(`- **DOM Ready**: ${Math.round(p.domContentLoadedEventEnd-p.startTime)}ms`),e.push(`- **TTFB**: ${Math.round(p.responseStart-p.startTime)}ms`);let i=c.find(y=>y.name==="first-contentful-paint");i&&e.push(`- **FCP**: ${Math.round(i.startTime)}ms`)}let m=ce();if(m.length){let i=m.filter(d=>d.level==="error"),y=m.filter(d=>d.level==="warn"),b=m.filter(d=>d.level==="log"||d.level==="info"||d.level==="debug");if(e.push(""),e.push("## Browser Console"),e.push(""),e.push(`Total: ${m.length} entries (${i.length} errors, ${y.length} warnings, ${b.length} log/info/debug)`),i.length){e.push(""),e.push(`### Errors (${i.length})`),e.push("```");for(let d of i.slice(-15))e.push(`[${new Date(d.timestamp).toISOString()}] ${d.args.map(h=>String(h)).join(" ").slice(0,300)}`);e.push("```")}if(y.length){e.push(""),e.push(`### Warnings (${y.length})`),e.push("```");for(let d of y.slice(-10))e.push(`[${new Date(d.timestamp).toISOString()}] ${d.args.map(h=>String(h)).join(" ").slice(0,200)}`);e.push("```")}if(b.length){e.push(""),e.push("<details><summary>Log/Info/Debug ("+b.length+" entries)</summary>"),e.push(""),e.push("```");for(let d of b.slice(-30))e.push(`[${new Date(d.timestamp).toISOString()}] [${d.level}] ${d.args.map(h=>String(h)).join(" ").slice(0,200)}`);e.push("```"),e.push("</details>")}}let u=le(),x=u.filter(i=>i.status&&i.status>=400),v=u.filter(i=>i.duration&&i.duration>2e3);if(x.length||v.length){if(e.push(""),e.push("## Network Issues"),e.push(""),x.length){e.push(`### Failed Requests (${x.length})`),e.push("```");for(let i of x.slice(-15))e.push(`${i.method} ${i.url.slice(0,120)} \u2192 ${i.status} (${i.duration||"?"}ms)`);e.push("```")}if(v.length){e.push(`### Slow Requests >2s (${v.length})`),e.push("```");for(let i of v.slice(-10))e.push(`${i.method} ${i.url.slice(0,120)} \u2192 ${i.status} (${i.duration}ms)`);e.push("```")}}if(s?.logs?.length){let i=s.logs,y=i.filter(h=>h.level==="error"),b=i.filter(h=>h.level==="warn"),d=i.filter(h=>h.level==="log"||h.level==="info");if(e.push(""),e.push("## Server Logs (Terminal)"),e.push(""),e.push(`Total: ${i.length} entries (${y.length} errors, ${b.length} warnings, ${d.length} log/info)`),y.length){e.push(""),e.push(`### Server Errors (${y.length})`),e.push("```");for(let h of y.slice(-15))e.push(`[${new Date(h.ts).toISOString()}] ${h.msg.slice(0,300)}`);e.push("```")}if(b.length){e.push(""),e.push(`### Server Warnings (${b.length})`),e.push("```");for(let h of b.slice(-10))e.push(`[${new Date(h.ts).toISOString()}] ${h.msg.slice(0,200)}`);e.push("```")}e.push(""),e.push("<details><summary>All server logs ("+i.length+" entries)</summary>"),e.push(""),e.push("```");for(let h of i.slice(-50))e.push(`[${new Date(h.ts).toISOString()}] [${h.level}] ${h.msg.slice(0,200)}`);e.push("```"),e.push("</details>")}if(n.messages.length){e.push(""),e.push("## Chat History"),e.push(""),e.push("<details><summary>Full conversation ("+n.messages.length+" messages)</summary>"),e.push(""),e.push("```");for(let i of n.messages)if(!i.content.startsWith("__DIFFGROUP__")){if(i.content.startsWith("__DIFF__")){try{let y=JSON.parse(Y(i.content.slice(8)));e.push(`[diff] ${y.type||"edit"}: ${y.file}`),y.search&&e.push(` - search: ${y.search.slice(0,100)}...`),y.replace&&e.push(` + replace: ${y.replace.slice(0,100)}...`)}catch{e.push("[diff] (parse error)")}continue}e.push(`[${i.role}] ${i.content.slice(0,500)}`)}e.push("```"),e.push("</details>")}if(t!==void 0){let i=n.messages[t];i&&(e.push(""),e.push("## Copied Message"),e.push(""),e.push("```"),e.push(`[${i.role}] ${i.content.slice(0,2e3)}`),e.push("```"))}return e.join(`
496
+ `)}function Ht(){fetch("https://registry.npmjs.org/openmagic/latest",{headers:{Accept:"application/json"},signal:AbortSignal.timeout(5e3)}).then(t=>t.ok?t.json():null).then(t=>{if(!t||typeof t.version!="string"||!/^\d+\.\d+\.\d+/.test(t.version))return;let e=t.version.split(".").map(Number),s=Le.split(".").map(Number);for(let o=0;o<3;o++){if((e[o]||0)>(s[o]||0)){n.updateAvailable=!0,n.latestVersion=t.version,Pt();return}if((e[o]||0)<(s[o]||0))return}}).catch(()=>{})}function Pt(){me()}typeof window<"u"&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",Ge):Ge());})();
497
497
  //# sourceMappingURL=index.global.js.map