@youweichen/pi-web-ui 0.45.2 → 0.46.1
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.
- package/dist/server/agent-service.js +43 -2
- package/dist/server/plugin-updater.js +20 -1
- package/package.json +1 -1
- package/web/dist/assets/{TerminalPanel-DTPa-GPY.js → TerminalPanel-C3kNAJrw.js} +1 -1
- package/web/dist/assets/{abnfDiagram-VCTEODGH-3OBIjZzo.js → abnfDiagram-VCTEODGH-Dkf6Vjk6.js} +1 -1
- package/web/dist/assets/{arc-QnNbtI3G.js → arc-DGaqRXHk.js} +1 -1
- package/web/dist/assets/{architectureDiagram-5GKGNRK7-BRC6l1C0.js → architectureDiagram-5GKGNRK7-CDibpnZt.js} +1 -1
- package/web/dist/assets/{blockDiagram-I7D4REHJ-QtokGhle.js → blockDiagram-I7D4REHJ-iPzBDys9.js} +1 -1
- package/web/dist/assets/{c4Diagram-7LVT6UL2-DrXgUAH_.js → c4Diagram-7LVT6UL2-C7WHEzTt.js} +1 -1
- package/web/dist/assets/channel-DZHqEbOF.js +1 -0
- package/web/dist/assets/{chunk-2Q5K7J3B-C8iJ92Ek.js → chunk-2Q5K7J3B-BxP-WtZQ.js} +1 -1
- package/web/dist/assets/{chunk-5VM5RSS4-C08WMGbd.js → chunk-5VM5RSS4-DsTt0Asa.js} +1 -1
- package/web/dist/assets/{chunk-F27PBJKO-BTyqWEjg.js → chunk-F27PBJKO-DrTxwu2p.js} +1 -1
- package/web/dist/assets/{chunk-IMKFNOWR-BZz8_wBp.js → chunk-IMKFNOWR-Cx4FHpLO.js} +1 -1
- package/web/dist/assets/{chunk-JWPE2WC7-Bp8exp_9.js → chunk-JWPE2WC7-CyENxC_t.js} +1 -1
- package/web/dist/assets/{chunk-POPQ4Y6H-FDNtBgdZ.js → chunk-POPQ4Y6H-D3RxBrgG.js} +1 -1
- package/web/dist/assets/{chunk-SVP7TREG-B4gluy_M.js → chunk-SVP7TREG-WDQg7LbA.js} +1 -1
- package/web/dist/assets/{chunk-TICWLB2K-DpVfoRrb.js → chunk-TICWLB2K-DyeJXMay.js} +1 -1
- package/web/dist/assets/{chunk-XXDRQBXY-DwTeYIe6.js → chunk-XXDRQBXY-BOMbEfh4.js} +1 -1
- package/web/dist/assets/classDiagram-ZZMXUADV-BeicvRPx.js +1 -0
- package/web/dist/assets/classDiagram-v2-VYDZK3BY-BeicvRPx.js +1 -0
- package/web/dist/assets/{cose-bilkent-JH36ORCC-D9QpWzlD.js → cose-bilkent-JH36ORCC-C_qgmlbu.js} +1 -1
- package/web/dist/assets/{cynefin-OW5HDTMX-jCEkLFdf.js → cynefin-OW5HDTMX-Dlp7w0pR.js} +1 -1
- package/web/dist/assets/{cynefinDiagram-5FMLGOSQ-dVBRtFzn.js → cynefinDiagram-5FMLGOSQ-DdpttLWQ.js} +1 -1
- package/web/dist/assets/{dagre-GXQ25YYZ-Ck-JYQBh.js → dagre-GXQ25YYZ-YcPnyGBA.js} +1 -1
- package/web/dist/assets/{diagram-S7CK7UJ4-DDG_bD3X.js → diagram-S7CK7UJ4-DjrmB_V4.js} +1 -1
- package/web/dist/assets/{diagram-UQ7AKVKN-doLowaGS.js → diagram-UQ7AKVKN-02dgB4Gk.js} +1 -1
- package/web/dist/assets/{diagram-VSXAHHWV-Bj5leyj8.js → diagram-VSXAHHWV-KV4AYZKh.js} +1 -1
- package/web/dist/assets/{diagram-VX7I27RA-CjXqoFDD.js → diagram-VX7I27RA-D9BdQRcy.js} +1 -1
- package/web/dist/assets/{diagram-Z3DM3KII-D__qC8Iy.js → diagram-Z3DM3KII-B9WvYs1o.js} +1 -1
- package/web/dist/assets/{ebnfDiagram-PWID7BFC-tBnh13AS.js → ebnfDiagram-PWID7BFC-CFl5CJVC.js} +1 -1
- package/web/dist/assets/{erDiagram-RLTQ6QDP-Cbod1iTi.js → erDiagram-RLTQ6QDP-D2KMUQ1j.js} +1 -1
- package/web/dist/assets/{flowDiagram-HODETNUW-Bq-zlqMG.js → flowDiagram-HODETNUW-B-8YZRoB.js} +1 -1
- package/web/dist/assets/{ganttDiagram-EL5Y4UJY-DFJTndUE.js → ganttDiagram-EL5Y4UJY-DMqqqP-Y.js} +1 -1
- package/web/dist/assets/{gitGraphDiagram-WWUBYQGX-DcEi9nDs.js → gitGraphDiagram-WWUBYQGX-DEW0i_sZ.js} +1 -1
- package/web/dist/assets/index-C6v7dw-m.js +26 -0
- package/web/dist/assets/index-CFqCTH4C.css +10 -0
- package/web/dist/assets/{infoDiagram-27XIBGKW-BZNZJWoJ.js → infoDiagram-27XIBGKW-CXXuNoKy.js} +1 -1
- package/web/dist/assets/{ishikawaDiagram-5VMMS53U-DqnNYeKy.js → ishikawaDiagram-5VMMS53U-DRoKtY9r.js} +1 -1
- package/web/dist/assets/{journeyDiagram-3NMN7TZE-DERTsG8q.js → journeyDiagram-3NMN7TZE-D5t_RX6A.js} +1 -1
- package/web/dist/assets/{kanban-definition-UXKFOSKX-KImwxyl_.js → kanban-definition-UXKFOSKX-k9I2n3q0.js} +1 -1
- package/web/dist/assets/{layout-BH2O4YE8.js → layout-CdenxSWG.js} +1 -1
- package/web/dist/assets/{linear-CmJWcbZf.js → linear-jRHEP8b3.js} +1 -1
- package/web/dist/assets/{mermaid.core-BqE9WdEq.js → mermaid.core-D8R7av1J.js} +5 -5
- package/web/dist/assets/{mindmap-definition-YA3MSWOX-BolJqx9C.js → mindmap-definition-YA3MSWOX-C1nRjN2l.js} +1 -1
- package/web/dist/assets/{pegDiagram-XKGWAZYB-BwDKfPEj.js → pegDiagram-XKGWAZYB-CfSNzf6e.js} +1 -1
- package/web/dist/assets/{pieDiagram-E7YTZNPT-D9giHNCe.js → pieDiagram-E7YTZNPT-D6GTzVYt.js} +1 -1
- package/web/dist/assets/{quadrantDiagram-AXDQQJYC-BtYHmNEC.js → quadrantDiagram-AXDQQJYC-CTtm5bnt.js} +1 -1
- package/web/dist/assets/{railroadDiagram-O6MQD6OU-FEOhYVmW.js → railroadDiagram-O6MQD6OU-nirkzVNV.js} +1 -1
- package/web/dist/assets/{requirementDiagram-BXWQKSXE-zqJeWuXp.js → requirementDiagram-BXWQKSXE-JTuIVEJa.js} +1 -1
- package/web/dist/assets/{sankeyDiagram-P5KCCOFB-BbUWBYdO.js → sankeyDiagram-P5KCCOFB-BDPG9DA8.js} +1 -1
- package/web/dist/assets/{sequenceDiagram-WJ2MYXX4-CkLzAx94.js → sequenceDiagram-WJ2MYXX4-BaCeoEaZ.js} +1 -1
- package/web/dist/assets/{sizeCapture-INFHLROL-Cu_Hov-C.js → sizeCapture-INFHLROL-DW8ydaxg.js} +1 -1
- package/web/dist/assets/{stateDiagram-D77RDMKH-B3r-CwIC.js → stateDiagram-D77RDMKH-D4j3O3k3.js} +1 -1
- package/web/dist/assets/stateDiagram-v2-MP3YSRHH-C6T7Mj3_.js +1 -0
- package/web/dist/assets/{swimlanes-42K2YHIH-YDxAaBu_.js → swimlanes-42K2YHIH-B1XeYn6H.js} +1 -1
- package/web/dist/assets/swimlanesDiagram-VR7AAH4N-DGAy5ch1.js +8 -0
- package/web/dist/assets/{timeline-definition-24CTP7MA-B2Xo7om1.js → timeline-definition-24CTP7MA-F_4tuv7C.js} +1 -1
- package/web/dist/assets/{vennDiagram-4TSXK5OY-Dek7fJMD.js → vennDiagram-4TSXK5OY-C5hjQH9r.js} +1 -1
- package/web/dist/assets/{wardleyDiagram-VM6X3IG4-CmXnKCpv.js → wardleyDiagram-VM6X3IG4-BsVhPwEg.js} +1 -1
- package/web/dist/assets/{xychartDiagram-S5SC5T6Z-CJ9917hr.js → xychartDiagram-S5SC5T6Z-Cmgrgde9.js} +1 -1
- package/web/dist/index.html +2 -2
- package/web/dist/assets/channel-j9anJgKu.js +0 -1
- package/web/dist/assets/classDiagram-ZZMXUADV-BKdhhCr1.js +0 -1
- package/web/dist/assets/classDiagram-v2-VYDZK3BY-BKdhhCr1.js +0 -1
- package/web/dist/assets/index-BeCUh6J7.js +0 -23
- package/web/dist/assets/index-BjqEFNTc.css +0 -10
- package/web/dist/assets/stateDiagram-v2-MP3YSRHH-Bo79NQZb.js +0 -1
- package/web/dist/assets/swimlanesDiagram-VR7AAH4N--G-JueY8.js +0 -8
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/mermaid.core-D8R7av1J.js","assets/markdown-CUPbftfV.js","assets/TerminalPanel-C3kNAJrw.js","assets/xterm-D1D2FVe3.js","assets/react-ZkKJMDQQ.js","assets/TerminalPanel-6GBZ9nXN.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{R as $e,a as r,j as e,M as Ms,b as cn,c as dn,H as he,d as un,e as mn,f as pn,h as hn,i as gn,k as fn,l as xn,m as vn,n as yn,o as jn,p as bn,q as kn,s as Nn,t as wn,u as Cn,v as Sn,w as Tn,x as En,y as Mn,z as Ln,A as Pn,B as Rn,C as In,D as Dn,E as Fn,F as $n,G as _n}from"./markdown-CUPbftfV.js";import{r as Ls}from"./react-ZkKJMDQQ.js";(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))l(c);new MutationObserver(c=>{for(const i of c)if(i.type==="childList")for(const n of i.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&l(n)}).observe(document,{childList:!0,subtree:!0});function a(c){const i={};return c.integrity&&(i.integrity=c.integrity),c.referrerPolicy&&(i.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?i.credentials="include":c.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function l(c){if(c.ep)return;c.ep=!0;const i=a(c);fetch(c.href,i)}})();var nt={},Qt;function Bn(){if(Qt)return nt;Qt=1;var t=Ls();return nt.createRoot=t.createRoot,nt.hydrateRoot=t.hydrateRoot,nt}var An=Bn();const On="modulepreload",Wn=function(t){return"/"+t},Yt={},It=function(s,a,l){let c=Promise.resolve();if(a&&a.length>0){let n=function(u){return Promise.all(u.map(h=>Promise.resolve(h).then(m=>({status:"fulfilled",value:m}),m=>({status:"rejected",reason:m}))))};document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),d=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));c=n(a.map(u=>{if(u=Wn(u),u in Yt)return;Yt[u]=!0;const h=u.endsWith(".css"),m=h?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${u}"]${m}`))return;const x=document.createElement("link");if(x.rel=h?"stylesheet":On,h||(x.as="script"),x.crossOrigin="",x.href=u,d&&x.setAttribute("nonce",d),document.head.appendChild(x),h)return new Promise((C,M)=>{x.addEventListener("load",C),x.addEventListener("error",()=>M(new Error(`Unable to preload CSS for ${u}`)))})}))}function i(n){const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=n,window.dispatchEvent(o),!o.defaultPrevented)throw n}return c.then(n=>{for(const o of n||[])o.status==="rejected"&&i(o.reason);return s().catch(i)})};var Ps={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},Xt=$e.createContext&&$e.createContext(Ps),Hn=["attr","size","title"];function Un(t,s){if(t==null)return{};var a,l,c=qn(t,s);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);for(l=0;l<i.length;l++)a=i[l],s.indexOf(a)===-1&&{}.propertyIsEnumerable.call(t,a)&&(c[a]=t[a])}return c}function qn(t,s){if(t==null)return{};var a={};for(var l in t)if({}.hasOwnProperty.call(t,l)){if(s.indexOf(l)!==-1)continue;a[l]=t[l]}return a}function ot(){return ot=Object.assign?Object.assign.bind():function(t){for(var s=1;s<arguments.length;s++){var a=arguments[s];for(var l in a)({}).hasOwnProperty.call(a,l)&&(t[l]=a[l])}return t},ot.apply(null,arguments)}function Zt(t,s){var a=Object.keys(t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);s&&(l=l.filter(function(c){return Object.getOwnPropertyDescriptor(t,c).enumerable})),a.push.apply(a,l)}return a}function ct(t){for(var s=1;s<arguments.length;s++){var a=arguments[s]!=null?arguments[s]:{};s%2?Zt(Object(a),!0).forEach(function(l){zn(t,l,a[l])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(a)):Zt(Object(a)).forEach(function(l){Object.defineProperty(t,l,Object.getOwnPropertyDescriptor(a,l))})}return t}function zn(t,s,a){return(s=Kn(s))in t?Object.defineProperty(t,s,{value:a,enumerable:!0,configurable:!0,writable:!0}):t[s]=a,t}function Kn(t){var s=Vn(t,"string");return typeof s=="symbol"?s:s+""}function Vn(t,s){if(typeof t!="object"||!t)return t;var a=t[Symbol.toPrimitive];if(a!==void 0){var l=a.call(t,s);if(typeof l!="object")return l;throw new TypeError("@@toPrimitive must return a primitive value.")}return(s==="string"?String:Number)(t)}function Rs(t){return t&&t.map((s,a)=>$e.createElement(s.tag,ct({key:a},s.attr),Rs(s.child)))}function q(t){return s=>$e.createElement(Gn,ot({attr:ct({},t.attr)},s),Rs(t.child))}function Gn(t){var s=a=>{var l=t.attr,c=t.size,i=t.title,n=Un(t,Hn),o=c||a.size||"1em",d;return a.className&&(d=a.className),t.className&&(d=(d?d+" ":"")+t.className),$e.createElement("svg",ot({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},a.attr,l,n,{className:d,style:ct(ct({color:t.color||a.color},a.style),t.style),height:o,width:o,xmlns:"http://www.w3.org/2000/svg"}),i&&$e.createElement("title",null,i),t.children)};return Xt!==void 0?$e.createElement(Xt.Consumer,null,a=>s(a)):s(Ps)}function Jn(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"11",cy:"11",r:"8"},child:[]},{tag:"line",attr:{x1:"21",y1:"21",x2:"16.65",y2:"16.65"},child:[]},{tag:"line",attr:{x1:"8",y1:"11",x2:"14",y2:"11"},child:[]}]})(t)}function Qn(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"11",cy:"11",r:"8"},child:[]},{tag:"line",attr:{x1:"21",y1:"21",x2:"16.65",y2:"16.65"},child:[]},{tag:"line",attr:{x1:"11",y1:"8",x2:"11",y2:"14"},child:[]},{tag:"line",attr:{x1:"8",y1:"11",x2:"14",y2:"11"},child:[]}]})(t)}function it(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polygon",attr:{points:"13 2 3 14 12 14 11 22 21 10 12 10 13 2"},child:[]}]})(t)}function we(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"line",attr:{x1:"18",y1:"6",x2:"6",y2:"18"},child:[]},{tag:"line",attr:{x1:"6",y1:"6",x2:"18",y2:"18"},child:[]}]})(t)}function Is(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polygon",attr:{points:"11 5 6 9 2 9 2 15 6 15 11 19 11 5"},child:[]},{tag:"path",attr:{d:"M19.07 4.93a10 10 0 0 1 0 14.14M15.54 8.46a5 5 0 0 1 0 7.07"},child:[]}]})(t)}function Yn(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"rect",attr:{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"},child:[]},{tag:"path",attr:{d:"M7 11V7a5 5 0 0 1 9.9-1"},child:[]}]})(t)}function _e(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"3 6 5 6 21 6"},child:[]},{tag:"path",attr:{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"},child:[]},{tag:"line",attr:{x1:"10",y1:"11",x2:"10",y2:"17"},child:[]},{tag:"line",attr:{x1:"14",y1:"11",x2:"14",y2:"17"},child:[]}]})(t)}function qe(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"4 17 10 11 4 5"},child:[]},{tag:"line",attr:{x1:"12",y1:"19",x2:"20",y2:"19"},child:[]}]})(t)}function es(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"12",cy:"12",r:"10"},child:[]},{tag:"circle",attr:{cx:"12",cy:"12",r:"6"},child:[]},{tag:"circle",attr:{cx:"12",cy:"12",r:"2"},child:[]}]})(t)}function dt(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"rect",attr:{x:"3",y:"3",width:"18",height:"18",rx:"2",ry:"2"},child:[]}]})(t)}function Xn(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"line",attr:{x1:"4",y1:"21",x2:"4",y2:"14"},child:[]},{tag:"line",attr:{x1:"4",y1:"10",x2:"4",y2:"3"},child:[]},{tag:"line",attr:{x1:"12",y1:"21",x2:"12",y2:"12"},child:[]},{tag:"line",attr:{x1:"12",y1:"8",x2:"12",y2:"3"},child:[]},{tag:"line",attr:{x1:"20",y1:"21",x2:"20",y2:"16"},child:[]},{tag:"line",attr:{x1:"20",y1:"12",x2:"20",y2:"3"},child:[]},{tag:"line",attr:{x1:"1",y1:"14",x2:"7",y2:"14"},child:[]},{tag:"line",attr:{x1:"9",y1:"8",x2:"15",y2:"8"},child:[]},{tag:"line",attr:{x1:"17",y1:"16",x2:"23",y2:"16"},child:[]}]})(t)}function ut(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"12",cy:"12",r:"3"},child:[]},{tag:"path",attr:{d:"M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"},child:[]}]})(t)}function Zn(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"line",attr:{x1:"22",y1:"2",x2:"11",y2:"13"},child:[]},{tag:"polygon",attr:{points:"22 2 15 22 11 13 2 9 22 2"},child:[]}]})(t)}function mt(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"11",cy:"11",r:"8"},child:[]},{tag:"line",attr:{x1:"21",y1:"21",x2:"16.65",y2:"16.65"},child:[]}]})(t)}function ea(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"},child:[]},{tag:"polyline",attr:{points:"17 21 17 13 7 13 7 21"},child:[]},{tag:"polyline",attr:{points:"7 3 7 8 15 8"},child:[]}]})(t)}function ft(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"23 4 23 10 17 10"},child:[]},{tag:"polyline",attr:{points:"1 20 1 14 7 14"},child:[]},{tag:"path",attr:{d:"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"},child:[]}]})(t)}function ze(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"line",attr:{x1:"12",y1:"5",x2:"12",y2:"19"},child:[]},{tag:"line",attr:{x1:"5",y1:"12",x2:"19",y2:"12"},child:[]}]})(t)}function Br(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polygon",attr:{points:"5 3 19 12 5 21 5 3"},child:[]}]})(t)}function ts(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"},child:[]}]})(t)}function ss(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"line",attr:{x1:"16.5",y1:"9.4",x2:"7.5",y2:"4.21"},child:[]},{tag:"path",attr:{d:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"},child:[]},{tag:"polyline",attr:{points:"3.27 6.96 12 12.01 20.73 6.96"},child:[]},{tag:"line",attr:{x1:"12",y1:"22.08",x2:"12",y2:"12"},child:[]}]})(t)}function ta(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"12",cy:"12",r:"1"},child:[]},{tag:"circle",attr:{cx:"19",cy:"12",r:"1"},child:[]},{tag:"circle",attr:{cx:"5",cy:"12",r:"1"},child:[]}]})(t)}function sa(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3"},child:[]}]})(t)}function Ke(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"},child:[]}]})(t)}function na(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"line",attr:{x1:"3",y1:"12",x2:"21",y2:"12"},child:[]},{tag:"line",attr:{x1:"3",y1:"6",x2:"21",y2:"6"},child:[]},{tag:"line",attr:{x1:"3",y1:"18",x2:"21",y2:"18"},child:[]}]})(t)}function aa(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"},child:[]}]})(t)}function Ds(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"15 3 21 3 21 9"},child:[]},{tag:"polyline",attr:{points:"9 21 3 21 3 15"},child:[]},{tag:"line",attr:{x1:"21",y1:"3",x2:"14",y2:"10"},child:[]},{tag:"line",attr:{x1:"3",y1:"21",x2:"10",y2:"14"},child:[]}]})(t)}function ia(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"rect",attr:{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"},child:[]},{tag:"path",attr:{d:"M7 11V7a5 5 0 0 1 10 0v4"},child:[]}]})(t)}function St(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"},child:[]},{tag:"path",attr:{d:"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"},child:[]}]})(t)}function pt(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polygon",attr:{points:"12 2 2 7 12 12 22 7 12 2"},child:[]},{tag:"polyline",attr:{points:"2 17 12 22 22 17"},child:[]},{tag:"polyline",attr:{points:"2 12 12 17 22 12"},child:[]}]})(t)}function ra(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4"},child:[]}]})(t)}function la(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"12",cy:"12",r:"10"},child:[]},{tag:"line",attr:{x1:"12",y1:"16",x2:"12",y2:"12"},child:[]},{tag:"line",attr:{x1:"12",y1:"8",x2:"12.01",y2:"8"},child:[]}]})(t)}function oa(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"rect",attr:{x:"3",y:"3",width:"18",height:"18",rx:"2",ry:"2"},child:[]},{tag:"circle",attr:{cx:"8.5",cy:"8.5",r:"1.5"},child:[]},{tag:"polyline",attr:{points:"21 15 16 10 5 21"},child:[]}]})(t)}function ca(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"},child:[]},{tag:"polyline",attr:{points:"9 22 9 12 15 12 15 22"},child:[]}]})(t)}function da(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"line",attr:{x1:"22",y1:"12",x2:"2",y2:"12"},child:[]},{tag:"path",attr:{d:"M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z"},child:[]},{tag:"line",attr:{x1:"6",y1:"16",x2:"6.01",y2:"16"},child:[]},{tag:"line",attr:{x1:"10",y1:"16",x2:"10.01",y2:"16"},child:[]}]})(t)}function ua(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"12",cy:"12",r:"10"},child:[]},{tag:"line",attr:{x1:"2",y1:"12",x2:"22",y2:"12"},child:[]},{tag:"path",attr:{d:"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"},child:[]}]})(t)}function rt(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"line",attr:{x1:"6",y1:"3",x2:"6",y2:"15"},child:[]},{tag:"circle",attr:{cx:"18",cy:"6",r:"3"},child:[]},{tag:"circle",attr:{cx:"6",cy:"18",r:"3"},child:[]},{tag:"path",attr:{d:"M18 9a9 9 0 0 1-9 9"},child:[]}]})(t)}function Ie(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"},child:[]}]})(t)}function ma(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"},child:[]},{tag:"line",attr:{x1:"12",y1:"11",x2:"12",y2:"17"},child:[]},{tag:"line",attr:{x1:"9",y1:"14",x2:"15",y2:"14"},child:[]}]})(t)}function Fs(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"},child:[]},{tag:"polyline",attr:{points:"13 2 13 9 20 9"},child:[]}]})(t)}function $s(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"},child:[]},{tag:"polyline",attr:{points:"14 2 14 8 20 8"},child:[]},{tag:"line",attr:{x1:"16",y1:"13",x2:"8",y2:"13"},child:[]},{tag:"line",attr:{x1:"16",y1:"17",x2:"8",y2:"17"},child:[]},{tag:"polyline",attr:{points:"10 9 9 9 8 9"},child:[]}]})(t)}function Tt(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"},child:[]},{tag:"circle",attr:{cx:"12",cy:"12",r:"3"},child:[]}]})(t)}function Et(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M12 20h9"},child:[]},{tag:"path",attr:{d:"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z"},child:[]}]})(t)}function Mt(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"},child:[]}]})(t)}function _s(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"},child:[]},{tag:"polyline",attr:{points:"7 10 12 15 17 10"},child:[]},{tag:"line",attr:{x1:"12",y1:"15",x2:"12",y2:"3"},child:[]}]})(t)}function tt(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"rect",attr:{x:"4",y:"4",width:"16",height:"16",rx:"2",ry:"2"},child:[]},{tag:"rect",attr:{x:"9",y:"9",width:"6",height:"6"},child:[]},{tag:"line",attr:{x1:"9",y1:"1",x2:"9",y2:"4"},child:[]},{tag:"line",attr:{x1:"15",y1:"1",x2:"15",y2:"4"},child:[]},{tag:"line",attr:{x1:"9",y1:"20",x2:"9",y2:"23"},child:[]},{tag:"line",attr:{x1:"15",y1:"20",x2:"15",y2:"23"},child:[]},{tag:"line",attr:{x1:"20",y1:"9",x2:"23",y2:"9"},child:[]},{tag:"line",attr:{x1:"20",y1:"14",x2:"23",y2:"14"},child:[]},{tag:"line",attr:{x1:"1",y1:"9",x2:"4",y2:"9"},child:[]},{tag:"line",attr:{x1:"1",y1:"14",x2:"4",y2:"14"},child:[]}]})(t)}function pa(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"14 9 9 4 4 9"},child:[]},{tag:"path",attr:{d:"M20 20h-7a4 4 0 0 1-4-4V4"},child:[]}]})(t)}function ha(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"9 10 4 15 9 20"},child:[]},{tag:"path",attr:{d:"M20 4v7a4 4 0 0 1-4 4H4"},child:[]}]})(t)}function Dt(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"rect",attr:{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"},child:[]},{tag:"path",attr:{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"},child:[]}]})(t)}function ga(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"16 18 22 12 16 6"},child:[]},{tag:"polyline",attr:{points:"8 6 2 12 8 18"},child:[]}]})(t)}function fa(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"17 11 12 6 7 11"},child:[]},{tag:"polyline",attr:{points:"17 18 12 13 7 18"},child:[]}]})(t)}function xa(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"7 13 12 18 17 13"},child:[]},{tag:"polyline",attr:{points:"7 6 12 11 17 6"},child:[]}]})(t)}function xt(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"18 15 12 9 6 15"},child:[]}]})(t)}function Je(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"9 18 15 12 9 6"},child:[]}]})(t)}function De(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"6 9 12 15 18 9"},child:[]}]})(t)}function Ve(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"polyline",attr:{points:"20 6 9 17 4 12"},child:[]}]})(t)}function va(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M22 11.08V12a10 10 0 1 1-5.93-9.14"},child:[]},{tag:"polyline",attr:{points:"22 4 12 14.01 9 11.01"},child:[]}]})(t)}function ns(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z"},child:[]},{tag:"polyline",attr:{points:"3.27 6.96 12 12.01 20.73 6.96"},child:[]},{tag:"line",attr:{x1:"12",y1:"22.08",x2:"12",y2:"12"},child:[]}]})(t)}function ya(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z"},child:[]},{tag:"path",attr:{d:"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z"},child:[]}]})(t)}function Bs(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"line",attr:{x1:"12",y1:"19",x2:"12",y2:"5"},child:[]},{tag:"polyline",attr:{points:"5 12 12 5 19 12"},child:[]}]})(t)}function As(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"line",attr:{x1:"12",y1:"5",x2:"12",y2:"19"},child:[]},{tag:"polyline",attr:{points:"19 12 12 19 5 12"},child:[]}]})(t)}function Os(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"},child:[]},{tag:"line",attr:{x1:"12",y1:"9",x2:"12",y2:"13"},child:[]},{tag:"line",attr:{x1:"12",y1:"17",x2:"12.01",y2:"17"},child:[]}]})(t)}function ja(t){return q({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"circle",attr:{cx:"12",cy:"12",r:"10"},child:[]},{tag:"line",attr:{x1:"12",y1:"8",x2:"12",y2:"12"},child:[]},{tag:"line",attr:{x1:"12",y1:"16",x2:"12.01",y2:"16"},child:[]}]})(t)}function Ue({trigger:t,open:s,onOpenChange:a,children:l,align:c="right",fit:i=!1,direction:n="down",menuClassName:o}){const d=r.useRef(null);return r.useEffect(()=>{if(!s)return;const u=m=>{d.current&&!d.current.contains(m.target)&&a(!1)},h=m=>{m.key==="Escape"&&a(!1)};return document.addEventListener("mousedown",u),document.addEventListener("keydown",h),()=>{document.removeEventListener("mousedown",u),document.removeEventListener("keydown",h)}},[s,a]),e.jsxs("div",{className:`dropdown ${c} ${i?"fit":""} ${n==="up"?"dd-up":""}`,ref:d,children:[e.jsxs("button",{type:"button",className:"chip",onClick:()=>a(!s),"aria-expanded":s,children:[t,e.jsx(De,{className:`dd-caret ${s?"up":""}`})]}),s&&e.jsx("div",{className:`dd-menu ${o??""}`,children:l})]})}function Le({active:t,disabled:s=!1,title:a,onClick:l,children:c}){return e.jsx("button",{type:"button",className:`dd-item ${t?"active":""}`,disabled:s,title:a,onClick:l,children:c})}const Ws="pi-web-ui:lang",ba={cancel:"取消",ok:"确定",save:"保存",close:"关闭",widgetExpand:"点击放大查看完整输出",dragToResize:"拖拽调整宽度 · 双击复位",loading:"加载中…",connected:"已连接",connecting:"连接中…",reconnecting:"重连中…",language:"语言",langZh:"中文",langEn:"English",githubRepo:"GitHub 仓库(xing-shuyin/pi-web-ui)",copy:"复制",viewSwitch:"视图切换",chat:"对话",terminal:"终端",selectModel:"选择模型",availableModels:"可用模型",noModels:"暂无可用模型(请先配置 API 密钥)",reasoning:"推理",vision:"识图",refreshModels:"刷新模型列表(保留手填,合并新增)",manageModels:"⚙ 管理模型(新增 / 修改)",manageModelsTitle:"管理模型",thinkingLevel:"思考强度",thinking:"思考",thinkingChip:"思考:{level}",sound:"声音",theme:"主题",themeDefault:"深色(默认)",newChat:"新对话",more:"更多",newChatTip:"新建对话(每个浏览器独立保存会话)","thinking.off":"关闭","thinking.minimal":"极简","thinking.low":"低","thinking.medium":"中","thinking.high":"高","thinking.xhigh":"极高","thinking.max":"最大",thinkingUnsupported:"当前模型不支持该级别,已按模型能力就近生效",context:"上下文",contextUsage:"上下文用量",cumulativeCost:"累计成本",sessionMessages:"会话消息数",messages:"消息",pluginStatus:"插件状态",working:"工作中",queued:"排队",enterPath:"输入路径,Enter 切换",cwdTip:"工作目录:{path}(点击切换)",folderRef:"文件夹引用:{path}",refOnly:"仅引用:{path}",attachContent:"附加内容:{path}",attachLines:"附加选中行:{path}(第 {start}-{end} 行)",attachImage:"图片:{name}",attachFile:"文件:{name}",removeAttachment:"移除附件",attachHint:"将随下一条消息发送",uploadFile:"添加文件(图片/文本/任意文件,也可直接拖入或粘贴截图)",dropHereToAttach:"松开以添加文件",imageNotSupported:"当前模型不支持识图:图片将交给视觉桥转写(若未配置视觉模型则可能被忽略)",imageLoadFailed:"图片读取失败:{name}",fileLoadFailed:"文件读取失败:{name}",fileTooLarge:"文件过大已跳过(>{size}MB):{name}",foldersNotSupported:"不支持直接拖入文件夹,请展开后选择文件",placeholderStreaming:"智能体正在工作中…回车插队发送,或点「排队」等回答结束后发送",placeholderIdle:"给 pi 发送消息 — Enter 发送,/ 查看命令",placeholderConnecting:"正在连接服务器…",stopAgent:"停止智能体",stop:"停止",bgTasks:"后台任务",bgTasksTip:"AI 在后台启动的服务(npm run dev & 等)——可逐个停止或全部关闭,对话结束后仍保留",bgTasksEmpty:"暂无后台任务",bgTasksDesc:"AI 运行中启动并仍在监听的进程(按监听端口检测)",bgTaskPort:"端口",bgTaskPid:"PID",bgTaskSince:"启动",bgTaskStop:"停止",bgTaskStopAll:"全部关闭",bgTaskRefresh:"刷新",bgTaskJustNow:"刚刚",bgTaskMinutes:"{n} 分钟前",bgTaskHours:"{n} 小时前",bgTaskDays:"{n} 天前",stopBash:"停止",stopBashTip:"停止正在运行的 bash 命令(对话继续)",supplement:"排队",supplementTip:"加入队列:AI 回答完全结束后才发送(不打断)",queueSteerTag:"插队",queueFollowTag:"排队",sendTip:"发送(Enter)",slashCommands:"命令",slashMenuHint:"↑↓ 选择 · Enter/Tab 补全",slashHelpTitle:"pi 命令",slashHelpHint:"输入 / 随时打开命令列表",slashLoading:"命令列表加载中…(连接服务器后可用)",slashBuiltin:"内置",slashExtension:"扩展",slashPrompt:"模板",slashSkill:"技能",slashPlugin:"插件",slashCopied:"已复制上一条助手回复",slashCopyFailed:"复制失败,请手动复制",slashCopyEmpty:"还没有可复制的助手回复",mermaidRendering:"正在渲染图表…",mermaidRenderFailed:"图表渲染失败,已显示原始代码",recentProjects:"最近项目",runningConversations:"运行的对话",historySessions:"历史对话",openHistory:"历史对话",openFiles:"文件列表",streaming:"进行中…",noHistory:"还没有历史对话",current:"当前",messageCount:"{n} 条消息",tuiTip:"pi 终端(TUI)中的对话",deleteProject:"从最近项目移出",deleteProjectConfirm:"确认移出",deleteSession:"删除该对话记录(不可恢复)",deleteSessionConfirm:"确认删除",confirm:"确认",expandCode:"展开完整内容",collapseCode:"收起",zoomCode:"放大查看",closeZoom:"关闭",renameSession:"重命名该对话",renameSessionPlaceholder:"对话名称(留空则显示首条提问)",openFolder:"打开文件夹…",openFolderPlaceholder:"或直接粘贴绝对路径",openThisFolder:"打开当前文件夹",openTypedPath:"打开输入的路径",parentFolder:"上一级",home:"主目录",noSubfolders:"这里没有子文件夹",listTruncated:"目录过多,列表已截断",emptyChat:"空对话",editReask:"编辑重问",editReaskTip:"修改此问题,并从这里重新提问(会新建一个分支对话,原对话保留)",reaskFromHere:"从此处重新提问",editPlaceholder:"修改问题内容…",editHint:"⌘/Ctrl+Enter 提交 · Esc 取消",editAttachmentHint:"原附件已保留,可粘贴/拖入新图片或文件 · ⌘/Ctrl+Enter 提交 · Esc 取消",expandMsg:"展开",collapseMsg:"收起",toolCalls:"工具调用",bashRuns:"终端运行",images:"图片",update:"更新",updateTip:"检查并更新 pi-web-ui",currentVersion:"当前版本",latestVersion:"最新版本",checkingUpdate:"检查中…",checkUpdate:"检查更新",upToDate:"已是最新版本",updateAvailable:"发现新版本 v{version}",updateJustPublished:"v{version} 刚刚发布,npm 缓存可能尚未同步——若未检测到新版本,请稍后重新检查",updateNow:"在终端中更新",updateTabTitle:"更新 pi-web-ui",updateTerminalHint:"点击后会在可见终端中运行 npm i -g pi-web-ui@latest;完成后重启服务生效(pi-web-ui server restart)。",rootDir:"根目录",noFiles:"暂无文件",filesTruncated:"目录过大,列表已截断,仅显示前 2000 项",linkFolderTip:"链接文件夹路径到对话",attachInlineTip:"附加内容到对话",referenceTip:"仅引用路径(AI 按需读取)",previewFile:"预览",downloadFile:"下载文件",downloadFailed:"下载失败:{error}",protocolMismatch:"页面版本与服务器不一致(应用刚更新过),请刷新页面以恢复全部功能。",selectLinesHint:"点击选择行;拖拽或 Shift+点击选择范围",enableWrap:"开启自动换行",disableWrap:"关闭自动换行",selectedRange:"已选 {n} 行(第 {start}-{end} 行)",fileLines:"{n} 行",selectAll:"全选",clearSelection:"清除",addToChat:"添加到对话",addedToChat:"已添加",previewTruncated:"⚠ 文件过大,仅预览前 512KB",previewLinesTruncated:"… 文件行数过多,仅显示前 {n} 行",binaryFile:"🔣 二进制文件,已显示前 4KB 十六进制",binaryHexTruncated:"(文件更大,可下载完整文件)",previewNotSupported:"该类型文件不支持预览(仅图片 / 视频 / 文本)",emptyFile:"(空文件)",editFile:"编辑文件",exitEditFile:"退出编辑",saveFile:"保存文件",discardFileChanges:"放弃未保存的修改?",fileSaved:"已保存",fileEditTruncated:"文件过大,预览不完整,无法编辑",showMarkdownSource:"显示 Markdown 原文",showMarkdownPreview:"显示 Markdown 预览",fullscreen:"全屏",exitFullscreen:"退出全屏",zoomIn:"放大字号",zoomOut:"缩小字号",resetZoom:"重置缩放",pluginRequest:"插件请求",noOptions:"(无选项)",inputPlaceholder:"输入内容",soundHeader:"声音提示",enableSound:"启用声音",preview:"试听",volume:"音量","sound.question":"问卷弹出","sound.question.desc":"ask_user_question 出现时","sound.done":"回复结束","sound.done.desc":"智能体完成一轮回答时","sound.start":"回复开始","sound.start.desc":"智能体开始新一轮时","sound.error":"出错","sound.error.desc":"出现错误提示时",setupTitle:"未检测到 pi agent 配置",setupDesc:"pi-web-ui 需要 pi 的配置目录(~/.pi/agent)和至少一个 API 密钥才能运行智能体。pi 内置了 openai、anthropic、deepseek 等服务商——选一个填密钥即可,全程无需打开终端。",installFailed:"✖ pi agent 安装失败:",retryInstall:"重试安装",skip:"跳过",installDone:"✅ pi agent CLI 已安装。选择服务商并填入 API 密钥即可开始对话:",cliReadyHint:"✅ 本地已检测到 pi agent,选择服务商并填入 API 密钥即可开始对话:",provider:"服务商",configured:"已配置",providerKeyReady:"该服务商已配置密钥,可直接使用或更换新密钥。",apiKey:"API 密钥",saving:"保存中…",saveAndStart:"保存并开始使用",recheck:"重新检测",installing:"正在安装 pi agent CLI…",autoInstall:"自动安装 pi agent",attachment:"附件",plugin:"插件",unknown:"未知",thinkingWait:"正在思考",exitCode:"退出码 {code}",cancelled:"已取消",truncated:"… 内容过长,当前视图已截断",outputTruncated:"… 输出过长,当前视图已截断",refOnlyShort:"仅引用",folderRefShort:"文件夹 · 仅引用",inlineLines:"内联 · {n} 行",inlineLinesRange:"行 {start}-{end}",image:"🖼 图片",bridgedVision:"👁 已转写",bridgedVisionDetail:"图片已由视觉桥转写(当前模型不支持识图)",folderNotExpanded:"文件夹,未展开内容 —— 智能体会按需浏览目录",fileNotExpanded:"文件较大({size}),未展开内容 —— 智能体会按需读取","role.user":"你","role.assistant":"pi","role.tool":"工具","role.bash":"终端","role.branch":"分支摘要","role.compaction":"上下文已压缩",welcomeTitle:"pi 编码智能体",welcomeSub:"检查、编辑、运行 —— 随时待命",directory:"目录",clickToFill:"点击填入输入框",waitingResponse:"正在等待模型响应…",sending:"发送中",backToBottom:"回到底部",questionNavTitle:"问题列表",searchPlaceholder:"在对话中搜索…",searchNoResults:"无结果",searchModels:"搜索模型…",noModelMatches:"无匹配模型",searchGlobal:"搜索",searchGlobalTip:"全局搜索:对话 / 项目 / 文件(Ctrl+K)",gsPlaceholder:"搜索项目、历史对话、工作区文件…",gsHint:"输入关键词:同时搜索历史对话、最近项目与当前项目的文件名",gsSessions:"对话",gsProjects:"项目",gsFiles:"文件",gsNoResults:"无匹配结果",gsSearching:"正在搜索文件…",gsTruncated:"匹配过多,仅显示部分结果",gsCurrentProject:"当前",gsOpenPreview:"打开文件预览",gsNavigate:"选择",gsOpen:"打开",gsCloseHint:"关闭",bgTaskCommand:"命令行",searchPrev:"上一个(Shift+Enter)",searchNext:"下一个(Enter)",searchClose:"关闭(Esc)",questionNavTip:"本对话的全部问题,悬浮展开,点击跳转","ex.understand":"了解这个项目","ex.understand.prompt":"介绍一下这个项目:整体结构、主要模块和如何运行?","ex.debug":"排查一个问题","ex.debug.prompt":"帮我排查一个 bug,请先说明问题现象,我会补充细节。","ex.test":"编写测试","ex.test.prompt":"为项目的核心模块编写单元测试。","ex.review":"代码审查","ex.review.prompt":"审查最近改动的代码,指出潜在问题和改进建议。",error:"出错",done:"完成",running:"执行中…",toolQueued:"排队中",copyArgs:"复制参数",errorOutput:"错误输出",output:"输出",waitingOutput:"等待输出…",toolDoneWaitingModel:"已结束 · 等模型",waitingModel:"等待模型响应…",thinkingNow:"思考中",thinkingPreview:"思考:{preview}",leakedThinking:"异常内容(疑似泄露的思考文本)",commands:"命令",newCommand:"新建命令",newTerminal:"新建终端",name:"名称",command:"命令",cwdHint:"(${pwd} = 当前工作目录)",noCommands:"还没有命令,点 + 添加一个",clickToRun:"点击运行",edit:"编辑",delete:"删除",confirmQ:"确认?",builtinTerminal:"内置终端",termEmptySub:"点击左侧命令运行,或点右侧 + 新建终端",noTerminal:"暂无终端",exited:"(已退出{code})",closeTerminal:"关闭终端",rerun:"重新读取 .pi/commands.json",terminalTitle:"终端 {n}",exampleName:"例如:启动开发服务器",exampleCommand:"例如:npm run dev",scmTab:"Git",scmTitle:"源代码管理",scmRefreshTip:"重新查询 Git 状态与差异",scmCurrentBranch:"当前分支",scmUpstreamGone:"上游已删除",scmAheadBehind:"↑{ahead} ↓{behind}",scmDetached:"分离 HEAD",scmSelectBranch:"选择分支…",scmRemoteBranches:"远程分支",scmStageTip:"暂存 {path}",scmUnstageTip:"取消暂存 {path}",scmSwitch:"切换",scmSwitchBranch:"切换分支",scmSwitchBranchTip:"在终端中执行 git checkout {branch}",scmPush:"推送",scmPushTip:"在终端中执行 git push",scmPull:"拉取",scmPullTip:"在终端中执行 git pull",scmCommit:"提交",scmCommitTip:'在终端中执行 git add -A && git commit -m "…"(提交全部更改,含未跟踪)',scmCommitPlaceholder:"输入提交信息…",scmChanges:"更改",scmHistory:"提交树",scmCommitDetail:"提交详情",scmSelectCommitHint:"点击左侧提交查看详情",scmNoHistory:"暂无提交记录",scmNoChanges:"工作区干净,没有更改",scmNotGitRepo:"当前目录不是 Git 仓库",scmLoading:"查询中…",scmConnecting:"等待连接…",scmDiff:"差异",scmSelectFileHint:"点击左侧文件查看差异",scmNoDiff:"(无差异)",scmStaged:"已暂存",scmUnstaged:"未暂存",scmStagedUnstaged:"已暂存 + 未暂存",scmUntracked:"未跟踪",scmUntrackedNote:"未跟踪文件:差异不显示,提交时会一并包含",scmQueryFailed:"Git 查询失败:{error}",scmTooManyFailures:"Git 查询连续失败,请点击刷新重试",scmRunsInTerminal:"提交 / 切换分支 / 推送 / 拉取在终端中执行",scmViewTerminal:"去终端",editProvider:"编辑服务商",builtinProviders:"内置服务商",hintKeyOnly:"只需填入 API 密钥",configuredBadge:"✓ 已配置",keyReady:"密钥已就绪",replaceKey:"更换密钥",replaceKeyTitle:"替换已保存的密钥",clearKey:"清空",clearKeyTitle:"清除该服务商保存在 auth.json 的密钥,回到未配置状态(环境变量来源的无法在此清除)",clearKeyConfirm:"清空 {id} 已保存的密钥?其模型将从列表消失,直到重新配置。",cloneProvider:"复制为自定义",cloning:"复制中",cloneProviderTitle:"复制该内置供应商(baseUrl + 模型列表)为自定义供应商,填入另一个 API 密钥即可双 key 并存",pasteKey:"粘贴 API 密钥…",savingKey:"保存中",saveKey:"保存密钥",customProviders:"自定义服务商",customDesc:"用于 Ollama / vLLM / 兼容 OpenAI 的代理等,写入 pi 的 models.json,保存后热重载、立即生效。",noCustomProviders:"还没有自定义服务商",modelsCount:"{n} 个模型",addProvider:"新增服务商",providerId:"服务商 ID",providerIdHint:"(必填,如 ollama / my-proxy)",displayName:"显示名",displayNamePh:"我的代理",apiType:"API 类型",baseUrlHint:"(OpenAI 兼容端点)",apiKeyHint:"sk-…(可留空,用 auth.json 的密钥)",authHeader:"自动添加 Authorization 请求头",modelsTitle:"模型",modelIdReq:"模型 ID(必填)",text:"文本",textImage:"文本+图片",contextWindow:"上下文",maxOutput:"最大输出",removeModel:"移除模型",addModel:"添加模型",deleteProviderConfirm:"删除服务商 {id} 及其 {n} 个模型?",fetchModels:"自动获取模型列表",fetchModelsHint:"从 baseUrl 的 /models 接口自动拉取模型 ID(服务端请求,不受 CORS 限制)",fetchingModels:"获取中…",fetchModelsOk:"已获取 {n} 个模型",fetchModelsEmpty:"接口未返回任何模型",fetchModelsErr:"获取失败:{msg}",fetchModelsNeedBaseUrl:"请先填写 baseUrl 再获取",goalBarTitle:"目标",goalBarPlaceholder:"设定一个目标,agent 完成后自动审查…",goalBarSet:"开始",goalBarClear:"取消",goalBarLocked:"锁定:应用到后续所有回合",goalBarUnlocked:"仅本回合(改完自动清除)",goalBarReviewModel:"审查模型",goalBarUseMainModel:"使用主模型",goalBarMaxRounds:"最大轮数",goalBarMaxRoundsTip:"最大审查重改轮数;0 或不填 = 不限(持续改到通过)",goalBarUnlimitedShort:"不限",goalBarReviewing:"审查中…",goalBarRound:"第 {n} 轮",goalBarActive:"目标生效中",goalBarPassed:"已通过",goalBarFailed:"未通过",goalBarStatusPending:"等待生成…",goalWizardBtn:"AI 提炼",goalWizardTip:"让 AI 通过问卷调研细化需求,收敛为目标",goalWizardRunning:"目标调研中",goalWizardAnswer:"回答",goalWizardCard:"目标调研",settings:"设置",settingsTitle:"设置",settingsDesc:"修改立即生效:系统提示词、技能与插件开关会重建当前会话;审查提示词与审查技能只影响后续目标审查(回复进行中则主会话变更自动延迟)。",settingsSystemPrompt:"系统提示词",settingsPromptMode:"模式",promptModeAppend:"追加",promptModeReplace:"替换",promptAppendHint:"追加模式:自定义内容拼接到默认系统提示词末尾(推荐,保留默认行为约束)。",promptReplaceHint:"替换模式:完全用自定义内容替换系统提示词(项目上下文与技能段仍会自动附加)。切换后输入框会显示原本的默认提示词,可直接修改;不改动失焦则仍使用默认。",promptPlaceholder:"输入自定义系统提示词…(失焦后自动应用)",settingsViewPrompt:"查看当前完整提示词",settingsViewPromptHint:"当前会话实际生效的完整系统提示词(含自定义追加/替换内容、项目上下文、技能说明与工具引导),只读。",settingsViewPromptEmpty:"会话尚未就绪,暂无系统提示词。",settingsSkills:"技能",settingsReview:"目标审查",settingsReviewDesc:"为独立的目标审查会话配置额外提示词和技能;不会改变主会话设置。",settingsReviewSkills:"审查可用技能",reviewPromptPlaceholder:"输入审查自定义提示词…(失焦后自动应用)",reviewPromptHint:"这些内容会追加到审查任务中;审查仍会强制要求输出 pass/fail JSON。技能开关仅对审查生效。",settingsVisionBridge:"视觉桥",settingsVisionBridgeDesc:"当前模型不支持识图时,把图片交给已配置的视觉模型转写为文字证据,再让模型回答",visionBridgeEnabled:"启用视觉桥",visionBridgeModel:"转写模型",visionBridgeAuto:"自动选择(按顺序)",visionBridgeNoModels:"未找到已配置的视觉模型:在模型配置里添加任意支持图片的模型(如 qwen-vl、GLM-4V、Gemini)即可自动启用",visionBridgeOffHint:"已关闭:图片将原样发送,纯文本模型可能看不到图片内容",visionBridgeCurrent:"当前转写模型:{model}",visionBridgePromptMode:"转写提示词",settingsTerminalTools:"终端工具",terminalToolsEnabled:"启用持久终端工具",settingsTerminalToolsDesc:"让 AI 在交互式程序(REPL/vim)、长驻服务、需要持续观察输出或你要求在可见终端操作时,使用内置终端;普通命令仍走一次性 bash 工具",terminalToolsOffHint:"已关闭:AI 无法使用 terminal_* 工具,也不会收到相关使用引导",settingsMessageDisplay:"消息显示",thinkingWrap:"完整显示思考",thinkingWrapDesc:"开启:思考内容始终完整展开并自动换行(流式推理过程也实时可见);关闭:折叠成一行摘要,流式中一行实时显示最新文本",toolsWrap:"完整显示工具",toolsWrapDesc:"开启:工具调用始终完整展开显示参数和输出;关闭:默认折叠,点击展开",terminalBashTakeover:"终端接管 bash",terminalBashTakeoverDesc:"bash 命令改在持久可见终端里执行:完整输出自动返回、shell 状态跨调用保留(cd/venv/ssh);命令静默超时自动转后台并在结束后主动通知 AI",terminalBashIdleMs:"静默转后台阈值(毫秒)",terminalBashIdleMsDesc:"命令连续无输出达到该时长即不再阻塞等待,转入后台继续运行并通知 AI;0 = 一直等到命令结束(默认 15000)",visionBridgePromptPlaceholder:"输入自定义转写提示词…(留空 = 使用内置默认提示词,失焦后自动应用)",visionBridgePromptAppendHint:"追加模式:自定义内容拼接到内置转写提示词末尾(推荐,保留默认的逐字转写约束)。",visionBridgePromptReplaceHint:"替换模式:完全用自定义内容替换内置转写提示词。切换后输入框会显示内置默认提示词,可直接修改;不改动失焦则仍使用默认。",uninstallExt:"卸载",uninstallConfirm:"确认卸载?",uninstallConfirmHint:"再次点击确认,将在终端执行 pi remove",uninstallHint:"通过可见终端执行 pi remove 卸载此包,完成后自动刷新列表",uninstallTitle:"卸载",pluginUpdate:"更新",pluginUpdateHint:"从安装来源重新拉取并覆盖安装(保留 config.json 配置),完成后自动重载插件列表",pluginUninstallHint:"在可见终端执行 pi-web-ui uninstall 卸载此插件(再次点击确认),完成后自动刷新列表",settingsExtensions:"插件",settingsUiPlugins:"界面插件",noUiPlugins:"未安装界面组件(<dataDir>/plugins/)",uiPluginNoSource:"手工安装,无来源信息,无法在线更新",uiPluginPerms:"能力声明",pluginSettingsSave:"保存插件设置",pluginSettingsSaving:"保存中…",pluginSettingsReset:"恢复默认",settingsPresets:"预设",settingsEnabled:"已启用",settingsDisabled:"已禁用",presetNamePlaceholder:"预设名称…",saveAsPreset:"保存为预设",applyPreset:"应用",deletePreset:"删除预设",noSkills:"暂无技能",noExtensions:"暂无插件",noPresets:"暂无预设(先调整上面的设置,再保存为预设组合)",loadingSession:"正在加载会话…",connectingServer:"正在连接 pi-web-ui 服务器…"},ka={cancel:"Cancel",ok:"OK",save:"Save",close:"Close",widgetExpand:"Click to view full output",dragToResize:"Drag to resize · double-click to reset",loading:"Loading…",connected:"Connected",connecting:"Connecting…",reconnecting:"Reconnecting…",language:"Language",langZh:"中文",langEn:"English",githubRepo:"GitHub repository (xing-shuyin/pi-web-ui)",copy:"Copy",viewSwitch:"Switch view",chat:"Chat",terminal:"Terminal",selectModel:"Select model",availableModels:"Available models",noModels:"No models available (configure an API key first)",reasoning:"reasoning",vision:"vision",refreshModels:"Refresh model list (keeps manual rows, merges new ones)",manageModels:"⚙ Manage models (add / edit)",manageModelsTitle:"Manage models",thinkingLevel:"Thinking level",thinking:"Thinking",thinkingChip:"Thinking: {level}",sound:"Sound",theme:"Theme",themeDefault:"Dark (default)",newChat:"New chat",more:"More",newChatTip:"New chat (sessions are saved per browser)","thinking.off":"Off","thinking.minimal":"Minimal","thinking.low":"Low","thinking.medium":"Medium","thinking.high":"High","thinking.xhigh":"Extra high","thinking.max":"Max",thinkingUnsupported:"Not supported by this model — snapped to the nearest supported level",context:"Context",contextUsage:"Context usage",cumulativeCost:"Cumulative cost",sessionMessages:"Session messages",messages:"messages",pluginStatus:"Plugin status",working:"Working",queued:"queued",enterPath:"Type a path, Enter to switch",cwdTip:"Working directory: {path} (click to switch)",folderRef:"Folder reference: {path}",refOnly:"Reference only: {path}",attachContent:"Attached content: {path}",attachLines:"Attached selected lines: {path} (lines {start}-{end})",attachImage:"Image: {name}",attachFile:"File: {name}",removeAttachment:"Remove attachment",attachHint:"Will be sent with the next message",uploadFile:"Add files (images / text / any file — or drag in / paste a screenshot)",dropHereToAttach:"Release to attach file",imageNotSupported:"The current model doesn't support vision — images will be transcribed by the vision bridge (may be ignored if no vision model is configured)",imageLoadFailed:"Couldn't read image: {name}",fileLoadFailed:"Couldn't read file: {name}",fileTooLarge:"File too large, skipped (> {size}MB): {name}",foldersNotSupported:"Folders can't be dropped directly — expand and pick files instead",placeholderStreaming:"The agent is working… press Enter to steer, or click Queue to send after the reply finishes",placeholderIdle:"Message pi — Enter to send, / for commands",placeholderConnecting:"Connecting to server…",stopAgent:"Stop agent",stop:"Stop",bgTasks:"Background tasks",bgTasksTip:"Servers the AI started in the background (npm run dev & etc.) — stop them individually or all at once; they survive the conversation",bgTasksEmpty:"No background tasks",bgTasksDesc:"Processes the AI started that are still listening (detected by port)",bgTaskPort:"Port",bgTaskPid:"PID",bgTaskSince:"Started",bgTaskStop:"Stop",bgTaskStopAll:"Stop all",bgTaskRefresh:"Refresh",bgTaskJustNow:"just now",bgTaskMinutes:"{n} min ago",bgTaskHours:"{n} hr ago",bgTaskDays:"{n} days ago",stopBash:"Stop",stopBashTip:"Stop the running bash command (conversation continues)",supplement:"Queue",supplementTip:"Add to queue: sent only after the whole run finishes (no interruption)",queueSteerTag:"Steer",queueFollowTag:"Queued",sendTip:"Send (Enter)",slashCommands:"Commands",slashMenuHint:"↑↓ select · Enter/Tab complete",slashHelpTitle:"pi commands",slashHelpHint:"Type / anytime to open the command list",slashLoading:"Loading commands… (available once connected)",slashBuiltin:"Builtin",slashExtension:"Extension",slashPrompt:"Template",slashSkill:"Skill",slashPlugin:"Plugin",slashCopied:"Copied the last assistant reply",slashCopyFailed:"Copy failed — please copy manually",slashCopyEmpty:"No assistant reply to copy yet",mermaidRendering:"Rendering diagram…",mermaidRenderFailed:"Diagram failed to render — showing raw source",recentProjects:"Recent projects",runningConversations:"Running chats",historySessions:"History",openHistory:"History",openFiles:"Files",streaming:"Streaming…",noHistory:"No previous chats",current:"Current",messageCount:"{n} messages",tuiTip:"Chat in the pi terminal (TUI)",deleteProject:"Remove from recent projects",deleteProjectConfirm:"Confirm remove",deleteSession:"Delete this chat transcript permanently",deleteSessionConfirm:"Confirm delete",confirm:"Confirm",expandCode:"Expand full content",collapseCode:"Collapse",zoomCode:"Open in a larger view",closeZoom:"Close",renameSession:"Rename this chat",renameSessionPlaceholder:"Chat name (empty falls back to first message)",openFolder:"Open folder…",openFolderPlaceholder:"Or paste an absolute path",openThisFolder:"Open this folder",openTypedPath:"Open typed path",parentFolder:"Parent folder",home:"Home",noSubfolders:"No subfolders here",listTruncated:"Too many folders — list truncated",emptyChat:"Empty chat",editReask:"Edit & re-ask",editReaskTip:"Edit this question and re-ask from here (forks a new conversation; the original is kept)",reaskFromHere:"Re-ask from here",editPlaceholder:"Edit the question…",editHint:"⌘/Ctrl+Enter to submit · Esc to cancel",editAttachmentHint:"Original attachments kept — paste/drop images or files · ⌘/Ctrl+Enter to submit · Esc to cancel",expandMsg:"Expand",collapseMsg:"Collapse",toolCalls:"tool calls",bashRuns:"bash runs",images:"images",update:"Update",updateTip:"Check & update pi-web-ui",currentVersion:"Current version",latestVersion:"Latest version",checkingUpdate:"Checking…",checkUpdate:"Check for updates",upToDate:"You're up to date",updateAvailable:"New version v{version} available",updateJustPublished:"v{version} was just published — npm cache may lag; if the new version isn't detected yet, re-check in a moment",updateNow:"Update in terminal",updateTabTitle:"Update pi-web-ui",updateTerminalHint:"Clicking runs npm i -g pi-web-ui@latest in a visible terminal; restart the service afterwards to take effect (pi-web-ui server restart).",rootDir:"Root",noFiles:"No files",filesTruncated:"Directory too large — list truncated (first 2000 shown)",linkFolderTip:"Link folder path to chat",attachInlineTip:"Attach content to chat",referenceTip:"Reference path only (AI reads on demand)",previewFile:"Preview",downloadFile:"Download file",downloadFailed:"Download failed: {error}",protocolMismatch:"Page version differs from the server (the app was just updated). Refresh the page to restore full functionality.",selectLinesHint:"Click a line to select; drag or Shift+click for a range",enableWrap:"Enable line wrap",disableWrap:"Disable line wrap",selectedRange:"Selected {n} lines (lines {start}-{end})",fileLines:"{n} lines",selectAll:"Select all",clearSelection:"Clear",addToChat:"Add to chat",addedToChat:"Added",previewTruncated:"⚠ File too large — previewing the first 512KB",previewLinesTruncated:"… too many lines — showing the first {n}",binaryFile:"🔣 Binary file — first 4KB shown as hex",binaryHexTruncated:" (file larger — download for the full file)",previewNotSupported:"This file type can't be previewed (only images / videos / text)",emptyFile:"(empty file)",editFile:"Edit file",exitEditFile:"Exit editing",saveFile:"Save file",discardFileChanges:"Discard unsaved changes?",fileSaved:"Saved",fileEditTruncated:"The preview is incomplete, so this file can't be edited",showMarkdownSource:"Show Markdown source",showMarkdownPreview:"Show Markdown preview",fullscreen:"Fullscreen",exitFullscreen:"Exit fullscreen",zoomIn:"Increase font size",zoomOut:"Decrease font size",resetZoom:"Reset zoom",pluginRequest:"Plugin request",noOptions:"(no options)",inputPlaceholder:"Enter content",soundHeader:"Sound notifications",enableSound:"Enable sound",preview:"Preview",volume:"Volume","sound.question":"Question popup","sound.question.desc":"When ask_user_question appears","sound.done":"Reply finished","sound.done.desc":"When the agent finishes a turn","sound.start":"Reply started","sound.start.desc":"When the agent starts a new turn","sound.error":"Error","sound.error.desc":"When an error notice appears",setupTitle:"pi agent config not detected",setupDesc:"pi-web-ui needs pi's config directory (~/.pi/agent) and at least one API key to run the agent. pi has built-in providers such as openai, anthropic, and deepseek — just pick one and enter a key, no terminal needed.",installFailed:"✖ pi agent installation failed:",retryInstall:"Retry install",skip:"Skip",installDone:"✅ pi agent CLI installed. Pick a provider and enter an API key to start chatting:",cliReadyHint:"✅ pi agent CLI already installed locally. Pick a provider and enter an API key to start chatting:",provider:"Provider",configured:"configured",providerKeyReady:"This provider already has a key — use it or replace it.",apiKey:"API key",saving:"Saving…",saveAndStart:"Save and start using",recheck:"Recheck",installing:"Installing pi agent CLI…",autoInstall:"Auto-install pi agent",attachment:"Attachment",plugin:"plugin",unknown:"unknown",thinkingWait:"Thinking",exitCode:"Exit code {code}",cancelled:"Cancelled",truncated:"… content too long, truncated in this view",outputTruncated:"… output too long, truncated in this view",refOnlyShort:"Reference only",folderRefShort:"Folder · reference only",inlineLines:"Inline · {n} lines",inlineLinesRange:"Lines {start}-{end}",image:"🖼 Image",bridgedVision:"👁 Transcribed",bridgedVisionDetail:"Image transcribed by the vision bridge (current model can't see images)",folderNotExpanded:"Folder — content not expanded, the agent will browse it as needed",fileNotExpanded:"Large file ({size}) — content not expanded, the agent will read it as needed","role.user":"You","role.assistant":"pi","role.tool":"Tool","role.bash":"Terminal","role.branch":"Branch summary","role.compaction":"Context compacted",welcomeTitle:"pi coding agent",welcomeSub:"Inspect, edit, run — always ready",directory:"Directory",clickToFill:"Click to fill input",waitingResponse:"Waiting for model response…",sending:"Sending",backToBottom:"Back to bottom",questionNavTitle:"Questions",searchPlaceholder:"Search in conversation…",searchNoResults:"No results",searchModels:"Filter models…",noModelMatches:"No matching models",searchGlobal:"Search",searchGlobalTip:"Global search: sessions / projects / files (Ctrl+K)",gsPlaceholder:"Search projects, past conversations, workspace files…",gsHint:"Type to search session history, recent projects and file names in the current workspace at once",gsSessions:"Conversations",gsProjects:"Projects",gsFiles:"Files",gsNoResults:"No matches",gsSearching:"Searching files…",gsTruncated:"Too many matches — showing a subset",gsCurrentProject:"current",gsOpenPreview:"Open file preview",gsNavigate:"select",gsOpen:"open",gsCloseHint:"close",bgTaskCommand:"Command",searchPrev:"Previous (Shift+Enter)",searchNext:"Next (Enter)",searchClose:"Close (Esc)",questionNavTip:"All questions in this conversation — hover to expand, click to jump","ex.understand":"Understand this project","ex.understand.prompt":"Introduce this project: overall structure, main modules, and how to run it?","ex.debug":"Debug an issue","ex.debug.prompt":"Help me debug a bug — describe the symptom first, and I'll add details.","ex.test":"Write tests","ex.test.prompt":"Write unit tests for the core modules.","ex.review":"Code review","ex.review.prompt":"Review the recently changed code and point out potential issues and improvements.",error:"Error",done:"Done",running:"Running…",toolQueued:"Queued",copyArgs:"Copy args",errorOutput:"Error output",output:"Output",waitingOutput:"Waiting for output…",toolDoneWaitingModel:"Done · waiting on model",waitingModel:"Waiting for model response…",thinkingNow:"Thinking",thinkingPreview:"Thinking: {preview}",leakedThinking:"Unexpected content (likely leaked reasoning text)",commands:"Commands",newCommand:"New command",newTerminal:"New terminal",name:"Name",command:"Command",cwdHint:"(${pwd} = current working directory)",noCommands:"No commands yet — click + to add one",clickToRun:"Click to run",edit:"Edit",delete:"Delete",confirmQ:"Confirm?",builtinTerminal:"Built-in terminal",termEmptySub:"Click a command on the left to run it, or + on the right for a new terminal",noTerminal:"No terminals",exited:"(exited{code})",closeTerminal:"Close terminal",rerun:"Reload .pi/commands.json",terminalTitle:"Terminal {n}",exampleName:"e.g. start dev server",exampleCommand:"e.g. npm run dev",scmTab:"Git",scmTitle:"Source Control",scmRefreshTip:"Re-query git status & diff",scmCurrentBranch:"Current branch",scmUpstreamGone:"Upstream deleted",scmAheadBehind:"↑{ahead} ↓{behind}",scmDetached:"Detached HEAD",scmSelectBranch:"Select branch…",scmRemoteBranches:"Remote branches",scmStageTip:"Stage {path}",scmUnstageTip:"Unstage {path}",scmSwitch:"Switch",scmSwitchBranch:"Switch branch",scmSwitchBranchTip:"Runs git checkout {branch} in the terminal",scmPush:"Push",scmPushTip:"Runs git push in the terminal",scmPull:"Pull",scmPullTip:"Runs git pull in the terminal",scmCommit:"Commit",scmCommitTip:'Runs git add -A && git commit -m "…" in the terminal (commits all changes incl. untracked)',scmCommitPlaceholder:"Type a commit message…",scmChanges:"Changes",scmHistory:"Commit tree",scmCommitDetail:"Commit details",scmSelectCommitHint:"Click a commit on the left to view its details",scmNoHistory:"No commits yet",scmNoChanges:"Working tree clean — no changes",scmNotGitRepo:"Current directory is not a Git repository",scmLoading:"Querying…",scmConnecting:"Waiting for connection…",scmDiff:"Diff",scmSelectFileHint:"Click a file on the left to view its diff",scmNoDiff:"(no diff)",scmStaged:"Staged",scmUnstaged:"Unstaged",scmStagedUnstaged:"Staged + unstaged",scmUntracked:"Untracked",scmUntrackedNote:"Untracked file — not shown in diff, included on commit",scmQueryFailed:"Git query failed: {error}",scmTooManyFailures:"Git queries keep failing — click refresh to retry",scmRunsInTerminal:"Commit / branch switch / push / pull run in the terminal",scmViewTerminal:"Open terminal",editProvider:"Edit provider",builtinProviders:"Built-in providers",hintKeyOnly:"Just enter an API key",configuredBadge:"✓ Configured",keyReady:"Key ready",replaceKey:"Replace key",replaceKeyTitle:"Replace the saved key",clearKey:"Clear",clearKeyTitle:"Remove this provider's key stored in auth.json; it returns to unconfigured (env-var sourced keys can't be cleared here)",clearKeyConfirm:"Clear the stored key for {id}? Its models will leave the list until you configure it again.",cloneProvider:"Clone as custom",cloning:"Cloning",cloneProviderTitle:"Copy this built-in provider (baseUrl + model catalog) into a custom provider — paste another API key to run both keys side by side",pasteKey:"Paste API key…",savingKey:"Saving",saveKey:"Save key",customProviders:"Custom providers",customDesc:"For Ollama / vLLM / OpenAI-compatible proxies, etc. Written to pi's models.json — hot-reloaded immediately.",noCustomProviders:"No custom providers yet",modelsCount:"{n} models",addProvider:"Add provider",providerId:"Provider ID",providerIdHint:"(required, e.g. ollama / my-proxy)",displayName:"Display name",displayNamePh:"My proxy",apiType:"API type",baseUrlHint:"(OpenAI-compatible endpoint)",apiKeyHint:"sk-… (optional — uses the auth.json key)",authHeader:"Auto-add Authorization header",modelsTitle:"Models",modelIdReq:"Model ID (required)",text:"Text",textImage:"Text+image",contextWindow:"Context",maxOutput:"Max output",removeModel:"Remove model",addModel:"Add model",deleteProviderConfirm:"Delete provider {id} and its {n} models?",fetchModels:"Fetch model list",fetchModelsHint:"Pull model IDs from the baseUrl /models endpoint (server-side, no CORS)",fetchingModels:"Fetching…",fetchModelsOk:"Fetched {n} models",fetchModelsEmpty:"The endpoint returned no models",fetchModelsErr:"Fetch failed: {msg}",fetchModelsNeedBaseUrl:"Enter a baseUrl first",goalBarTitle:"Goal",goalBarPlaceholder:"Set a goal; the agent's output is auto-reviewed…",goalBarSet:"Start",goalBarClear:"Cancel",goalBarLocked:"Locked: applies to every later turn",goalBarUnlocked:"This turn only (cleared afterwards)",goalBarReviewModel:"Review model",goalBarUseMainModel:"Use the main model",goalBarMaxRounds:"Max rounds",goalBarMaxRoundsTip:"Max review-revision rounds; 0 or empty = unlimited (keep revising until it passes)",goalBarUnlimitedShort:"Unlimited",goalBarReviewing:"Reviewing…",goalBarRound:"Round {n}",goalBarActive:"Goal active",goalBarPassed:"Passed",goalBarFailed:"Failed",goalBarStatusPending:"Waiting to generate…",goalWizardBtn:"AI Scrape",goalWizardTip:"Let AI refine the requirement into a goal via a Q&A survey",goalWizardRunning:"Scoping the goal",goalWizardAnswer:"Answer",goalWizardCard:"Goal survey",settings:"Settings",settingsTitle:"Settings",settingsDesc:"Changes apply immediately: system prompt, skill and extension toggles rebuild the current session; review instructions and review skills affect later goal reviews (main-session changes are deferred while streaming).",settingsSystemPrompt:"System prompt",settingsPromptMode:"Mode",promptModeAppend:"Append",promptModeReplace:"Replace",promptAppendHint:"Append mode: your text is appended to the end of the default system prompt (recommended — keeps the default behavior constraints).",promptReplaceHint:"Replace mode: your text fully replaces the system prompt (project context and skills are still appended automatically). After switching, the editor shows the built-in default prompt ready to edit; blurring without changes keeps the default.",promptPlaceholder:"Type a custom system prompt… (applied on blur)",settingsViewPrompt:"View the current full prompt",settingsViewPromptHint:"The full system prompt actually in effect for this conversation (custom append/replace text, project context, skills and tool guidance). Read-only.",settingsViewPromptEmpty:"Session not ready yet — no system prompt available.",settingsSkills:"Skills",settingsReview:"Goal review",settingsReviewDesc:"Configure extra instructions and skills for the isolated goal-review session; the main session is unaffected.",settingsReviewSkills:"Skills available to review",reviewPromptPlaceholder:"Type custom review instructions… (applied on blur)",reviewPromptHint:"These instructions are added to the review task; pass/fail JSON output is still enforced. Skill toggles apply only to review.",settingsVisionBridge:"Vision bridge",settingsVisionBridgeDesc:"When the current model can't see images, send them to a configured vision model and transcribe into text evidence first",visionBridgeEnabled:"Enable vision bridge",visionBridgeModel:"Transcription model",visionBridgeAuto:"Auto (in order)",visionBridgeNoModels:"No configured vision model found: add any image-capable model (e.g. qwen-vl, GLM-4V, Gemini) in Model config to enable automatically",visionBridgeOffHint:"Disabled: images are sent as-is, a text-only model may not see them",visionBridgeCurrent:"Current transcription model: {model}",visionBridgePromptMode:"Transcription prompt",settingsTerminalTools:"Terminal tools",terminalToolsEnabled:"Enable persistent terminal tools",settingsTerminalToolsDesc:"Let the AI use the built-in terminal for interactive programs (REPLs/vim), long-running servers, continuous output watching, or when you ask it to work in the visible terminal; ordinary commands still go through the one-shot bash tool",terminalToolsOffHint:"Disabled: the AI has no terminal_* tools and receives no usage guidance",settingsMessageDisplay:"Message display",thinkingWrap:"Show full thinking",thinkingWrapDesc:"On: thinking always expands fully and wraps (live reasoning visible while streaming); Off: collapses to a one-line summary with the latest text shown live while streaming",toolsWrap:"Show full tools",toolsWrapDesc:"On: tool calls always expand fully showing arguments and output; Off: collapsed by default, click to expand",terminalBashTakeover:"Terminal-backed bash",terminalBashTakeoverDesc:"Run bash commands inside the persistent visible terminal: full output returned automatically, shell state retained across calls (cd/venv/ssh); silent commands move to the background and notify the AI when they finish",terminalBashIdleMs:"Silence-to-background threshold (ms)",terminalBashIdleMsDesc:"When a command produces no output for this long, stop blocking and let it keep running in the background; the AI is notified when it finishes. 0 = always wait until completion (default 15000)",visionBridgePromptPlaceholder:"Type a custom transcription prompt… (empty = built-in default, applied on blur)",visionBridgePromptAppendHint:"Append mode: custom text is appended after the built-in transcription prompt (recommended — keeps the verbatim-transcription contract).",visionBridgePromptReplaceHint:"Replace mode: custom text replaces the built-in transcription prompt entirely. After switching, the editor shows the built-in default prompt ready to edit; blurring without changes keeps the default.",uninstallExt:"Uninstall",uninstallConfirm:"Confirm?",uninstallConfirmHint:"Click again to confirm — runs pi remove in the terminal",uninstallHint:"Runs pi remove in a visible terminal, then refreshes the list automatically",uninstallTitle:"Uninstall",pluginUpdate:"Update",pluginUpdateHint:"Re-installs from the recorded source (--force, keeps config.json), then refreshes the plugin list automatically",pluginUninstallHint:"Runs pi-web-ui uninstall in a visible terminal (click again to confirm), then refreshes the list automatically",settingsExtensions:"Extensions",settingsUiPlugins:"UI plugins",noUiPlugins:"No UI plugins installed (<dataDir>/plugins/)",uiPluginNoSource:"Installed manually — no recorded source, online update unavailable",uiPluginPerms:"Permissions",pluginSettingsSave:"Save plugin settings",pluginSettingsSaving:"Saving…",pluginSettingsReset:"Reset defaults",settingsPresets:"Presets",settingsEnabled:"Enabled",settingsDisabled:"Disabled",presetNamePlaceholder:"Preset name…",saveAsPreset:"Save as preset",applyPreset:"Apply",deletePreset:"Delete preset",noSkills:"No skills",noExtensions:"No extensions",noPresets:"No presets yet (tune the settings above, then save them as a preset)",loadingSession:"Loading session…",connectingServer:"Connecting to pi-web-ui server…"},Hs=r.createContext(null);function Na(){try{const t=localStorage.getItem(Ws);if(t==="zh"||t==="en")return t}catch{}return"zh"}function wa({children:t}){const[s,a]=r.useState(Na),l=r.useCallback(n=>{a(n);try{localStorage.setItem(Ws,n)}catch{}},[]),c=r.useCallback((n,o)=>{let d=ka[n];if(s==="zh"&&(d=ba[n]),o)for(const[u,h]of Object.entries(o))d=d.replaceAll(`{${u}}`,String(h));return d},[s]);r.useEffect(()=>{document.documentElement.lang=s==="zh"?"zh-CN":"en"},[s]);const i=r.useMemo(()=>({locale:s,setLocale:l,t:c}),[s,l,c]);return e.jsx(Hs.Provider,{value:i,children:t})}function Ft(){const t=r.useContext(Hs);if(!t)throw new Error("useI18n must be used within LanguageProvider");return t}function me(){return Ft().t}const Ca=["off","minimal","low","medium","high","xhigh","max"],Us=r.memo(function({state:s,models:a,modelsLoading:l,send:c,onManageModels:i,compact:n=!1}){const o=me(),d=s==null?void 0:s.model,u=d?`${d.provider}/${d.id}`:null,[h,m]=r.useState(!1),[x,C]=r.useState(!1),[M,R]=r.useState("");r.useEffect(()=>{h||R("")},[h]);const w=r.useMemo(()=>{const S=M.trim().toLowerCase();return S?a.filter(y=>y.name.toLowerCase().includes(S)||y.provider.toLowerCase().includes(S)||y.id.toLowerCase().includes(S)):a},[a,M]),[I,E]=r.useState(!1),P=s!=null&&s.availableThinkingLevels&&s.availableThinkingLevels.length>0?new Set(s.availableThinkingLevels):null,D=Ca.map(S=>({value:S,label:o(`thinking.${S}`),supported:P?P.has(S):!0})),A=S=>{var y;return((y=D.find(b=>b.value===S))==null?void 0:y.label)??S};return r.useEffect(()=>{h&&a.length===0&&!I&&!l&&(E(!0),c({type:"list_models"}))},[h,a.length,I,l,c]),r.useEffect(()=>{a.length>0&&E(!1)},[a.length]),e.jsxs(e.Fragment,{children:[e.jsxs(Ue,{trigger:e.jsxs(e.Fragment,{children:[e.jsx(tt,{}),e.jsx("span",{className:"chip-model",children:d?d.name:o("selectModel")}),!n&&(d==null?void 0:d.vision)&&e.jsx("span",{className:"chip-vision",title:o("vision"),children:"🖼"}),!n&&d&&e.jsx("span",{className:"chip-sub",children:d.provider})]}),open:h,onOpenChange:m,menuClassName:"dd-menu-model",children:[e.jsx("div",{className:"dd-header",children:o("availableModels")}),e.jsxs("div",{className:"dd-search-row",children:[e.jsx(mt,{}),e.jsx("input",{className:"dd-search",type:"text",placeholder:o("searchModels"),value:M,onChange:S=>R(S.target.value)})]}),e.jsxs("div",{className:"dd-model-scroll",children:[(I||l)&&e.jsx("div",{className:"dd-loading",children:o("loading")}),a.length===0&&!I&&!l&&e.jsx("div",{className:"dd-loading",children:o("noModels")}),w.length===0&&a.length>0&&e.jsx("div",{className:"dd-loading",children:o("noModelMatches")}),w.map(S=>e.jsx(Le,{active:u===S.id,onClick:()=>{u!==S.id&&c({type:"set_model",modelId:S.id}),m(!1)},children:e.jsxs("span",{className:"dd-model-cell",children:[e.jsx("span",{className:"dd-model-name",children:S.name}),e.jsxs("span",{className:"dd-model-meta",children:[e.jsx("span",{className:"dd-model-provider",children:S.provider}),(S.reasoning||S.vision)&&e.jsxs("span",{className:"dd-model-badges",children:[S.reasoning&&e.jsx("span",{className:"dd-model-badge",children:o("reasoning")}),S.vision&&e.jsx("span",{className:"dd-model-badge",children:o("vision")})]})]})]})},S.id))]}),e.jsxs("div",{className:"dd-footer",children:[e.jsx("button",{type:"button",className:"dd-refresh",onClick:()=>c({type:"list_models"}),children:o("refreshModels")}),e.jsx("button",{type:"button",className:"dd-refresh",onClick:()=>{m(!1),i()},children:o("manageModels")})]})]}),e.jsxs(Ue,{trigger:e.jsxs(e.Fragment,{children:[e.jsx(it,{}),e.jsx("span",{className:"chip-sub",children:o("thinkingChip",{level:s?A(s.thinkingLevel):"—"})})]}),open:x,onOpenChange:C,children:[e.jsx("div",{className:"dd-header",children:o("thinkingLevel")}),D.map(S=>e.jsx(Le,{active:(s==null?void 0:s.thinkingLevel)===S.value,disabled:!S.supported,title:S.supported?void 0:o("thinkingUnsupported"),onClick:()=>{(s==null?void 0:s.thinkingLevel)!==S.value&&c({type:"set_thinking",level:S.value}),C(!1)},children:S.label},S.value))]})]})}),Sa=[{kind:"question",labelKey:"sound.question",descKey:"sound.question.desc"},{kind:"done",labelKey:"sound.done",descKey:"sound.done.desc"},{kind:"start",labelKey:"sound.start",descKey:"sound.start.desc"},{kind:"error",labelKey:"sound.error",descKey:"sound.error.desc"}];function as({settings:t,onChange:s,onPreview:a}){const l=me(),c=i=>s({...t,...i});return e.jsxs("div",{className:"sound-menu",children:[e.jsx("div",{className:"dd-header",children:l("soundHeader")}),e.jsxs("label",{className:"sound-row sound-master",children:[e.jsxs("span",{className:"sound-label",children:[e.jsx(Is,{className:"sound-icon"}),e.jsx("span",{children:l("enableSound")})]}),e.jsx("input",{type:"checkbox",checked:t.enabled,onChange:i=>c({enabled:i.target.checked})})]}),Sa.map(({kind:i,labelKey:n,descKey:o})=>e.jsxs("label",{className:`sound-row ${t.enabled?"":"disabled"}`,children:[e.jsxs("span",{className:"sound-label",children:[e.jsx("span",{className:"sound-name",children:l(n)}),e.jsx("span",{className:"sound-desc",children:l(o)})]}),e.jsxs("span",{className:"sound-right",children:[e.jsx("button",{type:"button",className:"sound-preview",title:l("preview"),disabled:!t.enabled,onClick:d=>{d.preventDefault(),a(i)},children:l("preview")}),e.jsx("input",{type:"checkbox",checked:t[i],disabled:!t.enabled,onChange:d=>c({[i]:d.target.checked})})]})]},i)),e.jsxs("div",{className:`sound-volume ${t.enabled?"":"disabled"}`,children:[e.jsx("span",{className:"sound-name",children:l("volume")}),e.jsx("input",{type:"range",min:0,max:100,step:5,value:t.volume,disabled:!t.enabled,onChange:i=>c({volume:Number(i.target.value)})}),e.jsxs("span",{className:"sound-vol-num",children:[t.volume,"%"]})]})]})}function Ta({chat:t,send:s,terminal:a,view:l,plugins:c,onViewChange:i,onOpenPanel:n,onManageModels:o,onOpenSettings:d,onOpenBgTasks:u,onOpenGlobalSearch:h,sound:m,onSoundChange:x,onSoundPreview:C}){const{locale:M,setLocale:R,t:w}=Ft(),[I,E]=r.useState(!1),[P,D]=r.useState(!1),[A,S]=r.useState(!1),y=[{value:"zh",label:w("langZh")},{value:"en",label:w("langEn")}],b=t.ready?w("connected"):t.status==="closed"?w("reconnecting"):w("connecting"),f=t.ready?"ok":"busy";return e.jsxs("header",{className:"topbar",children:[e.jsxs("div",{className:"brand",children:[e.jsx("button",{type:"button",className:"panel-toggle",title:w("openHistory"),onClick:()=>n("left"),children:e.jsx(na,{})}),e.jsx("span",{className:"brand-logo",children:"π"}),e.jsx("span",{className:"brand-name",children:"pi-web-ui"}),e.jsx("span",{className:`conn-dot ${f}`,title:b}),e.jsx("span",{className:"conn-label",children:b})]}),e.jsxs("div",{className:"topbar-actions",children:[e.jsxs("div",{className:"view-switch",role:"tablist","aria-label":w("viewSwitch"),children:[e.jsxs("button",{type:"button",role:"tab","aria-selected":l==="chat",className:l==="chat"?"active":"",onClick:()=>i("chat"),children:[e.jsx(Ke,{}),e.jsx("span",{children:w("chat")})]}),e.jsxs("button",{type:"button",role:"tab","aria-selected":l==="terminal",className:l==="terminal"?"active":"",onClick:()=>i("terminal"),children:[e.jsx(qe,{}),e.jsx("span",{children:w("terminal")})]}),e.jsxs("button",{type:"button",role:"tab","aria-selected":l==="git",className:l==="git"?"active":"",onClick:()=>i("git"),children:[e.jsx(rt,{}),e.jsx("span",{children:w("scmTab")})]}),c.map(T=>{const J=T.error?`${T.name}: ${T.error}`:T.description?`${T.name} — ${T.description}`:T.name;return e.jsxs("button",{type:"button",role:"tab","aria-selected":l===`plugin:${T.id}`,className:`plugin-tab${l===`plugin:${T.id}`?" active":""}${T.error?" broken":""}`,title:J,onClick:()=>i(`plugin:${T.id}`),children:[T.icon?e.jsx("span",{"aria-hidden":!0,children:T.icon}):null,e.jsx("span",{children:T.name})]},T.id)})]}),e.jsxs("div",{className:"topbar-desktop",children:[e.jsxs("button",{type:"button",className:"chip",title:w("searchGlobalTip"),onClick:h,children:[e.jsx(mt,{}),e.jsx("span",{className:"chip-sub",children:w("searchGlobal")})]}),e.jsxs("button",{type:"button",className:"chip bg-task-chip","data-tip":w("bgTasksTip"),onClick:u,children:[e.jsx(pt,{}),e.jsx("span",{className:"chip-sub",children:w("bgTasks")}),t.bgServers.length>0&&e.jsx("span",{className:"bg-task-badge",children:t.bgServers.length})]}),e.jsx(Us,{state:t.state?{model:t.state.model,thinkingLevel:t.state.thinkingLevel,availableThinkingLevels:t.state.availableThinkingLevels}:null,models:t.models,modelsLoading:t.modelsLoading,send:s,onManageModels:o}),e.jsxs("button",{type:"button",className:"chip",title:w("settingsTitle"),onClick:d,children:[e.jsx(ut,{}),e.jsx("span",{className:"chip-sub",children:w("settings")})]}),e.jsx(Ue,{trigger:e.jsxs(e.Fragment,{children:[e.jsx(Is,{}),e.jsx("span",{className:"chip-sub",children:w("sound")})]}),open:I,onOpenChange:E,children:e.jsx(as,{settings:m,onChange:x,onPreview:C})}),e.jsxs(Ue,{trigger:e.jsxs(e.Fragment,{children:[e.jsx(ua,{}),e.jsx("span",{className:"chip-sub",children:M==="zh"?w("langZh"):"EN"})]}),open:P,onOpenChange:D,children:[e.jsx("div",{className:"dd-header",children:w("language")}),y.map(T=>e.jsx(Le,{active:M===T.value,onClick:()=>{R(T.value),D(!1)},children:T.label},T.value))]})]}),e.jsxs("button",{type:"button",className:"chip newchat","data-tip":w("newChatTip"),onClick:()=>s({type:"new_chat"}),children:[e.jsx(ze,{}),e.jsx("span",{children:w("newChat")})]}),e.jsx("div",{className:"topbar-more",children:e.jsxs(Ue,{trigger:e.jsxs(e.Fragment,{children:[e.jsx(ta,{}),e.jsx("span",{className:"chip-sub",children:w("more")})]}),open:A,onOpenChange:S,children:[e.jsx("div",{className:"dd-header",children:w("sound")}),e.jsx("div",{className:"dd-header",children:w("settings")}),e.jsxs(Le,{onClick:()=>{S(!1),d()},children:[e.jsx(ut,{})," ",w("settingsTitle")]}),e.jsxs(Le,{onClick:()=>{S(!1),h()},children:[e.jsx(mt,{})," ",w("searchGlobal")]}),e.jsxs(Le,{onClick:()=>{S(!1),u()},children:[e.jsx(pt,{})," ",w("bgTasks"),t.bgServers.length>0&&e.jsx("em",{className:"bg-task-badge",children:t.bgServers.length})]}),e.jsx(as,{settings:m,onChange:x,onPreview:C}),e.jsx("div",{className:"dd-header",children:w("language")}),y.map(T=>e.jsx(Le,{active:M===T.value,onClick:()=>R(T.value),children:T.label},T.value))]})}),e.jsx("button",{type:"button",className:"panel-toggle",title:w("openFiles"),onClick:()=>n("right"),children:e.jsx(Ie,{})})]})]})}function Ea({dirBrowse:t,onBrowse:s,onPick:a,onClose:l}){const c=me(),[i,n]=r.useState("");r.useEffect(()=>{s(void 0)},[]),r.useEffect(()=>{const m=x=>{x.key==="Escape"&&l()};return window.addEventListener("keydown",m),()=>window.removeEventListener("keydown",m)},[l]);const o=(t==null?void 0:t.path)??"",d=o.includes("\\")&&!o.includes("/")?"\\":"/",u=m=>o.endsWith(d)?`${o}${m}`:`${o}${d}${m}`,h=(t==null?void 0:t.drives)??[];return e.jsx("div",{className:"modal-backdrop",onClick:l,children:e.jsxs("div",{className:"fpk-modal",role:"dialog","aria-modal":"true",onClick:m=>m.stopPropagation(),children:[e.jsxs("div",{className:"fpk-modal-head",children:[e.jsx(Ie,{className:"modal-head-icon"}),e.jsx("h2",{children:c("openFolder")}),e.jsx("span",{className:"toolcall-spacer"}),e.jsx("button",{type:"button",className:"toolcall-zoom-close",title:c("cancel"),onClick:l,children:e.jsx(we,{})})]}),e.jsxs("div",{className:"fpk-modal-bar",children:[e.jsx("button",{type:"button",className:"fpk-nav-btn",title:c("home"),onClick:()=>s(void 0),children:e.jsx(ca,{})}),e.jsx("button",{type:"button",className:"fpk-nav-btn",title:c("parentFolder"),disabled:!(t!=null&&t.parent),onClick:()=>(t==null?void 0:t.parent)&&s(t.parent),children:e.jsx(pa,{})}),e.jsx("code",{className:"fpk-path",title:o,children:o||"…"})]}),h.length>0&&e.jsx("div",{className:"fpk-drives",children:h.map(m=>e.jsxs("button",{type:"button",className:`fpk-drive ${o.toUpperCase().startsWith(m.toUpperCase())?"active":""}`,onClick:()=>s(m),children:[e.jsx(da,{}),e.jsx("span",{children:m.replace(/\\$/,"")})]},m))}),e.jsxs("div",{className:"fpk-list",children:[t&&t.dirs.length===0&&e.jsx("div",{className:"panel-empty",children:c("noSubfolders")}),t==null?void 0:t.dirs.map(m=>e.jsxs("button",{type:"button",className:"fpk-item",onClick:()=>s(u(m)),children:[e.jsx(Ie,{className:"fpk-item-icon"}),e.jsx("span",{className:"fpk-item-name",children:m}),e.jsx(Je,{className:"fpk-item-go"})]},m)),(t==null?void 0:t.truncated)&&e.jsx("div",{className:"panel-empty",children:c("listTruncated")})]}),e.jsxs("form",{className:"fpk-modal-foot",onSubmit:m=>{m.preventDefault();const x=i.trim()||o;x&&a(x)},children:[e.jsx("input",{className:"lp-inline-input",placeholder:c("openFolderPlaceholder"),value:i,onChange:m=>n(m.target.value)}),e.jsxs("button",{type:"submit",className:"fpk-open-btn",disabled:!o&&!i.trim(),children:[e.jsx(Ve,{}),e.jsx("span",{children:i.trim()?c("openTypedPath"):c("openThisFolder")})]})]})]})})}function is(t){const s=new Date(t),a=new Date;return s.toDateString()===a.toDateString()?`${String(s.getHours()).padStart(2,"0")}:${String(s.getMinutes()).padStart(2,"0")}`:`${s.getMonth()+1}/${s.getDate()}`}const Ma=r.memo(function({ready:s,status:a,cwd:l,sessionFile:c,conversations:i,sessions:n,projects:o,dirBrowse:d,activeConversationId:u,send:h,active:m}){const x=me(),C=c,M=l,[R,w]=r.useState(null),[I,E]=r.useState(null),[P,D]=r.useState(""),[A,S]=r.useState(!1),[y,b]=r.useState(null);r.useEffect(()=>{y&&l===y&&b(null)},[l,y]),r.useEffect(()=>{if(!y)return;const v=setTimeout(()=>b(null),15e3);return()=>clearTimeout(v)},[y]),r.useEffect(()=>{!m||!s||a!=="open"||l&&(h({type:"list_sessions"}),h({type:"list_projects"}))},[m,s,a,l,h]);const f=v=>{const W=v.name||v.firstMessage.trim();return W.length>0?W:x("emptyChat")},T=new Set(i.map(v=>v.sessionFile).filter(v=>typeof v=="string"&&v.length>0)),J=n.filter(v=>!T.has(v.path)),ee=v=>v.split(/[\\/]/).pop()||v,ie=v=>{const W=v.replace(/[\\/]+$/,""),$=Math.max(W.lastIndexOf("/"),W.lastIndexOf("\\"));return $<=0?"":W.slice(0,$)},Q=(v,W,$,X)=>{const ce=R===v;return e.jsx("button",{type:"button",className:`lp-del ${ce?"confirm":""}`,title:ce?$:W,onClick:z=>{z.stopPropagation(),ce?(w(null),X()):w(v)},children:ce?e.jsx(Ve,{}):e.jsx(_e,{})})};return e.jsxs("aside",{className:"panel panel-left",children:[e.jsxs("div",{className:"panel-projects",children:[e.jsx("div",{className:"panel-section-title",children:x("recentProjects")}),e.jsxs("button",{type:"button",className:"lp-add-project",onClick:()=>S(!0),children:[e.jsx(ma,{className:"project-icon"}),e.jsx("span",{children:x("openFolder")})]}),e.jsx("div",{className:"projects-scroll",children:o.map(v=>{const W=M===v.path,$=!W&&y===v.path;return e.jsxs("div",{className:"lp-row",onMouseLeave:()=>w(X=>X===`proj:${v.path}`?null:X),children:[e.jsxs("button",{type:"button",className:`project-item ${W?"active":""} ${$?"pending":""}`,title:v.path,onClick:()=>{W||(b(v.path),h({type:"set_cwd",path:v.path}))},children:[e.jsx(Ie,{className:"project-icon"}),e.jsxs("span",{className:"project-info",children:[e.jsx("span",{className:"project-name",children:ee(v.path)}),ie(v.path)&&e.jsx("span",{className:"project-path",children:ie(v.path)})]}),$?e.jsx("span",{className:"thinking-spinner project-spinner","aria-hidden":"true"}):e.jsx("span",{className:"project-time",children:is(v.lastUsed)})]}),Q(`proj:${v.path}`,x("deleteProject"),x("deleteProjectConfirm"),()=>h({type:"remove_project",path:v.path}))]},v.path)})})]}),i.length>0&&e.jsxs("div",{className:"panel-convs",children:[e.jsx("div",{className:"panel-section-title",children:x("runningConversations")}),i.map(v=>{const W=u===v.id;return e.jsxs("button",{type:"button",className:`session-item ${W?"active":""}`,title:v.title,onClick:()=>{W||h({type:"switch_conversation",id:v.id})},children:[e.jsx(Ke,{className:"session-icon"}),e.jsxs("span",{className:"session-info",children:[e.jsx("span",{className:"session-title",children:v.title}),e.jsx("span",{className:"session-sub",children:W?x("current"):x("messageCount",{n:v.messageCount})})]}),v.isStreaming&&e.jsx("span",{className:"conv-streaming",title:x("streaming")})]},v.id)}),e.jsx("div",{className:"panel-section-divider"})]}),e.jsxs("div",{className:"panel-sessions",children:[e.jsx("div",{className:"panel-section-title",children:x("historySessions")}),e.jsxs("div",{className:"sessions-scroll",children:[J.length===0&&e.jsx("div",{className:"panel-empty",children:x("noHistory")}),J.map(v=>{const W=C===v.path;return I===v.path?e.jsxs("form",{className:"lp-inline-form",onSubmit:$=>{$.preventDefault(),h({type:"rename_session",path:v.path,name:P.trim()}),E(null)},children:[e.jsx("input",{autoFocus:!0,className:"lp-inline-input",placeholder:x("renameSessionPlaceholder"),value:P,onChange:$=>D($.target.value),onKeyDown:$=>{$.key==="Escape"&&E(null)}}),e.jsx("button",{type:"submit",className:"lp-inline-ok",title:x("confirm"),children:e.jsx(Ve,{})}),e.jsx("button",{type:"button",className:"lp-inline-cancel",title:x("cancel"),onClick:()=>E(null),children:e.jsx(we,{})})]},v.path):e.jsxs("div",{className:"lp-row",onMouseLeave:()=>w($=>$===`sess:${v.path}`?null:$),children:[e.jsxs("button",{type:"button",className:`session-item ${W?"active":""}`,title:v.path,onClick:()=>{W||h({type:"switch_session",path:v.path})},children:[e.jsx(Ke,{className:"session-icon"}),e.jsxs("span",{className:"session-info",children:[e.jsx("span",{className:"session-title",children:f(v)}),e.jsxs("span",{className:"session-sub",children:[W?x("current"):x("messageCount",{n:v.messageCount}),v.source==="tui"&&e.jsx("span",{className:"session-src",title:x("tuiTip"),children:"TUI"})]})]}),e.jsx("span",{className:"session-time",children:is(v.modified)})]}),e.jsx("button",{type:"button",className:"lp-rename",title:x("renameSession"),onClick:$=>{$.stopPropagation(),D(v.name??""),E(v.path)},children:e.jsx(Mt,{})}),Q(`sess:${v.path}`,x("deleteSession"),x("deleteSessionConfirm"),()=>h({type:"delete_session",path:v.path}))]},v.path)})]})]}),A&&e.jsx(Ea,{dirBrowse:d,onBrowse:v=>h({type:"browse_dirs",path:v}),onPick:v=>{b(v),h({type:"set_cwd",path:v}),S(!1)},onClose:()=>S(!1)})]})});function Ge(){if(typeof crypto<"u"&&typeof crypto.randomUUID=="function")return crypto.randomUUID();const t=new Uint8Array(16);if(typeof crypto<"u"&&typeof crypto.getRandomValues=="function")crypto.getRandomValues(t);else for(let a=0;a<16;a++)t[a]=Math.floor(Math.random()*256);t[6]=t[6]&15|64,t[8]=t[8]&63|128;const s=[...t].map(a=>a.toString(16).padStart(2,"0")).join("");return`${s.slice(0,8)}-${s.slice(8,12)}-${s.slice(12,16)}-${s.slice(16,20)}-${s.slice(20)}`}const qs="pi-web-ui:token";function La(){try{const t=new URL(window.location.href),s=t.searchParams.get("token");s&&(localStorage.setItem(qs,s.trim()),t.searchParams.delete("token"),window.history.replaceState(null,"",t.toString()))}catch{}}function Pa(){try{return localStorage.getItem(qs)??""}catch{return""}}function $t(t){const s=Pa();return s?`${t}${t.includes("?")?"&":"?"}token=${encodeURIComponent(s)}`:t}function Ra(t,s){const a=s.assistantMessageEvent,l=t.stats.tokens,c=s.usage!==null?{...l,...s.usage}:l,i=c===l?t.stats:{...t.stats,tokens:c};if(a.type!=="text_delta"&&a.type!=="thinking_delta")return i===t.stats?t:{...t,stats:i};const n=a.delta??"";if(!n)return i===t.stats?t:{...t,stats:i};const o=t.streamingMessage??null,d=o&&o.id===s.messageId?o:{id:s.messageId,content:[]},u=[...d.content],h=a.type==="thinking_delta"?"thinking":"text",m=a.contentIndex??u.length-1;return m>=0&&m<u.length&&u[m].type===h?u[m]=h==="thinking"?{type:"thinking",thinking:(u[m].thinking??"")+n}:{type:"text",text:(u[m].text??"")+n}:u.push(h==="thinking"?{type:"thinking",thinking:n}:{type:"text",text:n}),{...t,stats:i,streamingMessage:{...d,id:s.messageId,content:u}}}const Lt="pi-web-ui:plugin-data";function Ia(t,s){window.dispatchEvent(new CustomEvent(Lt,{detail:{pluginId:t,payload:s}}))}function Da(t){const s=a=>{const l=a.detail;t(l.pluginId,l.payload)};return window.addEventListener(Lt,s),()=>window.removeEventListener(Lt,s)}const He=new Map,Pt=new Set,Oe=new Set;let rs=-1;function zs(){return[...He.values()]}function Fa(){const t=zs();for(const s of Pt)s(t)}function $a(t){return Pt.add(t),t(zs()),()=>Pt.delete(t)}async function _a(t,s){s!==rs&&(rs=s,He.clear(),Oe.clear());const a=new Set(t.map(l=>l.id));for(const l of[...He.keys()])a.has(l)||He.delete(l);for(const l of[...Oe])a.has(l)||Oe.delete(l);await Promise.all(t.filter(l=>l.hasClient&&!l.error&&!He.has(l.id)&&!Oe.has(l.id)).map(async l=>{try{const i=(await It(()=>import(`/plugins/${encodeURIComponent(l.id)}/client/entry.mjs?e=${s}`),[])).default;i&&typeof i.mount=="function"?He.set(l.id,{info:l,module:i}):(Oe.add(l.id),console.error(`[plugin:${l.id}] entry.mjs 缺少 default.mount`))}catch(c){Oe.add(l.id),console.error(`[plugin:${l.id}] 客户端加载失败:`,c)}})),Fa()}function Ba(t,s){return{pluginId:t,send:a=>s({type:"plugin_message",pluginId:t,payload:a}),onData:a=>Da((l,c)=>{l===t&&a(c)})}}const Aa=10,jt=2e5,Oa=2e5,Wa={conversationId:null,goal:null,reviewModel:null,maxRounds:3,locked:!0,reviewing:!1,round:0,status:"",verdict:"pending",wizard:{active:!1,draft:"",model:null,step:0,maxSteps:6,status:""}};function Ha(){const t=new Map,s=new Map,a=(l,c)=>`${l}:${c}`;return{write(l,c,i){const n=a(l,c),o=t.get(n);if(o&&o.size>0){for(const h of o)try{h.write(i)}catch{}return}const d=s.get(n)??"",u=d.length+i.length>Oa?i:d+i;s.set(n,u)},register(l,c,i){const n=a(l,c);let o=t.get(n);o||(o=new Set,t.set(n,o)),o.add(i);const d=s.get(n);if(d){try{i.write(d)}catch{}s.delete(n)}return()=>{const u=t.get(n);u&&(u.delete(i),u.size===0&&t.delete(n)),s.delete(n)}},clear(){t.clear(),s.clear()}}}function ls(t,s){const a=new Set;for(const c of s.messages)c.role==="toolResult"&&c.toolCallId&&a.add(c.toolCallId),c.role==="bashExecution"&&a.add(`bash-${c.id}`);let l=!1;for(const c of t.keys())a.has(c)&&(t.delete(c),l=!0);return l?new Map(t):t}function os(t,s){if(t.size===0)return t;const a=new Set;for(const c of s.messages)c.role==="toolResult"&&c.toolCallId&&a.add(c.toolCallId);let l=!1;for(const c of t.keys())a.has(c)&&(t.delete(c),l=!0);return l?new Map(t):t}function Ua(t,s){var a,l,c,i;switch(s.type){case"status":return{...t,status:s.status,ready:s.status==="open"?t.ready:!1,terminals:s.status==="closed"?[]:t.terminals};case"ready":return{...t,serverVersion:s.serverVersion,ready:!0,protocolMismatch:s.protocolVersion!==void 0&&s.protocolVersion!==Aa};case"snapshot":return{...t,ready:!0,state:s.state,activeConversationId:s.state.conversationId,liveOutputs:ls(t.liveOutputs,s.state),toolStatuses:os(t.toolStatuses,s.state),pendingEcho:null};case"snapshot_delta":{const n=t.state,o=s.msg;if(!n||n.conversationId!==o.conversationId||n.rev!==o.baseRev)return t;const d={...n,...o.state,messages:o.appended.length>0?[...n.messages,...o.appended]:n.messages};return{...t,ready:!0,state:d,activeConversationId:d.conversationId,liveOutputs:ls(t.liveOutputs,d),toolStatuses:os(t.toolStatuses,d),pendingEcho:o.appended.length>0?null:t.pendingEcho}}case"tool_delta":{const n=t.liveOutputs.get(s.toolCallId),o=((n==null?void 0:n.text)??"")+s.delta,d=o.length>jt?`…[前 ${o.length-jt} 字符已省略]…
|
|
3
|
+
`+o.slice(o.length-jt):o,u=new Map(t.liveOutputs);return u.set(s.toolCallId,{toolName:s.toolName,text:d}),{...t,liveOutputs:u}}case"message_delta":{const n=t.state;return!n||n.conversationId!==s.msg.conversationId?t:{...t,state:Ra(n,s.msg)}}case"tool_status":return{...t,toolStatuses:new Map(t.toolStatuses).set(s.status.toolCallId,s.status)};case"notice":return{...t,notices:[...t.notices,s.notice].slice(-6)};case"dismiss_notice":return{...t,notices:t.notices.filter(n=>n.id!==s.id)};case"set_pending_echo":return{...t,pendingEcho:s.echo};case"clear_pending_echo":return{...t,pendingEcho:null};case"sessions":return{...t,sessions:s.sessions};case"conversations":return{...t,conversations:s.conversations,activeConversationId:s.activeId};case"projects":return{...t,projects:s.projects};case"dir_browse":return{...t,dirBrowse:s.dirBrowse};case"files":return{...t,files:s.files};case"file_changed":return{...t,fileChanged:{path:s.path}};case"file_content":return{...t,fileContent:s.content};case"models":return{...t,models:s.models,modelsLoading:s.loading};case"models_config":return{...t,modelsConfig:s.providers};case"providers_status":return{...t,providers:s.providers};case"fetch_models_result":return{...t,fetchModelsResult:s.result};case"refresh_provider_result":return{...t,refreshProviderResult:s.result};case"clone_provider_result":return{...t,cloneProviderResult:s.result};case"install_result":return{...t,installResult:s.result};case"scm_data":return{...t,scmData:s.data};case"file_search_result":return{...t,fileSearch:s.result};case"scm_changed":return{...t,scmDirty:t.scmDirty+1};case"path_completions":return{...t,pathCompletions:s.completions};case"update_status":return{...t,update:s.status};case"widgets":return{...t,widgets:s.widgets};case"statuses":return{...t,statuses:s.statuses};case"dialog":return{...t,dialog:s.dialog};case"commands":return{...t,commands:s.commands,commandsPath:s.path};case"slash_commands":return{...t,slashCommands:s.commands};case"goal_status":return{...t,goal:s.status};case"settings":return{...t,settings:s.settings};case"bg_servers":return{...t,bgServers:s.servers};case"plugins":return{...t,plugins:s.plugins,pluginsEpoch:s.epoch};case"terminal_add":return{...t,terminals:[...t.terminals,s.meta]};case"terminal_remove":return{...t,terminals:t.terminals.filter(n=>n.id!==s.id)};case"terminal_exit":return s.conversationId&&(t.activeConversationId||(a=t.state)!=null&&a.conversationId)&&s.conversationId!==(t.activeConversationId||((l=t.state)==null?void 0:l.conversationId))?t:{...t,terminals:t.terminals.map(n=>n.id===s.terminalId?{...n,running:!1,exitCode:s.exitCode}:n)};case"terminal_restart":return{...t,terminals:t.terminals.map(n=>n.id===s.terminalId?{...n,running:!0,exitCode:null}:n)};case"terminal_list":return s.conversationId&&(t.activeConversationId||(c=t.state)!=null&&c.conversationId)&&s.conversationId!==(t.activeConversationId||((i=t.state)==null?void 0:i.conversationId))?t:{...t,terminals:s.terminals.map(n=>{var o;return{...n,conversationId:s.conversationId??((o=t.state)==null?void 0:o.conversationId)??""}})};default:return t}}const cs="pi-web-client-id";let bt=null;function _t(){if(bt)return bt;let t=null;try{t=sessionStorage.getItem(cs),t||(t=Ge(),sessionStorage.setItem(cs,t))}catch{t=t??Ge()}return bt=t,t}function qa(){const t=location.protocol==="https:"?"wss:":"ws:";return $t(`${t}//${location.host}/ws`)}function za(){const[t,s]=r.useReducer(Ua,{status:"connecting",ready:!1,state:null,liveOutputs:new Map,toolStatuses:new Map,notices:[],sessions:[],conversations:[],activeConversationId:"",projects:[],dirBrowse:null,files:null,fileChanged:null,fileContent:null,models:[],modelsLoading:!1,modelsConfig:[],providers:[],installResult:null,pathCompletions:[],update:null,widgets:[],statuses:[],dialog:null,commands:[],commandsPath:"",slashCommands:[],terminals:[],goal:Wa,bgServers:[],settings:null,fetchModelsResult:null,refreshProviderResult:null,cloneProviderResult:null,scmData:null,fileSearch:null,scmDirty:0,plugins:[],pluginsEpoch:0,protocolMismatch:!1,pendingEcho:null}),a=r.useRef(null),l=r.useRef(Ha()),c=r.useRef(0),i=r.useRef(null),n=r.useRef(!0),o=r.useRef(0),d=r.useRef(0),u=r.useRef(new Map),h=r.useRef(null),m=()=>{h.current||(h.current=setTimeout(()=>{h.current=null;const y=a.current;y&&y.readyState===WebSocket.OPEN&&y.send(JSON.stringify({type:"get_state"}))},300))},x=(y,b)=>{var J;const f=u.current,T=f.get(y);if(T!==void 0&&b!==T+1){const ee=S.current.chat,ie=ee.activeConversationId||((J=ee.state)==null?void 0:J.conversationId);y===ie&&m()}f.set(y,b)},C=r.useCallback((y,b)=>{const f=++d.current;s({type:"notice",notice:{id:f,level:y,text:b}})},[]),M=r.useCallback(y=>{const b=a.current;return b&&b.readyState===WebSocket.OPEN?(b.send(JSON.stringify(y)),!0):!1},[]),R=r.useCallback(()=>{if(!n.current)return;s({type:"status",status:"connecting"});const y=new WebSocket(qa());a.current=y,y.onopen=()=>{a.current===y&&(s({type:"status",status:"open"}),c.current=0,o.current=Date.now(),y.send(JSON.stringify({type:"hello",clientId:_t()})))},y.onmessage=b=>{if(a.current!==y)return;o.current=Date.now();let f;try{f=JSON.parse(b.data)}catch{return}switch(f.type){case"ready":s({type:"ready",serverVersion:f.serverVersion,protocolVersion:f.protocolVersion}),y.send(JSON.stringify({type:"get_state"})),y.send(JSON.stringify({type:"list_files"})),y.send(JSON.stringify({type:"list_models"})),y.send(JSON.stringify({type:"list_commands"})),y.send(JSON.stringify({type:"get_commands"})),y.send(JSON.stringify({type:"check_update"}));break;case"snapshot":u.current=new Map,s({type:"snapshot",state:f.state});break;case"snapshot_delta":{const T=S.current.chat.state;(!T||T.conversationId!==f.conversationId||T.rev!==f.baseRev)&&m(),s({type:"snapshot_delta",msg:f});break}case"tool_delta":x(f.conversationId,f.seq),s({type:"tool_delta",toolCallId:f.toolCallId,toolName:f.toolName,delta:f.delta});break;case"tool_status":s({type:"tool_status",status:f});break;case"message_delta":{x(f.conversationId,f.seq),s({type:"message_delta",msg:f});break}case"notice":{const T=++d.current;s({type:"notice",notice:{id:T,level:f.level,text:f.text}});break}case"sessions":s({type:"sessions",sessions:f.sessions});break;case"conversations":s({type:"conversations",conversations:f.conversations,activeId:f.activeId});break;case"projects":s({type:"projects",projects:f.projects});break;case"dir_browse":s({type:"dir_browse",dirBrowse:{path:f.path,parent:f.parent,dirs:f.dirs,truncated:f.truncated}});break;case"files":s({type:"files",files:f});break;case"file_changed":s({type:"file_changed",path:f.path});break;case"file_content":s({type:"file_content",content:f});break;case"models":s({type:"models",models:f.models,loading:!1});break;case"models_config":s({type:"models_config",providers:f.providers});break;case"providers_status":s({type:"providers_status",providers:f.providers});break;case"fetch_models_result":s({type:"fetch_models_result",result:{reqId:f.reqId,ok:f.ok,models:f.models,error:f.error}});break;case"refresh_provider_result":s({type:"refresh_provider_result",result:{reqId:f.reqId,ok:f.ok,added:f.added,total:f.total,error:f.error}});break;case"clone_provider_result":s({type:"clone_provider_result",result:{reqId:f.reqId,ok:f.ok,config:f.config,error:f.error}});break;case"scm_data":s({type:"scm_data",data:f});break;case"search_files_result":s({type:"file_search_result",result:{reqId:f.reqId,ok:f.ok,results:f.results,truncated:f.truncated}});break;case"scm_changed":s({type:"scm_changed"});break;case"install_result":s({type:"install_result",result:f});break;case"path_completions":s({type:"path_completions",completions:f.completions});break;case"update_status":s({type:"update_status",status:f});break;case"widgets":s({type:"widgets",widgets:f.widgets});break;case"statuses":s({type:"statuses",statuses:f.statuses});break;case"dialog":s({type:"dialog",dialog:{id:f.id,kind:f.kind,title:f.title,args:f.args}});break;case"dialog_closed":s({type:"dialog",dialog:null});break;case"terminal_output":l.current.write(f.conversationId??S.current.chat.activeConversationId,f.terminalId,f.data);break;case"terminal_exit":s({type:"terminal_exit",conversationId:f.conversationId,terminalId:f.terminalId,exitCode:f.exitCode});break;case"terminal_list":s({type:"terminal_list",conversationId:f.conversationId,terminals:f.terminals});break;case"commands":s({type:"commands",commands:f.commands,path:f.path});break;case"slash_commands":s({type:"slash_commands",commands:f.commands});break;case"goal_status":s({type:"goal_status",status:f.status});break;case"settings_state":s({type:"settings",settings:f.settings});break;case"bg_servers":s({type:"bg_servers",servers:f.servers});break;case"plugins":s({type:"plugins",plugins:f.plugins,epoch:f.epoch});break;case"plugin_data":Ia(f.pluginId,f.payload);break}},y.onclose=()=>{if(a.current===y&&(a.current=null),l.current.clear(),!n.current||a.current&&a.current!==y)return;s({type:"status",status:"closed"});const b=Math.min(1e3*2**c.current,1e4);c.current+=1,i.current=setTimeout(()=>{i.current=null,R()},b)},y.onerror=()=>{}},[]);r.useEffect(()=>{n.current=!0,R();const y=setInterval(()=>{if(!n.current)return;const b=a.current;b&&b.readyState===WebSocket.OPEN&&Date.now()-o.current>3e4&&b.close()},5e3);return()=>{var b;n.current=!1,clearInterval(y),i.current&&(clearTimeout(i.current),i.current=null),(b=a.current)==null||b.close(),a.current=null}},[R]);const w=r.useCallback(y=>s({type:"dismiss_notice",id:y}),[]),I=r.useCallback((y,b)=>s({type:"set_pending_echo",echo:{conversationId:y,text:b,ts:Date.now()}}),[]),E=r.useCallback(y=>s({type:"terminal_add",meta:y}),[]),P=r.useCallback(y=>s({type:"terminal_remove",id:y}),[]),D=r.useCallback(y=>s({type:"terminal_restart",terminalId:y}),[]),A=r.useCallback((y,b,f)=>l.current.register(y,b,f),[]),S=r.useRef({chat:t,send:M,pushNotice:C,dismissNotice:w,setPendingEcho:I,terminal:{create:E,close:P,register:A,restart:D}});return S.current={chat:t,send:M,pushNotice:C,dismissNotice:w,setPendingEcho:I,terminal:{create:E,close:P,register:A,restart:D}},S.current}const Ka=200*1024*1024,Va=/windows/i.test(navigator.userAgent),Ga=/[<>:"/\\|?*\u0000-\u001f]/g,Ja=/[. ]+$/,Qa=/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(\..*)?$/i;function Ya(t){const s=t.replace(Ga,"_").replace(Ja,"");return s?Qa.test(s)?`_${s}`:s:"_"}function ds(t,s=!0){const a=new URLSearchParams({clientId:_t(),path:t,...s?{download:"1"}:{}});return $t(`/api/file?${a}`)}async function Xa(t,s){const a=Va?Ya(s):s;try{const l=await fetch(ds(t));if(!l.ok)return{ok:!1,cancelled:!1,error:await l.text().catch(()=>"")||(l.status===404?"文件不存在":`HTTP ${l.status}`)};if(Number(l.headers.get("content-length")??"0")>Ka)return window.location.assign(ds(t)),{ok:!0};const i=await l.blob();return window.showSaveFilePicker&&window.isSecureContext?Za(i,a):Rt(i,a)}catch(l){return{ok:!1,cancelled:!1,error:l instanceof Error?l.message:String(l)}}}async function Za(t,s){let a;const l=window.showSaveFilePicker;if(!l)return Rt(t,s);try{a=await l({suggestedName:s})}catch(c){return c instanceof DOMException&&c.name==="AbortError"?{ok:!1,cancelled:!0}:Rt(t,s)}try{const c=await a.createWritable();return await c.write(t),await c.close(),{ok:!0}}catch(c){return{ok:!1,cancelled:!1,error:c instanceof Error?c.message:String(c)}}}function Rt(t,s){const a=URL.createObjectURL(t),l=document.createElement("a");return l.href=a,l.download=s,document.body.appendChild(l),l.click(),l.remove(),setTimeout(()=>URL.revokeObjectURL(a),1e4),{ok:!0}}const ei=r.memo(function({files:s,fileChanged:a,widgets:l,cwd:c,send:i,onAttach:n,onPreview:o,onNotice:d}){const u=me(),[h,m]=r.useState(""),[x,C]=r.useState(null),[M,R]=r.useState(!1),w=1e4,I=r.useRef(0),E=r.useRef(void 0),P=r.useCallback((y,b)=>{const f=++I.current;m(y),b!=null&&b.silent||R(!0),i({type:"list_files",path:y===""?void 0:y})||I.current===f&&R(!1)},[i]);r.useEffect(()=>{s&&s.path===h&&R(!1)},[s,h]),r.useEffect(()=>{if(c!==E.current){E.current=c,P("",{silent:!0});return}const y=setInterval(()=>{document.visibilityState!=="hidden"&&P(h,{silent:!0})},w);return()=>clearInterval(y)},[c,h,P]),r.useEffect(()=>{a&&a.path===h&&P(h,{silent:!0})},[a,h,P]);const D=y=>P(y),A=()=>{(s==null?void 0:s.parent)!==null&&(s==null?void 0:s.parent)!==void 0&&P(s.parent)},S=h.split("/").filter(Boolean);return e.jsxs("aside",{className:"panel panel-right",children:[e.jsxs("div",{className:"panel-crumbs",children:[e.jsx("button",{type:"button",className:`crumb ${h===""?"active":""}`,onClick:()=>P(""),children:u("rootDir")}),S.map((y,b)=>{const f=S.slice(0,b+1).join("/");return e.jsxs("span",{className:"crumb-seg",children:[e.jsx(Je,{}),e.jsx("button",{type:"button",className:`crumb ${f===h?"active":""}`,onClick:()=>P(f),children:y})]},f)})]}),e.jsxs("div",{className:"panel-body",children:[M&&e.jsx("div",{className:"panel-empty",children:u("loading")}),!M&&s&&s.path===h&&e.jsxs(e.Fragment,{children:[s.path!==""&&e.jsxs("button",{type:"button",className:"file-item dir",onClick:A,children:[e.jsx(Ie,{className:"file-icon"}),e.jsx("span",{className:"file-name",children:".."})]}),s.entries.map(y=>y.type==="dir"?e.jsxs("div",{className:"file-item dir",children:[e.jsxs("button",{type:"button",className:"file-dir-main",onClick:()=>D(y.path),children:[e.jsx(Ie,{className:"file-icon"}),e.jsx("span",{className:"file-name",children:y.name})]}),e.jsx("button",{type:"button",className:"file-attach ref","data-tip":u("linkFolderTip"),onClick:()=>n(y.path,y.name,"reference",!0),children:e.jsx(St,{})})]},y.path):e.jsxs("div",{className:"file-item file",children:[e.jsxs("button",{type:"button",className:"file-name",title:`${y.path} — ${u("previewFile")}`,onClick:()=>o(y.path,y.name),children:[e.jsx(Fs,{className:"file-icon"}),e.jsx("span",{className:"file-name-text",children:y.name})]}),e.jsx("button",{type:"button",className:"file-attach download","data-tip":u("downloadFile"),onClick:()=>{Xa(y.path,y.name).then(b=>{b.ok||b.cancelled||d("error",u("downloadFailed",{error:b.error}))})},children:e.jsx(_s,{})}),e.jsx("button",{type:"button",className:"file-attach inline","data-tip":u("attachInlineTip"),onClick:()=>n(y.path,y.name,"inline"),children:e.jsx(ze,{})}),e.jsx("button",{type:"button",className:"file-attach ref","data-tip":u("referenceTip"),onClick:()=>n(y.path,y.name,"reference"),children:e.jsx(St,{})})]},y.path)),s.truncated&&e.jsx("div",{className:"panel-empty files-truncated",children:u("filesTruncated")})]}),!M&&!s&&e.jsx("div",{className:"panel-empty",children:u("noFiles")})]}),l.filter(y=>y.lines.length>0).length>0&&e.jsx("div",{className:"panel-widgets",children:l.filter(y=>y.lines.length>0).map(y=>e.jsxs("div",{className:"widget",children:[e.jsxs("button",{type:"button",className:"widget-title widget-title-btn",title:u("widgetExpand"),onClick:()=>C(y.key),children:[e.jsx("span",{children:y.key}),e.jsx(Ds,{})]}),e.jsx("pre",{className:"widget-lines",children:y.lines.join(`
|
|
4
|
+
`)})]},y.key))}),x&&(()=>{const y=l.find(b=>b.key===x);return y?e.jsx("div",{className:"modal-backdrop",onClick:()=>C(null),children:e.jsxs("div",{className:"widget-expand",onClick:b=>b.stopPropagation(),children:[e.jsxs("div",{className:"widget-expand-head",children:[e.jsx("span",{className:"widget-expand-title",children:y.key}),e.jsx("button",{type:"button",className:"btn",title:u("close"),onClick:()=>C(null),children:e.jsx(we,{})})]}),e.jsx("pre",{className:"widget-expand-lines",children:y.lines.join(`
|
|
5
|
+
`)})]})}):null})()]})});var us=Ls();function ti({text:t}){const s=me(),[a,l]=r.useState(!1);return e.jsxs("div",{className:`thinking leaked ${a?"open":""}`,children:[e.jsxs("button",{type:"button",className:"thinking-toggle",onClick:()=>l(!a),children:[a?e.jsx(De,{}):e.jsx(Je,{}),e.jsx(Os,{className:"thinking-icon"}),e.jsx("span",{className:"thinking-label",children:s("leakedThinking")})]}),a&&e.jsx("div",{className:"thinking-body",children:t})]})}const ht=r.memo(function({text:s}){const a=me(),[l,c]=r.useState(!1);return s?e.jsx("button",{type:"button",className:"copy-btn",title:a("copy"),onClick:()=>{navigator.clipboard.writeText(s).then(()=>{c(!0),setTimeout(()=>c(!1),1200)})},children:l?e.jsx(Ve,{}):e.jsx(Dt,{})}):null});let kt=null;function si(){return kt||(kt=It(()=>import("./mermaid.core-D8R7av1J.js").then(t=>t.cb),__vite__mapDeps([0,1])).then(t=>{const s=t.default;return s.initialize({startOnLoad:!1,securityLevel:"strict",theme:"base",themeVariables:{background:"#ffffff",primaryColor:"#f1edfe",primaryTextColor:"#1f2430",primaryBorderColor:"#8b5cf6",lineColor:"#6b7280",secondaryColor:"#eef2ff",tertiaryColor:"#f8fafc",textColor:"#1f2430",fontFamily:"var(--mono, monospace)"}}),s})),kt}let ni=0;function ai({code:t}){const s=me(),a=r.useId().replace(/[^a-zA-Z0-9]/g,""),[l,c]=r.useState(null),[i,n]=r.useState(null),o=r.useRef(null);return r.useEffect(()=>{let d=!1;c(null),n(null);const u=`mermaid-${a}-${++ni}`;return si().then(h=>h.render(u,t)).then(({svg:h})=>{d||c(h)}).catch(h=>{var m;d||n(h instanceof Error?h.message:String(h)),(m=document.getElementById(u))==null||m.remove()}),()=>{d=!0}},[t,a]),i?e.jsxs("div",{className:"mermaid-block mermaid-block-error",children:[e.jsx("div",{className:"mermaid-error-note",children:s("mermaidRenderFailed")}),e.jsxs("div",{className:"codeblock",children:[e.jsx(ht,{text:t}),e.jsx("pre",{children:e.jsx("code",{children:t})})]})]}):l?e.jsxs("div",{className:"mermaid-block",children:[e.jsx(ht,{text:t}),e.jsx("div",{ref:o,className:"mermaid-svg",dangerouslySetInnerHTML:{__html:l}})]}):e.jsx("div",{className:"mermaid-block mermaid-block-loading",children:e.jsx("div",{className:"mermaid-loading-note",children:s("mermaidRendering")})})}const Ks=[dn],Vs=[[cn,{detect:!0,ignoreMissing:!0}]];function Gs({text:t}){return e.jsx(Ms,{remarkPlugins:Ks,rehypePlugins:Vs,components:{pre:Js},children:t})}const Be=r.memo(function({text:s}){return e.jsx("div",{className:"md",children:e.jsx(Gs,{text:s})})});function Js({children:t,...s}){return ii(t)?e.jsx(ai,{code:gt(t)}):e.jsxs("div",{className:"codeblock",children:[e.jsx(ht,{text:gt(t)}),e.jsx("pre",{...s,children:t})]})}function ii(t){var l;const s=Array.isArray(t)?t[0]:t;if(!s||typeof s!="object"||!("props"in s))return!1;const a=(l=s.props)==null?void 0:l.className;return typeof a=="string"&&/(^|\s)language-mermaid(\s|$)/.test(a)}function gt(t){if(typeof t=="string")return t;if(Array.isArray(t))return t.map(gt).join("");if(t&&typeof t=="object"&&"props"in t){const s=t.props;return gt(s==null?void 0:s.children)}return""}const ri=/^\s{0,3}(`{3,}|~{3,})/,li=/^\s{0,3}(?:[-*+]|\d{1,9}[.)])\s/;function Nt(t){return t.trim()===""}function ms(t){const s=ri.exec(t);return s?s[1]:null}function oi(t){const s=t.split(`
|
|
6
|
+
`),a=[];let l=[],c=null;for(let i=0;i<s.length;i++){const n=s[i];if(c!==null){const d=ms(n);d&&d[0]===c[0]&&d.length>=c.length&&(c=null),l.push(n);continue}const o=ms(n);if(o&&!Nt(n)){c=o,l.push(n);continue}if(Nt(n)){let d=i;for(;d<s.length&&Nt(s[d]);)d++;if(!(d<s.length&&li.test(s[d]))&&l.length>0){a.push(l.join(`
|
|
7
|
+
`)),l=[];continue}l.push(n);continue}l.push(n)}return{frozen:a,active:l.join(`
|
|
8
|
+
`),inFence:c!==null}}const ci=r.memo(function({text:s}){return e.jsx(Ms,{remarkPlugins:Ks,rehypePlugins:Vs,components:{pre:Js},children:s})}),ps=200;function di({text:t,inFence:s}){const[a,l]=r.useState(t),c=r.useRef(0),i=r.useRef(null);return r.useEffect(()=>{if(s)return;const n=Date.now()-c.current,o=()=>{c.current=Date.now(),l(t)};if(n>=ps){o();return}return i.current=setTimeout(o,ps-n),()=>{i.current&&clearTimeout(i.current)}},[t,s]),s?e.jsx("div",{className:"codeblock",children:e.jsx("pre",{children:e.jsx("code",{children:t})})}):e.jsx(Gs,{text:a})}const ui=r.memo(function({text:s}){const{frozen:a,active:l,inFence:c}=r.useMemo(()=>oi(s),[s]);return e.jsxs("div",{className:"md",children:[a.map((i,n)=>e.jsx(ci,{text:i},n)),l.length>0&&e.jsx(di,{text:l,inFence:c},a.length)]})});function mi({thinking:t,streaming:s,wrap:a=!0}){const l=me(),[c,i]=r.useState(null),n=c??a,o=s?t.trimEnd().slice(-80):t.split(`
|
|
9
|
+
`)[0].slice(0,80);return e.jsxs("div",{className:`thinking ${n?"open":""} ${s?"live":""}`,children:[e.jsxs("button",{type:"button",className:"thinking-toggle",onClick:()=>i(!n),children:[n?e.jsx(De,{}):e.jsx(Je,{}),e.jsx(tt,{className:"thinking-icon"}),e.jsx("span",{className:"thinking-label",children:s&&n?e.jsxs("span",{className:"thinking-live-label",children:[e.jsx("span",{className:"thinking-spinner","aria-hidden":"true"}),l("thinkingNow")]}):s?e.jsxs("span",{className:"thinking-live-label",children:[e.jsx("span",{className:"thinking-spinner","aria-hidden":"true"}),l("thinkingPreview",{preview:o})]}):n?l("thinking"):l("thinkingPreview",{preview:o})})]}),n&&e.jsx("div",{className:"thinking-body",children:t})]})}he.registerLanguage("bash",un);he.registerLanguage("c",mn);he.registerLanguage("cpp",pn);he.registerLanguage("csharp",hn);he.registerLanguage("css",gn);he.registerLanguage("diff",fn);he.registerLanguage("go",xn);he.registerLanguage("graphql",vn);he.registerLanguage("ini",yn);he.registerLanguage("java",jn);he.registerLanguage("javascript",bn);he.registerLanguage("json",kn);he.registerLanguage("kotlin",Nn);he.registerLanguage("less",wn);he.registerLanguage("lua",Cn);he.registerLanguage("makefile",Sn);he.registerLanguage("php",Tn);he.registerLanguage("python",En);he.registerLanguage("r",Mn);he.registerLanguage("ruby",Ln);he.registerLanguage("rust",Pn);he.registerLanguage("scss",Rn);he.registerLanguage("sql",In);he.registerLanguage("swift",Dn);he.registerLanguage("typescript",Fn);he.registerLanguage("xml",$n);he.registerLanguage("yaml",_n);function et(t){return t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function pi(t,s){if(!s||!he.getLanguage(s))return et(t);try{return he.highlight(t,{language:s,ignoreIllegals:!0}).value}catch{return et(t)}}const hi={json:"json",jsonc:"json",ts:"typescript",mts:"typescript",cts:"typescript",tsx:"typescript",js:"javascript",mjs:"javascript",cjs:"javascript",jsx:"javascript",py:"python",rb:"ruby",go:"go",rs:"rust",java:"java",kt:"kotlin",kts:"kotlin",swift:"swift",c:"c",h:"c",cpp:"cpp",cc:"cpp",hpp:"cpp",cs:"csharp",php:"php",sql:"sql",css:"css",scss:"scss",less:"less",html:"xml",htm:"xml",xml:"xml",svg:"xml",yml:"yaml",yaml:"yaml",sh:"bash",bash:"bash",zsh:"bash",toml:"ini",ini:"ini",graphql:"graphql",gql:"graphql",lua:"lua",r:"r",makefile:"makefile",diff:"diff",patch:"diff"};function vt(t){var a,l;const s=(l=(a=t.split(/[\\/]/).pop())==null?void 0:a.split(".").pop())==null?void 0:l.toLowerCase();return s&&hi[s]||null}function gi(t,s){const a=t.split(`
|
|
10
|
+
`);if(!s||!he.getLanguage(s))return a.map(et);let l;try{l=he.highlight(t,{language:s,ignoreIllegals:!0}).value}catch{return a.map(et)}const c=[],i=[];let n="",o=0;for(;o<l.length;){if(l[o]==="<"){const m=l.indexOf(">",o);if(m===-1){n+=l.slice(o);break}const x=l.slice(o,m+1);x.startsWith("</")?i.pop():x.endsWith("/>")||i.push(x),n+=x,o=m+1;continue}const d=l.indexOf(`
|
|
11
|
+
`,o),u=l.indexOf("<",o),h=Math.min(d===-1?Number.POSITIVE_INFINITY:d,u===-1?Number.POSITIVE_INFINITY:u);if(h===Number.POSITIVE_INFINITY){n+=l.slice(o);break}n+=l.slice(o,h),h===d?(c.push(n+"</span>".repeat(i.length)),n=i.join(""),o=h+1):o=h}return c.push(n+"</span>".repeat(i.length)),c.length===a.length?c:a.map(et)}const fi={bash:"$",read:"📄",write:"✍️",edit:"✏️",grep:"🔍",find:"🧭",ls:"📂"};function hs(t){return fi[t]??"🛠"}function xi(t){if(t.name!=="read"||!t.argumentsText)return!1;try{const s=JSON.parse(t.argumentsText);return typeof s.path=="string"&&/\.(md|markdown)$/i.test(s.path)}catch{return!1}}function vi(t){if(t.name!=="read"||!t.argumentsText)return null;try{const s=JSON.parse(t.argumentsText);return typeof s.path=="string"?vt(s.path):null}catch{return null}}function yi(t){if(t.name!=="write"||!t.argumentsText)return null;try{const s=JSON.parse(t.argumentsText);return typeof s.content!="string"?null:{lang:typeof s.path=="string"?vt(s.path):null,content:s.content}}catch{return null}}function ji(t){if(t.name!=="edit"||!t.argumentsText)return null;try{const s=JSON.parse(t.argumentsText);return typeof s.path=="string"?vt(s.path):null}catch{return null}}function bi(t,s){if(t.name!=="edit"||!s.result||s.result.isError)return null;const a=s.result.details;return typeof(a==null?void 0:a.diff)=="string"?a.diff:null}const ki=/^([+\- ])(\s*\d+) (.*)$/;function Ni(t){return t.split(`
|
|
12
|
+
`).map(s=>{const a=ki.exec(s);return a?{marker:a[1],lineNum:a[2],code:a[3]}:{marker:" ",lineNum:"",code:s}})}function wi({diff:t,lang:s}){const a=Ni(t);return e.jsx("div",{className:"toolcall-diff",children:a.map((l,c)=>e.jsxs("div",{className:`toolcall-diff-line ${l.marker==="+"?"add":l.marker==="-"?"del":"ctx"}`,children:[e.jsxs("span",{className:"toolcall-diff-gutter",children:[l.marker,l.lineNum]}),e.jsx("code",{className:"toolcall-diff-code hljs",dangerouslySetInnerHTML:{__html:pi(l.code,s)||""}})]},c))})}function gs(t,s){var i;const a=((i=t.match(/`+/g))==null?void 0:i.map(n=>n.length))??[],l=a.length?Math.max(...a):0,c="`".repeat(Math.max(3,l+1));return`${c}${s}
|
|
13
|
+
${t.replace(/\n$/,"")}
|
|
14
|
+
${c}`}const Ci=r.memo(function({block:s,view:a,onKillBash:l,wrap:c=!0}){var $,X,ce,z;const i=me(),[n,o]=r.useState(c),[d,u]=r.useState(!1),[h,m]=r.useState(!0),[x,C]=r.useState(!1),[M,R]=r.useState(!1);r.useEffect(()=>{if(!M)return;const k=U=>{U.key==="Escape"&&R(!1)};return window.addEventListener("keydown",k),()=>window.removeEventListener("keydown",k)},[M]);const w=!a.result&&a.streaming&&!a.status,I=s.name==="bash"&&w,E=a.result!==void 0,P=!a.result&&!!a.status,D=(($=a.result)==null?void 0:$.isError)??((X=a.status)==null?void 0:X.isError)??!1,A=xi(s),S=!A&&!D?vi(s):null,y=yi(s),b=bi(s,a),f=b?ji(s):null,T=a.result?a.result.content.map(k=>k.type==="text"?k.text:"").join(""):a.liveOutput??"",J=D?"err":E?"ok":w||P?"run":"idle";let ee=i(D?"error":E?"done":w?"running":P?"toolDoneWaitingModel":"toolQueued");const ie=P&&((ce=a.status)==null?void 0:ce.durationMs)!==void 0?Ti(a.status.durationMs):"";P&&ie&&(ee=`${ee} · ${ie}`);const Q=P&&((z=a.status)==null?void 0:z.exitCode)!==void 0?`exit ${a.status.exitCode}`:"",v=()=>{s.argumentsText&&(navigator.clipboard.writeText(s.argumentsText),u(!0),setTimeout(()=>u(!1),1200))},W=e.jsxs(e.Fragment,{children:[s.argumentsText&&e.jsx("div",{className:"toolcall-args",children:s.name==="bash"&&s.argumentsText.startsWith("{")?e.jsx(Si,{args:s.argumentsText}):y?y.lang?e.jsx("div",{className:"toolcall-code",children:e.jsx(Be,{text:gs(y.content,y.lang)})}):e.jsx("pre",{children:y.content}):e.jsx("pre",{children:s.argumentsText})}),T.length>0&&e.jsxs("div",{className:"toolcall-output",children:[e.jsxs("div",{className:"toolcall-output-label",children:[i(D?"errorOutput":"output"),(w||P)&&e.jsx("span",{className:"thinking-spinner","aria-hidden":"true"}),e.jsx("span",{className:"toolcall-output-spacer"}),A&&!D&&e.jsx("button",{type:"button",className:"toolcall-md-toggle",title:i(h?"showMarkdownSource":"showMarkdownPreview"),onClick:()=>m(k=>!k),children:i(h?"showMarkdownSource":"showMarkdownPreview")})]}),b?e.jsx(wi,{diff:b,lang:f}):A&&h&&!D?e.jsx("div",{className:"toolcall-markdown",children:e.jsx(Be,{text:T})}):S?e.jsx("div",{className:"toolcall-code",children:e.jsx(Be,{text:gs(T,S)})}):e.jsx("pre",{children:T})]}),w&&T.length===0&&e.jsx("div",{className:"toolcall-waiting",children:e.jsxs("span",{className:"thinking-live-label",children:[e.jsx("span",{className:"thinking-spinner","aria-hidden":"true"}),i("waitingOutput")]})}),P&&T.length===0&&e.jsx("div",{className:"toolcall-waiting",children:e.jsxs("span",{className:"thinking-live-label",children:[e.jsx("span",{className:"thinking-spinner","aria-hidden":"true"}),i("waitingModel")]})})]});return e.jsxs("div",{className:`toolcall ${J}`,children:[e.jsxs("div",{className:"toolcall-head",children:[e.jsx("span",{className:"toolcall-icon",children:hs(s.name)}),e.jsx("span",{className:"toolcall-name",children:s.name}),e.jsxs("span",{className:"toolcall-status",children:[ee,Q&&e.jsx("em",{className:"toolcall-exit",children:Q})]}),e.jsx("span",{className:"toolcall-spacer"}),I&&l&&e.jsxs("button",{type:"button",className:"toolcall-kill",title:i("stopBashTip"),onClick:l,children:[e.jsx(dt,{}),e.jsx("span",{children:i("stopBash")})]}),n&&e.jsx("button",{type:"button",className:"toolcall-expand",title:i(x?"collapseCode":"expandCode"),onClick:()=>C(k=>!k),children:x?e.jsx(fa,{}):e.jsx(xa,{})}),e.jsx("button",{type:"button",className:"toolcall-expand",title:i("zoomCode"),onClick:()=>R(!0),children:e.jsx(Ds,{})}),e.jsx("button",{type:"button",className:"toolcall-copy",title:i("copyArgs"),onClick:v,children:d?e.jsx(va,{}):e.jsx(Dt,{})}),e.jsx("button",{type:"button",className:"toolcall-toggle",onClick:()=>o(k=>!k),children:n?e.jsx(De,{}):e.jsx(Je,{})})]}),n&&e.jsx("div",{className:`toolcall-body ${x?"expanded":""}`,children:W}),M&&e.jsx("div",{className:"modal-backdrop",onClick:()=>R(!1),children:e.jsxs("div",{className:"toolcall-zoom",role:"dialog","aria-modal":"true",onClick:k=>k.stopPropagation(),children:[e.jsxs("div",{className:"toolcall-zoom-head",children:[e.jsx("span",{className:"toolcall-icon",children:hs(s.name)}),e.jsx("span",{className:"toolcall-name",children:s.name}),e.jsx("span",{className:"toolcall-spacer"}),e.jsx("button",{type:"button",className:"toolcall-zoom-close",title:i("closeZoom"),onClick:()=>R(!1),children:e.jsx(we,{})})]}),e.jsx("div",{className:"toolcall-body toolcall-zoom-body",children:W})]})})]})});function Si({args:t}){let s=null;try{s=JSON.parse(t)}catch{return e.jsx("pre",{children:t})}return typeof s.command!="string"?e.jsx("pre",{children:t}):e.jsxs("div",{className:"termline",children:[e.jsx(qe,{className:"termline-icon"}),e.jsx("code",{children:s.command}),typeof s.timeout=="number"&&e.jsxs("span",{className:"termline-timeout",children:["⏱ ",s.timeout,"s"]})]})}function Ti(t){if(t===void 0)return"";const s=t/1e3;if(s<60)return`${s.toFixed(1)}s`;const a=Math.floor(s/60),l=Math.round(s%60);return`${a}m ${String(l).padStart(2,"0")}s`}const Ei=/<\/(?:ant)?think(?:ing)?>/gi,Mi=/(?:\s*<\/?(?:ant)?think(?:ing)?>\s*)+$/i;function fs(t){let s=-1;for(const a of t.matchAll(Ei))s=a.index+a[0].length;return s}function Li(t){const s=t.match(Mi),a=s!=null&&fs(t.slice(0,s.index))!==-1,l=a?s[0].trim():"",c=a?t.slice(0,s.index):t,i=fs(c);return i===-1?null:{leaked:[c.slice(0,i).trim(),l].filter(Boolean).join(`
|
|
15
|
+
`),visible:c.slice(i).trim()}}const Pi=/^<skill name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill>(?:\n\n([\s\S]+))?$/;function Bt(t){var a;const s=t.match(Pi);return s?{name:s[1],location:s[2],content:s[3],userMessage:((a=s[4])==null?void 0:a.trim())||void 0}:null}const Ri=1568,Ii=2*1024*1024;function Pe(t){return t.startsWith("image/")&&t!=="image/svg+xml"&&t!=="image/svg"}async function Qs(t){if(!t.type.startsWith("image/"))return null;let s;try{s=await createImageBitmap(t,{imageOrientation:"from-image"})}catch{return null}try{const a=Math.min(1,Ri/Math.max(s.width,s.height)),l=Math.max(1,Math.round(s.width*a)),c=Math.max(1,Math.round(s.height*a)),i=t.type==="image/jpeg"||t.type==="image/jpg"?[["image/jpeg",.85],["image/jpeg",.6],["image/webp",.8]]:[["image/png",1],["image/jpeg",.85],["image/jpeg",.6]];let n=null;for(const[o,d]of i){const u=document.createElement("canvas");u.width=l,u.height=c;const h=u.getContext("2d");if(!h)continue;o!=="image/png"&&(h.fillStyle="#ffffff",h.fillRect(0,0,l,c)),h.drawImage(s,0,0,l,c);const m=u.toDataURL(o,d),x=m.match(/^data:([^;]+);base64,/),C=x?x[1]:o,M=m.replace(/^data:[^;]*;base64,/,""),R=Math.floor(M.length*3/4);if(n={data:M,mimeType:C,name:t.name,size:R},R<=Ii)return n}return n}finally{s.close()}}const Di=20*1024*1024;function st(t){return t.type==="text"&&typeof t.text=="string"?t:null}function Ys(t){return t.type==="thinking"&&typeof t.thinking=="string"?t:null}function Xs(t){return t.type==="toolCall"&&typeof t.id=="string"&&typeof t.name=="string"?t:null}function Zs(t){return t.type==="image"&&typeof t.dataUrl=="string"?t:null}function en(t){return t.type==="bash"&&typeof t.command=="string"?t:null}function Fi(t){return t.imageData?"image":t.uploadPath?"upload":t.fileData?"file":"path"}function $i(t,s){if(t.imageData)return s("attachImage",{name:t.name??"image"});if(t.uploadPath)return s("attachFile",{name:t.name??t.uploadPath});if(t.fileData)return s("attachFile",{name:t.name??"file"});const a=t.path.split("/").pop()??t.path;return t.mode==="lines"&&t.lines?s("attachLines",{path:a,start:t.lines.start,end:t.lines.end}):t.mode==="reference"?s("refOnly",{path:a}):s("attachContent",{path:a})}const xs=r.memo(function({message:s,toolResults:a,liveOutputs:l,toolStatuses:c,streaming:i,isLast:n,onEdit:o,onKillBash:d,onCollapse:u,questionAttachments:h,qnIndex:m,qnActive:x,onJump:C,thinkingWrap:M,toolsWrap:R}){const w=me(),[I,E]=r.useState(!1),[P,D]=r.useState(""),[A,S]=r.useState([]),[y,b]=r.useState(!1),[f,T]=r.useState(null),J=F=>{T(F),window.setTimeout(()=>T(Y=>Y===F?null:Y),4e3)};if(s.role==="toolResult")return null;const ee=s.role==="custom"&&s.customType==="file",ie=s.content.map(F=>{var Y;return((Y=st(F))==null?void 0:Y.text)??""}).filter(Boolean).join(`
|
|
16
|
+
`),Q=s.role==="user"?Bt(ie):null,v=Q?Q.userMessage??`skill:${Q.name}`:ie.split(`
|
|
17
|
+
`).join(" ").trim(),W=i&&n&&s.role!=="user"&&s.content.length===0,$=s.role==="user"&&!i&&!W&&!!o,X=async F=>{const Y=[];for(const Z of F){if(!Pe(Z.type))continue;const G=await Qs(Z);G&&Y.push({path:"",imageData:G.data,mimeType:G.mimeType,name:G.name})}Y.length>0&&S(Z=>[...Z,...Y])},ce=async F=>{if(F.size>Di){J(w("fileTooLarge",{name:F.name,size:20}));return}let Y;try{Y=(await new Promise((G,le)=>{const ue=new FileReader;ue.onload=()=>G(ue.result),ue.onerror=()=>le(ue.error??new Error("read failed")),ue.readAsDataURL(F)})).replace(/^data:[^;]*;base64,/,"")}catch{J(w("fileLoadFailed",{name:F.name}));return}S(Z=>[...Z,{path:"",fileData:Y,name:F.name,size:F.size,mimeType:F.type||void 0}])},z=async F=>{const Y=[];for(const Z of F)Pe(Z.type)?Y.push(Z):ce(Z);Y.length>0&&await X(Y)},k=()=>{D(Q?`/skill:${Q.name}${Q.userMessage?` ${Q.userMessage}`:""}`:s.content.map(F=>{var Y;return((Y=st(F))==null?void 0:Y.text)??""}).filter(Boolean).join(`
|
|
18
|
+
`)),S(h??[]),E(!0)},U=()=>{const F=P.trim();F&&(o==null||o(s.id,F,A.length>0?A:void 0),E(!1))},te=s.role==="custom"&&(s.customType==="goal-review"||s.customType==="goal-wizard"),de=s.role==="custom"&&s.customType==="goal-wizard";return e.jsxs("div",{className:`msg msg-${s.role}${te?" msg-goal-review":""}`,"data-role":s.role,"data-msg-id":s.id,children:[e.jsxs("div",{className:"msg-meta",children:[e.jsx("span",{className:"msg-role",children:s.role==="custom"?de?w("goalWizardCard"):te?w("goalBarTitle"):s.customType==="file"?w("attachment"):`${w("plugin")} · ${s.customType??w("unknown")}`:At(s.role,w)}),s.model&&e.jsx("span",{className:"msg-model",children:s.model}),s.timestamp&&e.jsx("span",{className:"msg-time",children:Oi(s.timestamp)}),u&&e.jsxs("button",{type:"button",className:"msg-collapse-btn",title:w("collapseMsg"),onClick:()=>u(s.id),children:[e.jsx(xt,{})," ",w("collapseMsg")]}),m!==void 0&&C&&e.jsxs("button",{type:"button",className:`qn-tag ${x?"active":""}`,title:`${m+1}. ${v}`,"aria-label":`${m+1}. ${v}`,onClick:()=>C(s.id),children:[e.jsx("span",{className:"qn-tag-bar"}),e.jsx("span",{className:"qn-tag-idx",children:m+1})]})]}),e.jsx("div",{className:"msg-body",children:I?e.jsxs("div",{className:`msg-editor${y?" drag-over":""}`,onDragOver:F=>{F.preventDefault(),F.stopPropagation(),b(!0)},onDragLeave:F=>{F.currentTarget.contains(F.relatedTarget)||b(!1)},onDrop:F=>{var Y;F.preventDefault(),F.stopPropagation(),b(!1),z(Array.from(((Y=F.dataTransfer)==null?void 0:Y.files)??[]))},children:[A.length>0&&e.jsx("div",{className:"msg-editor-images",children:A.map((F,Y)=>{var G;const Z=Fi(F);return e.jsxs("span",{className:`msg-editor-img ${Z==="image"?"":"file-chip"}`,title:$i(F,w),children:[Z==="image"?e.jsx("img",{src:`data:${F.mimeType??"image/png"};base64,${F.imageData}`,alt:F.name}):e.jsxs("span",{className:"msg-editor-file",children:[e.jsx("span",{className:"msg-editor-file-icon",children:Z==="path"?F.mode==="reference"?"🔗":"📎":"📄"}),e.jsx("span",{className:"msg-editor-file-name",children:F.name??((G=F.path)==null?void 0:G.split("/").pop())})]}),e.jsx("button",{type:"button",className:"msg-editor-img-remove",title:w("removeAttachment"),onClick:()=>S(le=>le.filter((ue,g)=>g!==Y)),children:e.jsx(we,{})})]},`${F.name??F.path??"att"}-${Y}`)})}),f&&e.jsx("div",{className:"msg-editor-notice",children:f}),e.jsx("textarea",{className:"msg-editor-input",value:P,autoFocus:!0,placeholder:w("editPlaceholder"),rows:Math.max(2,Math.min(10,P.split(`
|
|
19
|
+
`).length+1)),onChange:F=>D(F.target.value),onPaste:F=>{var Z;const Y=[];for(const G of((Z=F.clipboardData)==null?void 0:Z.items)??[])if(G.kind==="file"&&Pe(G.type)){const le=G.getAsFile();le&&Y.push(le)}Y.length!==0&&(F.preventDefault(),X(Y))},onKeyDown:F=>{F.key==="Enter"&&(F.metaKey||F.ctrlKey)?(F.preventDefault(),U()):F.key==="Escape"&&E(!1)}}),e.jsxs("div",{className:"msg-editor-actions",children:[e.jsxs("span",{className:"msg-editor-hint",children:[e.jsx(oa,{})," ",w("editAttachmentHint")]}),e.jsx("button",{type:"button",className:"chip",onClick:()=>E(!1),children:w("cancel")}),e.jsxs("button",{type:"button",className:"chip primary",disabled:!P.trim(),title:w("reaskFromHere"),onClick:U,children:[e.jsx(Et,{})," ",w("reaskFromHere")]})]})]}):e.jsxs(e.Fragment,{children:[s.errorMessage&&e.jsx("div",{className:"msg-error",children:s.errorMessage}),ee?e.jsx(_i,{message:s}):Q?e.jsxs(e.Fragment,{children:[e.jsx(Ai,{block:Q}),Q.userMessage&&e.jsx("div",{className:"msg-text",children:e.jsx(Be,{text:Q.userMessage})}),s.content.map((F,Y)=>F.type==="text"?null:e.jsx(ys,{block:F,toolResults:a,liveOutputs:l,toolStatuses:c,streaming:i,isLast:n,onKillBash:d,toolsWrap:R,thinkingWrap:M},`${s.id}-${Y}`))]}):s.content.map((F,Y)=>e.jsx(ys,{block:F,toolResults:a,liveOutputs:l,toolStatuses:c,streaming:i,isLast:n,onKillBash:d,toolsWrap:R,thinkingWrap:M},`${s.id}-${Y}`)),W&&e.jsxs("div",{className:"thinking-wait",children:[w("thinkingWait"),e.jsx("span",{className:"dot"})]})]})}),$&&!I&&e.jsx("div",{className:"msg-actions",children:e.jsxs("button",{type:"button",className:"msg-action",title:w("editReaskTip"),onClick:k,children:[e.jsx(Et,{})," ",w("editReask")]})})]})});function _i({message:t}){const s=me(),[a,l]=r.useState(!1),c=t.details??{},i=c.name??c.path??s("attachment"),n=c.type==="folder",o=c.mode==="reference",d=c.mode==="bridged",u=t.content.filter(C=>C.type==="text").map(C=>C.text).join(`
|
|
20
|
+
`),h=Bi(u),m=t.content.find(C=>C.type==="image"),x=h.split(`
|
|
21
|
+
`).length;return e.jsxs("div",{className:`attachcard ${o?"reference":""}`,children:[e.jsxs("button",{type:"button",className:"attachcard-head",onClick:()=>l(C=>!C),children:[e.jsx("span",{className:"attachcard-icon",children:n?"📁":"📎"}),e.jsx("span",{className:"attachcard-name",children:i}),c.path&&e.jsx("span",{className:"attachcard-path",children:c.path}),e.jsx("span",{className:`attachcard-mode ${c.mode==="lines"?"lines":o?"ref":d?"bridged":"inline"}`,children:o?n?s("folderRefShort"):`${s("refOnlyShort")} · ${vs(c.size)}`:d?s("bridgedVision"):m?s("image"):c.mode==="lines"?s("inlineLinesRange",{start:c.startLine??1,end:c.endLine??c.lines??1}):s("inlineLines",{n:c.lines??x})}),!o&&(a?e.jsx(De,{}):e.jsx(Je,{}))]}),!o&&a&&(d?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"attachcard-bridgenote",children:s("bridgedVisionDetail")}),(m==null?void 0:m.dataUrl)&&e.jsx("div",{className:"attachcard-image",children:e.jsx("img",{src:m.dataUrl,alt:i})}),h&&e.jsx("pre",{className:"attachcard-content",children:h})]}):m!=null&&m.dataUrl?e.jsx("div",{className:"attachcard-image",children:e.jsx("img",{src:m.dataUrl,alt:i})}):e.jsx("pre",{className:"attachcard-content",children:h})),o&&e.jsx("div",{className:"attachcard-refnote",children:n?s("folderNotExpanded"):s("fileNotExpanded",{size:vs(c.size)})})]})}function vs(t){return t===void 0?"":t>=1024*1024?`${(t/(1024*1024)).toFixed(1)} MB`:t>=1024?`${Math.round(t/1024)} KB`:`${t} B`}function Bi(t){const s=t.match(/^\s*<file path="[^"]*"(?:\s+lines="[^"]*")?>\s*```\s*\n?([\s\S]*?)\n?```\s*<\/file>\s*$/);if(s)return s[1].trim();const a=t.match(/^\s*<vision-bridge>\s*([\s\S]*?)\s*<\/vision-bridge>\s*$/);return a?a[1].trim():t.trim()}function Ai({block:t}){const s=me(),[a,l]=r.useState(!1);return e.jsxs("div",{className:`skillcard${a?" expanded":""}`,children:[e.jsxs("button",{type:"button",className:"skillcard-head",onClick:()=>l(c=>!c),title:t.location,children:[e.jsx("span",{className:"skillcard-icon",children:e.jsx(ya,{})}),e.jsx("span",{className:"skillcard-name",children:t.name}),e.jsx("span",{className:"skillcard-path",children:t.location}),e.jsxs("span",{className:"skillcard-action",children:[a?e.jsx(xt,{}):e.jsx(De,{}),s(a?"collapseMsg":"expandMsg")]})]}),a&&e.jsx("div",{className:"skillcard-body",children:e.jsx(Be,{text:t.content})})]})}function ys({block:t,toolResults:s,liveOutputs:a,toolStatuses:l,streaming:c,isLast:i,onKillBash:n,thinkingWrap:o,toolsWrap:d}){const u=me(),h=st(t);if(h){const R=c&&i,w=Li(h.text),I=w?w.visible:h.text;return e.jsxs("div",{className:"msg-text",children:[w&&e.jsx(ti,{text:w.leaked}),I&&(R?e.jsx(ui,{text:I}):e.jsx(Be,{text:I})),h.truncated&&e.jsx("div",{className:"trunc-note",children:u("truncated")})]})}const m=Ys(t);if(m)return e.jsx(mi,{thinking:m.thinking,streaming:c&&i,wrap:o});const x=Xs(t);if(x){const R=s.get(x.id),w=a.get(x.id),I={result:R,liveOutput:w==null?void 0:w.text,streaming:c,status:l.get(x.id)};return e.jsx(Ci,{block:x,view:I,onKillBash:n,wrap:d})}const C=Zs(t);if(C&&C.dataUrl)return e.jsx("div",{className:"msg-image",children:e.jsx("img",{src:C.dataUrl,alt:"attachment"})});const M=en(t);return M?e.jsxs("div",{className:"bashblock",children:[e.jsxs("div",{className:"bashblock-command",children:[e.jsx("span",{className:"bashblock-prompt",children:"$"}),e.jsx("code",{children:M.command}),M.exitCode!==void 0&&e.jsx("span",{className:`bashblock-exit ${M.exitCode===0?"ok":"err"}`,children:u("exitCode",{code:M.exitCode})}),M.cancelled&&e.jsx("span",{className:"bashblock-exit err",children:u("cancelled")})]}),M.output&&e.jsx("pre",{className:"bashblock-output",children:M.output}),M.truncated&&e.jsx("div",{className:"trunc-note",children:u("outputTruncated")})]}):null}function At(t,s){switch(t){case"user":return s("role.user");case"assistant":return s("role.assistant");case"toolResult":return s("role.tool");case"bashExecution":return s("role.bash");case"branchSummary":return s("role.branch");case"compactionSummary":return s("role.compaction");default:return t}}function Oi(t){const s=new Date(t),a=String(s.getHours()).padStart(2,"0"),l=String(s.getMinutes()).padStart(2,"0");return`${a}:${l}`}function js(t,s,a){let l=!1;for(const c of s){const i=c;if(i.type!=="image"||typeof i.dataUrl!="string"||!i.dataUrl.startsWith("data:"))continue;const n=i.dataUrl.match(/^data:([^;]*);base64,(.+)$/);n&&(l=!0,t.push({path:"",imageData:n[2],mimeType:n[1]||"image/png",name:a??`image.${(n[1]||"image/png").split("/")[1]??"png"}`}))}return l}function Wi(t){const s=new Map;for(let a=0;a<t.length;a++){const l=t[a];if(l.role!=="user"||!l.id)continue;const c=[];js(c,l.content);for(let i=a+1;i<t.length&&t[i].role==="custom"&&t[i].customType==="file";i++){const n=t[i].details??{};if(!js(c,t[i].content,n.name)){if(n.upload&&n.path){c.push({path:"",uploadPath:n.path,name:n.name??n.path,size:n.size});continue}if(n.path&&n.mode){const o=n.mode==="inline"||n.mode==="lines"?n.mode:"reference",d={path:n.path,mode:o};n.mode==="lines"&&typeof n.startLine=="number"&&typeof n.endLine=="number"&&(d.lines={start:n.startLine,end:n.endLine}),c.push(d)}}}c.length>0&&s.set(l.id,c)}return s}const Hi=r.memo(function({message:s,onExpand:a}){const l=me();let c="";for(const m of s.content){const x=st(m);if(x&&x.text.trim()){const C=Bt(x.text);C?c=`skill:${C.name}`+(C.userMessage?` · ${C.userMessage.replace(/\s+/g," ").trim()}`:""):c=x.text.replace(/\s+/g," ").trim();break}}if(!c&&s.role==="custom"&&s.customType==="file"){const m=s.details??{};c=m.name??m.path??""}c.length>90&&(c=`${c.slice(0,90)}…`);let n=0,o=0,d=0,u=0;for(const m of s.content)Ys(m)?n++:Xs(m)?o++:en(m)?d++:Zs(m)&&u++;const h=[];return n&&h.push(`${l("thinking")} ${n}`),o&&h.push(`${l("toolCalls")} ${o}`),d&&h.push(`${l("bashRuns")} ${d}`),u&&h.push(`${l("images")} ${u}`),e.jsxs("button",{type:"button",className:"msg-collapsed","data-msg-id":s.id,title:`${l("expandMsg")} · ${c||h.join(" · ")||s.role}`,onClick:()=>a(s.id),children:[e.jsx("span",{className:`msg-collapsed-role role-${s.role}`,children:s.role==="custom"&&s.customType==="file"?l("attachment"):At(s.role,l)}),e.jsxs("span",{className:"msg-collapsed-body",children:[c&&e.jsx("span",{className:"msg-collapsed-preview",children:c}),h.length>0&&e.jsx("span",{className:"msg-collapsed-chips",children:h.map((m,x)=>e.jsx("span",{className:"msg-collapsed-chip",children:m},x))})]}),s.timestamp?e.jsx("span",{className:"msg-collapsed-time",children:Ui(s.timestamp)}):null,e.jsxs("span",{className:"msg-collapsed-action",children:[e.jsx(De,{})," ",l("expandMsg")]})]})});function Ui(t){const s=new Date(t),a=String(s.getHours()).padStart(2,"0"),l=String(s.getMinutes()).padStart(2,"0");return`${a}:${l}`}const qi=r.memo(function({id:s,show:a,height:l,containerRef:c,onMeasured:i,lazyRef:n,children:o}){const d=r.useRef(null),u=r.useRef(null);return r.useLayoutEffect(()=>{const h=u.current;if(u.current=a,!a||h!==!1)return;const m=d.current,x=c.current;if(!m||!x)return;const C=m.offsetHeight;i==null||i(s,C);const M=C-l;if(M!==0){const R=m.parentElement;R&&R.getBoundingClientRect().bottom<=x.getBoundingClientRect().top&&(x.scrollTop+=M)}},[a]),a?e.jsx("div",{ref:n,"data-lazy-id":s,children:e.jsx("div",{ref:d,children:o})}):e.jsx("div",{ref:n,className:"msg-lazy-ph","data-msg-id":s,"data-lazy-id":s,style:{height:l},"aria-hidden":"true"})});function zi(t,s,a,l){const c=[],i=[];let n=0;for(const o of t){if(a.has(o.id))continue;o.top<s.bottom&&o.bottom>s.top?l.has(o.id)&&c.push(o.id):l.has(o.id)||(i.push(o.id),o.bottom<=s.top&&(n+=o.bottom-o.top))}return{show:c,hide:i,shrinkAbove:n}}function Ki(t,s){if(s.show.length===0&&s.hide.length===0)return t;const a=new Set(t);for(const l of s.show)a.delete(l);for(const l of s.hide)a.add(l);return a}function Vi(t,s,a){const l=new Set;let c=0;for(let i=t.length-1;i>=0&&!(i<t.length-1&&c>=a);i--){const n=t[i];l.add(n.id),c+=s.get(n.id)??tn(n.role,n.customType)}return l}function tn(t,s){switch(t){case"user":return 72;case"assistant":return 280;case"toolResult":return 8;case"custom":return s==="file"?96:72;default:return 60}}function Gi(t){if(t.role==="toolResult")return"";const s=[];for(const a of t.content)Ji(a,s);return t.errorMessage&&s.push(t.errorMessage),s.join(`
|
|
22
|
+
`)}function Ji(t,s){if(typeof t.text=="string"){s.push(t.text);return}switch(t.type){case"thinking":typeof t.thinking=="string"&&s.push(t.thinking);break;case"toolCall":{typeof t.name=="string"&&s.push(t.name),typeof t.argumentsText=="string"&&s.push(t.argumentsText);break}case"bash":typeof t.command=="string"&&s.push(t.command),typeof t.output=="string"&&s.push(t.output);break}}function Qi(t,s){const a=s.trim().toLowerCase();if(!a)return 0;const l=t.toLowerCase();let c=0,i=l.indexOf(a);for(;i!==-1;)c++,i=l.indexOf(a,i+a.length);return c}function Yi(t,s){const a=s.trim().toLowerCase();if(!a)return[];const l=[];for(const c of t){const i=Gi(c);if(!i)continue;const n=Qi(i,a);for(let o=0;o<n;o++)l.push({messageId:c.id,occurrence:o})}return l}function Xi(t,s){var n;const a=new Map,l=[],c=s.toLowerCase();if(!c)return{byMsg:a,all:l};const i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode(o){const d=o.parentElement;return!d||d.closest(".search-bar")?NodeFilter.FILTER_REJECT:(o.textContent??"").toLowerCase().includes(c)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(let o=i.nextNode();o;o=i.nextNode()){const d=(o.textContent??"").toLowerCase(),u=(n=o.parentElement)==null?void 0:n.closest("[data-msg-id]");if(!u)continue;const h=u.getAttribute("data-msg-id")??"";let m=d.indexOf(c);for(;m!==-1;){const x=document.createRange();x.setStart(o,m),x.setEnd(o,m+c.length),l.push(x);const C=a.get(h);C?C.push(x):a.set(h,[x]),m=d.indexOf(c,m+c.length)}}return{byMsg:a,all:l}}function We(t,s){const a=CSS;if(!a.highlights)return;if(s.length===0){a.highlights.delete(t);return}const l=window.Highlight;l&&a.highlights.set(t,new l(...s))}function Zi({containerRef:t,messages:s,open:a,onClose:l,onEnsureExpanded:c}){const i=me(),n=r.useRef(null),[o,d]=r.useState(""),[u,h]=r.useState(0),m=r.useDeferredValue(o),x=a?m.trim():"",C=r.useMemo(()=>a?Yi(s,x):[],[s,x,a]),M=r.useRef(C);M.current=C;const R=r.useRef(u);R.current=u,r.useEffect(()=>{a&&(h(0),requestAnimationFrame(()=>{var P;return(P=n.current)==null?void 0:P.select()}))},[a]),r.useEffect(()=>{if(!a)return;const P=D=>{D.key==="Escape"&&(D.preventDefault(),D.stopPropagation(),l())};return window.addEventListener("keydown",P,!0),()=>window.removeEventListener("keydown",P,!0)},[a,l]),r.useEffect(()=>(a||(We("msg-search",[]),We("msg-search-active",[])),()=>{We("msg-search",[]),We("msg-search-active",[])}),[a]);const w=r.useCallback(P=>{const D=t.current;if(!D)return;const A=D.querySelector(`[data-msg-id="${P}"]`);A&&(A.classList.remove("msg-flash"),A.offsetWidth,A.classList.add("msg-flash"))},[t]);r.useLayoutEffect(()=>{if(!a||!x)return;const P=t.current;if(!P)return;let D=!1,A=0;return A=requestAnimationFrame(()=>{var J;if(D)return;const{byMsg:S,all:y}=Xi(P,x);We("msg-search",y);const b=M.current,f=b[Math.min(R.current,b.length-1)];if(!f)return;const T=(J=S.get(f.messageId))==null?void 0:J[f.occurrence];if(T){We("msg-search-active",[T]);const ee=T.startContainer.parentElement??P.querySelector(`[data-msg-id="${f.messageId}"]`);ee==null||ee.scrollIntoView({block:"center"})}else w(f.messageId)}),()=>{D=!0,cancelAnimationFrame(A)}},[a,x,C,t,w]);const I=r.useCallback(P=>{const D=M.current;if(D.length===0)return;const A=(R.current+P+D.length)%D.length;h(A),c(D[A].messageId)},[c]);if(!a)return null;const E=C.length;return e.jsxs("div",{className:"search-bar",role:"search",children:[e.jsx("input",{ref:n,className:"search-input",type:"text",value:o,placeholder:i("searchPlaceholder"),onChange:P=>{d(P.target.value),h(0)},onKeyDown:P=>{P.key==="Enter"&&(P.preventDefault(),I(P.shiftKey?-1:1))}}),e.jsx("span",{className:`search-count ${E===0?"empty":""}`,children:E===0?i("searchNoResults"):`${Math.min(u+1,E)}/${E}`}),e.jsx("button",{type:"button",className:"search-btn",title:i("searchPrev"),disabled:E===0,onClick:()=>I(-1),children:e.jsx(xt,{})}),e.jsx("button",{type:"button",className:"search-btn",title:i("searchNext"),disabled:E===0,onClick:()=>I(1),children:e.jsx(De,{})}),e.jsx("button",{type:"button",className:"search-btn",title:i("searchClose"),onClick:l,children:e.jsx(we,{})})]})}const bs=new Map,er=15,ks=30,Ns=1200,tr=1600;function ws(t){return t.content.some(s=>s.type==="toolCall")}const sr=[{key:"ex.understand",icon:"🔍"},{key:"ex.debug",icon:"🐛"},{key:"ex.test",icon:"🧪"},{key:"ex.review",icon:"🧹"}];function nr(t){return sr.map(({key:s,icon:a})=>({icon:a,text:t(s),prompt:t(`${s}.prompt`)}))}function ar({state:t,liveOutputs:s,toolStatuses:a,onEdit:l,onKillBash:c,thinkingWrap:i,toolsWrap:n,pendingEcho:o}){const d=me(),u=r.useRef(null),[h,m]=r.useState(!0),x=r.useRef(!0),C=r.useRef(0),M=r.useRef(!1),[R,w]=r.useState(()=>new Set),[I,E]=r.useState(!1),P=t.streamingMessage?[...t.messages,t.streamingMessage]:t.messages,D=r.useMemo(()=>{const N=new Map;for(const _ of t.messages)_.role==="toolResult"&&_.toolCallId&&N.set(_.toolCallId,_);return N},[t.messages]),A=r.useMemo(()=>Wi(t.messages),[t.messages]),S=P.length>0?P[P.length-1].id:null,y=t.messages.length>ks?Math.max(0,t.messages.length-er):0,[b,f]=r.useState(()=>new Set),[T,J]=r.useState(()=>new Set),ee=r.useRef(new Map),ie=r.useRef(new Map),Q=r.useRef(0),v=r.useRef(b);v.current=b;const W=t.messages.length>ks&&!I,$=r.useRef(W);$.current=W;const X=Vi(t.messages,ee.current,tr),ce=r.useRef(X);ce.current=X;const z=r.useCallback(()=>{const N=u.current;if(!N)return;if(!$.current){f(K=>K.size?new Set:K);return}const _=N.getBoundingClientRect(),re={top:_.top-Ns,bottom:_.bottom+Ns},ae=[];for(const[K,V]of ie.current){const ye=V.getBoundingClientRect();ae.push({id:K,top:ye.top,bottom:ye.bottom}),v.current.has(K)||ee.current.set(K,ye.bottom-ye.top)}const j=zi(ae,re,ce.current,v.current);for(const K of j.hide){const V=ie.current.get(K);V&&ee.current.set(K,V.offsetHeight)}f(K=>Ki(K,j))},[]),k=r.useCallback(()=>{Q.current||(Q.current=requestAnimationFrame(()=>{Q.current=0,z()}))},[z]);r.useLayoutEffect(()=>{z()},[z]);const U=r.useRef(I);r.useLayoutEffect(()=>{U.current&&!I&&z(),U.current=I},[I,z]);const te=r.useCallback((N,_)=>{ee.current.set(N,_)},[]),de=r.useCallback(N=>{N&&ie.current.set(N.dataset.lazyId??"",N)},[]);r.useEffect(()=>{const N=new Set(t.messages.map(_=>_.id));for(const[_,re]of ie.current)N.has(_)||(ie.current.delete(_),ee.current.delete(_));f(_=>{let re=!1;const ae=new Set;for(const j of _)N.has(j)?ae.add(j):re=!0;return re?ae:_})},[t.messages,R]),r.useEffect(()=>()=>cancelAnimationFrame(Q.current),[]);const F=r.useMemo(()=>{const N=[];for(const _ of t.messages){if(_.role!=="user")continue;const re=_.content.map(K=>{var V;return((V=st(K))==null?void 0:V.text)??""}).filter(Boolean).join(" "),ae=Bt(re),j=ae?ae.userMessage??`skill:${ae.name}`:re.trim();j&&N.push({id:_.id,text:j})}return N},[t.messages]),Y=r.useMemo(()=>{const N=new Map;return F.forEach((_,re)=>N.set(_.id,re)),N},[F]),[Z,G]=r.useState(-1),le=r.useRef(-1),ue=r.useRef(F);r.useEffect(()=>{ue.current=F},[F]);const g=r.useCallback(()=>{const N=u.current,_=ue.current;if(!N||_.length===0)return;const re=N.getBoundingClientRect().top,ae=140;let j=-1;for(let K=0;K<_.length;K++){const V=N.querySelector(`[data-msg-id="${_[K].id}"]`);if(V)if(V.getBoundingClientRect().top<=re+ae)j=K;else break}j!==le.current&&(le.current=j,G(j))},[]);r.useEffect(()=>{g()},[F,g]);const p=r.useCallback(N=>{w(_=>_.has(N)?_:new Set(_).add(N))},[]),B=r.useCallback(N=>{const _=t.messages.findIndex(re=>re.id===N);_>=0&&_<y&&!R.has(N)&&us.flushSync(()=>p(N))},[t.messages,y,R,p]);r.useEffect(()=>{const N=_=>{if(!(_.ctrlKey||_.metaKey)||_.key.toLowerCase()!=="f")return;const re=_.target;re&&(re.tagName==="INPUT"||re.tagName==="TEXTAREA"||re.isContentEditable)||(_.preventDefault(),E(!0))};return window.addEventListener("keydown",N),()=>window.removeEventListener("keydown",N)},[]);const oe=r.useCallback(N=>{w(_=>{if(!_.has(N))return _;const re=new Set(_);return re.delete(N),re})},[]),se=r.useCallback(N=>{const _=t.messages.findIndex(ae=>ae.id===N);us.flushSync(()=>{_>=0&&_<y&&!R.has(N)&&p(N),J(ae=>ae.has(N)?ae:new Set(ae).add(N))});const re=ue.current.findIndex(ae=>ae.id===N);le.current=re,G(re),requestAnimationFrame(()=>{var j,K,V;const ae=(j=u.current)==null?void 0:j.querySelector(`[data-msg-id="${N}"]`);ae&&((K=u.current)==null||K.querySelectorAll(".msg-flash").forEach(ye=>ye.classList.remove("msg-flash")),ae.scrollIntoView({block:"start"}),ae.classList.remove("msg-flash"),ae.offsetWidth,ae.classList.add("msg-flash"),ae!==((V=u.current)==null?void 0:V.lastElementChild)&&(M.current=!0))})},[t.messages,y,R,p]),xe=r.useCallback(()=>{const N=u.current;if(!N)return;const _=N.scrollTop-C.current;C.current=N.scrollTop;const re=N.scrollHeight-N.scrollTop-N.clientHeight<80;_<-4&&_>-500?M.current=!0:re&&_>=0&&(M.current=!1),x.current=re&&!M.current,m(x.current),g(),k()},[g,k]),O=r.useRef(!1);r.useEffect(()=>{const N=O.current;if(O.current=!!t.isStreaming,N&&!t.isStreaming&&!M.current){const _=()=>{const ae=u.current;ae&&!M.current&&(ae.scrollTop=ae.scrollHeight,x.current=!0,m(!0))};requestAnimationFrame(()=>requestAnimationFrame(_));const re=setTimeout(_,180);return()=>clearTimeout(re)}},[t.isStreaming]),r.useEffect(()=>{const N=u.current;N&&x.current&&(N.scrollTop=N.scrollHeight)},[P,t.isStreaming,s]);const fe=t.queue.steering.join("\0")+""+t.queue.followUp.join("\0");r.useEffect(()=>{const N=u.current;N&&x.current&&(N.scrollTop=N.scrollHeight)},[fe]);const ve=r.useCallback(()=>{const N=u.current;N&&(N.scrollTop=N.scrollHeight),x.current=!0,M.current=!1,m(!0)},[]),pe=r.useRef(null);r.useEffect(()=>{const N=pe.current,_=u.current;if(!N||!_)return;const re=ae=>{ae.preventDefault();const j=N.querySelector(".qn-list");if(j&&j.contains(ae.target)&&j.scrollHeight>j.clientHeight){j.scrollTop+=ae.deltaY;return}_.scrollTop+=ae.deltaY};return N.addEventListener("wheel",re,{passive:!1}),()=>N.removeEventListener("wheel",re)},[]);const[Te,Qe]=r.useState(0);r.useEffect(()=>{const N=()=>{var _;Qe(((_=u.current)==null?void 0:_.clientHeight)??0),k()};return N(),window.addEventListener("resize",N),()=>window.removeEventListener("resize",N)},[k]);const Fe=F.length,Ae=r.useMemo(()=>Fe===0?27:Math.max(4,Math.min(27,Math.floor(((Te||600)-16)/Fe)-3)),[Fe,Te]),Ee=Ae<20;return e.jsxs("div",{className:"messages-wrap",children:[e.jsxs("div",{className:"messages",ref:u,onScroll:xe,children:[t.messages.length===0&&!t.streamingMessage&&e.jsxs("div",{className:"empty-state",children:[e.jsx("div",{className:"empty-logo-wrap",children:e.jsx("div",{className:"empty-logo",children:"π"})}),e.jsx("h2",{className:"empty-title",children:d("welcomeTitle")}),e.jsx("p",{className:"empty-sub",children:d("welcomeSub")}),e.jsxs("div",{className:"empty-cwd",children:[e.jsx("span",{className:"empty-cwd-label",children:d("directory")}),e.jsx("span",{className:"empty-cwd-path",children:t.cwd})]}),e.jsx("div",{className:"empty-examples",children:nr(d).map(N=>e.jsxs("button",{type:"button",className:"empty-example",title:d("clickToFill"),onClick:()=>window.dispatchEvent(new CustomEvent("pi-web:fill",{detail:N.prompt})),children:[e.jsx("span",{className:"empty-example-icon",children:N.icon}),e.jsx("span",{className:"empty-example-text",children:N.text})]},N.prompt))})]}),t.messages.map((N,_)=>{const re=_<y,ae=re&&R.has(N.id);if(re&&!ae)return N.role==="toolResult"?null:e.jsx(Hi,{message:N,onExpand:p},N.id);const j=N.role==="user"?Y.get(N.id):void 0,K=!W||X.has(N.id)||T.has(N.id)||!b.has(N.id);return e.jsx(qi,{id:N.id,show:K,height:ee.current.get(N.id)??tn(N.role,N.customType),containerRef:u,onMeasured:te,lazyRef:de,children:e.jsx(xs,{message:N,qnIndex:j,qnActive:j!==void 0?j===Z:void 0,onJump:se,toolResults:D,liveOutputs:ws(N)?s:bs,toolStatuses:a,streaming:t.isStreaming,onKillBash:c,toolsWrap:n,thinkingWrap:i,isLast:N.id===S,onEdit:l,questionAttachments:A.get(N.id),onCollapse:ae?oe:void 0},N.id)},N.id)}),t.streamingMessage&&e.jsx(xs,{message:t.streamingMessage,toolResults:D,liveOutputs:ws(t.streamingMessage)?s:bs,toolStatuses:a,streaming:!0,isLast:!0,onEdit:l,onKillBash:c,toolsWrap:n,thinkingWrap:i},t.streamingMessage.id),t.isStreaming&&P.length===0&&e.jsx("div",{className:"streaming-wait",children:d("waitingResponse")}),t.isStreaming&&!t.streamingMessage&&P.length>0&&e.jsxs("div",{className:"msg msg-assistant assistant-wait-msg","data-role":"assistant",children:[e.jsx("div",{className:"msg-meta",children:e.jsx("span",{className:"msg-role",children:At("assistant",d)})}),e.jsx("div",{className:"msg-body",children:e.jsxs("span",{className:"assistant-wait",children:[e.jsx("span",{className:"thinking-spinner","aria-hidden":"true"}),d("waitingResponse")]})})]}),o&&o.conversationId===t.conversationId&&e.jsxs("div",{className:"msg msg-user pending-echo","data-role":"user",children:[e.jsxs("div",{className:"msg-meta",children:[e.jsx("span",{className:"msg-role",children:d("role.user")}),e.jsxs("span",{className:"pending-echo-tag",children:[e.jsx("span",{className:"thinking-spinner","aria-hidden":"true"}),d("sending")]})]}),e.jsx("div",{className:"msg-body",children:e.jsx("div",{className:"msg-text",children:o.text})})]}),t.queue.steering.map((N,_)=>e.jsx("div",{className:"queued-msg",children:e.jsxs("div",{className:"queued-bubble",children:[e.jsx("span",{className:"queued-tag steer",children:d("queueSteerTag")}),e.jsx("div",{className:"queued-text",children:N})]})},`q-steer-${_}`)),t.queue.followUp.map((N,_)=>e.jsx("div",{className:"queued-msg",children:e.jsxs("div",{className:"queued-bubble",children:[e.jsx("span",{className:"queued-tag follow",children:d("queueFollowTag")}),e.jsx("div",{className:"queued-text",children:N})]})},`q-fu-${_}`))]}),!h&&e.jsxs("button",{type:"button",className:"scroll-bottom",onClick:ve,children:[e.jsx(As,{})," ",d("backToBottom")]}),e.jsx(Zi,{containerRef:u,messages:P,open:I,onClose:()=>E(!1),onEnsureExpanded:B}),F.length>0&&e.jsxs("div",{className:`qn-rail ${Ee?"many":""}`,ref:pe,"aria-label":d("questionNavTitle"),style:{"--rail-gap":`${Ae}px`},children:[F.map((N,_)=>e.jsx("button",{type:"button",className:`qn-bar ${_===Z?"active":""}`,"aria-label":`${_+1}. ${N.text}`,onClick:()=>se(N.id),children:e.jsxs("span",{className:"qn-bar-text",children:[_+1,". ",N.text]})},N.id)),Ee&&e.jsx("div",{className:"qn-list",children:F.map((N,_)=>e.jsxs("button",{type:"button",className:`qn-list-item ${_===Z?"active":""}`,"aria-label":`${_+1}. ${N.text}`,onClick:()=>se(N.id),children:[e.jsx("span",{className:"qn-list-idx",children:_+1}),e.jsx("span",{className:"qn-list-text",children:N.text})]},N.id))})]})]})}const ir=r.memo(function({ready:s,streaming:a,messages:l,slashCommands:c,modelState:i,models:n,modelsLoading:o,send:d,activeConversationId:u,setPendingEcho:h,attachments:m,onRemoveAttachment:x,onAddImageFiles:C,onAddLocalFiles:M,onNotice:R,onSent:w,onManageModels:I}){const E=me(),{locale:P}=Ft(),D=p=>P==="en"&&p.descriptionEn?p.descriptionEn:p.description??"",A=p=>P==="en"&&p.argumentHintEn?p.argumentHintEn:p.argumentHint??"",[S,y]=r.useState(""),[b,f]=r.useState(!1),[T,J]=r.useState(null),[ee,ie]=r.useState(0),[Q,v]=r.useState(!1),[W,$]=r.useState(void 0),X=r.useRef(null),ce=r.useRef(null),z=r.useRef(null),k={builtin:E("slashBuiltin"),extension:E("slashExtension"),prompt:E("slashPrompt"),skill:E("slashSkill"),plugin:E("slashPlugin")},U=p=>{const B=p.match(/^\/([^\s]*)$/);if(B&&s){const oe=B[1].toLowerCase(),se=c.filter(xe=>{const O=xe.name.toLowerCase();if(O.startsWith(oe))return!0;const fe=O.indexOf(":");return fe>=0&&O.slice(fe+1).startsWith(oe)});J(se.length>0?se:null),ie(0)}else J(null)};r.useEffect(()=>{var B;const p=(B=z.current)==null?void 0:B.querySelector(".slash-item.active");p==null||p.scrollIntoView({block:"nearest"})},[ee,T]);const te=p=>{var O;const B=T??[],oe=p??B[ee%Math.max(B.length,1)];if(!oe){J(null);return}const se=S.match(/^\/([^\s]*)([\s\S]*)$/),xe=se?se[2]:"";y(`/${oe.name} ${xe}`),J(null),(O=X.current)==null||O.focus()},de=async()=>{const B=[...l].reverse().find(se=>se.role==="assistant"&&se.content.some(xe=>xe.type==="text"&&xe.text)),oe=B==null?void 0:B.content.filter(se=>se.type==="text").map(se=>se.text).join(`
|
|
23
|
+
`);if(!oe){R("warning",E("slashCopyEmpty"));return}try{await navigator.clipboard.writeText(oe),R("info",E("slashCopied"))}catch{R("error",E("slashCopyFailed"))}},F=p=>{if(!p||p.length===0){R("warning",E("foldersNotSupported"));return}const B=Array.from(p).filter(se=>Pe(se.type)),oe=Array.from(p).filter(se=>!Pe(se.type));B.length>0&&C(B),oe.length>0&&M(oe)},Y=p=>{var se;const B=(se=p.clipboardData)==null?void 0:se.items;if(!B)return;const oe=[];for(const xe of B)if(xe.kind==="file"&&Pe(xe.type)){const O=xe.getAsFile();O&&oe.push(O)}oe.length!==0&&(p.preventDefault(),C(oe))},Z=s,G=r.useRef(S);r.useEffect(()=>{G.current=S},[S]),r.useEffect(()=>{U(G.current)},[c]),r.useEffect(()=>{const p=B=>{var se;const oe=B.detail;y(oe),(se=X.current)==null||se.focus()};return window.addEventListener("pi-web:fill",p),()=>window.removeEventListener("pi-web:fill",p)},[]),r.useEffect(()=>{if(!Q)return;const p=B=>{B.key==="Escape"&&v(!1)};return window.addEventListener("keydown",p),()=>window.removeEventListener("keydown",p)},[Q]),r.useEffect(()=>{const p=X.current;if(!p)return;p.style.height="auto";const B=p.scrollHeight>220;p.style.height=`${Math.min(p.scrollHeight,220)}px`,p.style.overflowY=B?"auto":"hidden"},[S]);const le=(p=!1)=>{var se,xe,O,fe,ve;const B=S.trim(),oe=m.some(pe=>pe.imageData||pe.fileData);if(!(!Z||!B&&!oe)){if(B==="/help"){const pe=(xe=(se=X.current)==null?void 0:se.closest(".inputbox"))==null?void 0:xe.getBoundingClientRect();$(pe==null?void 0:pe.width),v(!0),y(""),(O=X.current)==null||O.focus();return}if(B==="/copy"){y(""),(fe=X.current)==null||fe.focus(),de();return}d({type:"prompt",text:B,queue:p,attachments:m.map(pe=>pe.imageData?{path:"",imageData:pe.imageData,mimeType:pe.mimeType,name:pe.name}:pe.fileData?{path:"",fileData:pe.fileData,mimeType:pe.mimeType,name:pe.name,size:pe.size}:{path:pe.path,mode:pe.mode,...pe.lines?{lines:pe.lines}:{}})})&&(h(u,B),y(""),w(),(ve=X.current)==null||ve.focus())}},ue=p=>{if(!p.nativeEvent.isComposing){if(T&&T.length>0)switch(p.key){case"ArrowDown":p.preventDefault(),ie(B=>(B+1)%T.length);return;case"ArrowUp":p.preventDefault(),ie(B=>(B-1+T.length)%T.length);return;case"Tab":case"Enter":p.preventDefault(),te();return;case"Escape":p.preventDefault(),J(null);return}p.key==="Enter"&&!p.shiftKey&&(p.preventDefault(),le())}},g=()=>e.jsx("div",{className:"inputbox-actions",children:a?e.jsxs(e.Fragment,{children:[S.trim()!==""&&e.jsxs("button",{type:"button",className:"btn supplement",title:E("supplementTip"),onClick:()=>le(!0),children:[e.jsx(Zn,{})," ",E("supplement")]}),e.jsx("button",{type:"button",className:"btn stop",title:E("stopAgent"),onClick:()=>d({type:"abort"}),children:e.jsx(dt,{})})]}):e.jsx("button",{type:"button",className:"btn send",title:E("sendTip"),disabled:!Z||!S.trim()&&!m.some(p=>p.imageData||p.fileData),onClick:()=>le(),children:e.jsx(Bs,{})})});return e.jsxs("div",{className:`inputbar${b?" drop-active":""}`,onDragOver:p=>{p.preventDefault(),p.stopPropagation(),f(!0)},onDragLeave:p=>{p.currentTarget.contains(p.relatedTarget)||f(!1)},onDrop:p=>{var B;p.preventDefault(),p.stopPropagation(),f(!1),F(((B=p.dataTransfer)==null?void 0:B.files)??null)},children:[b&&e.jsx("div",{className:"drop-overlay",children:e.jsxs("span",{children:["📎 ",E("dropHereToAttach")]})}),m.length>0&&e.jsxs("div",{className:"attach-row",children:[m.map(p=>e.jsxs("span",{className:`attach-chip ${p.imageData?"image":p.fileData?"file":p.mode}`,title:p.imageData?E("attachImage",{name:p.name}):p.fileData?E("attachFile",{name:p.name}):p.isDir?E("folderRef",{path:p.path}):p.mode==="reference"?E("refOnly",{path:p.path}):p.mode==="lines"&&p.lines?E("attachLines",{path:p.path,start:p.lines.start,end:p.lines.end}):E("attachContent",{path:p.path}),children:[p.imageData?"🖼":p.fileData?"📄":p.isDir?"📁":p.mode==="reference"?"🔗":"📎"," ",p.name,p.mode==="lines"&&p.lines&&e.jsxs("span",{className:"attach-range",children:["L",p.lines.start,"-",p.lines.end]}),e.jsx("button",{type:"button",className:"attach-remove",title:E("removeAttachment"),onClick:()=>x(p.key??p.path),children:"×"})]},p.key??`${p.path}|${p.mode}|${p.lines?`${p.lines.start}-${p.lines.end}`:""}`)),e.jsx("span",{className:"attach-hint",children:E("attachHint")})]}),T&&T.length>0&&e.jsxs("div",{className:"slash-menu",role:"listbox",ref:z,"aria-label":E("slashCommands"),children:[e.jsxs("div",{className:"slash-menu-hint",children:[e.jsx("span",{children:E("slashMenuHint")}),e.jsx("span",{className:"slash-menu-close",onClick:()=>J(null),children:"Esc"})]}),T.map((p,B)=>e.jsxs("button",{type:"button",className:`slash-item${B===ee?" active":""}`,onMouseEnter:()=>ie(B),onClick:()=>te(p),children:[e.jsxs("span",{className:"slash-name",children:["/",p.name]}),e.jsx("span",{className:`slash-source ${p.source}`,children:k[p.source]}),e.jsxs("span",{className:"slash-desc",children:[D(p),p.argumentHint&&e.jsx("span",{className:"slash-hint",children:A(p)})]})]},p.name))]}),Q&&e.jsx("div",{className:"modal-backdrop",onClick:()=>v(!1),children:e.jsxs("div",{className:"slash-help",style:W?{width:W}:void 0,onClick:p=>p.stopPropagation(),children:[e.jsxs("div",{className:"slash-help-head",children:[e.jsxs("span",{children:["⚡ ",E("slashHelpTitle")]}),e.jsx("button",{type:"button",className:"btn",onClick:()=>v(!1),children:E("close")})]}),e.jsx("div",{className:"slash-help-body",children:c.length===0?e.jsx("div",{className:"slash-help-empty",children:E("slashLoading")}):c.map(p=>e.jsxs("div",{className:"slash-help-row",children:[e.jsxs("span",{className:"slash-help-cmd",children:["/",p.name]}),e.jsx("span",{className:`slash-source ${p.source}`,children:k[p.source]}),e.jsxs("span",{className:"slash-help-desc",children:[D(p),p.argumentHint&&e.jsx("span",{className:"slash-hint",children:A(p)})]})]},p.name))})]})}),e.jsxs("div",{className:"inputbox",children:[e.jsx("input",{ref:ce,type:"file",multiple:!0,hidden:!0,onChange:p=>{F(p.target.files),p.target.value=""}}),e.jsxs("div",{className:"inputbox-row",children:[e.jsx("button",{type:"button",className:"btn attach-img",title:E("uploadFile"),disabled:!Z,onClick:()=>{var p;return(p=ce.current)==null?void 0:p.click()},children:e.jsx(ts,{})}),e.jsx("textarea",{ref:X,value:S,rows:1,placeholder:E(Z?a?"placeholderStreaming":"placeholderIdle":"placeholderConnecting"),disabled:!Z,onChange:p=>{y(p.target.value),U(p.target.value)},onKeyDown:ue,onPaste:Y}),g()]}),e.jsxs("div",{className:"input-tools",children:[e.jsx("div",{className:"input-tools-left",children:e.jsx(Us,{state:i,models:n,modelsLoading:o,send:d,onManageModels:I,compact:!0})}),e.jsxs("div",{className:"input-tools-right",children:[e.jsx("button",{type:"button",className:"btn attach-img",title:E("uploadFile"),disabled:!Z,onClick:()=>{var p;return(p=ce.current)==null?void 0:p.click()},children:e.jsx(ts,{})}),g()]})]})]})]})}),rr=r.memo(function({goal:s,models:a,modelsLoading:l,activeConversationId:c,send:i}){var J,ee,ie,Q,v,W;const n=me(),o=!s.conversationId||s.conversationId===c,d=s.goal!==null&&o,[u,h]=r.useState(""),[m,x]=r.useState(s.reviewModel??""),[C,M]=r.useState(s.maxRounds),[R,w]=r.useState(s.locked),[I,E]=r.useState(!1),[P,D]=r.useState(!1),[A,S]=r.useState(!0);r.useEffect(()=>{x(s.reviewModel??""),M(s.maxRounds||0),w(s.locked)},[s.goal,s.reviewModel,s.maxRounds,s.locked]),r.useEffect(()=>{I&&a.length===0&&!P&&!l&&(D(!0),i({type:"list_models"}))},[I,a.length,P,l,i]),r.useEffect(()=>{a.length>0&&D(!1)},[a.length]);const y=()=>{var $;return m?(($=a.find(X=>X.id===m))==null?void 0:$.name)??m:n("goalBarUseMainModel")},b=()=>{const $=u.trim();$&&(i({type:"set_goal",goal:$,...m?{reviewModel:m}:{},maxRounds:C,locked:R}),h(""),S(!1))},f=()=>{const $=u.trim();$&&(i({type:"start_goal_wizard",text:$,...m?{wizardModel:m}:{},maxRounds:C,locked:R}),h(""),S(!1))},T=(((J=s.wizard)==null?void 0:J.active)??!1)&&o;return T?e.jsx("div",{className:`goalbar goalbar-active ${T?"wizard":""}`,children:e.jsxs("div",{className:"goalbar-active-row",children:[e.jsx("span",{className:"goalbar-icon",children:e.jsx("span",{className:"goalbar-spin",children:"🔍"})}),e.jsxs("span",{className:"goalbar-text",title:((ee=s.wizard)==null?void 0:ee.draft)??"",children:[n("goalWizardRunning"),": ",(ie=s.wizard)==null?void 0:ie.draft]}),e.jsxs("span",{className:"goalbar-chip reviewing",children:[n("goalBarRound",{n:(((Q=s.wizard)==null?void 0:Q.step)??0)+1})," ","/ ",((v=s.wizard)==null?void 0:v.maxSteps)??6]}),e.jsx("span",{className:"goalbar-detail",children:((W=s.wizard)==null?void 0:W.status)||n("goalBarReviewing")}),e.jsx("button",{type:"button",className:"goalbar-x",title:n("goalBarClear"),onClick:()=>{i({type:"clear_goal"}),S(!0)},children:e.jsx(we,{})})]})}):d?e.jsx("div",{className:`goalbar goalbar-active ${s.reviewing?"reviewing":""}`,children:e.jsxs("div",{className:"goalbar-active-row",children:[e.jsx("span",{className:"goalbar-icon",children:s.reviewing?e.jsx("span",{className:"goalbar-spin",children:"◌"}):"🎯"}),e.jsx("span",{className:"goalbar-text",title:s.goal??"",children:s.goal}),s.reviewing?e.jsxs("span",{className:"goalbar-chip reviewing",children:[n("goalBarReviewing")," ",n("goalBarRound",{n:s.round})]}):e.jsx("span",{className:`goalbar-chip ${s.verdict==="pass"?"pass":s.verdict==="fail"?"fail":""}`,children:s.verdict==="pass"?n("goalBarPassed"):s.verdict==="fail"?n("goalBarFailed"):`${n("goalBarRound",{n:s.round||1})} · ${s.locked?n("goalBarLocked"):n("goalBarUnlocked")}`}),e.jsx("span",{className:"goalbar-detail",children:s.status}),e.jsx("button",{type:"button",className:"goalbar-x",title:n("goalBarClear"),disabled:s.reviewing,onClick:()=>{i({type:"clear_goal"}),S(!0)},children:e.jsx(we,{})})]})}):A?e.jsx("div",{className:"goalbar goalbar-collapsed",children:e.jsxs("button",{type:"button",className:"goalbar-hint",title:n("goalBarPlaceholder"),onClick:()=>S(!1),children:[e.jsx(es,{})," ",e.jsx("span",{children:n("goalBarTitle")})]})}):e.jsxs("div",{className:"goalbar",children:[e.jsxs("div",{className:"goalbar-row",children:[e.jsx("span",{className:"goalbar-icon",children:e.jsx(es,{})}),e.jsx("input",{className:"goalbar-input",value:u,placeholder:n("goalBarPlaceholder"),onChange:$=>h($.target.value),onKeyDown:$=>{$.key==="Enter"&&b()}}),e.jsx("button",{type:"button",className:"goalbar-btn",disabled:!u.trim(),onClick:b,children:n("goalBarSet")}),e.jsxs("button",{type:"button",className:"goalbar-btn wizard",disabled:!u.trim(),title:n("goalWizardTip"),onClick:f,children:["🔍 ",n("goalWizardBtn")]}),e.jsx("button",{type:"button",className:"goalbar-icon-btn",title:n(R?"goalBarLocked":"goalBarUnlocked"),onClick:()=>w($=>(i({type:"set_goal_prefs",locked:!$}),!$)),children:R?e.jsx(ia,{}):e.jsx(Yn,{})}),e.jsx("button",{type:"button",className:"goalbar-icon-btn",title:n("goalBarClear"),onClick:()=>S(!0),children:e.jsx(xt,{})})]}),e.jsxs("div",{className:"goalbar-opts",children:[e.jsxs(Ue,{trigger:e.jsxs("span",{className:"goalbar-opt",children:[n("goalBarReviewModel"),": ",e.jsx("b",{children:y()})]}),open:I,onOpenChange:E,direction:"up",children:[e.jsx("div",{className:"dd-header",children:n("goalBarReviewModel")}),(P||l)&&e.jsx("div",{className:"dd-loading",children:n("loading")}),a.length===0&&!P&&!l&&e.jsx("div",{className:"dd-loading",children:n("noModels")}),e.jsx(Le,{active:m==="",onClick:()=>{x(""),E(!1),i({type:"set_goal_prefs",reviewModel:""})},children:n("goalBarUseMainModel")}),a.map($=>e.jsx(Le,{active:m===$.id,onClick:()=>{x($.id),E(!1),i({type:"set_goal_prefs",reviewModel:$.id})},children:e.jsxs("span",{className:"dd-model-cell",children:[e.jsx("span",{className:"dd-model-name",children:$.name}),e.jsx("span",{className:"dd-model-meta",children:e.jsx("span",{className:"dd-model-provider",children:$.provider})})]})},$.id)),e.jsx("button",{type:"button",className:"dd-refresh",onClick:()=>i({type:"list_models"}),children:n("refreshModels")})]}),e.jsxs("label",{className:"goalbar-round",title:n("goalBarMaxRoundsTip"),children:[e.jsx("span",{children:n("goalBarMaxRounds")}),e.jsx("input",{type:"number",min:0,step:1,value:C,placeholder:n("goalBarUnlimitedShort"),onChange:$=>{const X=parseInt($.target.value,10);if(Number.isNaN(X)||X<0){M(0);return}M(X)},onBlur:()=>i({type:"set_goal_prefs",maxRounds:C}),onKeyDown:$=>{$.key==="Enter"&&(i({type:"set_goal_prefs",maxRounds:C}),$.target.blur())}})]}),e.jsx("span",{className:"goalbar-lock-hint",children:n(R?"goalBarLocked":"goalBarUnlocked")})]})]})});function lr({chat:t,send:s}){const a=me(),l=t.state,[c,i]=r.useState(!1),[n,o]=r.useState(""),[d,u]=r.useState(0),h=r.useRef(null),m=t.pathCompletions;if(r.useEffect(()=>{if(!c)return;const b=setTimeout(()=>{s({type:"complete_path",path:n})},150);return()=>clearTimeout(b)},[n,c,s]),r.useEffect(()=>u(0),[m]),r.useEffect(()=>{const b=document.querySelector(`.status-completions .pc-item[data-idx="${d}"]`);b==null||b.scrollIntoView({block:"nearest"})},[d]),!l)return null;const x=l.stats,C=t.ready?"ok":"busy",M=t.ready?a("connected"):a("connecting"),R=x.contextUsage,w=R.tokens!==null&&R.percent!==null?`${Cs(R.tokens)} / ${Cs(R.contextWindow)}`:"—",I=R.percent??null,E=I===null?"":I>=80?"warn":I>=50?"mid":"ok",P=l.queue.steering.length+l.queue.followUp.length,D=()=>{o(l.cwd),i(!0)},A=(b,f)=>{var J;const T=b.includes("\\")?"\\":"/";o(f?`${b}${T}`:b),u(0),(J=h.current)==null||J.focus()},S=b=>{const f=b.trim();f&&f!==l.cwd&&s({type:"set_cwd",path:f}),i(!1)},y=b=>{if(b.key==="ArrowDown")b.preventDefault(),u(f=>Math.min(f+1,m.length-1));else if(b.key==="ArrowUp")b.preventDefault(),u(f=>Math.max(f-1,0));else if(b.key==="Tab"&&m.length>0){b.preventDefault();const f=m[Math.min(d,m.length-1)];A(f.path,f.type==="dir")}else if(b.key==="Enter"&&!b.nativeEvent.isComposing){const f=n.trim();if(f.endsWith("/")||f.endsWith("\\"))S(f);else if(m.some(T=>T.path===f))S(f);else if(m.length>0&&m[d]){b.preventDefault();const T=m[d];A(T.path,T.type==="dir")}else S(f)}else b.key==="Escape"&&(m.length>0?(b.stopPropagation(),s({type:"complete_path",path:""})):i(!1))};return e.jsxs("footer",{className:"statusbar",children:[e.jsx("span",{className:`status-dot ${C}`,title:M}),e.jsx("span",{className:"status-item",children:M}),e.jsx("span",{className:"status-sep",children:"·"}),e.jsxs("span",{className:"status-item status-ctx",title:a("contextUsage"),children:[a("context"),e.jsx("span",{className:`ctx-bar ${E}`,children:I!==null&&e.jsx("span",{className:"ctx-bar-fill",style:{width:`${Math.min(I,100)}%`}})}),w]}),e.jsx("span",{className:"status-sep",children:"·"}),e.jsxs("span",{className:"status-item",title:a("cumulativeCost"),children:["$",or(x.cost)]}),e.jsx("span",{className:"status-sep",children:"·"}),e.jsxs("span",{className:"status-item",title:a("sessionMessages"),children:[a("messages")," ",x.totalMessages]}),t.statuses.length>0&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"status-sep",children:"·"}),e.jsx("span",{className:"status-item ext-status",title:a("pluginStatus"),children:t.statuses.map(b=>b.text).join(" · ")})]}),l.isStreaming&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"status-sep",children:"·"}),e.jsxs("span",{className:"status-item working",children:[e.jsx("span",{className:"working-spin"}),a("working"),P>0&&e.jsxs("span",{className:"status-queue",children:["⏳ ",P," ",a("queued")]})]})]}),c?e.jsxs("div",{className:"status-cwd-wrap",children:[e.jsx("input",{ref:h,className:"status-cwd-input",value:n,autoFocus:!0,placeholder:a("enterPath"),onChange:b=>o(b.target.value),onKeyDown:y,onBlur:()=>i(!1)}),m.length>0&&e.jsx("ul",{className:"status-completions",onMouseDown:b=>b.preventDefault(),children:m.map((b,f)=>e.jsx("li",{children:e.jsxs("button",{type:"button","data-idx":f,className:`pc-item ${f===d?"sel":""}`,onMouseEnter:()=>u(f),onClick:()=>A(b.path,b.type==="dir"),children:[e.jsx("span",{className:"pc-icon",children:b.type==="dir"?e.jsx(Ie,{}):e.jsx(Fs,{})}),e.jsxs("span",{className:"pc-body",children:[e.jsx("span",{className:"pc-name",children:b.name}),e.jsx("span",{className:"pc-path",children:b.path})]})]})},b.path))})]}):e.jsxs("button",{type:"button",className:"status-item status-cwd",title:a("cwdTip",{path:l.cwd}),onClick:D,children:["📁 ",l.cwd]})]})}function Cs(t){return t>=1e3?`${(t/1e3).toFixed(1).replace(/\.0$/,"")}K`:String(t)}function or(t){return t<=0?"0":t<1e-4?"<0.0001":t.toFixed(4).replace(/\.?0+$/,"")}function cr({dialog:t,send:s}){const a=me(),[l,c]=r.useState(""),[i,n]=r.useState(0),o=h=>{s({type:"dialog_response",id:t.id,value:h})};r.useEffect(()=>{c(""),n(0);const h=m=>{m.key==="Escape"&&o(null)};return document.addEventListener("keydown",h),()=>document.removeEventListener("keydown",h)},[t.id]);const d=Array.isArray(t.args[0])?t.args[0]:[],u=typeof t.args[0]=="string"?t.args[0]:"";return e.jsxs("div",{className:"dialog-inline","data-dialog-kind":t.kind,children:[e.jsxs("div",{className:"dialog-head",children:[e.jsx("span",{className:"dialog-badge",children:a("pluginRequest")}),t.title&&t.title!==a("pluginRequest")&&e.jsx("span",{className:"dialog-title",children:t.title}),e.jsx("button",{type:"button",className:"dialog-dismiss",title:a("cancel"),onClick:()=>o(null),children:"✕"})]}),t.kind==="select"&&e.jsxs("div",{className:"dialog-options",children:[d.map((h,m)=>e.jsx("button",{type:"button",className:`dialog-option ${m===i?"sel":""}`,onMouseEnter:()=>n(m),onClick:()=>o(h),children:h},m)),d.length===0&&e.jsx("div",{className:"dialog-hint",children:a("noOptions")})]}),t.kind==="confirm"&&e.jsxs("div",{className:"dialog-body",children:[e.jsx("p",{children:u}),e.jsxs("div",{className:"dialog-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:()=>o(!1),children:a("cancel")}),e.jsx("button",{type:"button",className:"btn primary",onClick:()=>o(!0),children:a("ok")})]})]}),t.kind==="input"&&e.jsxs("div",{className:"dialog-body",children:[e.jsx("input",{className:"dialog-input",value:l,placeholder:u||a("inputPlaceholder"),autoFocus:!0,onChange:h=>c(h.target.value),onKeyDown:h=>{h.key==="Enter"&&!h.nativeEvent.isComposing&&o(l)}}),e.jsxs("div",{className:"dialog-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:()=>o(null),children:a("cancel")}),e.jsx("button",{type:"button",className:"btn primary",onClick:()=>o(l),children:a("ok")})]})]})]})}function dr(t){if(t.x==="?"&&t.y==="?")return"untracked";const s=t.x!==" "&&t.x!=="?",a=t.y!==" "&&t.y!=="?";return s&&a?"both":s?"staged":"unstaged"}function ur({chat:t,send:s,terminal:a,active:l,onSwitchToTerminal:c}){var re,ae;const i=me(),[n,o]=r.useState(null),[d,u]=r.useState([]),[h,m]=r.useState(""),[x,C]=r.useState(new Map),[M,R]=r.useState("changes"),[w,I]=r.useState([]),[E,P]=r.useState(null),[D,A]=r.useState(""),[S,y]=r.useState(!1),[b,f]=r.useState(null),[T,J]=r.useState(null),[ee,ie]=r.useState(!1),[Q,v]=r.useState(!1),[W,$]=r.useState(!1),[X,ce]=r.useState(null),[z,k]=r.useState(!1),[U,te]=r.useState(""),de=r.useRef(0),F=r.useRef(-1),Y=r.useRef(-1),Z=r.useRef(-1),G=r.useRef(-1),le=r.useRef(void 0),ue=r.useRef(null),g=r.useRef([]),p=r.useCallback(j=>{if(j.reqId===F.current){if(F.current=-1,v(!1),ce(null),!j.ok){ce(j.error??"查询失败");return}if(j.notRepo){k(!0),o(null),u([]),C(new Map),I([]),P(null),A(""),J(null);return}k(!1);const K={branch:j.branch??"",detached:!!j.detached,upstream:j.upstream??null,ahead:j.ahead??0,behind:j.behind??0,upstreamGone:!!j.upstreamGone,files:(j.files??[]).map(ge=>({...ge}))},V=(j.branches??[]).map(ge=>({...ge})),ye=new Map;for(const[ge,Ne]of Object.entries(j.stats??{}))ye.set(ge,{add:Ne[0],del:Ne[1]});o(K),u(V),C(ye),m(ge=>{var Ne;return K.detached?ge||"":K.branch&&V.some(Se=>Se.name===K.branch)?K.branch:ge&&V.some(Se=>Se.name===ge)?ge:((Ne=V[0])==null?void 0:Ne.name)??""}),J(ge=>ge&&!K.files.some(Ne=>Ne.path===ge.file.path)?null:ge)}else if(j.reqId===Y.current){if(Y.current=-1,ie(!1),!j.ok){ce(j.error??"查询失败");return}const K=ue.current;if(!K)return;J({file:K,staged:j.stagedText??"",worktree:j.worktreeText??"",untracked:!1})}else if(j.reqId===G.current){if(G.current=-1,$(!1),!j.ok){ce(j.error??"查询失败");return}I((j.history??[]).map(K=>({...K})))}else if(j.reqId===Z.current){if(Z.current=-1,y(!1),!j.ok){ce(j.error??"查询失败");return}A(j.text??"")}},[]);r.useEffect(()=>{const j=t.scmData;j&&j.type==="scm_data"&&p(j)},[t.scmData,p]);const B=r.useCallback((j,K)=>{if(!t.ready||t.status!=="open")return!1;const V=++de.current;return s({...j,reqId:V})?(K.current=V,!0):(de.current-=1,!1)},[t.ready,t.status,s]),oe=r.useCallback((j=!1,K=!1)=>{var V;!t.ready||t.status!=="open"||(V=t.state)!=null&&V.cwd&&(le.current!==void 0&&le.current!==t.state.cwd&&(o(null),u([]),C(new Map),I([]),$(!1),G.current=-1,P(null),A(""),J(null),f(null)),le.current=t.state.cwd,ce(null),B({type:"scm_status"},F)&&(K||v(!0)))},[t.ready,(re=t.state)==null?void 0:re.cwd,t.status,B]),se=r.useCallback(j=>{if(f(j),P(null),ue.current=j,j.x==="?"&&j.y==="?"){J({file:j,staged:"",worktree:"",untracked:!0});return}ie(!0),ce(null),B({type:"scm_filediff",path:j.path},Y)||ie(!1)},[B]),xe=r.useCallback(j=>{P(j),f(null),J(null),A(""),y(!0),ce(null),B({type:"scm_commit",hash:j.hash},Z)||y(!1)},[B]),O=r.useCallback((j,K)=>{var ge,Ne;if(!t.ready)return;const V={name:j,command:K,cwd:"${pwd}"},ye=t.terminals.find(Se=>Se.title===j);if(ye)a.restart(ye.id),s({type:"run_command",terminalId:ye.id,conversationId:ye.conversationId,command:V,cols:80,rows:24});else{const Se=Ge();a.create({id:Se,conversationId:t.activeConversationId||((ge=t.state)==null?void 0:ge.conversationId)||"",title:j,cwd:((Ne=t.state)==null?void 0:Ne.cwd)??"",cols:80,rows:24,running:!0,exitCode:null,command:V})}c()},[t.ready,(ae=t.state)==null?void 0:ae.cwd,t.terminals,c,s,a]),fe=r.useCallback(()=>{const j=U.trim();if(!j||z)return;const K=j.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/`/g,"\\`").replace(/\$/g,"\\$");O("git commit",`git add -A && git commit -m "${K}"`),te("")},[U,z,O]),ve=j=>`'${j.replace(/'/g,"'\\''")}`,pe=r.useCallback(j=>{z||O("git add",`git add -- ${ve(j.path)}`)},[z,O]),Te=r.useCallback(j=>{z||O("git reset",`git reset HEAD -- ${ve(j.path)}`)},[z,O]),Qe=r.useCallback(()=>{if(!h||z)return;const j=d.find(K=>K.name===h);if(j!=null&&j.remote&&typeof j.remote=="string"){const K=h.slice(j.remote.length+1);O("git checkout",`git checkout -b ${K} ${h} || git checkout ${h}`)}else O("git checkout",`git checkout ${h}`)},[h,d,z,O]),Fe=r.useCallback(()=>O("git push","git push"),[O]),Ae=r.useCallback(()=>O("git pull","git pull"),[O]),Ee=r.useCallback(()=>{B({type:"scm_history"},G)||(G.current=-1)},[B]);r.useEffect(()=>{l&&oe()},[l,oe]),r.useEffect(()=>{M==="history"&&n&&Ee()},[M,n,Ee]),r.useEffect(()=>{t.scmDirty>0&&l&&oe(!1,!0)},[t.scmDirty]),r.useEffect(()=>{if(!l||!t.ready||t.status!=="open")return;const j=setInterval(()=>{document.visibilityState!=="hidden"&&oe(!1,!0)},3e4);return()=>clearInterval(j)},[l,t.ready,t.status,oe]),r.useEffect(()=>{const j=g.current;if(g.current=t.terminals,!l)return;t.terminals.some(V=>{var ge;return V.running!==!1?!1:((ge=j.find(Ne=>Ne.id===V.id))==null?void 0:ge.running)===!0&&/^git /.test(V.title)})&&t.ready&&t.status==="open"&&(oe(!1,!0),M==="history"&&n&&Ee())},[t.terminals,l,t.ready,t.status,oe,M,n,Ee]);const N={staged:i("scmStaged"),unstaged:i("scmUnstaged"),untracked:i("scmUntracked"),both:i("scmStagedUnstaged")},_=j=>{const K=j.split(`
|
|
24
|
+
`);return e.jsx("pre",{className:"scm-diff-pre",children:K.map((V,ye)=>{let ge="";return V.startsWith("diff --git")||V.startsWith("index ")||V.startsWith("new file")||V.startsWith("deleted file")||V.startsWith("old mode")||V.startsWith("new mode")||V.startsWith("similarity index")||V.startsWith("rename ")||V.startsWith("copy ")||V.startsWith("Binary files")||V.startsWith("---")||V.startsWith("+++")?ge="hdr":V.startsWith("@@")?ge="hunk":V.startsWith("+")?ge="add":V.startsWith("-")&&(ge="del"),e.jsx("div",{className:`scm-diff-line ${ge}`,children:V||" "},ye)})})};return e.jsxs("div",{className:"scm-view",children:[e.jsxs("div",{className:"scm-header",children:[e.jsxs("div",{className:"scm-title-row",children:[e.jsxs("span",{className:"scm-title",children:[e.jsx(rt,{}),i("scmTitle")]}),e.jsxs("div",{className:"scm-view-tabs",role:"tablist",children:[e.jsx("button",{type:"button",role:"tab","aria-selected":M==="changes",className:M==="changes"?"active":"",onClick:()=>{R("changes"),ce(null)},children:i("scmChanges")}),e.jsx("button",{type:"button",role:"tab","aria-selected":M==="history",className:M==="history"?"active":"",onClick:()=>{R("history"),ce(null)},children:i("scmHistory")})]}),e.jsx("button",{type:"button",className:"panel-refresh",title:i("scmRefreshTip"),disabled:Q,onClick:()=>oe(!0),children:e.jsx(ft,{className:Q?"scm-spin":""})})]}),e.jsxs("div",{className:"scm-row",children:[e.jsxs("span",{className:"scm-branch-current",title:i("scmCurrentBranch"),children:[e.jsx(rt,{}),n?n.detached?i("scmDetached"):n.branch:"…",(n==null?void 0:n.upstream)&&e.jsx("span",{className:"scm-upstream",children:n.upstreamGone?i("scmUpstreamGone"):n.ahead>0||n.behind>0?i("scmAheadBehind",{ahead:n.ahead,behind:n.behind}):n.upstream})]}),e.jsxs("select",{className:"scm-select",value:h,disabled:z||d.length===0,title:i("scmSwitchBranch"),onChange:j=>m(j.target.value),children:[e.jsx("option",{value:"",disabled:!0,children:i("scmSelectBranch")}),d.filter(j=>!j.remote).map(j=>e.jsx("option",{value:j.name,children:j.current?`* ${j.name}`:j.name},j.name)),d.some(j=>j.remote)&&e.jsx("optgroup",{label:i("scmRemoteBranches"),children:d.filter(j=>j.remote).map(j=>e.jsx("option",{value:j.name,children:j.name},j.name))})]}),e.jsxs("button",{type:"button",className:"btn",disabled:!h||h===(n==null?void 0:n.branch)||z,title:i("scmSwitchBranchTip",{branch:h}),onClick:Qe,children:[e.jsx(rt,{}),i("scmSwitch")]}),e.jsxs("button",{type:"button",className:"btn",disabled:!n||n.detached||z,title:i("scmPushTip"),onClick:Fe,children:[e.jsx(Bs,{}),i("scmPush")]}),e.jsxs("button",{type:"button",className:"btn",disabled:!n||n.detached||z,title:i("scmPullTip"),onClick:Ae,children:[e.jsx(As,{}),i("scmPull")]}),e.jsx("input",{className:"scm-commit-input",value:U,placeholder:i("scmCommitPlaceholder"),disabled:z,onChange:j=>te(j.target.value),onKeyDown:j=>{j.key==="Enter"&&!j.nativeEvent.isComposing&&fe()}}),e.jsxs("button",{type:"button",className:"btn primary",disabled:!U.trim()||z,title:i("scmCommitTip"),onClick:fe,children:[e.jsx(Ve,{}),i("scmCommit")]})]})]}),e.jsxs("div",{className:"scm-body",children:[M==="history"?e.jsxs("div",{className:"scm-history",children:[e.jsxs("div",{className:"scm-files-header",children:[e.jsx("span",{children:i("scmHistory")}),w.length>0&&e.jsx("span",{className:"scm-files-count",children:w.length})]}),e.jsx("div",{className:"scm-history-list",children:z?e.jsx("div",{className:"scm-empty",children:i("scmNotGitRepo")}):!n||W?e.jsx("div",{className:"scm-empty",children:t.status==="open"?i("scmLoading"):i("scmConnecting")}):w.length===0?e.jsx("div",{className:"scm-empty",children:i("scmNoHistory")}):w.map(j=>e.jsxs("button",{type:"button",className:`scm-commit ${(E==null?void 0:E.hash)===j.hash?"active":""}`,onClick:()=>xe(j),title:j.hash,children:[e.jsx("span",{className:"scm-commit-graph","aria-hidden":"true",children:j.graph||"* "}),e.jsxs("span",{className:"scm-commit-info",children:[e.jsx("span",{className:"scm-commit-subject",children:j.subject}),e.jsxs("span",{className:"scm-commit-meta",children:[j.shortHash," · ",j.author," · ",j.date]}),j.decorations&&e.jsx("span",{className:"scm-commit-refs",children:j.decorations})]})]},j.hash))})]}):e.jsxs("div",{className:"scm-files",children:[e.jsxs("div",{className:"scm-files-header",children:[e.jsx("span",{children:i("scmChanges")}),n&&n.files.length>0&&e.jsx("span",{className:"scm-files-count",children:n.files.length})]}),e.jsx("div",{className:"scm-files-list",children:z?e.jsx("div",{className:"scm-empty",children:i("scmNotGitRepo")}):n?n.files.length===0?e.jsx("div",{className:"scm-empty",children:i("scmNoChanges")}):n.files.map(j=>{const K=dr(j),V=x.get(j.path);return e.jsxs("div",{className:`scm-file ${(b==null?void 0:b.path)===j.path?"active":""}`,title:N[K],onClick:()=>se(j),children:[e.jsx("span",{className:`scm-file-xy ${K==="untracked"?"q":"x"}`,children:j.x!==" "?j.x:" "}),e.jsx("span",{className:`scm-file-xy ${K==="untracked"?"q":"y"}`,children:j.y!==" "?j.y:" "}),e.jsx("span",{className:"scm-file-path",children:j.path}),V&&(V.add>0||V.del>0)&&e.jsxs("span",{className:"scm-file-stat",children:[V.add>0&&e.jsxs("span",{className:"add",children:["+",V.add]}),V.del>0&&e.jsxs("span",{className:"del",children:["-",V.del]})]}),e.jsxs("span",{className:"scm-file-actions",children:[(j.y!==" "||K==="untracked")&&e.jsx("button",{type:"button",className:"scm-act",title:i("scmStageTip",{path:j.path}),onClick:ye=>{ye.stopPropagation(),pe(j)},children:"+"}),K==="staged"||K==="both"?e.jsx("button",{type:"button",className:"scm-act",title:i("scmUnstageTip",{path:j.path}),onClick:ye=>{ye.stopPropagation(),Te(j)},children:"−"}):null]})]},j.path)}):e.jsx("div",{className:"scm-empty",children:t.status==="open"?i("scmLoading"):i("scmConnecting")})})]}),e.jsxs("div",{className:"scm-diff",children:[e.jsxs("div",{className:"scm-diff-header",children:[e.jsx("span",{children:M==="history"?E?`${E.shortHash} ${E.subject}`:i("scmCommitDetail"):b?b.path:i("scmDiff")}),(M==="history"?S:ee)&&e.jsx("span",{className:"scm-diff-loading",children:i("scmLoading")})]}),e.jsx("div",{className:"scm-diff-body",children:M==="history"?e.jsxs(e.Fragment,{children:[X&&e.jsx("div",{className:"scm-error",children:X}),!E&&!X&&e.jsx("div",{className:"scm-empty",children:i("scmSelectCommitHint")}),E&&S&&!X&&e.jsx("div",{className:"scm-empty",children:i("scmLoading")}),E&&!S&&!X&&D?_(D):null]}):e.jsxs(e.Fragment,{children:[X&&e.jsx("div",{className:"scm-error",children:X}),!b&&!X&&e.jsx("div",{className:"scm-empty",children:i("scmSelectFileHint")}),b&&!T&&!X&&e.jsx("div",{className:"scm-empty",children:i("scmLoading")}),b&&T&&T.untracked&&e.jsx("div",{className:"scm-empty",children:i("scmUntrackedNote")}),b&&T&&!T.untracked&&e.jsxs(e.Fragment,{children:[T.staged&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"scm-diff-section",children:i("scmStaged")}),_(T.staged)]}),T.worktree&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"scm-diff-section",children:i("scmUnstaged")}),_(T.worktree)]}),!T.staged&&!T.worktree&&e.jsx("div",{className:"scm-empty",children:i("scmNoDiff")})]})]})})]})]}),e.jsxs("div",{className:"scm-hint",children:[e.jsx(qe,{}),e.jsx("span",{children:i("scmRunsInTerminal")}),e.jsx("button",{type:"button",className:"scm-goto-term",onClick:c,children:i("scmViewTerminal")})]})]})}function mr({entry:t,send:s}){const a=r.useRef(null);return r.useEffect(()=>{const l=a.current;if(!l)return;let c;try{c=t.module.mount(l,Ba(t.info.id,i=>s(i)))}catch(i){console.error(`[plugin:${t.info.id}] mount failed:`,i),l.textContent=`插件 ${t.info.name} 挂载失败`}return()=>{if(typeof c=="function")try{c()}catch(i){console.error(`[plugin:${t.info.id}] cleanup failed:`,i)}l.textContent=""}},[t,s]),e.jsx("div",{className:"plugin-view",ref:a})}function pr({send:t,piConfigured:s,piAgentInstalled:a,providers:l,installResult:c,onClose:i}){const n=me(),[o,d]=r.useState(!1),[u,h]=r.useState(""),[m,x]=r.useState(""),[C,M]=r.useState(!1);r.useEffect(()=>{t({type:"list_providers"})},[t]),r.useEffect(()=>{s&&i()},[s,i]),r.useEffect(()=>{c&&d(!1)},[c]),r.useEffect(()=>{var D;!u&&l.length>0&&h(((D=l.find(A=>!A.configured))==null?void 0:D.id)??l[0].id)},[l,u]);const R=()=>{o||(d(!0),t({type:"install_pi_agent"}))},w=()=>{!m.trim()||C||(M(!0),t({type:"set_provider_api_key",provider:u.trim(),apiKey:m.trim()}),setTimeout(()=>M(!1),3e3))},I=()=>{t({type:"get_state"}),t({type:"list_providers"})},E=l.find(D=>D.id===u),P=c!==null&&!c.ok;return e.jsx("div",{className:"modal-backdrop",children:e.jsxs("div",{className:"modal setup-modal",children:[e.jsx("button",{type:"button",className:"modal-close","aria-label":n("close"),onClick:i,children:e.jsx(we,{})}),e.jsxs("div",{className:"modal-head",children:[e.jsx(tt,{className:"modal-head-icon"}),e.jsx("h2",{children:n("setupTitle")})]}),e.jsx("p",{className:"modal-desc",children:n("setupDesc")}),P?e.jsxs("div",{className:"setup-failed",children:[e.jsx("div",{className:"setup-done",children:n("installFailed")}),e.jsx("pre",{className:"setup-detail",children:c.detail}),e.jsxs("div",{className:"setup-actions",children:[e.jsx("button",{type:"button",className:"btn primary",disabled:o,onClick:R,children:n("retryInstall")}),e.jsx("button",{type:"button",className:"btn",onClick:i,children:n("skip")})]})]}):a||c!=null&&c.ok?e.jsxs("div",{className:"setup-key-form",children:[e.jsx("div",{className:"setup-done",children:c!=null&&c.ok?n("installDone"):n("cliReadyHint")}),e.jsxs("label",{className:"field",children:[e.jsx("span",{className:"field-label",children:n("provider")}),e.jsxs("select",{value:u,onChange:D=>h(D.target.value),children:[l.length===0&&e.jsx("option",{value:"",children:n("loading")}),l.map(D=>e.jsxs("option",{value:D.id,children:[D.name,"(",D.id,")",D.configured?` · ${n("configured")}`:""]},D.id))]}),(E==null?void 0:E.configured)&&e.jsx("div",{className:"field-hint",children:n("providerKeyReady")})]}),e.jsxs("label",{className:"field",children:[e.jsx("span",{className:"field-label",children:n("apiKey")}),e.jsx("input",{type:"password",value:m,onChange:D=>x(D.target.value),placeholder:"sk-…"})]}),e.jsxs("div",{className:"setup-actions",children:[e.jsx("button",{type:"button",className:"btn primary",disabled:!m.trim()||C||!u,onClick:w,children:n(C?"saving":"saveAndStart")}),e.jsxs("button",{type:"button",className:"btn",onClick:I,children:[e.jsx(ft,{})," ",n("recheck")]})]})]}):e.jsxs("div",{className:"setup-actions",children:[e.jsx("button",{type:"button",className:"btn primary",disabled:o,onClick:R,children:n(o?"installing":"autoInstall")}),e.jsx("button",{type:"button",className:"btn",onClick:i,children:n("skip")})]})]})})}const hr=["openai-completions","openai-responses","anthropic-messages","google-generative-ai"],Ot=()=>({id:"",name:"",reasoning:!1,input:"text",contextWindow:"",maxTokens:""}),gr=()=>({providerId:"",name:"",api:"openai-completions",baseUrl:"",apiKey:"",authHeader:!0,models:[Ot()]});function Ss(t){return{providerId:t.providerId,name:t.name??"",api:t.api??"openai-completions",baseUrl:t.baseUrl??"",apiKey:t.apiKey??"",authHeader:t.authHeader??!1,models:(t.models.length?t.models:[Ot()]).map(s=>{var a;return{id:s.id,name:s.name??"",reasoning:s.reasoning??!1,input:(a=s.input)!=null&&a.includes("image")?"text-image":"text",contextWindow:s.contextWindow?String(s.contextWindow):"",maxTokens:s.maxTokens?String(s.maxTokens):""}})}}function fr({send:t,providers:s,providerStatus:a,fetchModelsResult:l,refreshProviderResult:c,cloneProviderResult:i,onClose:n}){const o=me(),[d,u]=r.useState(null),[h,m]=r.useState({}),[x,C]=r.useState(null),[M,R]=r.useState({}),[w,I]=r.useState(!1),[E,P]=r.useState(0),[D,A]=r.useState(null),S=r.useRef(0),[y,b]=r.useState({});r.useRef(0);const f=r.useRef(0),[T,J]=r.useState(null),ee=r.useRef(0),ie=r.useRef(0);r.useEffect(()=>{t({type:"list_models_config"}),t({type:"list_providers"})},[t]);const Q=()=>{if(!d)return;const k=d.baseUrl.trim();if(!k){A({ok:!1,text:o("fetchModelsNeedBaseUrl")});return}if(w)return;I(!0),A(null);const U=E+1;P(U),t({type:"fetch_models",reqId:U,baseUrl:k,apiKey:d.apiKey.trim()||void 0,authHeader:d.authHeader,api:d.api})};r.useEffect(()=>{var k;if(!(!l||l.reqId===S.current))if(S.current=l.reqId,I(!1),l.ok&&((k=l.models)!=null&&k.length)){const U=l.models;u(te=>{if(!te)return te;const de=te.models.map(G=>{var g;if(!G.id.trim())return G;const le=U.find(p=>p.id===G.id.trim());if(!le)return G;const ue={...G};return!ue.name&&le.name&&(ue.name=le.name),!ue.contextWindow&&le.contextWindow&&(ue.contextWindow=String(le.contextWindow)),!ue.maxTokens&&le.maxTokens&&(ue.maxTokens=String(le.maxTokens)),ue.input==="text"&&((g=le.input)!=null&&g.includes("image"))&&(ue.input="text-image"),!ue.reasoning&&le.reasoning&&(ue.reasoning=!0),ue}),F=new Set(de.map(G=>G.id.trim()).filter(Boolean)),Y=U.filter(G=>!F.has(G.id)).map(G=>{var le;return{id:G.id,name:G.name??"",reasoning:G.reasoning??!1,input:(le=G.input)!=null&&le.includes("image")?"text-image":"text",contextWindow:G.contextWindow?String(G.contextWindow):"",maxTokens:G.maxTokens?String(G.maxTokens):""}}),Z=[...de,...Y];return Z.some(G=>G.id.trim())?{...te,models:Z.filter(G=>G.id.trim())}:te}),A({ok:!0,text:o("fetchModelsOk",{n:U.length})})}else A({ok:!1,text:l.error||o("fetchModelsEmpty")})},[l]);const v=k=>{const U=(h[k.id]??"").trim();!U||x||(C(k.id),t({type:"set_provider_api_key",provider:k.id,apiKey:U}),setTimeout(()=>{C(null),m(te=>({...te,[k.id]:""})),R(te=>({...te,[k.id]:!1})),t({type:"list_providers"})},1500))},W=()=>{if(!d)return;const k=d.providerId.trim(),U=d.models.filter(de=>de.id.trim()).map(de=>({id:de.id.trim(),name:de.name.trim()||void 0,reasoning:de.reasoning||void 0,input:de.input==="text-image"?["text","image"]:void 0,contextWindow:de.contextWindow?Number(de.contextWindow):void 0,maxTokens:de.maxTokens?Number(de.maxTokens):void 0})),te={providerId:k,name:d.name.trim()||void 0,api:d.api.trim()||void 0,baseUrl:d.baseUrl.trim()||void 0,apiKey:d.apiKey.trim()||void 0,authHeader:d.authHeader||void 0,models:U};t({type:"save_model_config",providerId:k,config:te}),n()};r.useEffect(()=>{!c||c.reqId===f.current||(f.current=c.reqId,b({}))},[c]);const $=k=>{if(T)return;J(k.id);const U=++ee.current+Date.now();t({type:"clone_provider",provider:k.id,reqId:U})};r.useEffect(()=>{!i||i.reqId===ie.current||(ie.current=i.reqId,J(null),i.ok&&i.config&&u(Ss({...i.config,apiKey:""})))},[i]);const X=k=>{window.confirm(o("clearKeyConfirm",{id:k}))&&t({type:"clear_provider_api_key",provider:k})},ce=k=>{window.confirm(o("deleteProviderConfirm",{id:k.providerId,n:k.models.length}))&&t({type:"delete_model_config",providerId:k.providerId})},z=(k,U)=>{d&&u({...d,models:d.models.map((te,de)=>de===k?{...te,...U}:te)})};return e.jsx("div",{className:"modal-backdrop",onClick:n,children:e.jsxs("div",{className:"modal model-modal",onClick:k=>k.stopPropagation(),children:[e.jsx("button",{type:"button",className:"modal-close","aria-label":o("close"),onClick:n,children:e.jsx(we,{})}),e.jsx("div",{className:"modal-head",children:e.jsx("h2",{children:o(d?"editProvider":"manageModelsTitle")})}),d?e.jsxs("div",{className:"provider-form",children:[e.jsxs("div",{className:"form-grid",children:[e.jsxs("label",{className:"field",children:[e.jsxs("span",{className:"field-label",children:[o("providerId")," ",e.jsx("em",{children:o("providerIdHint")})]}),e.jsx("input",{type:"text",value:d.providerId,disabled:s.some(k=>k.providerId===d.providerId),onChange:k=>u({...d,providerId:k.target.value}),placeholder:"my-proxy"})]}),e.jsxs("label",{className:"field",children:[e.jsx("span",{className:"field-label",children:o("displayName")}),e.jsx("input",{type:"text",value:d.name,onChange:k=>u({...d,name:k.target.value}),placeholder:o("displayNamePh")})]}),e.jsxs("label",{className:"field",children:[e.jsx("span",{className:"field-label",children:o("apiType")}),e.jsx("select",{value:d.api,onChange:k=>u({...d,api:k.target.value}),children:hr.map(k=>e.jsx("option",{value:k,children:k},k))})]}),e.jsxs("label",{className:"field",children:[e.jsxs("span",{className:"field-label",children:["baseUrl ",e.jsx("em",{children:o("baseUrlHint")})]}),e.jsx("input",{type:"text",value:d.baseUrl,onChange:k=>u({...d,baseUrl:k.target.value}),placeholder:"http://localhost:11434/v1"})]}),e.jsxs("label",{className:"field",children:[e.jsx("span",{className:"field-label",children:o("apiKey")}),e.jsx("input",{type:"password",value:d.apiKey,onChange:k=>u({...d,apiKey:k.target.value}),placeholder:o("apiKeyHint")})]}),e.jsxs("label",{className:"field check",children:[e.jsx("input",{type:"checkbox",checked:d.authHeader,onChange:k=>u({...d,authHeader:k.target.checked})}),e.jsx("span",{children:o("authHeader")})]})]}),e.jsxs("div",{className:"model-section-head",children:[e.jsx("span",{className:"form-section-title",children:o("modelsTitle")}),e.jsxs("span",{className:"model-section-actions",children:[D&&e.jsx("span",{className:`fetch-msg ${D.ok?"ok":"err"}`,title:D.text,children:D.text}),e.jsxs("button",{type:"button",className:"btn sm",disabled:w||!d.baseUrl.trim(),title:o("fetchModelsHint"),onClick:Q,children:[e.jsx(_s,{})," ",o(w?"fetchingModels":"fetchModels")]})]})]}),d.models.map((k,U)=>e.jsxs("div",{className:"model-row",children:[e.jsx("input",{type:"text",value:k.id,onChange:te=>z(U,{id:te.target.value}),placeholder:o("modelIdReq")}),e.jsx("input",{type:"text",value:k.name,onChange:te=>z(U,{name:te.target.value}),placeholder:o("displayName")}),e.jsxs("select",{value:k.input,onChange:te=>z(U,{input:te.target.value}),children:[e.jsx("option",{value:"text",children:o("text")}),e.jsx("option",{value:"text-image",children:o("textImage")})]}),e.jsxs("label",{className:"check",children:[e.jsx("input",{type:"checkbox",checked:k.reasoning,onChange:te=>z(U,{reasoning:te.target.checked})}),e.jsx("span",{children:o("reasoning")})]}),e.jsx("input",{type:"number",value:k.contextWindow,onChange:te=>z(U,{contextWindow:te.target.value}),placeholder:o("contextWindow"),title:"contextWindow"}),e.jsx("input",{type:"number",value:k.maxTokens,onChange:te=>z(U,{maxTokens:te.target.value}),placeholder:o("maxOutput"),title:"maxTokens"}),e.jsx("button",{type:"button",className:"iconbtn danger",title:o("removeModel"),onClick:()=>u({...d,models:d.models.filter((te,de)=>de!==U)}),children:e.jsx(_e,{})})]},U)),e.jsxs("button",{type:"button",className:"btn",onClick:()=>u({...d,models:[...d.models,Ot()]}),children:[e.jsx(ze,{})," ",o("addModel")]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:()=>u(null),children:o("cancel")}),e.jsx("button",{type:"button",className:"btn primary",disabled:!d.providerId.trim()||!d.models.some(k=>k.id.trim()),onClick:W,children:o("save")})]})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"form-section-title",children:[o("builtinProviders")," ",e.jsx("em",{className:"section-hint",children:o("hintKeyOnly")})]}),e.jsxs("div",{className:"provider-list",children:[a.length===0&&e.jsx("div",{className:"dd-loading",children:o("loading")}),a.map(k=>e.jsxs("div",{className:"provider-row",children:[e.jsxs("div",{className:"provider-info",children:[e.jsx("span",{className:"provider-name",children:k.name}),e.jsxs("span",{className:"provider-sub",children:[k.id,k.configured&&e.jsx("span",{className:"auth-badge",children:o("configuredBadge")}),k.source&&!k.configured&&e.jsx("span",{className:"auth-badge dim",children:k.source})]})]}),e.jsxs("div",{className:"provider-actions",children:[k.configured&&!M[k.id]?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"auth-badge",children:o("keyReady")}),e.jsxs("button",{type:"button",className:"btn sm",title:o("replaceKeyTitle"),onClick:()=>R(U=>({...U,[k.id]:!0})),children:[e.jsx(Mt,{})," ",o("replaceKey")]}),k.source==="stored"&&e.jsxs("button",{type:"button",className:"btn sm danger",title:o("clearKeyTitle"),onClick:()=>X(k.id),children:[e.jsx(_e,{})," ",o("clearKey")]})]}):e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"password",className:"key-input",placeholder:o("pasteKey"),value:h[k.id]??"",onChange:U=>m(te=>({...te,[k.id]:U.target.value}))}),e.jsxs("button",{type:"button",className:"btn primary sm",disabled:!(h[k.id]??"").trim()||x===k.id,onClick:()=>v(k),children:[e.jsx(ra,{})," ",x===k.id?o("savingKey"):o("saveKey")]})]}),e.jsxs("button",{type:"button",className:"btn sm",disabled:T!==null,title:o("cloneProviderTitle"),onClick:()=>$(k),children:[e.jsx(Dt,{})," ",T===k.id?o("cloning"):o("cloneProvider")]})]})]},k.id))]}),e.jsx("div",{className:"form-section-title",children:o("customProviders")}),e.jsx("p",{className:"modal-desc",children:o("customDesc")}),s.length===0&&e.jsx("div",{className:"dd-loading",children:o("noCustomProviders")}),e.jsx("div",{className:"provider-list",children:s.map(k=>e.jsxs("div",{className:"provider-row",children:[e.jsxs("div",{className:"provider-info",children:[e.jsx("span",{className:"provider-name",children:k.providerId}),e.jsxs("span",{className:"provider-sub",children:[k.api??"—",k.baseUrl?` · ${k.baseUrl}`:"",k.models.length>0&&` · ${o("modelsCount",{n:k.models.length})}`]})]}),e.jsxs("div",{className:"provider-actions",children:[e.jsx("button",{type:"button",className:"iconbtn",title:o("edit"),onClick:()=>u(Ss(k)),children:e.jsx(Mt,{})}),e.jsx("button",{type:"button",className:"iconbtn danger",title:o("delete"),onClick:()=>ce(k),children:e.jsx(_e,{})})]})]},k.providerId))}),e.jsx("div",{className:"modal-actions",children:e.jsxs("button",{type:"button",className:"btn primary",onClick:()=>u(gr()),children:[e.jsx(ze,{})," ",o("addProvider")]})})]})]})})}function xr({plugin:t,send:s}){const a=me(),l=t.settingsSchema??[],[c,i]=r.useState(()=>({...t.settingsValues??{}})),[n,o]=r.useState(!1);if(l.length===0)return null;const d=(x,C)=>i(M=>({...M,[x]:C})),u=l.some(x=>{var C;return c[x.key]!==((C=t.settingsValues)==null?void 0:C[x.key])}),h=()=>{o(!0),s({type:"plugin_settings",pluginId:t.id,values:c}),setTimeout(()=>o(!1),800)},m=()=>i({...t.settingsValues??{}});return e.jsxs("div",{className:"plugin-settings-form",children:[e.jsx("div",{className:"plugin-settings-fields",children:l.map(x=>e.jsxs("label",{className:"plugin-settings-field",title:x.hint,children:[e.jsx("span",{className:"plugin-settings-label",children:x.label}),x.type==="boolean"?e.jsx("input",{type:"checkbox",checked:!!c[x.key],onChange:C=>d(x.key,C.target.checked)}):x.type==="select"?e.jsx("select",{value:String(c[x.key]??""),onChange:C=>d(x.key,C.target.value),children:(x.options??[]).map(C=>e.jsx("option",{value:C,children:C},C))}):e.jsx("input",{type:x.type==="password"?"password":x.type==="number"?"number":"text",value:String(c[x.key]??""),min:x.min,max:x.max,onChange:C=>d(x.key,x.type==="number"?Number(C.target.value):C.target.value)})]},x.key))}),e.jsxs("div",{className:"plugin-settings-actions",children:[e.jsx("button",{type:"button",className:"btn plugin-settings-save",disabled:!u||n,onClick:h,children:a(n?"pluginSettingsSaving":"pluginSettingsSave")}),e.jsx("button",{type:"button",className:"btn plugin-settings-reset",onClick:m,children:a("pluginSettingsReset")})]})]})}function lt({text:t}){const s=r.useRef(null),[a,l]=r.useState(!1),c=()=>{var n;const i=(n=s.current)==null?void 0:n.getBoundingClientRect();i&&l(window.innerWidth-i.right<340)};return e.jsxs("span",{ref:s,className:`set-tip${a?" flip":""}`,tabIndex:0,"aria-label":t,onMouseEnter:c,onFocus:c,children:["?",e.jsx("span",{className:"set-tip-bubble",role:"tooltip",children:t})]})}function Me({title:t,subtitle:s,tip:a,enabled:l,onToggle:c,action:i}){const n=me();return e.jsxs("div",{className:"set-row",children:[e.jsxs("div",{className:"set-row-info",children:[e.jsxs("div",{className:"set-row-name",children:[t,a&&e.jsx(lt,{text:a})]}),s&&e.jsx("div",{className:"set-row-desc",children:s})]}),i,e.jsx("button",{type:"button",className:`set-switch ${l?"on":""}`,role:"switch","aria-checked":l,title:n(l?"settingsEnabled":"settingsDisabled"),onClick:c,children:e.jsx("span",{className:"set-switch-knob"})})]})}function vr({chat:t,send:s,terminal:a,onSwitchToTerminal:l,onClose:c}){const i=me(),n=t.settings,[o,d]=r.useState("prompt"),u=r.useRef(null);r.useEffect(()=>{var g;(g=u.current)==null||g.scrollTo({top:0})},[o]);const[h,m]=r.useState(""),[x,C]=r.useState("append"),M=r.useRef(!1),[R,w]=r.useState(""),[I,E]=r.useState("append"),P=r.useRef(!1),[D,A]=r.useState(""),S=r.useRef(!1),[y,b]=r.useState(""),[f,T]=r.useState(!1),[J,ee]=r.useState(null),[ie,Q]=r.useState(null);r.useEffect(()=>{n&&(C(n.promptMode),!M.current&&(m(x==="append"||n.customSystemPrompt?n.customSystemPrompt:n.defaultSystemPrompt||""),E(n.visionBridgePromptMode),!P.current&&(w(I==="append"||n.visionBridgePrompt?n.visionBridgePrompt:n.visionBridgeDefaultPrompt||""),S.current||A(n.reviewPrompt))))},[n,x,I]);const[v,W]=r.useState(String((n==null?void 0:n.terminalBashIdleMs)??15e3));if(r.useEffect(()=>{W(String((n==null?void 0:n.terminalBashIdleMs)??15e3))},[n==null?void 0:n.terminalBashIdleMs]),!n)return null;const $=[{id:"prompt",icon:e.jsx($s,{}),label:i("settingsSystemPrompt")},{id:"terminal",icon:e.jsx(qe,{}),label:i("settingsTerminalTools")},{id:"display",icon:e.jsx(Ke,{}),label:i("settingsMessageDisplay")},{id:"skills",icon:e.jsx(tt,{}),label:i("settingsSkills"),count:n.skills.length},{id:"extensions",icon:e.jsx(ss,{}),label:i("settingsExtensions"),count:n.extensions.length},{id:"plugins",icon:e.jsx(ns,{}),label:i("settingsUiPlugins"),count:t.plugins.length},{id:"review",icon:e.jsx(it,{}),label:i("settingsReview"),count:n.reviewSkills.length},{id:"vision",icon:e.jsx(Tt,{}),label:i("settingsVisionBridge")},{id:"presets",icon:e.jsx(Xn,{}),label:i("settingsPresets"),count:n.presets.length}],X=new Set(n.disabledSkills),ce=new Set(n.disabledExtensions),z=g=>s({type:"set_settings",...g}),k=g=>{const p=new Set(X);p.has(g.name)?p.delete(g.name):p.add(g.name),z({disabledSkills:[...p]})},U=new Set(n.disabledPlugins??[]),te=g=>{const p=new Set(U);p.has(g.id)?p.delete(g.id):p.add(g.id),z({disabledPlugins:[...p]})},de=g=>{const p=new Set(ce);p.has(g.id)?p.delete(g.id):p.add(g.id),z({disabledExtensions:[...p]})},F=(g,p)=>{var se,xe;const B={name:g,command:p,cwd:"${pwd}"},oe=t.terminals.find(O=>O.title===g);oe?(a.restart(oe.id),s({type:"run_command",terminalId:oe.id,conversationId:oe.conversationId,command:B,cols:80,rows:24})):a.create({id:Ge(),conversationId:t.activeConversationId||((se=t.state)==null?void 0:se.conversationId)||"",title:g,cwd:((xe=t.state)==null?void 0:xe.cwd)??"",cols:80,rows:24,running:!0,exitCode:null,command:B}),l(),c()},Y=g=>{ee(null),F(`${i("uninstallTitle")} ${g}`,`pi remove npm:${g}`)},Z=g=>{Q(null),F(`${i("uninstallTitle")} ${g}`,`pi-web-ui uninstall ${g}`)},G=(g,p)=>{F(`${i("pluginUpdate")} ${g}`,`pi-web-ui install ${p} --name ${g} --force`)},le=g=>{const p=new Set(n.reviewSkills.filter(B=>!B.enabled).map(B=>B.name));p.has(g.name)?p.delete(g.name):p.add(g.name),z({reviewDisabledSkills:[...p]})},ue=()=>{const g=x==="replace"&&n.defaultSystemPrompt&&h===n.defaultSystemPrompt?"":h;z({promptMode:x,customSystemPrompt:g})};return e.jsx("div",{className:"modal-backdrop",onClick:c,children:e.jsxs("div",{className:"modal settings-modal",onClick:g=>g.stopPropagation(),children:[e.jsx("button",{type:"button",className:"modal-close","aria-label":i("close"),onClick:c,children:e.jsx(we,{})}),e.jsxs("div",{className:"modal-head",children:[e.jsx(ut,{className:"modal-head-icon"}),e.jsx("h2",{children:i("settingsTitle")}),e.jsx(lt,{text:i("settingsDesc")})]}),e.jsxs("div",{className:"settings-layout",children:[e.jsx("nav",{className:"settings-rail","aria-label":i("settingsTitle"),children:$.map(g=>e.jsxs("button",{type:"button",className:`settings-tab${o===g.id?" active":""}`,"aria-current":o===g.id?"true":void 0,title:g.label,onClick:()=>d(g.id),children:[e.jsx("span",{className:"settings-tab-icon",children:g.icon}),e.jsx("span",{className:"settings-tab-label",children:g.label}),g.count!==void 0&&e.jsx("span",{className:"set-count",children:g.count})]},g.id))}),e.jsxs("div",{className:"modal-body",ref:u,children:[o==="prompt"&&e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(it,{className:"set-section-icon"}),i("settingsSystemPrompt")]}),e.jsxs("div",{className:"set-mode-row",children:[e.jsx("label",{className:"set-field-label",children:i("settingsPromptMode")}),e.jsxs("select",{className:"set-select",value:x,onChange:g=>{const p=g.target.value;C(p),z({promptMode:p})},children:[e.jsx("option",{value:"append",children:i("promptModeAppend")}),e.jsx("option",{value:"replace",children:i("promptModeReplace")})]}),e.jsx(lt,{text:i(x==="append"?"promptAppendHint":"promptReplaceHint")})]}),e.jsx("textarea",{className:"set-prompt-input",rows:6,placeholder:i("promptPlaceholder"),value:h,onFocus:()=>M.current=!0,onBlur:()=>{M.current=!1,ue()},onChange:g=>m(g.target.value)}),e.jsxs("button",{type:"button",className:"set-view-prompt-btn","aria-expanded":f,onClick:()=>T(g=>!g),children:[i("settingsViewPrompt")," ",f?"▴":"▾"]}),f&&e.jsxs("div",{className:"set-prompt-view",children:[e.jsxs("div",{className:"set-prompt-view-head",children:[e.jsx("span",{children:i("settingsViewPromptHint")}),e.jsx(ht,{text:n.effectiveSystemPrompt})]}),n.effectiveSystemPrompt?e.jsx("pre",{className:"set-prompt-view-text",children:n.effectiveSystemPrompt}):e.jsx("p",{className:"set-empty",children:i("settingsViewPromptEmpty")})]})]}),o==="terminal"&&e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(qe,{className:"set-section-icon"}),i("settingsTerminalTools")]}),e.jsx(Me,{title:i("terminalToolsEnabled"),tip:i("settingsTerminalToolsDesc"),enabled:n.terminalToolsEnabled,onToggle:()=>z({terminalToolsEnabled:!n.terminalToolsEnabled})}),!n.terminalToolsEnabled&&e.jsx("p",{className:"set-hint",children:i("terminalToolsOffHint")}),e.jsx(Me,{title:i("terminalBashTakeover"),tip:i("terminalBashTakeoverDesc"),enabled:n.terminalBash,onToggle:()=>z({terminalBash:!n.terminalBash})}),n.terminalBash&&e.jsxs("div",{className:"set-field",children:[e.jsx("label",{className:"set-field-label",htmlFor:"tb-idle-ms",children:i("terminalBashIdleMs")}),e.jsx("input",{id:"tb-idle-ms",className:"set-input",type:"number",min:0,step:1e3,value:v,onChange:g=>W(g.target.value),onBlur:()=>{const g=Math.max(0,Math.floor(Number(v)||0));W(String(g)),g!==n.terminalBashIdleMs&&z({terminalBashIdleMs:g})}})]})]}),o==="display"&&e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(Ke,{className:"set-section-icon"}),i("settingsMessageDisplay")]}),e.jsx(Me,{title:i("thinkingWrap"),tip:i("thinkingWrapDesc"),enabled:n.thinkingWrap??!0,onToggle:()=>z({thinkingWrap:!(n.thinkingWrap??!0)})}),e.jsx(Me,{title:i("toolsWrap"),tip:i("toolsWrapDesc"),enabled:n.toolsWrap??!0,onToggle:()=>z({toolsWrap:!(n.toolsWrap??!0)})})]}),o==="skills"&&e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(tt,{className:"set-section-icon"}),i("settingsSkills"),e.jsx("span",{className:"set-count",children:n.skills.length})]}),n.skills.length===0?e.jsx("p",{className:"set-empty",children:i("noSkills")}):e.jsx("div",{className:"set-list",children:n.skills.map(g=>e.jsx(Me,{title:g.name,subtitle:g.description,enabled:g.enabled,onToggle:()=>k(g)},g.name))})]}),o==="extensions"&&e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(ss,{className:"set-section-icon"}),i("settingsExtensions"),e.jsx("span",{className:"set-count",children:n.extensions.length})]}),n.extensions.length===0?e.jsx("p",{className:"set-empty",children:i("noExtensions")}):e.jsx("div",{className:"set-list",children:n.extensions.map(g=>{const p=g.id.startsWith("npm:")?g.id.slice(4):null;return e.jsx(Me,{title:g.name,subtitle:g.path,enabled:g.enabled,onToggle:()=>de(g),action:p?J===g.id?e.jsx("button",{type:"button",className:"set-uninstall confirm",title:i("uninstallConfirmHint"),onClick:()=>Y(p),children:i("uninstallConfirm")}):e.jsxs("button",{type:"button",className:"set-uninstall",title:i("uninstallHint"),onClick:()=>ee(g.id),children:[e.jsx(_e,{}),i("uninstallExt")]}):void 0},g.id)})})]}),o==="plugins"&&e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(ns,{className:"set-section-icon"}),i("settingsUiPlugins"),e.jsx("span",{className:"set-count",children:t.plugins.length})]}),t.plugins.length===0?e.jsx("p",{className:"set-empty",children:i("noUiPlugins")}):e.jsx("div",{className:"set-list",children:t.plugins.map(g=>{var p;return e.jsxs(e.Fragment,{children:[e.jsx(Me,{title:`${g.icon?`${g.icon} `:""}${g.name}`,subtitle:(g.error?`${g.id} · ${g.error}`:g.source?`${g.id} · ${g.source}`:`${g.id} · ${i("uiPluginNoSource")}`)+((p=g.permissions)!=null&&p.length?` · ${i("uiPluginPerms")}: ${g.permissions.join(", ")}`:""),enabled:!U.has(g.id)&&!g.error,onToggle:()=>!g.error&&te(g),action:e.jsxs("div",{className:"set-row-actions",children:[g.source&&e.jsxs("button",{type:"button",className:"set-uninstall",title:i("pluginUpdateHint"),onClick:()=>G(g.id,g.source),children:[e.jsx(ft,{}),i("pluginUpdate")]}),ie===g.id?e.jsx("button",{type:"button",className:"set-uninstall confirm",title:i("pluginUninstallHint"),onClick:()=>Z(g.id),children:i("uninstallConfirm")}):e.jsxs("button",{type:"button",className:"set-uninstall",title:i("pluginUninstallHint"),onClick:()=>Q(g.id),children:[e.jsx(_e,{}),i("uninstallExt")]})]})},g.id),g.settingsSchema&&g.settingsSchema.length>0&&e.jsx(xr,{plugin:g,send:s})]})})})]}),o==="review"&&e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(it,{className:"set-section-icon"}),i("settingsReview"),e.jsx(lt,{text:i("settingsReviewDesc")}),e.jsx("span",{className:"set-count",children:n.reviewSkills.length})]}),e.jsx("textarea",{className:"set-prompt-input",rows:5,placeholder:i("reviewPromptPlaceholder"),value:D,onFocus:()=>S.current=!0,onBlur:()=>{S.current=!1,z({reviewPrompt:D})},onChange:g=>A(g.target.value)}),e.jsx("div",{className:"set-field-label",children:i("settingsReviewSkills")}),n.reviewSkills.length===0?e.jsx("p",{className:"set-empty",children:i("noSkills")}):e.jsx("div",{className:"set-list",children:n.reviewSkills.map(g=>e.jsx(Me,{title:g.name,subtitle:g.description,enabled:g.enabled,onToggle:()=>le(g)},`review-${g.name}`))})]}),o==="vision"&&e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(Tt,{className:"set-section-icon"}),i("settingsVisionBridge")]}),e.jsx(Me,{title:i("visionBridgeEnabled"),tip:i("settingsVisionBridgeDesc"),enabled:n.visionBridgeEnabled,onToggle:()=>z({visionBridgeEnabled:!n.visionBridgeEnabled})}),!n.visionBridgeEnabled&&e.jsx("p",{className:"set-hint",children:i("visionBridgeOffHint")}),n.visionBridgeEnabled&&e.jsxs("div",{className:"set-mode-row",children:[e.jsx("label",{className:"set-field-label",children:i("visionBridgeModel")}),e.jsxs("select",{className:"set-select",value:n.visionBridgeModel??"",onChange:g=>z({visionBridgeModel:g.target.value||null}),children:[e.jsx("option",{value:"",children:i("visionBridgeAuto")}),n.visionModels.map(g=>e.jsx("option",{value:`${g.provider}/${g.id}`,children:g.label},`${g.provider}/${g.id}`))]})]}),n.visionBridgeEnabled&&e.jsxs("div",{className:"set-mode-row",children:[e.jsx("label",{className:"set-field-label",children:i("visionBridgePromptMode")}),e.jsxs("select",{className:"set-select",value:I,onChange:g=>{const p=g.target.value;E(p),z({visionBridgePromptMode:p})},children:[e.jsx("option",{value:"append",children:i("promptModeAppend")}),e.jsx("option",{value:"replace",children:i("promptModeReplace")})]})]}),n.visionBridgeEnabled&&e.jsx("textarea",{className:"set-prompt-input",rows:4,placeholder:i("visionBridgePromptPlaceholder"),value:R,onFocus:()=>P.current=!0,onBlur:()=>{P.current=!1;const g=I==="replace"&&n.visionBridgeDefaultPrompt&&R===n.visionBridgeDefaultPrompt?"":R;z({visionBridgePromptMode:I,visionBridgePrompt:g})},onChange:g=>w(g.target.value)}),n.visionBridgeEnabled&&(n.visionModels.length===0?e.jsx("p",{className:"set-hint",children:i("visionBridgeNoModels")}):e.jsx("p",{className:"set-hint",children:i("visionBridgeCurrent",{model:n.visionBridgeModel??i("visionBridgeAuto")})}))]}),o==="presets"&&e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(ut,{className:"set-section-icon"}),i("settingsPresets"),e.jsx("span",{className:"set-count",children:n.presets.length})]}),e.jsxs("div",{className:"set-preset-save",children:[e.jsx("input",{className:"set-input",placeholder:i("presetNamePlaceholder"),value:y,onChange:g=>b(g.target.value),onKeyDown:g=>{g.key==="Enter"&&y.trim()&&(s({type:"save_preset",name:y.trim()}),b(""))}}),e.jsxs("button",{type:"button",className:"set-save-btn",disabled:!y.trim(),onClick:()=>{s({type:"save_preset",name:y.trim()}),b("")},children:[e.jsx(ze,{})," ",i("saveAsPreset")]})]}),n.presets.length===0?e.jsx("p",{className:"set-empty",children:i("noPresets")}):e.jsx("div",{className:"set-list",children:n.presets.map(g=>e.jsxs("div",{className:"set-row",children:[e.jsxs("div",{className:"set-row-info",children:[e.jsx("div",{className:"set-row-name",children:g.name}),e.jsxs("div",{className:"set-row-desc",children:[g.promptMode==="replace"?i("promptModeReplace"):i("promptModeAppend"),g.disabledSkills.length>0&&` · ${i("settingsSkills")} ${g.disabledSkills.length}`,g.disabledExtensions.length>0&&` · ${i("settingsExtensions")} ${g.disabledExtensions.length}`]})]}),e.jsxs("div",{className:"set-row-actions",children:[e.jsx("button",{type:"button",className:"dd-refresh",onClick:()=>s({type:"apply_preset",name:g.name}),children:i("applyPreset")}),e.jsx("button",{type:"button",className:"set-icon-btn danger",title:i("deletePreset"),onClick:()=>s({type:"delete_preset",name:g.name}),children:e.jsx(_e,{})})]})]},g.name))})]})]})]}),e.jsx("div",{className:"modal-actions",children:e.jsx("button",{type:"button",className:"dd-refresh",onClick:c,children:i("close")})})]})})}function yr(t,s){const a=Math.max(0,Date.now()-t),l=Math.floor(a/6e4);if(l<1)return s("bgTaskJustNow");if(l<60)return s("bgTaskMinutes",{n:l});const c=Math.floor(l/60);return c<24?s("bgTaskHours",{n:c}):s("bgTaskDays",{n:Math.floor(c/24)})}function jr({servers:t,send:s,onClose:a}){const l=me(),[c,i]=r.useState(new Set),n=o=>i(d=>{const u=new Set(d);return u.has(o)?u.delete(o):u.add(o),u});return r.useEffect(()=>{s({type:"list_bg_servers"})},[]),e.jsx("div",{className:"modal-backdrop",onClick:a,children:e.jsxs("div",{className:"bg-task-modal",onClick:o=>o.stopPropagation(),children:[e.jsxs("div",{className:"bg-task-head",children:[e.jsxs("span",{className:"bg-task-title",children:[e.jsx(pt,{})," ",l("bgTasks"),t.length>0&&e.jsx("em",{className:"bg-task-count",children:t.length})]}),e.jsx("button",{type:"button",className:"btn",title:l("close"),onClick:a,children:e.jsx(we,{})})]}),t.length===0?e.jsxs("div",{className:"bg-task-empty",children:[e.jsx(pt,{}),e.jsx("span",{children:l("bgTasksEmpty")}),e.jsx("small",{children:l("bgTasksDesc")})]}):e.jsx("ul",{className:"bg-task-list",children:t.map(o=>{const d=!!o.taskId,u=o.taskId??String(o.port);return e.jsxs("li",{className:"bg-task-item",children:[e.jsx("span",{className:"bg-task-icon",title:d?o.plugin:l("bgTaskPort")}),e.jsxs("div",{className:"bg-task-info",children:[e.jsxs("div",{className:"bg-task-line1",children:[d?e.jsxs("span",{className:"bg-task-port",title:o.taskId,children:["🧩 ",o.plugin]}):e.jsxs("span",{className:"bg-task-port",children:[":",o.port]}),o.name&&e.jsx("span",{className:"bg-task-name",children:o.name})]}),e.jsxs("div",{className:"bg-task-line2",children:[!d&&e.jsxs("span",{children:[l("bgTaskPid")," ",o.pid]}),e.jsxs("span",{children:[l("bgTaskSince")," ",yr(o.since,l)]}),d&&o.status&&e.jsx("span",{className:"bg-task-status",children:o.status})]}),o.command&&e.jsxs("button",{type:"button",className:`bg-task-cmd ${c.has(u)?"open":""}`,title:`${l("bgTaskCommand")}: ${o.command}`,onClick:()=>n(u),children:[e.jsx(qe,{}),e.jsx("code",{children:o.command})]})]}),e.jsxs("button",{type:"button",className:"btn bg-task-stop",title:l("bgTaskStop"),onClick:()=>s(d?{type:"kill_background_server",taskId:o.taskId}:{type:"kill_background_server",port:o.port}),children:[e.jsx(dt,{}),e.jsx("span",{children:l("bgTaskStop")})]})]},u)})}),e.jsxs("div",{className:"bg-task-foot",children:[e.jsxs("button",{type:"button",className:"btn",title:l("bgTaskRefresh"),onClick:()=>s({type:"list_bg_servers"}),children:[e.jsx(ft,{}),e.jsx("span",{children:l("bgTaskRefresh")})]}),e.jsxs("button",{type:"button",className:"btn bg-task-stopall",disabled:t.length===0,title:l("bgTaskStopAll"),onClick:()=>s({type:"kill_background_servers"}),children:[e.jsx(dt,{}),e.jsx("span",{children:l("bgTaskStopAll")})]})]})]})})}function at(t,s){return t.toLowerCase().includes(s)}function br({send:t,sessions:s,projects:a,cwd:l,fileSearch:c,onClose:i,onSwitchSession:n,onSwitchProject:o,onPreviewFile:d}){const u=me(),h=r.useRef(null),[m,x]=r.useState(""),C=r.useDeferredValue(m),[M,R]=r.useState(0),w=r.useRef(1),I=r.useRef(0),E=r.useRef(null);r.useEffect(()=>{t({type:"list_sessions"}),t({type:"list_projects"}),requestAnimationFrame(()=>{var v;return(v=h.current)==null?void 0:v.focus()})},[]);const[P,D]=r.useState(!1);r.useEffect(()=>{E.current&&clearTimeout(E.current);const v=C.trim();if(v)return E.current=setTimeout(()=>{const W=++w.current;I.current=W,D(!0),t({type:"search_files",reqId:W,query:v})},300),()=>{E.current&&clearTimeout(E.current)}},[C]);const A=C.trim().toLowerCase(),S=r.useMemo(()=>A?s.filter(v=>at(v.firstMessage??"",A)||at(v.name??"",A)||at(v.path.split(/[\\/]/).pop()??"",A)).slice(0,20):[],[s,A]),y=r.useMemo(()=>A?a.filter(v=>at(v.path,A)).slice(0,10):[],[a,A]),b=r.useMemo(()=>!A||!c||c.reqId!==I.current||!c.ok?[]:c.results,[c,A]);r.useEffect(()=>{c&&c.reqId===I.current&&I.current!==0&&D(!1)},[c]);const f=!!c&&c.ok&&c.truncated,T=r.useMemo(()=>[...S.map(v=>({kind:"session",path:v.path})),...y.map(v=>({kind:"project",path:v.path})),...b.filter(v=>v.type==="file").map(v=>({kind:"file",path:v.path,name:v.name}))],[S,y,b]);r.useEffect(()=>{R(0)},[C]);const J=r.useCallback(v=>{v&&(v.kind==="session"?n(v.path):v.kind==="project"?o(v.path):d(v.path,v.name),i())},[n,o,d,i]);r.useEffect(()=>{const v=W=>{W.key==="Escape"?(W.preventDefault(),W.stopPropagation(),i()):W.key==="ArrowDown"?(W.preventDefault(),R($=>Math.min($+1,T.length-1))):W.key==="ArrowUp"?(W.preventDefault(),R($=>Math.max($-1,0))):W.key==="Enter"&&(W.preventDefault(),J(T[M]))};return window.addEventListener("keydown",v,!0),()=>window.removeEventListener("keydown",v,!0)},[T,M,J,i]);const ee=S.length+y.length+b.length,ie=(v,W,$)=>e.jsxs("div",{className:"gs-section-head",children:[$,e.jsx("span",{children:v}),e.jsx("em",{children:W})]});let Q=-1;return e.jsx("div",{className:"modal-backdrop gs-backdrop",onClick:i,children:e.jsxs("div",{className:"gs-modal",onClick:v=>v.stopPropagation(),children:[e.jsxs("div",{className:"gs-input-row",children:[e.jsx(mt,{}),e.jsx("input",{ref:h,type:"text",value:m,placeholder:u("gsPlaceholder"),onChange:v=>x(v.target.value)}),e.jsx("button",{type:"button",className:"gs-close",title:u("close"),onClick:i,children:e.jsx(we,{})})]}),e.jsxs("div",{className:"gs-results",children:[!A&&e.jsx("div",{className:"gs-empty",children:u("gsHint")}),A&&ee===0&&!f&&e.jsx("div",{className:"gs-empty",children:u(P?"gsSearching":"gsNoResults")}),S.length>0&&e.jsxs("div",{className:"gs-section",children:[ie(u("gsSessions"),S.length,e.jsx(Ke,{})),S.map(v=>{Q++;const W=Q;return e.jsxs("button",{type:"button",className:W===M?"gs-item active":"gs-item",onMouseEnter:()=>R(W),onClick:()=>J({kind:"session",path:v.path}),children:[e.jsxs("span",{className:"gs-item-title",children:[v.name||v.path.split(/[\\/]/).pop(),e.jsx("em",{className:"gs-item-meta",children:v.messageCount})]}),e.jsx("span",{className:"gs-item-sub",children:v.firstMessage})]},v.path)})]}),y.length>0&&e.jsxs("div",{className:"gs-section",children:[ie(u("gsProjects"),y.length,e.jsx(Ie,{})),y.map(v=>{Q++;const W=Q,$=l&&v.path===l;return e.jsxs("button",{type:"button",className:W===M?"gs-item active":"gs-item",onMouseEnter:()=>R(W),onClick:()=>J({kind:"project",path:v.path}),children:[e.jsxs("span",{className:"gs-item-title",children:[v.path.split(/[\\/]/).pop(),$&&e.jsx("em",{className:"gs-item-meta",children:u("gsCurrentProject")})]}),e.jsx("span",{className:"gs-item-sub",children:v.path})]},v.path)})]}),(b.length>0||A&&f)&&e.jsxs("div",{className:"gs-section",children:[ie(u("gsFiles"),b.length,e.jsx($s,{})),b.map(v=>{Q++;const W=Q;return e.jsxs("button",{type:"button",className:W===M?"gs-item active":"gs-item",disabled:v.type==="dir",title:v.type==="dir"?void 0:u("gsOpenPreview"),onMouseEnter:()=>R(W),onClick:()=>{v.type==="file"&&J({kind:"file",path:v.path,name:v.name})},children:[e.jsx("span",{className:"gs-item-title",children:v.name}),e.jsx("span",{className:"gs-item-sub",children:v.path})]},`${v.type}:${v.path}`)}),f&&e.jsx("div",{className:"gs-truncated",children:u("gsTruncated")})]})]}),e.jsxs("div",{className:"gs-foot",children:[e.jsxs("span",{children:["↑↓ ",u("gsNavigate")]}),e.jsxs("span",{children:["Enter ",u("gsOpen")]}),e.jsxs("span",{children:["Esc ",u("gsCloseHint")]})]})]})})}const wt=5e3;function kr({file:t,content:s,send:a,onAddLines:l,onAttach:c,onClose:i}){const n=me(),[o,d]=r.useState(null),[u,h]=r.useState(!1),[m,x]=r.useState(null),[C,M]=r.useState(!1),[R,w]=r.useState(!1),[I,E]=r.useState(!1),[P,D]=r.useState(""),[A,S]=r.useState(!0),y=r.useRef(!1),[b,f]=r.useState(!0),[T,J]=r.useState(!1),[ee,ie]=r.useState(100),Q=r.useRef(0),v=r.useRef(!1),W=r.useRef(null);r.useEffect(()=>{h(!0),d(null),x(null),E(!1),D(""),S(!0),y.current=!1,a({type:"read_file",path:t.path})},[t.path,a]),r.useEffect(()=>{s&&s.path===t.path&&(d(s),I||D(s.text),h(!1))},[s,I,t.path]),r.useEffect(()=>{const O=fe=>{if(fe.key==="Escape"){G();return}if((fe.ctrlKey||fe.metaKey)&&fe.key.toLowerCase()==="s"&&I){fe.preventDefault(),Z();return}const ve=fe.target,pe=ve&&(ve.tagName==="INPUT"||ve.tagName==="TEXTAREA"||ve.isContentEditable);(fe.ctrlKey||fe.metaKey)&&fe.key.toLowerCase()==="a"&&!pe&&(fe.preventDefault(),U())};return document.addEventListener("keydown",O),()=>document.removeEventListener("keydown",O)},[i,o,I,P]),r.useEffect(()=>{const O=()=>{v.current=!1,M(!1)};return window.addEventListener("mouseup",O),()=>window.removeEventListener("mouseup",O)},[]);const $=r.useMemo(()=>{if(!o)return[];const O=o.text.split(`
|
|
25
|
+
`);return O.length>0&&O[O.length-1]===""&&O.pop(),O.slice(0,wt)},[o]),X=r.useMemo(()=>{const O=vt(t.name);return!O||$.length===0?null:gi($.join(`
|
|
26
|
+
`),O)},[$,t.name]),ce=(o==null?void 0:o.lines)??0,z=ce>wt,k=(O,fe)=>{if(fe){const ve=Q.current>0?Q.current:O;x({start:Math.min(ve,O),end:Math.max(ve,O)})}else Q.current=O,x({start:O,end:O})},U=()=>{$.length!==0&&(Q.current=1,x({start:1,end:$.length}))},te=()=>{m&&(l(t.path,t.name,m.start,m.end),w(!0),W.current&&clearTimeout(W.current),W.current=setTimeout(()=>w(!1),1400))},de=o!==null&&o.kind==="text"&&!o.binary&&!o.truncated,F=()=>{D((o==null?void 0:o.text)??""),E(!1),y.current&&S(!0)},Y=()=>{if(I){if(P!==((o==null?void 0:o.text)??"")&&!window.confirm(n("discardFileChanges")))return;F();return}!de||!o||(y.current=Ct(t.name)&&A,Ct(t.name)&&S(!1),x(null),D(o.text),E(!0))},Z=()=>{!I||!o||!de||a({type:"write_file",path:t.path,text:P})&&(E(!1),y.current&&S(!0),x(null))},G=()=>{I&&P!==((o==null?void 0:o.text)??"")&&!window.confirm(n("discardFileChanges"))||i()},le=O=>{ie(Math.min(200,Math.max(50,O)))},ue=m?m.end-m.start+1:0,g=(o==null?void 0:o.binary)??!1,p=(o==null?void 0:o.truncated)??!1,B=(o==null?void 0:o.kind)??"text",oe=Ct(t.name),se=oe&&A&&!I&&B==="text"&&!g,xe=O=>$t(`/api/file?clientId=${encodeURIComponent(_t())}&path=${encodeURIComponent(O)}`);return e.jsx("div",{className:`fp-overlay ${T?"fullscreen":""}`,onMouseDown:O=>{O.target===O.currentTarget&&G()},children:e.jsxs("div",{className:`fp ${T?"fullscreen":""}`,style:{"--fp-zoom":ee/100},children:[e.jsxs("div",{className:"fp-head",children:[e.jsx("span",{className:"fp-name",title:t.path,children:t.name}),e.jsx("span",{className:"fp-path",children:t.path}),e.jsxs("span",{className:"fp-meta",children:[o&&B==="text"&&!g&&n("fileLines",{n:ce}),o&&` · ${Nr(o.size)}`]}),e.jsxs("span",{className:"fp-head-actions",children:[oe&&B==="text"&&!g&&o&&e.jsx("button",{type:"button",className:`fp-attach markdown ${A?"on":""}`,"data-tip":n(A?"showMarkdownSource":"showMarkdownPreview"),disabled:I,onClick:()=>S(O=>!O),children:A?e.jsx(Tt,{}):e.jsx(ga,{})}),B==="text"&&!g&&o&&e.jsx("button",{type:"button",className:`fp-attach edit ${I?"on":""}`,"data-tip":n(p?"fileEditTruncated":I?"exitEditFile":"editFile"),disabled:!de&&!I,onClick:Y,children:e.jsx(Et,{})}),B==="text"&&!g&&!se&&e.jsx("button",{type:"button",className:`fp-attach wrap ${b?"on":""}`,"data-tip":n(b?"disableWrap":"enableWrap"),onClick:()=>f(O=>!O),children:e.jsx(ha,{})}),B==="text"&&o&&e.jsxs("span",{className:"fp-zoom",children:[e.jsx("button",{type:"button",className:"fp-attach zoom-out","data-tip":n("zoomOut"),disabled:ee<=50,onClick:()=>le(ee-10),children:e.jsx(Jn,{})}),e.jsxs("button",{type:"button",className:"fp-zoom-val",title:n("resetZoom"),onClick:()=>ie(100),children:[ee,"%"]}),e.jsx("button",{type:"button",className:"fp-attach zoom-in","data-tip":n("zoomIn"),disabled:ee>=200,onClick:()=>le(ee+10),children:e.jsx(Qn,{})})]}),B!=="video"&&B!=="none"&&e.jsx("button",{type:"button",className:"fp-attach inline","data-tip":n("attachInlineTip"),onClick:()=>c(t.path,t.name,"inline"),children:e.jsx(ze,{})}),e.jsx("button",{type:"button",className:"fp-attach ref","data-tip":n("referenceTip"),onClick:()=>c(t.path,t.name,"reference"),children:e.jsx(St,{})}),e.jsx("button",{type:"button",className:`fp-attach full ${T?"on":""}`,"data-tip":n(T?"exitFullscreen":"fullscreen"),onClick:()=>J(O=>!O),children:T?e.jsx(sa,{}):e.jsx(aa,{})}),e.jsx("button",{type:"button",className:"fp-close",title:n("close"),onClick:G,children:e.jsx(we,{})})]})]}),p&&B==="text"&&!g&&e.jsx("div",{className:"fp-notice",children:n("previewTruncated")}),u&&!o&&e.jsx("div",{className:"fp-empty",children:n("loading")}),!u&&B==="none"&&!g&&e.jsx("div",{className:"fp-empty",children:n("previewNotSupported")}),!u&&B==="image"&&e.jsx("div",{className:"fp-media-wrap",children:e.jsx("img",{className:"fp-media",src:xe(t.path),alt:t.name})}),!u&&B==="video"&&e.jsx("div",{className:"fp-media-wrap",children:e.jsx("video",{className:"fp-media",src:xe(t.path),controls:!0,preload:"metadata"})}),!u&&se&&o&&e.jsx("div",{className:"fp-markdown msg-text",children:e.jsx("div",{className:"fp-markdown-zoom",children:e.jsx(Be,{text:o.text})})}),!u&&g&&B!=="image"&&B!=="video"&&o&&e.jsxs("div",{className:"fp-hex-wrap",children:[e.jsxs("div",{className:"fp-notice",children:[n("binaryFile"),o.truncated&&n("binaryHexTruncated")]}),e.jsx("pre",{className:"fp-hex",children:o.text})]}),!u&&I&&B==="text"&&!g&&o&&e.jsx("textarea",{className:`fp-editor ${b?"":"no-wrap"}`,value:P,onChange:O=>D(O.target.value),wrap:b?"soft":"off",spellCheck:!1,autoFocus:!0}),!u&&!se&&!I&&B==="text"&&!g&&o&&$.length===0&&e.jsx("div",{className:"fp-empty",children:n("emptyFile")}),!u&&!se&&!I&&B==="text"&&!g&&$.length>0&&e.jsxs("div",{className:`fp-code ${C?"dragging":""} ${b?"":"no-wrap"}`,onMouseDown:O=>{O.button===0&&O.preventDefault()},children:[$.map((O,fe)=>{const ve=fe+1,pe=m!==null&&ve>=m.start&&ve<=m.end;return e.jsxs("div",{className:`fp-line ${pe?"sel":""}`,onMouseDown:Te=>{Te.button===0&&(k(ve,Te.shiftKey),v.current=!0,M(!0))},onMouseEnter:()=>{v.current&&k(ve,!0)},children:[e.jsx("span",{className:"fp-num",children:ve}),X?e.jsx("span",{className:"fp-code-text hljs",dangerouslySetInnerHTML:{__html:X[fe]||""}}):e.jsx("span",{className:"fp-code-text",children:O})]},ve)}),z&&e.jsx("div",{className:"fp-lines-note",children:n("previewLinesTruncated",{n:wt})})]}),e.jsx("div",{className:"fp-foot",children:I?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"fp-hint",children:n("editFile")}),e.jsxs("div",{className:"fp-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:Y,children:n("cancel")}),e.jsxs("button",{type:"button",className:"btn primary",disabled:P===((o==null?void 0:o.text)??""),onClick:Z,children:[e.jsx(ea,{})," ",n("saveFile")]})]})]}):!se&&B==="text"&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"fp-hint",children:m?n("selectedRange",{n:ue,start:m.start,end:m.end}):n("selectLinesHint")}),e.jsxs("div",{className:"fp-actions",children:[e.jsx("button",{type:"button",className:"btn",disabled:$.length===0,onClick:U,children:n("selectAll")}),e.jsx("button",{type:"button",className:"btn",disabled:!m,onClick:()=>x(null),children:n("clearSelection")}),e.jsxs("button",{type:"button",className:"btn primary",disabled:!m||g,onClick:te,children:[R?e.jsx(Ve,{}):null,n(R?"addedToChat":"addToChat")]})]})]})})]})})}function Ct(t){const s=t.toLowerCase();return s.endsWith(".md")||s.endsWith(".markdown")}function Nr(t){return t>=1024*1024?`${(t/(1024*1024)).toFixed(1)} MB`:t>=1024?`${Math.round(t/1024)} KB`:`${t} B`}const sn="pi-web-sounds",Ye={enabled:!0,question:!0,done:!0,start:!1,error:!0,volume:100};function nn(){try{const t=localStorage.getItem(sn);if(!t)return{...Ye};const s=JSON.parse(t),a={...Ye,...s};for(const l of["enabled","question","done","start","error"])typeof a[l]!="boolean"&&(a[l]=Ye[l]);return typeof a.volume!="number"||!Number.isFinite(a.volume)?a.volume=Ye.volume:a.volume=Math.round(Math.max(0,Math.min(100,a.volume))/5)*5,a}catch{return{...Ye}}}function wr(t){try{localStorage.setItem(sn,JSON.stringify(t))}catch{}}let Xe=null;function Cr(){try{if(!Xe){const t=window.AudioContext??window.webkitAudioContext;if(!t)return null;Xe=new t}return Xe.state==="suspended"&&Xe.resume(),Xe}catch{return null}}const Sr=[{type:"sine",freq:587.33,start:0,dur:.13,peak:.5},{type:"sine",freq:880,start:.11,dur:.24,peak:.5}],Tr=[{type:"sine",freq:880,start:0,dur:.15,peak:.35},{type:"sine",freq:587.33,start:.15,dur:.32,peak:.35}],Er=[{type:"triangle",freq:660,start:0,dur:.08,peak:.22}],Mr=[{type:"square",freq:220,start:0,dur:.16,peak:.18},{type:"square",freq:174.61,start:.18,dur:.26,peak:.18}],Lr={question:Sr,done:Tr,start:Er,error:Mr};function Pr(t,s,a){const l=t.createOscillator(),c=t.createGain();l.type=s.type,l.frequency.value=s.freq;const i=t.currentTime+s.start,n=Math.max(1e-4,s.peak*a);c.gain.setValueAtTime(1e-4,i),c.gain.exponentialRampToValueAtTime(n,i+.012),c.gain.exponentialRampToValueAtTime(1e-4,i+s.dur),l.connect(c),c.connect(t.destination),l.start(i),l.stop(i+s.dur+.05)}function Ze(t,s=nn()){if(!s.enabled||!s[t])return;const a=Cr();if(!a)return;const l=Math.max(0,Math.min(1,s.volume/100));for(const c of Lr[t])Pr(a,c,l)}const Rr=r.lazy(()=>It(()=>import("./TerminalPanel-C3kNAJrw.js"),__vite__mapDeps([2,1,3,4,5])).then(t=>({default:t.TerminalPanel})));function Ir({notice:t,onDismiss:s}){const a=me(),[l,c]=r.useState(!1);r.useEffect(()=>{if(l)return;const n=setTimeout(()=>s(t.id),t.level==="error"?12e3:7e3);return()=>clearTimeout(n)},[l,t.id,t.level,s]);const i=t.level==="error"?ja:t.level==="warning"?Os:la;return e.jsxs("div",{className:`notice notice-${t.level}${l?" paused":""}`,role:"status",onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),children:[e.jsx(i,{className:"notice-icon"}),e.jsx("span",{className:"notice-text",children:t.text}),e.jsx("button",{type:"button",className:"notice-close",title:a("close"),onClick:()=>s(t.id),children:e.jsx(we,{})})]})}const Dr=[],an=180,rn=520,ln=240,on=t=>`pi-web-ui:${t}-panel-width`;function Ts(t){const s=Number(localStorage.getItem(on(t)));return Number.isFinite(s)&&s>=an&&s<=rn?s:ln}function Es({side:t,width:s,onResize:a}){const l=me(),c=r.useCallback(i=>{i.preventDefault();const n=i.clientX,o=s;let d=o;const u=m=>{const x=t==="left"?m.clientX-n:n-m.clientX;d=Math.min(rn,Math.max(an,Math.round(o+x))),a(d)},h=()=>{window.removeEventListener("pointermove",u),window.removeEventListener("pointerup",h),document.body.classList.remove("panel-resizing"),localStorage.setItem(on(t),String(d))};window.addEventListener("pointermove",u),window.addEventListener("pointerup",h),document.body.classList.add("panel-resizing")},[t,s,a]);return e.jsx("div",{className:`resize-handle resize-${t}`,title:l("dragToResize"),onPointerDown:c,onDoubleClick:()=>a(ln)})}function Fr(){var K,V,ye,ge,Ne,Se,Wt,Ht,Ut,qt,zt,Kt,Vt,Gt;const t=me(),{chat:s,send:a,dismissNotice:l,pushNotice:c,setPendingEcho:i,terminal:n}=za(),[o,d]=r.useState([]),[u,h]=r.useState(null),[m,x]=r.useState(!1),[C,M]=r.useState("chat"),R=r.useMemo(()=>s.plugins.filter(L=>{var H,ne;return!((ne=(H=s.settings)==null?void 0:H.disabledPlugins)!=null&&ne.includes(L.id))}),[s.plugins,(K=s.settings)==null?void 0:K.disabledPlugins]),[w,I]=r.useState([]);r.useEffect(()=>$a(I),[]),r.useEffect(()=>{_a(R,s.pluginsEpoch)},[R,s.pluginsEpoch]);const[E,P]=r.useState(()=>Ts("left")),[D,A]=r.useState(()=>Ts("right")),S=r.useCallback(L=>P(L),[]),y=r.useCallback(L=>A(L),[]),[b,f]=r.useState(null),[T,J]=r.useState(()=>window.matchMedia("(max-width: 768px)").matches);r.useEffect(()=>{const L=window.matchMedia("(max-width: 768px)"),H=ne=>J(ne.matches);return L.addEventListener("change",H),()=>L.removeEventListener("change",H)},[]);const[ee,ie]=r.useState(!1),[Q,v]=r.useState(!1),[W,$]=r.useState(!1),[X,ce]=r.useState(!1),[z,k]=r.useState(!1);r.useEffect(()=>{const L=H=>{var Re,Jt;const ne=H.detail,je=(ne==null?void 0:ne.title)||"插件命令",be=ne==null?void 0:ne.command;if(!be||!s.ready)return;const Ce={name:je,command:be,cwd:"${pwd}"},ke=s.terminals.find(yt=>yt.title===je);if(ke)n.restart(ke.id),a({type:"run_command",terminalId:ke.id,conversationId:ke.conversationId,command:Ce,cols:80,rows:24});else{const yt=Ge();n.create({id:yt,conversationId:s.activeConversationId||((Re=s.state)==null?void 0:Re.conversationId)||"",title:je,cwd:((Jt=s.state)==null?void 0:Jt.cwd)??"",cols:80,rows:24,running:!0,exitCode:null,command:Ce})}M("terminal")};return window.addEventListener("pi-web-ui:plugin-run-command",L),()=>window.removeEventListener("pi-web-ui:plugin-run-command",L)},[s,n,a]),r.useEffect(()=>{const L=H=>{!(H.ctrlKey||H.metaKey)||H.key.toLowerCase()!=="k"||(H.preventDefault(),k(ne=>!ne))};return window.addEventListener("keydown",L),()=>window.removeEventListener("keydown",L)},[]);const[U,te]=r.useState(nn),de=r.useRef(null),F=r.useRef(null),Y=r.useRef(0),Z=r.useRef(!1),G=r.useRef(s.terminals);r.useEffect(()=>{wr(U)},[U]),r.useEffect(()=>{var H;const L=G.current;G.current=s.terminals;for(const ne of s.terminals){const je=((H=ne.command)==null?void 0:H.command)??"",be=L.find(Ce=>Ce.id===ne.id);!(be!=null&&be.running)||ne.running||(je.startsWith("pi remove ")?a({type:"extensions_reload"}):(je.startsWith("pi-web-ui install ")||je.startsWith("pi-web-ui uninstall "))&&a({type:"plugins_reload"}))}},[s.terminals,a]),r.useEffect(()=>{var ne;const L=((ne=s.state)==null?void 0:ne.isStreaming)??!1,H=de.current;de.current=L,H!==null&&(!H&&L?Ze("start",U):H&&!L&&Ze("done",U))},[(V=s.state)==null?void 0:V.isStreaming,U]),r.useEffect(()=>{var H;const L=((H=s.dialog)==null?void 0:H.id)??null;L!==null&&L!==F.current&&Ze("question",U),F.current=L},[s.dialog,U]),r.useEffect(()=>{const L=[...s.notices].reverse().find(H=>H.level==="error");L&&L.id!==Y.current&&(Y.current=L.id,Ze("error",U))},[s.notices,U]);const le=(L,H,ne,je=!1,be)=>{const Ce=`${L}|${ne}|${be?`${be.start}-${be.end}`:""}`;d(ke=>ke.some(Re=>`${Re.path}|${Re.mode}|${Re.lines?`${Re.lines.start}-${Re.lines.end}`:""}`===Ce)?ke:[...ke,{path:L,name:H,mode:ne,isDir:je,...be?{lines:be}:{}}])},ue=L=>d(H=>H.filter(ne=>ne.key?ne.key!==L:ne.path!==L)),g=r.useCallback(L=>(!L.type.startsWith("list_")&&!L.type.startsWith("get_")&&f(null),a(L)),[a]),p=r.useRef(0),B=r.useRef(0),oe=L=>{var je;const H=Date.now();(je=s.state)!=null&&je.model&&!s.state.model.vision&&H-B.current>1e4&&(B.current=H,c("warning",t("imageNotSupported")));const ne=`paste-${++p.current}`;d(be=>[...be,{path:"",key:ne,name:L.name,mode:"inline",imageData:L.data,mimeType:L.mimeType}])},se=async L=>{for(const H of L){const ne=await Qs(H);if(!ne){c("error",t("imageLoadFailed",{name:H.name}));continue}oe(ne)}},xe=20*1024*1024,O=r.useRef(0),fe=async L=>{if(L.size>xe){c("warning",t("fileTooLarge",{name:L.name,size:xe/1024/1024}));return}let H;try{H=(await new Promise((be,Ce)=>{const ke=new FileReader;ke.onload=()=>be(ke.result),ke.onerror=()=>Ce(ke.error??new Error("read failed")),ke.readAsDataURL(L)})).replace(/^data:[^;]*;base64,/,"")}catch{c("error",t("fileLoadFailed",{name:L.name}));return}const ne=`upload-${++O.current}`;d(je=>[...je,{path:"",key:ne,name:L.name,mode:"inline",fileData:H,size:L.size,mimeType:L.type||void 0}])},ve=async L=>{for(const H of L)Pe(H.type)?await se([H]):await fe(H)},pe=r.useCallback((L,H,ne)=>{a({type:"edit_message",messageId:L,text:H,attachments:ne})},[a]),Te=r.useCallback(()=>v(!0),[]),Qe=r.useCallback(()=>d([]),[]),Fe=r.useCallback(ue,[]),Ae=r.useCallback(se,[se]),Ee=r.useCallback(ve,[ve]),N=(ye=s.state)==null?void 0:ye.model,_=(ge=s.state)==null?void 0:ge.thinkingLevel,re=(Ne=s.state)==null?void 0:Ne.availableThinkingLevels,ae=r.useMemo(()=>N?{model:N,thinkingLevel:_??"off",availableThinkingLevels:re??[]}:null,[N,_,re]),j=r.useCallback(()=>{var L,H;return!s.ready||s.terminals.length!==0?!1:(n.create({id:Ge(),conversationId:s.activeConversationId||((L=s.state)==null?void 0:L.conversationId)||"",title:t("terminalTitle",{n:1}),cwd:((H=s.state)==null?void 0:H.cwd)??"",cols:80,rows:24,running:!0,exitCode:null}),!0)},[s.ready,(Se=s.state)==null?void 0:Se.cwd,s.terminals.length,t,n]);return r.useEffect(()=>{if(Z.current){if(C!=="terminal"||s.terminals.length!==0){Z.current=!1;return}j()&&(Z.current=!1)}},[s.terminals.length,j,C]),e.jsxs("div",{className:"app",onDragOver:L=>{var H;Array.from(((H=L.dataTransfer)==null?void 0:H.types)??[]).includes("Files")&&(L.preventDefault(),x(!0))},onDragLeave:L=>{L.currentTarget.contains(L.relatedTarget)||x(!1)},onDrop:L=>{var be,Ce;if(x(!1),!Array.from(((be=L.dataTransfer)==null?void 0:be.types)??[]).includes("Files"))return;L.preventDefault();const H=Array.from(((Ce=L.dataTransfer)==null?void 0:Ce.files)??[]);if(H.length===0){c("warning",t("foldersNotSupported"));return}const ne=H.filter(ke=>Pe(ke.type)),je=H.filter(ke=>!Pe(ke.type));ne.length>0&&se(ne),je.length>0&&ve(je)},children:[m&&e.jsx("div",{className:"app-drop-overlay","aria-hidden":!0,children:e.jsxs("span",{children:["📎 ",t("dropHereToAttach")]})}),e.jsx(Ta,{chat:s,send:a,terminal:n,view:C,plugins:R,onViewChange:L=>{Z.current=L==="terminal"&&s.terminals.length===0,Z.current&&j()&&(Z.current=!1),M(L),f(null)},onOpenPanel:f,onManageModels:()=>v(!0),onOpenSettings:()=>$(!0),onOpenBgTasks:()=>ce(!0),onOpenGlobalSearch:()=>k(!0),sound:U,onSoundChange:te,onSoundPreview:L=>Ze(L,U)}),s.protocolMismatch&&e.jsxs("div",{className:"protocol-banner",children:["⚠ ",t("protocolMismatch")]}),e.jsx("div",{className:"notices",children:s.notices.map(L=>e.jsx(Ir,{notice:L,onDismiss:l},L.id))}),e.jsxs("div",{className:"layout",style:{"--left-w":`${E}px`,"--right-w":`${D}px`},children:[b&&e.jsx("div",{className:"drawer-backdrop",onClick:()=>f(null)}),e.jsxs("div",{className:`view-pane ${C==="chat"?"":"hidden"}`,children:[e.jsx("div",{className:`panel-drawer drawer-left ${b==="left"?"open":""}`,children:e.jsx(Ma,{send:g,active:!T||b==="left",ready:s.ready,status:s.status,cwd:((Wt=s.state)==null?void 0:Wt.cwd)??"",sessionFile:((Ht=s.state)==null?void 0:Ht.sessionFile)??null,conversations:s.conversations,sessions:s.sessions,projects:s.projects,dirBrowse:s.dirBrowse,activeConversationId:s.activeConversationId})}),!T&&e.jsx(Es,{side:"left",width:E,onResize:S}),e.jsxs("main",{className:"main",children:[s.state?e.jsx(ar,{state:s.state,liveOutputs:s.liveOutputs,toolStatuses:s.toolStatuses,onEdit:pe,onKillBash:()=>a({type:"abort_bash"}),thinkingWrap:((Ut=s.settings)==null?void 0:Ut.thinkingWrap)??!0,toolsWrap:((qt=s.settings)==null?void 0:qt.toolsWrap)??!0,pendingEcho:s.pendingEcho},s.state.conversationId??"boot"):e.jsx("div",{className:"boot-wait",children:s.ready?t("loadingSession"):t("connectingServer")}),e.jsx(rr,{send:a,goal:s.goal,models:s.models,modelsLoading:s.modelsLoading,activeConversationId:s.activeConversationId}),s.dialog&&e.jsx(cr,{dialog:s.dialog,send:a}),e.jsx(ir,{send:a,ready:s.ready,streaming:((zt=s.state)==null?void 0:zt.isStreaming)??!1,messages:((Kt=s.state)==null?void 0:Kt.messages)??Dr,slashCommands:s.slashCommands,modelState:ae,models:s.models,modelsLoading:s.modelsLoading,activeConversationId:s.activeConversationId,setPendingEcho:i,attachments:o,onRemoveAttachment:Fe,onAddImageFiles:Ae,onAddLocalFiles:Ee,onNotice:c,onManageModels:Te,onSent:Qe})]}),!T&&e.jsx(Es,{side:"right",width:D,onResize:y}),e.jsx("div",{className:`panel-drawer drawer-right ${b==="right"?"open":""}`,children:e.jsx(ei,{send:g,files:s.files,fileChanged:s.fileChanged,widgets:s.widgets,cwd:((Vt=s.state)==null?void 0:Vt.cwd)??"",onAttach:(L,H,ne,je)=>{f(null),le(L,H,ne,je)},onPreview:(L,H)=>{f(null),h({path:L,name:H})},onNotice:(L,H)=>c(L,H)})})]}),e.jsx("div",{className:`view-pane ${C==="terminal"?"":"hidden"}`,children:e.jsx(r.Suspense,{fallback:null,children:e.jsx(Rr,{chat:s,send:a,terminal:n})})}),e.jsx("div",{className:`view-pane ${C==="git"?"":"hidden"}`,children:e.jsx(ur,{chat:s,send:a,terminal:n,active:C==="git",onSwitchToTerminal:()=>M("terminal")})}),w.map(L=>{const H=`plugin:${L.info.id}`;return e.jsx("div",{className:`view-pane ${C===H?"":"hidden"}`,children:e.jsx(mr,{entry:L,send:a})},L.info.id)})]}),e.jsx(lr,{chat:s,send:a}),u&&e.jsx(kr,{file:u,content:s.fileContent,send:a,onAddLines:(L,H,ne,je)=>le(L,H,"lines",!1,{start:ne,end:je}),onAttach:(L,H,ne)=>le(L,H,ne),onClose:()=>h(null)}),s.ready&&s.state&&s.state.piConfigured===!1&&!ee&&!Q&&e.jsx(pr,{send:a,piConfigured:s.state.piConfigured,piAgentInstalled:s.state.piAgentInstalled,providers:s.providers,installResult:s.installResult,onClose:()=>ie(!0)}),Q&&e.jsx(fr,{send:a,providers:s.modelsConfig,providerStatus:s.providers,fetchModelsResult:s.fetchModelsResult,refreshProviderResult:s.refreshProviderResult,cloneProviderResult:s.cloneProviderResult,onClose:()=>v(!1)}),W&&e.jsx(vr,{chat:s,send:a,terminal:n,onSwitchToTerminal:()=>M("terminal"),onClose:()=>$(!1)}),X&&e.jsx(jr,{servers:s.bgServers,send:a,onClose:()=>ce(!1)}),z&&e.jsx(br,{send:a,sessions:s.sessions,projects:s.projects,cwd:((Gt=s.state)==null?void 0:Gt.cwd)??"",fileSearch:s.fileSearch,onClose:()=>k(!1),onSwitchSession:L=>{a({type:"switch_session",path:L})},onSwitchProject:L=>{a({type:"set_cwd",path:L})},onPreviewFile:(L,H)=>{h({path:L,name:H})}})]})}La();An.createRoot(document.getElementById("root")).render(e.jsx(r.StrictMode,{children:e.jsx(wa,{children:e.jsx(Fr,{})})}));export{ft as F,It as _,ze as a,Br as b,Mt as c,_e as d,we as e,na as f,qe as g,Ge as r,me as u};
|