openmagic 0.21.0 → 0.23.0

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