pi-web-ui 0.44.2 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,19 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/TerminalPanel-BuG4RDBE.js","assets/markdown-DRBrS2Nf.js","assets/xterm-D1D2FVe3.js","assets/react-C9ovnpIm.js","assets/TerminalPanel-6GBZ9nXN.css"])))=>i.map(i=>d[i]);
2
- import{R as Be,a as r,j as e,M as ks,b as nn,c as an}from"./markdown-DRBrS2Nf.js";import{r as ws}from"./react-C9ovnpIm.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 a of c)if(a.type==="childList")for(const n of a.addedNodes)n.tagName==="LINK"&&n.rel==="modulepreload"&&l(n)}).observe(document,{childList:!0,subtree:!0});function i(c){const a={};return c.integrity&&(a.integrity=c.integrity),c.referrerPolicy&&(a.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?a.credentials="include":c.crossOrigin==="anonymous"?a.credentials="omit":a.credentials="same-origin",a}function l(c){if(c.ep)return;c.ep=!0;const a=i(c);fetch(c.href,a)}})();var Ye={},qt;function rn(){if(qt)return Ye;qt=1;var t=ws();return Ye.createRoot=t.createRoot,Ye.hydrateRoot=t.hydrateRoot,Ye}var ln=rn();const on="modulepreload",cn=function(t){return"/"+t},zt={},Ns=function(s,i,l){let c=Promise.resolve();if(i&&i.length>0){let n=function(m){return Promise.all(m.map(x=>Promise.resolve(x).then(g=>({status:"fulfilled",value:g}),g=>({status:"rejected",reason:g}))))};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(i.map(m=>{if(m=cn(m),m in zt)return;zt[m]=!0;const x=m.endsWith(".css"),g=x?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${m}"]${g}`))return;const v=document.createElement("link");if(v.rel=x?"stylesheet":on,x||(v.as="script"),v.crossOrigin="",v.href=m,d&&v.setAttribute("nonce",d),document.head.appendChild(v),x)return new Promise((w,R)=>{v.addEventListener("load",w),v.addEventListener("error",()=>R(new Error(`Unable to preload CSS for ${m}`)))})}))}function a(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"&&a(o.reason);return s().catch(a)})};var Cs={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},Kt=Be.createContext&&Be.createContext(Cs),dn=["attr","size","title"];function un(t,s){if(t==null)return{};var i,l,c=mn(t,s);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(l=0;l<a.length;l++)i=a[l],s.indexOf(i)===-1&&{}.propertyIsEnumerable.call(t,i)&&(c[i]=t[i])}return c}function mn(t,s){if(t==null)return{};var i={};for(var l in t)if({}.hasOwnProperty.call(t,l)){if(s.indexOf(l)!==-1)continue;i[l]=t[l]}return i}function et(){return et=Object.assign?Object.assign.bind():function(t){for(var s=1;s<arguments.length;s++){var i=arguments[s];for(var l in i)({}).hasOwnProperty.call(i,l)&&(t[l]=i[l])}return t},et.apply(null,arguments)}function Vt(t,s){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);s&&(l=l.filter(function(c){return Object.getOwnPropertyDescriptor(t,c).enumerable})),i.push.apply(i,l)}return i}function tt(t){for(var s=1;s<arguments.length;s++){var i=arguments[s]!=null?arguments[s]:{};s%2?Vt(Object(i),!0).forEach(function(l){pn(t,l,i[l])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(i)):Vt(Object(i)).forEach(function(l){Object.defineProperty(t,l,Object.getOwnPropertyDescriptor(i,l))})}return t}function pn(t,s,i){return(s=hn(s))in t?Object.defineProperty(t,s,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[s]=i,t}function hn(t){var s=gn(t,"string");return typeof s=="symbol"?s:s+""}function gn(t,s){if(typeof t!="object"||!t)return t;var i=t[Symbol.toPrimitive];if(i!==void 0){var l=i.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 Ss(t){return t&&t.map((s,i)=>Be.createElement(s.tag,tt({key:i},s.attr),Ss(s.child)))}function K(t){return s=>Be.createElement(fn,et({attr:tt({},t.attr)},s),Ss(t.child))}function fn(t){var s=i=>{var l=t.attr,c=t.size,a=t.title,n=un(t,dn),o=c||i.size||"1em",d;return i.className&&(d=i.className),t.className&&(d=(d?d+" ":"")+t.className),Be.createElement("svg",et({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},i.attr,l,n,{className:d,style:tt(tt({color:t.color||i.color},i.style),t.style),height:o,width:o,xmlns:"http://www.w3.org/2000/svg"}),a&&Be.createElement("title",null,a),t.children)};return Kt!==void 0?Be.createElement(Kt.Consumer,null,i=>s(i)):s(Cs)}function xn(t){return K({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 vn(t){return K({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 yt(t){return K({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 Ne(t){return K({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 Ts(t){return K({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 K({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 De(t){return K({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 K({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 Gt(t){return K({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 bn(t){return K({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:"5"},child:[]},{tag:"line",attr:{x1:"12",y1:"1",x2:"12",y2:"3"},child:[]},{tag:"line",attr:{x1:"12",y1:"21",x2:"12",y2:"23"},child:[]},{tag:"line",attr:{x1:"4.22",y1:"4.22",x2:"5.64",y2:"5.64"},child:[]},{tag:"line",attr:{x1:"18.36",y1:"18.36",x2:"19.78",y2:"19.78"},child:[]},{tag:"line",attr:{x1:"1",y1:"12",x2:"3",y2:"12"},child:[]},{tag:"line",attr:{x1:"21",y1:"12",x2:"23",y2:"12"},child:[]},{tag:"line",attr:{x1:"4.22",y1:"19.78",x2:"5.64",y2:"18.36"},child:[]},{tag:"line",attr:{x1:"18.36",y1:"5.64",x2:"19.78",y2:"4.22"},child:[]}]})(t)}function st(t){return K({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 nt(t){return K({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 jn(t){return K({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 it(t){return K({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 kn(t){return K({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 rt(t){return K({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 Ue(t){return K({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 qa(t){return K({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 Jt(t){return K({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 wn(t){return K({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 Nn(t){return K({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 Cn(t){return K({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 Ge(t){return K({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 Sn(t){return K({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 Tn(t){return K({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 En(t){return K({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 Mn(t){return K({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 bt(t){return K({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 at(t){return K({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 Rn(t){return K({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 Pn(t){return K({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 Ln(t){return K({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 In(t){return K({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 Qt(t){return K({attr:{viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},child:[{tag:"path",attr:{d:"M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"},child:[]}]})(t)}function Ze(t){return K({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 qe(t){return K({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 Es(t){return K({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 Bn(t){return K({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 Ms(t){return K({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 jt(t){return K({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 Yt(t){return K({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 Et(t){return K({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 lt(t){return K({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 Dn(t){return K({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 Mt(t){return K({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 $n(t){return K({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 ot(t){return K({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 ct(t){return K({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 _e(t){return K({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 dt(t){return K({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 _n(t){return K({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 Fn(t){return K({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 An(t){return K({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 Rs(t){return K({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 Ps(t){return K({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 On(t){return K({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 Wn(t){return K({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 $e(){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 i=0;i<16;i++)t[i]=Math.floor(Math.random()*256);t[6]=t[6]&15|64,t[8]=t[8]&63|128;const s=[...t].map(i=>i.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)}`}function Ie({trigger:t,open:s,onOpenChange:i,children:l,align:c="right",fit:a=!1,direction:n="down",menuClassName:o}){const d=r.useRef(null);return r.useEffect(()=>{if(!s)return;const m=g=>{d.current&&!d.current.contains(g.target)&&i(!1)},x=g=>{g.key==="Escape"&&i(!1)};return document.addEventListener("mousedown",m),document.addEventListener("keydown",x),()=>{document.removeEventListener("mousedown",m),document.removeEventListener("keydown",x)}},[s,i]),e.jsxs("div",{className:`dropdown ${c} ${a?"fit":""} ${n==="up"?"dd-up":""}`,ref:d,children:[e.jsxs("button",{type:"button",className:"chip",onClick:()=>i(!s),"aria-expanded":s,children:[t,e.jsx(_e,{className:`dd-caret ${s?"up":""}`})]}),s&&e.jsx("div",{className:`dd-menu ${o??""}`,children:l})]})}function we({active:t,disabled:s=!1,title:i,onClick:l,children:c}){return e.jsx("button",{type:"button",className:`dd-item ${t?"active":""}`,disabled:s,title:i,onClick:l,children:c})}const Ls="pi-web-ui:lang",Hn={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:"还没有可复制的助手回复",recentProjects:"最近项目",runningConversations:"运行的对话",historySessions:"历史对话",openHistory:"历史对话",openFiles:"文件列表",streaming:"进行中…",noHistory:"还没有历史对话",current:"当前",messageCount:"{n} 条消息",tuiTip:"pi 终端(TUI)中的对话",deleteProject:"从最近项目移出",deleteProjectConfirm:"确认移出",deleteSession:"删除该对话记录(不可恢复)",deleteSessionConfirm:"确认删除",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 密钥即可开始对话:",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:"正在等待模型响应…",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}",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:"开启:思考内容始终完整展开并自动换行(流式推理过程也实时可见);关闭:折叠成一行摘要,流式中一行实时显示最新文本",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 服务器…"},Un={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",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",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:",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…",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}",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",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…"},Is=r.createContext(null);function qn(){try{const t=localStorage.getItem(Ls);if(t==="zh"||t==="en")return t}catch{}return"zh"}function zn({children:t}){const[s,i]=r.useState(qn),l=r.useCallback(n=>{i(n);try{localStorage.setItem(Ls,n)}catch{}},[]),c=r.useCallback((n,o)=>{let d=Un[n];if(s==="zh"&&(d=Hn[n]),o)for(const[m,x]of Object.entries(o))d=d.replaceAll(`{${m}}`,String(x));return d},[s]);r.useEffect(()=>{document.documentElement.lang=s==="zh"?"zh-CN":"en"},[s]);const a=r.useMemo(()=>({locale:s,setLocale:l,t:c}),[s,l,c]);return e.jsx(Is.Provider,{value:a,children:t})}function Rt(){const t=r.useContext(Is);if(!t)throw new Error("useI18n must be used within LanguageProvider");return t}function he(){return Rt().t}const Kn=["off","minimal","low","medium","high","xhigh","max"],Bs=r.memo(function({state:s,models:i,modelsLoading:l,send:c,onManageModels:a,compact:n=!1}){const o=he(),d=s==null?void 0:s.model,m=d?`${d.provider}/${d.id}`:null,[x,g]=r.useState(!1),[v,w]=r.useState(!1),[R,C]=r.useState("");r.useEffect(()=>{x||C("")},[x]);const P=r.useMemo(()=>{const b=R.trim().toLowerCase();return b?i.filter(k=>k.name.toLowerCase().includes(b)||k.provider.toLowerCase().includes(b)||k.id.toLowerCase().includes(b)):i},[i,R]),[B,F]=r.useState(!1),p=s!=null&&s.availableThinkingLevels&&s.availableThinkingLevels.length>0?new Set(s.availableThinkingLevels):null,E=Kn.map(b=>({value:b,label:o(`thinking.${b}`),supported:p?p.has(b):!0})),T=b=>{var k;return((k=E.find(u=>u.value===b))==null?void 0:k.label)??b};return r.useEffect(()=>{x&&i.length===0&&!B&&!l&&(F(!0),c({type:"list_models"}))},[x,i.length,B,l,c]),r.useEffect(()=>{i.length>0&&F(!1)},[i.length]),e.jsxs(e.Fragment,{children:[e.jsxs(Ie,{trigger:e.jsxs(e.Fragment,{children:[e.jsx(lt,{}),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:x,onOpenChange:g,menuClassName:"dd-menu-model",children:[e.jsx("div",{className:"dd-header",children:o("availableModels")}),e.jsxs("div",{className:"dd-search-row",children:[e.jsx(it,{}),e.jsx("input",{className:"dd-search",type:"text",placeholder:o("searchModels"),value:R,onChange:b=>C(b.target.value)})]}),e.jsxs("div",{className:"dd-model-scroll",children:[(B||l)&&e.jsx("div",{className:"dd-loading",children:o("loading")}),i.length===0&&!B&&!l&&e.jsx("div",{className:"dd-loading",children:o("noModels")}),P.length===0&&i.length>0&&e.jsx("div",{className:"dd-loading",children:o("noModelMatches")}),P.map(b=>e.jsx(we,{active:m===b.id,onClick:()=>{m!==b.id&&c({type:"set_model",modelId:b.id}),g(!1)},children:e.jsxs("span",{className:"dd-model-cell",children:[e.jsx("span",{className:"dd-model-name",children:b.name}),e.jsxs("span",{className:"dd-model-meta",children:[e.jsx("span",{className:"dd-model-provider",children:b.provider}),(b.reasoning||b.vision)&&e.jsxs("span",{className:"dd-model-badges",children:[b.reasoning&&e.jsx("span",{className:"dd-model-badge",children:o("reasoning")}),b.vision&&e.jsx("span",{className:"dd-model-badge",children:o("vision")})]})]})]})},b.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:()=>{g(!1),a()},children:o("manageModels")})]})]}),e.jsxs(Ie,{trigger:e.jsxs(e.Fragment,{children:[e.jsx(yt,{}),e.jsx("span",{className:"chip-sub",children:o("thinkingChip",{level:s?T(s.thinkingLevel):"—"})})]}),open:v,onOpenChange:w,children:[e.jsx("div",{className:"dd-header",children:o("thinkingLevel")}),E.map(b=>e.jsx(we,{active:(s==null?void 0:s.thinkingLevel)===b.value,disabled:!b.supported,title:b.supported?void 0:o("thinkingUnsupported"),onClick:()=>{(s==null?void 0:s.thinkingLevel)!==b.value&&c({type:"set_thinking",level:b.value}),w(!1)},children:b.label},b.value))]})]})}),Vn=[{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 Xt({settings:t,onChange:s,onPreview:i}){const l=he(),c=a=>s({...t,...a});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(Ts,{className:"sound-icon"}),e.jsx("span",{children:l("enableSound")})]}),e.jsx("input",{type:"checkbox",checked:t.enabled,onChange:a=>c({enabled:a.target.checked})})]}),Vn.map(({kind:a,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(),i(a)},children:l("preview")}),e.jsx("input",{type:"checkbox",checked:t[a],disabled:!t.enabled,onChange:d=>c({[a]:d.target.checked})})]})]},a)),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:a=>c({volume:Number(a.target.value)})}),e.jsxs("span",{className:"sound-vol-num",children:[t.volume,"%"]})]})]})}function Gn({chat:t,send:s,terminal:i,view:l,plugins:c,onViewChange:a,onOpenPanel:n,onManageModels:o,onOpenSettings:d,onOpenBgTasks:m,onOpenGlobalSearch:x,sound:g,onSoundChange:v,onSoundPreview:w,themes:R,theme:C,onThemeChange:P}){var pe;const{locale:B,setLocale:F,t:p}=Rt(),[E,T]=r.useState(!1),[b,k]=r.useState(!1),[u,$]=r.useState(!1),[W,J]=r.useState(!1),[re,V]=r.useState(!1),oe=[{value:"zh",label:p("langZh")},{value:"en",label:p("langEn")}],I=t.ready?p("connected"):t.status==="closed"?p("reconnecting"):p("connecting"),A=t.ready?"ok":"busy",H=()=>{var U,M;if(!t.ready)return;const L=p("updateTabTitle"),j={name:L,command:"npm i -g pi-web-ui@latest",cwd:"${pwd}"},G=t.terminals.find(q=>q.title===L);G?(i.restart(G.id),s({type:"run_command",terminalId:G.id,conversationId:G.conversationId,command:j,cols:80,rows:24})):i.create({id:$e(),conversationId:t.activeConversationId||((U=t.state)==null?void 0:U.conversationId)||"",title:L,cwd:((M=t.state)==null?void 0:M.cwd)??"",cols:80,rows:24,running:!0,exitCode:null,command:j}),J(!1),V(!1),a("terminal")},ae=()=>{var L,j;return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"dd-update",children:[e.jsxs("div",{className:"dd-row",children:[e.jsx("span",{children:p("currentVersion")}),e.jsxs("b",{children:["v",((L=t.update)==null?void 0:L.current)??"…"]})]}),e.jsxs("div",{className:"dd-row",children:[e.jsx("span",{children:p("latestVersion")}),e.jsx("b",{children:t.update===null?p("checkingUpdate"):t.update.error?t.update.error:t.update.latest?`v${t.update.latest}`:p("checkingUpdate")})]}),t.update&&t.update.upToDate&&e.jsx("div",{className:"dd-note ok",children:p("upToDate")}),t.update&&!t.update.upToDate&&t.update.latest&&e.jsx("div",{className:"dd-note warn",children:p("updateAvailable",{version:t.update.latest})}),((j=t.update)==null?void 0:j.latestPublishedAt)&&Date.now()-new Date(t.update.latestPublishedAt).getTime()<30*6e4&&e.jsx("div",{className:"dd-note warn",children:p("updateJustPublished",{version:t.update.latest??""})}),t.update&&!t.update.upToDate&&t.update.latest&&e.jsx("div",{className:"dd-note",children:p("updateTerminalHint")})]}),e.jsxs("div",{className:"dd-actions",children:[e.jsx("button",{type:"button",className:"dd-refresh",onClick:()=>s({type:"check_update"}),children:t.update===null?p("checkingUpdate"):p("checkUpdate")}),t.update&&!t.update.upToDate&&t.update.latest&&e.jsx("button",{type:"button",className:"dd-refresh accent",onClick:H,children:p("updateNow")})]})]})};return e.jsxs("header",{className:"topbar",children:[e.jsxs("div",{className:"brand",children:[e.jsx("button",{type:"button",className:"panel-toggle",title:p("openHistory"),onClick:()=>n("left"),children:e.jsx(Sn,{})}),e.jsx("span",{className:"brand-logo",children:"π"}),e.jsx("span",{className:"brand-name",children:"pi-web-ui"}),e.jsx("span",{className:`conn-dot ${A}`,title:I}),e.jsx("span",{className:"conn-label",children:I})]}),e.jsxs("div",{className:"topbar-actions",children:[e.jsxs("div",{className:"view-switch",role:"tablist","aria-label":p("viewSwitch"),children:[e.jsxs("button",{type:"button",role:"tab","aria-selected":l==="chat",className:l==="chat"?"active":"",onClick:()=>a("chat"),children:[e.jsx(Ge,{}),e.jsx("span",{children:p("chat")})]}),e.jsxs("button",{type:"button",role:"tab","aria-selected":l==="terminal",className:l==="terminal"?"active":"",onClick:()=>a("terminal"),children:[e.jsx(Qe,{}),e.jsx("span",{children:p("terminal")})]}),e.jsxs("button",{type:"button",role:"tab","aria-selected":l==="git",className:l==="git"?"active":"",onClick:()=>a("git"),children:[e.jsx(Ze,{}),e.jsx("span",{children:p("scmTab")})]}),c.map(L=>{const j=L.error?`${L.name}: ${L.error}`:L.description?`${L.name} — ${L.description}`:L.name;return e.jsxs("button",{type:"button",role:"tab","aria-selected":l===`plugin:${L.id}`,className:`plugin-tab${l===`plugin:${L.id}`?" active":""}${L.error?" broken":""}`,title:j,onClick:()=>a(`plugin:${L.id}`),children:[L.icon?e.jsx("span",{"aria-hidden":!0,children:L.icon}):null,e.jsx("span",{children:L.name})]},L.id)})]}),e.jsxs("div",{className:"topbar-desktop",children:[e.jsxs("button",{type:"button",className:"chip",title:p("searchGlobalTip"),onClick:x,children:[e.jsx(it,{}),e.jsx("span",{className:"chip-sub",children:p("searchGlobal")})]}),e.jsxs("button",{type:"button",className:"chip bg-task-chip","data-tip":p("bgTasksTip"),onClick:m,children:[e.jsx(at,{}),e.jsx("span",{className:"chip-sub",children:p("bgTasks")}),t.bgServers.length>0&&e.jsx("span",{className:"bg-task-badge",children:t.bgServers.length})]}),e.jsx(Bs,{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:p("settingsTitle"),onClick:d,children:[e.jsx(nt,{}),e.jsx("span",{className:"chip-sub",children:p("settings")})]}),e.jsx(Ie,{trigger:e.jsxs(e.Fragment,{children:[e.jsx(Ts,{}),e.jsx("span",{className:"chip-sub",children:p("sound")})]}),open:E,onOpenChange:T,children:e.jsx(Xt,{settings:g,onChange:v,onPreview:w})}),e.jsxs(Ie,{trigger:e.jsxs(e.Fragment,{children:[e.jsx(In,{}),e.jsx("span",{className:"chip-sub",children:B==="zh"?p("langZh"):"EN"})]}),open:b,onOpenChange:k,children:[e.jsx("div",{className:"dd-header",children:p("language")}),oe.map(L=>e.jsx(we,{active:B===L.value,onClick:()=>{F(L.value),k(!1)},children:L.label},L.value))]}),e.jsxs(Ie,{trigger:e.jsxs(e.Fragment,{children:[e.jsx(bn,{}),e.jsx("span",{className:"chip-sub",children:p("theme")})]}),open:u,onOpenChange:$,children:[e.jsx("div",{className:"dd-header",children:p("theme")}),e.jsx(we,{active:C===null,onClick:()=>{P(null),$(!1)},children:p("themeDefault")}),R.map(L=>e.jsx(we,{active:C===L.id,onClick:()=>{P(L.id),$(!1)},children:L.name},L.id))]}),e.jsxs(Ie,{trigger:e.jsxs(e.Fragment,{children:[e.jsx(Et,{}),e.jsxs("span",{className:"chip-sub",children:["v",((pe=t.update)==null?void 0:pe.current)??"…"]}),t.update&&!t.update.upToDate&&e.jsx("span",{className:"update-dot",title:p("updateAvailable",{version:t.update.latest??""})})]}),open:W,onOpenChange:L=>{J(L),L&&s({type:"check_update"})},fit:!0,children:[e.jsx("div",{className:"dd-header",children:p("update")}),ae()]}),e.jsx("a",{className:"chip github",href:"https://github.com/xing-shuyin/pi-web-ui",target:"_blank",rel:"noreferrer noopener",title:p("githubRepo"),children:e.jsx(Qt,{})})]}),e.jsxs("button",{type:"button",className:"chip newchat","data-tip":p("newChatTip"),onClick:()=>s({type:"new_chat"}),children:[e.jsx(Ue,{}),e.jsx("span",{children:p("newChat")})]}),e.jsx("div",{className:"topbar-more",children:e.jsxs(Ie,{trigger:e.jsxs(e.Fragment,{children:[e.jsx(Nn,{}),e.jsx("span",{className:"chip-sub",children:p("more")}),t.update&&!t.update.upToDate&&e.jsx("span",{className:"update-dot"})]}),open:re,onOpenChange:L=>{V(L),L&&s({type:"check_update"})},children:[e.jsx("div",{className:"dd-header",children:p("sound")}),e.jsx("div",{className:"dd-header",children:p("settings")}),e.jsxs(we,{onClick:()=>{V(!1),d()},children:[e.jsx(nt,{})," ",p("settingsTitle")]}),e.jsxs(we,{onClick:()=>{V(!1),x()},children:[e.jsx(it,{})," ",p("searchGlobal")]}),e.jsxs(we,{onClick:()=>{V(!1),m()},children:[e.jsx(at,{})," ",p("bgTasks"),t.bgServers.length>0&&e.jsx("em",{className:"bg-task-badge",children:t.bgServers.length})]}),e.jsx(Xt,{settings:g,onChange:v,onPreview:w}),e.jsx("div",{className:"dd-header",children:p("language")}),oe.map(L=>e.jsx(we,{active:B===L.value,onClick:()=>F(L.value),children:L.label},L.value)),e.jsx("div",{className:"dd-header",children:p("theme")}),e.jsx(we,{active:C===null,onClick:()=>{P(null),V(!1)},children:p("themeDefault")}),R.map(L=>e.jsx(we,{active:C===L.id,onClick:()=>{P(L.id),V(!1)},children:L.name},L.id)),e.jsx("div",{className:"dd-header",children:p("update")}),ae(),e.jsxs("a",{className:"dd-refresh dd-more-link",href:"https://github.com/xing-shuyin/pi-web-ui",target:"_blank",rel:"noreferrer noopener",children:[e.jsx(Qt,{})," ",p("githubRepo")]})]})}),e.jsx("button",{type:"button",className:"panel-toggle",title:p("openFiles"),onClick:()=>n("right"),children:e.jsx(qe,{})})]})]})}function Zt(t){const s=new Date(t),i=new Date;return s.toDateString()===i.toDateString()?`${String(s.getHours()).padStart(2,"0")}:${String(s.getMinutes()).padStart(2,"0")}`:`${s.getMonth()+1}/${s.getDate()}`}const Jn=r.memo(function({ready:s,status:i,cwd:l,sessionFile:c,conversations:a,sessions:n,projects:o,activeConversationId:d,send:m,active:x}){const g=he(),v=c,w=l,[R,C]=r.useState(null);r.useEffect(()=>{!x||!s||i!=="open"||l&&(m({type:"list_sessions"}),m({type:"list_projects"}))},[x,s,i,l,m]);const P=p=>{const E=p.name||p.firstMessage.trim();return E.length>0?E:g("emptyChat")},B=p=>p.split(/[\\/]/).pop()||p,F=(p,E,T,b)=>{const k=R===p;return e.jsx("button",{type:"button",className:`lp-del ${k?"confirm":""}`,title:k?T:E,onClick:u=>{u.stopPropagation(),k?(C(null),b()):C(p)},children:k?e.jsx(dt,{}):e.jsx(De,{})})};return e.jsxs("aside",{className:"panel panel-left",children:[o.length>0&&e.jsxs("div",{className:"panel-projects",children:[e.jsx("div",{className:"panel-section-title",children:g("recentProjects")}),e.jsx("div",{className:"projects-scroll",children:o.map(p=>{const E=w===p.path;return e.jsxs("div",{className:"lp-row",onMouseLeave:()=>C(T=>T===`proj:${p.path}`?null:T),children:[e.jsxs("button",{type:"button",className:`project-item ${E?"active":""}`,title:p.path,onClick:()=>{E||m({type:"set_cwd",path:p.path})},children:[e.jsx(qe,{className:"project-icon"}),e.jsxs("span",{className:"project-info",children:[e.jsx("span",{className:"project-name",children:B(p.path)}),e.jsx("span",{className:"project-path",children:p.path})]}),e.jsx("span",{className:"project-time",children:Zt(p.lastUsed)})]}),F(`proj:${p.path}`,g("deleteProject"),g("deleteProjectConfirm"),()=>m({type:"remove_project",path:p.path}))]},p.path)})})]}),a.length>0&&e.jsxs("div",{className:"panel-convs",children:[e.jsx("div",{className:"panel-section-title",children:g("runningConversations")}),a.map(p=>{const E=d===p.id;return e.jsxs("button",{type:"button",className:`session-item ${E?"active":""}`,title:p.title,onClick:()=>{E||m({type:"switch_conversation",id:p.id})},children:[e.jsx(Ge,{className:"session-icon"}),e.jsxs("span",{className:"session-info",children:[e.jsx("span",{className:"session-title",children:p.title}),e.jsx("span",{className:"session-sub",children:E?g("current"):g("messageCount",{n:p.messageCount})})]}),p.isStreaming&&e.jsx("span",{className:"conv-streaming",title:g("streaming")})]},p.id)}),e.jsx("div",{className:"panel-section-divider"})]}),e.jsxs("div",{className:"panel-sessions",children:[e.jsx("div",{className:"panel-section-title",children:g("historySessions")}),e.jsxs("div",{className:"sessions-scroll",children:[n.length===0&&e.jsx("div",{className:"panel-empty",children:g("noHistory")}),n.map(p=>{const E=v===p.path;return e.jsxs("div",{className:"lp-row",onMouseLeave:()=>C(T=>T===`sess:${p.path}`?null:T),children:[e.jsxs("button",{type:"button",className:`session-item ${E?"active":""}`,title:p.path,onClick:()=>{E||m({type:"switch_session",path:p.path})},children:[e.jsx(Ge,{className:"session-icon"}),e.jsxs("span",{className:"session-info",children:[e.jsx("span",{className:"session-title",children:P(p)}),e.jsxs("span",{className:"session-sub",children:[E?g("current"):g("messageCount",{n:p.messageCount}),p.source==="tui"&&e.jsx("span",{className:"session-src",title:g("tuiTip"),children:"TUI"})]})]}),e.jsx("span",{className:"session-time",children:Zt(p.modified)})]}),F(`sess:${p.path}`,g("deleteSession"),g("deleteSessionConfirm"),()=>m({type:"delete_session",path:p.path}))]},p.path)})]})]})]})}),Ds="pi-web-ui:token";function Qn(){try{const t=new URL(window.location.href),s=t.searchParams.get("token");s&&(localStorage.setItem(Ds,s.trim()),t.searchParams.delete("token"),window.history.replaceState(null,"",t.toString()))}catch{}}function Yn(){try{return localStorage.getItem(Ds)??""}catch{return""}}function ut(t){const s=Yn();return s?`${t}${t.includes("?")?"&":"?"}token=${encodeURIComponent(s)}`:t}function Xn(t,s){const i=s.assistantMessageEvent,l=t.stats.tokens,c=s.usage!==null?{...l,...s.usage}:l,a=c===l?t.stats:{...t.stats,tokens:c};if(i.type!=="text_delta"&&i.type!=="thinking_delta")return a===t.stats?t:{...t,stats:a};const n=i.delta??"";if(!n)return a===t.stats?t:{...t,stats:a};const o=t.streamingMessage??null,d=o&&o.id===s.messageId?o:{id:s.messageId,content:[]},m=[...d.content],x=i.type==="thinking_delta"?"thinking":"text",g=i.contentIndex??m.length-1;return g>=0&&g<m.length&&m[g].type===x?m[g]=x==="thinking"?{type:"thinking",thinking:(m[g].thinking??"")+n}:{type:"text",text:(m[g].text??"")+n}:m.push(x==="thinking"?{type:"thinking",thinking:n}:{type:"text",text:n}),{...t,stats:a,streamingMessage:{...d,id:s.messageId,content:m}}}const kt="pi-web-ui:plugin-data";function Zn(t,s){window.dispatchEvent(new CustomEvent(kt,{detail:{pluginId:t,payload:s}}))}function ei(t){const s=i=>{const l=i.detail;t(l.pluginId,l.payload)};return window.addEventListener(kt,s),()=>window.removeEventListener(kt,s)}const He=new Map,wt=new Set,Oe=new Set;let es=-1;function $s(){return[...He.values()]}function ti(){const t=$s();for(const s of wt)s(t)}function si(t){return wt.add(t),t($s()),()=>wt.delete(t)}async function ni(t,s){s!==es&&(es=s,He.clear(),Oe.clear());const i=new Set(t.map(l=>l.id));for(const l of[...He.keys()])i.has(l)||He.delete(l);for(const l of[...Oe])i.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 a=(await Ns(()=>import(`/plugins/${encodeURIComponent(l.id)}/client/entry.mjs?e=${s}`),[])).default;a&&typeof a.mount=="function"?He.set(l.id,{info:l,module:a}):(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)}})),ti()}function ii(t,s){return{pluginId:t,send:i=>s({type:"plugin_message",pluginId:t,payload:i}),onData:i=>ei((l,c)=>{l===t&&i(c)})}}const ai=9,ht=2e5,ri=2e5,li={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 oi(){const t=new Map,s=new Map,i=(l,c)=>`${l}:${c}`;return{write(l,c,a){const n=i(l,c),o=t.get(n);if(o&&o.size>0){for(const x of o)try{x.write(a)}catch{}return}const d=s.get(n)??"",m=d.length+a.length>ri?a:d+a;s.set(n,m)},register(l,c,a){const n=i(l,c);let o=t.get(n);o||(o=new Set,t.set(n,o)),o.add(a);const d=s.get(n);if(d){try{a.write(d)}catch{}s.delete(n)}return()=>{const m=t.get(n);m&&(m.delete(a),m.size===0&&t.delete(n)),s.delete(n)}},clear(){t.clear(),s.clear()}}}function ts(t,s){const i=new Set;for(const c of s.messages)c.role==="toolResult"&&c.toolCallId&&i.add(c.toolCallId),c.role==="bashExecution"&&i.add(`bash-${c.id}`);let l=!1;for(const c of t.keys())i.has(c)&&(t.delete(c),l=!0);return l?new Map(t):t}function ss(t,s){if(t.size===0)return t;const i=new Set;for(const c of s.messages)c.role==="toolResult"&&c.toolCallId&&i.add(c.toolCallId);let l=!1;for(const c of t.keys())i.has(c)&&(t.delete(c),l=!0);return l?new Map(t):t}function ci(t,s){var i,l,c,a;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!==ai};case"snapshot":return{...t,ready:!0,state:s.state,activeConversationId:s.state.conversationId,liveOutputs:ts(t.liveOutputs,s.state),toolStatuses:ss(t.toolStatuses,s.state)};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:ts(t.liveOutputs,d),toolStatuses:ss(t.toolStatuses,d)}}case"tool_delta":{const n=t.liveOutputs.get(s.toolCallId),o=((n==null?void 0:n.text)??"")+s.delta,d=o.length>ht?`…[前 ${o.length-ht} 字符已省略]…
3
- `+o.slice(o.length-ht):o,m=new Map(t.liveOutputs);return m.set(s.toolCallId,{toolName:s.toolName,text:d}),{...t,liveOutputs:m}}case"message_delta":{const n=t.state;return!n||n.conversationId!==s.msg.conversationId?t:{...t,state:Xn(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"sessions":return{...t,sessions:s.sessions};case"conversations":return{...t,conversations:s.conversations,activeConversationId:s.activeId};case"projects":return{...t,projects:s.projects};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||(i=t.state)!=null&&i.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||((a=t.state)==null?void 0:a.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 ns="pi-web-client-id";let gt=null;function Pt(){if(gt)return gt;let t=null;try{t=sessionStorage.getItem(ns),t||(t=$e(),sessionStorage.setItem(ns,t))}catch{t=t??$e()}return gt=t,t}function di(){const t=location.protocol==="https:"?"wss:":"ws:";return ut(`${t}//${location.host}/ws`)}function ui(){const[t,s]=r.useReducer(ci,{status:"connecting",ready:!1,state:null,liveOutputs:new Map,toolStatuses:new Map,notices:[],sessions:[],conversations:[],activeConversationId:"",projects:[],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:li,bgServers:[],settings:null,fetchModelsResult:null,refreshProviderResult:null,cloneProviderResult:null,scmData:null,fileSearch:null,scmDirty:0,plugins:[],pluginsEpoch:0,protocolMismatch:!1}),i=r.useRef(null),l=r.useRef(oi()),c=r.useRef(0),a=r.useRef(null),n=r.useRef(!0),o=r.useRef(0),d=r.useRef(0),m=r.useRef(new Map),x=r.useRef(null),g=()=>{x.current||(x.current=setTimeout(()=>{x.current=null;const b=i.current;b&&b.readyState===WebSocket.OPEN&&b.send(JSON.stringify({type:"get_state"}))},300))},v=(b,k)=>{var W;const u=m.current,$=u.get(b);if($!==void 0&&k!==$+1){const J=T.current.chat,re=J.activeConversationId||((W=J.state)==null?void 0:W.conversationId);b===re&&g()}u.set(b,k)},w=r.useCallback((b,k)=>{const u=++d.current;s({type:"notice",notice:{id:u,level:b,text:k}})},[]),R=r.useCallback(b=>{const k=i.current;return k&&k.readyState===WebSocket.OPEN?(k.send(JSON.stringify(b)),!0):!1},[]),C=r.useCallback(()=>{if(!n.current)return;s({type:"status",status:"connecting"});const b=new WebSocket(di());i.current=b,b.onopen=()=>{i.current===b&&(s({type:"status",status:"open"}),c.current=0,o.current=Date.now(),b.send(JSON.stringify({type:"hello",clientId:Pt()})))},b.onmessage=k=>{if(i.current!==b)return;o.current=Date.now();let u;try{u=JSON.parse(k.data)}catch{return}switch(u.type){case"ready":s({type:"ready",serverVersion:u.serverVersion,protocolVersion:u.protocolVersion}),b.send(JSON.stringify({type:"get_state"})),b.send(JSON.stringify({type:"list_files"})),b.send(JSON.stringify({type:"list_models"})),b.send(JSON.stringify({type:"list_commands"})),b.send(JSON.stringify({type:"get_commands"})),b.send(JSON.stringify({type:"check_update"}));break;case"snapshot":m.current=new Map,s({type:"snapshot",state:u.state});break;case"snapshot_delta":{const $=T.current.chat.state;(!$||$.conversationId!==u.conversationId||$.rev!==u.baseRev)&&g(),s({type:"snapshot_delta",msg:u});break}case"tool_delta":v(u.conversationId,u.seq),s({type:"tool_delta",toolCallId:u.toolCallId,toolName:u.toolName,delta:u.delta});break;case"tool_status":s({type:"tool_status",status:u});break;case"message_delta":{v(u.conversationId,u.seq),s({type:"message_delta",msg:u});break}case"notice":{const $=++d.current;s({type:"notice",notice:{id:$,level:u.level,text:u.text}});break}case"sessions":s({type:"sessions",sessions:u.sessions});break;case"conversations":s({type:"conversations",conversations:u.conversations,activeId:u.activeId});break;case"projects":s({type:"projects",projects:u.projects});break;case"files":s({type:"files",files:u});break;case"file_changed":s({type:"file_changed",path:u.path});break;case"file_content":s({type:"file_content",content:u});break;case"models":s({type:"models",models:u.models,loading:!1});break;case"models_config":s({type:"models_config",providers:u.providers});break;case"providers_status":s({type:"providers_status",providers:u.providers});break;case"fetch_models_result":s({type:"fetch_models_result",result:{reqId:u.reqId,ok:u.ok,models:u.models,error:u.error}});break;case"refresh_provider_result":s({type:"refresh_provider_result",result:{reqId:u.reqId,ok:u.ok,added:u.added,total:u.total,error:u.error}});break;case"clone_provider_result":s({type:"clone_provider_result",result:{reqId:u.reqId,ok:u.ok,config:u.config,error:u.error}});break;case"scm_data":s({type:"scm_data",data:u});break;case"search_files_result":s({type:"file_search_result",result:{reqId:u.reqId,ok:u.ok,results:u.results,truncated:u.truncated}});break;case"scm_changed":s({type:"scm_changed"});break;case"install_result":s({type:"install_result",result:u});break;case"path_completions":s({type:"path_completions",completions:u.completions});break;case"update_status":s({type:"update_status",status:u});break;case"widgets":s({type:"widgets",widgets:u.widgets});break;case"statuses":s({type:"statuses",statuses:u.statuses});break;case"dialog":s({type:"dialog",dialog:{id:u.id,kind:u.kind,title:u.title,args:u.args}});break;case"dialog_closed":s({type:"dialog",dialog:null});break;case"terminal_output":l.current.write(u.conversationId??T.current.chat.activeConversationId,u.terminalId,u.data);break;case"terminal_exit":s({type:"terminal_exit",conversationId:u.conversationId,terminalId:u.terminalId,exitCode:u.exitCode});break;case"terminal_list":s({type:"terminal_list",conversationId:u.conversationId,terminals:u.terminals});break;case"commands":s({type:"commands",commands:u.commands,path:u.path});break;case"slash_commands":s({type:"slash_commands",commands:u.commands});break;case"goal_status":s({type:"goal_status",status:u.status});break;case"settings_state":s({type:"settings",settings:u.settings});break;case"bg_servers":s({type:"bg_servers",servers:u.servers});break;case"plugins":s({type:"plugins",plugins:u.plugins,epoch:u.epoch});break;case"plugin_data":Zn(u.pluginId,u.payload);break}},b.onclose=()=>{if(i.current===b&&(i.current=null),l.current.clear(),!n.current||i.current&&i.current!==b)return;s({type:"status",status:"closed"});const k=Math.min(1e3*2**c.current,1e4);c.current+=1,a.current=setTimeout(()=>{a.current=null,C()},k)},b.onerror=()=>{}},[]);r.useEffect(()=>{n.current=!0,C();const b=setInterval(()=>{if(!n.current)return;const k=i.current;k&&k.readyState===WebSocket.OPEN&&Date.now()-o.current>3e4&&k.close()},5e3);return()=>{var k;n.current=!1,clearInterval(b),a.current&&(clearTimeout(a.current),a.current=null),(k=i.current)==null||k.close(),i.current=null}},[C]);const P=r.useCallback(b=>s({type:"dismiss_notice",id:b}),[]),B=r.useCallback(b=>s({type:"terminal_add",meta:b}),[]),F=r.useCallback(b=>s({type:"terminal_remove",id:b}),[]),p=r.useCallback(b=>s({type:"terminal_restart",terminalId:b}),[]),E=r.useCallback((b,k,u)=>l.current.register(b,k,u),[]),T=r.useRef({chat:t,send:R,pushNotice:w,dismissNotice:P,terminal:{create:B,close:F,register:E,restart:p}});return T.current={chat:t,send:R,pushNotice:w,dismissNotice:P,terminal:{create:B,close:F,register:E,restart:p}},T.current}const mi=200*1024*1024,pi=/windows/i.test(navigator.userAgent),hi=/[<>:"/\\|?*\u0000-\u001f]/g,gi=/[. ]+$/,fi=/^(con|prn|aux|nul|com[1-9]|lpt[1-9])(\..*)?$/i;function xi(t){const s=t.replace(hi,"_").replace(gi,"");return s?fi.test(s)?`_${s}`:s:"_"}function is(t,s=!0){const i=new URLSearchParams({clientId:Pt(),path:t,...s?{download:"1"}:{}});return ut(`/api/file?${i}`)}async function vi(t,s){const i=pi?xi(s):s;try{const l=await fetch(is(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")>mi)return window.location.assign(is(t)),{ok:!0};const a=await l.blob();return window.showSaveFilePicker&&window.isSecureContext?yi(a,i):Nt(a,i)}catch(l){return{ok:!1,cancelled:!1,error:l instanceof Error?l.message:String(l)}}}async function yi(t,s){let i;const l=window.showSaveFilePicker;if(!l)return Nt(t,s);try{i=await l({suggestedName:s})}catch(c){return c instanceof DOMException&&c.name==="AbortError"?{ok:!1,cancelled:!0}:Nt(t,s)}try{const c=await i.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 Nt(t,s){const i=URL.createObjectURL(t),l=document.createElement("a");return l.href=i,l.download=s,document.body.appendChild(l),l.click(),l.remove(),setTimeout(()=>URL.revokeObjectURL(i),1e4),{ok:!0}}const bi=r.memo(function({files:s,fileChanged:i,widgets:l,cwd:c,send:a,onAttach:n,onPreview:o,onNotice:d}){const m=he(),[x,g]=r.useState(""),[v,w]=r.useState(null),[R,C]=r.useState(!1),P=1e4,B=r.useRef(0),F=r.useRef(void 0),p=r.useCallback((k,u)=>{const $=++B.current;g(k),u!=null&&u.silent||C(!0),a({type:"list_files",path:k===""?void 0:k})||B.current===$&&C(!1)},[a]);r.useEffect(()=>{s&&s.path===x&&C(!1)},[s,x]),r.useEffect(()=>{if(c!==F.current){F.current=c,p("",{silent:!0});return}const k=setInterval(()=>{document.visibilityState!=="hidden"&&p(x,{silent:!0})},P);return()=>clearInterval(k)},[c,x,p]),r.useEffect(()=>{i&&i.path===x&&p(x,{silent:!0})},[i,x,p]);const E=k=>p(k),T=()=>{(s==null?void 0:s.parent)!==null&&(s==null?void 0:s.parent)!==void 0&&p(s.parent)},b=x.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 ${x===""?"active":""}`,onClick:()=>p(""),children:m("rootDir")}),b.map((k,u)=>{const $=b.slice(0,u+1).join("/");return e.jsxs("span",{className:"crumb-seg",children:[e.jsx(ct,{}),e.jsx("button",{type:"button",className:`crumb ${$===x?"active":""}`,onClick:()=>p($),children:k})]},$)})]}),e.jsxs("div",{className:"panel-body",children:[R&&e.jsx("div",{className:"panel-empty",children:m("loading")}),!R&&s&&s.path===x&&e.jsxs(e.Fragment,{children:[s.path!==""&&e.jsxs("button",{type:"button",className:"file-item dir",onClick:T,children:[e.jsx(qe,{className:"file-icon"}),e.jsx("span",{className:"file-name",children:".."})]}),s.entries.map(k=>k.type==="dir"?e.jsxs("div",{className:"file-item dir",children:[e.jsxs("button",{type:"button",className:"file-dir-main",onClick:()=>E(k.path),children:[e.jsx(qe,{className:"file-icon"}),e.jsx("span",{className:"file-name",children:k.name})]}),e.jsx("button",{type:"button",className:"file-attach ref","data-tip":m("linkFolderTip"),onClick:()=>n(k.path,k.name,"reference",!0),children:e.jsx(bt,{})})]},k.path):e.jsxs("div",{className:"file-item file",children:[e.jsxs("button",{type:"button",className:"file-name",title:`${k.path} — ${m("previewFile")}`,onClick:()=>o(k.path,k.name),children:[e.jsx(Es,{className:"file-icon"}),e.jsx("span",{className:"file-name-text",children:k.name})]}),e.jsx("button",{type:"button",className:"file-attach download","data-tip":m("downloadFile"),onClick:()=>{vi(k.path,k.name).then(u=>{u.ok||u.cancelled||d("error",m("downloadFailed",{error:u.error}))})},children:e.jsx(Et,{})}),e.jsx("button",{type:"button",className:"file-attach inline","data-tip":m("attachInlineTip"),onClick:()=>n(k.path,k.name,"inline"),children:e.jsx(Ue,{})}),e.jsx("button",{type:"button",className:"file-attach ref","data-tip":m("referenceTip"),onClick:()=>n(k.path,k.name,"reference"),children:e.jsx(bt,{})})]},k.path)),s.truncated&&e.jsx("div",{className:"panel-empty files-truncated",children:m("filesTruncated")})]}),!R&&!s&&e.jsx("div",{className:"panel-empty",children:m("noFiles")})]}),l.filter(k=>k.lines.length>0).length>0&&e.jsx("div",{className:"panel-widgets",children:l.filter(k=>k.lines.length>0).map(k=>e.jsxs("div",{className:"widget",children:[e.jsxs("button",{type:"button",className:"widget-title widget-title-btn",title:m("widgetExpand"),onClick:()=>w(k.key),children:[e.jsx("span",{children:k.key}),e.jsx(En,{})]}),e.jsx("pre",{className:"widget-lines",children:k.lines.join(`
4
- `)})]},k.key))}),v&&(()=>{const k=l.find(u=>u.key===v);return k?e.jsx("div",{className:"modal-backdrop",onClick:()=>w(null),children:e.jsxs("div",{className:"widget-expand",onClick:u=>u.stopPropagation(),children:[e.jsxs("div",{className:"widget-expand-head",children:[e.jsx("span",{className:"widget-expand-title",children:k.key}),e.jsx("button",{type:"button",className:"btn",title:m("close"),onClick:()=>w(null),children:e.jsx(Ne,{})})]}),e.jsx("pre",{className:"widget-expand-lines",children:k.lines.join(`
5
- `)})]})}):null})()]})});var as=ws();const _s=r.memo(function({text:s}){const i=he(),[l,c]=r.useState(!1);return s?e.jsx("button",{type:"button",className:"copy-btn",title:i("copy"),onClick:()=>{navigator.clipboard.writeText(s).then(()=>{c(!0),setTimeout(()=>c(!1),1200)})},children:l?e.jsx(dt,{}):e.jsx(Mt,{})}):null}),Fs=[an],As=[[nn,{detect:!0,ignoreMissing:!0}]];function Os({text:t}){return e.jsx(ks,{remarkPlugins:Fs,rehypePlugins:As,components:{pre:ji},children:t})}const mt=r.memo(function({text:s}){return e.jsx("div",{className:"md",children:e.jsx(Os,{text:s})})});function ji({children:t,...s}){return e.jsxs("div",{className:"codeblock",children:[e.jsx(_s,{text:Ct(t)}),e.jsx("pre",{...s,children:t})]})}function Ct(t){if(typeof t=="string")return t;if(Array.isArray(t))return t.map(Ct).join("");if(t&&typeof t=="object"&&"props"in t){const s=t.props;return Ct(s==null?void 0:s.children)}return""}const ki=/^\s{0,3}(`{3,}|~{3,})/,wi=/^\s{0,3}(?:[-*+]|\d{1,9}[.)])\s/;function ft(t){return t.trim()===""}function rs(t){const s=ki.exec(t);return s?s[1]:null}function Ni(t){const s=t.split(`
6
- `),i=[];let l=[],c=null;for(let a=0;a<s.length;a++){const n=s[a];if(c!==null){const d=rs(n);d&&d[0]===c[0]&&d.length>=c.length&&(c=null),l.push(n);continue}const o=rs(n);if(o&&!ft(n)){c=o,l.push(n);continue}if(ft(n)){let d=a;for(;d<s.length&&ft(s[d]);)d++;if(!(d<s.length&&wi.test(s[d]))&&l.length>0){i.push(l.join(`
7
- `)),l=[];continue}l.push(n);continue}l.push(n)}return{frozen:i,active:l.join(`
8
- `),inFence:c!==null}}const Ci=r.memo(function({text:s}){return e.jsx(ks,{remarkPlugins:Fs,rehypePlugins:As,children:s})}),ls=200;function Si({text:t,inFence:s}){const[i,l]=r.useState(t),c=r.useRef(0),a=r.useRef(null);return r.useEffect(()=>{if(s)return;const n=Date.now()-c.current,o=()=>{c.current=Date.now(),l(t)};if(n>=ls){o();return}return a.current=setTimeout(o,ls-n),()=>{a.current&&clearTimeout(a.current)}},[t,s]),s?e.jsx("div",{className:"codeblock",children:e.jsx("pre",{children:e.jsx("code",{children:t})})}):e.jsx(Os,{text:i})}const Ti=r.memo(function({text:s}){const{frozen:i,active:l,inFence:c}=r.useMemo(()=>Ni(s),[s]);return e.jsxs("div",{className:"md",children:[i.map((a,n)=>e.jsx(Ci,{text:a},n)),l.length>0&&e.jsx(Si,{text:l,inFence:c},i.length)]})});function Ei({thinking:t,streaming:s,wrap:i=!0}){const l=he(),[c,a]=r.useState(null),n=c??i,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:()=>a(!n),children:[n?e.jsx(_e,{}):e.jsx(ct,{}),e.jsx(lt,{className:"thinking-icon"}),e.jsx("span",{className:"thinking-label",children:s&&n?e.jsxs("span",{className:"thinking-live-label",children:[l("thinkingNow"),e.jsx("span",{className:"dots"})]}):n?l("thinking"):l("thinkingPreview",{preview:o})})]}),n&&e.jsx("div",{className:"thinking-body",children:t})]})}const Mi={bash:"$",read:"📄",write:"✍️",edit:"✏️",grep:"🔍",find:"🧭",ls:"📂"};function Ri(t){return Mi[t]??"🛠"}const Pi=r.memo(function({block:s,view:i,onKillBash:l}){var E,T,b,k;const c=he(),[a,n]=r.useState(!0),[o,d]=r.useState(!1),m=!i.result&&i.streaming&&!i.status,x=s.name==="bash"&&m,g=i.result!==void 0,v=!i.result&&!!i.status,w=((E=i.result)==null?void 0:E.isError)??((T=i.status)==null?void 0:T.isError)??!1,R=i.result?i.result.content.map(u=>u.type==="text"?u.text:"").join(""):i.liveOutput??"",C=w?"err":g?"ok":m||v?"run":"idle";let P=c(w?"error":g?"done":m?"running":v?"toolDoneWaitingModel":"toolQueued");const B=v&&((b=i.status)==null?void 0:b.durationMs)!==void 0?Ii(i.status.durationMs):"";v&&B&&(P=`${P} · ${B}`);const F=v&&((k=i.status)==null?void 0:k.exitCode)!==void 0?`exit ${i.status.exitCode}`:"",p=()=>{s.argumentsText&&(navigator.clipboard.writeText(s.argumentsText),d(!0),setTimeout(()=>d(!1),1200))};return e.jsxs("div",{className:`toolcall ${C}`,children:[e.jsxs("div",{className:"toolcall-head",children:[e.jsx("span",{className:"toolcall-icon",children:Ri(s.name)}),e.jsx("span",{className:"toolcall-name",children:s.name}),e.jsxs("span",{className:"toolcall-status",children:[P,F&&e.jsx("em",{className:"toolcall-exit",children:F})]}),e.jsx("span",{className:"toolcall-spacer"}),x&&l&&e.jsxs("button",{type:"button",className:"toolcall-kill",title:c("stopBashTip"),onClick:l,children:[e.jsx(st,{}),e.jsx("span",{children:c("stopBash")})]}),e.jsx("button",{type:"button",className:"toolcall-copy",title:c("copyArgs"),onClick:p,children:o?e.jsx(_n,{}):e.jsx(Mt,{})}),e.jsx("button",{type:"button",className:"toolcall-toggle",onClick:()=>n(u=>!u),children:a?e.jsx(_e,{}):e.jsx(ct,{})})]}),a&&e.jsxs("div",{className:"toolcall-body",children:[s.argumentsText&&e.jsx("div",{className:"toolcall-args",children:s.name==="bash"&&s.argumentsText.startsWith("{")?e.jsx(Li,{args:s.argumentsText}):e.jsx("pre",{children:s.argumentsText})}),R.length>0&&e.jsxs("div",{className:"toolcall-output",children:[e.jsxs("div",{className:"toolcall-output-label",children:[c(w?"errorOutput":"output"),(m||v)&&e.jsx("span",{className:"cursor"})]}),e.jsx("pre",{children:R})]}),m&&R.length===0&&e.jsxs("div",{className:"toolcall-waiting",children:[e.jsx("span",{className:"cursor"})," ",c("waitingOutput")]}),v&&R.length===0&&e.jsxs("div",{className:"toolcall-waiting",children:[e.jsx("span",{className:"cursor"})," ",c("waitingModel")]})]})]})});function Li({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 Ii(t){if(t===void 0)return"";const s=t/1e3;if(s<60)return`${s.toFixed(1)}s`;const i=Math.floor(s/60),l=Math.round(s%60);return`${i}m ${String(l).padStart(2,"0")}s`}const Bi=/^<skill name="([^"]+)" location="([^"]+)">\n([\s\S]*?)\n<\/skill>(?:\n\n([\s\S]+))?$/;function Lt(t){var i;const s=t.match(Bi);return s?{name:s[1],location:s[2],content:s[3],userMessage:((i=s[4])==null?void 0:i.trim())||void 0}:null}const Di=1568,$i=2*1024*1024;function Me(t){return t.startsWith("image/")&&t!=="image/svg+xml"&&t!=="image/svg"}async function Ws(t){if(!t.type.startsWith("image/"))return null;let s;try{s=await createImageBitmap(t,{imageOrientation:"from-image"})}catch{return null}try{const i=Math.min(1,Di/Math.max(s.width,s.height)),l=Math.max(1,Math.round(s.width*i)),c=Math.max(1,Math.round(s.height*i)),a=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 a){const m=document.createElement("canvas");m.width=l,m.height=c;const x=m.getContext("2d");if(!x)continue;o!=="image/png"&&(x.fillStyle="#ffffff",x.fillRect(0,0,l,c)),x.drawImage(s,0,0,l,c);const g=m.toDataURL(o,d),v=g.match(/^data:([^;]+);base64,/),w=v?v[1]:o,R=g.replace(/^data:[^;]*;base64,/,""),C=Math.floor(R.length*3/4);if(n={data:R,mimeType:w,name:t.name,size:C},C<=$i)return n}return n}finally{s.close()}}const _i=20*1024*1024;function Je(t){return t.type==="text"&&typeof t.text=="string"?t:null}function Hs(t){return t.type==="thinking"&&typeof t.thinking=="string"?t:null}function Us(t){return t.type==="toolCall"&&typeof t.id=="string"&&typeof t.name=="string"?t:null}function qs(t){return t.type==="image"&&typeof t.dataUrl=="string"?t:null}function zs(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 Ai(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 i=t.path.split("/").pop()??t.path;return t.mode==="lines"&&t.lines?s("attachLines",{path:i,start:t.lines.start,end:t.lines.end}):t.mode==="reference"?s("refOnly",{path:i}):s("attachContent",{path:i})}const os=r.memo(function({message:s,toolResults:i,liveOutputs:l,toolStatuses:c,streaming:a,isLast:n,onEdit:o,onKillBash:d,onCollapse:m,questionAttachments:x,qnIndex:g,qnActive:v,onJump:w,thinkingWrap:R}){const C=he(),[P,B]=r.useState(!1),[F,p]=r.useState(""),[E,T]=r.useState([]),[b,k]=r.useState(!1),[u,$]=r.useState(null),W=M=>{$(M),window.setTimeout(()=>$(q=>q===M?null:q),4e3)};if(s.role==="toolResult")return null;const J=s.role==="custom"&&s.customType==="file",re=s.content.map(M=>{var q;return((q=Je(M))==null?void 0:q.text)??""}).filter(Boolean).join(`
10
- `),V=s.role==="user"?Lt(re):null,oe=V?V.userMessage??`skill:${V.name}`:re.split(`
11
- `).join(" ").trim(),I=a&&n&&s.content.length===0,A=s.role==="user"&&!a&&!I&&!!o,H=async M=>{const q=[];for(const ce of M){if(!Me(ce.type))continue;const f=await Ws(ce);f&&q.push({path:"",imageData:f.data,mimeType:f.mimeType,name:f.name})}q.length>0&&T(ce=>[...ce,...q])},ae=async M=>{if(M.size>_i){W(C("fileTooLarge",{name:M.name,size:20}));return}let q;try{q=(await new Promise((f,D)=>{const Y=new FileReader;Y.onload=()=>f(Y.result),Y.onerror=()=>D(Y.error??new Error("read failed")),Y.readAsDataURL(M)})).replace(/^data:[^;]*;base64,/,"")}catch{W(C("fileLoadFailed",{name:M.name}));return}T(ce=>[...ce,{path:"",fileData:q,name:M.name,size:M.size,mimeType:M.type||void 0}])},pe=async M=>{const q=[];for(const ce of M)Me(ce.type)?q.push(ce):ae(ce);q.length>0&&await H(q)},L=()=>{p(V?`/skill:${V.name}${V.userMessage?` ${V.userMessage}`:""}`:s.content.map(M=>{var q;return((q=Je(M))==null?void 0:q.text)??""}).filter(Boolean).join(`
12
- `)),T(x??[]),B(!0)},j=()=>{const M=F.trim();M&&(o==null||o(s.id,M,E.length>0?E:void 0),B(!1))},G=s.role==="custom"&&(s.customType==="goal-review"||s.customType==="goal-wizard"),U=s.role==="custom"&&s.customType==="goal-wizard";return e.jsxs("div",{className:`msg msg-${s.role}${G?" 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"?U?C("goalWizardCard"):G?C("goalBarTitle"):s.customType==="file"?C("attachment"):`${C("plugin")} · ${s.customType??C("unknown")}`:Ks(s.role,C)}),s.model&&e.jsx("span",{className:"msg-model",children:s.model}),s.timestamp&&e.jsx("span",{className:"msg-time",children:Ui(s.timestamp)}),m&&e.jsxs("button",{type:"button",className:"msg-collapse-btn",title:C("collapseMsg"),onClick:()=>m(s.id),children:[e.jsx(ot,{})," ",C("collapseMsg")]}),g!==void 0&&w&&e.jsxs("button",{type:"button",className:`qn-tag ${v?"active":""}`,title:`${g+1}. ${oe}`,"aria-label":`${g+1}. ${oe}`,onClick:()=>w(s.id),children:[e.jsx("span",{className:"qn-tag-bar"}),e.jsx("span",{className:"qn-tag-idx",children:g+1})]})]}),e.jsx("div",{className:"msg-body",children:P?e.jsxs("div",{className:`msg-editor${b?" drag-over":""}`,onDragOver:M=>{M.preventDefault(),M.stopPropagation(),k(!0)},onDragLeave:M=>{M.currentTarget.contains(M.relatedTarget)||k(!1)},onDrop:M=>{var q;M.preventDefault(),M.stopPropagation(),k(!1),pe(Array.from(((q=M.dataTransfer)==null?void 0:q.files)??[]))},children:[E.length>0&&e.jsx("div",{className:"msg-editor-images",children:E.map((M,q)=>{var f;const ce=Fi(M);return e.jsxs("span",{className:`msg-editor-img ${ce==="image"?"":"file-chip"}`,title:Ai(M,C),children:[ce==="image"?e.jsx("img",{src:`data:${M.mimeType??"image/png"};base64,${M.imageData}`,alt:M.name}):e.jsxs("span",{className:"msg-editor-file",children:[e.jsx("span",{className:"msg-editor-file-icon",children:ce==="path"?M.mode==="reference"?"🔗":"📎":"📄"}),e.jsx("span",{className:"msg-editor-file-name",children:M.name??((f=M.path)==null?void 0:f.split("/").pop())})]}),e.jsx("button",{type:"button",className:"msg-editor-img-remove",title:C("removeAttachment"),onClick:()=>T(D=>D.filter((Y,h)=>h!==q)),children:e.jsx(Ne,{})})]},`${M.name??M.path??"att"}-${q}`)})}),u&&e.jsx("div",{className:"msg-editor-notice",children:u}),e.jsx("textarea",{className:"msg-editor-input",value:F,autoFocus:!0,placeholder:C("editPlaceholder"),rows:Math.max(2,Math.min(10,F.split(`
13
- `).length+1)),onChange:M=>p(M.target.value),onPaste:M=>{var ce;const q=[];for(const f of((ce=M.clipboardData)==null?void 0:ce.items)??[])if(f.kind==="file"&&Me(f.type)){const D=f.getAsFile();D&&q.push(D)}q.length!==0&&(M.preventDefault(),H(q))},onKeyDown:M=>{M.key==="Enter"&&(M.metaKey||M.ctrlKey)?(M.preventDefault(),j()):M.key==="Escape"&&B(!1)}}),e.jsxs("div",{className:"msg-editor-actions",children:[e.jsxs("span",{className:"msg-editor-hint",children:[e.jsx(Ln,{})," ",C("editAttachmentHint")]}),e.jsx("button",{type:"button",className:"chip",onClick:()=>B(!1),children:C("cancel")}),e.jsxs("button",{type:"button",className:"chip primary",disabled:!F.trim(),title:C("reaskFromHere"),onClick:j,children:[e.jsx(jt,{})," ",C("reaskFromHere")]})]})]}):e.jsxs(e.Fragment,{children:[s.errorMessage&&e.jsx("div",{className:"msg-error",children:s.errorMessage}),J?e.jsx(Oi,{message:s}):V?e.jsxs(e.Fragment,{children:[e.jsx(Hi,{block:V}),V.userMessage&&e.jsx("div",{className:"msg-text",children:e.jsx(mt,{text:V.userMessage})}),s.content.map((M,q)=>M.type==="text"?null:e.jsx(ds,{block:M,toolResults:i,liveOutputs:l,toolStatuses:c,streaming:a,isLast:n,onKillBash:d,thinkingWrap:R},`${s.id}-${q}`))]}):s.content.map((M,q)=>e.jsx(ds,{block:M,toolResults:i,liveOutputs:l,toolStatuses:c,streaming:a,isLast:n,onKillBash:d,thinkingWrap:R},`${s.id}-${q}`)),I&&e.jsxs("div",{className:"thinking-wait",children:[C("thinkingWait"),e.jsx("span",{className:"dot"})]}),a&&n&&!I&&e.jsx("span",{className:"stream-cursor"})]})}),A&&!P&&e.jsx("div",{className:"msg-actions",children:e.jsxs("button",{type:"button",className:"msg-action",title:C("editReaskTip"),onClick:L,children:[e.jsx(jt,{})," ",C("editReask")]})})]})});function Oi({message:t}){const s=he(),[i,l]=r.useState(!1),c=t.details??{},a=c.name??c.path??s("attachment"),n=c.type==="folder",o=c.mode==="reference",d=c.mode==="bridged",m=t.content.filter(w=>w.type==="text").map(w=>w.text).join(`
14
- `),x=Wi(m),g=t.content.find(w=>w.type==="image"),v=x.split(`
15
- `).length;return e.jsxs("div",{className:`attachcard ${o?"reference":""}`,children:[e.jsxs("button",{type:"button",className:"attachcard-head",onClick:()=>l(w=>!w),children:[e.jsx("span",{className:"attachcard-icon",children:n?"📁":"📎"}),e.jsx("span",{className:"attachcard-name",children:a}),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")} · ${cs(c.size)}`:d?s("bridgedVision"):g?s("image"):c.mode==="lines"?s("inlineLinesRange",{start:c.startLine??1,end:c.endLine??c.lines??1}):s("inlineLines",{n:c.lines??v})}),!o&&(i?e.jsx(_e,{}):e.jsx(ct,{}))]}),!o&&i&&(d?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"attachcard-bridgenote",children:s("bridgedVisionDetail")}),(g==null?void 0:g.dataUrl)&&e.jsx("div",{className:"attachcard-image",children:e.jsx("img",{src:g.dataUrl,alt:a})}),x&&e.jsx("pre",{className:"attachcard-content",children:x})]}):g!=null&&g.dataUrl?e.jsx("div",{className:"attachcard-image",children:e.jsx("img",{src:g.dataUrl,alt:a})}):e.jsx("pre",{className:"attachcard-content",children:x})),o&&e.jsx("div",{className:"attachcard-refnote",children:n?s("folderNotExpanded"):s("fileNotExpanded",{size:cs(c.size)})})]})}function cs(t){return t===void 0?"":t>=1024*1024?`${(t/(1024*1024)).toFixed(1)} MB`:t>=1024?`${Math.round(t/1024)} KB`:`${t} B`}function Wi(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 i=t.match(/^\s*<vision-bridge>\s*([\s\S]*?)\s*<\/vision-bridge>\s*$/);return i?i[1].trim():t.trim()}function Hi({block:t}){const s=he(),[i,l]=r.useState(!1);return e.jsxs("div",{className:`skillcard${i?" 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(An,{})}),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:[i?e.jsx(ot,{}):e.jsx(_e,{}),s(i?"collapseMsg":"expandMsg")]})]}),i&&e.jsx("div",{className:"skillcard-body",children:e.jsx(mt,{text:t.content})})]})}function ds({block:t,toolResults:s,liveOutputs:i,toolStatuses:l,streaming:c,isLast:a,onKillBash:n,thinkingWrap:o}){const d=he(),m=Je(t);if(m){const R=c&&a;return e.jsxs("div",{className:"msg-text",children:[R?e.jsx(Ti,{text:m.text}):e.jsx(mt,{text:m.text}),m.truncated&&e.jsx("div",{className:"trunc-note",children:d("truncated")})]})}const x=Hs(t);if(x)return e.jsx(Ei,{thinking:x.thinking,streaming:c&&a,wrap:o});const g=Us(t);if(g){const R=s.get(g.id),C=i.get(g.id),P={result:R,liveOutput:C==null?void 0:C.text,streaming:c,status:l.get(g.id)};return e.jsx(Pi,{block:g,view:P,onKillBash:n})}const v=qs(t);if(v&&v.dataUrl)return e.jsx("div",{className:"msg-image",children:e.jsx("img",{src:v.dataUrl,alt:"attachment"})});const w=zs(t);return w?e.jsxs("div",{className:"bashblock",children:[e.jsxs("div",{className:"bashblock-command",children:[e.jsx("span",{className:"bashblock-prompt",children:"$"}),e.jsx("code",{children:w.command}),w.exitCode!==void 0&&e.jsx("span",{className:`bashblock-exit ${w.exitCode===0?"ok":"err"}`,children:d("exitCode",{code:w.exitCode})}),w.cancelled&&e.jsx("span",{className:"bashblock-exit err",children:d("cancelled")})]}),w.output&&e.jsx("pre",{className:"bashblock-output",children:w.output}),w.truncated&&e.jsx("div",{className:"trunc-note",children:d("outputTruncated")})]}):null}function Ks(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 Ui(t){const s=new Date(t),i=String(s.getHours()).padStart(2,"0"),l=String(s.getMinutes()).padStart(2,"0");return`${i}:${l}`}function us(t,s,i){let l=!1;for(const c of s){const a=c;if(a.type!=="image"||typeof a.dataUrl!="string"||!a.dataUrl.startsWith("data:"))continue;const n=a.dataUrl.match(/^data:([^;]*);base64,(.+)$/);n&&(l=!0,t.push({path:"",imageData:n[2],mimeType:n[1]||"image/png",name:i??`image.${(n[1]||"image/png").split("/")[1]??"png"}`}))}return l}function qi(t){const s=new Map;for(let i=0;i<t.length;i++){const l=t[i];if(l.role!=="user"||!l.id)continue;const c=[];us(c,l.content);for(let a=i+1;a<t.length&&t[a].role==="custom"&&t[a].customType==="file";a++){const n=t[a].details??{};if(!us(c,t[a].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 zi=r.memo(function({message:s,onExpand:i}){const l=he();let c="";for(const g of s.content){const v=Je(g);if(v&&v.text.trim()){const w=Lt(v.text);w?c=`skill:${w.name}`+(w.userMessage?` · ${w.userMessage.replace(/\s+/g," ").trim()}`:""):c=v.text.replace(/\s+/g," ").trim();break}}if(!c&&s.role==="custom"&&s.customType==="file"){const g=s.details??{};c=g.name??g.path??""}c.length>90&&(c=`${c.slice(0,90)}…`);let n=0,o=0,d=0,m=0;for(const g of s.content)Hs(g)?n++:Us(g)?o++:zs(g)?d++:qs(g)&&m++;const x=[];return n&&x.push(`${l("thinking")} ${n}`),o&&x.push(`${l("toolCalls")} ${o}`),d&&x.push(`${l("bashRuns")} ${d}`),m&&x.push(`${l("images")} ${m}`),e.jsxs("button",{type:"button",className:"msg-collapsed","data-msg-id":s.id,title:`${l("expandMsg")} · ${c||x.join(" · ")||s.role}`,onClick:()=>i(s.id),children:[e.jsx("span",{className:`msg-collapsed-role role-${s.role}`,children:s.role==="custom"&&s.customType==="file"?l("attachment"):Ks(s.role,l)}),e.jsxs("span",{className:"msg-collapsed-body",children:[c&&e.jsx("span",{className:"msg-collapsed-preview",children:c}),x.length>0&&e.jsx("span",{className:"msg-collapsed-chips",children:x.map((g,v)=>e.jsx("span",{className:"msg-collapsed-chip",children:g},v))})]}),s.timestamp?e.jsx("span",{className:"msg-collapsed-time",children:Ki(s.timestamp)}):null,e.jsxs("span",{className:"msg-collapsed-action",children:[e.jsx(_e,{})," ",l("expandMsg")]})]})});function Ki(t){const s=new Date(t),i=String(s.getHours()).padStart(2,"0"),l=String(s.getMinutes()).padStart(2,"0");return`${i}:${l}`}const Vi=r.memo(function({id:s,show:i,height:l,containerRef:c,onMeasured:a,lazyRef:n,children:o}){const d=r.useRef(null),m=r.useRef(null);return r.useLayoutEffect(()=>{const x=m.current;if(m.current=i,!i||x!==!1)return;const g=d.current,v=c.current;if(!g||!v)return;const w=g.offsetHeight;a==null||a(s,w);const R=w-l;if(R!==0){const C=g.parentElement;C&&C.getBoundingClientRect().bottom<=v.getBoundingClientRect().top&&(v.scrollTop+=R)}},[i]),i?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 Gi(t,s,i,l){const c=[],a=[];let n=0;for(const o of t){if(i.has(o.id))continue;o.top<s.bottom&&o.bottom>s.top?l.has(o.id)&&c.push(o.id):l.has(o.id)||(a.push(o.id),o.bottom<=s.top&&(n+=o.bottom-o.top))}return{show:c,hide:a,shrinkAbove:n}}function Ji(t,s){if(s.show.length===0&&s.hide.length===0)return t;const i=new Set(t);for(const l of s.show)i.delete(l);for(const l of s.hide)i.add(l);return i}function Qi(t,s,i){const l=new Set;let c=0;for(let a=t.length-1;a>=0&&!(a<t.length-1&&c>=i);a--){const n=t[a];l.add(n.id),c+=s.get(n.id)??Vs(n.role,n.customType)}return l}function Vs(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 Yi(t){if(t.role==="toolResult")return"";const s=[];for(const i of t.content)Xi(i,s);return t.errorMessage&&s.push(t.errorMessage),s.join(`
16
- `)}function Xi(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 Zi(t,s){const i=s.trim().toLowerCase();if(!i)return 0;const l=t.toLowerCase();let c=0,a=l.indexOf(i);for(;a!==-1;)c++,a=l.indexOf(i,a+i.length);return c}function ea(t,s){const i=s.trim().toLowerCase();if(!i)return[];const l=[];for(const c of t){const a=Yi(c);if(!a)continue;const n=Zi(a,i);for(let o=0;o<n;o++)l.push({messageId:c.id,occurrence:o})}return l}function ta(t,s){var n;const i=new Map,l=[],c=s.toLowerCase();if(!c)return{byMsg:i,all:l};const a=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=a.nextNode();o;o=a.nextNode()){const d=(o.textContent??"").toLowerCase(),m=(n=o.parentElement)==null?void 0:n.closest("[data-msg-id]");if(!m)continue;const x=m.getAttribute("data-msg-id")??"";let g=d.indexOf(c);for(;g!==-1;){const v=document.createRange();v.setStart(o,g),v.setEnd(o,g+c.length),l.push(v);const w=i.get(x);w?w.push(v):i.set(x,[v]),g=d.indexOf(c,g+c.length)}}return{byMsg:i,all:l}}function We(t,s){const i=CSS;if(!i.highlights)return;if(s.length===0){i.highlights.delete(t);return}const l=window.Highlight;l&&i.highlights.set(t,new l(...s))}function sa({containerRef:t,messages:s,open:i,onClose:l,onEnsureExpanded:c}){const a=he(),n=r.useRef(null),[o,d]=r.useState(""),[m,x]=r.useState(0),g=r.useDeferredValue(o),v=i?g.trim():"",w=r.useMemo(()=>i?ea(s,v):[],[s,v,i]),R=r.useRef(w);R.current=w;const C=r.useRef(m);C.current=m,r.useEffect(()=>{i&&(x(0),requestAnimationFrame(()=>{var p;return(p=n.current)==null?void 0:p.select()}))},[i]),r.useEffect(()=>{if(!i)return;const p=E=>{E.key==="Escape"&&(E.preventDefault(),E.stopPropagation(),l())};return window.addEventListener("keydown",p,!0),()=>window.removeEventListener("keydown",p,!0)},[i,l]),r.useEffect(()=>(i||(We("msg-search",[]),We("msg-search-active",[])),()=>{We("msg-search",[]),We("msg-search-active",[])}),[i]);const P=r.useCallback(p=>{const E=t.current;if(!E)return;const T=E.querySelector(`[data-msg-id="${p}"]`);T&&(T.classList.remove("msg-flash"),T.offsetWidth,T.classList.add("msg-flash"))},[t]);r.useLayoutEffect(()=>{if(!i||!v)return;const p=t.current;if(!p)return;let E=!1,T=0;return T=requestAnimationFrame(()=>{var J;if(E)return;const{byMsg:b,all:k}=ta(p,v);We("msg-search",k);const u=R.current,$=u[Math.min(C.current,u.length-1)];if(!$)return;const W=(J=b.get($.messageId))==null?void 0:J[$.occurrence];if(W){We("msg-search-active",[W]);const re=W.startContainer.parentElement??p.querySelector(`[data-msg-id="${$.messageId}"]`);re==null||re.scrollIntoView({block:"center"})}else P($.messageId)}),()=>{E=!0,cancelAnimationFrame(T)}},[i,v,w,t,P]);const B=r.useCallback(p=>{const E=R.current;if(E.length===0)return;const T=(C.current+p+E.length)%E.length;x(T),c(E[T].messageId)},[c]);if(!i)return null;const F=w.length;return e.jsxs("div",{className:"search-bar",role:"search",children:[e.jsx("input",{ref:n,className:"search-input",type:"text",value:o,placeholder:a("searchPlaceholder"),onChange:p=>{d(p.target.value),x(0)},onKeyDown:p=>{p.key==="Enter"&&(p.preventDefault(),B(p.shiftKey?-1:1))}}),e.jsx("span",{className:`search-count ${F===0?"empty":""}`,children:F===0?a("searchNoResults"):`${Math.min(m+1,F)}/${F}`}),e.jsx("button",{type:"button",className:"search-btn",title:a("searchPrev"),disabled:F===0,onClick:()=>B(-1),children:e.jsx(ot,{})}),e.jsx("button",{type:"button",className:"search-btn",title:a("searchNext"),disabled:F===0,onClick:()=>B(1),children:e.jsx(_e,{})}),e.jsx("button",{type:"button",className:"search-btn",title:a("searchClose"),onClick:l,children:e.jsx(Ne,{})})]})}const ms=new Map,na=15,ps=30,hs=1200,ia=1600;function gs(t){return t.content.some(s=>s.type==="toolCall")}const aa=[{key:"ex.understand",icon:"🔍"},{key:"ex.debug",icon:"🐛"},{key:"ex.test",icon:"🧪"},{key:"ex.review",icon:"🧹"}];function ra(t){return aa.map(({key:s,icon:i})=>({icon:i,text:t(s),prompt:t(`${s}.prompt`)}))}function la({state:t,liveOutputs:s,toolStatuses:i,onEdit:l,onKillBash:c,thinkingWrap:a}){const n=he(),o=r.useRef(null),[d,m]=r.useState(!0),x=r.useRef(!0),g=r.useRef(0),v=r.useRef(!1),[w,R]=r.useState(()=>new Set),[C,P]=r.useState(!1),B=t.streamingMessage?[...t.messages,t.streamingMessage]:t.messages,F=r.useMemo(()=>{const N=new Map;for(const _ of t.messages)_.role==="toolResult"&&_.toolCallId&&N.set(_.toolCallId,_);return N},[t.messages]),p=r.useMemo(()=>qi(t.messages),[t.messages]),E=B.length>0?B[B.length-1].id:null,T=t.messages.length>ps?Math.max(0,t.messages.length-na):0,[b,k]=r.useState(()=>new Set),[u,$]=r.useState(()=>new Set),W=r.useRef(new Map),J=r.useRef(new Map),re=r.useRef(0),V=r.useRef(b);V.current=b;const oe=t.messages.length>ps&&!C,I=r.useRef(oe);I.current=oe;const A=Qi(t.messages,W.current,ia),H=r.useRef(A);H.current=A;const ae=r.useCallback(()=>{const N=o.current;if(!N)return;if(!I.current){k(ge=>ge.size?new Set:ge);return}const _=N.getBoundingClientRect(),le={top:_.top-hs,bottom:_.bottom+hs},ne=[];for(const[ge,y]of J.current){const ie=y.getBoundingClientRect();ne.push({id:ge,top:ie.top,bottom:ie.bottom}),V.current.has(ge)||W.current.set(ge,ie.bottom-ie.top)}const ue=Gi(ne,le,H.current,V.current);for(const ge of ue.hide){const y=J.current.get(ge);y&&W.current.set(ge,y.offsetHeight)}k(ge=>Ji(ge,ue))},[]),pe=r.useCallback(()=>{re.current||(re.current=requestAnimationFrame(()=>{re.current=0,ae()}))},[ae]);r.useLayoutEffect(()=>{ae()},[ae]);const L=r.useRef(C);r.useLayoutEffect(()=>{L.current&&!C&&ae(),L.current=C},[C,ae]);const j=r.useCallback((N,_)=>{W.current.set(N,_)},[]),G=r.useCallback(N=>{N&&J.current.set(N.dataset.lazyId??"",N)},[]);r.useEffect(()=>{const N=new Set(t.messages.map(_=>_.id));for(const[_,le]of J.current)N.has(_)||(J.current.delete(_),W.current.delete(_));k(_=>{let le=!1;const ne=new Set;for(const ue of _)N.has(ue)?ne.add(ue):le=!0;return le?ne:_})},[t.messages,w]),r.useEffect(()=>()=>cancelAnimationFrame(re.current),[]);const U=r.useMemo(()=>{const N=[];for(const _ of t.messages){if(_.role!=="user")continue;const le=_.content.map(ge=>{var y;return((y=Je(ge))==null?void 0:y.text)??""}).filter(Boolean).join(" "),ne=Lt(le),ue=ne?ne.userMessage??`skill:${ne.name}`:le.trim();ue&&N.push({id:_.id,text:ue})}return N},[t.messages]),M=r.useMemo(()=>{const N=new Map;return U.forEach((_,le)=>N.set(_.id,le)),N},[U]),[q,ce]=r.useState(-1),f=r.useRef(-1),D=r.useRef(U);r.useEffect(()=>{D.current=U},[U]);const Y=r.useCallback(()=>{const N=o.current,_=D.current;if(!N||_.length===0)return;const le=N.getBoundingClientRect().top,ne=140;let ue=-1;for(let ge=0;ge<_.length;ge++){const y=N.querySelector(`[data-msg-id="${_[ge].id}"]`);if(y)if(y.getBoundingClientRect().top<=le+ne)ue=ge;else break}ue!==f.current&&(f.current=ue,ce(ue))},[]);r.useEffect(()=>{Y()},[U,Y]);const h=r.useCallback(N=>{R(_=>_.has(N)?_:new Set(_).add(N))},[]),z=r.useCallback(N=>{const _=t.messages.findIndex(le=>le.id===N);_>=0&&_<T&&!w.has(N)&&as.flushSync(()=>h(N))},[t.messages,T,w,h]);r.useEffect(()=>{const N=_=>{if(!(_.ctrlKey||_.metaKey)||_.key.toLowerCase()!=="f")return;const le=_.target;le&&(le.tagName==="INPUT"||le.tagName==="TEXTAREA"||le.isContentEditable)||(_.preventDefault(),P(!0))};return window.addEventListener("keydown",N),()=>window.removeEventListener("keydown",N)},[]);const Q=r.useCallback(N=>{R(_=>{if(!_.has(N))return _;const le=new Set(_);return le.delete(N),le})},[]),Z=r.useCallback(N=>{const _=t.messages.findIndex(ne=>ne.id===N);as.flushSync(()=>{_>=0&&_<T&&!w.has(N)&&h(N),$(ne=>ne.has(N)?ne:new Set(ne).add(N))});const le=D.current.findIndex(ne=>ne.id===N);f.current=le,ce(le),requestAnimationFrame(()=>{var ue,ge,y;const ne=(ue=o.current)==null?void 0:ue.querySelector(`[data-msg-id="${N}"]`);ne&&((ge=o.current)==null||ge.querySelectorAll(".msg-flash").forEach(ie=>ie.classList.remove("msg-flash")),ne.scrollIntoView({block:"start"}),ne.classList.remove("msg-flash"),ne.offsetWidth,ne.classList.add("msg-flash"),ne!==((y=o.current)==null?void 0:y.lastElementChild)&&(v.current=!0))})},[t.messages,T,w,h]),me=r.useCallback(()=>{const N=o.current;if(!N)return;const _=N.scrollTop-g.current;g.current=N.scrollTop;const le=N.scrollHeight-N.scrollTop-N.clientHeight<80;_<-4&&_>-500?v.current=!0:le&&_>=0&&(v.current=!1),x.current=le&&!v.current,m(x.current),Y(),pe()},[Y,pe]),ve=r.useRef(!1);r.useEffect(()=>{const N=ve.current;if(ve.current=!!t.isStreaming,N&&!t.isStreaming&&!v.current){const _=()=>{const ne=o.current;ne&&!v.current&&(ne.scrollTop=ne.scrollHeight,x.current=!0,m(!0))};requestAnimationFrame(()=>requestAnimationFrame(_));const le=setTimeout(_,180);return()=>clearTimeout(le)}},[t.isStreaming]),r.useEffect(()=>{const N=o.current;N&&x.current&&(N.scrollTop=N.scrollHeight)},[B,t.isStreaming,s]);const X=t.queue.steering.join("\0")+""+t.queue.followUp.join("\0");r.useEffect(()=>{const N=o.current;N&&x.current&&(N.scrollTop=N.scrollHeight)},[X]);const de=r.useCallback(()=>{const N=o.current;N&&(N.scrollTop=N.scrollHeight),x.current=!0,v.current=!1,m(!0)},[]),se=r.useRef(null);r.useEffect(()=>{const N=se.current,_=o.current;if(!N||!_)return;const le=ne=>{ne.preventDefault();const ue=N.querySelector(".qn-list");if(ue&&ue.contains(ne.target)&&ue.scrollHeight>ue.clientHeight){ue.scrollTop+=ne.deltaY;return}_.scrollTop+=ne.deltaY};return N.addEventListener("wheel",le,{passive:!1}),()=>N.removeEventListener("wheel",le)},[]);const[Ce,Re]=r.useState(0);r.useEffect(()=>{const N=()=>{var _;Re(((_=o.current)==null?void 0:_.clientHeight)??0),pe()};return N(),window.addEventListener("resize",N),()=>window.removeEventListener("resize",N)},[pe]);const Ee=U.length,Fe=r.useMemo(()=>Ee===0?27:Math.max(4,Math.min(27,Math.floor(((Ce||600)-16)/Ee)-3)),[Ee,Ce]),Ae=Fe<20;return e.jsxs("div",{className:"messages-wrap",children:[e.jsxs("div",{className:"messages",ref:o,onScroll:me,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:n("welcomeTitle")}),e.jsx("p",{className:"empty-sub",children:n("welcomeSub")}),e.jsxs("div",{className:"empty-cwd",children:[e.jsx("span",{className:"empty-cwd-label",children:n("directory")}),e.jsx("span",{className:"empty-cwd-path",children:t.cwd})]}),e.jsx("div",{className:"empty-examples",children:ra(n).map(N=>e.jsxs("button",{type:"button",className:"empty-example",title:n("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 le=_<T,ne=le&&w.has(N.id);if(le&&!ne)return N.role==="toolResult"?null:e.jsx(zi,{message:N,onExpand:h},N.id);const ue=N.role==="user"?M.get(N.id):void 0,ge=!oe||A.has(N.id)||u.has(N.id)||!b.has(N.id);return e.jsx(Vi,{id:N.id,show:ge,height:W.current.get(N.id)??Vs(N.role,N.customType),containerRef:o,onMeasured:j,lazyRef:G,children:e.jsx(os,{message:N,qnIndex:ue,qnActive:ue!==void 0?ue===q:void 0,onJump:Z,toolResults:F,liveOutputs:gs(N)?s:ms,toolStatuses:i,streaming:t.isStreaming,onKillBash:c,thinkingWrap:a,isLast:N.id===E,onEdit:l,questionAttachments:p.get(N.id),onCollapse:ne?Q:void 0},N.id)},N.id)}),t.streamingMessage&&e.jsx(os,{message:t.streamingMessage,toolResults:F,liveOutputs:gs(t.streamingMessage)?s:ms,toolStatuses:i,streaming:!0,isLast:!0,onEdit:l,onKillBash:c,thinkingWrap:a},t.streamingMessage.id),t.isStreaming&&B.length===0&&e.jsx("div",{className:"streaming-wait",children:n("waitingResponse")}),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:n("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:n("queueFollowTag")}),e.jsx("div",{className:"queued-text",children:N})]})},`q-fu-${_}`))]}),!d&&e.jsxs("button",{type:"button",className:"scroll-bottom",onClick:de,children:[e.jsx(Ps,{})," ",n("backToBottom")]}),e.jsx(sa,{containerRef:o,messages:B,open:C,onClose:()=>P(!1),onEnsureExpanded:z}),U.length>0&&e.jsxs("div",{className:`qn-rail ${Ae?"many":""}`,ref:se,"aria-label":n("questionNavTitle"),style:{"--rail-gap":`${Fe}px`},children:[U.map((N,_)=>e.jsx("button",{type:"button",className:`qn-bar ${_===q?"active":""}`,"aria-label":`${_+1}. ${N.text}`,onClick:()=>Z(N.id),children:e.jsxs("span",{className:"qn-bar-text",children:[_+1,". ",N.text]})},N.id)),Ae&&e.jsx("div",{className:"qn-list",children:U.map((N,_)=>e.jsxs("button",{type:"button",className:`qn-list-item ${_===q?"active":""}`,"aria-label":`${_+1}. ${N.text}`,onClick:()=>Z(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 oa=r.memo(function({ready:s,streaming:i,messages:l,slashCommands:c,modelState:a,models:n,modelsLoading:o,send:d,attachments:m,onRemoveAttachment:x,onAddImageFiles:g,onAddLocalFiles:v,onNotice:w,onSent:R,onManageModels:C}){const P=he(),{locale:B}=Rt(),F=h=>B==="en"&&h.descriptionEn?h.descriptionEn:h.description??"",p=h=>B==="en"&&h.argumentHintEn?h.argumentHintEn:h.argumentHint??"",[E,T]=r.useState(""),[b,k]=r.useState(!1),[u,$]=r.useState(null),[W,J]=r.useState(0),[re,V]=r.useState(!1),[oe,I]=r.useState(void 0),A=r.useRef(null),H=r.useRef(null),ae=r.useRef(null),pe={builtin:P("slashBuiltin"),extension:P("slashExtension"),prompt:P("slashPrompt"),skill:P("slashSkill"),plugin:P("slashPlugin")},L=h=>{const z=h.match(/^\/([^\s]*)$/);if(z&&s){const Q=z[1].toLowerCase(),Z=c.filter(me=>me.name.toLowerCase().startsWith(Q));$(Z.length>0?Z:null),J(0)}else $(null)};r.useEffect(()=>{var z;const h=(z=ae.current)==null?void 0:z.querySelector(".slash-item.active");h==null||h.scrollIntoView({block:"nearest"})},[W,u]);const j=h=>{var ve;const z=u??[],Q=h??z[W%Math.max(z.length,1)];if(!Q){$(null);return}const Z=E.match(/^\/([^\s]*)([\s\S]*)$/),me=Z?Z[2]:"";T(`/${Q.name} ${me}`),$(null),(ve=A.current)==null||ve.focus()},G=async()=>{const z=[...l].reverse().find(Z=>Z.role==="assistant"&&Z.content.some(me=>me.type==="text"&&me.text)),Q=z==null?void 0:z.content.filter(Z=>Z.type==="text").map(Z=>Z.text).join(`
17
- `);if(!Q){w("warning",P("slashCopyEmpty"));return}try{await navigator.clipboard.writeText(Q),w("info",P("slashCopied"))}catch{w("error",P("slashCopyFailed"))}},U=h=>{if(!h||h.length===0){w("warning",P("foldersNotSupported"));return}const z=Array.from(h).filter(Z=>Me(Z.type)),Q=Array.from(h).filter(Z=>!Me(Z.type));z.length>0&&g(z),Q.length>0&&v(Q)},M=h=>{var Z;const z=(Z=h.clipboardData)==null?void 0:Z.items;if(!z)return;const Q=[];for(const me of z)if(me.kind==="file"&&Me(me.type)){const ve=me.getAsFile();ve&&Q.push(ve)}Q.length!==0&&(h.preventDefault(),g(Q))},q=s,ce=r.useRef(E);r.useEffect(()=>{ce.current=E},[E]),r.useEffect(()=>{L(ce.current)},[c]),r.useEffect(()=>{const h=z=>{var Z;const Q=z.detail;T(Q),(Z=A.current)==null||Z.focus()};return window.addEventListener("pi-web:fill",h),()=>window.removeEventListener("pi-web:fill",h)},[]),r.useEffect(()=>{if(!re)return;const h=z=>{z.key==="Escape"&&V(!1)};return window.addEventListener("keydown",h),()=>window.removeEventListener("keydown",h)},[re]),r.useEffect(()=>{const h=A.current;if(!h)return;h.style.height="auto";const z=h.scrollHeight>220;h.style.height=`${Math.min(h.scrollHeight,220)}px`,h.style.overflowY=z?"auto":"hidden"},[E]);const f=(h=!1)=>{var Z,me,ve,X,de;const z=E.trim(),Q=m.some(se=>se.imageData||se.fileData);if(!(!q||!z&&!Q)){if(z==="/help"){const se=(me=(Z=A.current)==null?void 0:Z.closest(".inputbox"))==null?void 0:me.getBoundingClientRect();I(se==null?void 0:se.width),V(!0),T(""),(ve=A.current)==null||ve.focus();return}if(z==="/copy"){T(""),(X=A.current)==null||X.focus(),G();return}d({type:"prompt",text:z,queue:h,attachments:m.map(se=>se.imageData?{path:"",imageData:se.imageData,mimeType:se.mimeType,name:se.name}:se.fileData?{path:"",fileData:se.fileData,mimeType:se.mimeType,name:se.name,size:se.size}:{path:se.path,mode:se.mode,...se.lines?{lines:se.lines}:{}})})&&(T(""),R(),(de=A.current)==null||de.focus())}},D=h=>{if(!h.nativeEvent.isComposing){if(u&&u.length>0)switch(h.key){case"ArrowDown":h.preventDefault(),J(z=>(z+1)%u.length);return;case"ArrowUp":h.preventDefault(),J(z=>(z-1+u.length)%u.length);return;case"Tab":case"Enter":h.preventDefault(),j();return;case"Escape":h.preventDefault(),$(null);return}h.key==="Enter"&&!h.shiftKey&&(h.preventDefault(),f())}},Y=()=>e.jsx("div",{className:"inputbox-actions",children:i?e.jsxs(e.Fragment,{children:[E.trim()!==""&&e.jsxs("button",{type:"button",className:"btn supplement",title:P("supplementTip"),onClick:()=>f(!0),children:[e.jsx(jn,{})," ",P("supplement")]}),e.jsx("button",{type:"button",className:"btn stop",title:P("stopAgent"),onClick:()=>d({type:"abort"}),children:e.jsx(st,{})})]}):e.jsx("button",{type:"button",className:"btn send",title:P("sendTip"),disabled:!q||!E.trim()&&!m.some(h=>h.imageData||h.fileData),onClick:()=>f(),children:e.jsx(Rs,{})})});return e.jsxs("div",{className:`inputbar${b?" drop-active":""}`,onDragOver:h=>{h.preventDefault(),h.stopPropagation(),k(!0)},onDragLeave:h=>{h.currentTarget.contains(h.relatedTarget)||k(!1)},onDrop:h=>{var z;h.preventDefault(),h.stopPropagation(),k(!1),U(((z=h.dataTransfer)==null?void 0:z.files)??null)},children:[b&&e.jsx("div",{className:"drop-overlay",children:e.jsxs("span",{children:["📎 ",P("dropHereToAttach")]})}),m.length>0&&e.jsxs("div",{className:"attach-row",children:[m.map(h=>e.jsxs("span",{className:`attach-chip ${h.imageData?"image":h.fileData?"file":h.mode}`,title:h.imageData?P("attachImage",{name:h.name}):h.fileData?P("attachFile",{name:h.name}):h.isDir?P("folderRef",{path:h.path}):h.mode==="reference"?P("refOnly",{path:h.path}):h.mode==="lines"&&h.lines?P("attachLines",{path:h.path,start:h.lines.start,end:h.lines.end}):P("attachContent",{path:h.path}),children:[h.imageData?"🖼":h.fileData?"📄":h.isDir?"📁":h.mode==="reference"?"🔗":"📎"," ",h.name,h.mode==="lines"&&h.lines&&e.jsxs("span",{className:"attach-range",children:["L",h.lines.start,"-",h.lines.end]}),e.jsx("button",{type:"button",className:"attach-remove",title:P("removeAttachment"),onClick:()=>x(h.key??h.path),children:"×"})]},h.key??`${h.path}|${h.mode}|${h.lines?`${h.lines.start}-${h.lines.end}`:""}`)),e.jsx("span",{className:"attach-hint",children:P("attachHint")})]}),u&&u.length>0&&e.jsxs("div",{className:"slash-menu",role:"listbox",ref:ae,"aria-label":P("slashCommands"),children:[e.jsxs("div",{className:"slash-menu-hint",children:[e.jsx("span",{children:P("slashMenuHint")}),e.jsx("span",{className:"slash-menu-close",onClick:()=>$(null),children:"Esc"})]}),u.map((h,z)=>e.jsxs("button",{type:"button",className:`slash-item${z===W?" active":""}`,onMouseEnter:()=>J(z),onClick:()=>j(h),children:[e.jsxs("span",{className:"slash-name",children:["/",h.name]}),e.jsx("span",{className:`slash-source ${h.source}`,children:pe[h.source]}),e.jsxs("span",{className:"slash-desc",children:[F(h),h.argumentHint&&e.jsx("span",{className:"slash-hint",children:p(h)})]})]},h.name))]}),re&&e.jsx("div",{className:"modal-backdrop",onClick:()=>V(!1),children:e.jsxs("div",{className:"slash-help",style:oe?{width:oe}:void 0,onClick:h=>h.stopPropagation(),children:[e.jsxs("div",{className:"slash-help-head",children:[e.jsxs("span",{children:["⚡ ",P("slashHelpTitle")]}),e.jsx("button",{type:"button",className:"btn",onClick:()=>V(!1),children:P("close")})]}),e.jsx("div",{className:"slash-help-body",children:c.length===0?e.jsx("div",{className:"slash-help-empty",children:P("slashLoading")}):c.map(h=>e.jsxs("div",{className:"slash-help-row",children:[e.jsxs("span",{className:"slash-help-cmd",children:["/",h.name]}),e.jsx("span",{className:`slash-source ${h.source}`,children:pe[h.source]}),e.jsxs("span",{className:"slash-help-desc",children:[F(h),h.argumentHint&&e.jsx("span",{className:"slash-hint",children:p(h)})]})]},h.name))})]})}),e.jsxs("div",{className:"inputbox",children:[e.jsx("input",{ref:H,type:"file",multiple:!0,hidden:!0,onChange:h=>{U(h.target.files),h.target.value=""}}),e.jsxs("div",{className:"inputbox-row",children:[e.jsx("button",{type:"button",className:"btn attach-img",title:P("uploadFile"),disabled:!q,onClick:()=>{var h;return(h=H.current)==null?void 0:h.click()},children:e.jsx(Jt,{})}),e.jsx("textarea",{ref:A,value:E,rows:1,placeholder:P(q?i?"placeholderStreaming":"placeholderIdle":"placeholderConnecting"),disabled:!q,onChange:h=>{T(h.target.value),L(h.target.value)},onKeyDown:D,onPaste:M}),Y()]}),e.jsxs("div",{className:"input-tools",children:[e.jsx("div",{className:"input-tools-left",children:e.jsx(Bs,{state:a,models:n,modelsLoading:o,send:d,onManageModels:C,compact:!0})}),e.jsxs("div",{className:"input-tools-right",children:[e.jsx("button",{type:"button",className:"btn attach-img",title:P("uploadFile"),disabled:!q,onClick:()=>{var h;return(h=H.current)==null?void 0:h.click()},children:e.jsx(Jt,{})}),Y()]})]})]})]})}),ca=r.memo(function({goal:s,models:i,modelsLoading:l,activeConversationId:c,send:a}){var J,re,V,oe,I,A;const n=he(),o=!s.conversationId||s.conversationId===c,d=s.goal!==null&&o,[m,x]=r.useState(""),[g,v]=r.useState(s.reviewModel??""),[w,R]=r.useState(s.maxRounds),[C,P]=r.useState(s.locked),[B,F]=r.useState(!1),[p,E]=r.useState(!1),[T,b]=r.useState(!0);r.useEffect(()=>{v(s.reviewModel??""),R(s.maxRounds||0),P(s.locked)},[s.goal,s.reviewModel,s.maxRounds,s.locked]),r.useEffect(()=>{B&&i.length===0&&!p&&!l&&(E(!0),a({type:"list_models"}))},[B,i.length,p,l,a]),r.useEffect(()=>{i.length>0&&E(!1)},[i.length]);const k=()=>{var H;return g?((H=i.find(ae=>ae.id===g))==null?void 0:H.name)??g:n("goalBarUseMainModel")},u=()=>{const H=m.trim();H&&(a({type:"set_goal",goal:H,...g?{reviewModel:g}:{},maxRounds:w,locked:C}),x(""),b(!1))},$=()=>{const H=m.trim();H&&(a({type:"start_goal_wizard",text:H,...g?{wizardModel:g}:{},maxRounds:w,locked:C}),x(""),b(!1))},W=(((J=s.wizard)==null?void 0:J.active)??!1)&&o;return W?e.jsx("div",{className:`goalbar goalbar-active ${W?"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:((re=s.wizard)==null?void 0:re.draft)??"",children:[n("goalWizardRunning"),": ",(V=s.wizard)==null?void 0:V.draft]}),e.jsxs("span",{className:"goalbar-chip reviewing",children:[n("goalBarRound",{n:(((oe=s.wizard)==null?void 0:oe.step)??0)+1})," ","/ ",((I=s.wizard)==null?void 0:I.maxSteps)??6]}),e.jsx("span",{className:"goalbar-detail",children:((A=s.wizard)==null?void 0:A.status)||n("goalBarReviewing")}),e.jsx("button",{type:"button",className:"goalbar-x",title:n("goalBarClear"),onClick:()=>{a({type:"clear_goal"}),b(!0)},children:e.jsx(Ne,{})})]})}):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:()=>{a({type:"clear_goal"}),b(!0)},children:e.jsx(Ne,{})})]})}):T?e.jsx("div",{className:"goalbar goalbar-collapsed",children:e.jsxs("button",{type:"button",className:"goalbar-hint",title:n("goalBarPlaceholder"),onClick:()=>b(!1),children:[e.jsx(Gt,{})," ",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(Gt,{})}),e.jsx("input",{className:"goalbar-input",value:m,placeholder:n("goalBarPlaceholder"),onChange:H=>x(H.target.value),onKeyDown:H=>{H.key==="Enter"&&u()}}),e.jsx("button",{type:"button",className:"goalbar-btn",disabled:!m.trim(),onClick:u,children:n("goalBarSet")}),e.jsxs("button",{type:"button",className:"goalbar-btn wizard",disabled:!m.trim(),title:n("goalWizardTip"),onClick:$,children:["🔍 ",n("goalWizardBtn")]}),e.jsx("button",{type:"button",className:"goalbar-icon-btn",title:n(C?"goalBarLocked":"goalBarUnlocked"),onClick:()=>P(H=>(a({type:"set_goal_prefs",locked:!H}),!H)),children:C?e.jsx(Mn,{}):e.jsx(yn,{})}),e.jsx("button",{type:"button",className:"goalbar-icon-btn",title:n("goalBarClear"),onClick:()=>b(!0),children:e.jsx(ot,{})})]}),e.jsxs("div",{className:"goalbar-opts",children:[e.jsxs(Ie,{trigger:e.jsxs("span",{className:"goalbar-opt",children:[n("goalBarReviewModel"),": ",e.jsx("b",{children:k()})]}),open:B,onOpenChange:F,direction:"up",children:[e.jsx("div",{className:"dd-header",children:n("goalBarReviewModel")}),(p||l)&&e.jsx("div",{className:"dd-loading",children:n("loading")}),i.length===0&&!p&&!l&&e.jsx("div",{className:"dd-loading",children:n("noModels")}),e.jsx(we,{active:g==="",onClick:()=>{v(""),F(!1),a({type:"set_goal_prefs",reviewModel:""})},children:n("goalBarUseMainModel")}),i.map(H=>e.jsx(we,{active:g===H.id,onClick:()=>{v(H.id),F(!1),a({type:"set_goal_prefs",reviewModel:H.id})},children:e.jsxs("span",{className:"dd-model-cell",children:[e.jsx("span",{className:"dd-model-name",children:H.name}),e.jsx("span",{className:"dd-model-meta",children:e.jsx("span",{className:"dd-model-provider",children:H.provider})})]})},H.id)),e.jsx("button",{type:"button",className:"dd-refresh",onClick:()=>a({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:w,placeholder:n("goalBarUnlimitedShort"),onChange:H=>{const ae=parseInt(H.target.value,10);if(Number.isNaN(ae)||ae<0){R(0);return}R(ae)},onBlur:()=>a({type:"set_goal_prefs",maxRounds:w}),onKeyDown:H=>{H.key==="Enter"&&(a({type:"set_goal_prefs",maxRounds:w}),H.target.blur())}})]}),e.jsx("span",{className:"goalbar-lock-hint",children:n(C?"goalBarLocked":"goalBarUnlocked")})]})]})});function da({chat:t,send:s}){const i=he(),l=t.state,[c,a]=r.useState(!1),[n,o]=r.useState(""),[d,m]=r.useState(0),x=r.useRef(null),g=t.pathCompletions;if(r.useEffect(()=>{if(!c)return;const u=setTimeout(()=>{s({type:"complete_path",path:n})},150);return()=>clearTimeout(u)},[n,c,s]),r.useEffect(()=>m(0),[g]),r.useEffect(()=>{const u=document.querySelector(`.status-completions .pc-item[data-idx="${d}"]`);u==null||u.scrollIntoView({block:"nearest"})},[d]),!l)return null;const v=l.stats,w=t.ready?"ok":"busy",R=t.ready?i("connected"):i("connecting"),C=v.contextUsage,P=C.tokens!==null&&C.percent!==null?`${fs(C.tokens)} / ${fs(C.contextWindow)}`:"—",B=C.percent??null,F=B===null?"":B>=80?"warn":B>=50?"mid":"ok",p=l.queue.steering.length+l.queue.followUp.length,E=()=>{o(l.cwd),a(!0)},T=(u,$)=>{var J;const W=u.includes("\\")?"\\":"/";o($?`${u}${W}`:u),m(0),(J=x.current)==null||J.focus()},b=u=>{const $=u.trim();$&&$!==l.cwd&&s({type:"set_cwd",path:$}),a(!1)},k=u=>{if(u.key==="ArrowDown")u.preventDefault(),m($=>Math.min($+1,g.length-1));else if(u.key==="ArrowUp")u.preventDefault(),m($=>Math.max($-1,0));else if(u.key==="Tab"&&g.length>0){u.preventDefault();const $=g[Math.min(d,g.length-1)];T($.path,$.type==="dir")}else if(u.key==="Enter"&&!u.nativeEvent.isComposing){const $=n.trim();if($.endsWith("/")||$.endsWith("\\"))b($);else if(g.some(W=>W.path===$))b($);else if(g.length>0&&g[d]){u.preventDefault();const W=g[d];T(W.path,W.type==="dir")}else b($)}else u.key==="Escape"&&(g.length>0?(u.stopPropagation(),s({type:"complete_path",path:""})):a(!1))};return e.jsxs("footer",{className:"statusbar",children:[e.jsx("span",{className:`status-dot ${w}`,title:R}),e.jsx("span",{className:"status-item",children:R}),e.jsx("span",{className:"status-sep",children:"·"}),e.jsxs("span",{className:"status-item status-ctx",title:i("contextUsage"),children:[i("context"),e.jsx("span",{className:`ctx-bar ${F}`,children:B!==null&&e.jsx("span",{className:"ctx-bar-fill",style:{width:`${Math.min(B,100)}%`}})}),P]}),e.jsx("span",{className:"status-sep",children:"·"}),e.jsxs("span",{className:"status-item",title:i("cumulativeCost"),children:["$",ua(v.cost)]}),e.jsx("span",{className:"status-sep",children:"·"}),e.jsxs("span",{className:"status-item",title:i("sessionMessages"),children:[i("messages")," ",v.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:i("pluginStatus"),children:t.statuses.map(u=>u.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"}),i("working"),p>0&&e.jsxs("span",{className:"status-queue",children:["⏳ ",p," ",i("queued")]})]})]}),c?e.jsxs("div",{className:"status-cwd-wrap",children:[e.jsx("input",{ref:x,className:"status-cwd-input",value:n,autoFocus:!0,placeholder:i("enterPath"),onChange:u=>o(u.target.value),onKeyDown:k,onBlur:()=>a(!1)}),g.length>0&&e.jsx("ul",{className:"status-completions",onMouseDown:u=>u.preventDefault(),children:g.map((u,$)=>e.jsx("li",{children:e.jsxs("button",{type:"button","data-idx":$,className:`pc-item ${$===d?"sel":""}`,onMouseEnter:()=>m($),onClick:()=>T(u.path,u.type==="dir"),children:[e.jsx("span",{className:"pc-icon",children:u.type==="dir"?e.jsx(qe,{}):e.jsx(Es,{})}),e.jsxs("span",{className:"pc-body",children:[e.jsx("span",{className:"pc-name",children:u.name}),e.jsx("span",{className:"pc-path",children:u.path})]})]})},u.path))})]}):e.jsxs("button",{type:"button",className:"status-item status-cwd",title:i("cwdTip",{path:l.cwd}),onClick:E,children:["📁 ",l.cwd]})]})}function fs(t){return t>=1e3?`${(t/1e3).toFixed(1).replace(/\.0$/,"")}K`:String(t)}function ua(t){return t<=0?"0":t<1e-4?"<0.0001":t.toFixed(4).replace(/\.?0+$/,"")}function ma({dialog:t,send:s}){const i=he(),[l,c]=r.useState(""),[a,n]=r.useState(0),o=x=>{s({type:"dialog_response",id:t.id,value:x})};r.useEffect(()=>{c(""),n(0);const x=g=>{g.key==="Escape"&&o(null)};return document.addEventListener("keydown",x),()=>document.removeEventListener("keydown",x)},[t.id]);const d=Array.isArray(t.args[0])?t.args[0]:[],m=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:i("pluginRequest")}),t.title&&t.title!==i("pluginRequest")&&e.jsx("span",{className:"dialog-title",children:t.title}),e.jsx("button",{type:"button",className:"dialog-dismiss",title:i("cancel"),onClick:()=>o(null),children:"✕"})]}),t.kind==="select"&&e.jsxs("div",{className:"dialog-options",children:[d.map((x,g)=>e.jsx("button",{type:"button",className:`dialog-option ${g===a?"sel":""}`,onMouseEnter:()=>n(g),onClick:()=>o(x),children:x},g)),d.length===0&&e.jsx("div",{className:"dialog-hint",children:i("noOptions")})]}),t.kind==="confirm"&&e.jsxs("div",{className:"dialog-body",children:[e.jsx("p",{children:m}),e.jsxs("div",{className:"dialog-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:()=>o(!1),children:i("cancel")}),e.jsx("button",{type:"button",className:"btn primary",onClick:()=>o(!0),children:i("ok")})]})]}),t.kind==="input"&&e.jsxs("div",{className:"dialog-body",children:[e.jsx("input",{className:"dialog-input",value:l,placeholder:m||i("inputPlaceholder"),autoFocus:!0,onChange:x=>c(x.target.value),onKeyDown:x=>{x.key==="Enter"&&!x.nativeEvent.isComposing&&o(l)}}),e.jsxs("div",{className:"dialog-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:()=>o(null),children:i("cancel")}),e.jsx("button",{type:"button",className:"btn primary",onClick:()=>o(l),children:i("ok")})]})]})]})}function pa(t){if(t.x==="?"&&t.y==="?")return"untracked";const s=t.x!==" "&&t.x!=="?",i=t.y!==" "&&t.y!=="?";return s&&i?"both":s?"staged":"unstaged"}function ha({chat:t,send:s,terminal:i,active:l,onSwitchToTerminal:c}){var ue,ge;const a=he(),[n,o]=r.useState(null),[d,m]=r.useState([]),[x,g]=r.useState(""),[v,w]=r.useState(new Map),[R,C]=r.useState("changes"),[P,B]=r.useState([]),[F,p]=r.useState(null),[E,T]=r.useState(""),[b,k]=r.useState(!1),[u,$]=r.useState(null),[W,J]=r.useState(null),[re,V]=r.useState(!1),[oe,I]=r.useState(!1),[A,H]=r.useState(!1),[ae,pe]=r.useState(null),[L,j]=r.useState(!1),[G,U]=r.useState(""),M=r.useRef(0),q=r.useRef(-1),ce=r.useRef(-1),f=r.useRef(-1),D=r.useRef(-1),Y=r.useRef(void 0),h=r.useRef(null),z=r.useRef([]),Q=r.useCallback(y=>{if(y.reqId===q.current){if(q.current=-1,I(!1),pe(null),!y.ok){pe(y.error??"查询失败");return}if(y.notRepo){j(!0),o(null),m([]),w(new Map),B([]),p(null),T(""),J(null);return}j(!1);const ie={branch:y.branch??"",detached:!!y.detached,upstream:y.upstream??null,ahead:y.ahead??0,behind:y.behind??0,upstreamGone:!!y.upstreamGone,files:(y.files??[]).map(fe=>({...fe}))},ee=(y.branches??[]).map(fe=>({...fe})),je=new Map;for(const[fe,ke]of Object.entries(y.stats??{}))je.set(fe,{add:ke[0],del:ke[1]});o(ie),m(ee),w(je),g(fe=>{var ke;return ie.detached?fe||"":ie.branch&&ee.some(Te=>Te.name===ie.branch)?ie.branch:fe&&ee.some(Te=>Te.name===fe)?fe:((ke=ee[0])==null?void 0:ke.name)??""}),J(fe=>fe&&!ie.files.some(ke=>ke.path===fe.file.path)?null:fe)}else if(y.reqId===ce.current){if(ce.current=-1,V(!1),!y.ok){pe(y.error??"查询失败");return}const ie=h.current;if(!ie)return;J({file:ie,staged:y.stagedText??"",worktree:y.worktreeText??"",untracked:!1})}else if(y.reqId===D.current){if(D.current=-1,H(!1),!y.ok){pe(y.error??"查询失败");return}B((y.history??[]).map(ie=>({...ie})))}else if(y.reqId===f.current){if(f.current=-1,k(!1),!y.ok){pe(y.error??"查询失败");return}T(y.text??"")}},[]);r.useEffect(()=>{const y=t.scmData;y&&y.type==="scm_data"&&Q(y)},[t.scmData,Q]);const Z=r.useCallback((y,ie)=>{if(!t.ready||t.status!=="open")return!1;const ee=++M.current;return s({...y,reqId:ee})?(ie.current=ee,!0):(M.current-=1,!1)},[t.ready,t.status,s]),me=r.useCallback((y=!1,ie=!1)=>{var ee;!t.ready||t.status!=="open"||(ee=t.state)!=null&&ee.cwd&&(Y.current!==void 0&&Y.current!==t.state.cwd&&(o(null),m([]),w(new Map),B([]),H(!1),D.current=-1,p(null),T(""),J(null),$(null)),Y.current=t.state.cwd,pe(null),Z({type:"scm_status"},q)&&(ie||I(!0)))},[t.ready,(ue=t.state)==null?void 0:ue.cwd,t.status,Z]),ve=r.useCallback(y=>{if($(y),p(null),h.current=y,y.x==="?"&&y.y==="?"){J({file:y,staged:"",worktree:"",untracked:!0});return}V(!0),pe(null),Z({type:"scm_filediff",path:y.path},ce)||V(!1)},[Z]),X=r.useCallback(y=>{p(y),$(null),J(null),T(""),k(!0),pe(null),Z({type:"scm_commit",hash:y.hash},f)||k(!1)},[Z]),de=r.useCallback((y,ie)=>{var fe,ke;if(!t.ready)return;const ee={name:y,command:ie,cwd:"${pwd}"},je=t.terminals.find(Te=>Te.title===y);if(je)i.restart(je.id),s({type:"run_command",terminalId:je.id,conversationId:je.conversationId,command:ee,cols:80,rows:24});else{const Te=$e();i.create({id:Te,conversationId:t.activeConversationId||((fe=t.state)==null?void 0:fe.conversationId)||"",title:y,cwd:((ke=t.state)==null?void 0:ke.cwd)??"",cols:80,rows:24,running:!0,exitCode:null,command:ee})}c()},[t.ready,(ge=t.state)==null?void 0:ge.cwd,t.terminals,c,s,i]),se=r.useCallback(()=>{const y=G.trim();if(!y||L)return;const ie=y.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/`/g,"\\`").replace(/\$/g,"\\$");de("git commit",`git add -A && git commit -m "${ie}"`),U("")},[G,L,de]),Ce=y=>`'${y.replace(/'/g,"'\\''")}`,Re=r.useCallback(y=>{L||de("git add",`git add -- ${Ce(y.path)}`)},[L,de]),Ee=r.useCallback(y=>{L||de("git reset",`git reset HEAD -- ${Ce(y.path)}`)},[L,de]),Fe=r.useCallback(()=>{if(!x||L)return;const y=d.find(ie=>ie.name===x);if(y!=null&&y.remote&&typeof y.remote=="string"){const ie=x.slice(y.remote.length+1);de("git checkout",`git checkout -b ${ie} ${x} || git checkout ${x}`)}else de("git checkout",`git checkout ${x}`)},[x,d,L,de]),Ae=r.useCallback(()=>de("git push","git push"),[de]),N=r.useCallback(()=>de("git pull","git pull"),[de]),_=r.useCallback(()=>{Z({type:"scm_history"},D)||(D.current=-1)},[Z]);r.useEffect(()=>{l&&me()},[l,me]),r.useEffect(()=>{R==="history"&&n&&_()},[R,n,_]),r.useEffect(()=>{t.scmDirty>0&&l&&me(!1,!0)},[t.scmDirty]),r.useEffect(()=>{if(!l||!t.ready||t.status!=="open")return;const y=setInterval(()=>{document.visibilityState!=="hidden"&&me(!1,!0)},3e4);return()=>clearInterval(y)},[l,t.ready,t.status,me]),r.useEffect(()=>{const y=z.current;if(z.current=t.terminals,!l)return;t.terminals.some(ee=>{var fe;return ee.running!==!1?!1:((fe=y.find(ke=>ke.id===ee.id))==null?void 0:fe.running)===!0&&/^git /.test(ee.title)})&&t.ready&&t.status==="open"&&(me(!1,!0),R==="history"&&n&&_())},[t.terminals,l,t.ready,t.status,me,R,n,_]);const le={staged:a("scmStaged"),unstaged:a("scmUnstaged"),untracked:a("scmUntracked"),both:a("scmStagedUnstaged")},ne=y=>{const ie=y.split(`
18
- `);return e.jsx("pre",{className:"scm-diff-pre",children:ie.map((ee,je)=>{let fe="";return ee.startsWith("diff --git")||ee.startsWith("index ")||ee.startsWith("new file")||ee.startsWith("deleted file")||ee.startsWith("old mode")||ee.startsWith("new mode")||ee.startsWith("similarity index")||ee.startsWith("rename ")||ee.startsWith("copy ")||ee.startsWith("Binary files")||ee.startsWith("---")||ee.startsWith("+++")?fe="hdr":ee.startsWith("@@")?fe="hunk":ee.startsWith("+")?fe="add":ee.startsWith("-")&&(fe="del"),e.jsx("div",{className:`scm-diff-line ${fe}`,children:ee||" "},je)})})};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(Ze,{}),a("scmTitle")]}),e.jsxs("div",{className:"scm-view-tabs",role:"tablist",children:[e.jsx("button",{type:"button",role:"tab","aria-selected":R==="changes",className:R==="changes"?"active":"",onClick:()=>{C("changes"),pe(null)},children:a("scmChanges")}),e.jsx("button",{type:"button",role:"tab","aria-selected":R==="history",className:R==="history"?"active":"",onClick:()=>{C("history"),pe(null)},children:a("scmHistory")})]}),e.jsx("button",{type:"button",className:"panel-refresh",title:a("scmRefreshTip"),disabled:oe,onClick:()=>me(!0),children:e.jsx(rt,{className:oe?"scm-spin":""})})]}),e.jsxs("div",{className:"scm-row",children:[e.jsxs("span",{className:"scm-branch-current",title:a("scmCurrentBranch"),children:[e.jsx(Ze,{}),n?n.detached?a("scmDetached"):n.branch:"…",(n==null?void 0:n.upstream)&&e.jsx("span",{className:"scm-upstream",children:n.upstreamGone?a("scmUpstreamGone"):n.ahead>0||n.behind>0?a("scmAheadBehind",{ahead:n.ahead,behind:n.behind}):n.upstream})]}),e.jsxs("select",{className:"scm-select",value:x,disabled:L||d.length===0,title:a("scmSwitchBranch"),onChange:y=>g(y.target.value),children:[e.jsx("option",{value:"",disabled:!0,children:a("scmSelectBranch")}),d.filter(y=>!y.remote).map(y=>e.jsx("option",{value:y.name,children:y.current?`* ${y.name}`:y.name},y.name)),d.some(y=>y.remote)&&e.jsx("optgroup",{label:a("scmRemoteBranches"),children:d.filter(y=>y.remote).map(y=>e.jsx("option",{value:y.name,children:y.name},y.name))})]}),e.jsxs("button",{type:"button",className:"btn",disabled:!x||x===(n==null?void 0:n.branch)||L,title:a("scmSwitchBranchTip",{branch:x}),onClick:Fe,children:[e.jsx(Ze,{}),a("scmSwitch")]}),e.jsxs("button",{type:"button",className:"btn",disabled:!n||n.detached||L,title:a("scmPushTip"),onClick:Ae,children:[e.jsx(Rs,{}),a("scmPush")]}),e.jsxs("button",{type:"button",className:"btn",disabled:!n||n.detached||L,title:a("scmPullTip"),onClick:N,children:[e.jsx(Ps,{}),a("scmPull")]}),e.jsx("input",{className:"scm-commit-input",value:G,placeholder:a("scmCommitPlaceholder"),disabled:L,onChange:y=>U(y.target.value),onKeyDown:y=>{y.key==="Enter"&&!y.nativeEvent.isComposing&&se()}}),e.jsxs("button",{type:"button",className:"btn primary",disabled:!G.trim()||L,title:a("scmCommitTip"),onClick:se,children:[e.jsx(dt,{}),a("scmCommit")]})]})]}),e.jsxs("div",{className:"scm-body",children:[R==="history"?e.jsxs("div",{className:"scm-history",children:[e.jsxs("div",{className:"scm-files-header",children:[e.jsx("span",{children:a("scmHistory")}),P.length>0&&e.jsx("span",{className:"scm-files-count",children:P.length})]}),e.jsx("div",{className:"scm-history-list",children:L?e.jsx("div",{className:"scm-empty",children:a("scmNotGitRepo")}):!n||A?e.jsx("div",{className:"scm-empty",children:t.status==="open"?a("scmLoading"):a("scmConnecting")}):P.length===0?e.jsx("div",{className:"scm-empty",children:a("scmNoHistory")}):P.map(y=>e.jsxs("button",{type:"button",className:`scm-commit ${(F==null?void 0:F.hash)===y.hash?"active":""}`,onClick:()=>X(y),title:y.hash,children:[e.jsx("span",{className:"scm-commit-graph","aria-hidden":"true",children:y.graph||"* "}),e.jsxs("span",{className:"scm-commit-info",children:[e.jsx("span",{className:"scm-commit-subject",children:y.subject}),e.jsxs("span",{className:"scm-commit-meta",children:[y.shortHash," · ",y.author," · ",y.date]}),y.decorations&&e.jsx("span",{className:"scm-commit-refs",children:y.decorations})]})]},y.hash))})]}):e.jsxs("div",{className:"scm-files",children:[e.jsxs("div",{className:"scm-files-header",children:[e.jsx("span",{children:a("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:L?e.jsx("div",{className:"scm-empty",children:a("scmNotGitRepo")}):n?n.files.length===0?e.jsx("div",{className:"scm-empty",children:a("scmNoChanges")}):n.files.map(y=>{const ie=pa(y),ee=v.get(y.path);return e.jsxs("div",{className:`scm-file ${(u==null?void 0:u.path)===y.path?"active":""}`,title:le[ie],onClick:()=>ve(y),children:[e.jsx("span",{className:`scm-file-xy ${ie==="untracked"?"q":"x"}`,children:y.x!==" "?y.x:" "}),e.jsx("span",{className:`scm-file-xy ${ie==="untracked"?"q":"y"}`,children:y.y!==" "?y.y:" "}),e.jsx("span",{className:"scm-file-path",children:y.path}),ee&&(ee.add>0||ee.del>0)&&e.jsxs("span",{className:"scm-file-stat",children:[ee.add>0&&e.jsxs("span",{className:"add",children:["+",ee.add]}),ee.del>0&&e.jsxs("span",{className:"del",children:["-",ee.del]})]}),e.jsxs("span",{className:"scm-file-actions",children:[(y.y!==" "||ie==="untracked")&&e.jsx("button",{type:"button",className:"scm-act",title:a("scmStageTip",{path:y.path}),onClick:je=>{je.stopPropagation(),Re(y)},children:"+"}),ie==="staged"||ie==="both"?e.jsx("button",{type:"button",className:"scm-act",title:a("scmUnstageTip",{path:y.path}),onClick:je=>{je.stopPropagation(),Ee(y)},children:"−"}):null]})]},y.path)}):e.jsx("div",{className:"scm-empty",children:t.status==="open"?a("scmLoading"):a("scmConnecting")})})]}),e.jsxs("div",{className:"scm-diff",children:[e.jsxs("div",{className:"scm-diff-header",children:[e.jsx("span",{children:R==="history"?F?`${F.shortHash} ${F.subject}`:a("scmCommitDetail"):u?u.path:a("scmDiff")}),(R==="history"?b:re)&&e.jsx("span",{className:"scm-diff-loading",children:a("scmLoading")})]}),e.jsx("div",{className:"scm-diff-body",children:R==="history"?e.jsxs(e.Fragment,{children:[ae&&e.jsx("div",{className:"scm-error",children:ae}),!F&&!ae&&e.jsx("div",{className:"scm-empty",children:a("scmSelectCommitHint")}),F&&b&&!ae&&e.jsx("div",{className:"scm-empty",children:a("scmLoading")}),F&&!b&&!ae&&E?ne(E):null]}):e.jsxs(e.Fragment,{children:[ae&&e.jsx("div",{className:"scm-error",children:ae}),!u&&!ae&&e.jsx("div",{className:"scm-empty",children:a("scmSelectFileHint")}),u&&!W&&!ae&&e.jsx("div",{className:"scm-empty",children:a("scmLoading")}),u&&W&&W.untracked&&e.jsx("div",{className:"scm-empty",children:a("scmUntrackedNote")}),u&&W&&!W.untracked&&e.jsxs(e.Fragment,{children:[W.staged&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"scm-diff-section",children:a("scmStaged")}),ne(W.staged)]}),W.worktree&&e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"scm-diff-section",children:a("scmUnstaged")}),ne(W.worktree)]}),!W.staged&&!W.worktree&&e.jsx("div",{className:"scm-empty",children:a("scmNoDiff")})]})]})})]})]}),e.jsxs("div",{className:"scm-hint",children:[e.jsx(Qe,{}),e.jsx("span",{children:a("scmRunsInTerminal")}),e.jsx("button",{type:"button",className:"scm-goto-term",onClick:c,children:a("scmViewTerminal")})]})]})}function ga({entry:t,send:s}){const i=r.useRef(null);return r.useEffect(()=>{const l=i.current;if(!l)return;let c;try{c=t.module.mount(l,ii(t.info.id,a=>s(a)))}catch(a){console.error(`[plugin:${t.info.id}] mount failed:`,a),l.textContent=`插件 ${t.info.name} 挂载失败`}return()=>{if(typeof c=="function")try{c()}catch(a){console.error(`[plugin:${t.info.id}] cleanup failed:`,a)}l.textContent=""}},[t,s]),e.jsx("div",{className:"plugin-view",ref:i})}function fa({send:t,piConfigured:s,providers:i,installResult:l,onClose:c}){const a=he(),[n,o]=r.useState(!1),[d,m]=r.useState(""),[x,g]=r.useState(""),[v,w]=r.useState(!1);r.useEffect(()=>{t({type:"list_providers"})},[t]),r.useEffect(()=>{s&&c()},[s,c]),r.useEffect(()=>{l&&o(!1)},[l]),r.useEffect(()=>{var p;!d&&i.length>0&&m(((p=i.find(E=>!E.configured))==null?void 0:p.id)??i[0].id)},[i,d]);const R=()=>{n||(o(!0),t({type:"install_pi_agent"}))},C=()=>{!x.trim()||v||(w(!0),t({type:"set_provider_api_key",provider:d.trim(),apiKey:x.trim()}),setTimeout(()=>w(!1),3e3))},P=()=>{t({type:"get_state"}),t({type:"list_providers"})},B=i.find(p=>p.id===d),F=l!==null&&!l.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":a("close"),onClick:c,children:e.jsx(Ne,{})}),e.jsxs("div",{className:"modal-head",children:[e.jsx(lt,{className:"modal-head-icon"}),e.jsx("h2",{children:a("setupTitle")})]}),e.jsx("p",{className:"modal-desc",children:a("setupDesc")}),F?e.jsxs("div",{className:"setup-failed",children:[e.jsx("div",{className:"setup-done",children:a("installFailed")}),e.jsx("pre",{className:"setup-detail",children:l.detail}),e.jsxs("div",{className:"setup-actions",children:[e.jsx("button",{type:"button",className:"btn primary",disabled:n,onClick:R,children:a("retryInstall")}),e.jsx("button",{type:"button",className:"btn",onClick:c,children:a("skip")})]})]}):l!=null&&l.ok?e.jsxs("div",{className:"setup-key-form",children:[e.jsx("div",{className:"setup-done",children:a("installDone")}),e.jsxs("label",{className:"field",children:[e.jsx("span",{className:"field-label",children:a("provider")}),e.jsxs("select",{value:d,onChange:p=>m(p.target.value),children:[i.length===0&&e.jsx("option",{value:"",children:a("loading")}),i.map(p=>e.jsxs("option",{value:p.id,children:[p.name,"(",p.id,")",p.configured?` · ${a("configured")}`:""]},p.id))]}),(B==null?void 0:B.configured)&&e.jsx("div",{className:"field-hint",children:a("providerKeyReady")})]}),e.jsxs("label",{className:"field",children:[e.jsx("span",{className:"field-label",children:a("apiKey")}),e.jsx("input",{type:"password",value:x,onChange:p=>g(p.target.value),placeholder:"sk-…"})]}),e.jsxs("div",{className:"setup-actions",children:[e.jsx("button",{type:"button",className:"btn primary",disabled:!x.trim()||v||!d,onClick:C,children:a(v?"saving":"saveAndStart")}),e.jsxs("button",{type:"button",className:"btn",onClick:P,children:[e.jsx(rt,{})," ",a("recheck")]})]})]}):e.jsxs("div",{className:"setup-actions",children:[e.jsx("button",{type:"button",className:"btn primary",disabled:n,onClick:R,children:a(n?"installing":"autoInstall")}),e.jsx("button",{type:"button",className:"btn",onClick:c,children:a("skip")})]})]})})}const xa=["openai-completions","openai-responses","anthropic-messages","google-generative-ai"],It=()=>({id:"",name:"",reasoning:!1,input:"text",contextWindow:"",maxTokens:""}),va=()=>({providerId:"",name:"",api:"openai-completions",baseUrl:"",apiKey:"",authHeader:!0,models:[It()]});function xs(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:[It()]).map(s=>{var i;return{id:s.id,name:s.name??"",reasoning:s.reasoning??!1,input:(i=s.input)!=null&&i.includes("image")?"text-image":"text",contextWindow:s.contextWindow?String(s.contextWindow):"",maxTokens:s.maxTokens?String(s.maxTokens):""}})}}function ya({send:t,providers:s,providerStatus:i,fetchModelsResult:l,refreshProviderResult:c,cloneProviderResult:a,onClose:n}){const o=he(),[d,m]=r.useState(null),[x,g]=r.useState({}),[v,w]=r.useState(null),[R,C]=r.useState({}),[P,B]=r.useState(!1),[F,p]=r.useState(0),[E,T]=r.useState(null),b=r.useRef(0),[k,u]=r.useState({});r.useRef(0);const $=r.useRef(0),[W,J]=r.useState(null),re=r.useRef(0),V=r.useRef(0);r.useEffect(()=>{t({type:"list_models_config"}),t({type:"list_providers"})},[t]);const oe=()=>{if(!d)return;const j=d.baseUrl.trim();if(!j){T({ok:!1,text:o("fetchModelsNeedBaseUrl")});return}if(P)return;B(!0),T(null);const G=F+1;p(G),t({type:"fetch_models",reqId:G,baseUrl:j,apiKey:d.apiKey.trim()||void 0,authHeader:d.authHeader,api:d.api})};r.useEffect(()=>{var j;if(!(!l||l.reqId===b.current))if(b.current=l.reqId,B(!1),l.ok&&((j=l.models)!=null&&j.length)){const G=l.models;m(U=>{if(!U)return U;const M=U.models.map(D=>{var z;if(!D.id.trim())return D;const Y=G.find(Q=>Q.id===D.id.trim());if(!Y)return D;const h={...D};return!h.name&&Y.name&&(h.name=Y.name),!h.contextWindow&&Y.contextWindow&&(h.contextWindow=String(Y.contextWindow)),!h.maxTokens&&Y.maxTokens&&(h.maxTokens=String(Y.maxTokens)),h.input==="text"&&((z=Y.input)!=null&&z.includes("image"))&&(h.input="text-image"),!h.reasoning&&Y.reasoning&&(h.reasoning=!0),h}),q=new Set(M.map(D=>D.id.trim()).filter(Boolean)),ce=G.filter(D=>!q.has(D.id)).map(D=>{var Y;return{id:D.id,name:D.name??"",reasoning:D.reasoning??!1,input:(Y=D.input)!=null&&Y.includes("image")?"text-image":"text",contextWindow:D.contextWindow?String(D.contextWindow):"",maxTokens:D.maxTokens?String(D.maxTokens):""}}),f=[...M,...ce];return f.some(D=>D.id.trim())?{...U,models:f.filter(D=>D.id.trim())}:U}),T({ok:!0,text:o("fetchModelsOk",{n:G.length})})}else T({ok:!1,text:l.error||o("fetchModelsEmpty")})},[l]);const I=j=>{const G=(x[j.id]??"").trim();!G||v||(w(j.id),t({type:"set_provider_api_key",provider:j.id,apiKey:G}),setTimeout(()=>{w(null),g(U=>({...U,[j.id]:""})),C(U=>({...U,[j.id]:!1})),t({type:"list_providers"})},1500))},A=()=>{if(!d)return;const j=d.providerId.trim(),G=d.models.filter(M=>M.id.trim()).map(M=>({id:M.id.trim(),name:M.name.trim()||void 0,reasoning:M.reasoning||void 0,input:M.input==="text-image"?["text","image"]:void 0,contextWindow:M.contextWindow?Number(M.contextWindow):void 0,maxTokens:M.maxTokens?Number(M.maxTokens):void 0})),U={providerId:j,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:G};t({type:"save_model_config",providerId:j,config:U}),n()};r.useEffect(()=>{!c||c.reqId===$.current||($.current=c.reqId,u({}))},[c]);const H=j=>{if(W)return;J(j.id);const G=++re.current+Date.now();t({type:"clone_provider",provider:j.id,reqId:G})};r.useEffect(()=>{!a||a.reqId===V.current||(V.current=a.reqId,J(null),a.ok&&a.config&&m(xs({...a.config,apiKey:""})))},[a]);const ae=j=>{window.confirm(o("clearKeyConfirm",{id:j}))&&t({type:"clear_provider_api_key",provider:j})},pe=j=>{window.confirm(o("deleteProviderConfirm",{id:j.providerId,n:j.models.length}))&&t({type:"delete_model_config",providerId:j.providerId})},L=(j,G)=>{d&&m({...d,models:d.models.map((U,M)=>M===j?{...U,...G}:U)})};return e.jsx("div",{className:"modal-backdrop",onClick:n,children:e.jsxs("div",{className:"modal model-modal",onClick:j=>j.stopPropagation(),children:[e.jsx("button",{type:"button",className:"modal-close","aria-label":o("close"),onClick:n,children:e.jsx(Ne,{})}),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(j=>j.providerId===d.providerId),onChange:j=>m({...d,providerId:j.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:j=>m({...d,name:j.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:j=>m({...d,api:j.target.value}),children:xa.map(j=>e.jsx("option",{value:j,children:j},j))})]}),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:j=>m({...d,baseUrl:j.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:j=>m({...d,apiKey:j.target.value}),placeholder:o("apiKeyHint")})]}),e.jsxs("label",{className:"field check",children:[e.jsx("input",{type:"checkbox",checked:d.authHeader,onChange:j=>m({...d,authHeader:j.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:[E&&e.jsx("span",{className:`fetch-msg ${E.ok?"ok":"err"}`,title:E.text,children:E.text}),e.jsxs("button",{type:"button",className:"btn sm",disabled:P||!d.baseUrl.trim(),title:o("fetchModelsHint"),onClick:oe,children:[e.jsx(Et,{})," ",o(P?"fetchingModels":"fetchModels")]})]})]}),d.models.map((j,G)=>e.jsxs("div",{className:"model-row",children:[e.jsx("input",{type:"text",value:j.id,onChange:U=>L(G,{id:U.target.value}),placeholder:o("modelIdReq")}),e.jsx("input",{type:"text",value:j.name,onChange:U=>L(G,{name:U.target.value}),placeholder:o("displayName")}),e.jsxs("select",{value:j.input,onChange:U=>L(G,{input:U.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:j.reasoning,onChange:U=>L(G,{reasoning:U.target.checked})}),e.jsx("span",{children:o("reasoning")})]}),e.jsx("input",{type:"number",value:j.contextWindow,onChange:U=>L(G,{contextWindow:U.target.value}),placeholder:o("contextWindow"),title:"contextWindow"}),e.jsx("input",{type:"number",value:j.maxTokens,onChange:U=>L(G,{maxTokens:U.target.value}),placeholder:o("maxOutput"),title:"maxTokens"}),e.jsx("button",{type:"button",className:"iconbtn danger",title:o("removeModel"),onClick:()=>m({...d,models:d.models.filter((U,M)=>M!==G)}),children:e.jsx(De,{})})]},G)),e.jsxs("button",{type:"button",className:"btn",onClick:()=>m({...d,models:[...d.models,It()]}),children:[e.jsx(Ue,{})," ",o("addModel")]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("button",{type:"button",className:"btn",onClick:()=>m(null),children:o("cancel")}),e.jsx("button",{type:"button",className:"btn primary",disabled:!d.providerId.trim()||!d.models.some(j=>j.id.trim()),onClick:A,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:[i.length===0&&e.jsx("div",{className:"dd-loading",children:o("loading")}),i.map(j=>e.jsxs("div",{className:"provider-row",children:[e.jsxs("div",{className:"provider-info",children:[e.jsx("span",{className:"provider-name",children:j.name}),e.jsxs("span",{className:"provider-sub",children:[j.id,j.configured&&e.jsx("span",{className:"auth-badge",children:o("configuredBadge")}),j.source&&!j.configured&&e.jsx("span",{className:"auth-badge dim",children:j.source})]})]}),e.jsxs("div",{className:"provider-actions",children:[j.configured&&!R[j.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:()=>C(G=>({...G,[j.id]:!0})),children:[e.jsx(Yt,{})," ",o("replaceKey")]}),j.source==="stored"&&e.jsxs("button",{type:"button",className:"btn sm danger",title:o("clearKeyTitle"),onClick:()=>ae(j.id),children:[e.jsx(De,{})," ",o("clearKey")]})]}):e.jsxs(e.Fragment,{children:[e.jsx("input",{type:"password",className:"key-input",placeholder:o("pasteKey"),value:x[j.id]??"",onChange:G=>g(U=>({...U,[j.id]:G.target.value}))}),e.jsxs("button",{type:"button",className:"btn primary sm",disabled:!(x[j.id]??"").trim()||v===j.id,onClick:()=>I(j),children:[e.jsx(Rn,{})," ",v===j.id?o("savingKey"):o("saveKey")]})]}),e.jsxs("button",{type:"button",className:"btn sm",disabled:W!==null,title:o("cloneProviderTitle"),onClick:()=>H(j),children:[e.jsx(Mt,{})," ",W===j.id?o("cloning"):o("cloneProvider")]})]})]},j.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(j=>e.jsxs("div",{className:"provider-row",children:[e.jsxs("div",{className:"provider-info",children:[e.jsx("span",{className:"provider-name",children:j.providerId}),e.jsxs("span",{className:"provider-sub",children:[j.api??"—",j.baseUrl?` · ${j.baseUrl}`:"",j.models.length>0&&` · ${o("modelsCount",{n:j.models.length})}`]})]}),e.jsxs("div",{className:"provider-actions",children:[e.jsx("button",{type:"button",className:"iconbtn",title:o("edit"),onClick:()=>m(xs(j)),children:e.jsx(Yt,{})}),e.jsx("button",{type:"button",className:"iconbtn danger",title:o("delete"),onClick:()=>pe(j),children:e.jsx(De,{})})]})]},j.providerId))}),e.jsx("div",{className:"modal-actions",children:e.jsxs("button",{type:"button",className:"btn primary",onClick:()=>m(va()),children:[e.jsx(Ue,{})," ",o("addProvider")]})})]})]})})}function ba({plugin:t,send:s}){const i=he(),l=t.settingsSchema??[],[c,a]=r.useState(()=>({...t.settingsValues??{}})),[n,o]=r.useState(!1);if(l.length===0)return null;const d=(v,w)=>a(R=>({...R,[v]:w})),m=l.some(v=>{var w;return c[v.key]!==((w=t.settingsValues)==null?void 0:w[v.key])}),x=()=>{o(!0),s({type:"plugin_settings",pluginId:t.id,values:c}),setTimeout(()=>o(!1),800)},g=()=>a({...t.settingsValues??{}});return e.jsxs("div",{className:"plugin-settings-form",children:[e.jsx("div",{className:"plugin-settings-fields",children:l.map(v=>e.jsxs("label",{className:"plugin-settings-field",title:v.hint,children:[e.jsx("span",{className:"plugin-settings-label",children:v.label}),v.type==="boolean"?e.jsx("input",{type:"checkbox",checked:!!c[v.key],onChange:w=>d(v.key,w.target.checked)}):v.type==="select"?e.jsx("select",{value:String(c[v.key]??""),onChange:w=>d(v.key,w.target.value),children:(v.options??[]).map(w=>e.jsx("option",{value:w,children:w},w))}):e.jsx("input",{type:v.type==="password"?"password":v.type==="number"?"number":"text",value:String(c[v.key]??""),min:v.min,max:v.max,onChange:w=>d(v.key,v.type==="number"?Number(w.target.value):w.target.value)})]},v.key))}),e.jsxs("div",{className:"plugin-settings-actions",children:[e.jsx("button",{type:"button",className:"btn plugin-settings-save",disabled:!m||n,onClick:x,children:i(n?"pluginSettingsSaving":"pluginSettingsSave")}),e.jsx("button",{type:"button",className:"btn plugin-settings-reset",onClick:g,children:i("pluginSettingsReset")})]})]})}function St({text:t}){const s=r.useRef(null),[i,l]=r.useState(!1),c=()=>{var n;const a=(n=s.current)==null?void 0:n.getBoundingClientRect();a&&l(window.innerWidth-a.right<340)};return e.jsxs("span",{ref:s,className:`set-tip${i?" flip":""}`,tabIndex:0,"aria-label":t,onMouseEnter:c,onFocus:c,children:["?",e.jsx("span",{className:"set-tip-bubble",role:"tooltip",children:t})]})}function Le({title:t,subtitle:s,tip:i,enabled:l,onToggle:c,action:a}){const n=he();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,i&&e.jsx(St,{text:i})]}),s&&e.jsx("div",{className:"set-row-desc",children:s})]}),a,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 ja({chat:t,send:s,terminal:i,onSwitchToTerminal:l,onClose:c}){const a=he(),n=t.settings,[o,d]=r.useState(""),[m,x]=r.useState("append"),g=r.useRef(!1),[v,w]=r.useState(""),[R,C]=r.useState("append"),P=r.useRef(!1),[B,F]=r.useState(""),p=r.useRef(!1),[E,T]=r.useState(""),[b,k]=r.useState(!1),[u,$]=r.useState(null),[W,J]=r.useState(null);r.useEffect(()=>{n&&(x(n.promptMode),!g.current&&(d(m==="append"||n.customSystemPrompt?n.customSystemPrompt:n.defaultSystemPrompt||""),C(n.visionBridgePromptMode),!P.current&&(w(R==="append"||n.visionBridgePrompt?n.visionBridgePrompt:n.visionBridgeDefaultPrompt||""),p.current||F(n.reviewPrompt))))},[n,m,R]);const[re,V]=r.useState(String((n==null?void 0:n.terminalBashIdleMs)??15e3));if(r.useEffect(()=>{V(String((n==null?void 0:n.terminalBashIdleMs)??15e3))},[n==null?void 0:n.terminalBashIdleMs]),!n)return null;const oe=new Set(n.disabledSkills),I=new Set(n.disabledExtensions),A=f=>s({type:"set_settings",...f}),H=f=>{const D=new Set(oe);D.has(f.name)?D.delete(f.name):D.add(f.name),A({disabledSkills:[...D]})},ae=new Set(n.disabledPlugins??[]),pe=f=>{const D=new Set(ae);D.has(f.id)?D.delete(f.id):D.add(f.id),A({disabledPlugins:[...D]})},L=f=>{const D=new Set(I);D.has(f.id)?D.delete(f.id):D.add(f.id),A({disabledExtensions:[...D]})},j=(f,D)=>{var z,Q;const Y={name:f,command:D,cwd:"${pwd}"},h=t.terminals.find(Z=>Z.title===f);h?(i.restart(h.id),s({type:"run_command",terminalId:h.id,conversationId:h.conversationId,command:Y,cols:80,rows:24})):i.create({id:$e(),conversationId:t.activeConversationId||((z=t.state)==null?void 0:z.conversationId)||"",title:f,cwd:((Q=t.state)==null?void 0:Q.cwd)??"",cols:80,rows:24,running:!0,exitCode:null,command:Y}),l(),c()},G=f=>{$(null),j(`${a("uninstallTitle")} ${f}`,`pi remove npm:${f}`)},U=f=>{J(null),j(`${a("uninstallTitle")} ${f}`,`pi-web-ui uninstall ${f}`)},M=(f,D)=>{j(`${a("pluginUpdate")} ${f}`,`pi-web-ui install ${D} --name ${f} --force`)},q=f=>{const D=new Set(n.reviewSkills.filter(Y=>!Y.enabled).map(Y=>Y.name));D.has(f.name)?D.delete(f.name):D.add(f.name),A({reviewDisabledSkills:[...D]})},ce=()=>{const f=m==="replace"&&n.defaultSystemPrompt&&o===n.defaultSystemPrompt?"":o;A({promptMode:m,customSystemPrompt:f})};return e.jsx("div",{className:"modal-backdrop",onClick:c,children:e.jsxs("div",{className:"modal settings-modal",onClick:f=>f.stopPropagation(),children:[e.jsx("button",{type:"button",className:"modal-close","aria-label":a("close"),onClick:c,children:e.jsx(Ne,{})}),e.jsxs("div",{className:"modal-head",children:[e.jsx(nt,{className:"modal-head-icon"}),e.jsx("h2",{children:a("settingsTitle")})]}),e.jsx("p",{className:"modal-desc",children:a("settingsDesc")}),e.jsxs("div",{className:"modal-body",children:[e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(yt,{className:"set-section-icon"}),a("settingsSystemPrompt")]}),e.jsxs("div",{className:"set-mode-row",children:[e.jsx("label",{className:"set-field-label",children:a("settingsPromptMode")}),e.jsxs("select",{className:"set-select",value:m,onChange:f=>{const D=f.target.value;x(D),A({promptMode:D})},children:[e.jsx("option",{value:"append",children:a("promptModeAppend")}),e.jsx("option",{value:"replace",children:a("promptModeReplace")})]}),e.jsx(St,{text:a(m==="append"?"promptAppendHint":"promptReplaceHint")})]}),e.jsx("textarea",{className:"set-prompt-input",rows:6,placeholder:a("promptPlaceholder"),value:o,onFocus:()=>g.current=!0,onBlur:()=>{g.current=!1,ce()},onChange:f=>d(f.target.value)}),e.jsxs("button",{type:"button",className:"set-view-prompt-btn","aria-expanded":b,onClick:()=>k(f=>!f),children:[a("settingsViewPrompt")," ",b?"▴":"▾"]}),b&&e.jsxs("div",{className:"set-prompt-view",children:[e.jsxs("div",{className:"set-prompt-view-head",children:[e.jsx("span",{children:a("settingsViewPromptHint")}),e.jsx(_s,{text:n.effectiveSystemPrompt})]}),n.effectiveSystemPrompt?e.jsx("pre",{className:"set-prompt-view-text",children:n.effectiveSystemPrompt}):e.jsx("p",{className:"set-empty",children:a("settingsViewPromptEmpty")})]})]}),e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(Qe,{className:"set-section-icon"}),a("settingsTerminalTools")]}),e.jsx(Le,{title:a("terminalToolsEnabled"),tip:a("settingsTerminalToolsDesc"),enabled:n.terminalToolsEnabled,onToggle:()=>A({terminalToolsEnabled:!n.terminalToolsEnabled})}),!n.terminalToolsEnabled&&e.jsx("p",{className:"set-hint",children:a("terminalToolsOffHint")}),e.jsx(Le,{title:a("terminalBashTakeover"),tip:a("terminalBashTakeoverDesc"),enabled:n.terminalBash,onToggle:()=>A({terminalBash:!n.terminalBash})}),n.terminalBash&&e.jsxs("div",{className:"set-field",children:[e.jsx("label",{className:"set-field-label",htmlFor:"tb-idle-ms",children:a("terminalBashIdleMs")}),e.jsx("input",{id:"tb-idle-ms",className:"set-input",type:"number",min:0,step:1e3,value:re,onChange:f=>V(f.target.value),onBlur:()=>{const f=Math.max(0,Math.floor(Number(re)||0));V(String(f)),f!==n.terminalBashIdleMs&&A({terminalBashIdleMs:f})}})]})]}),e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(Ge,{className:"set-section-icon"}),a("settingsMessageDisplay")]}),e.jsx(Le,{title:a("thinkingWrap"),tip:a("thinkingWrapDesc"),enabled:n.thinkingWrap??!0,onToggle:()=>A({thinkingWrap:!(n.thinkingWrap??!0)})})]}),e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(lt,{className:"set-section-icon"}),a("settingsSkills"),e.jsx("span",{className:"set-count",children:n.skills.length})]}),n.skills.length===0?e.jsx("p",{className:"set-empty",children:a("noSkills")}):e.jsx("div",{className:"set-list",children:n.skills.map(f=>e.jsx(Le,{title:f.name,subtitle:f.description,enabled:f.enabled,onToggle:()=>H(f)},f.name))})]}),e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(wn,{className:"set-section-icon"}),a("settingsExtensions"),e.jsx("span",{className:"set-count",children:n.extensions.length})]}),n.extensions.length===0?e.jsx("p",{className:"set-empty",children:a("noExtensions")}):e.jsx("div",{className:"set-list",children:n.extensions.map(f=>{const D=f.id.startsWith("npm:")?f.id.slice(4):null;return e.jsx(Le,{title:f.name,subtitle:f.path,enabled:f.enabled,onToggle:()=>L(f),action:D?u===f.id?e.jsx("button",{type:"button",className:"set-uninstall confirm",title:a("uninstallConfirmHint"),onClick:()=>G(D),children:a("uninstallConfirm")}):e.jsxs("button",{type:"button",className:"set-uninstall",title:a("uninstallHint"),onClick:()=>$(f.id),children:[e.jsx(De,{}),a("uninstallExt")]}):void 0},f.id)})})]}),e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(Fn,{className:"set-section-icon"}),a("settingsUiPlugins"),e.jsx("span",{className:"set-count",children:t.plugins.length})]}),t.plugins.length===0?e.jsx("p",{className:"set-empty",children:a("noUiPlugins")}):e.jsx("div",{className:"set-list",children:t.plugins.map(f=>{var D;return e.jsxs(e.Fragment,{children:[e.jsx(Le,{title:`${f.icon?`${f.icon} `:""}${f.name}`,subtitle:(f.error?`${f.id} · ${f.error}`:f.source?`${f.id} · ${f.source}`:`${f.id} · ${a("uiPluginNoSource")}`)+((D=f.permissions)!=null&&D.length?` · ${a("uiPluginPerms")}: ${f.permissions.join(", ")}`:""),enabled:!ae.has(f.id)&&!f.error,onToggle:()=>!f.error&&pe(f),action:e.jsxs("div",{className:"set-row-actions",children:[f.source&&e.jsxs("button",{type:"button",className:"set-uninstall",title:a("pluginUpdateHint"),onClick:()=>M(f.id,f.source),children:[e.jsx(rt,{}),a("pluginUpdate")]}),W===f.id?e.jsx("button",{type:"button",className:"set-uninstall confirm",title:a("pluginUninstallHint"),onClick:()=>U(f.id),children:a("uninstallConfirm")}):e.jsxs("button",{type:"button",className:"set-uninstall",title:a("pluginUninstallHint"),onClick:()=>J(f.id),children:[e.jsx(De,{}),a("uninstallExt")]})]})},f.id),f.settingsSchema&&f.settingsSchema.length>0&&e.jsx(ba,{plugin:f,send:s})]})})})]}),e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(yt,{className:"set-section-icon"}),a("settingsReview"),e.jsx(St,{text:a("settingsReviewDesc")}),e.jsx("span",{className:"set-count",children:n.reviewSkills.length})]}),e.jsx("textarea",{className:"set-prompt-input",rows:5,placeholder:a("reviewPromptPlaceholder"),value:B,onFocus:()=>p.current=!0,onBlur:()=>{p.current=!1,A({reviewPrompt:B})},onChange:f=>F(f.target.value)}),e.jsx("div",{className:"set-field-label",children:a("settingsReviewSkills")}),n.reviewSkills.length===0?e.jsx("p",{className:"set-empty",children:a("noSkills")}):e.jsx("div",{className:"set-list",children:n.reviewSkills.map(f=>e.jsx(Le,{title:f.name,subtitle:f.description,enabled:f.enabled,onToggle:()=>q(f)},`review-${f.name}`))})]}),e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(Ms,{className:"set-section-icon"}),a("settingsVisionBridge")]}),e.jsx(Le,{title:a("visionBridgeEnabled"),tip:a("settingsVisionBridgeDesc"),enabled:n.visionBridgeEnabled,onToggle:()=>A({visionBridgeEnabled:!n.visionBridgeEnabled})}),!n.visionBridgeEnabled&&e.jsx("p",{className:"set-hint",children:a("visionBridgeOffHint")}),n.visionBridgeEnabled&&e.jsxs("div",{className:"set-mode-row",children:[e.jsx("label",{className:"set-field-label",children:a("visionBridgeModel")}),e.jsxs("select",{className:"set-select",value:n.visionBridgeModel??"",onChange:f=>A({visionBridgeModel:f.target.value||null}),children:[e.jsx("option",{value:"",children:a("visionBridgeAuto")}),n.visionModels.map(f=>e.jsx("option",{value:`${f.provider}/${f.id}`,children:f.label},`${f.provider}/${f.id}`))]})]}),n.visionBridgeEnabled&&e.jsxs("div",{className:"set-mode-row",children:[e.jsx("label",{className:"set-field-label",children:a("visionBridgePromptMode")}),e.jsxs("select",{className:"set-select",value:R,onChange:f=>{const D=f.target.value;C(D),A({visionBridgePromptMode:D})},children:[e.jsx("option",{value:"append",children:a("promptModeAppend")}),e.jsx("option",{value:"replace",children:a("promptModeReplace")})]})]}),n.visionBridgeEnabled&&e.jsx("textarea",{className:"set-prompt-input",rows:4,placeholder:a("visionBridgePromptPlaceholder"),value:v,onFocus:()=>P.current=!0,onBlur:()=>{P.current=!1;const f=R==="replace"&&n.visionBridgeDefaultPrompt&&v===n.visionBridgeDefaultPrompt?"":v;A({visionBridgePromptMode:R,visionBridgePrompt:f})},onChange:f=>w(f.target.value)}),n.visionBridgeEnabled&&(n.visionModels.length===0?e.jsx("p",{className:"set-hint",children:a("visionBridgeNoModels")}):e.jsx("p",{className:"set-hint",children:a("visionBridgeCurrent",{model:n.visionBridgeModel??a("visionBridgeAuto")})}))]}),e.jsxs("div",{className:"set-section",children:[e.jsxs("div",{className:"set-section-title",children:[e.jsx(nt,{className:"set-section-icon"}),a("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:a("presetNamePlaceholder"),value:E,onChange:f=>T(f.target.value),onKeyDown:f=>{f.key==="Enter"&&E.trim()&&(s({type:"save_preset",name:E.trim()}),T(""))}}),e.jsxs("button",{type:"button",className:"set-save-btn",disabled:!E.trim(),onClick:()=>{s({type:"save_preset",name:E.trim()}),T("")},children:[e.jsx(Ue,{})," ",a("saveAsPreset")]})]}),n.presets.length===0?e.jsx("p",{className:"set-empty",children:a("noPresets")}):e.jsx("div",{className:"set-list",children:n.presets.map(f=>e.jsxs("div",{className:"set-row",children:[e.jsxs("div",{className:"set-row-info",children:[e.jsx("div",{className:"set-row-name",children:f.name}),e.jsxs("div",{className:"set-row-desc",children:[f.promptMode==="replace"?a("promptModeReplace"):a("promptModeAppend"),f.disabledSkills.length>0&&` · ${a("settingsSkills")} ${f.disabledSkills.length}`,f.disabledExtensions.length>0&&` · ${a("settingsExtensions")} ${f.disabledExtensions.length}`]})]}),e.jsxs("div",{className:"set-row-actions",children:[e.jsx("button",{type:"button",className:"dd-refresh",onClick:()=>s({type:"apply_preset",name:f.name}),children:a("applyPreset")}),e.jsx("button",{type:"button",className:"set-icon-btn danger",title:a("deletePreset"),onClick:()=>s({type:"delete_preset",name:f.name}),children:e.jsx(De,{})})]})]},f.name))})]})]}),e.jsx("div",{className:"modal-actions",children:e.jsx("button",{type:"button",className:"dd-refresh",onClick:c,children:a("close")})})]})})}function ka(t,s){const i=Math.max(0,Date.now()-t),l=Math.floor(i/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 wa({servers:t,send:s,onClose:i}){const l=he(),[c,a]=r.useState(new Set),n=o=>a(d=>{const m=new Set(d);return m.has(o)?m.delete(o):m.add(o),m});return r.useEffect(()=>{s({type:"list_bg_servers"})},[]),e.jsx("div",{className:"modal-backdrop",onClick:i,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(at,{})," ",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:i,children:e.jsx(Ne,{})})]}),t.length===0?e.jsxs("div",{className:"bg-task-empty",children:[e.jsx(at,{}),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,m=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")," ",ka(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(m)?"open":""}`,title:`${l("bgTaskCommand")}: ${o.command}`,onClick:()=>n(m),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(st,{}),e.jsx("span",{children:l("bgTaskStop")})]})]},m)})}),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(rt,{}),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(st,{}),e.jsx("span",{children:l("bgTaskStopAll")})]})]})]})})}function Xe(t,s){return t.toLowerCase().includes(s)}function Na({send:t,sessions:s,projects:i,cwd:l,fileSearch:c,onClose:a,onSwitchSession:n,onSwitchProject:o,onPreviewFile:d}){const m=he(),x=r.useRef(null),[g,v]=r.useState(""),w=r.useDeferredValue(g),[R,C]=r.useState(0),P=r.useRef(1),B=r.useRef(0),F=r.useRef(null);r.useEffect(()=>{t({type:"list_sessions"}),t({type:"list_projects"}),requestAnimationFrame(()=>{var I;return(I=x.current)==null?void 0:I.focus()})},[]);const[p,E]=r.useState(!1);r.useEffect(()=>{F.current&&clearTimeout(F.current);const I=w.trim();if(I)return F.current=setTimeout(()=>{const A=++P.current;B.current=A,E(!0),t({type:"search_files",reqId:A,query:I})},300),()=>{F.current&&clearTimeout(F.current)}},[w]);const T=w.trim().toLowerCase(),b=r.useMemo(()=>T?s.filter(I=>Xe(I.firstMessage??"",T)||Xe(I.name??"",T)||Xe(I.path.split(/[\\/]/).pop()??"",T)).slice(0,20):[],[s,T]),k=r.useMemo(()=>T?i.filter(I=>Xe(I.path,T)).slice(0,10):[],[i,T]),u=r.useMemo(()=>!T||!c||c.reqId!==B.current||!c.ok?[]:c.results,[c,T]);r.useEffect(()=>{c&&c.reqId===B.current&&B.current!==0&&E(!1)},[c]);const $=!!c&&c.ok&&c.truncated,W=r.useMemo(()=>[...b.map(I=>({kind:"session",path:I.path})),...k.map(I=>({kind:"project",path:I.path})),...u.filter(I=>I.type==="file").map(I=>({kind:"file",path:I.path,name:I.name}))],[b,k,u]);r.useEffect(()=>{C(0)},[w]);const J=r.useCallback(I=>{I&&(I.kind==="session"?n(I.path):I.kind==="project"?o(I.path):d(I.path,I.name),a())},[n,o,d,a]);r.useEffect(()=>{const I=A=>{A.key==="Escape"?(A.preventDefault(),A.stopPropagation(),a()):A.key==="ArrowDown"?(A.preventDefault(),C(H=>Math.min(H+1,W.length-1))):A.key==="ArrowUp"?(A.preventDefault(),C(H=>Math.max(H-1,0))):A.key==="Enter"&&(A.preventDefault(),J(W[R]))};return window.addEventListener("keydown",I,!0),()=>window.removeEventListener("keydown",I,!0)},[W,R,J,a]);const re=b.length+k.length+u.length,V=(I,A,H)=>e.jsxs("div",{className:"gs-section-head",children:[H,e.jsx("span",{children:I}),e.jsx("em",{children:A})]});let oe=-1;return e.jsx("div",{className:"modal-backdrop gs-backdrop",onClick:a,children:e.jsxs("div",{className:"gs-modal",onClick:I=>I.stopPropagation(),children:[e.jsxs("div",{className:"gs-input-row",children:[e.jsx(it,{}),e.jsx("input",{ref:x,type:"text",value:g,placeholder:m("gsPlaceholder"),onChange:I=>v(I.target.value)}),e.jsx("button",{type:"button",className:"gs-close",title:m("close"),onClick:a,children:e.jsx(Ne,{})})]}),e.jsxs("div",{className:"gs-results",children:[!T&&e.jsx("div",{className:"gs-empty",children:m("gsHint")}),T&&re===0&&!$&&e.jsx("div",{className:"gs-empty",children:m(p?"gsSearching":"gsNoResults")}),b.length>0&&e.jsxs("div",{className:"gs-section",children:[V(m("gsSessions"),b.length,e.jsx(Ge,{})),b.map(I=>{oe++;const A=oe;return e.jsxs("button",{type:"button",className:A===R?"gs-item active":"gs-item",onMouseEnter:()=>C(A),onClick:()=>J({kind:"session",path:I.path}),children:[e.jsxs("span",{className:"gs-item-title",children:[I.name||I.path.split(/[\\/]/).pop(),e.jsx("em",{className:"gs-item-meta",children:I.messageCount})]}),e.jsx("span",{className:"gs-item-sub",children:I.firstMessage})]},I.path)})]}),k.length>0&&e.jsxs("div",{className:"gs-section",children:[V(m("gsProjects"),k.length,e.jsx(qe,{})),k.map(I=>{oe++;const A=oe,H=l&&I.path===l;return e.jsxs("button",{type:"button",className:A===R?"gs-item active":"gs-item",onMouseEnter:()=>C(A),onClick:()=>J({kind:"project",path:I.path}),children:[e.jsxs("span",{className:"gs-item-title",children:[I.path.split(/[\\/]/).pop(),H&&e.jsx("em",{className:"gs-item-meta",children:m("gsCurrentProject")})]}),e.jsx("span",{className:"gs-item-sub",children:I.path})]},I.path)})]}),(u.length>0||T&&$)&&e.jsxs("div",{className:"gs-section",children:[V(m("gsFiles"),u.length,e.jsx(Bn,{})),u.map(I=>{oe++;const A=oe;return e.jsxs("button",{type:"button",className:A===R?"gs-item active":"gs-item",disabled:I.type==="dir",title:I.type==="dir"?void 0:m("gsOpenPreview"),onMouseEnter:()=>C(A),onClick:()=>{I.type==="file"&&J({kind:"file",path:I.path,name:I.name})},children:[e.jsx("span",{className:"gs-item-title",children:I.name}),e.jsx("span",{className:"gs-item-sub",children:I.path})]},`${I.type}:${I.path}`)}),$&&e.jsx("div",{className:"gs-truncated",children:m("gsTruncated")})]})]}),e.jsxs("div",{className:"gs-foot",children:[e.jsxs("span",{children:["↑↓ ",m("gsNavigate")]}),e.jsxs("span",{children:["Enter ",m("gsOpen")]}),e.jsxs("span",{children:["Esc ",m("gsCloseHint")]})]})]})})}const xt=5e3;function Ca({file:t,content:s,send:i,onAddLines:l,onAttach:c,onClose:a}){const n=he(),[o,d]=r.useState(null),[m,x]=r.useState(!1),[g,v]=r.useState(null),[w,R]=r.useState(!1),[C,P]=r.useState(!1),[B,F]=r.useState(!1),[p,E]=r.useState(""),[T,b]=r.useState(!0),k=r.useRef(!1),[u,$]=r.useState(!0),[W,J]=r.useState(!1),[re,V]=r.useState(100),oe=r.useRef(0),I=r.useRef(!1),A=r.useRef(null);r.useEffect(()=>{x(!0),d(null),v(null),F(!1),E(""),b(!0),k.current=!1,i({type:"read_file",path:t.path})},[t.path,i]),r.useEffect(()=>{s&&s.path===t.path&&(d(s),B||E(s.text),x(!1))},[s,B,t.path]),r.useEffect(()=>{const X=de=>{if(de.key==="Escape"){f();return}if((de.ctrlKey||de.metaKey)&&de.key.toLowerCase()==="s"&&B){de.preventDefault(),ce();return}const se=de.target,Ce=se&&(se.tagName==="INPUT"||se.tagName==="TEXTAREA"||se.isContentEditable);(de.ctrlKey||de.metaKey)&&de.key.toLowerCase()==="a"&&!Ce&&(de.preventDefault(),j())};return document.addEventListener("keydown",X),()=>document.removeEventListener("keydown",X)},[a,o,B,p]),r.useEffect(()=>{const X=()=>{I.current=!1,R(!1)};return window.addEventListener("mouseup",X),()=>window.removeEventListener("mouseup",X)},[]);const H=r.useMemo(()=>{if(!o)return[];const X=o.text.split(`
19
- `);return X.length>0&&X[X.length-1]===""&&X.pop(),X.slice(0,xt)},[o]),ae=(o==null?void 0:o.lines)??0,pe=ae>xt,L=(X,de)=>{if(de){const se=oe.current>0?oe.current:X;v({start:Math.min(se,X),end:Math.max(se,X)})}else oe.current=X,v({start:X,end:X})},j=()=>{H.length!==0&&(oe.current=1,v({start:1,end:H.length}))},G=()=>{g&&(l(t.path,t.name,g.start,g.end),P(!0),A.current&&clearTimeout(A.current),A.current=setTimeout(()=>P(!1),1400))},U=o!==null&&o.kind==="text"&&!o.binary&&!o.truncated,M=()=>{E((o==null?void 0:o.text)??""),F(!1),k.current&&b(!0)},q=()=>{if(B){if(p!==((o==null?void 0:o.text)??"")&&!window.confirm(n("discardFileChanges")))return;M();return}!U||!o||(k.current=vt(t.name)&&T,vt(t.name)&&b(!1),v(null),E(o.text),F(!0))},ce=()=>{!B||!o||!U||i({type:"write_file",path:t.path,text:p})&&(F(!1),k.current&&b(!0),v(null))},f=()=>{B&&p!==((o==null?void 0:o.text)??"")&&!window.confirm(n("discardFileChanges"))||a()},D=X=>{V(Math.min(200,Math.max(50,X)))},Y=g?g.end-g.start+1:0,h=(o==null?void 0:o.binary)??!1,z=(o==null?void 0:o.truncated)??!1,Q=(o==null?void 0:o.kind)??"text",Z=vt(t.name),me=Z&&T&&!B&&Q==="text"&&!h,ve=X=>ut(`/api/file?clientId=${encodeURIComponent(Pt())}&path=${encodeURIComponent(X)}`);return e.jsx("div",{className:`fp-overlay ${W?"fullscreen":""}`,onMouseDown:X=>{X.target===X.currentTarget&&f()},children:e.jsxs("div",{className:`fp ${W?"fullscreen":""}`,style:{"--fp-zoom":re/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&&Q==="text"&&!h&&n("fileLines",{n:ae}),o&&` · ${Sa(o.size)}`]}),e.jsxs("span",{className:"fp-head-actions",children:[Z&&Q==="text"&&!h&&o&&e.jsx("button",{type:"button",className:`fp-attach markdown ${T?"on":""}`,"data-tip":n(T?"showMarkdownSource":"showMarkdownPreview"),disabled:B,onClick:()=>b(X=>!X),children:T?e.jsx(Ms,{}):e.jsx($n,{})}),Q==="text"&&!h&&o&&e.jsx("button",{type:"button",className:`fp-attach edit ${B?"on":""}`,"data-tip":n(z?"fileEditTruncated":B?"exitEditFile":"editFile"),disabled:!U&&!B,onClick:q,children:e.jsx(jt,{})}),Q==="text"&&!h&&!me&&e.jsx("button",{type:"button",className:`fp-attach wrap ${u?"on":""}`,"data-tip":n(u?"disableWrap":"enableWrap"),onClick:()=>$(X=>!X),children:e.jsx(Dn,{})}),Q==="text"&&o&&e.jsxs("span",{className:"fp-zoom",children:[e.jsx("button",{type:"button",className:"fp-attach zoom-out","data-tip":n("zoomOut"),disabled:re<=50,onClick:()=>D(re-10),children:e.jsx(xn,{})}),e.jsxs("button",{type:"button",className:"fp-zoom-val",title:n("resetZoom"),onClick:()=>V(100),children:[re,"%"]}),e.jsx("button",{type:"button",className:"fp-attach zoom-in","data-tip":n("zoomIn"),disabled:re>=200,onClick:()=>D(re+10),children:e.jsx(vn,{})})]}),Q!=="video"&&Q!=="none"&&e.jsx("button",{type:"button",className:"fp-attach inline","data-tip":n("attachInlineTip"),onClick:()=>c(t.path,t.name,"inline"),children:e.jsx(Ue,{})}),e.jsx("button",{type:"button",className:"fp-attach ref","data-tip":n("referenceTip"),onClick:()=>c(t.path,t.name,"reference"),children:e.jsx(bt,{})}),e.jsx("button",{type:"button",className:`fp-attach full ${W?"on":""}`,"data-tip":n(W?"exitFullscreen":"fullscreen"),onClick:()=>J(X=>!X),children:W?e.jsx(Cn,{}):e.jsx(Tn,{})}),e.jsx("button",{type:"button",className:"fp-close",title:n("close"),onClick:f,children:e.jsx(Ne,{})})]})]}),z&&Q==="text"&&!h&&e.jsx("div",{className:"fp-notice",children:n("previewTruncated")}),m&&!o&&e.jsx("div",{className:"fp-empty",children:n("loading")}),!m&&Q==="none"&&!h&&e.jsx("div",{className:"fp-empty",children:n("previewNotSupported")}),!m&&Q==="image"&&e.jsx("div",{className:"fp-media-wrap",children:e.jsx("img",{className:"fp-media",src:ve(t.path),alt:t.name})}),!m&&Q==="video"&&e.jsx("div",{className:"fp-media-wrap",children:e.jsx("video",{className:"fp-media",src:ve(t.path),controls:!0,preload:"metadata"})}),!m&&me&&o&&e.jsx("div",{className:"fp-markdown msg-text",children:e.jsx("div",{className:"fp-markdown-zoom",children:e.jsx(mt,{text:o.text})})}),!m&&h&&Q!=="image"&&Q!=="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})]}),!m&&B&&Q==="text"&&!h&&o&&e.jsx("textarea",{className:`fp-editor ${u?"":"no-wrap"}`,value:p,onChange:X=>E(X.target.value),wrap:u?"soft":"off",spellCheck:!1,autoFocus:!0}),!m&&!me&&!B&&Q==="text"&&!h&&o&&H.length===0&&e.jsx("div",{className:"fp-empty",children:n("emptyFile")}),!m&&!me&&!B&&Q==="text"&&!h&&H.length>0&&e.jsxs("div",{className:`fp-code ${w?"dragging":""} ${u?"":"no-wrap"}`,onMouseDown:X=>{X.button===0&&X.preventDefault()},children:[H.map((X,de)=>{const se=de+1,Ce=g!==null&&se>=g.start&&se<=g.end;return e.jsxs("div",{className:`fp-line ${Ce?"sel":""}`,onMouseDown:Re=>{Re.button===0&&(L(se,Re.shiftKey),I.current=!0,R(!0))},onMouseEnter:()=>{I.current&&L(se,!0)},children:[e.jsx("span",{className:"fp-num",children:se}),e.jsx("span",{className:"fp-code-text",children:X})]},se)}),pe&&e.jsx("div",{className:"fp-lines-note",children:n("previewLinesTruncated",{n:xt})})]}),e.jsx("div",{className:"fp-foot",children:B?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:q,children:n("cancel")}),e.jsxs("button",{type:"button",className:"btn primary",disabled:p===((o==null?void 0:o.text)??""),onClick:ce,children:[e.jsx(kn,{})," ",n("saveFile")]})]})]}):!me&&Q==="text"&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"fp-hint",children:g?n("selectedRange",{n:Y,start:g.start,end:g.end}):n("selectLinesHint")}),e.jsxs("div",{className:"fp-actions",children:[e.jsx("button",{type:"button",className:"btn",disabled:H.length===0,onClick:j,children:n("selectAll")}),e.jsx("button",{type:"button",className:"btn",disabled:!g,onClick:()=>v(null),children:n("clearSelection")}),e.jsxs("button",{type:"button",className:"btn primary",disabled:!g||h,onClick:G,children:[C?e.jsx(dt,{}):null,n(C?"addedToChat":"addToChat")]})]})]})})]})})}function vt(t){const s=t.toLowerCase();return s.endsWith(".md")||s.endsWith(".markdown")}function Sa(t){return t>=1024*1024?`${(t/(1024*1024)).toFixed(1)} MB`:t>=1024?`${Math.round(t/1024)} KB`:`${t} B`}const Gs="pi-web-sounds",ze={enabled:!0,question:!0,done:!0,start:!1,error:!0,volume:100};function Js(){try{const t=localStorage.getItem(Gs);if(!t)return{...ze};const s=JSON.parse(t),i={...ze,...s};for(const l of["enabled","question","done","start","error"])typeof i[l]!="boolean"&&(i[l]=ze[l]);return typeof i.volume!="number"||!Number.isFinite(i.volume)?i.volume=ze.volume:i.volume=Math.round(Math.max(0,Math.min(100,i.volume))/5)*5,i}catch{return{...ze}}}function Ta(t){try{localStorage.setItem(Gs,JSON.stringify(t))}catch{}}let Ke=null;function Ea(){try{if(!Ke){const t=window.AudioContext??window.webkitAudioContext;if(!t)return null;Ke=new t}return Ke.state==="suspended"&&Ke.resume(),Ke}catch{return null}}const Ma=[{type:"sine",freq:587.33,start:0,dur:.13,peak:.5},{type:"sine",freq:880,start:.11,dur:.24,peak:.5}],Ra=[{type:"sine",freq:880,start:0,dur:.15,peak:.35},{type:"sine",freq:587.33,start:.15,dur:.32,peak:.35}],Pa=[{type:"triangle",freq:660,start:0,dur:.08,peak:.22}],La=[{type:"square",freq:220,start:0,dur:.16,peak:.18},{type:"square",freq:174.61,start:.18,dur:.26,peak:.18}],Ia={question:Ma,done:Ra,start:Pa,error:La};function Ba(t,s,i){const l=t.createOscillator(),c=t.createGain();l.type=s.type,l.frequency.value=s.freq;const a=t.currentTime+s.start,n=Math.max(1e-4,s.peak*i);c.gain.setValueAtTime(1e-4,a),c.gain.exponentialRampToValueAtTime(n,a+.012),c.gain.exponentialRampToValueAtTime(1e-4,a+s.dur),l.connect(c),c.connect(t.destination),l.start(a),l.stop(a+s.dur+.05)}function Ve(t,s=Js()){if(!s.enabled||!s[t])return;const i=Ea();if(!i)return;const l=Math.max(0,Math.min(1,s.volume/100));for(const c of Ia[t])Ba(i,c,l)}const Tt="pi-web-ui:theme",Qs="dark",vs="theme-stylesheet",ys="pi-web-ui:theme-change";function Ys(){try{const t=localStorage.getItem(Tt);if(t&&t!==Qs)return t}catch{}return null}function Da(t){try{t?localStorage.setItem(Tt,t):localStorage.removeItem(Tt)}catch{}}function Xs(t){let s=document.getElementById(vs);if(!t){s==null||s.remove(),window.dispatchEvent(new CustomEvent(ys));return}s||(s=document.createElement("link"),s.id=vs,s.rel="stylesheet",document.head.appendChild(s)),s.href=`/themes/${encodeURIComponent(t)}.css`,s.onload=()=>window.dispatchEvent(new CustomEvent(ys))}async function $a(){try{const t=await fetch(ut("/api/themes"));if(!t.ok)return[];const s=await t.json();return Array.isArray(s.themes)?s.themes:[]}catch{return[]}}function _a(){const[t,s]=r.useState([]),[i,l]=r.useState(()=>Ys());return r.useEffect(()=>{let a=!1;return $a().then(n=>{a||s(n)}),()=>{a=!0}},[]),r.useEffect(()=>{Xs(i),Da(i)},[i]),{themes:t,theme:i,switchTheme:a=>l(a===Qs?null:a)}}function za(){const t=getComputedStyle(document.documentElement),s=(i,l)=>t.getPropertyValue(i).trim()||l;return{background:s("--term-bg","#0b0d12"),foreground:s("--term-fg","#e6e8ef"),cursor:s("--term-cursor","#8b5cf6"),cursorAccent:s("--term-cursor-accent","#0b0d12"),selectionBackground:s("--term-selection","rgba(139, 92, 246, 0.35)"),black:s("--term-black","#1a1d26"),red:s("--term-red","#f87171"),green:s("--term-green","#34d399"),yellow:s("--term-yellow","#fbbf24"),blue:s("--term-blue","#60a5fa"),magenta:s("--term-magenta","#c084fc"),cyan:s("--term-cyan","#22d3ee"),white:s("--term-white","#e6e8ef"),brightBlack:s("--term-bright-black","#6b7284"),brightRed:s("--term-bright-red","#f87171"),brightGreen:s("--term-bright-green","#34d399"),brightYellow:s("--term-bright-yellow","#fbbf24"),brightBlue:s("--term-bright-blue","#60a5fa"),brightMagenta:s("--term-bright-magenta","#c084fc"),brightCyan:s("--term-bright-cyan","#22d3ee"),brightWhite:s("--term-bright-white","#ffffff")}}const Fa=r.lazy(()=>Ns(()=>import("./TerminalPanel-BuG4RDBE.js"),__vite__mapDeps([0,1,2,3,4])).then(t=>({default:t.TerminalPanel})));function Aa({notice:t,onDismiss:s}){const i=he(),[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 a=t.level==="error"?Wn:t.level==="warning"?On:Pn;return e.jsxs("div",{className:`notice notice-${t.level}${l?" paused":""}`,role:"status",onMouseEnter:()=>c(!0),onMouseLeave:()=>c(!1),children:[e.jsx(a,{className:"notice-icon"}),e.jsx("span",{className:"notice-text",children:t.text}),e.jsx("button",{type:"button",className:"notice-close",title:i("close"),onClick:()=>s(t.id),children:e.jsx(Ne,{})})]})}const Oa=[],Zs=180,en=520,tn=240,sn=t=>`pi-web-ui:${t}-panel-width`;function bs(t){const s=Number(localStorage.getItem(sn(t)));return Number.isFinite(s)&&s>=Zs&&s<=en?s:tn}function js({side:t,width:s,onResize:i}){const l=he(),c=r.useCallback(a=>{a.preventDefault();const n=a.clientX,o=s;let d=o;const m=g=>{const v=t==="left"?g.clientX-n:n-g.clientX;d=Math.min(en,Math.max(Zs,Math.round(o+v))),i(d)},x=()=>{window.removeEventListener("pointermove",m),window.removeEventListener("pointerup",x),document.body.classList.remove("panel-resizing"),localStorage.setItem(sn(t),String(d))};window.addEventListener("pointermove",m),window.addEventListener("pointerup",x),document.body.classList.add("panel-resizing")},[t,s,i]);return e.jsx("div",{className:`resize-handle resize-${t}`,title:l("dragToResize"),onPointerDown:c,onDoubleClick:()=>i(tn)})}function Wa(){var je,fe,ke,Te,Bt,Dt,$t,_t,Ft,At,Ot,Wt,Ht;const t=he(),{chat:s,send:i,dismissNotice:l,pushNotice:c,terminal:a}=ui(),[n,o]=r.useState([]),[d,m]=r.useState(null),[x,g]=r.useState(!1),[v,w]=r.useState("chat"),R=r.useMemo(()=>s.plugins.filter(S=>{var O,te;return!((te=(O=s.settings)==null?void 0:O.disabledPlugins)!=null&&te.includes(S.id))}),[s.plugins,(je=s.settings)==null?void 0:je.disabledPlugins]),[C,P]=r.useState([]);r.useEffect(()=>si(P),[]),r.useEffect(()=>{ni(R,s.pluginsEpoch)},[R,s.pluginsEpoch]);const[B,F]=r.useState(()=>bs("left")),[p,E]=r.useState(()=>bs("right")),T=r.useCallback(S=>F(S),[]),b=r.useCallback(S=>E(S),[]),[k,u]=r.useState(null),[$,W]=r.useState(()=>window.matchMedia("(max-width: 768px)").matches);r.useEffect(()=>{const S=window.matchMedia("(max-width: 768px)"),O=te=>W(te.matches);return S.addEventListener("change",O),()=>S.removeEventListener("change",O)},[]);const[J,re]=r.useState(!1),[V,oe]=r.useState(!1),[I,A]=r.useState(!1),[H,ae]=r.useState(!1),[pe,L]=r.useState(!1);r.useEffect(()=>{const S=O=>{var Pe,Ut;const te=O.detail,xe=(te==null?void 0:te.title)||"插件命令",ye=te==null?void 0:te.command;if(!ye||!s.ready)return;const Se={name:xe,command:ye,cwd:"${pwd}"},be=s.terminals.find(pt=>pt.title===xe);if(be)a.restart(be.id),i({type:"run_command",terminalId:be.id,conversationId:be.conversationId,command:Se,cols:80,rows:24});else{const pt=$e();a.create({id:pt,conversationId:s.activeConversationId||((Pe=s.state)==null?void 0:Pe.conversationId)||"",title:xe,cwd:((Ut=s.state)==null?void 0:Ut.cwd)??"",cols:80,rows:24,running:!0,exitCode:null,command:Se})}w("terminal")};return window.addEventListener("pi-web-ui:plugin-run-command",S),()=>window.removeEventListener("pi-web-ui:plugin-run-command",S)},[s,a,i]),r.useEffect(()=>{const S=O=>{!(O.ctrlKey||O.metaKey)||O.key.toLowerCase()!=="k"||(O.preventDefault(),L(te=>!te))};return window.addEventListener("keydown",S),()=>window.removeEventListener("keydown",S)},[]);const[j,G]=r.useState(Js),{themes:U,theme:M,switchTheme:q}=_a(),ce=r.useRef(null),f=r.useRef(null),D=r.useRef(0),Y=r.useRef(!1),h=r.useRef(s.terminals);r.useEffect(()=>{Ta(j)},[j]),r.useEffect(()=>{var O;const S=h.current;h.current=s.terminals;for(const te of s.terminals){const xe=((O=te.command)==null?void 0:O.command)??"",ye=S.find(Se=>Se.id===te.id);!(ye!=null&&ye.running)||te.running||(xe.startsWith("pi remove ")?i({type:"extensions_reload"}):(xe.startsWith("pi-web-ui install ")||xe.startsWith("pi-web-ui uninstall "))&&i({type:"plugins_reload"}))}},[s.terminals,i]),r.useEffect(()=>{var te;const S=((te=s.state)==null?void 0:te.isStreaming)??!1,O=ce.current;ce.current=S,O!==null&&(!O&&S?Ve("start",j):O&&!S&&Ve("done",j))},[(fe=s.state)==null?void 0:fe.isStreaming,j]),r.useEffect(()=>{var O;const S=((O=s.dialog)==null?void 0:O.id)??null;S!==null&&S!==f.current&&Ve("question",j),f.current=S},[s.dialog,j]),r.useEffect(()=>{const S=[...s.notices].reverse().find(O=>O.level==="error");S&&S.id!==D.current&&(D.current=S.id,Ve("error",j))},[s.notices,j]);const z=(S,O,te,xe=!1,ye)=>{const Se=`${S}|${te}|${ye?`${ye.start}-${ye.end}`:""}`;o(be=>be.some(Pe=>`${Pe.path}|${Pe.mode}|${Pe.lines?`${Pe.lines.start}-${Pe.lines.end}`:""}`===Se)?be:[...be,{path:S,name:O,mode:te,isDir:xe,...ye?{lines:ye}:{}}])},Q=S=>o(O=>O.filter(te=>te.key?te.key!==S:te.path!==S)),Z=r.useCallback(S=>(!S.type.startsWith("list_")&&!S.type.startsWith("get_")&&u(null),i(S)),[i]),me=r.useRef(0),ve=r.useRef(0),X=S=>{var xe;const O=Date.now();(xe=s.state)!=null&&xe.model&&!s.state.model.vision&&O-ve.current>1e4&&(ve.current=O,c("warning",t("imageNotSupported")));const te=`paste-${++me.current}`;o(ye=>[...ye,{path:"",key:te,name:S.name,mode:"inline",imageData:S.data,mimeType:S.mimeType}])},de=async S=>{for(const O of S){const te=await Ws(O);if(!te){c("error",t("imageLoadFailed",{name:O.name}));continue}X(te)}},se=20*1024*1024,Ce=r.useRef(0),Re=async S=>{if(S.size>se){c("warning",t("fileTooLarge",{name:S.name,size:se/1024/1024}));return}let O;try{O=(await new Promise((ye,Se)=>{const be=new FileReader;be.onload=()=>ye(be.result),be.onerror=()=>Se(be.error??new Error("read failed")),be.readAsDataURL(S)})).replace(/^data:[^;]*;base64,/,"")}catch{c("error",t("fileLoadFailed",{name:S.name}));return}const te=`upload-${++Ce.current}`;o(xe=>[...xe,{path:"",key:te,name:S.name,mode:"inline",fileData:O,size:S.size,mimeType:S.type||void 0}])},Ee=async S=>{for(const O of S)Me(O.type)?await de([O]):await Re(O)},Fe=r.useCallback((S,O,te)=>{i({type:"edit_message",messageId:S,text:O,attachments:te})},[i]),Ae=r.useCallback(()=>oe(!0),[]),N=r.useCallback(()=>o([]),[]),_=r.useCallback(Q,[]),le=r.useCallback(de,[de]),ne=r.useCallback(Ee,[Ee]),ue=(ke=s.state)==null?void 0:ke.model,ge=(Te=s.state)==null?void 0:Te.thinkingLevel,y=(Bt=s.state)==null?void 0:Bt.availableThinkingLevels,ie=r.useMemo(()=>ue?{model:ue,thinkingLevel:ge??"off",availableThinkingLevels:y??[]}:null,[ue,ge,y]),ee=r.useCallback(()=>{var S,O;return!s.ready||s.terminals.length!==0?!1:(a.create({id:$e(),conversationId:s.activeConversationId||((S=s.state)==null?void 0:S.conversationId)||"",title:t("terminalTitle",{n:1}),cwd:((O=s.state)==null?void 0:O.cwd)??"",cols:80,rows:24,running:!0,exitCode:null}),!0)},[s.ready,(Dt=s.state)==null?void 0:Dt.cwd,s.terminals.length,t,a]);return r.useEffect(()=>{if(Y.current){if(v!=="terminal"||s.terminals.length!==0){Y.current=!1;return}ee()&&(Y.current=!1)}},[s.terminals.length,ee,v]),e.jsxs("div",{className:"app",onDragOver:S=>{var O;Array.from(((O=S.dataTransfer)==null?void 0:O.types)??[]).includes("Files")&&(S.preventDefault(),g(!0))},onDragLeave:S=>{S.currentTarget.contains(S.relatedTarget)||g(!1)},onDrop:S=>{var ye,Se;if(g(!1),!Array.from(((ye=S.dataTransfer)==null?void 0:ye.types)??[]).includes("Files"))return;S.preventDefault();const O=Array.from(((Se=S.dataTransfer)==null?void 0:Se.files)??[]);if(O.length===0){c("warning",t("foldersNotSupported"));return}const te=O.filter(be=>Me(be.type)),xe=O.filter(be=>!Me(be.type));te.length>0&&de(te),xe.length>0&&Ee(xe)},children:[x&&e.jsx("div",{className:"app-drop-overlay","aria-hidden":!0,children:e.jsxs("span",{children:["📎 ",t("dropHereToAttach")]})}),e.jsx(Gn,{chat:s,send:i,terminal:a,view:v,plugins:R,onViewChange:S=>{Y.current=S==="terminal"&&s.terminals.length===0,Y.current&&ee()&&(Y.current=!1),w(S),u(null)},onOpenPanel:u,onManageModels:()=>oe(!0),onOpenSettings:()=>A(!0),onOpenBgTasks:()=>ae(!0),onOpenGlobalSearch:()=>L(!0),sound:j,onSoundChange:G,onSoundPreview:S=>Ve(S,j),themes:U,theme:M,onThemeChange:q}),s.protocolMismatch&&e.jsxs("div",{className:"protocol-banner",children:["⚠ ",t("protocolMismatch")]}),e.jsx("div",{className:"notices",children:s.notices.map(S=>e.jsx(Aa,{notice:S,onDismiss:l},S.id))}),e.jsxs("div",{className:"layout",style:{"--left-w":`${B}px`,"--right-w":`${p}px`},children:[k&&e.jsx("div",{className:"drawer-backdrop",onClick:()=>u(null)}),e.jsxs("div",{className:`view-pane ${v==="chat"?"":"hidden"}`,children:[e.jsx("div",{className:`panel-drawer drawer-left ${k==="left"?"open":""}`,children:e.jsx(Jn,{send:Z,active:!$||k==="left",ready:s.ready,status:s.status,cwd:(($t=s.state)==null?void 0:$t.cwd)??"",sessionFile:((_t=s.state)==null?void 0:_t.sessionFile)??null,conversations:s.conversations,sessions:s.sessions,projects:s.projects,activeConversationId:s.activeConversationId})}),!$&&e.jsx(js,{side:"left",width:B,onResize:T}),e.jsxs("main",{className:"main",children:[s.state?e.jsx(la,{state:s.state,liveOutputs:s.liveOutputs,toolStatuses:s.toolStatuses,onEdit:Fe,onKillBash:()=>i({type:"abort_bash"}),thinkingWrap:((Ft=s.settings)==null?void 0:Ft.thinkingWrap)??!0},s.state.conversationId??"boot"):e.jsx("div",{className:"boot-wait",children:s.ready?t("loadingSession"):t("connectingServer")}),e.jsx(ca,{send:i,goal:s.goal,models:s.models,modelsLoading:s.modelsLoading,activeConversationId:s.activeConversationId}),s.dialog&&e.jsx(ma,{dialog:s.dialog,send:i}),e.jsx(oa,{send:i,ready:s.ready,streaming:((At=s.state)==null?void 0:At.isStreaming)??!1,messages:((Ot=s.state)==null?void 0:Ot.messages)??Oa,slashCommands:s.slashCommands,modelState:ie,models:s.models,modelsLoading:s.modelsLoading,attachments:n,onRemoveAttachment:_,onAddImageFiles:le,onAddLocalFiles:ne,onNotice:c,onManageModels:Ae,onSent:N})]}),!$&&e.jsx(js,{side:"right",width:p,onResize:b}),e.jsx("div",{className:`panel-drawer drawer-right ${k==="right"?"open":""}`,children:e.jsx(bi,{send:Z,files:s.files,fileChanged:s.fileChanged,widgets:s.widgets,cwd:((Wt=s.state)==null?void 0:Wt.cwd)??"",onAttach:(S,O,te,xe)=>{u(null),z(S,O,te,xe)},onPreview:(S,O)=>{u(null),m({path:S,name:O})},onNotice:(S,O)=>c(S,O)})})]}),e.jsx("div",{className:`view-pane ${v==="terminal"?"":"hidden"}`,children:e.jsx(r.Suspense,{fallback:null,children:e.jsx(Fa,{chat:s,send:i,terminal:a})})}),e.jsx("div",{className:`view-pane ${v==="git"?"":"hidden"}`,children:e.jsx(ha,{chat:s,send:i,terminal:a,active:v==="git",onSwitchToTerminal:()=>w("terminal")})}),C.map(S=>{const O=`plugin:${S.info.id}`;return e.jsx("div",{className:`view-pane ${v===O?"":"hidden"}`,children:e.jsx(ga,{entry:S,send:i})},S.info.id)})]}),e.jsx(da,{chat:s,send:i}),d&&e.jsx(Ca,{file:d,content:s.fileContent,send:i,onAddLines:(S,O,te,xe)=>z(S,O,"lines",!1,{start:te,end:xe}),onAttach:(S,O,te)=>z(S,O,te),onClose:()=>m(null)}),s.ready&&s.state&&s.state.piConfigured===!1&&!J&&!V&&e.jsx(fa,{send:i,piConfigured:s.state.piConfigured,providers:s.providers,installResult:s.installResult,onClose:()=>re(!0)}),V&&e.jsx(ya,{send:i,providers:s.modelsConfig,providerStatus:s.providers,fetchModelsResult:s.fetchModelsResult,refreshProviderResult:s.refreshProviderResult,cloneProviderResult:s.cloneProviderResult,onClose:()=>oe(!1)}),I&&e.jsx(ja,{chat:s,send:i,terminal:a,onSwitchToTerminal:()=>w("terminal"),onClose:()=>A(!1)}),H&&e.jsx(wa,{servers:s.bgServers,send:i,onClose:()=>ae(!1)}),pe&&e.jsx(Na,{send:i,sessions:s.sessions,projects:s.projects,cwd:((Ht=s.state)==null?void 0:Ht.cwd)??"",fileSearch:s.fileSearch,onClose:()=>L(!1),onSwitchSession:S=>{i({type:"switch_session",path:S})},onSwitchProject:S=>{i({type:"set_cwd",path:S})},onPreviewFile:(S,O)=>{m({path:S,name:O})}})]})}Qn();Xs(Ys());ln.createRoot(document.getElementById("root")).render(e.jsx(r.StrictMode,{children:e.jsx(zn,{children:e.jsx(Wa,{})})}));export{rt as F,ys as T,Ue as a,za as b,qa as c,Yt as d,De as e,Ne as f,Sn as g,Qe as h,$e as r,he as u};