openmagic 0.33.6 → 0.33.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -372,7 +372,7 @@
|
|
|
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 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
|
|
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 _e(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)}),_e({id:a,type:t,payload:e})})}function Ne(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")))}),_e({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
376
|
`);o=`<${a} ${l}>
|
|
377
377
|
${r}
|
|
378
378
|
${t.children.length>5?`<!-- +${t.children.length-5} more children -->`:""}
|
|
@@ -390,7 +390,7 @@
|
|
|
390
390
|
${a.outerHTML}
|
|
391
391
|
</div>
|
|
392
392
|
</foreignObject>
|
|
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`
|
|
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 Fe=!1;function Be(){if(Fe)return;Fe=!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,ze=!1;function Ue(){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){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.7",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,B,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"),B=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{}Be(),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
396
|
<span class="om-grab">${$.grip}</span>
|
|
@@ -432,10 +432,10 @@
|
|
|
432
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 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="",
|
|
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="",_()):l==="model"&&(n.model=a.value))}),B.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)}),B.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())}}),B.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
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}`}),
|
|
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}`}),_();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}`})}_(),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}`})}_(),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"}}}_(),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`})}_()}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{}_();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&&_()});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"),_(),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.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">
|
|
@@ -471,27 +471,27 @@
|
|
|
471
471
|
<button class="${u}" data-action="save-settings" ${x}>${m}</button>
|
|
472
472
|
${c}
|
|
473
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">${
|
|
475
|
-
${r.search?`<div class="om-diff-removed">${
|
|
476
|
-
<div class="om-diff-added">${
|
|
474
|
+
<div class="om-diff-file">${F(p?"Create new file":"Edit")}: ${F(r.file)}</div>
|
|
475
|
+
${r.search?`<div class="om-diff-removed">${F(r.search.slice(0,200))}</div>`:""}
|
|
476
|
+
<div class="om-diff-added">${F((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="${
|
|
478
|
+
<button class="om-btn om-btn-sm" data-action="apply-diff" data-file="${F(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">${
|
|
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(
|
|
483
|
-
// [FILE TRUNCATED \u2014 showing ${K} of ${H.length} chars]`),h.push({path:M,content:
|
|
484
|
-
// [TRUNCATED]`),h.push({path:
|
|
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(
|
|
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
|
|
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">${F(o.content)} <button class="om-undo-btn" data-action="undo-diff" data-file="${F(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}">${F(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="",_()},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="",_()},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="",_()},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=B.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="",B.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(z=>z.path===M)){try{let z=await L("fs.read",{path:k?`${k}/${M}`:M}),H=String(z?.payload?.content||"");if(H){let K=Math.min(4e3,o-w),N=H.slice(0,K);H.length>K&&(N+=`
|
|
483
|
+
// [FILE TRUNCATED \u2014 showing ${K} of ${H.length} chars]`),h.push({path:M,content:N}),g.add(M),w+=N.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 z=!1;for(let K of ee){let N=`${M}/${K}`;if(g.has(N)){z=!0;break}try{let V=await L("fs.read",{path:k?`${k}/${N}`:N}).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:N,content:ge}),g.add(N),w+=ge.length,z=!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(/\/[^/]+$/,""),z=[`${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 z){if(g.has(H))break;if(x.find(N=>N.path===H)){try{let N=await L("fs.read",{path:k?`${k}/${H}`:H}),V=String(N?.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(12e3,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 Ne("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((/^NEED_FILE:\s/m.test(b)||/^SEARCH_FILES:\s/m.test(b))&&(b="I found the relevant files but couldn't determine the exact change needed. Try selecting a more specific element or describing the issue in more detail."),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(),_(),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
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
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
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
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
|
-
`)}),
|
|
491
|
+
`)}),_(),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
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(),
|
|
495
|
-
`),s=
|
|
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(),B.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(),B.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"),_())}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 F(t){let e=document.createElement("div");return e.textContent=t,e.innerHTML}function Ct(t){let e=t.replace(/\\n/g,`
|
|
495
|
+
`),s=F(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,"• $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
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
|