@wudao-org/web 0.0.0-stage → 0.4.21

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.
@@ -0,0 +1,339 @@
1
+ import{t as gr,a as To,W as Ao,r as i,j as e,i as He,b as Fe,c as qe,d as jr,R as ce,g as In,p as Do,e as Oo,s as Io,E as Lo,f as Qt,h as ns,k as ea,l as Po,m as _o,n as Fo,o as zo,I as Bo,q as Ko,u as Uo,v as Wo,w as Ho,x as qo,y as Go,P as Vo,z as Yo,A as dl,B as Xo,C as br,D as Jo,F as Qo,G as Zo}from"./tokens-D-f0h-_m.js";const gn=1;function ec(t){const s=new WebSocket(t);return{get readyState(){return s.readyState},send:n=>s.send(n),close:(n,a)=>s.close(n,a),addEventListener:(n,a)=>s.addEventListener(n,a)}}function tc(){return`L-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`}function sc(t,s){if(s==null)return t;let n=t===void 0||Object.keys(t).length!==Object.keys(s).length;const a={};for(const[l,r]of Object.entries(s)){if(r===null||typeof r!="object"){n=!0;continue}const o=r.busy===!0,c=typeof r.sessionId=="string"?r.sessionId:"",d=t?.[l];d===void 0||d.busy!==o||d.sessionId!==c?(a[l]={busy:o,sessionId:c,history:d?.history??[],historyEpoch:d?.historyEpoch??0},n=!0):a[l]=d}return n?a:t}function nc(t,s,n,a){const l=t?.[s];return{...t??{},[s]:{busy:l?.busy??!1,sessionId:l?.sessionId??"",history:a?[...n]:[...l?.history??[],...n],historyEpoch:(l?.historyEpoch??0)+(a?1:0)}}}function ac(t=window.location){return decodeURIComponent(t.hash.replace(/^#/,""))}function Ln(t=window.location){return new URLSearchParams(t.search).get("shell")==="desktop"?"desktop":null}function lc(t=window.location){return`${t.protocol==="https:"?"wss:":"ws:"}//${t.host}`}function rc(t){return[1e3,2e3,4e3,8e3,16e3,3e4][Math.min(t-1,5)]??3e4}const Pn=8;function ic(){const t=globalThis.crypto;return typeof t?.randomUUID=="function"?t.randomUUID():`c-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function oc(t){switch(t.op){case"submit":case"interrupt":case"setMode":case"answerPermission":case"recallSteer":case"answerAskUser":case"detachToolCall":case"resume":case"rewind":case"edit":case"settingsSaveKey":case"settingsSet":case"settingsSaveProvider":case"switchWorkspace":case"panelRootSet":case"agentRootSwitch":case"attachmentSave":case"fileSave":case"pluginMarketAdd":case"pluginMarketUpdate":case"pluginMarketRemove":case"pluginInstall":case"pluginInstallSpec":case"longtermMemoryForget":case"pluginUninstall":case"pluginEnable":case"pluginDisable":case"personaSave":case"personaDelete":case"petSubmit":case"petInterrupt":case"petAnswerPermission":case"memoryDecide":case"memoryEdit":case"fileRevert":case"schedulesSetEnabled":case"schedulesRunNow":return!0;case"improvementFace":return t.action!=="list";case"switch":return t.n!==void 0;case"recentWorkspaces":return t.add!==void 0;default:return!1}}function zs(t,s){return s===void 0||s===""||s===t.provider}function yr(t,s){return zs(t,s)?`/model ${t.model}`:`/provider ${t.provider}`}function ul(t){return t==="reply"?"language.reply":"language.reasoning"}function _n(t){return t==="workspace"?"accept":t}function cc(t){return t==="workspace"?"ask":t==="ask"?"auto":t==="auto"?"plan":"workspace"}function Nr(t){if(t<100)return"<0.1s";const s=t/1e3;if(s<60)return`${s.toFixed(1)}s`;const n=Math.floor(s);return n<3600?`${Math.floor(n/60)}m${String(n%60).padStart(2,"0")}s`:`${Math.floor(n/3600)}h${String(Math.floor(n%3600/60)).padStart(2,"0")}m`}function dc(t,s){const n=t.models.map(a=>a.contextLength!=null?{name:a.name,contextLength:a.contextLength}:{name:a.name});return t.custom?{...t.label!==""?{label:t.label}:{},baseUrl:t.baseUrl??"",...t.defaultModel!==""?{defaultModel:t.defaultModel}:{},...t.defaultContextLength!=null?{defaultContextLength:t.defaultContextLength}:{},...t.reasoningFormat!==void 0?{reasoningFormat:t.reasoningFormat}:{},...t.wire!==void 0?{wire:t.wire}:{},...t.persona!==void 0?{persona:t.persona}:{},models:n,effort:s}:{models:n,...t.reasoningFormat!==void 0?{reasoningFormat:t.reasoningFormat}:{},...t.wire!==void 0?{wire:t.wire}:{},...t.persona!==void 0?{persona:t.persona}:{},effort:s}}class uc{opts;probeListeners=new Set;loopListeners=new Set;ws=null;nextId=1;pendingOps=new Map;replayQueue=[];listeners=new Set;snap;userClosed=!1;reconnectAttempt=0;timer=null;clientId=ic();queuedSetMode=null;constructor(s){this.opts={...s,wsFactory:s.wsFactory??ec,reconnect:s.reconnect??!0,backoff:s.backoff??rc,maxReconnectAttempts:s.maxReconnectAttempts??Pn,setTimeout:s.setTimeout??((n,a)=>setTimeout(n,a)),clearTimeout:s.clearTimeout??(n=>clearTimeout(n))},this.snap={connection:"connecting",reconnectAttempt:0,lastClose:null,status:null,history:[],historyEpoch:0}}subscribe=s=>(this.listeners.add(s),()=>this.listeners.delete(s));getSnapshot=()=>this.snap;notify(){for(const s of this.listeners)s()}connect(){if(this.userClosed)return;this.opts.clearTimeout(this.timer),this.timer=null;const s=this.opts.wsFactory(this.opts.url);this.ws=s,this.snap.connection!=="reconnecting"&&(this.snap={...this.snap,connection:"connecting"},this.notify());const n=()=>this.ws===s;s.addEventListener("open",()=>{n()&&(s.send(JSON.stringify({t:"auth",token:this.opts.token})),this.snap={...this.snap,connection:"authenticating"},this.notify())}),s.addEventListener("message",a=>{n()&&this.onMessage(a.data)}),s.addEventListener("close",a=>{this.ws!==s&&this.ws!==null||this.onClose(a.code,a.reason??"")}),s.addEventListener("error",()=>{})}close(){this.userClosed=!0,this.opts.clearTimeout(this.timer),this.timer=null,this.failPending(new Error("client closed")),this.replayQueue=[],this.queuedSetMode=null,this.ws?.close(1e3,"client closed"),this.ws=null,this.snap={...this.snap,connection:"closed",reconnectAttempt:0},this.notify()}reconnect(){this.userClosed||(this.opts.clearTimeout(this.timer),this.timer=null,this.reconnectAttempt=0,this.snap={...this.snap,connection:"connecting",reconnectAttempt:0},this.notify(),this.connect())}clearView(){this.snap={...this.snap,history:[],historyEpoch:this.snap.historyEpoch+1},this.notify()}onClose(s,n){const a=new Error(`connection closed (${s})`);if(this.ws=null,this.snap={...this.snap,lastClose:{code:s,reason:n}},this.userClosed||this.opts.reconnect===!1||s===4401){this.failPending(a),this.replayQueue=[],this.snap={...this.snap,connection:s===4401?"auth-failed":"closed",reconnectAttempt:0},this.notify();return}if(this.reconnectAttempt>=this.opts.maxReconnectAttempts){this.failPending(a),this.replayQueue=[],this.snap={...this.snap,connection:"gave-up",reconnectAttempt:this.reconnectAttempt},this.notify();return}this.replayQueue=[];for(const[r,o]of this.pendingOps)o.replay!==void 0?this.replayQueue.push({id:r,op:o.replay}):(this.pendingOps.delete(r),o.reject(a));this.reconnectAttempt+=1,this.snap={...this.snap,connection:"reconnecting",reconnectAttempt:this.reconnectAttempt},this.notify();const l=this.opts.backoff(this.reconnectAttempt);this.timer=this.opts.setTimeout(()=>{this.timer=null,this.connect()},l)}onMessage(s){let n;try{n=JSON.parse(String(s))}catch{return}if(typeof n!="object"||n===null)return;const a=n;if(a.t==="state"){const l=this.snap.connection==="connected";this.snap={...this.snap,connection:"connected",reconnectAttempt:0,status:a.state,pet:a.pet,lanes:sc(this.snap.lanes,a.lanes)},this.reconnectAttempt=0,l||(this.snap={...this.snap,lastClose:null},this.flushReplayOps(),this.flushQueuedSetMode()),this.notify();return}if(a.t==="history"){const l=a;if(typeof l.sid=="string"&&l.sid!==""){this.snap={...this.snap,lanes:nc(this.snap.lanes,l.sid,l.entries,l.reset===!0)},this.notify();return}const r=l.reset===!0?[...l.entries]:[...this.snap.history,...l.entries];this.snap={...this.snap,connection:"connected",history:r,...l.reset===!0?{historyEpoch:this.snap.historyEpoch+1}:{}},this.notify();return}if(a.t==="event"){const l=a;if(l.event!==void 0)for(const r of[...this.loopListeners])r(l.event,typeof l.at=="number"?l.at:Date.now());return}if(a.t==="probe"){const l=a.event;if(l!==void 0)for(const r of[...this.probeListeners])r(l);return}if(a.t==="result"){const l=a,r=this.pendingOps.get(l.id);if(r===void 0)return;this.pendingOps.delete(l.id),typeof l.err=="string"?r.reject(new Error(l.err)):r.resolve(l.ok);return}}failPending(s){for(const[,n]of this.pendingOps)n.reject(s);this.pendingOps.clear()}sendOp(s){return new Promise((n,a)=>{if(this.ws===null||this.ws.readyState!==gn){a(new Error("not connected"));return}const l=this.nextId++;this.pendingOps.set(l,{resolve:n,reject:a,...oc(s)?{replay:s}:{}}),this.ws.send(JSON.stringify({t:"op",id:l,op:s,cid:this.clientId}))})}flushReplayOps(){for(;this.replayQueue.length>0;){const s=this.replayQueue[0];if(s===void 0||this.ws===null||this.ws.readyState!==gn)return;this.replayQueue.shift(),this.ws.send(JSON.stringify({t:"op",id:s.id,op:s.op,cid:this.clientId}))}}submit(s,n){return this.sendOp({op:"submit",text:s,...n?.plan===!0?{plan:!0}:{},...n?.expand===!1?{expand:!1}:{},...n?.images!==void 0&&n.images.length>0?{images:n.images}:{},...n?.files!==void 0&&n.files.length>0?{files:n.files}:{},...n?.sid!==void 0?{sid:n.sid}:{}})}interrupt(s){return this.sendOp({op:"interrupt",...s!==void 0?{sid:s}:{}})}setMode(s,n){return n===void 0&&(this.ws===null||this.ws.readyState!==gn||this.snap.connection!=="connected")?(this.queuedSetMode=s,Promise.resolve(!0)):this.sendOp({op:"setMode",mode:s,...n!==void 0?{sid:n}:{}})}flushQueuedSetMode(){if(this.queuedSetMode===null)return;const s=this.queuedSetMode;this.queuedSetMode=null,this.sendOp({op:"setMode",mode:s}).catch(()=>{})}answerPermission(s,n,a){return this.sendOp({op:"answerPermission",allow:s,...n!==void 0?{reason:n}:{},...a!==void 0?{scope:a}:{}})}recallSteer(s,n){return this.sendOp({op:"recallSteer",index:s,text:n})}answerAskUser(s){return this.sendOp({op:"answerAskUser",...s!==void 0?{answer:s}:{}})}detachToolCall(s){return this.sendOp({op:"detachToolCall",...s!==void 0?{callId:s}:{}})}petSubmit(s){return this.sendOp({op:"petSubmit",text:s})}petInterrupt(){return this.sendOp({op:"petInterrupt"})}petAnswerPermission(s,n,a){return this.sendOp({op:"petAnswerPermission",allow:s,...n!==void 0?{reason:n}:{},...a!==void 0?{scope:a}:{}})}petHistory(){return this.sendOp({op:"petHistory"})}listSlashCommands(){return this.sendOp({op:"listSlashCommands"})}sessions(){return this.sendOp({op:"sessions"})}sessionSearch(s){return this.sendOp({op:"sessionSearch",q:s})}sessionDelete(s){return this.sendOp({op:"sessionDelete",id:s})}sessionTrashList(){return this.sendOp({op:"sessionTrashList"})}sessionRestore(s){return this.sendOp({op:"sessionRestore",id:s})}sessionContinue(s){return this.sendOp({op:"sessionContinue",id:s})}schedulesList(){return this.sendOp({op:"schedulesList"})}schedulesSetEnabled(s,n){return this.sendOp({op:"schedulesSetEnabled",id:s,enabled:n})}schedulesRemove(s){return this.sendOp({op:"schedulesRemove",id:s})}schedulesRunNow(s,n){return this.sendOp({op:"schedulesRunNow",id:s,...n?.resetBreaker===!0?{resetBreaker:!0}:{}})}resume(s,n){return this.sendOp({op:"resume",id:s,...n!==void 0?{sid:n}:{}})}resumeFork(s){return this.sendOp({op:"resume",id:s,fork:!0})}rewind(s){return this.sendOp({op:"rewind",target:s})}edit(s){return this.sendOp({op:"edit",n:s})}tree(){return this.sendOp({op:"tree"})}switchBranch(s){return this.sendOp({op:"switch",...s!==void 0?{n:s}:{}})}disarmEdit(){return this.sendOp({op:"edit",n:0})}branchLeaves(){return this.sendOp({op:"branchLeaves"})}memoryList(){return this.sendOp({op:"memoryList"})}memoryDecide(s,n){return this.sendOp({op:"memoryDecide",id:s,action:n})}memoryEdit(s,n){return this.sendOp({op:"memoryEdit",id:s,content:n})}improvementFace(s,n){return this.sendOp({op:"improvementFace",action:s,...n!==void 0?{id:n}:{}})}settingsStatus(){return this.sendOp({op:"settingsStatus"})}settingsSaveKey(s,n){return this.sendOp({op:"settingsSaveKey",provider:s,key:n})}settingsTestConnection(s,n){return this.sendOp({op:"settingsTestConnection",provider:s,...n?.key!==void 0?{key:n.key}:{},...n?.model!==void 0?{model:n.model}:{}})}settingsSet(s,n){return this.sendOp({op:"settingsSet",key:s,value:n})}settingsSaveProvider(s,n){return this.sendOp({op:"settingsSaveProvider",id:s,config:n})}settingsDeleteProvider(s){return this.sendOp({op:"settingsDeleteProvider",id:s})}settingsListModels(s,n){return this.sendOp({op:"settingsListModels",provider:s,...n?.key!==void 0?{key:n.key}:{}})}recentWorkspaces(s){return this.sendOp({op:"recentWorkspaces",...s!==void 0?{add:s}:{}})}switchWorkspace(s){return this.sendOp({op:"switchWorkspace",path:s})}fileTree(s){return this.sendOp({op:"fileTree",path:s})}fileRead(s){return this.sendOp({op:"fileRead",path:s})}fileWrite(s,n,a){return this.sendOp({op:"fileWrite",path:s,content:n,base:a})}fileRevert(s,n){return this.sendOp({op:"fileRevert",path:s,sha:n})}sideQuestion(s,n){return this.sendOp({op:"sideQuestion",sessionId:s,text:n})}panelRootSet(s){return this.sendOp({op:"panelRootSet",path:s})}agentRootStatus(){return this.sendOp({op:"agentRootStatus"})}probeStream(s){return this.sendOp({op:"probeStream",...s!==void 0?{cat:s}:{}})}probeRecent(s,n){return this.sendOp({op:"probeRecent",...s!==void 0?{cat:s}:{},...n!==void 0?{limit:n}:{}})}probeStats(){return this.sendOp({op:"probeStats"})}probeEnable(s){return this.sendOp({op:"probeEnable",on:s})}onProbe(s){return this.probeListeners.add(s),()=>this.probeListeners.delete(s)}sessionAnatomy(){return this.sendOp({op:"sessionAnatomy"})}onLoopEvent(s){return this.loopListeners.add(s),()=>this.loopListeners.delete(s)}agentRootSwitch(s){return this.sendOp({op:"agentRootSwitch",path:s})}ctxInfo(){return this.sendOp({op:"ctxInfo"})}recap(s,n,a){return this.sendOp({op:"recap",sessionId:s,sinceMark:n,...a!==void 0?{sinceTs:a}:{}})}recoveryStatus(){return this.sendOp({op:"recoveryStatus"})}attachmentSave(s){return this.sendOp({op:"attachmentSave",inputs:s})}attachmentGet(s){return this.sendOp({op:"attachmentGet",ref:s})}fileSave(s){return this.sendOp({op:"fileSave",inputs:s})}pluginList(){return this.sendOp({op:"pluginList"})}mcpList(){return this.sendOp({op:"mcpList"})}pluginMarketList(){return this.sendOp({op:"pluginMarketList"})}pluginMarketAdd(s,n){return this.sendOp({op:"pluginMarketAdd",source:s,...n!==void 0?{name:n}:{}})}pluginMarketUpdate(s){return this.sendOp({op:"pluginMarketUpdate",name:s})}pluginMarketRemove(s){return this.sendOp({op:"pluginMarketRemove",name:s})}pluginInstall(s,n,a){return this.sendOp({op:"pluginInstall",name:s,market:n,scope:a})}longtermMemoryList(){return this.sendOp({op:"longtermMemoryList"})}longtermMemoryForget(s){return this.sendOp({op:"longtermMemoryForget",id:s})}pluginInstallSpec(s,n){return this.sendOp({op:"pluginInstallSpec",spec:s,...n===!0?{preview:!0}:{}})}pluginUninstall(s){return this.sendOp({op:"pluginUninstall",id:s})}pluginEnable(s){return this.sendOp({op:"pluginEnable",id:s})}pluginDisable(s){return this.sendOp({op:"pluginDisable",id:s})}personaList(){return this.sendOp({op:"personaList"})}personaGet(s){return this.sendOp({op:"personaGet",id:s})}personaSave(s){return this.sendOp({op:"personaSave",definition:s})}personaDelete(s){return this.sendOp({op:"personaDelete",id:s.id,...s.unbind===!0?{unbind:!0}:{}})}}function hc(t,s){return n=>{t.detachToolCall(n).then(a=>{a.kind==="refused"&&s(a.reason==="not_detachable"?`⏳ ${a.toolName??"该工具"} 不可转后台(不可中断族)——等待其结束,或停止整个运行`:"(这条调用刚好已结束——无需转后台)")}).catch(()=>{})}}function Bs(){return document.documentElement.dataset.theme==="light"?"light":"dark"}function vt(t){document.documentElement.dataset.theme=t,localStorage.setItem("wudao.ui.theme",t),gr(Ao,{theme:t}),document.documentElement.classList.contains("glass")&&To(t)}function Fn(){const t=document.documentElement.dataset.accent;return t==="black"||t==="blue"||t==="green"?t:"green"}function Zt(t){document.documentElement.dataset.accent=t,localStorage.setItem("wudao.ui.accent",t)}function mc(){return localStorage.getItem("wudao.ui.theme")==="light"?"light":"dark"}function pc(){const t=localStorage.getItem("wudao.ui.accent");return t==="black"||t==="blue"||t==="green"?t:"green"}function fc(){vt(mc()),Zt(pc())}const Ms="─",xc=" │ ",zn=1;function kr(t){return(t??[]).some(s=>s.status==="ready")}function vc(t){return kr(t.providers)?!1:t.wizardCompletedVersion<(t.copyVersion??zn)}function gc(t){return i.useSyncExternalStore(t.subscribe,t.getSnapshot,t.getSnapshot)}const hl=16,wr=8,jc=6,bc=4,Sr=8,yc=3,Nc=1,kc=64,wc=4,Sc=1e3,Cc=.95,Ec=t=>t===47||t===92||t===45||t===95||t===46||t===32,$c=t=>t>=97&&t<=122,Rc=t=>t>=65&&t<=90;function ml(t,s,n){if(s===0)return n?Sr:0;const a=t.charCodeAt(s-1);return Ec(a)?wr:$c(a)&&Rc(t.charCodeAt(s))?jc:0}function Mc(t,s){const n=t.paths[s].toLowerCase();t.lowerPaths[s]=n;let a=0;for(let l=0;l<n.length;l++){const r=n.charCodeAt(l);r>=97&&r<=122&&(a|=1<<r-97)}t.charBits[s]=a}const Cr=new WeakMap;function Tc(t,s={}){const n=s.chunkMs??wc,a=s.now??(()=>performance.now()),l=s.schedule??(async()=>{await new Promise(p=>setTimeout(p,0))}),r={paths:[],lowerPaths:[],charBits:new Int32Array(0),ready:0},o={get size(){return r.ready}};Cr.set(o,r);let c=()=>{};const d=new Promise(p=>{c=p}),m=(async()=>{const p=new Set,v=[];let x=a();for(let N=0;N<t.length;N++){const M=t[N];M.length>0&&!p.has(M)&&(p.add(M),v.push(M)),(N&255)===255&&a()-x>n&&(await l(),x=a())}r.paths=v,r.lowerPaths=new Array(v.length),r.charBits=new Int32Array(v.length),x=a();let j=!0;for(let N=0;N<v.length;N++)Mc(r,N),(N&255)===255&&a()-x>n&&(r.ready=N+1,j&&(c(),j=!1),await l(),x=a());r.ready=v.length,c()})();return{index:o,queryable:d,done:m,readyCount:()=>r.ready}}function Ac(t,s,n){if(s.length===0)return[];const a=Cr.get(t),l=a.ready,r=s!==s.toLowerCase(),o=r?s:s.toLowerCase(),c=Math.min(o.length,kc);let d=0;for(let v=0;v<c;v++){const x=o.charCodeAt(v);x>=97&&x<=122&&(d|=1<<x-97)}const m=[];let p=-1/0;e:for(let v=0;v<l;v++){if((a.charBits[v]&d)!==d)continue;const x=r?a.paths[v]:a.lowerPaths[v];let j=x.indexOf(o.charAt(0));if(j===-1)continue;const N=[j];let M=0,y=0,g=j;for(let T=1;T<c;T++){if(j=x.indexOf(o.charAt(T),g+1),j===-1)continue e;N.push(j);const V=j-g-1;V===0?y+=bc:M+=yc+V*Nc,g=j}const O=c*(hl+wr)+Sr+32;if(m.length===n&&O+y-M<=p)continue;const $=a.paths[v];let k=c*hl+y-M;k+=ml($,N[0],!0);for(let T=1;T<c;T++)k+=ml($,N[T],!1);k+=Math.max(0,32-($.length>>2)),N[0]<$.lastIndexOf("/")+1&&(k-=Sc),$.includes("test")&&(k*=Cc),m.length<n?(m.push({path:$,hits:new Set(N),fuzzScore:k}),m.length===n&&(m.sort((T,V)=>V.fuzzScore-T.fuzzScore||(T.path<V.path?-1:1)),p=m[m.length-1].fuzzScore)):k>p&&(m.push({path:$,hits:new Set(N),fuzzScore:k}),m.sort((T,V)=>V.fuzzScore-T.fuzzScore||(T.path<V.path?-1:1)),m.pop(),p=m[m.length-1].fuzzScore)}return m.sort((v,x)=>x.fuzzScore-v.fuzzScore||(v.path<x.path?-1:1)),m.map(({path:v,hits:x,fuzzScore:j})=>({path:v,hits:x,score:j}))}function st(){i.useEffect(()=>{const t=document.activeElement;return()=>{t?.focus?.()}},[])}const Dc=200,Oc=80;function Ic(){try{return typeof window.matchMedia=="function"&&window.matchMedia("(prefers-reduced-motion: reduce)").matches}catch{return!1}}function Er(t){const[s,n]=i.useState(!1),a=i.useRef(!0),l=i.useCallback(()=>{const o=t.current;if(o===null)return;const c=o.scrollHeight-o.scrollTop-o.clientHeight;a.current=c<Oc,n(c>Dc)},[t]);i.useEffect(()=>{const o=t.current;a.current&&o!==null&&typeof o.scrollTo=="function"&&o.scrollTo({top:o.scrollHeight})});const r=i.useCallback(()=>{const o=t.current;o!==null&&(typeof o.scrollTo=="function"&&o.scrollTo({top:o.scrollHeight,behavior:Ic()?"auto":"smooth"}),n(!1))},[t]);return{onScroll:l,jump:r,show:s}}function $r({show:t,onJump:s}){return t?e.jsx("button",{type:"button",className:"jump-bottom","aria-label":"回到底部",title:"回到底部",onClick:s,children:"↓"}):null}const pl="(该命令由插件/扩展实现 —— WS 协议 v1 无法在此展开;请使用 TUI 或 /help)",Lc="工作区",jn=()=>typeof window<"u"&&window.innerWidth<900,bn=["描述任务,或 /help 查看命令","@ 可引用文件","拖入图片直接发送","shift+tab 切换权限档"];let fl=0;function xl(t){return t==="ask"?"ask(每个工具执行前都会确认)":t==="workspace"?"accept(默认:工作区内读写与只读命令放行,其余命令/网络/MCP 仍确认)":t==="auto"?"auto(全自动:全部放行,不再询问)":"plan(只读探查:只放行读取与只读命令;完成方案后切回 accept/auto 执行)"}function Pc(){const t=bn[fl%bn.length]??bn[0];return fl+=1,t}const yn=()=>typeof window<"u"&&window.innerWidth<700,_c=260,Os=180,Is=()=>Math.floor(window.innerWidth*.4);function ct(t){return Math.min(Math.max(t,Os),Is())}const vl=220,gl=360,Fc=320,Bn=10;function Yt(t){return t.split("/").filter(s=>s!=="").slice(-1)[0]??t}function zc(t){return t.kind==="tool"&&(t.name==="write_file"||t.name==="edit_file")}const Bc=50,Kc=20;function Uc(t,s){const n=[];let a=0;for(const l of t)n.push({ch:l,hit:s.has(a)}),a+=l.length;return n}const jl=50,Wc=/^(.*) ×(\d+)$/;function Hc(t,s,n,a){const l=t[t.length-1];if(l!==void 0){const o=Wc.exec(l.text),c=o!==null?o[1]??"":l.text;if(c===s){const d=o!==null?Number(o[2]??"1")+1:2;return[...t.slice(0,-1),{text:`${c} ×${d}`,after:n,epoch:l.epoch}]}}const r=[...t,{text:s,after:n,epoch:a}];return r.length>jl?r.slice(r.length-jl):r}function qc(t,s){if(s.length===0)return t;const n=[];let a=0;for(let l=0;l<t.length;l++){for(;a<s.length;){const o=s[a];if(o===void 0||o.after>l)break;n.push({kind:"notice",text:o.text}),a+=1}const r=t[l];r!==void 0&&n.push(r)}for(;a<s.length;a++){const l=s[a];l!==void 0&&n.push({kind:"notice",text:l.text})}return n}const Rr="wudao.ui.v1";function Gc(){try{const t=window.localStorage.getItem(Rr);if(t===null)return{};const s=JSON.parse(t);return typeof s=="object"&&s!==null?s:{}}catch{return{}}}function bl(t){return Array.isArray(t.tabs)?t.tabs.filter(s=>typeof s=="object"&&s!==null&&typeof s.path=="string"&&s.path!==""&&typeof s.isDir=="boolean").slice(0,Bn).map(s=>({path:s.path,name:Yt(s.path),isDir:s.isDir})):[]}function Vc({getAllKnownPaths:t,onOpenPath:s,onClose:n}){const[a,l]=i.useState(""),[r,o]=i.useState(0),c=i.useRef(null),d=i.useRef({composing:!1,endedAt:0}),[m,p]=i.useState(0),v=i.useRef(null),x=()=>{const y=t(),g=v.current;if(g!==null&&g.source===y)return g.build;const O=Tc(y);return v.current={source:y,build:O},O.readyCount()<y.length&&(O.queryable.then(()=>p($=>$+1)),O.done.then(()=>p($=>$+1))),O},j=i.useId();st(),i.useEffect(()=>{c.current?.focus()},[]);const N=i.useMemo(()=>{const y=a.trim();return y===""?t().slice(0,Bc).map(g=>({path:g,hits:new Set})):Ac(x().index,y,Kc)},[a,m]),M=y=>{l(y),o(0)};return e.jsx("div",{className:"search-scrim",onClick:n,children:e.jsxs("div",{className:"search-pop",role:"dialog","aria-label":"文件搜索",onClick:y=>y.stopPropagation(),children:[e.jsx("div",{className:"session-head",children:"文件搜索 — ↑↓ 选择 · Enter 打开 · Esc 关闭"}),e.jsx("input",{ref:c,className:"search-input",type:"text",placeholder:"搜索文件…","aria-label":"搜索文件",value:a,onChange:y=>M(y.target.value),onCompositionStart:()=>{d.current=qe(d.current)},onCompositionEnd:()=>{d.current=Fe(d.current,Date.now())},onKeyDown:y=>{if(!He(y.nativeEvent,d.current,Date.now())){if(y.key==="Escape"){y.preventDefault(),n();return}if(y.key==="ArrowDown"){y.preventDefault(),o(g=>Math.min(g+1,N.length-1));return}if(y.key==="ArrowUp"){y.preventDefault(),o(g=>Math.max(g-1,0));return}if(y.key==="Enter"){y.preventDefault();const g=N[r];g!==void 0&&s(g.path)}}}}),e.jsx("div",{className:"search-results",role:"listbox","aria-activedescendant":N[r]!==void 0?`${j}-opt-${r}`:void 0,children:N.length===0?e.jsx("div",{className:"search-empty",children:"无匹配文件"}):N.map((y,g)=>e.jsx("div",{id:`${j}-opt-${g}`,className:`search-item${g===r?" sel":""}`,role:"option","aria-selected":g===r,"data-path":y.path,onClick:()=>s(y.path),children:Uc(y.path,y.hits).map(({ch:O,hit:$},k)=>$?e.jsx("span",{className:"hit",children:O},k):e.jsx("span",{children:O},k))},y.path))})]})})}function Yc(t){const[s,n]=i.useState(null),a=t.lanes,l=s!==null&&a!==void 0?a[s]:void 0,r=l===void 0,o=t.status;return{view:{capable:a!==void 0,viewingMain:r,sid:r?null:s,key:r?o?.sessionId??"":l.sessionId,sessionId:r?o?.sessionId??null:l.sessionId,busy:r?o?.busy??!1:l.busy,history:r?t.history:l.history,historyEpoch:r?t.historyEpoch:l.historyEpoch},viewLane:s,setViewLane:n}}const yl={notes:[],armedEdit:null,forkBadges:new Set,forkEcho:null};function Xc(){const[t,s]=i.useState({}),n=i.useCallback((m,p)=>{m!==""&&s(v=>({...v,[m]:p(v[m]??yl)}))},[]),a=i.useCallback(m=>t[m]??yl,[t]),l=i.useCallback((m,p,v,x)=>{n(m,j=>({...j,notes:Hc(j.notes,p,v,x)}))},[n]),r=i.useCallback((m,p)=>{n(m,v=>({...v,notes:v.notes.filter(p)}))},[n]),o=i.useCallback((m,p)=>{n(m,v=>({...v,armedEdit:p}))},[n]),c=i.useCallback((m,p)=>{n(m,v=>({...v,forkBadges:p}))},[n]),d=i.useCallback((m,p)=>{n(m,v=>({...v,forkEcho:p}))},[n]);return i.useMemo(()=>({slots:t,slot:a,stampNote:l,filterNotes:r,setArmedEdit:o,setForkBadges:c,setForkEcho:d}),[t,a,l,r,o,c,d])}function Jc(t,s){if(s===void 0)return;const n=new Set;t!==null&&t.busy&&t.sessionId!==""&&n.add(t.sessionId);for(const a of Object.values(s))a.busy&&a.sessionId!==""&&n.add(a.sessionId);return n}function Qc(t,s,n){if(n===(t?.sessionId??null))return{kind:"view-main"};if(s!==void 0){for(const[a,l]of Object.entries(s))if(l.sessionId===n)return{kind:"view-lane",laneId:a}}return{kind:"open-lane",laneId:tc()}}const Nl=.9,ve=t=>({width:(t.size??16)*Nl,height:(t.size??16)*Nl,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,...t.className!==void 0?{className:t.className}:{}});function es(t){return e.jsx("svg",{...ve(t),children:e.jsx("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2.5h8a2 2 0 0 1 2 2V17a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"})})}function Zc(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("path",{d:"M3 7a2 2 0 0 1 2-2h4l2 2.5h8a2 2 0 0 1 2 2V17a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"}),e.jsx("path",{d:"M3 17l2-6h16l-2 6",opacity:"0.5"})]})}function ta(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("path",{d:"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z"}),e.jsx("path",{d:"M14 3v5h5"})]})}function Mr(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("path",{d:"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8z"}),e.jsx("path",{d:"M14 3v5h5"}),e.jsx("path",{d:"M9 13h6M9 17h4"})]})}function bt(t){return e.jsx("svg",{...ve(t),children:e.jsx("path",{d:"M9 6l6 6-6 6"})})}function tt(t){return e.jsx("svg",{...ve(t),children:e.jsx("path",{d:"M6 9l6 6 6-6"})})}function Tr(t){return e.jsx("svg",{...ve(t),children:e.jsx("path",{d:"M12 5v14M5 12h14"})})}function ed(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("path",{d:"M3 20h18"}),e.jsx("path",{d:"M4 16l5-6 4 3 7-9"})]})}function Ar(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("path",{d:"M21 12a9 9 0 1 1-2.64-6.36"}),e.jsx("path",{d:"M21 3v6h-6"})]})}function ts(t){return e.jsx("svg",{...ve(t),children:e.jsx("path",{d:"M18 6L6 18M6 6l12 12"})})}function Dr(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("circle",{cx:"12",cy:"12",r:"3"}),e.jsx("path",{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"})]})}function td(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("circle",{cx:"12",cy:"12",r:"9"}),e.jsx("path",{d:"M12 3a9 9 0 0 0 0 18z",fill:"currentColor",stroke:"none"})]})}function sd(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("path",{d:"M9 6h12M9 12h12M9 18h12"}),e.jsx("path",{d:"M4 6h.01M4 12h.01M4 18h.01"})]})}function nd(t){return e.jsx("svg",{...ve(t),children:e.jsx("path",{d:"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.2-9.19a4 4 0 0 1 5.65 5.66l-9.2 9.19a2 2 0 0 1-2.82-2.83l8.49-8.48"})})}function ad(t){return e.jsx("svg",{...ve(t),children:e.jsx("path",{d:"M4 6h16M4 12h16M4 18h16"})})}function ld(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("circle",{cx:"11",cy:"11",r:"7"}),e.jsx("path",{d:"M16.5 16.5 21 21"})]})}function rd(t){return e.jsx("svg",{...ve(t),children:e.jsx("path",{d:"M12 19V5M5.5 11.5 12 5l6.5 6.5"})})}function id(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("path",{d:"M5 19 19 5"}),e.jsx("circle",{cx:"12",cy:"12",r:"9.5"})]})}function ht(t){return e.jsx("svg",{...ve(t),children:e.jsx("path",{d:"M4.5 12.5 9.5 17.5 19.5 7"})})}function Vs(t){return e.jsx("svg",{...ve(t),children:e.jsx("path",{d:"M12 3a9 9 0 1 0 9 9"})})}function od(t){return e.jsx("svg",{...ve(t),children:e.jsx("path",{d:"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z"})})}function cd(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("path",{d:"M4 4.5h16v15H4z"}),e.jsx("path",{d:"M9.5 4.5v15"})]})}function dd(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("circle",{cx:"12",cy:"12",r:"9"}),e.jsx("path",{d:"M3 12h18"}),e.jsx("path",{d:"M12 3a14.5 14.5 0 0 1 0 18a14.5 14.5 0 0 1 0-18z"})]})}function ud(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("path",{d:"M3 6h18"}),e.jsx("path",{d:"M8 6V4a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2"}),e.jsx("path",{d:"M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"}),e.jsx("path",{d:"M10 11v6"}),e.jsx("path",{d:"M14 11v6"})]})}function hd(t){return e.jsxs("svg",{...ve(t),children:[e.jsx("path",{d:"M12 20h9"}),e.jsx("path",{d:"M16.5 3.5a2.1 2.1 0 0 1 3 3L7 19l-4 1 1-4z"})]})}const md=`<!-- @license lucide-static v1.48.0 - ISC -->
2
+ <svg
3
+ xmlns="http://www.w3.org/2000/svg"
4
+ viewBox="0 0 24 24"
5
+ fill="none"
6
+ stroke="currentColor"
7
+ stroke-width="1.5"
8
+ stroke-linecap="round"
9
+ stroke-linejoin="round"
10
+ >
11
+ <path d="M5 22h14" />
12
+ <path d="M5 2h14" />
13
+ <path d="M17 22v-4.172a2 2 0 0 0-.586-1.414L12 12l-4.414 4.414A2 2 0 0 0 7 17.828V22" />
14
+ <path d="M7 2v4.172a2 2 0 0 0 .586 1.414L12 12l4.414-4.414A2 2 0 0 0 17 6.172V2" />
15
+ </svg>
16
+ `,pd=`<!-- @license lucide-static v1.48.0 - ISC -->
17
+ <svg
18
+ xmlns="http://www.w3.org/2000/svg"
19
+ viewBox="0 0 24 24"
20
+ fill="none"
21
+ stroke="currentColor"
22
+ stroke-width="1.5"
23
+ stroke-linecap="round"
24
+ stroke-linejoin="round"
25
+ >
26
+ <path d="M15.914 4a1.5 1.5 0 00-2.474-1.561l-9 9A1.5 1.5 0 005.5 14h4.002a.5.5 0 01.471.666L8.086 20a1.5 1.5 0 002.475 1.56l9-9A1.5 1.5 0 0018.5 10h-3.997a.5.5 0 01-.472-.667z" />
27
+ </svg>
28
+ `,fd=`<!-- @license lucide-static v1.48.0 - ISC -->
29
+ <svg
30
+ xmlns="http://www.w3.org/2000/svg"
31
+ viewBox="0 0 24 24"
32
+ fill="none"
33
+ stroke="currentColor"
34
+ stroke-width="1.5"
35
+ stroke-linecap="round"
36
+ stroke-linejoin="round"
37
+ >
38
+ <circle cx="12" cy="12" r="10" />
39
+ <path d="M12 6v6l4 2" />
40
+ </svg>
41
+ `,xd=`<!-- @license lucide-static v1.48.0 - ISC -->
42
+ <svg
43
+ xmlns="http://www.w3.org/2000/svg"
44
+ viewBox="0 0 24 24"
45
+ fill="none"
46
+ stroke="currentColor"
47
+ stroke-width="1.5"
48
+ stroke-linecap="round"
49
+ stroke-linejoin="round"
50
+ >
51
+ <rect width="8" height="4" x="8" y="2" rx="1" ry="1" />
52
+ <path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2" />
53
+ <path d="M12 11h4" />
54
+ <path d="M12 16h4" />
55
+ <path d="M8 11h.01" />
56
+ <path d="M8 16h.01" />
57
+ </svg>
58
+ `,vd=`<!-- @license lucide-static v1.48.0 - ISC -->
59
+ <svg
60
+ xmlns="http://www.w3.org/2000/svg"
61
+ viewBox="0 0 24 24"
62
+ fill="none"
63
+ stroke="currentColor"
64
+ stroke-width="1.5"
65
+ stroke-linecap="round"
66
+ stroke-linejoin="round"
67
+ >
68
+ <path d="m2 21 9.6-9.6" />
69
+ <path d="m7.5 15.5 2.3 2.3a1 1 0 0 1 0 1.4l-2.1 2.1a1 1 0 0 1-1.4 0L4 19" />
70
+ <circle cx="15.5" cy="7.5" r="5.5" />
71
+ </svg>
72
+ `,gd=`<!-- @license lucide-static v1.48.0 - ISC -->
73
+ <svg
74
+ xmlns="http://www.w3.org/2000/svg"
75
+ viewBox="0 0 24 24"
76
+ fill="none"
77
+ stroke="currentColor"
78
+ stroke-width="1.5"
79
+ stroke-linecap="round"
80
+ stroke-linejoin="round"
81
+ >
82
+ <path d="M20 4v7a4 4 0 0 1-4 4H4" />
83
+ <path d="m9 10-5 5 5 5" />
84
+ </svg>
85
+ `,jd=`<!-- @license lucide-static v1.48.0 - ISC -->
86
+ <svg
87
+ xmlns="http://www.w3.org/2000/svg"
88
+ viewBox="0 0 24 24"
89
+ fill="none"
90
+ stroke="currentColor"
91
+ stroke-width="1.5"
92
+ stroke-linecap="round"
93
+ stroke-linejoin="round"
94
+ >
95
+ <circle cx="12" cy="12" r="10" />
96
+ <path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3" />
97
+ <path d="M12 17h.01" />
98
+ </svg>
99
+ `,bd=`<!-- @license lucide-static v1.48.0 - ISC -->
100
+ <svg
101
+ xmlns="http://www.w3.org/2000/svg"
102
+ viewBox="0 0 24 24"
103
+ fill="none"
104
+ stroke="currentColor"
105
+ stroke-width="1.5"
106
+ stroke-linecap="round"
107
+ stroke-linejoin="round"
108
+ >
109
+ <rect width="18" height="18" x="3" y="3" rx="2" ry="2" />
110
+ <circle cx="9" cy="9" r="2" />
111
+ <path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" />
112
+ </svg>
113
+ `,yd=`<!-- @license lucide-static v1.48.0 - ISC -->
114
+ <svg
115
+ xmlns="http://www.w3.org/2000/svg"
116
+ viewBox="0 0 24 24"
117
+ fill="none"
118
+ stroke="currentColor"
119
+ stroke-width="1.5"
120
+ stroke-linecap="round"
121
+ stroke-linejoin="round"
122
+ >
123
+ <path d="M12 18V5" />
124
+ <path d="M15 13a4.17 4.17 0 0 1-3-4 4.17 4.17 0 0 1-3 4" />
125
+ <path d="M17.598 6.5A3 3 0 1 0 12 5a3 3 0 1 0-5.598 1.5" />
126
+ <path d="M17.997 5.125a4 4 0 0 1 2.526 5.77" />
127
+ <path d="M18 18a4 4 0 0 0 2-7.464" />
128
+ <path d="M19.967 17.483A4 4 0 1 1 12 18a4 4 0 1 1-7.967-.517" />
129
+ <path d="M6 18a4 4 0 0 1-2-7.464" />
130
+ <path d="M6.003 5.125a4 4 0 0 0-2.526 5.77" />
131
+ </svg>
132
+ `,Nd=`<!-- @license lucide-static v1.48.0 - ISC -->
133
+ <svg
134
+ xmlns="http://www.w3.org/2000/svg"
135
+ viewBox="0 0 24 24"
136
+ fill="none"
137
+ stroke="currentColor"
138
+ stroke-width="1.5"
139
+ stroke-linecap="round"
140
+ stroke-linejoin="round"
141
+ >
142
+ <path d="M5.8 11.3 2 22l10.7-3.79" />
143
+ <path d="M4 3h.01" />
144
+ <path d="M22 8h.01" />
145
+ <path d="M15 2h.01" />
146
+ <path d="M22 20h.01" />
147
+ <path d="m22 2-2.24.75a2.9 2.9 0 0 0-1.96 3.12c.1.86-.57 1.63-1.45 1.63h-.38c-.86 0-1.6.6-1.76 1.44L14 10" />
148
+ <path d="m22 13-.82-.33c-.86-.34-1.82.2-1.98 1.11c-.11.7-.72 1.22-1.43 1.22H17" />
149
+ <path d="m11 2 .33.82c.34.86-.2 1.82-1.11 1.98C9.52 4.9 9 5.52 9 6.23V7" />
150
+ <path d="M11 13c1.93 1.93 2.83 4.17 2 5-.83.83-3.07-.07-5-2-1.93-1.93-2.83-4.17-2-5 .83-.83 3.07.07 5 2Z" />
151
+ </svg>
152
+ `,kd=`<!-- @license lucide-static v1.48.0 - ISC -->
153
+ <svg
154
+ xmlns="http://www.w3.org/2000/svg"
155
+ viewBox="0 0 24 24"
156
+ fill="none"
157
+ stroke="currentColor"
158
+ stroke-width="1.5"
159
+ stroke-linecap="round"
160
+ stroke-linejoin="round"
161
+ >
162
+ <path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z" />
163
+ </svg>
164
+ `,wd=`<!-- @license lucide-static v1.48.0 - ISC -->
165
+ <svg
166
+ xmlns="http://www.w3.org/2000/svg"
167
+ viewBox="0 0 24 24"
168
+ fill="none"
169
+ stroke="currentColor"
170
+ stroke-width="1.5"
171
+ stroke-linecap="round"
172
+ stroke-linejoin="round"
173
+ >
174
+ <path d="M3 3v16a2 2 0 0 0 2 2h16" />
175
+ <path d="M18 17V9" />
176
+ <path d="M13 17V5" />
177
+ <path d="M8 17v-3" />
178
+ </svg>
179
+ `,Sd=`<!-- @license lucide-static v1.48.0 - ISC -->
180
+ <svg
181
+ xmlns="http://www.w3.org/2000/svg"
182
+ viewBox="0 0 24 24"
183
+ fill="none"
184
+ stroke="currentColor"
185
+ stroke-width="1.5"
186
+ stroke-linecap="round"
187
+ stroke-linejoin="round"
188
+ >
189
+ <rect width="18" height="18" x="3" y="3" rx="2" />
190
+ <path d="M7 3v18" />
191
+ <path d="M3 7.5h4" />
192
+ <path d="M3 12h18" />
193
+ <path d="M3 16.5h4" />
194
+ <path d="M17 3v18" />
195
+ <path d="M17 7.5h4" />
196
+ <path d="M17 16.5h4" />
197
+ </svg>
198
+ `,Cd=`<!-- @license lucide-static v1.48.0 - ISC -->
199
+ <svg
200
+ xmlns="http://www.w3.org/2000/svg"
201
+ viewBox="0 0 24 24"
202
+ fill="none"
203
+ stroke="currentColor"
204
+ stroke-width="1.5"
205
+ stroke-linecap="round"
206
+ stroke-linejoin="round"
207
+ >
208
+ <path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" />
209
+ <path d="M14 2v5a1 1 0 0 0 1 1h5" />
210
+ <path d="M10 9H8" />
211
+ <path d="M16 13H8" />
212
+ <path d="M16 17H8" />
213
+ </svg>
214
+ `,Ed=`<!-- @license lucide-static v1.48.0 - ISC -->
215
+ <svg
216
+ xmlns="http://www.w3.org/2000/svg"
217
+ viewBox="0 0 24 24"
218
+ fill="none"
219
+ stroke="currentColor"
220
+ stroke-width="1.5"
221
+ stroke-linecap="round"
222
+ stroke-linejoin="round"
223
+ >
224
+ <path d="M10 11v6" />
225
+ <path d="M14 11v6" />
226
+ <path d="M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6" />
227
+ <path d="M3 6h18" />
228
+ <path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2" />
229
+ </svg>
230
+ `,$d=`<!-- @license lucide-static v1.48.0 - ISC -->
231
+ <svg
232
+ xmlns="http://www.w3.org/2000/svg"
233
+ viewBox="0 0 24 24"
234
+ fill="none"
235
+ stroke="currentColor"
236
+ stroke-width="1.5"
237
+ stroke-linecap="round"
238
+ stroke-linejoin="round"
239
+ >
240
+ <path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />
241
+ </svg>
242
+ `,Rd=`<!-- @license lucide-static v1.48.0 - ISC -->
243
+ <svg
244
+ xmlns="http://www.w3.org/2000/svg"
245
+ viewBox="0 0 24 24"
246
+ fill="none"
247
+ stroke="currentColor"
248
+ stroke-width="1.5"
249
+ stroke-linecap="round"
250
+ stroke-linejoin="round"
251
+ >
252
+ <path d="M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z" />
253
+ <path d="m14.5 9.5-5 5" />
254
+ <path d="m9.5 9.5 5 5" />
255
+ </svg>
256
+ `,Md=`<!-- @license lucide-static v1.48.0 - ISC -->
257
+ <svg
258
+ xmlns="http://www.w3.org/2000/svg"
259
+ viewBox="0 0 24 24"
260
+ fill="none"
261
+ stroke="currentColor"
262
+ stroke-width="1.5"
263
+ stroke-linecap="round"
264
+ stroke-linejoin="round"
265
+ >
266
+ <path d="M13 5h8" />
267
+ <path d="M13 12h8" />
268
+ <path d="M13 19h8" />
269
+ <path d="m3 17 2 2 4-4" />
270
+ <path d="m3 7 2 2 4-4" />
271
+ </svg>
272
+ `,Td=`<!-- @license lucide-static v1.48.0 - ISC -->
273
+ <svg
274
+ xmlns="http://www.w3.org/2000/svg"
275
+ viewBox="0 0 24 24"
276
+ fill="none"
277
+ stroke="currentColor"
278
+ stroke-width="1.5"
279
+ stroke-linecap="round"
280
+ stroke-linejoin="round"
281
+ >
282
+ <path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3" />
283
+ <path d="M12 9v4" />
284
+ <path d="M12 17h.01" />
285
+ </svg>
286
+ `,kl=.9,wl={hourglass:md,zap:pd,clock:fd,"clipboard-list":xd,key:vd,"corner-down-left":gd,"circle-help":jd,image:bd,brain:yd,"party-popper":Nd,star:kd,"chart-column":wd,film:Sd,"file-text":Cd,"trash-2":Ed,shield:$d,"shield-x":Rd,"list-checks":Md,"triangle-alert":Td};// 留 inner 标记 + viewBox。注意定位必须从 "<svg" 起步——文件头有 @license
287
+ const Ad=t=>{const s=t.indexOf("<svg"),n=t.indexOf(">",s),a=t.lastIndexOf("</svg>"),l=/viewBox="([^"]+)"/.exec(t)?.[1]??"0 0 24 24",r=t.slice(n+1,a).replace(/>\s+</g,"><").trim();return{viewBox:l,inner:r}},Dd=Object.fromEntries(Object.keys(wl).map(t=>[t,Ad(wl[t])]));function ae({name:t,size:s=16,className:n,filled:a=!1}){const{viewBox:l,inner:r}=Dd[t];return e.jsx("svg",{width:(s??16)*kl,height:(s??16)*kl,viewBox:l,fill:a?"currentColor":"none",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":!0,className:n===void 0?"ic":`ic ${n}`,dangerouslySetInnerHTML:{__html:r}})}const Or="wudao.archive.v1";function Ir(){try{const t=window.localStorage.getItem(Or);if(t===null)return[];const s=JSON.parse(t);return typeof s!="object"||s===null||!Array.isArray(s.archived)?[]:s.archived.filter(n=>typeof n=="string")}catch{return[]}}function Lr(t){try{window.localStorage.setItem(Or,JSON.stringify({archived:t}))}catch{}}function Sl(t){const s=Ir(),n=s.includes(t)?s.filter(a=>a!==t):[...s,t];return Lr(n),n}const Pr="wudao.unread.v1",Kn=30;function Od(){try{const t=window.localStorage.getItem(Pr);if(t===null)return{};const s=JSON.parse(t);if(typeof s!="object"||s===null||typeof s.marks!="object"||s.marks===null||Array.isArray(s.marks))return{};const n={};for(const[a,l]of Object.entries(s.marks))typeof l=="number"&&Number.isFinite(l)&&l>=0&&(n[a]=l);return n}catch{return{}}}function Id(t){const s=Object.entries(t),n={};for(const[a,l]of s.length>Kn?s.slice(s.length-Kn):s)n[a]=l;try{window.localStorage.setItem(Pr,JSON.stringify({marks:n}))}catch{}return n}const Ld=50,Ts=48,Cl=6e4,El=36e5,gt=864e5;function $l(t,s=Date.now()){const n=new Date(t).getTime();if(Number.isNaN(n))return"";const a=s-n;return a<Cl?"刚刚":a<El?`${Math.floor(a/Cl)}分钟前`:a<gt?`${Math.floor(a/El)}小时前`:a<2*gt?"昨天":a<7*gt?`${Math.floor(a/gt)}天前`:new Date(n).toISOString().slice(0,10)}function _r(t){return(t.firstUser.split(`
288
+ `)[0]??"").replace(/\s+/g," ").trim()}function jt(t){if(t.lane==="pet")return"小精灵";const s=(t.name??"").trim();if(s!=="")return s;const n=_r(t);if(n!==""){const a=Array.from(n);return a.length>16?`${a.slice(0,16).join("")}…`:n}return t.id.slice(0,8)}function Ls(t){const s=(t.name??"").trim();if(s!=="")return s;const n=_r(t);if(n!==""){const a=Array.from(n);return a.length>120?`${a.slice(0,120).join("")}…`:n}return t.id.slice(0,8)}function Nn(t,s){const n=s[t.id];if(n===void 0)return 0;const a=t.messages-n;return a>0?a:0}function Fr(t,s=Date.now()){const n=new Date(t).getTime(),a=Number.isNaN(n)?1/0:s-n;return a<gt?"今天":a<2*gt?"昨天":a<7*gt?"7 天内":"更早"}function Pd({client:t,activeSessionId:s,onResume:n,onNewChat:a,onOpenSettings:l,onOpenSearch:r,onRenameSession:o,sessionsEpoch:c,awaitingIds:d,busySessionIds:m,onFollowUp:p}){const[v,x]=i.useState(null),[j,N]=i.useState(void 0),[M,y]=i.useState(!1),[g,O]=i.useState(0),$=()=>{x(null),y(!1),O(w=>w+1)},[k,G]=i.useState(null),[T,V]=i.useState(""),q=i.useRef({composing:!1,endedAt:0}),[X,W]=i.useState(()=>Ir()),[_,z]=i.useState(!1),[R,P]=i.useState(()=>Od()),[A,H]=i.useState(!1),J=i.useRef(null),se=()=>{H(!0),J.current!==null&&clearTimeout(J.current),J.current=setTimeout(()=>H(!1),2500)};i.useEffect(()=>{if(s===null||s===""||!X.includes(s))return;const w=X.filter(b=>b!==s);Lr(w),W(w)},[s,X]),i.useEffect(()=>{let w=!1;return t.sessions().then(b=>{w||(x(b),y(!1))}).catch(()=>{w||(y(!0),x(b=>b??[]))}),()=>{w=!0}},[t,s,c,g]);const[,he]=i.useState(0);i.useEffect(()=>{const w=setInterval(()=>{he(b=>b+1)},6e4);return()=>clearInterval(w)},[]),i.useEffect(()=>{if(t.schedulesList===void 0)return;let w=!1;return t.schedulesList().then(b=>{w||N(new Set(b.filter(E=>E.sessionId!==void 0&&E.enabled&&!E.paused).map(E=>E.sessionId)))}).catch(()=>{w||N(void 0)}),()=>{w=!0}},[t,s,c,g]),i.useEffect(()=>()=>{J.current!==null&&clearTimeout(J.current)},[]);const le=[...v??[]].sort((w,b)=>w.mtime<b.mtime?1:w.mtime>b.mtime?-1:0),K=new Set(X),D=le.filter(w=>!K.has(w.id)).slice(0,Ld),f=le.filter(w=>K.has(w.id));i.useEffect(()=>{const w={...R};let b=!1;const E=s!==null&&s!==""?(v??[]).find(U=>U.id===s):void 0;E!==void 0&&w[E.id]!==E.messages&&(delete w[E.id],w[E.id]=E.messages,b=!0);for(const U of D){if(Object.keys(w).length>=Kn)break;w[U.id]===void 0&&(w[U.id]=U.messages,b=!0)}b&&P(Id(w))},[v,X,s,R]);const S=[];for(const w of D){const b=Fr(w.mtime),E=S[S.length-1];E!==void 0&&E.label===b?E.rows.push(w):S.push({label:b,rows:[w]})}return e.jsxs("div",{className:"sb",children:[e.jsxs("button",{type:"button",className:"sb-new",onClick:a,children:[e.jsx(Tr,{size:13}),e.jsx("span",{children:"新对话"})]}),e.jsxs("div",{className:"sb-search",role:"button",tabIndex:0,onClick:r,onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),r())},children:[e.jsx(ld,{size:12}),e.jsx("span",{children:"搜索会话…"})]}),e.jsx("div",{className:"sb-list",role:"list",children:v===null?e.jsxs("div",{className:"sb-skels",role:"status",children:[e.jsx("span",{className:"sr-only",children:"正在加载会话列表…"}),e.jsx("div",{className:"sb-skeleton","aria-hidden":!0}),e.jsx("div",{className:"sb-skeleton","aria-hidden":!0}),e.jsx("div",{className:"sb-skeleton","aria-hidden":!0})]}):S.length===0?M?e.jsx("div",{className:"tree-err",role:"button",tabIndex:0,onClick:$,onKeyDown:w=>{(w.key==="Enter"||w.key===" ")&&(w.preventDefault(),$())},children:"加载失败 · 点击重试"}):e.jsx("div",{className:"tree-empty",role:"status",children:"暂无会话"}):S.map(w=>e.jsxs(i.Fragment,{children:[e.jsx("div",{className:"sb-g",role:"presentation",children:w.label}),w.rows.map(b=>{const E=()=>{if(b.lane==="pet"){se();return}n(b.id)};return k===b.id?e.jsx("div",{role:"listitem",className:`sb-i${b.id===s?" on":""}`,children:e.jsx("input",{className:"sb-rename-in","aria-label":"重命名会话",placeholder:"会话名",autoFocus:!0,value:T,title:Array.from(T).length>Ts?`最多 ${Ts} 字`:void 0,style:Array.from(T).length>Ts?{borderColor:"var(--warn)"}:void 0,onChange:U=>V(U.target.value),onBlur:()=>{G(null)},onCompositionStart:()=>{q.current=qe(q.current)},onCompositionEnd:()=>{q.current=Fe(q.current,Date.now())},onKeyDown:U=>{if(!He(U.nativeEvent,q.current,Date.now()))if(U.key==="Enter"){const ee=Array.from(T).length>Ts,oe=T.trim();if(ee)return;G(null),oe!==""&&o?.(b.id,oe)}else U.key==="Escape"&&G(null)}})},b.id):e.jsxs("div",{role:"listitem",className:`sb-i${b.id===s?" on":""}`,title:Ls(b),onClick:E,children:[e.jsxs("div",{className:"sb-main",role:"button",tabIndex:0,onKeyDown:U=>{(U.key==="Enter"||U.key===" ")&&(U.preventDefault(),E())},children:[e.jsx("span",{className:"sb-t",children:jt(b)}),m!==void 0&&m.has(b.id)&&b.lane!=="pet"?e.jsx("span",{className:"sb-run",title:"任务进行中",role:"img","aria-label":"任务进行中",children:e.jsx(Vs,{size:12,className:"spin"})}):null,j!==void 0&&j.has(b.id)&&b.lane!=="pet"?e.jsx("span",{className:"sb-sched",title:"这个会话有定时任务或提醒",children:e.jsx(ae,{name:"clock",size:11})}):null,e.jsx("span",{className:"sb-when",children:$l(b.mtime)}),d!==void 0&&d.has(b.id)&&b.lane!=="pet"?e.jsx("span",{className:"sb-await",children:"等你授权"}):null,b.id!==s&&Nn(b,R)>0&&!(d!==void 0&&d.has(b.id)&&b.lane!=="pet")?e.jsxs("span",{className:"sb-unread",children:[Nn(b,R)>99?"99+":Nn(b,R)," 新"]}):null]}),o!==void 0?e.jsx("button",{type:"button",className:"sb-rename",title:"重命名",onClick:U=>{U.stopPropagation(),G(b.id),V((b.name??"").trim())},children:e.jsx(hd,{size:12})}):null,p!==void 0&&b.lane!=="pet"?e.jsx("button",{type:"button",className:"sb-follow",title:"基于这段对话开一份副本继续问,原对话保持不变",onClick:U=>{U.stopPropagation(),p(b.id)},children:"追问"}):null,b.id===s?null:e.jsx("button",{type:"button",className:"sb-act",title:"归档",onClick:U=>{U.stopPropagation(),W(Sl(b.id))},children:"归档"})]},b.id)})]},w.label))}),A?e.jsx("div",{className:"sb-toast",role:"status",children:"精灵会话在精灵窗口继续"}):null,f.length>0?e.jsxs("div",{className:"sb-arch",children:[e.jsxs("button",{type:"button",className:"sb-arch-h","aria-expanded":_,title:_?"收起已归档":"展开已归档",onClick:()=>z(w=>!w),children:[e.jsx("span",{className:"sb-arch-caret",children:_?e.jsx(tt,{size:12}):e.jsx(bt,{size:12})}),e.jsxs("span",{className:"sb-arch-t",children:["已归档 ",f.length]}),e.jsx("span",{className:"sb-arch-hint",children:"可随时恢复"})]}),_?e.jsx("div",{className:"sb-arch-list",role:"list",children:f.map(w=>e.jsxs("button",{type:"button",role:"listitem",className:"sb-arch-i",title:`恢复「${jt(w)}」到会话列表`,onClick:()=>{W(Sl(w.id))},children:[e.jsx("span",{className:"sb-t",children:jt(w)}),e.jsx("span",{className:"sb-when",children:$l(w.mtime)}),e.jsx("span",{className:"sb-act",children:"恢复"})]},w.id))}):null]}):null,e.jsxs("div",{className:"sb-f",children:[e.jsx("span",{className:"sb-note",children:"Buddy 模式"}),e.jsx("button",{type:"button",className:"settings-link","aria-label":"设置",title:"设置",onClick:l,children:e.jsx(Dr,{size:13})})]})]})}const _d=20,Rl=50;function Ml(t){const s=t.name!==void 0&&t.name!==""?t.name:t.firstUser!==""?t.firstUser:"(空会话)";return s.length>Rl?`${s.slice(0,Rl)}…`:s}function kn(t){const s=Date.parse(t);if(Number.isNaN(s))return"";const n=Date.now()-s;return n<6e4?"刚刚":n<60*6e4?`${Math.floor(n/6e4)}分钟前`:n<24*60*6e4?`${Math.floor(n/36e5)}小时前`:n<30*24*60*6e4?`${Math.floor(n/864e5)}天前`:t.slice(0,10)}function Fd({rows:t,onPick:s,onClose:n,onSearch:a,activeId:l=null,onDelete:r,trashRows:o=null,onRestore:c}){const[d,m]=i.useState(0),[p,v]=i.useState(""),[x,j]=i.useState(null),N=i.useRef(0),M=i.useRef(null),y=i.useRef({composing:!1,endedAt:0}),[g,O]=i.useState(null),[$,k]=i.useState(!1),[G,T]=i.useState(0),V=i.useId();st(),i.useEffect(()=>{M.current?.focus()},[]),i.useEffect(()=>{m(0)},[t]);const q=p.trim()!=="";i.useEffect(()=>{m(0)},[p,x]),i.useEffect(()=>{T(A=>Math.min(A,Math.max(0,(o??[]).length-1)))},[o]);const X=A=>{const H=A.trim(),J=++N.current;if(m(0),O(null),H===""){j(null);return}j(null),a(H).then(se=>{N.current===J&&j(se)},()=>{N.current===J&&j([])})},W=t?.slice().sort((A,H)=>Date.parse(H.mtime)-Date.parse(A.mtime)).slice(0,_d)??null;let _="";const z=A=>{O(null),r?.(A).then(H=>{H&&X(p)})},R=q?x!==null&&x[d]!==void 0?{key:`${x[d].sessionId}-${d}`,id:x[d].sessionId}:null:W!==null&&W[d]!==void 0?{key:W[d].id,id:W[d].id}:null,P=A=>{if(!He(A.nativeEvent,y.current,Date.now())){if($){if(A.key==="Escape"){A.preventDefault(),k(!1);return}const H=o??[];if(H.length>0){if(A.key==="ArrowDown"){A.preventDefault(),T(J=>Math.min(J+1,H.length-1));return}if(A.key==="ArrowUp"){A.preventDefault(),T(J=>Math.max(J-1,0));return}if(A.key==="Enter"){A.preventDefault();const J=H[G];J!==void 0&&c?.(J.id).then(se=>{se&&k(!1)});return}}return}if(A.key==="Escape"){if(A.preventDefault(),g!==null){O(null);return}n();return}if(A.key==="Delete"&&r!==void 0&&R!==null&&R.id!==l){A.preventDefault(),O(R);return}if(q){if(x===null)return;if(A.key==="ArrowDown"){A.preventDefault(),m(H=>Math.min(H+1,x.length-1));return}if(A.key==="ArrowUp"){A.preventDefault(),m(H=>Math.max(H-1,0));return}if(A.key==="Enter"){if(A.preventDefault(),g!==null&&R!==null&&g.key===R.key){z(g.id);return}const H=x[d];H!==void 0&&s(H.sessionId)}return}if(W!==null){if(A.key==="ArrowDown"){A.preventDefault(),m(H=>Math.min(H+1,W.length-1));return}if(A.key==="ArrowUp"){A.preventDefault(),m(H=>Math.max(H-1,0));return}if(A.key==="Enter"){if(A.preventDefault(),g!==null&&R!==null&&g.key===R.key){z(g.id);return}const H=W[d];H!==void 0&&s(H.id)}}}};return e.jsx("div",{className:"search-scrim",onClick:n,children:e.jsxs("div",{className:"search-pop",role:"dialog","aria-label":"会话列表",tabIndex:-1,onClick:A=>A.stopPropagation(),onCompositionStart:()=>{y.current=qe(y.current)},onCompositionEnd:()=>{y.current=Fe(y.current,Date.now())},onKeyDown:P,children:[e.jsx("div",{className:"session-head",children:$?"回收站 — ↑↓ 选择 · Enter 恢复 · Esc 返回列表":q?"全文搜索 — ↑↓ 选择 · Enter 恢复 · Esc 关闭":"切换会话 — ↑↓ 选择 · Enter 恢复 · Esc 关闭"}),$?null:e.jsx("input",{ref:M,className:"session-q",type:"text",placeholder:"搜索所有会话内容…","aria-label":"搜索所有会话内容",value:p,onChange:A=>{v(A.target.value),y.current.composing||X(A.target.value)},onCompositionEnd:A=>{y.current=Fe(y.current,Date.now()),X(A.target.value)}}),e.jsx("div",{className:"search-results session-results",role:"listbox","aria-label":$?"回收站列表":void 0,"aria-activedescendant":$?(o??[])[G]!==void 0?`${V}-opt-${G}`:void 0:(q?x!==null&&x[d]!==void 0:W!==null&&W[d]!==void 0)?`${V}-opt-${d}`:void 0,children:$?o===null||o.length===0?e.jsx("div",{className:"search-empty",children:"回收站是空的"}):o.map((A,H)=>e.jsxs("div",{id:`${V}-opt-${H}`,className:`search-item session-item${H===G?" sel":""}`,role:"option","aria-selected":H===G,"data-id":A.id,title:Ls(A),children:[e.jsxs("div",{className:"session-row1",children:[e.jsx("span",{className:"session-title",children:jt(A)}),e.jsx("span",{className:"session-time",children:kn(A.mtime)}),e.jsx("button",{className:"session-restore wudao","aria-label":"恢复这个会话",title:"恢复这个会话",onClick:J=>{J.stopPropagation(),c?.(A.id).then(se=>{se&&k(!1)})},children:"恢复"})]}),e.jsx("div",{className:"session-preview",children:Ml(A)})]},A.id)):q?x===null?e.jsx("div",{className:"search-empty",children:"搜索中…"}):x.length===0?e.jsx("div",{className:"search-empty",children:"没有找到相关内容"}):x.map((A,H)=>{const J=`${A.sessionId}-${H}`;return e.jsx("div",{id:`${V}-opt-${H}`,className:`search-item session-item${H===d?" sel":""}${g?.key===J?" session-confirm":""}`,role:"option","aria-selected":H===d,"data-id":A.sessionId,title:Ls(Tl(A)),onClick:()=>g?.key===J?O(null):s(A.sessionId),children:g?.key===J?e.jsxs("div",{className:"session-row1",children:[e.jsx("span",{className:"session-title",children:"删除这个会话?"}),e.jsx(Dl,{id:A.sessionId,onConfirm:z,onCancel:()=>O(null)})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"session-row1",children:[e.jsx("span",{className:"session-title",children:jt(Tl(A))}),e.jsx("span",{className:`session-kind${A.kind==="assistant"?" ans":""}`,children:A.kind==="user"?"问":"答"}),e.jsx("span",{className:"session-time",children:kn(A.mtime)}),r!==void 0&&A.sessionId!==l?e.jsx(Al,{rowKey:J,id:A.sessionId,onArm:O}):null]}),e.jsx("div",{className:"session-preview",children:zd(A.snippet,p.trim())})]})},J)}):W===null?e.jsx("div",{className:"search-empty",children:"加载中…"}):W.length===0?e.jsx("div",{className:"search-empty",children:"暂无会话"}):W.map((A,H)=>{const J=Fr(A.mtime),se=J!==_?e.jsx("div",{className:"session-pg",role:"presentation",children:J},`${A.id}-g`):null;return _=J,e.jsxs(i.Fragment,{children:[se,e.jsx("div",{id:`${V}-opt-${H}`,className:`search-item session-item${H===d?" sel":""}${g?.key===A.id?" session-confirm":""}`,role:"option","aria-selected":H===d,"data-id":A.id,title:Ls(A),onClick:()=>g?.key===A.id?O(null):s(A.id),children:g?.key===A.id?e.jsxs("div",{className:"session-row1",children:[e.jsx("span",{className:"session-title",children:"删除这个会话?"}),e.jsx(Dl,{id:A.id,onConfirm:z,onCancel:()=>O(null)})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"session-row1",children:[A.unfinished===!0?e.jsx("span",{className:"session-kind",children:"未完成"}):null,e.jsx("span",{className:"session-title",children:jt(A)}),e.jsx("span",{className:"session-time",children:kn(A.mtime)}),r!==void 0&&A.id!==l?e.jsx(Al,{rowKey:A.id,id:A.id,onArm:O}):null]}),e.jsx("div",{className:"session-preview",children:Ml(A)})]})})]},A.id)})}),$?e.jsx("div",{className:"btnrow",children:e.jsx("button",{className:"wudao",onClick:()=>k(!1),children:"← 返回会话列表"})}):!q&&o!==null&&c!==void 0?e.jsx("div",{className:"btnrow",children:e.jsxs("button",{className:"session-trash-link wudao",onClick:()=>{O(null),T(0),k(!0)},children:["回收站 (",o.length,")"]})}):null]})})}function Tl(t){return{id:t.sessionId,mtime:t.mtime,messages:0,firstUser:t.firstUser,model:"",...t.name!==""?{name:t.name}:{}}}function Al({rowKey:t,id:s,onArm:n}){return e.jsx("button",{className:"session-del","aria-label":"删除这个会话",title:"删除这个会话",onClick:a=>{a.stopPropagation(),n({key:t,id:s})},children:e.jsx(ud,{size:12})})}function Dl({id:t,onConfirm:s,onCancel:n}){return e.jsxs("span",{className:"session-confirm-actions",children:[e.jsx("button",{className:"session-del-ok",onClick:a=>{a.stopPropagation(),s(t)},children:"删除"}),e.jsx("button",{className:"session-del-cancel",onClick:a=>{a.stopPropagation(),n()},children:"取消"})]})}function zd(t,s){if(s==="")return e.jsx(e.Fragment,{children:t});const n=t.toLowerCase().indexOf(s.toLowerCase());return n<0?e.jsx(e.Fragment,{children:t}):e.jsxs(e.Fragment,{children:[t.slice(0,n),e.jsx("span",{className:"session-hit-mark",children:t.slice(n,n+s.length)}),t.slice(n+s.length)]})}const zr="✅ 悟道Harness — 任务完成";async function Bd(){return jr(zr)}function Br(){try{return typeof document.hasFocus=="function"?!document.hasFocus():!1}catch{return!1}}const Ol=(t,s)=>{if(t===null||s===void 0||s==="")return;const n=(t.providers??[]).find(a=>a.provider===s);return n!==void 0?n.label:void 0};function Kd({onChoose:t}){const s=i.useRef(!1),n=i.useRef(null);st(),i.useEffect(()=>{n.current?.focus()},[]);const a=l=>{s.current||(s.current=!0,t(l))};return e.jsx("div",{className:"scrim",children:e.jsxs("div",{className:"modal-card pop-in",role:"dialog","aria-label":"新对话",ref:n,tabIndex:-1,onKeyDown:l=>{(l.key==="Escape"||l.key==="Enter")&&(l.preventDefault(),a(!1))},children:[e.jsx("h3",{children:"清空当前对话?"}),e.jsx("div",{className:"muted",children:"未保存的工作保留在磁盘"}),e.jsxs("div",{className:"btnrow",children:[e.jsx("button",{type:"button",className:"wudao danger",onClick:()=>a(!0),children:"确认"}),e.jsx("button",{type:"button",className:"wudao",onClick:()=>a(!1),children:"取消"})]})]})})}function Ud(t,s){const n=i.useRef(!1),a=i.useRef(null),l=i.useCallback(()=>{const r=document.title;let o=0;a.current=setInterval(()=>{o+=1,document.title=o%2===1?zr:r,o>=6&&(a.current!==null&&clearInterval(a.current),a.current=null,document.title=r)},300)},[]);i.useEffect(()=>{if(t){n.current=!0;return}if(n.current)return n.current=!1,(document.hidden||document.visibilityState==="visible"&&Br())&&Bd().then(r=>{r||l()}),()=>{a.current!==null&&(clearInterval(a.current),a.current=null,document.title="悟道Harness")}},[t,l,s])}function Wd(t){return t===void 0||t.verifiedDone===void 0||t.remaining===void 0||t.verifiedDone<=0&&t.remaining<=0?null:`已验证完成 ${t.verifiedDone} / 待续 ${t.remaining}`}function Hd(t){return t===void 0?[]:t.filter(s=>s.state==="blocked"&&s.permissionAsk!==void 0).map(s=>s.sessionId)}function qd(t){const s=t.map(a=>a.title).filter(a=>a!==void 0&&a.trim()!=="");if(t.length<=1)return s.length===1?{title:"⏸ 悟道Harness — 有会话在等你授权",body:s[0]}:{title:"⏸ 悟道Harness — 有会话在等你授权"};const n=s.slice(0,3).join("、");return{title:`⏸ 悟道Harness — 有 ${t.length} 个会话在等你授权`,...n===""?{}:{body:s.length>3?`${n} 等`:n}}}function Gd(t,s,n){const[a,l]=i.useState({line:null,morning:null,awaiting:[]});return i.useEffect(()=>{if(t===null||s===null||s===void 0){l({line:null,morning:null,awaiting:[]});return}let r=!0;const o=()=>{t.recoveryStatus().then(d=>{if(!r)return;const m=(d??[]).find(p=>p.sessionId===s);l({line:Wd(m),morning:Yd(m),awaiting:Hd(d)})}).catch(()=>{r&&l({line:null,morning:null,awaiting:[]})})};o();const c=window.setInterval(o,5e3);return()=>{r=!1,window.clearInterval(c)}},[t,s,n]),a}function Vd({line:t}){return e.jsx("div",{className:"recovery-banner",role:"status",children:e.jsx("div",{className:"recovery-title",children:t})})}function Yd(t){if(t===void 0||t.state!=="blocked")return null;const s=t.permissionAsk;return s===void 0?null:`昨夜停在这里等你授权:${s.question}应答后任务自动继续`}function Xd({line:t}){return e.jsx("div",{className:"recovery-banner",role:"status",children:e.jsx("div",{className:"recovery-title",children:t})})}function Jd(t,s){const n=s.join(","),[a,l]=i.useState(null),[r,o]=i.useState(null);i.useEffect(()=>{if(n==="")return;let p=!0;return t.sessions().then(v=>{if(!p)return;const x=new Map;for(const j of v??[])x.set(j.id,jt(j));l(x),o(n)}).catch(()=>{p&&o(n)}),()=>{p=!1}},[t,n]);const c=i.useMemo(()=>s.map(p=>({id:p,title:a?.get(p)??p.slice(0,8)})),[s,a]),d=i.useMemo(()=>new Set(s),[n]),m=i.useRef(new Set);return i.useEffect(()=>{const p=m.current;for(const j of[...p])s.includes(j)||p.delete(j);const v=s.filter(j=>!p.has(j));if(v.length===0||r!==n)return;for(const j of v)p.add(j);if(!(document.hidden||document.visibilityState==="visible"&&Br()))return;const x=qd(v.map(j=>({id:j,title:a?.get(j)})));jr(x.title,x.body)},[s,n,r,a]),{names:c,set:d}}const Kr="wudao.recap.v1",Qd=10*6e4,Zd=3,Il=20;function Ur(){try{const t=window.localStorage.getItem(Kr);if(t===null)return{};const s=JSON.parse(t);return typeof s!="object"||s===null||typeof s.sessions!="object"||s.sessions===null?{}:s.sessions}catch{return{}}}function eu(t){try{const s=Object.keys(t);if(s.length>Il){const n=new Set(s.sort((a,l)=>(t[l]?.at??0)-(t[a]?.at??0)).slice(0,Il));for(const a of s)n.has(a)||delete t[a]}window.localStorage.setItem(Kr,JSON.stringify({sessions:t}))}catch{}}function tu(t){const s=Ur()[t];if(!(s===void 0||typeof s!="object")&&!(typeof s.mark!="number"||typeof s.at!="number"))return s}function Ut(t,s){const n=Ur();n[t]=s,eu(n)}function su(t){if(typeof t!="object"||t===null)return!1;const s=t.stats;if(typeof s!="object"||s===null)return!1;const n=s;return typeof n.turns=="number"&&typeof n.toolCalls=="number"&&typeof n.filesTouched=="number"}function nu(t){const{client:s,sessionId:n,history:a,historyEpoch:l}=t,[r,o]=i.useState(null),c=i.useRef(a);c.current=a;const d=i.useRef(n);d.current=n;const m=i.useCallback(()=>{const v=d.current,x=c.current;if(v===null||v===""||x.length===0)return;const j=tu(v);if(j===void 0)return;if(!Number.isInteger(j.mark)||j.mark<0||j.mark>x.length){Ut(v,{mark:x.length,at:Date.now()});return}if(j.servedMark===j.mark)return;const N=x.slice(j.mark).filter(M=>M.kind==="user"||M.kind==="assistant").length;if(Date.now()-j.at<Qd||N<Zd){Ut(v,{mark:x.length,at:Date.now()});return}Ut(v,{...j,servedMark:j.mark}),s.recap(v,j.mark,j.at).then(M=>{su(M)&&o(M)}).catch(()=>{})},[s]);i.useEffect(()=>{m()},[n,l,m]),i.useEffect(()=>{const v=()=>{const x=d.current;x===null||x===""||(document.hidden?Ut(x,{mark:c.current.length,at:Date.now()}):m())};return document.addEventListener("visibilitychange",v),()=>document.removeEventListener("visibilitychange",v)},[m]);const p=i.useCallback(()=>{o(null);const v=d.current;v!==null&&v!==""&&Ut(v,{mark:c.current.length,at:Date.now()})},[]);return{payload:r,onDismiss:p}}const Ll=["完成了:","还在进行:","等你决定:"];function au(t,s){if(t===null||!Number.isFinite(t)||t>s)return null;const n=Math.floor((s-t)/6e4);if(n<60)return`${Math.max(n,1)} 分钟`;const a=Math.floor(n/60);return a<24?`${a} 小时`:`${Math.floor(a/24)} 天`}function lu(t){const s=t.split(`
289
+ `).map(l=>l.trim()).filter(l=>l!==""),n=[];s.forEach((l,r)=>{Ll.some(o=>l.startsWith(o))&&n.push(r)});const a=[];return n.forEach((l,r)=>{const o=r+1<n.length?n[r+1]:s.length,c=s[l]??"",d=Ll.find(p=>c.startsWith(p));if(d===void 0)return;const m=s.slice(l,o).map((p,v)=>v===0?p.slice(d.length).trim():p);a.push({label:d,body:m.filter(p=>p!=="").join(" ")})}),a}function ru({payload:t,now:s,onClose:n}){const a=au(t.stats.sinceTs,s),l=t.narrative!==void 0?lu(t.narrative):[];return e.jsxs("div",{className:"recap-banner",role:"status",children:[e.jsx("div",{className:"recap-title",children:a!==null?`你离开了 ${a}——这期间:`:"你离开了这段时间——"}),l.length>0?e.jsx("div",{className:"recap-segments",children:l.map(r=>e.jsxs("div",{className:"recap-segment",children:[e.jsx("span",{className:"recap-label",children:r.label}),r.body]},r.label))}):null,e.jsx("div",{className:"recap-stats",children:`${t.stats.turns} 轮 · ${t.stats.toolCalls} 次工具调用 · ${t.stats.filesTouched} 个文件`}),e.jsx("button",{type:"button",className:"wudao action recap-close",onClick:n,children:"知道了"})]})}const Wr="wudao.recent-models.v1",Un=5;function iu(){try{const t=window.localStorage.getItem(Wr);if(t===null)return[];const s=JSON.parse(t);if(typeof s!="object"||s===null||!Array.isArray(s.recent))return[];const n=[];for(const a of s.recent){if(typeof a!="object"||a===null)continue;const{provider:l,model:r}=a;typeof l!="string"||l===""||typeof r!="string"||r===""||n.push({provider:l,model:r})}return n}catch{return[]}}function ou(t){const s=t.length>Un?t.slice(0,Un):[...t];try{window.localStorage.setItem(Wr,JSON.stringify({recent:s}))}catch{}return s}function cu(t,s,n=Un){return[s,...t.filter(a=>!(a.provider===s.provider&&a.model===s.model))].slice(0,n)}function du(t){if(!t.startsWith("/"))return;const s=t.slice(1);return/\s/.test(s)?void 0:s}function uu(t,s){return t.filter(n=>n.name.startsWith(s))}function hu(t,s){return`/${s}`}function mu(t){if(t.args===void 0)return`/${t.name}`;const s=t.name.endsWith(":")?"":" ";return`/${t.name}${s}${t.isSensitive===!0?"<redacted>":t.args}`}const pu=7;function fu(t,s,n=pu){if(t<=0)return{start:0,rows:0};if(t<=n)return{start:0,rows:t};const a=Math.min(Math.max(s,0),t-1);return{start:Math.max(0,Math.min(a-Math.floor(n/2),t-n)),rows:n}}function xu(t,s={}){const n=["命令:"];for(const a of t)n.push(` ${mu(a)}${a.description?` ${a.description}`:""}`);return n.push("键位:"),n.push(" Enter 发送 · Shift+Enter 换行 · ↑↓ 翻历史 · / 命令 · @ 提及文件 · Esc 中断 · shift+tab 切模式 (workspace → ask → auto)"),n.push(" Ctrl+P 文件搜索 · Ctrl+B 左栏 · Ctrl+\\ 中栏 · Cmd/Ctrl+, 设置 · Ctrl+W 关标签页 · Ctrl+Tab 切标签页 · Ctrl+1-9 跳标签页"),s.mode!==void 0&&n.push(`模式:${s.mode}`),n.join(`
290
+ `)}function vu(t){const s=t.trim();return s===""?{kind:"noop"}:s==="/exit"||s==="/quit"?{kind:"exit"}:s==="/clear"?{kind:"clear"}:s==="/help"||s==="/?"?{kind:"help"}:s==="/resume"||s.startsWith("/resume ")?{kind:"resume"}:/^\/edit\s+\d+$/.test(s)?{kind:"edit",n:Number(s.split(/\s+/)[1])}:{kind:"pass",text:t}}const gu=["const","let","var","function","return","if","else","for","while","do","switch","case","break","continue","new","class","extends","implements","interface","type","enum","import","from","export","default","as","async","await","try","catch","finally","throw","typeof","instanceof","in","of","this","super","static","public","private","protected","readonly","get","set","yield","void","null","undefined","true","false","struct","impl","fn","pub","mut","match","package","defer","go","chan","select","map","nil","string","number","boolean","any","unknown","never"],ju=["if","then","else","elif","fi","for","in","do","done","while","until","case","esac","function","return","export","local","source","alias","echo","cd","ls","cat","grep","sed","awk","mkdir","rm","cp","mv","chmod","sudo","apt","brew","npm","pnpm","yarn","git","curl","wget","set","unset","shift","test","exit"],bu=["def","class","return","if","elif","else","for","while","break","continue","import","from","as","with","try","except","finally","raise","yield","lambda","pass","global","nonlocal","assert","del","in","is","not","and","or","None","True","False","self","async","await","print","len","range","str","int","float","list","dict"],yu={clike:{lineComment:["//"],keywords:gu},shell:{lineComment:["#"],keywords:ju},python:{lineComment:["#"],keywords:bu}},Nu={ts:"clike",tsx:"clike",typescript:"clike",js:"clike",jsx:"clike",javascript:"clike",mjs:"clike",cjs:"clike",json:void 0,jsonc:"clike",go:"clike",rust:"clike",rs:"clike",java:"clike",c:"clike",h:"clike",cpp:"clike","c++":"clike",cs:"clike",csharp:"clike",kotlin:"clike",swift:"clike",dart:"clike",scala:"clike",sh:"shell",bash:"shell",zsh:"shell",shell:"shell",console:"shell",fish:"shell",dockerfile:"shell",makefile:"shell",make:"shell",py:"python",python:"python",python3:"python",yaml:"shell",yml:"shell",toml:"shell",ini:"shell",conf:"shell",rb:"python",ruby:"python",lua:"python",r:"python",perl:"python",sql:"sql",psql:"sql",mysql:"sql",htm:"html",html:"html",xml:"html",svg:"html",vue:"html",css:"css",scss:"css",less:"css",php:"clike",m:"clike",mm:"clike",hpp:"clike",cc:"clike",hh:"clike"};function Hr(t,s){const n=s!==void 0?Nu[s.toLowerCase()]:void 0;if(n==="html")return Eu(t);if(n==="css")return $u(t);if(n==="sql")return Cu(t);const a=n===void 0?void 0:yu[n];return a===void 0?Pl(t,{lineComment:[],keywords:[]}):Pl(t,a)}function Wn(t){const s=t.split("/").pop()??"",n=s.lastIndexOf(".");if(!(n<=0||n===s.length-1))return s.slice(n+1).toLowerCase()}function Pl(t,s){if(t==="")return[];const n=ku(t,s.lineComment),a=n===-1?t:t.slice(0,n),l=wu(a,s);return n!==-1&&l.push({text:t.slice(n),cls:"tok-com"}),l}function ku(t,s){if(s.length===0)return-1;let n=null;for(let a=0;a<t.length;a++){const l=t[a];if(n!==null){l==="\\"?a++:l===n&&(n=null);continue}if(l==='"'||l==="'"||l==="`"){n=l;continue}for(const r of s)if(t.startsWith(r,a))return a}return-1}const qr=/[A-Za-z_$][A-Za-z0-9_$]*/,sa=/\d[\d._xXa-fA-F]*/,Ks=/([A-Za-z_$][A-Za-z0-9_$]*)\s*(?=\()/;function wu(t,s){const n=[];let a=0,l="";const r=()=>{l!==""&&(n.push({text:l}),l="")};for(;a<t.length;){const o=t[a]??"";if(o==='"'||o==="'"||o==="`"){let c=a+1;for(;c<t.length&&(t[c]??"")!==o;)(t[c]??"")==="\\"&&c++,c++;r(),n.push({text:t.slice(a,Math.min(c+1,t.length)),cls:"tok-str"}),a=c+1;continue}if(/[0-9]/.test(o)){const c=sa.exec(t.slice(a));if(c!==null){r(),n.push({text:c[0],cls:"tok-num"}),a+=c[0].length;continue}}if(/[A-Za-z_$]/.test(o)){const c=t.slice(a),d=qr.exec(c)?.[0];if(d!==void 0){s.keywords.includes(d)?(r(),n.push({text:d,cls:"tok-key"})):Ks.test(c)&&Ks.exec(c)?.[1]===d?(r(),n.push({text:d,cls:"tok-fn"})):l+=d,a+=d.length;continue}}l+=o,a++}return r(),n}const Su=["select","from","where","join","left","right","inner","outer","full","cross","on","group","order","by","having","limit","offset","insert","into","values","update","set","delete","create","table","index","view","drop","alter","add","column","primary","foreign","key","references","unique","null","not","default","as","and","or","in","between","like","is","exists","case","when","then","else","end","union","all","distinct","asc","desc","with","returning","conflict","do","nothing"];function Cu(t){if(t==="")return[];const s=[];let n="";const a=()=>{n!==""&&(s.push({text:n}),n="")};let l=0;for(;l<t.length;){const r=t.slice(l);if(r.startsWith("--")){a(),s.push({text:r,cls:"tok-com"});break}if(r.startsWith("/*")){const c=r.indexOf("*/",2),d=c===-1?r.length:c+2;a(),s.push({text:r.slice(0,d),cls:"tok-com"}),l+=d;continue}const o=r[0]??"";if(o==="'"){let c=1;for(;c<r.length;){if(r[c]==="'"){if(r[c+1]==="'"){c+=2;continue}c+=1;break}c+=1}const d=Math.min(c,r.length);a(),s.push({text:r.slice(0,d),cls:"tok-str"}),l+=d;continue}if(/[0-9]/.test(o)){const c=sa.exec(r);if(c!==null){a(),s.push({text:c[0],cls:"tok-num"}),l+=c[0].length;continue}}if(/[A-Za-z_]/.test(o)){const c=qr.exec(r)?.[0];if(c!==void 0){Su.includes(c.toLowerCase())?(a(),s.push({text:c,cls:"tok-key"})):Ks.test(r)&&Ks.exec(r)?.[1]===c?(a(),s.push({text:c,cls:"tok-fn"})):n+=c,l+=c.length;continue}}n+=o,l+=1}return a(),s}function Eu(t){if(t==="")return[];const s=[];let n="",a=!1;const l=()=>{n!==""&&(s.push({text:n}),n="")};let r=0;for(;r<t.length;){const o=t.slice(r);if(!a&&o.startsWith("<!--")){const c=o.indexOf("-->",4),d=c===-1?o.length:c+3;l(),s.push({text:o.slice(0,d),cls:"tok-com"}),r+=d;continue}if(!a&&(o[0]??"")==="<"){a=!0;const c=/^<[A-Za-z][\w:.-]*/.exec(o)||/^<\/[A-Za-z][\w:.-]*>/.exec(o);if(c!==null){l(),s.push({text:c[0],cls:"tok-key"}),r+=c[0].length;continue}l(),s.push({text:"<",cls:"tok-key"}),r+=1;continue}if(a){const c=o[0]??"";if(c===">"){a=!1,l(),s.push({text:">",cls:"tok-key"}),r+=1;continue}if(c==='"'||c==="'"){let d=1;for(;d<o.length&&o[d]!==c;)d+=1;const m=Math.min(d+1,o.length);l(),s.push({text:o.slice(0,m),cls:"tok-str"}),r+=m;continue}if(/[A-Za-z_]/.test(c)){const d=/^[A-Za-z_][\w:.-]*/.exec(o)?.[0];if(d!==void 0){l(),s.push({text:d,cls:"tok-fn"}),r+=d.length;continue}}n+=c,r+=1;continue}if((o[0]??"")==="&"){const c=/^&[A-Za-z][A-Za-z\d]{0,10};/.exec(o)??/^&#\d{1,7};/.exec(o);if(c!==null){l(),s.push({text:c[0],cls:"tok-num"}),r+=c[0].length;continue}}n+=o[0]??"",r+=1}return n!==""&&s.push({text:n}),s}function $u(t){if(t==="")return[];const s=[];let n=0;for(;n<t.length;){const a=t.slice(n);if(a.startsWith("/*")){const r=a.indexOf("*/",2),o=r===-1?a.length:r+2;s.push({text:a.slice(0,o),cls:"tok-com"}),n+=o;continue}const l=a.indexOf("{");if(l>-1){let r=a.slice(0,l);if(r!=="")if(r.trim()==="")s.push({text:r});else if(r[0]==="@"){const o=/^(@[\w-]+)(\s*)/.exec(r);if(o!==null){s.push({text:o[1]+(o[2]??""),cls:"tok-key"});const c=r.slice(o[0].length);c!==""&&s.push({text:c})}else s.push({text:r,cls:"tok-key"})}else s.push({text:r,cls:"tok-key"});s.push({text:"{"}),n+=l+1;continue}s.push(...Ru(a)),n=t.length}return s}function Ru(t){const s=[],n=/^(\s*)([-\w]+)(\s*:)/.exec(t);let a=0;n!==null&&(s.push({text:n[1]??""}),s.push({text:n[2]??"",cls:"tok-fn"}),s.push({text:n[3]??""}),a=n[0]?.length??0);const l=t.slice(a);let r=0,o="";const c=()=>{o!==""&&(s.push({text:o}),o="")};for(;r<l.length;){const d=l.slice(r),m=d[0]??"";if(m==='"'||m==="'"){let p=1;for(;p<d.length&&d[p]!==m;)p+=1;const v=Math.min(p+1,d.length);c(),s.push({text:d.slice(0,v),cls:"tok-str"}),r+=v;continue}if(/[0-9]/.test(m)){const p=sa.exec(d);if(p!==null){c(),s.push({text:p[0],cls:"tok-num"}),r+=p[0].length;continue}}if(m==="#"||m==="$"||m==="@"){const p=/^[$@]?[-\w]+/.exec(d.slice(1));if(p!==null){c(),s.push({text:m+p[0],cls:"tok-num"}),r+=1+p[0].length;continue}}o+=m,r+=1}return c(),s}function Us(t){try{const s=navigator.clipboard?.writeText(t);s!==void 0&&s.catch(()=>{})}catch{}}function Gr({x:t,y:s,items:n,onClose:a}){return st(),i.useEffect(()=>{const l=r=>{r.key==="Escape"&&a()};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[a]),e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"ctx-backdrop",onClick:a}),e.jsx("div",{className:"menu ctx",role:"menu",style:{"--ctx-x":`${t}px`,"--ctx-y":`${s}px`},children:n.map(l=>e.jsxs("button",{type:"button",role:"menuitem",className:"menu-item",onClick:()=>{a(),l.onSelect()},children:[l.label,l.kbd!==void 0?e.jsx("span",{className:"menu-kbd",children:l.kbd}):null]},l.label))})]})}function Mu(t){return t.startsWith("https://")||t.startsWith("http://")}function Tu(t){t.preventDefault();const s=t.currentTarget.href;Oo(s).then(n=>{n||window.open(s,"_blank","noopener")})}function Wt({s:t}){return e.jsx(e.Fragment,{children:Do(t).map((s,n)=>s.href!==void 0&&Mu(s.href)?e.jsx("a",{href:s.href,target:"_blank",rel:"noopener noreferrer",onClick:Tu,children:s.text},n):s.code?e.jsx("code",{className:"inline",children:s.text},n):s.bold?e.jsx("span",{className:"bold",children:s.text},n):e.jsx("span",{children:s.text},n))})}function Au({lang:t,lines:s,meta:n}){const[a,l]=ce.useState(!1),r=ce.useRef(void 0);ce.useEffect(()=>()=>{r.current!==void 0&&window.clearTimeout(r.current)},[]);const o=()=>{Us(s.join(`
291
+ `)),l(!0),r.current!==void 0&&window.clearTimeout(r.current),r.current=window.setTimeout(()=>l(!1),1200)};return e.jsxs("div",{className:n?.file!==void 0?"pre has-pre-head":"pre",children:[n?.file!==void 0?e.jsxs("div",{className:"pre-head",children:[e.jsx("span",{className:"pre-file",children:n.file}),n.line!==void 0?e.jsx("span",{className:"pre-ln",children:`L${n.line}`}):null]}):null,e.jsx("button",{type:"button",className:a?"pre-copy done":"pre-copy","aria-label":"复制代码",onClick:o,children:a?"已复制 ✓":"复制"}),e.jsx("pre",{children:e.jsx("code",{children:s.map((c,d)=>e.jsxs(ce.Fragment,{children:[d>0?`
292
+ `:null,Hr(c,t).map((m,p)=>m.cls===void 0?m.text:e.jsx("span",{className:m.cls,children:m.text},p))]},d))})})]})}function Vr(t,s){return t.map((n,a)=>n.kind==="code"?e.jsx(Au,{lang:n.lang,lines:n.lines,meta:s},a):n.kind==="heading"?e.jsx("div",{className:"md-heading","data-level":n.level,children:e.jsx(Wt,{s:n.text})},a):n.kind==="table"?e.jsxs("table",{className:"md-table",children:[e.jsx("thead",{children:e.jsx("tr",{children:n.header.map((l,r)=>e.jsx("th",{children:e.jsx(Wt,{s:l})},r))})}),e.jsx("tbody",{children:n.rows.map((l,r)=>e.jsx("tr",{children:l.map((o,c)=>e.jsx("td",{children:e.jsx(Wt,{s:o})},c))},r))})]},a):n.kind==="list"?e.jsx("div",{className:"md-list",children:n.items.map((l,r)=>e.jsxs("div",{children:["• ",e.jsx(Wt,{s:l})]},r))},a):n.kind==="quote"?e.jsx("div",{className:"md-quote",children:n.lines.map((l,r)=>e.jsx("div",{children:`| ${l}`},r))},a):e.jsx("div",{className:"md-para",children:n.lines.map((l,r)=>e.jsx("div",{children:e.jsx(Wt,{s:l})},r))},a))}const Yr=ce.memo(function({source:s,meta:n}){return e.jsx("div",{className:"md",children:Vr(In(s),n)})});function Du({source:t}){const n=ce.useRef({prefix:"",stable:[]}).current;t.startsWith(n.prefix)||(n.prefix="",n.stable=[]);const a=t.slice(n.prefix.length),l=Io(a);l>0&&(n.stable=n.stable.concat(In(a.slice(0,l))),n.prefix=t.slice(0,n.prefix.length+l));const r=t.slice(n.prefix.length),o=r===""?Lo:In(r);return e.jsx("div",{className:"md",children:Vr(n.stable.concat(o))})}function Xr({children:t}){return e.jsxs("div",{className:"msg-a",children:[e.jsxs("div",{className:"msg-sig",children:[e.jsx("span",{className:"sig-avatar","aria-hidden":"true"}),e.jsx("span",{className:"sig-name",children:"悟道Harness"})]}),e.jsx("div",{className:"reply-card",children:t})]})}const Xt={done:"☑ ",inProgress:"◐ ",pending:"☐ "};function Ou(t){return t.startsWith(Xt.done)?"done":t.startsWith(Xt.inProgress)?"wip":"todo"}function Oe(t){return t>=999950?Math.round(t/1e5)/10+"M":Math.round(t/100)/10+"k"}function Jr(t,s){return t.length>s?`${t.slice(0,s)}…`:t}function Ys(t){const s=t.indexOf(`
293
+ `);return s===-1?t:`${t.slice(0,s)} …`}const Iu=5e3;function Qr(t,s){const n=t.split(`
294
+ `),a=s.split(`
295
+ `),l=Date.now()+Iu;let r=0;for(;r<n.length&&r<a.length&&n[r]===a[r];){if(!(r&4095)&&Date.now()>l)return _l(n,a);r++}let o=n.length-1,c=a.length-1;for(;o>=r&&c>=r&&n[o]===a[c];){if(!(n.length-o&4095)&&Date.now()>l)return _l(n,a);o--,c--}const d=[];for(let m=0;m<r;m++)d.push({kind:"ctx",text:n[m]??""});for(let m=r;m<=o;m++)d.push({kind:"del",text:n[m]??""});for(let m=r;m<=c;m++)d.push({kind:"add",text:a[m]??""});for(let m=o+1;m<n.length;m++)d.push({kind:"ctx",text:n[m]??""});return d}function _l(t,s){return[...t.map(n=>({kind:"del",text:n})),...s.map(n=>({kind:"add",text:n}))]}function Zr(t,s=3){const n=[];let a=[];const l=()=>{a.length<=s*2?n.push(...a):n.push(...a.slice(0,s),{kind:"gap",count:a.length-s*2},...a.slice(a.length-s)),a=[]};for(const r of t)r.kind==="ctx"?a.push(r):(l(),n.push(r));return l(),n}function Lu(t,s){const n=(a,l)=>{const r=t.filter(d=>d.kind===a),o=r.slice(0,s),c=r.length-o.length;return c>0?[...o,{kind:"gap",count:c,label:`⋯ 再 ${l}${c} 行 ⋯`}]:o};return[...n("del","-"),...n("add","+")]}function Fl(t){return t.split(/(\s+)/).filter(s=>s!=="")}const De=(t,s)=>t===""?[]:[{text:t,changed:s}];function Pu(t,s){let n=0;for(;n<t.length&&n<s.length&&t[n]===s[n];)n++;let a=0;for(;a<t.length-n&&a<s.length-n&&t[t.length-1-a]===s[s.length-1-a];)a++;const l=t.slice(n,t.length-a),r=s.slice(n,s.length-a);return l===""||r===""?{a:De(t,!0),b:De(s,!0)}:{a:[...De(t.slice(0,n),!1),...De(l,!0),...De(t.slice(t.length-a),!1)],b:[...De(s.slice(0,n),!1),...De(r,!0),...De(s.slice(s.length-a),!1)]}}function _u(t,s){if(t===s)return{old:De(t,!1),new:De(s,!1)};const n=Fl(t),a=Fl(s);let l=0;for(;l<n.length&&l<a.length&&n[l]===a[l];)l++;let r=0;for(;r<n.length-l&&r<a.length-l&&n[n.length-1-r]===a[a.length-1-r];)r++;const o=n.slice(l,n.length-r),c=a.slice(l,a.length-r),d=o.length===1&&c.length===1?Pu(o[0]??"",c[0]??""):{a:De(o.join(""),!0),b:De(c.join(""),!0)};return{old:[...De(n.slice(0,l).join(""),!1),...d.a,...De(n.slice(n.length-r).join(""),!1)],new:[...De(a.slice(0,l).join(""),!1),...d.b,...De(a.slice(a.length-r).join(""),!1)]}}function dt({text:t,lang:s}){return e.jsx(e.Fragment,{children:Hr(t,s).map((n,a)=>n.cls===void 0?n.text:e.jsx("span",{className:n.cls,children:n.text},a))})}function Fu(t){const s=new Map;let n=0;for(;n<t.length;){const a=t[n];if(a!==void 0&&(a.kind==="del"||a.kind==="add")){let l=n;for(;l<t.length;){const c=t[l];if(c===void 0||c.kind!=="del"&&c.kind!=="add")break;l++}const r=t[n],o=t[n+1];l-n===2&&r?.kind==="del"&&o?.kind==="add"&&s.set(n,_u(r.text,o.text)),n=l}else n++}return s}function zl({spans:t,lang:s}){return e.jsx(e.Fragment,{children:t.map((n,a)=>n.changed?e.jsx("span",{className:"wchg",children:e.jsx(dt,{text:n.text,lang:s})},a):e.jsx(dt,{text:n.text,lang:s},a))})}function zu({path:t,oldString:s,newString:n,rows:a,onOpenFile:l}){const r=a??Zr(Qr(s,n)),o=Fu(r),c=Wn(t);return e.jsxs("div",{className:"diff",children:[e.jsxs("div",{className:"path",children:[e.jsx(Mr,{size:13})," ",l!==void 0?e.jsx("button",{type:"button",className:"fv-chip",title:t,onClick:()=>l(t),children:t}):t]}),r.map((d,m)=>d.kind==="gap"?e.jsx("div",{className:"ctx",children:d.label??` ⋯ ${d.count} 行未变 ⋯`},m):d.kind==="del"?e.jsxs("div",{className:"del",children:["- ",o.has(m)?e.jsx(zl,{spans:o.get(m)?.old??[],lang:c}):e.jsx(dt,{text:d.text,lang:c})]},m):d.kind==="add"?e.jsxs("div",{className:"add",children:["+ ",o.has(m-1)?e.jsx(zl,{spans:o.get(m-1)?.new??[],lang:c}):e.jsx(dt,{text:d.text,lang:c})]},m):e.jsxs("div",{className:"ctx",children:[" ",e.jsx(dt,{text:d.text,lang:c})]},m))]})}function na(t){const s=t.toLowerCase();return s==="read_file"?"read":s==="grep"||s==="glob"?"search":s==="web_search"||s==="web_fetch"?"web":"inout"}const ei={read:"读取",search:"搜索",web:"联网",inout:"执行"},Bu=t=>ei[na(t)],We=8,Ws=50;function Hs(t,s=We){const n=t.split(`
296
+ `);return{lines:n.slice(0,s),total:n.length}}const ti="132px",si="960px";function aa({total:t,expanded:s,onToggle:n}){return e.jsx("button",{type:"button",className:"activity-toggle","aria-expanded":s,onClick:n,children:s?"收起 ▴":`展开 ▾ (${t} 行)`})}const Ku={ok:"完成",run:"进行中",err:"出错"};function Uu(t,s){return s.some(n=>(n.name==="edit"||n.name==="write_file")&&n.summary===t.path)}function ni({entry:t,running:s=!1,onOpenFile:n}){const[a,l]=i.useState(!1);return t.kind==="edit"?e.jsx(Vu,{entry:t,open:a,onToggle:()=>l(!a),running:s,onOpenFile:n}):e.jsx(qu,{entry:t,open:a,onToggle:()=>l(!a)})}function ai({status:t,verb:s,file:n,note:a,open:l,onToggle:r}){return e.jsxs("button",{type:"button",className:"act-row","data-status":t,"aria-expanded":l,onClick:r,children:[e.jsx("span",{className:`act-st st-${t}`,"aria-hidden":!0,children:t==="ok"?e.jsx(ht,{size:13}):t==="run"?e.jsx(Vs,{size:13,className:"spin"}):"✕"}),e.jsx("span",{className:"sr-only",children:Ku[t]}),e.jsx("span",{className:"act-verb",children:s}),n!==""?e.jsx("span",{className:"act-file",children:n}):null,e.jsx("span",{className:"act-tail",children:a}),e.jsx(tt,{size:12,className:"act-chev"})]})}function Wu(t){const s=t.toLowerCase();return s.endsWith(".xlsx")?"chart-column":s.endsWith(".pptx")?"film":"file-text"}function Hu({file:t}){return e.jsxs("div",{className:"act-file-card",children:[e.jsx("span",{className:"act-file-icon","aria-hidden":!0,children:e.jsx(ae,{name:Wu(t.name),size:13})}),e.jsx("span",{className:"act-file-name",children:t.name}),e.jsx("span",{className:"act-file-size",children:`${(t.bytes/1024).toFixed(1)} KB`}),e.jsx("button",{type:"button",className:"act-file-reveal",onClick:()=>{Qt("open_path",{path:t.path})},children:"打开"}),e.jsx("button",{type:"button",className:"act-file-reveal",onClick:()=>{Qt("reveal_path",{path:t.path})},children:"在访达中显示"})]})}function qu({entry:t,open:s,onToggle:n}){const a=na(t.name),l=t.resultPreview??"",r=t.isError?Ys(l):"",o=(t.durationMs??0)/1e3,c=t.durationMs!==void 0&&!t.isError?`· ${o<.1?"<0.1":o.toFixed(1)}s`:"",d=r===""?c:s?r:`${r} · 点击查看`,m=t.isError?"err":"ok";return e.jsxs("div",{className:`act${t.isError?" err":""}`,"data-kind":a,"data-status":m,"data-err":t.isError===!0,"data-open":s,children:[e.jsx(ai,{status:m,verb:ei[a],file:t.summary,note:d,open:s,onToggle:n}),t.file!==void 0&&!t.isError?e.jsx(Hu,{file:t.file}):null,s?e.jsx(Gu,{entry:t,kind:a}):null]})}function Gu({entry:t,kind:s}){const[n,a]=i.useState(!1),l=t.resultPreview??"";if(l==="")return null;const{lines:r,total:o}=Hs(l,n?Ws:We),c=o>We||n?e.jsx(aa,{total:o,expanded:n,onToggle:()=>a(m=>!m)}):null,d=n?si:ti;if(s==="inout"){let m=r,p="";if(t.name==="shell"){const x=[...l.split(`
297
+ `)];x.length>0&&x[0].startsWith("$ ")&&x.shift();const j=x[x.length-1]??"",N=/^\[exit (-?\d+)\]$/.exec(j.trim());x.length>0&&N!==null&&(p=` · exit ${N[1]}`,x.pop()),m=Hs(x.join(`
298
+ `),n?Ws:We).lines}return e.jsxs("div",{className:"act-body inout","data-truncated":o>We,style:{maxHeight:d},children:[e.jsxs("div",{className:"block",children:[e.jsx("span",{className:"blocklabel",children:"输入"}),e.jsx("span",{className:"blocktext",children:t.summary===""?"(无参数摘要)":t.summary})]}),e.jsxs("div",{className:`block${t.isError?" err":""}`,children:[e.jsxs("span",{className:"blocklabel",children:[t.isError?"出错":"输出",p]}),e.jsx("span",{className:"blocktext",children:m.join(`
299
+ `)===""&&p!==""?"(无输出)":m.join(`
300
+ `)}),c]})]})}return e.jsxs("div",{className:`act-body ${s}`,"data-truncated":o>We,style:{maxHeight:d},children:[e.jsx("span",{className:"blocktext",children:r.join(`
301
+ `)}),c]})}function Vu({entry:t,open:s,onToggle:n,running:a,onOpenFile:l}){const r=a?"run":"ok";return e.jsxs("div",{className:"act","data-kind":"diff","data-status":r,"data-open":s,children:[e.jsx(ai,{status:r,verb:"修改",file:t.path,note:s?"":a?"正在写入…":"查看改动",open:s,onToggle:n}),s?e.jsx(Yu,{entry:t,onOpenFile:l}):null]})}function Yu({entry:t,onOpenFile:s}){const[n,a]=i.useState(!1),l=Zr(Qr(t.oldString,t.newString)),r=l.length>We,o=!n&&r?Lu(l,3):l;return e.jsxs("div",{className:"act-body diffwrap",style:{maxHeight:n?si:ti},children:[e.jsx(zu,{path:t.path,oldString:t.oldString,newString:t.newString,rows:o,onOpenFile:s}),r?e.jsx(aa,{total:l.length,expanded:n,onToggle:()=>a(c=>!c)}):null,n&&l.length>Ws?e.jsx("div",{className:"activity-foot",children:`⋯ diff 共 ${l.length} 行,卡内滚动查看`}):null]})}function Xu(){return e.jsx(Vs,{size:13,className:"spin"})}function la({text:t,streaming:s=!1,defaultOpen:n=!1}){const a=ce.useRef(null),l=ce.useRef(null),[r,o]=ce.useState(!1);return ce.useEffect(()=>{r||a.current===null||(a.current.open=s?!0:n)},[s,n,r]),ce.useEffect(()=>{const c=l.current;c!==null&&c.scrollTop+c.clientHeight>=c.scrollHeight-40&&(c.scrollTop=c.scrollHeight)},[t]),e.jsxs("details",{className:"reasoning","data-streaming":s,ref:a,children:[e.jsx("summary",{onClick:()=>o(!0),className:s?"sweep-line":void 0,children:s?"思考中":`思考过程 · ${t.length} 字`}),e.jsx("div",{className:"body",ref:l,children:t})]})}function li({tool:t,onDetach:s}){const n=na(t.name),a=t.tail===void 0?[]:t.tail.split(`
302
+ `).filter(l=>l.trim()!=="").slice(-3);return e.jsxs("div",{className:"act","data-kind":n,"data-status":"run",children:[e.jsxs("div",{className:"act-row","data-status":"run",children:[e.jsx("span",{className:"act-st st-run","aria-hidden":!0,children:e.jsx(Xu,{})}),e.jsx("span",{className:"sr-only",children:"进行中"}),e.jsx("span",{className:"act-verb",children:Bu(t.name)}),e.jsx("span",{className:"act-file",children:t.summary!==""?t.summary:t.name}),t.gating?e.jsxs("span",{className:"act-tail gating",children:[e.jsx(ae,{name:"shield",size:11})," 检查中"]}):null,s!==void 0&&t.callId!==void 0?e.jsx("button",{type:"button",className:"detach","aria-label":"把这个工具调用转入后台",title:"不再等待——调用转后台继续跑,完成后自动并入对话",onClick:()=>s(t.callId),children:"转入后台"}):null]}),a.length>0?e.jsx("div",{className:"act-tail-line",children:a.join(`
303
+ `)}):null]})}function ri({text:t}){return e.jsx("div",{className:"live-answer",children:e.jsxs(Xr,{children:[e.jsx(Du,{source:t}),e.jsx("span",{className:"caret","aria-hidden":!0,children:"▌"})]})})}function Ju({live:t,queued:s,onRecall:n,onDetachTool:a}){const l=t.busyTools,r=l.length>0||t.reasoning!==""||s.length>0;return e.jsxs(e.Fragment,{children:[r?e.jsxs("div",{className:"panel",children:[e.jsxs("div",{className:"panel-head",children:[e.jsx("span",{className:"panel-title",children:"工具流"}),e.jsx("span",{className:"panel-count",children:`${l.length} 项`})]}),e.jsxs("div",{className:"panel-list",children:[t.reasoning!==""?e.jsx(la,{text:t.reasoning,streaming:t.thinking??!1,defaultOpen:!0}):null,l.map((o,c)=>e.jsx(li,{tool:o,onDetach:a},`${o.name}:${o.summary}:${c}`)),s.map((o,c)=>e.jsxs("div",{className:"steer",children:[e.jsx(ae,{name:"hourglass",size:11}),` 将在下一步前注入:${Jr(Ys(o),60)}`,n!==void 0?e.jsx("button",{type:"button",className:"recall","aria-label":"撤回这条排队消息",title:"趁还没被读取,撤回这条",onClick:()=>n(c,o),children:"↩ 撤回"}):null]},c))]})]}):null,t.answer!==""?e.jsx(ri,{text:t.answer}):null]})}function Qu(t){for(const s of[Xt.done,Xt.inProgress,Xt.pending])if(t.startsWith(s))return t.slice(s.length);return t}function Zu({done:t,total:s,lines:n}){const a=s===0?0:t/s*100;return e.jsxs("div",{className:"todo",children:[e.jsx("div",{className:"todo-bar",role:"progressbar","aria-label":`${t}/${s}`,"aria-valuenow":t,"aria-valuemin":0,"aria-valuemax":s,style:{width:`${a}%`}}),n.map((l,r)=>{const o=Ou(l);return e.jsxs("div",{className:"todo-item",children:[e.jsx("span",{className:`todo-box${o==="done"?" done":""}`,children:o==="done"?e.jsx(ht,{size:12}):null}),e.jsx("span",{children:Qu(l)})]},r)})]})}const ii=9,eh=20*1024*1024;function ss(t){return 4*Math.ceil(t/3)}let Bl=0;function oi(){const t=globalThis.crypto;return typeof t?.randomUUID=="function"?t.randomUUID():(Bl+=1,`draft-${Bl}`)}function ci(t){return ss(t.byteLength)}function th(t,s){return t.type.startsWith("image/")?s.length>=ii?"count":s.reduce((a,l)=>a+ci(l),0)+ss(t.size)>eh?"budget":null:"type"}function di(t,s){const n=[],a=[...s],l=new Map;let r=null;for(const c of t){const d=th(c,a);d===null?(n.push(c),a.push({byteLength:c.size})):(l.set(d,(l.get(d)??0)+1),d==="type"&&r===null&&(r=c.type===""?"该文件":c.type))}if(l.size===0)return{accepted:n,notice:null};const o=[];for(const c of["type","count","budget"]){const d=l.get(c);d!==void 0&&(c==="type"?o.push(`${d} 张不是图片(${r})—— 只能附加图片`):c==="count"?o.push(`${d} 张超出数量上限(最多同时附加 ${ii} 张)`):o.push(`${d} 张超过 20MiB 上限`))}return{accepted:n,notice:`⚠️ ${o.join(" · ")}`}}const sh=[{code:"TOO_MANY_IMAGES",re:/TOO_MANY_IMAGES|exceed the per-request cap/i,zh:"图片数量超出上限"},{code:"IMAGES_TOO_LARGE",re:/IMAGES_TOO_LARGE|over the \d+-byte request budget/i,zh:"图片体积超出上限"}];function nh(t){for(const s of sh)if(s.re.test(t))return`${s.zh}(${s.code})`;return t}function ui(t){return{id:oi(),name:t.name,mediaType:t.type,byteLength:t.size,url:URL.createObjectURL(t),file:t}}function Ps(t){URL.revokeObjectURL(t.url)}function Kl(t){return new Promise((s,n)=>{const a=new FileReader;a.onerror=()=>n(new Error(`read failed: ${t.name}`)),a.onload=()=>{const l=String(a.result??""),r=l.indexOf(",");s(r===-1?l:l.slice(r+1))},a.readAsDataURL(t)})}const Xs=9,hi=50*1024*1024;function ah(t,s){return s.length>=Xs?"count":s.reduce((a,l)=>a+ci(l),0)+ss(t.size)>hi?"budget":null}function mi(t,s){const n=[],a=[...s],l=new Map;for(const o of t){const c=ah(o,a);c===null?(n.push(o),a.push({byteLength:o.size})):l.set(c,(l.get(c)??0)+1)}if(l.size===0)return{accepted:n,notice:null};const r=[];for(const o of["count","budget"]){const c=l.get(o);c!==void 0&&(o==="count"?r.push(`${c} 个超出数量上限(最多同时附加 ${Xs} 个)`):r.push(`${c} 个超过 50MiB 上限`))}return{accepted:n,notice:`⚠️ ${r.join(" · ")}`}}function ra(t){return{id:oi(),name:t.name,byteLength:t.size,file:t}}const lh=[{code:"TOO_MANY_FILES",re:/TOO_MANY_FILES|files exceed the per-request cap/i,zh:"文件数量超出上限"},{code:"FILES_TOO_LARGE",re:/FILES_TOO_LARGE|over the \d+-byte request budget/i,zh:"文件体积超出上限"}];function rh(t){for(const s of lh)if(s.re.test(t))return`${s.zh}(${s.code})`;return t}const ih=50;class oh{generation=0;session=null;entries=new Map;inFlight=new Map;ensureSession(s){return this.session!==s&&(this.dispose(),this.session=s),this.generation}peek(s){const n=this.entries.get(s);if(n!==void 0)return this.entries.delete(s),this.entries.set(s,n),n.url}async resolve(s,n,a){const l=this.peek(n.attachmentId);if(l!==void 0)return l;const r=this.inFlight.get(n.attachmentId);if(r!==void 0)return r;const o=(async()=>{const c=await a(n),d=ch(c.data),m=URL.createObjectURL(new Blob([d],{type:c.mediaType}));return s!==this.generation?(URL.revokeObjectURL(m),null):(this.entries.set(n.attachmentId,{url:m}),this.evictOverCap(),m)})();this.inFlight.set(n.attachmentId,o);try{return await o}finally{this.inFlight.delete(n.attachmentId)}}evictOverCap(){for(;this.entries.size>ih;){const s=this.entries.keys().next();if(s.done===!0)return;const n=this.entries.get(s.value);this.entries.delete(s.value),n!==void 0&&URL.revokeObjectURL(n.url)}}dispose(){for(const[,s]of this.entries)URL.revokeObjectURL(s.url);this.entries.clear(),this.inFlight.clear(),this.generation+=1}}const wn=new oh;function ch(t){const s=atob(t),n=new Uint8Array(s.length);for(let a=0;a<s.length;a+=1)n[a]=s.charCodeAt(a);return n}const pi=i.createContext(null);function dh(t,s){const[n,a]=i.useState({phase:"loading"});return i.useEffect(()=>{if(s===null)return;let l=!1;const r=wn.ensureSession(s.sessionId),o=wn.peek(t.ref.attachmentId);if(o!==void 0){a({phase:"ready",url:o});return}return a({phase:"loading"}),wn.resolve(r,t.ref,c=>s.client.attachmentGet(c)).then(c=>{l||c!==null&&a({phase:"ready",url:c})}).catch(c=>{l||a({phase:"error",message:c instanceof Error?c.message:String(c)})}),()=>{l=!0}},[s,t.ref.attachmentId,t.ref.mediaType,t.ref.byteLength]),n}function uh({block:t,index:s}){const n=i.useContext(pi),a=dh(t,n);return a.phase==="ready"?e.jsx("img",{className:"img-bub",src:a.url,alt:`图片 ${s+1}`,loading:"lazy"}):a.phase==="error"?e.jsxs("span",{className:"img-bub err",title:a.message,role:"img","aria-label":"图片加载失败",children:[e.jsx(ae,{name:"image",size:16}),"?"]}):e.jsx("span",{className:"img-bub pending","aria-hidden":!0})}function hh({images:t}){return t.length===0?e.jsx(e.Fragment,{}):e.jsx("div",{className:"img-rail",children:t.map((s,n)=>e.jsx(uh,{block:s,index:n},`${s.ref.attachmentId}#${n}`))})}function mh({files:t}){return t.length===0?e.jsx(e.Fragment,{}):e.jsx("div",{className:"hist-file-rail",children:t.map((s,n)=>e.jsxs("span",{className:"hist-file-chip",title:`${s.name} · ${s.attachmentId.slice(0,19)}…`,children:[e.jsx("span",{"aria-hidden":!0,children:e.jsx(ae,{name:"file-text",size:12})}),e.jsx("span",{className:"name",children:s.name}),e.jsx("span",{className:"size",children:ph(s.bytes)})]},`${s.attachmentId}#${n}`))})}function ph(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}const fh=[["warn",/^⚠️?\s*/u],["ok",/^✅\s*/u],["info",/^ℹ️?\s*/u]];function At(t){for(const[s,n]of fh)if(n.test(t))return{variant:s,text:t.replace(n,"")};return{variant:"info",text:t}}function fi(t){const s=t.toLowerCase();return/截断|truncat|finish_reason|too long|超出.*长度|length limit/.test(s)||/截断/.test(t)?{hint:"回复被截断了——内容太长,模型只写了一半。",action:{label:"发送「继续」让模型接着写",text:"继续"}}:/\b401\b|\b403\b|unauthorized|api[ -]?key|密钥|鉴权|认证|invalid key/.test(s)?{hint:"模型服务的 Key 可能无效或过期——打开右上角「设置」检查密钥后重试。"}:/\b429\b|rate.?limit|限流|too many requests/.test(s)?{hint:"请求太频繁——稍等一会儿再发送。"}:/timeout|timed out|econn|enotfound|network|fetch failed|connection|网络/.test(s)?{hint:"连不上模型服务——检查网络后重试。"}:{hint:"可以重试一次;若再次失败,把任务拆小一点、换个说法再描述。"}}function xh({text:t,onAction:s}){const{lines:n,total:a}=Hs(t),l=fi(t);return e.jsxs("div",{className:"simple-error",role:"alert",children:[e.jsxs("div",{className:"err-head",children:[e.jsx(ae,{name:"triangle-alert",size:13})," 出错了"]}),e.jsx("div",{className:"err-text",children:n.join(`
304
+ `)}),a>We?e.jsx("div",{className:"activity-foot",children:`⋯ 共 ${a} 行,已显示前 ${We} 行`}):null,e.jsxs("div",{className:"err-recovery",children:[e.jsx("span",{className:"label",children:"怎么办:"}),e.jsx("span",{children:l.hint}),l.action!==void 0&&s!==void 0?e.jsx("button",{type:"button",className:"wudao action",onClick:()=>s(l.action?.text??""),children:l.action.label}):null]})]})}const vh="[wudao-perm:accessibility]",gh="[wudao-perm:screen-recording]",xi={kind:"accessibility",steps:["打开 系统设置 → 隐私与安全性 → 辅助功能","在列表里勾选 wudao(桌面版是 wudao-harness-desktop;终端里运行就勾选那个终端)","回到 wudao,点下面的「重试」"],retryText:"我已经开启了辅助功能权限,请再试一次刚才的电脑操作"},jh={kind:"screen-recording",steps:["打开 系统设置 → 隐私与安全性 → 屏幕录制","勾选 wudao(桌面版是 wudao-harness-desktop),然后完全退出并重新打开它","回到 wudao,点下面的「重试」"],retryText:"我已经开启了屏幕录制权限并重启了应用,请再截一次屏幕"};function ia(t){return t.includes(vh)?xi:t.includes(gh)?jh:null}const bh={accessibility:"辅助功能","screen-recording":"屏幕录制"};function vi({text:t,onRetry:s}){const n=ia(t)??xi;return e.jsxs("div",{className:"perm-guide",role:"note","data-perm-kind":n.kind,children:[e.jsx("div",{className:"perm-head",children:`需要一次「${bh[n.kind]}」授权——按下面三步开:`}),e.jsx("ol",{className:"perm-steps",children:n.steps.map((a,l)=>e.jsx("li",{children:a},l))}),s!==void 0?e.jsx("button",{type:"button",className:"wudao action perm-retry",onClick:()=>s(n.retryText),children:"重试"}):null]})}function gi(t){return t.split(`
305
+ `).map(s=>({text:s,kind:yh(s)}))}function yh(t){return t.startsWith("diff --git ")||t.startsWith("new file")||t.startsWith("--- ")||t.startsWith("+++ ")?"file-header":t.startsWith("@@")?"hunk":t.startsWith("+")?"add":t.startsWith("-")?"del":"context"}const Nh={"file-header":"file",hunk:"hunk",add:"add",del:"del",context:"context"};function ji(t){if(!t.startsWith("diff --git "))return;const s=t.slice(13);let n=s.indexOf(" b/");for(;n>=0;){if(s.slice(0,n)===s.slice(n+3))return s.slice(0,n);n=s.indexOf(" b/",n+1)}const a=s.lastIndexOf(" b/");return a>=0?s.slice(0,a):s}function kh(t){const s=new Set;for(const n of gi(t)){if(n.kind!=="file-header")continue;const a=ji(n.text);a!==void 0&&s.add(a)}return s}function bi({detail:t,className:s,as:n="div"}){const a=gi(t),l=n;return e.jsx(l,{className:`${s} dtx`,children:a.map((r,o)=>{const c=r.kind==="file-header"?ji(r.text):void 0;return e.jsxs(ce.Fragment,{children:[o>0?`
306
+ `:null,e.jsx("span",{className:`dtx-line dtx-${Nh[r.kind]}`,...c!==void 0?{"data-dtx-file":c}:{},children:r.text})]},o)})})}const Ul=60,wh=60;function yi(t){const[s,n]=i.useState(Ul),a=i.useRef(null),l=i.useRef(t);i.useEffect(()=>{t<l.current&&n(Ul),l.current=t},[t]);const r=i.useCallback(()=>{n(d=>d+wh)},[]),o=t>s;i.useEffect(()=>{if(!o)return;const d=a.current;if(d===null||typeof IntersectionObserver>"u")return;const m=new IntersectionObserver(p=>{for(const v of p)v.isIntersecting&&r()});return m.observe(d),()=>m.disconnect()},[o,r,s]);const c=Math.min(s,t);return{visible:c,hidden:t-c,sentinelRef:a,hydrate:r}}function Ni(t){return`(还有 ${t} 条更早的消息——向上滚动或点击加载)`}const Js=ce.memo(function({entry:s,onAction:n,onOpenFile:a,forkN:l,fork:r,onForkTurn:o,running:c}){switch(s.kind){case"user":return e.jsxs("div",{className:"msg-user",children:[r===!0?e.jsx("span",{className:"fork-badge",children:"⑂"}):null,l!=null&&o!==void 0?e.jsx("button",{type:"button",className:"fork-act",title:"以这轮为起点开一条新线(原文带回输入框,可改后发送)",onClick:()=>o(l),children:"从这里岔开"}):null,s.images!==void 0&&s.images.length>0?e.jsx(hh,{images:s.images}):null,s.files!==void 0&&s.files.length>0?e.jsx(mh,{files:s.files}):null,s.text.trim()!==""?e.jsx("div",{className:"bub",children:Ys(s.text)}):null]});case"assistant":return e.jsxs(Xr,{children:[s.reasoning!==void 0&&s.reasoning!==""?e.jsx(la,{text:s.reasoning,defaultOpen:!0}):null,e.jsx(Yr,{source:s.text}),s.durationMs!==void 0?e.jsx("div",{className:"reply-meta",children:`· ${Nr(s.durationMs)}`}):null,s.servedBy!==void 0?e.jsx("div",{className:"reply-meta","data-served-by":s.servedBy.model,children:`· 本轮由 ${s.servedBy.model}(降级)作答`}):null]});case"tool":return e.jsx($h,{entry:s,onOpenFile:a,onAction:n});case"edit":return e.jsx(ni,{entry:s,running:c===!0,onOpenFile:a});case"board":return e.jsx(Zu,{done:s.done,total:s.total,lines:s.lines});case"notice":return s.card===!0?e.jsx(Sh,{entry:s}):e.jsx(Ch,{entry:s});case"divider":return e.jsx("div",{className:"entry-divider",children:`${Ms}${Ms} ${s.text} ${Ms}${Ms}`});case"error":{const d=fi(s.text);return e.jsxs("div",{className:"entry-error-block",children:[e.jsx("div",{className:"entry-error",children:s.text}),e.jsxs("div",{className:"entry-error-hint",children:[e.jsx("span",{children:d.hint}),d.action!==void 0&&n!==void 0?e.jsx("button",{type:"button",className:"wudao action",onClick:()=>n(d.action?.text??""),children:d.action.label}):null]})]})}}});function Sh({entry:t}){const[s,n]=i.useState(!1),a=t.detail!==void 0&&t.detail.length>0,l=e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"inject-line",children:t.text}),a?e.jsx("span",{className:"inject-chev",children:s?e.jsx(tt,{size:12}):e.jsx(bt,{size:12})}):null]});return e.jsxs("div",{className:"msg-a msg-inject",children:[e.jsxs("div",{className:"msg-sig",children:[e.jsx("span",{className:"sig-glyph",children:"注"}),e.jsx("span",{className:"sig-name",children:t.source??"系统注入"})]}),e.jsxs("div",{className:"reply-card",children:[a?e.jsx("button",{type:"button",className:"inject-head","aria-expanded":s,"aria-label":s?"收起注入全文":"展开注入全文",onClick:()=>n(!s),children:l}):e.jsx("div",{className:"inject-head",children:l}),s&&a?e.jsx("div",{className:"notice-detail",children:t.detail}):null]})]})}function Ch({entry:t}){const[s,n]=i.useState(!1),a=t.detail!==void 0&&t.detail.length>0,l=t.changes!==void 0&&t.changes.length>0,r=At(t.text);return e.jsxs("div",{className:"entry-notice",children:[e.jsxs("span",{className:"notice-bub","data-variant":r.variant,children:[r.variant==="warn"?e.jsx(ae,{name:"triangle-alert",size:12}):r.variant==="ok"?e.jsx(ht,{size:12,className:"ic"}):null,r.text,a?e.jsx("button",{type:"button",className:"notice-exp","aria-expanded":s,"aria-label":s?"收起通知全文":"展开通知全文",onClick:()=>n(!s),children:s?e.jsx(tt,{size:12}):e.jsx(bt,{size:12})}):null]}),s&&a?l?e.jsx(bi,{detail:t.detail??"",className:"notice-detail"}):e.jsx("div",{className:"notice-detail",children:t.detail}):null]})}function Eh({entry:t,onAction:s}){const[n,a]=i.useState(!1),l=t.resultPreview??"",o=(t.isError===!0&&l!==""?ia(l):null)!==null?e.jsx(vi,{text:l,onRetry:s}):null;if(l==="")return t.isError?e.jsxs("div",{className:"result err",children:[" ↳ [error]",o]}):null;const{lines:c,total:d}=Hs(l,n?Ws:We);return e.jsxs("div",{className:`result${t.isError?" err":""}`,"data-truncated":d>We,children:[` ↳ ${t.isError?"[error] ":""}${c.join(`
307
+ `)}`,d>We||n?e.jsx(aa,{total:d,expanded:n,onToggle:()=>a(m=>!m)}):null,o]})}function $h({entry:t,onOpenFile:s,onAction:n}){const[a,l]=i.useState(!0),r=t.isError?"err":"ok",o={ok:"✓",run:"◐",err:"✕"};return e.jsxs("div",{className:`toolcard${t.isError?" err":""}`,"data-status":r,"data-open":a,children:[e.jsxs("button",{type:"button",className:"head","aria-expanded":a,onClick:()=>l(!a),children:[e.jsx("span",{className:"mark",children:`${o[r]} `}),e.jsx("span",{className:"name",children:t.name}),t.summary?e.jsxs("span",{className:"args",children:["(",Wl[t.name]!==void 0?e.jsx(dt,{text:t.summary,lang:Wl[t.name]}):Mh.has(t.name)&&s!==void 0?e.jsx("button",{type:"button",className:"fv-chip",title:t.summary,onClick:c=>{c.stopPropagation(),s(t.summary??"")},children:t.summary}):t.summary,")"]}):null,e.jsx("span",{className:"chev","aria-hidden":!0,children:a?"▾":"▸"})]}),a?e.jsx(Eh,{entry:t,onAction:n}):null]})}const Rh=new Set(["read_file","grep","glob","web_search","web_fetch"]),Wl={shell:"shell"},Mh=new Set(["write_file","read_file"]);function Mt(t,s){const n=(t.kind==="tool"?`${t.name}:${t.summary}`:t.kind==="edit"?t.path:t.kind==="board"?`${t.done}/${t.total}`:"text"in t?t.text:"").slice(0,8);return`${t.kind}#${s}#${n}`}function Th(t){return t.kind==="tool"&&t.isError!==!0&&Rh.has(t.name)}function Ah(t,s){const n=t[s];if(n===void 0||n.kind!=="user"||n.text.startsWith("["))return null;let a=0;for(let l=s;l<t.length;l+=1){const r=t[l];r!==void 0&&r.kind==="user"&&!r.text.startsWith("[")&&(a+=1)}return a}function Dh(t){const s=[];let n=0;for(;n<t.length;){const a=t[n];if(Th(a)){let l=n+1;for(;l<t.length;){const o=t[l];if(!(o.kind==="tool"&&o.isError!==!0&&o.name===a.name))break;l++}const r=t.slice(n,l);s.push(r.length>=2?{kind:"toolgroup",name:a.name,entries:r}:{kind:"entry",entry:a}),n=l}else if(a.kind==="notice"&&a.card!==!0){let l=n+1;for(;l<t.length;){const o=t[l];if(!(o.kind==="notice"&&o.card!==!0&&o.text===a.text))break;l++}const r=t.slice(n,l);s.push(r.length>=2?{kind:"noticegroup",text:a.text,entries:r}:{kind:"entry",entry:a}),n=l}else s.push({kind:"entry",entry:a}),n++}return s}function Oh({name:t,entries:s,onOpenFile:n}){const[a,l]=i.useState(!1);return e.jsxs("div",{className:"toolgroup","data-open":a,children:[e.jsxs("button",{type:"button",className:"grp-head act-row","aria-expanded":a,onClick:()=>l(!a),children:[e.jsx("span",{className:"mark",children:"✓ "}),e.jsx("span",{className:"name",children:t}),e.jsx("span",{className:"count act-tail",children:` ×${s.length}`}),e.jsx("span",{className:"exp act-chev",children:a?e.jsx(tt,{size:12}):e.jsx(bt,{size:12})})]}),a?s.map((r,o)=>e.jsx(Js,{entry:r,onOpenFile:n},Mt(r,o))):null]})}function Ih({text:t,entries:s}){const[n,a]=i.useState(!1),l=At(t);return e.jsxs("div",{className:"noticegroup","data-open":n,children:[e.jsxs("button",{type:"button",className:"grp-head","data-variant":l.variant,"aria-expanded":n,onClick:()=>a(!n),children:[l.variant==="warn"?e.jsx(ae,{name:"triangle-alert",size:12}):l.variant==="ok"?e.jsx(ht,{size:12,className:"ic"}):null,e.jsx("span",{className:"text",children:l.text}),e.jsx("span",{className:"count",children:` ×${s.length}`}),e.jsx("span",{className:"exp",children:n?e.jsx(tt,{size:12}):e.jsx(bt,{size:12})})]}),n?s.map((r,o)=>e.jsx(Js,{entry:r},Mt(r,o))):null]})}const Lh=ce.memo(function({history:s,onAction:n,onOpenFile:a,onForkTurn:l,forkBadgeKeys:r,runningEditPaths:o}){const c=i.useMemo(()=>Dh(s),[s]),d=i.useMemo(()=>{const N=[];let M=0;for(const y of c)N.push(M),M+=y.kind==="entry"?1:y.entries.length;return N},[c]),m=yi(c.length),p=m.hidden,[v,x]=i.useState(null),j=N=>N.kind!=="entry"?null:N.entry.kind==="user"||N.entry.kind==="assistant"?N.entry.text:null;return e.jsxs(e.Fragment,{children:[p>0?e.jsx("div",{ref:m.sentinelRef,className:"history-hydrate-sentinel",onClick:m.hydrate,role:"button",tabIndex:0,onKeyDown:N=>{(N.key==="Enter"||N.key===" ")&&m.hydrate()},children:Ni(p)}):null,c.slice(p).map((N,M)=>{const y=p+M,g=j(N),O=N.kind==="entry"?Mt(N.entry,y):N.kind==="toolgroup"?`grp#${N.name}#${y}#${N.entries.length}`:`ngrp#${N.text.slice(0,8)}#${y}#${N.entries.length}`;return e.jsxs(ce.Fragment,{children:[M>0?e.jsx("div",{className:"entry-gap"}):null,e.jsx("div",{className:"entry",onContextMenu:g===null?void 0:$=>{$.preventDefault(),x({x:$.clientX,y:$.clientY,text:g})},children:N.kind==="toolgroup"?e.jsx(Oh,{name:N.name,entries:N.entries,onOpenFile:a}):N.kind==="noticegroup"?e.jsx(Ih,{text:N.text,entries:N.entries}):e.jsx(Js,{entry:N.entry,onAction:n,onOpenFile:a,forkN:l!==void 0&&N.entry.kind==="user"?Ah(s,d[y]??y):null,fork:r!==void 0&&N.entry.kind==="user"?r.has(Mt(N.entry,d[y]??y)):void 0,onForkTurn:l,running:o!==void 0&&N.entry.kind==="edit"?o.has(N.entry.path):void 0})})]},O)}),v!==null?e.jsx(Gr,{x:v.x,y:v.y,items:[{label:"复制文本",onSelect:()=>Us(v.text)}],onClose:()=>x(null)}):null]})});function Ph({n:t,onCancel:s}){return e.jsxs("div",{className:"armed-branch",role:"status",children:[e.jsx("span",{className:"armed-text",children:`将从第 ${t} 轮开分支(原消息已带入,可修改后发送);发送即岔开,主线保留`}),e.jsx("button",{type:"button",className:"wudao action",onClick:s,children:"取消"})]})}function _h({client:t,refreshTick:s}){const[n,a]=i.useState(null),[l,r]=i.useState(!1),[o,c]=i.useState(null),d=i.useCallback(()=>{t.branchLeaves().then(x=>{a(x)}).catch(()=>{a(null)})},[t]),m=i.useRef(!0);i.useEffect(()=>{if(m.current){m.current=!1;const x=setTimeout(d,0);return()=>{clearTimeout(x)}}d()},[d,s]),i.useEffect(()=>{l&&d()},[l,d]);const p=i.useCallback(x=>{c(null),t.switchBranch(x.n).then(j=>{c(j),d()}).catch(j=>{c(`⚠️ 切换失败:${j instanceof Error?j.message:String(j)}`)})},[t,d]);if(n===null||n.length<2&&!l)return null;const v=n.find(x=>x.isCurrent)??null;return e.jsxs("div",{className:"branch-bar",children:[e.jsx("button",{type:"button",className:"branch-chip","aria-expanded":l,onClick:()=>{r(x=>!x),c(null)},children:`⑂ ${v!==null?`第 ${v.n}/${n.length} 条线`:`${n.length} 条线`}`}),l?e.jsxs("div",{className:"branch-panel",children:[n.map(x=>e.jsxs("div",{className:`branch-row${x.isCurrent?" cur":""}`,children:[e.jsx("span",{className:"row-n",children:`${x.n}.`}),e.jsx("span",{className:"row-main",children:x.forkPreview!==""?`分叉自 “${x.forkPreview}”`:"从头开始"}),e.jsx("span",{className:"row-count",children:`${x.messageCount} 条消息`}),x.isCurrent?e.jsx("span",{className:"row-cur",children:"当前"}):e.jsx("button",{type:"button",className:"wudao action",onClick:()=>p(x),children:"切到这里"})]},x.leafKey)),o!==null?(()=>{const x=At(o);return e.jsxs("div",{className:"branch-note","data-variant":x.variant,children:[x.variant==="warn"?e.jsx(ae,{name:"triangle-alert",size:12}):x.variant==="ok"?e.jsx(ht,{size:12,className:"ic"}):null,x.text]})})():null]}):null]})}const Fh=t=>t instanceof Error?t.message:String(t);function ki(t){switch(t){case"fact":return"事实";case"preference":return"偏好";case"skill_note":return"技能心得";case"harness":return"协作心得";default:return t}}function wi(t){switch(t){case"project":return"本项目";case"user":return"个人";default:return t}}function Hl(t,s=Date.now()){const n=Date.parse(t);if(Number.isNaN(n))return"";const a=s-n;if(a<6e4)return"刚刚";const l=Math.floor(a/6e4);if(l<60)return`${l} 分钟前`;const r=Math.floor(l/60);if(r<24)return`${r} 小时前`;const o=Math.floor(r/24);return o<=30?`${o} 天前`:t.slice(0,10)}const zh=(t,s=80)=>t.length<=s?t:`${t.slice(0,s-1)}…`;function Si(t){return typeof t!="object"||t===null||!Array.isArray(t.entries)?null:t.entries}function Bh({client:t,memorySignature:s}){const[n,a]=i.useState(null),[l,r]=i.useState(0),[o,c]=i.useState(!1),[d,m]=i.useState(null),[p,v]=i.useState(null),x=i.useCallback(()=>{t.memoryList().then(g=>{a(Si(g)),r(typeof g.blocked=="number"&&g.blocked>0?g.blocked:0)}).catch(()=>{a(null)})},[t]),j=i.useRef(!0);i.useEffect(()=>{if(j.current){j.current=!1;const g=setTimeout(x,0);return()=>{clearTimeout(g)}}x()},[x]);const N=i.useRef({sig:void 0,armed:!1});i.useEffect(()=>{const g=N.current;if(!g.armed){N.current={sig:s,armed:!0};return}s!==g.sig&&(N.current={sig:s,armed:!0},x())},[s,x]);const M=n?.filter(g=>g.status==="pending")??[];if(n===null||o||M.length===0)return null;const y=(g,O)=>{m(g),v(null),t.memoryDecide(g,O).then(()=>x()).catch($=>{v(`⚠️ 记忆操作失败:${Fh($)}`)}).finally(()=>m(null))};return e.jsxs("div",{className:"memory-review-card",role:"status",children:[e.jsxs("div",{className:"memory-review-head",children:[e.jsxs("span",{className:"memory-review-title",children:[e.jsx(ae,{name:"brain",size:13})," ",`有 ${M.length} 条记忆待你确认`]}),e.jsx("button",{type:"button",className:"wudao action",onClick:()=>c(!0),children:"稍后"})]}),e.jsx("div",{className:"hint",children:"模型替你记下的内容,确认后才会参与回忆"}),l>0?e.jsx("div",{className:"hint mem-blocked","data-blocked-count":l,children:`已拦 ${l} 条可疑学习输入(未入库——明细在 .wudao/memory-blocked.jsonl)`}):null,M.map(g=>e.jsxs("div",{className:"mem-row","data-mem-id":g.id,children:[e.jsx("span",{className:"mem-badge",children:"待审"}),e.jsxs("span",{className:"mem-main",children:[e.jsx("span",{className:"mem-kind",children:`${ki(g.kind)} · ${wi(g.scope)}`}),e.jsx("span",{className:"mem-content",children:zh(g.content)})]}),e.jsxs("span",{className:"mem-acts",children:[e.jsx("button",{type:"button",className:"wudao action",disabled:d!==null,onClick:()=>y(g.id,"ok"),children:"确认"}),e.jsx("button",{type:"button",className:"wudao danger",disabled:d!==null,onClick:()=>y(g.id,"del"),children:"丢弃"})]})]},g.id)),p!==null?(()=>{const g=At(p);return e.jsxs("div",{className:"mem-note","data-variant":g.variant,children:[g.variant==="warn"?e.jsx(ae,{name:"triangle-alert",size:12}):g.variant==="ok"?e.jsx(ht,{size:12,className:"ic"}):null,g.text]})})():null]})}function Ci(t){return t.busyTools.length>0?"tools":t.answer!==""?"answering":t.reasoning!==""?"thinking":"working"}const Kh={thinking:"正在思考",tools:"正在执行操作",answering:"正在回复",working:"正在处理"},Uh=15e3;function Ei(t,s){const[n,a]=i.useState(null),l=i.useRef(null);return i.useEffect(()=>{if(!t){l.current=null,a(null);return}l.current=Date.now();let r=null;const o=()=>{l.current!==null&&a(Math.floor((Date.now()-l.current)/1e3))},c=setTimeout(()=>{o(),r=setInterval(o,1e3)},s);return()=>{clearTimeout(c),r!==null&&clearInterval(r)}},[t,s]),n}function Wh(t){return`已进行 ${t} 秒`}function Hh({busy:t,live:s,queued:n=[],onRecall:a}){const l=Ei(t,Uh);if(!t)return null;const r=Ci(s),o=r==="thinking"||r==="working";return e.jsxs("div",{className:"turnstatus","data-phase":r,children:[e.jsxs("div",{className:"ts-head",children:[e.jsx("span",{className:o?"label shimmer":"label",children:Kh[r]}),l!==null?e.jsx("span",{className:"clock",children:Wh(l)}):null]}),n.map((c,d)=>e.jsxs("div",{className:"queue-line",children:[e.jsx(ae,{name:"hourglass",size:11}),` 将在下一步前注入:${Jr(Ys(c),48)}`,a!==void 0?e.jsx("button",{type:"button",className:"recall","aria-label":"撤回这条排队消息",title:"趁还没被读取,撤回这条",onClick:()=>a(d,c),children:"↩ 撤回"}):null]},`q${d}`))]})}const qh={thinking:"思考中",tools:"执行中",answering:"回复中",working:"处理中"},Gh=1e3,Vh=t=>[`系统提示 ~${Oe(t.systemTokens)}`,`工具定义 ~${Oe(t.toolsTokens)}`,`消息历史 ~${Oe(t.messagesTokens)}`,...t.imagesTokens!==void 0&&t.imagesTokens>0?[`图片 ~${Oe(t.imagesTokens)}`]:[],`可用 ~${Oe(t.availableTokens)}`].join(`
308
+ `);function Yh({status:t,ctxInfo:s,stale:n,sessionName:a,buddy:l,workspaceName:r,workspacePath:o}){const[c,d]=i.useState(null),m=i.useRef(s);m.current=s;const p=i.useRef(null),v=t?.ctxTokens?.used??null,x=t!==null&&t.busy&&t.pendingPermission===null,j=Ei(t!==null&&t.busy,Gh),N=x?qh[Ci(t.live)]:null;i.useEffect(()=>{if(l===!0)return;const y=m.current;if(y===void 0||v===null)return;const g=p.current;if(g!==null&&Math.abs(v-g)<=1e3)return;let O=!1;return y().then($=>{O||(p.current=v,d($))},()=>{O||d(null)}),()=>{O=!0}},[v]);const M=[];if(t!==null){if(l===!0)r!==void 0&&r!==""&&(M.push(e.jsx("span",{title:o,children:`工作区 ${r}`},"workspace")),typeof t.gitBranch=="string"&&t.gitBranch!==""&&M.push(e.jsx("span",{className:"seg-branch",title:"当前工作分支",children:t.gitBranch},"branch")));else if(M.push(`wudao · ${a!==void 0&&a!==""?a:t.sessionId.slice(0,8)}`),typeof t.gitBranch=="string"&&t.gitBranch!==""&&M.push(e.jsx("span",{className:"seg-branch",title:"当前工作分支",children:t.gitBranch},"branch")),t.ctxTokens!==null&&M.push(e.jsxs("span",{className:"seg-ctx",title:c!==null?Vh(c):"上下文使用量",children:[`ctx ${t.ctxTokens.used===null?"…":Oe(t.ctxTokens.used)}/${Oe(t.ctxTokens.window)}`,t.ctxTokens.nearLimit?e.jsx("span",{className:"warn",children:e.jsx(ae,{name:"triangle-alert",size:11})}):null]},"ctx")),typeof t.cachePercent=="number"&&M.push(e.jsx("span",{className:"cache",children:`cache ${Math.round(t.cachePercent)}%`},"cache")),t.goal!=null){const y=t.goal,g=y.budgetTokens!==void 0?`已花 ${Oe(y.usedTokens)} / 预算 ${Oe(y.budgetTokens)}`:`已花 ${Oe(y.usedTokens)}`;M.push(e.jsx("span",{className:y.status==="budget_limited"?"seg-goal warn":"seg-goal",title:`目标:${y.objective}
309
+ ${g}(输入 ${Oe(y.inputTokens)} · 输出 ${Oe(y.outputTokens)})
310
+ 任务进度 ${y.progress.done}/${y.progress.total}`,children:y.status==="budget_limited"?`目标预算已尽 · ${y.objective.slice(0,24)}${y.objective.length>24?"…":""}(${g},任务 ${y.progress.done}/${y.progress.total})`:`目标 ${y.objective.slice(0,24)}${y.objective.length>24?"…":""}(${g},任务 ${y.progress.done}/${y.progress.total})`},"goal"))}t.boardProgress!==null&&M.push(e.jsxs("span",{className:"board",children:[e.jsx(ae,{name:"list-checks",size:11})," ",`${t.boardProgress.done}/${t.boardProgress.total}`]},"board")),t.bg.spawned>0&&M.push(`bg ${t.bg.active}/${t.bg.spawned}`),t.sidecar!==null&&t.sidecar.checks>0&&(M.push(`sidecar ${t.sidecar.checks}`),t.sidecar.breakerOpen&&M.push(e.jsx("span",{className:"warn",children:e.jsx(ae,{name:"shield-x",size:11})},"breaker")))}return M.length===0?null:e.jsxs("div",{className:"statusline","data-stale":n===!0?"":void 0,children:[M.map((y,g)=>e.jsxs(ce.Fragment,{children:[g>0?e.jsx("span",{className:"sep",children:xc}):null,y]},g)),x&&j!==null&&N!==null?e.jsx("span",{className:"seg-busy",children:`▌${N} · ${j}s`}):null]})}const ql=100;function Xh(){return{entries:[],pointer:0,draft:null}}function Sn(t,s){if(s===""||t.entries[t.entries.length-1]===s)return{entries:t.entries,pointer:t.entries.length,draft:null};const n=[...t.entries,s];return n.length>ql&&n.splice(0,n.length-ql),{entries:n,pointer:n.length,draft:null}}function Jh(t,s){return t.pointer<=0?null:{entries:t.entries,pointer:t.pointer-1,draft:t.pointer===t.entries.length?s:t.draft}}function Qh(t){return t.pointer>=t.entries.length?null:{entries:t.entries,pointer:t.pointer+1,draft:t.draft}}function Gl(t){return t.pointer<t.entries.length?t.entries[t.pointer]??"":t.draft??""}function Hn(t,s){const a=t.slice(0,Math.max(0,Math.min(s,t.length))).split(`
311
+ `);return{row:a.length-1,col:(a[a.length-1]??"").length}}function Zh(t,s){const{row:n}=Hn(t,s);return t.split(`
312
+ `)[n]??""}function em(t,s){const n=Math.max(0,Math.min(s,t.length));return n>0&&t[n-1]==="\\"?{kind:"newline",value:t.slice(0,n-1)+`
313
+ `+t.slice(n),caret:n}:{kind:"submit",text:t}}const tm=[{label:"总结要点",text:"总结这个文件的要点"},{label:"提炼待办",text:"从这个文件里提炼出我的待办事项"},{label:"看看这是啥",text:"这个文件是讲什么的"}],sm=[{label:"看看数据",text:"看看这份数据有什么值得注意的"},{label:"总结要点",text:"总结这个文件的要点"},{label:"提炼待办",text:"从这个文件里提炼出我的待办事项"}],Vl=[{label:"帮我处理",text:"帮我处理这个文件"},{label:"总结要点",text:"总结这个文件的要点"},{label:"看看这是啥",text:"这个文件是讲什么的"}],nm=new Set(["txt","md","pdf","docx"]),am=new Set(["xlsx","csv"]);function lm(t){const s=t.lastIndexOf(".");return s===-1?"":t.slice(s+1).toLowerCase()}function rm(t){const s=t[0];if(s===void 0)return Vl;const n=lm(s);return nm.has(n)?tm:am.has(n)?sm:Vl}const Cn=[{mode:"ask",label:"ask",hint:"每次询问:每个工具执行前都会确认,最安全",risky:!1},{mode:"workspace",label:"accept",hint:"默认·接受编辑:工作区内读写与只读命令(git status 等)放行;其余命令、网络、MCP 仍确认",risky:!1},{mode:"auto",label:"auto",hint:"全自动:全部放行,不再询问",risky:!0},{mode:"plan",label:"plan",hint:"只读探查:只允许读取与只读命令(git status 等);写文件/其余命令一律拒绝,完成方案后切回 accept/auto 执行",risky:!1}],im="我了解风险:完全访问会不经确认执行写入和命令";function $i(t){return t==="auto"?"auto":t==="ask"?"ask":t==="plan"?"plan":"workspace"}function oa({value:t,onChange:s,disabled:n=!1,direction:a="up"}){const[l,r]=i.useState(!1),[o,c]=i.useState(!1),d=i.useRef(null),m=i.useRef(null),p=(x=!0)=>{r(!1),c(!1),x&&setTimeout(()=>{document.activeElement===document.body&&m.current?.focus()},0)};i.useEffect(()=>{if(!l)return;const x=j=>{d.current!==null&&!d.current.contains(j.target)&&p(!1)};return document.addEventListener("pointerdown",x),()=>document.removeEventListener("pointerdown",x)},[l]);const v=Cn.find(x=>x.mode===t)??Cn[0];return e.jsxs("div",{className:a==="down"?"pop down":"pop",ref:d,onKeyDown:x=>{x.key==="Escape"&&(x.preventDefault(),p())},children:[e.jsxs("button",{type:"button",ref:m,className:`chip${t!=="workspace"?" sel":""}`,"data-mode":t,disabled:n,"aria-haspopup":"menu","aria-expanded":l,title:"权限档(四档可选)",onClick:()=>{c(!1),r(!l)},children:[v.label,e.jsx("span",{className:"caret","aria-hidden":!0,children:"▾"})]}),l?e.jsx("div",{className:"menu",role:"menu","aria-label":"权限档",children:Cn.map(x=>{const j=t===x.mode,N=x.risky&&!j,M=N&&o;return e.jsxs("button",{type:"button",role:"menuitemradio","aria-checked":j,className:`mi${j?" on":""}`,"data-mode":x.mode,title:x.hint,onClick:()=>{if(N&&!o){c(!0);return}s(x.mode),p()},children:[M?e.jsx("span",{className:"confirm",children:im}):e.jsx("span",{className:"mlabel",children:x.label}),x.risky?e.jsx("span",{className:"warned",children:M?"再点一次确认":"需确认"}):null]},x.mode)})}):null]})}const En="\0recent";function om({label:t,provider:s,choices:n,recent:a,disabled:l=!1,onPick:r,onPersistDefault:o}){const[c,d]=i.useState(!1),[m,p]=i.useState(null),v=i.useRef(null),x=i.useRef(null),j=(k=!0)=>{d(!1),p(null),k&&setTimeout(()=>{document.activeElement===document.body&&x.current?.focus()},0)};i.useEffect(()=>{if(!c)return;const k=G=>{v.current!==null&&!v.current.contains(G.target)&&j(!1)};return document.addEventListener("pointerdown",k),()=>document.removeEventListener("pointerdown",k)},[c]);const N=[],M=new Map;for(const k of n){let G=M.get(k.provider);G===void 0&&(G=[],M.set(k.provider,G),N.push(k.provider)),G.push(k)}const y=new Set,g=[];for(const k of a??[]){const G=`${k.provider}/${k.model}`;y.has(G)||M.get(k.provider)?.some(T=>T.model===k.model)===!0&&(y.add(G),g.push(k))}const O=m??(s!==void 0&&M.has(s)?s:void 0)??N[0],$=g.length>0&&O===En;return e.jsxs("div",{className:"pop",ref:v,onKeyDown:k=>{k.key==="Escape"&&(k.preventDefault(),j())},children:[e.jsxs("button",{type:"button",ref:x,className:"chip model",disabled:l,"aria-haspopup":"menu","aria-expanded":c,title:`${t} — 切换模型(会话内,下一轮生效;跨供应商行经 /provider 切换端点,缓存全冷)`,onClick:()=>{p(null),d(!c)},children:[e.jsx("span",{className:"chip-label",children:t}),e.jsx("span",{className:"caret","aria-hidden":!0,children:"▾"})]}),c?e.jsx("div",{className:"menu model-menu",role:"menu","aria-label":"切换模型",children:n.length===0||O===void 0?e.jsx("div",{className:"muted",children:"暂无可切换的模型"}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"mroot",role:"group","aria-label":"供应商",children:[g.length>0?e.jsxs("button",{type:"button",role:"menuitemradio","aria-checked":!1,className:`mi mprov mrec${$?" mfoc":""}`,"data-recent":"true",title:"最近使用的模型",onClick:()=>{p(En)},onMouseEnter:()=>{p(En)},children:[e.jsx("span",{className:"mlabel",children:"最近使用"}),e.jsx("span",{className:"msub",children:`${g.length} 个`})]},"recent"):null,N.map(k=>{const G=s!==void 0&&k===s;return e.jsxs("button",{type:"button",role:"menuitemradio","aria-checked":G,className:`mi mprov${G?" on":""}${k===O?" mfoc":""}`,"data-provider":k,title:`选择 ${k} 的模型`,onClick:()=>{p(k)},onMouseEnter:()=>{p(k)},children:[e.jsx("span",{className:"mlabel",children:k}),e.jsx("span",{className:"msub",children:`${M.get(k).length} 个模型`})]},k)})]}),e.jsxs("div",{className:"mpane",role:"group","aria-label":$?"最近使用的模型":`${O} 的模型`,children:[$?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"mgroup","data-recent":"true",children:"最近使用"}),g.map(k=>{const G=!zs(k,s),T=t===k.model&&(s===void 0||s===k.provider);return e.jsxs("button",{type:"button",role:"menuitemradio","aria-checked":T,className:`mi${T?" on":""}`,"data-model":k.model,"data-provider":k.provider,title:G?`submit /provider ${k.provider} — 切换端点,历史全量重处理(缓存全冷)`:`submit /model ${k.model}`,onClick:()=>{r(k.model,k.provider),j()},children:[e.jsx("span",{className:"mlabel",children:k.model}),e.jsx("span",{className:"msub",children:k.provider})]},`${k.provider}/${k.model}`)})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"mgroup","data-provider":O,children:O}),M.get(O).map(k=>{const G=!zs(k,s),T=t===k.model&&(s===void 0||s===k.provider);return e.jsxs("button",{type:"button",role:"menuitemradio","aria-checked":T,className:`mi${T?" on":""}`,"data-model":k.model,"data-provider":k.provider,title:G?`submit /provider ${k.provider} — 切换端点,历史全量重处理(缓存全冷)`:`submit /model ${k.model}`,onClick:()=>{r(k.model,k.provider),j()},children:[e.jsx("span",{className:"mlabel",children:k.model}),k.source==="env"?e.jsx("span",{className:"msub",children:"env"}):null]},`${k.provider}/${k.model}`)})]}),o!==void 0?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"menu-sep"}),e.jsx("button",{type:"button",role:"menuitem",className:"mi foot","data-action":"persist-default",onClick:()=>{o(),j()},children:e.jsx("span",{className:"mlabel",children:"设为默认(下次启动)"})})]}):null]})]})}):null]})}function cm({efforts:t,current:s,disabled:n=!1,onPick:a,providerLabel:l,onPersistDefault:r}){const[o,c]=i.useState(!1),d=i.useRef(null),m=i.useRef(null),p=(v=!0)=>{c(!1),v&&setTimeout(()=>{document.activeElement===document.body&&m.current?.focus()},0)};return i.useEffect(()=>{if(!o)return;const v=x=>{d.current!==null&&!d.current.contains(x.target)&&p(!1)};return document.addEventListener("pointerdown",v),()=>document.removeEventListener("pointerdown",v)},[o]),e.jsxs("div",{className:"pop",ref:d,onKeyDown:v=>{v.key==="Escape"&&(v.preventDefault(),p())},children:[e.jsxs("button",{type:"button",ref:m,className:`chip${s!==null?" sel":""}`,disabled:n,"aria-haspopup":"menu","aria-expanded":o,title:"推理强度(会话内,下一轮生效)",onClick:()=>{c(!o)},children:[e.jsx(od,{size:14}),s??"强度",e.jsx("span",{className:"caret","aria-hidden":!0,children:"▾"})]}),o?e.jsxs("div",{className:"menu",role:"menu","aria-label":"推理强度",children:[t.map(v=>{const x=v===s;return e.jsx("button",{type:"button",role:"menuitemradio","aria-checked":x,className:`mi${x?" on":""}`,"data-effort":v,onClick:()=>{a(v),p()},children:e.jsx("span",{className:"mlabel",children:v})},v)}),r!==void 0&&l!==void 0?e.jsx("button",{type:"button",className:"mf","data-action":"persist-effort-default",title:"把当前强度存为该供应商的注册表绑定(覆盖跟随全局;模型不受影响)",onClick:()=>{r(),p()},children:`设为 ${l} 默认`}):null]}):null]})}const ft={token:"",selected:0,dismissed:null},dm=6,um=80;function hm(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function mm(t){if(t!==null&&t.clientWidth>0){const s=Number.parseFloat(window.getComputedStyle(t).fontSize);return Math.max(16,Math.floor(t.clientWidth/((Number.isFinite(s)?s:13)*.62)))}return um}function pm(t,s){let n=0;for(const a of t.split(`
314
+ `))n+=Math.max(1,Math.ceil(a.length/s));return Math.min(dm,Math.max(1,n))}function fm(t){return/(?:^|\s)@([^\s@]+)$/.exec(t)?.[1]}function Ri(t){const{busy:s,mode:n,commands:a,connected:l,onSubmit:r,onInterrupt:o,onShield:c,onCycleMode:d,draft:m,onDraftApplied:p,mention:v,onMentionApplied:x,idlePlaceholder:j,busyPlaceholder:N,controlsLead:M,controlsPrefix:y,controlsSuffix:g,slashChip:O,onSideAsk:$,onBufferChange:k,onImagesChange:G,imageSeed:T,onImageSeedApplied:V,onFilesChange:q,fileSeed:X,onFileSeedApplied:W,modelLabel:_,modelProvider:z,modelChoices:R,modelRecent:P,onPickModel:A,onPersistModelDefault:H,effort:J,efforts:se,onPickEffort:he,effortProviderLabel:le,onPersistEffortDefault:K}=t,[D,f]=i.useState(""),[S,w]=i.useState(Xh),[b,E]=i.useState(ft),[U,ee]=i.useState(!1),oe=i.useRef(null),Ne=i.useRef({composing:!1,endedAt:0}),ke=i.useId(),[me,$e]=i.useState([]),ge=i.useRef([]),Me=L=>{ge.current=L,$e(L),G?.(L)},[Ge,ze]=i.useState(null),Le=i.useRef(null),[pe,Be]=i.useState([]),Te=i.useRef([]),Pe=L=>{Te.current=L,Be(L),q?.(L)},Ve=i.useRef(null),[Re,F]=i.useState(!1),Y=i.useRef(!1),Q=i.useRef(0),[ie,je]=i.useState(!1);i.useEffect(()=>{T!==void 0&&(Me(T.drafts),V?.())},[T?.nonce]),i.useEffect(()=>{X!==void 0&&(Pe(X.drafts),W?.())},[X?.nonce]);const ne=L=>{if(Y.current)return;const te=L===null?[]:[...L];if(te.length===0)return;const{accepted:de,notice:xe}=mi(te,Te.current);de.length>0&&Pe([...Te.current,...de.map(ue=>ra(ue))]),ze(xe)},re=L=>{const te=Te.current;te[L]!==void 0&&(Pe(te.filter((de,xe)=>xe!==L)),ze(null))},fe=L=>{if(Y.current)return;const te=L===null?[]:[...L];if(te.length===0)return;const{accepted:de,notice:xe}=di(te,ge.current);de.length>0&&Me([...ge.current,...de.map(ue=>ui(ue))]),ze(xe)},be=L=>{const te=ge.current,de=te[L];de!==void 0&&(Ps(de),Me(te.filter((xe,ue)=>ue!==L)),ze(null))};i.useEffect(()=>()=>{if(G===void 0)for(const L of ge.current)Ps(L)},[]);const Ye=L=>{f(L),k?.(L)};i.useEffect(()=>{m!==void 0&&(Ye(m.text),E(ft),oe.current?.focus(),p?.())},[m?.nonce,m?.text]),i.useEffect(()=>{if(v===void 0)return;const L=D===""||/\s$/.test(D)?"":" ";Ye(`${D}${L}@${v.path}`),E(ft),oe.current?.focus(),x?.()},[v?.nonce,v?.path]);const mt=(L,te)=>{Ye(L);const de=te??L.length;requestAnimationFrame(()=>{oe.current?.setSelectionRange(de,de)})},Dt=Zh(D,oe.current?.selectionStart??D.length),Ke=du(Dt),_e=Ke===void 0?[]:uu(a,Ke),Qe=b.token===Ke?Math.min(b.selected,Math.max(0,_e.length-1)):0,Ot=Ke!==void 0&&_e.length>0&&b.dismissed!==Ke,ls=fm(Dt),It=L=>{const{row:te}=Hn(D,oe.current?.selectionStart??D.length),de=D.split(`
315
+ `);de[te]=hu(de[te]??"",L);const xe=de.join(`
316
+ `);mt(xe),E({token:L,selected:0,dismissed:null})},nt=L=>{if(!l||Y.current)return;const te=L??D;if(te.trim()===""&&ge.current.length===0&&Te.current.length===0)return;if(U&&$!==void 0&&te.trim()!==""){Ye(""),E(ft),$(te.trim()),w(Sn(S,te)),ee(!1);return}if(U&&ee(!1),ge.current.length===0&&Te.current.length===0){Ye(""),E(ft),te.trim()!==""&&(r(te),w(Sn(S,te)));return}const de=ge.current,xe=Te.current;Y.current=!0,F(!0),(async()=>{let ue=!1;try{const Ue=[];for(const Ce of de)Ue.push({data:await Kl(Ce.file),mediaType:Ce.mediaType});const Ie=[];for(const Ce of xe)Ie.push({data:await Kl(Ce.file),name:Ce.name});const yt=Ie.length>0?[Ie]:[];ue=await r(te,Ue.length>0?Ue:void 0,...yt)!==!1}catch{ue=!1}if(Y.current=!1,F(!1),!!ue){for(const Ue of de)Ps(Ue);Me([]),Pe([]),ze(null),Ye(""),E(ft),te.trim()!==""&&w(Sn(S,te))}})()},rs=()=>{oe.current?.focus(),!D.startsWith("/")&&(mt(`/${D}`,1),E(ft))},Lt=pe.length>0&&D.trim()===""?rm(pe.map(L=>L.name)):[],is=L=>{Ye(L),nt(L)},Qs=L=>{if(!He(L.nativeEvent,Ne.current,Date.now())){if(Ot){if(L.key==="Tab"&&!L.ctrlKey&&!L.metaKey||L.key==="Enter"&&Ke!==_e[Qe]?.name){L.preventDefault();const te=_e[Qe]??_e[0];te!==void 0&&It(te.name);return}if(L.key==="Escape"){L.preventDefault(),E({token:Ke??"",selected:0,dismissed:Ke});return}if(L.key==="ArrowUp"){L.preventDefault(),E({token:Ke??"",selected:Math.max(0,Qe-1),dismissed:null});return}if(L.key==="ArrowDown"){L.preventDefault(),E({token:Ke??"",selected:Math.min(_e.length-1,Qe+1),dismissed:null});return}}if(L.key==="Tab"&&L.shiftKey&&!L.ctrlKey&&!L.metaKey){L.preventDefault(),d();return}if(L.key==="Enter"&&!L.shiftKey&&!L.metaKey&&!L.ctrlKey&&!L.altKey){L.preventDefault();const te=em(D,oe.current?.selectionStart??D.length);te.kind==="submit"?nt():mt(te.value,te.caret);return}if(L.key==="ArrowUp"||L.key==="ArrowDown"){const te=Hn(D,oe.current?.selectionStart??D.length),de=D.split(`
317
+ `);if(L.key==="ArrowUp"&&te.row===0){const xe=Jh(S,D);xe!==null&&(L.preventDefault(),w(xe),mt(Gl(xe)));return}if(L.key==="ArrowDown"&&te.row===de.length-1){const xe=Qh(S);xe!==null&&(L.preventDefault(),w(xe),mt(Gl(xe)))}return}if(L.key==="Escape"&&s){if(document.querySelector(".menu, .ctx-backdrop, .search-scrim, .ws-backdrop, .modal, .scrim")!==null)return;L.preventDefault(),o()}}};i.useEffect(()=>{oe.current?.focus()},[]);const Pt=L=>{L.preventDefault(),Q.current+=1,je(!0)},Zs=L=>{L.preventDefault(),je(!0)},os=()=>{Q.current=Math.max(0,Q.current-1),Q.current===0&&je(!1)},at=L=>{L.preventDefault(),Q.current=0,je(!1);const te=[...L.dataTransfer?.files??[]],de=te.filter(ue=>ue.type.startsWith("image/")),xe=te.filter(ue=>!ue.type.startsWith("image/"));de.length>0&&fe(de),xe.length>0&&ne(xe)};return e.jsxs("div",{className:"inputarea",children:[Ot?e.jsx("div",{className:"slashmenu",role:"listbox","aria-activedescendant":_e[Qe]!==void 0?`${ke}-opt-${_e[Qe].name}`:void 0,children:(()=>{const{start:L,rows:te}=fu(_e.length,Qe),de=_e.slice(L,L+te),xe=_e.length-(L+te);return e.jsxs(e.Fragment,{children:[de.map((ue,Ue)=>{const Ie=L+Ue===Qe;return e.jsxs("div",{id:`${ke}-opt-${ue.name}`,className:`row${Ie?" sel":""}`,role:"option","aria-selected":Ie,onMouseDown:yt=>{yt.preventDefault(),It(ue.name)},children:[`${Ie?"›":" "}/${ue.name}`,ue.args?e.jsx("span",{className:"args",children:`${ue.name.endsWith(":")?"":" "}${ue.isSensitive===!0?"<redacted>":ue.args}`}):null,ue.description?e.jsx("span",{className:"desc",children:` ${ue.description}`}):null]},ue.name)}),xe>0?e.jsx("div",{className:"more",children:` … 还有 ${xe} 项(↓ 滚动)`}):null]})})()}):null,e.jsxs("div",{className:`composer${ie?" dragover":""}`,onDragEnter:Pt,onDragOver:Zs,onDragLeave:os,onDrop:at,children:[me.length>0?e.jsx("div",{className:"img-rail","data-count":me.length,children:me.map((L,te)=>e.jsxs("div",{className:"img-thumb","data-name":L.name,children:[e.jsx("img",{src:L.url,alt:L.name}),e.jsx("button",{type:"button",className:"rm","aria-label":Re?"提交中,暂不能移除":`移除 ${L.name}`,title:Re?"提交中,暂不能移除":`移除 ${L.name}`,disabled:Re,onClick:()=>be(te),children:e.jsx(ts,{size:11})})]},L.id))}):null,pe.length>0?e.jsx("div",{className:"file-rail","data-count":pe.length,children:pe.map((L,te)=>e.jsxs("div",{className:"file-card","data-name":L.name,children:[e.jsx("span",{className:"glyph","aria-hidden":!0,children:e.jsx(ae,{name:"file-text",size:13})}),e.jsxs("span",{className:"meta",children:[e.jsx("span",{className:"name",children:L.name}),e.jsx("span",{className:"size",children:hm(L.byteLength)})]}),e.jsx("button",{type:"button",className:"rm","aria-label":Re?"提交中,暂不能移除":`移除 ${L.name}`,title:Re?"提交中,暂不能移除":`移除 ${L.name}`,disabled:Re,onClick:()=>re(te),children:e.jsx(ts,{size:11})})]},L.id))}):null,Lt.length>0?e.jsx("div",{className:"file-rail intent-row","data-count":Lt.length,children:Lt.map(L=>e.jsx("button",{type:"button",className:"chip intent",disabled:!l||Re,onClick:()=>is(L.text),children:L.label},L.label))}):null,e.jsx("textarea",{ref:oe,className:"wudao-input composer-ta",value:D,rows:pm(D,mm(oe.current)),placeholder:s?N??"它在忙,可继续打字插话(发送「排队」)":j??"吩咐悟道——/ 选命令,@ 引用文件",spellCheck:!1,onChange:L=>Ye(L.target.value),onCompositionStart:()=>{Ne.current=qe(Ne.current)},onCompositionEnd:()=>{Ne.current=Fe(Ne.current,Date.now())},onKeyDown:Qs}),e.jsxs("div",{className:"composer-tools",children:[M,e.jsx("input",{ref:Le,type:"file",accept:"image/*",multiple:!0,hidden:!0,onChange:L=>{fe(L.target.files),L.target.value=""}}),e.jsx("input",{ref:Ve,type:"file","data-lane":"file",multiple:!0,hidden:!0,onChange:L=>{ne(L.target.files),L.target.value=""}}),e.jsxs("button",{type:"button",className:"chip attach",onClick:()=>Le.current?.click(),disabled:!l,title:"添加图片(最多 9 张,总量 ≤ 20MiB;也可直接拖入)","aria-label":"添加图片",children:[e.jsx(nd,{size:14}),me.length>0?e.jsx("span",{className:"n",children:me.length}):null]}),e.jsxs("button",{type:"button",className:"chip attachfile",onClick:()=>Ve.current?.click(),disabled:!l,title:"添加文件(最多 9 个,总量 ≤ 50MiB;也可直接拖入)","aria-label":"添加文件",children:[e.jsx(ta,{size:14}),pe.length>0?e.jsx("span",{className:"n",children:pe.length}):null]}),y,O===!0?e.jsx("button",{type:"button",className:"chip slash",onClick:rs,title:"命令菜单",children:"/"}):null,$!==void 0?e.jsx("button",{type:"button",className:`chip sideqa${U?" on":""}`,onClick:()=>{ee(L=>!L),oe.current?.focus()},"aria-pressed":U,title:"顺便问:不打断主任务,旁路问一句(发送后自动切回主线)",children:"顺便问"}):null,e.jsx(oa,{value:$i(n),onChange:c,disabled:!l}),_!=null&&R!=null?e.jsx(om,{label:_,provider:z,choices:R,recent:P??void 0,disabled:!l,onPick:(L,te)=>A?.(L,te),onPersistDefault:H}):null,se!=null&&se.length>0?e.jsx(cm,{efforts:se,current:J??null,disabled:!l,onPick:L=>he?.(L),...le!==void 0&&K!==void 0?{providerLabel:le,onPersistDefault:K}:{}}):null,s?e.jsxs("button",{type:"button",className:"chip interrupt",onClick:o,disabled:!l,children:[e.jsx(id,{size:12}),"停止 (Esc)"]}):null,e.jsxs("div",{className:"composer-right",children:[g,e.jsx("button",{type:"button",className:`send${D.trim()===""&&me.length===0?" off":""}`,onClick:()=>nt(),disabled:!l||Re||D.trim()===""&&me.length===0,"aria-label":"发送",children:e.jsx(rd,{size:14})})]})]})]}),ls!==void 0?e.jsx("div",{className:"hint",children:`@${ls} → 发送时会附上(相对工作区根)`}):null,Ge!==null?e.jsx("span",{className:"hint img-notice",children:Ge}):null,l?null:e.jsx("span",{className:"hint",children:"离线——正在等待服务恢复;草稿已保留"})]})}function xm(t){return`(旁路问答转入主线)
318
+ 问:${t.question}
319
+ 答:${t.answer}`}function Mi({qas:t,onPromote:s}){return t.length===0?null:e.jsx("div",{className:"sideqa-lane","data-sideqa-lane":!0,children:t.map(n=>e.jsxs("div",{className:"sideqa","data-sideqa":!0,children:[e.jsx("div",{className:"sideqa-tag",children:"旁路问答"}),e.jsx("div",{className:"sideqa-q",children:n.question}),e.jsx("div",{className:"sideqa-a",children:n.answer}),e.jsxs("div",{className:"sideqa-foot",children:[e.jsxs("span",{className:"sideqa-rounds",children:[n.rounds," 轮"]}),e.jsx("button",{type:"button",className:"sideqa-promote",onClick:()=>{s(n)},children:"转入主线"})]})]},n.id))})}function vm(t){const s=[],n=new Map;for(const a of t){const l=`${a.codepoint} ${a.nameZh}`;n.has(l)||s.push(l),n.set(l,(n.get(l)??0)+1)}return s.map(a=>[a,n.get(a)??0])}function Ti({spoof:t}){return t===void 0||t.text.length===0&&t.urls.length===0?null:e.jsxs("div",{className:"spoof",children:[e.jsxs("div",{className:"spoof-title",children:[e.jsx(ae,{name:"triangle-alert",size:12})," 视觉欺骗检查(仅显形,不影响按钮与按键)"]}),t.text.map(s=>e.jsxs("div",{className:"spoof-row",children:[e.jsx("span",{className:"spoof-key",children:s.key}),vm(s.issues).map(([n,a])=>e.jsx("span",{className:"spoof-badge",children:a>1?`${n}×${a}`:n},n)),s.more!==void 0&&s.more>0?e.jsx("span",{className:"spoof-badge spoof-more",children:`另 ${s.more} 处`}):null]},`t:${s.key}`)),t.urls.map(s=>e.jsxs("div",{className:"spoof-url",children:[e.jsx("span",{className:"spoof-key",children:s.key})," 真实指向:",e.jsx("code",{className:"spoof-target",children:s.normalizedUrl}),s.warnings.map((n,a)=>e.jsx("div",{className:"spoof-note",children:n},a))]},`u:${s.key}:${s.original}`))]})}function Ai(t){for(const s of["command","url","path","pattern","query"]){const n=t[s];if(typeof n=="string"&&n.trim()!=="")return Yl(n)}try{return Yl(JSON.stringify(t)??"")}catch{return""}}function Yl(t){const s=t.replace(/\s+/g," ").trim();return s.length>300?`${s.slice(0,300)}…`:s}function gm({ask:t,busy:s=!1,onChoose:n}){const a=c=>{s||n(c)},l=i.useRef(null);i.useEffect(()=>{l.current?.focus()},[]);const r=c=>{s||(c.key==="y"||c.key==="Y"?(c.preventDefault(),a({allow:!0})):c.key==="n"||c.key==="N"?(c.preventDefault(),a({allow:!1})):(c.key==="Escape"||c.key==="Enter")&&(c.preventDefault(),a({allow:!1})))},o=Ai(t.input);return e.jsxs("div",{className:"approval",role:"alertdialog","aria-label":"权限请求",ref:l,tabIndex:-1,onKeyDown:r,children:[e.jsxs("div",{className:"strip",children:[e.jsx(ae,{name:"hourglass",size:13})," ",`等待你的批准 —— 模型请求使用 ${t.toolName}`]}),e.jsxs("div",{className:"ap-scroll",children:[e.jsx("div",{className:"why",children:t.summary!==""?t.summary:`请求执行 ${t.toolName}`}),t.warning!==void 0?e.jsx("div",{className:"warn",children:t.warning}):null,t.sidecar!==void 0?e.jsx("div",{className:"sidecar",children:`风险提示:${t.sidecar}`}):null,t.settingsFile!==void 0?e.jsx("div",{className:"sidecar",children:`涉及运行时策略文件:${t.settingsFile}`}):null,o!==""?e.jsx("code",{className:"cmd",children:o}):null,e.jsx(Ti,{spoof:t.spoof})]}),e.jsxs("div",{className:"btns",children:[e.jsx("button",{type:"button",className:"deny",disabled:s,onClick:()=>a({allow:!1}),children:s?"发送中…":"拒绝"}),e.jsx("button",{type:"button",className:"allow",disabled:s,onClick:()=>a({allow:!0}),children:s?"发送中…":"允许一次"})]})]})}function jm({ask:t,onChoose:s}){const[n,a]=i.useState(null),l=i.useRef(!1),r=i.useRef(null),o=i.useRef(null),c=Ai(t.input),d=p=>{l.current||(l.current=!0,s(p))};st(),i.useEffect(()=>{n!==null?r.current?.focus():o.current?.focus()},[n]);const m=p=>{n===null&&(p.key==="y"||p.key==="Y"?(p.preventDefault(),d({allow:!0})):(p.key==="a"||p.key==="A")&&t.settingsFile===void 0?(p.preventDefault(),d({allow:!0,scope:"session"})):(p.key==="p"||p.key==="P")&&t.settingsFile===void 0?(p.preventDefault(),d({allow:!0,scope:"always"})):p.key==="n"||p.key==="N"?(p.preventDefault(),a("")):(p.key==="Escape"||p.key==="Enter")&&(p.preventDefault(),d({allow:!1})))};return e.jsxs("div",{className:"permission-card",role:"dialog","aria-label":"permission ask",ref:o,tabIndex:-1,onKeyDown:m,children:[e.jsxs("div",{className:"strip",children:[e.jsx(ae,{name:"hourglass",size:13})," 等待你的批准"]}),n===null?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"pc-scroll",children:[t.warning!==void 0?e.jsx("div",{className:"warn",children:t.warning}):null,t.sidecar!==void 0?e.jsxs("div",{className:"warn",children:[e.jsx(ae,{name:"key",size:12})," ",`(sidecar: ${t.sidecar})`]}):null,e.jsx("h3",{children:t.settingsFile!==void 0?e.jsxs(e.Fragment,{children:[e.jsx(ae,{name:"key",size:14})," 允许 ",t.toolName,":",e.jsxs("span",{className:"warn",children:["策略文件 ",t.settingsFile]}),t.summary&&t.summary!==t.settingsFile?` (${t.summary})`:"","?"]}):e.jsxs(e.Fragment,{children:[e.jsx(ae,{name:"key",size:14})," 允许 ",t.toolName,t.summary?`:${t.summary}`:"","?"]})}),e.jsx("div",{className:"muted",children:t.settingsFile!==void 0?"y 仅本次 · n 拒绝(可填理由) · 策略文件无会话/持久选项":"y 仅本次 · a 本会话 · p 总是(写入 .wudao/settings.json) · n 拒绝(可填理由)"}),c!==""?e.jsx("code",{className:"cmd",children:c}):null,e.jsx(Ti,{spoof:t.spoof})]}),e.jsxs("div",{className:"btnrow",children:[e.jsx("button",{type:"button",className:"wudao primary",onClick:()=>d({allow:!0}),children:"y — 仅本次"}),t.settingsFile===void 0?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"wudao",onClick:()=>d({allow:!0,scope:"session"}),children:"a — 本会话"}),e.jsx("button",{type:"button",className:"wudao",onClick:()=>d({allow:!0,scope:"always"}),children:"p — 总是"})]}):null,e.jsx("button",{type:"button",className:"wudao danger",onClick:()=>a(""),children:"n — 拒绝…"})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"pc-scroll",children:e.jsxs("h3",{children:[e.jsx(ae,{name:"key",size:14})," ",`拒绝 ${t.toolName} — 理由(可选)`]})}),e.jsx("input",{ref:r,className:"wudao-input",style:{width:"100%"},value:n,placeholder:"理由(会回传给模型)",onChange:p=>a(p.target.value),onKeyDown:p=>{if(p.key==="Enter"){p.preventDefault();const v=n.trim();d(v===""?{allow:!1}:{allow:!1,reason:v})}else p.key==="Escape"&&(p.preventDefault(),d({allow:!1}))}}),e.jsxs("div",{className:"btnrow",children:[e.jsxs("button",{type:"button",className:"wudao danger",onClick:()=>{const p=n.trim();d(p===""?{allow:!1}:{allow:!1,reason:p})},children:["拒绝 ",e.jsx(ae,{name:"corner-down-left",size:11})]}),e.jsx("button",{type:"button",className:"wudao",onClick:()=>d({allow:!1}),children:"不带理由拒绝 (Esc)"})]})]})]})}function Di({question:t,options:s,onAnswer:n,onDismiss:a,inline:l=!1}){const[r,o]=i.useState(""),c=s!==void 0&&s.length>0;st();const d=i.useRef(null),m=i.useRef(null),p=i.useRef({composing:!1,endedAt:0});i.useEffect(()=>{c?m.current?.focus():d.current?.focus()},[]);const v=e.jsxs("div",{className:l?"ask-card":"modal-card pop-in",role:"dialog","aria-label":"agent question",ref:m,tabIndex:-1,onCompositionStart:()=>{p.current=qe(p.current)},onCompositionEnd:()=>{p.current=Fe(p.current,Date.now())},onKeyDown:x=>{He(x.nativeEvent,p.current,Date.now())||x.key==="Escape"&&(x.preventDefault(),a())},children:[e.jsxs("h3",{children:[e.jsx(ae,{name:"circle-help",size:14})," ",t]}),c?e.jsxs("div",{className:"optioncards",onKeyDown:x=>{if(!/^[1-9]$/.test(x.key))return;const j=Number(x.key),N=s?.[j-1];N!==void 0&&(x.preventDefault(),n(N.label))},children:[s?.map((x,j)=>e.jsxs("button",{type:"button",className:"optioncard",onClick:()=>n(x.label),children:[`${j+1}) ${x.label}`,x.description!==void 0&&x.description!==""?e.jsx("span",{className:"desc",children:` — ${x.description}`}):null]},j)),e.jsx("div",{className:"muted",children:`(按 1-${s?.length} 选择 · Esc 取消并让 agent 自行决定)`})]}):e.jsxs(e.Fragment,{children:[e.jsx("input",{ref:d,className:"wudao-input",style:{width:"100%"},value:r,placeholder:"输入回答…",onChange:x=>o(x.target.value),onCompositionStart:()=>{p.current=qe(p.current)},onCompositionEnd:()=>{p.current=Fe(p.current,Date.now())},onKeyDown:x=>{He(x.nativeEvent,p.current,Date.now())||x.key==="Enter"&&(x.preventDefault(),n(r.trim()))}}),e.jsx("div",{className:"muted",children:"(Enter 发送 · Esc 取消并让 agent 自行决定)"})]}),e.jsx("div",{className:"btnrow",children:e.jsx("button",{type:"button",className:"wudao",onClick:a,children:"Esc — 让 agent 自行决定"})})]});return l?v:e.jsx("div",{className:"scrim",onClick:x=>{x.target===x.currentTarget&&a()},children:v})}function Jt(t){return t.split("/").filter(s=>s!=="").slice(-1)[0]??t}function Oi({panelRoot:t,agentRoot:s,queued:n,onSwitch:a,onKeep:l}){const r=Jt(t),o=s!==""?Jt(s):null;return e.jsxs("div",{className:"approval agent-root",role:"alertdialog","aria-label":"agent 工作目录确认",children:[e.jsx("div",{className:"strip",children:n?"已排队 — 将在当前任务结束后切换":"文件面板已切换 · agent 工作目录待确认"}),e.jsx("div",{className:"why",children:n?`当前任务保持原工作目录;任务结束后 agent 工作目录将切换 → ${r} (${t})`:`文件面板已切换到 ${r}。agent 的工作目录仍为 ${o??"原目录"}。`}),n?null:e.jsxs("div",{className:"btns",children:[e.jsx("button",{type:"button",className:"deny",onClick:l,children:"保持现状"}),e.jsx("button",{type:"button",className:"allow",onClick:a,children:"切换 agent 目录"})]})]})}function bm(t){const s=new Date(t);return Number.isNaN(s.getTime())?"":s.toISOString().slice(0,16).replace("T"," ")}function ym({rows:t,onPick:s,onCancel:n,intent:a="resume"}){const l=i.useRef(null);return st(),i.useEffect(()=>{l.current?.focus()},[]),e.jsx("div",{className:"scrim",onClick:r=>{r.target===r.currentTarget&&n()},children:e.jsxs("div",{className:"modal-card pop-in",role:"dialog","aria-label":"恢复会话",ref:l,tabIndex:-1,onKeyDown:r=>{if(r.key==="Escape"){r.preventDefault(),n();return}if(!/^[1-9]$/.test(r.key))return;const o=t[Number(r.key)-1];o!==void 0&&(r.preventDefault(),s(o.id))},children:[e.jsx("h3",{children:a==="followup"?"选择要追问的会话":"选择要恢复的会话"}),e.jsx("div",{className:"muted",children:a==="followup"?"选中后开一份副本继续问,原对话保持不变":"仅列出记录在当前工作区的会话"}),e.jsx("div",{className:"picker",children:t.map((r,o)=>e.jsxs("button",{type:"button",className:"pickrow",onClick:()=>s(r.id),children:[e.jsx("span",{className:"rank",children:`${o+1})`}),e.jsx("span",{children:r.id.slice(0,8)}),e.jsx("span",{className:"meta",children:bm(r.mtime)}),e.jsx("span",{className:"meta",children:`${r.messages} 条消息`}),e.jsx("span",{children:r.name??(r.firstUser!==""?r.firstUser:"暂无会话")})]},r.id))}),e.jsx("div",{className:"btnrow",children:e.jsx("button",{type:"button",className:"wudao",onClick:n,children:"取消 (Esc)"})})]})})}function Nm({onChoose:t}){const s=i.useRef(!1),n=i.useRef(null);st(),i.useEffect(()=>{n.current?.focus()},[]);const a=l=>{s.current||(s.current=!0,t(l))};return e.jsx("div",{className:"scrim",children:e.jsxs("div",{className:"modal-card pop-in",role:"dialog","aria-label":"清空历史",ref:n,tabIndex:-1,onKeyDown:l=>{l.key==="y"||l.key==="Y"?(l.preventDefault(),a(!0)):(l.key==="n"||l.key==="N"||l.key==="Enter"||l.key==="Escape")&&(l.preventDefault(),a(!1))},children:[e.jsxs("h3",{children:[e.jsx(ae,{name:"trash-2",size:14,className:"ic-danger"})," 清空历史 —— 清空当前会话?"]}),e.jsx("div",{className:"muted",children:"(y 清空当前会话并开始新对话 · n 保留 — 已保存的会话仍在磁盘,/resume 可恢复)"}),e.jsxs("div",{className:"btnrow",children:[e.jsx("button",{type:"button",className:"wudao danger",onClick:()=>a(!0),children:"清空"}),e.jsx("button",{type:"button",className:"wudao",onClick:()=>a(!1),children:"保留 (Esc)"})]})]})})}function Ii({plan:t,busy:s,onSubmit:n}){const[a,l]=i.useState(!1),[r,o]=i.useState(""),c=i.useRef(null),d=i.useRef(null),m=i.useRef({composing:!1,endedAt:0}),p=i.useRef(!1);return i.useEffect(()=>{a?d.current?.focus():p.current&&c.current?.focus(),p.current=a},[a]),e.jsxs("div",{className:"planboard",children:[e.jsxs("div",{className:"label",children:[e.jsx(ae,{name:"clipboard-list",size:13})," plan — review before execution"]}),e.jsx("div",{className:"body",children:t}),a?e.jsxs("div",{className:"btnrow",children:[e.jsx("input",{ref:d,className:"wudao-input",style:{flex:1},value:r,placeholder:"改 — what to change",onChange:v=>o(v.target.value),onCompositionStart:()=>{m.current=qe(m.current)},onCompositionEnd:()=>{m.current=Fe(m.current,Date.now())},onKeyDown:v=>{He(v.nativeEvent,m.current,Date.now())||(v.key==="Enter"?(v.preventDefault(),n(r.trim()===""?"改":`改 ${r.trim()}`),l(!1),o("")):v.key==="Escape"&&(v.preventDefault(),l(!1)))}}),e.jsx("button",{type:"button",className:"wudao",onClick:()=>{n(r.trim()===""?"改":`改 ${r.trim()}`),l(!1),o("")},children:"revise ↵"})]}):e.jsxs("div",{className:"btnrow",children:[e.jsx("button",{type:"button",className:"wudao primary",disabled:s,onClick:()=>n("ok"),children:"ok — execute"}),e.jsx("button",{type:"button",className:"wudao",disabled:s,ref:c,onClick:()=>l(!0),children:"改 — revise"})]})]})}const Xl=t=>t instanceof Error?t.message:String(t);function km({client:t,notify:s,onAccentPicked:n}){const[a,l]=i.useState(null),r=Bs(),o=Fn(),c=m=>{const p=Bs();vt(m),l("set:ui.theme"),t.settingsSet("ui.theme",m).then(()=>s(`主题 → ${m==="dark"?"暗色":"浅色"} —— 已保存`)).catch(v=>{vt(p),s(`⚠️ 主题未保存:${Xl(v)}`)}).finally(()=>l(null))},d=m=>{const p=Fn();Zt(m),n?.(),l("set:ui.accent"),t.settingsSet("ui.accent",m).then(()=>s(`主色 → ${m==="black"?"墨黑":m==="blue"?"蓝":"绿"} —— 已保存`)).catch(v=>{Zt(p),s(`⚠️ 主色未保存:${Xl(v)}`)}).finally(()=>l(null))};return e.jsx(e.Fragment,{children:e.jsxs("div",{className:"settings-section set-sec",children:[e.jsx("h3",{className:"section-title set-title",children:"外观"}),e.jsxs("div",{className:"setrow",children:[e.jsxs("span",{className:"setrow-main",children:[e.jsx("span",{className:"setrow-title",children:"主题"}),e.jsx("span",{className:"setrow-note",children:"立即生效,并写入全局设置 (~/.wudao/settings.json)"})]}),e.jsx("div",{className:"segctl",role:"radiogroup","aria-label":"主题",children:["dark","light"].map(m=>e.jsx("button",{type:"button",role:"radio","aria-checked":r===m,"data-appearance-theme":m,className:`segctl-opt${r===m?" on":""}`,disabled:a==="set:ui.theme",onClick:()=>c(m),children:m==="dark"?"暗色":"浅色"},m))})]}),e.jsxs("div",{className:"setrow",children:[e.jsxs("span",{className:"setrow-main",children:[e.jsx("span",{className:"setrow-title",children:"主色"}),e.jsx("span",{className:"setrow-note",children:"按钮与选中态的强调色"})]}),e.jsx("div",{className:"segctl",role:"radiogroup","aria-label":"主色",children:["black","blue","green"].map(m=>e.jsxs("button",{type:"button",role:"radio","aria-checked":o===m,"data-appearance-accent":m,"data-swatch":m,className:`segctl-opt${o===m?" on":""}`,disabled:a==="set:ui.accent",onClick:()=>d(m),children:[e.jsx("span",{className:"segctl-dot","aria-hidden":!0}),m==="black"?"墨黑":m==="blue"?"蓝":"绿"]},m))})]})]})})}const qn=t=>t instanceof Error?t.message:String(t),wm=t=>{const s=qn(t);return s.includes("unknown op: mcp")||s.includes("mcp ops not supported")},Sm=[{tier:"user",title:"用户级 —— 本机所有项目",file:"user",hint:"所有会话可用;Claude Code / wudao 两种格式都行(mcpServers 或 servers)"},{tier:"root",title:"项目根 .mcp.json —— Claude Code 项目文件",file:"root",hint:"Claude Code 的项目级配置,wudao 直接读取,零拷贝迁移"},{tier:"project",title:"项目级 .wudao/mcp.json —— 本工作区",file:"project",hint:"仅本项目;同名服务器整体替换上面两层(三层中优先级最高)"}];function Cm(t){return t.connected?`已连接 · ${t.tools} 个工具`:t.failure!==void 0?`连接失败 · ${t.failure.split(`
320
+ `)[0]??t.failure}`:"未连接(本次会话尚未启动)"}function Em({client:t}){const[s,n]=i.useState(!1),[a,l]=i.useState(null),[r,o]=i.useState(null),[c,d]=i.useState(!1),m=i.useCallback(async()=>{o(await t.mcpList()),l(null)},[t]);i.useEffect(()=>{let x=!1;return d(!0),m().catch(j=>{x||(wm(j)?n(!0):l(qn(j)))}).finally(()=>{x||d(!1)}),()=>{x=!0}},[m]);const p=()=>{d(!0),m().catch(x=>l(qn(x))).finally(()=>d(!1))};if(s)return e.jsxs("div",{className:"settings-section",children:[e.jsx("div",{className:"section-title",children:"MCP 服务器"}),e.jsx("div",{className:"hint",children:"升级 wudao 后可用"})]});const v=r?.servers??[];return e.jsxs("div",{className:"settings-section","data-testid":"mcp-tab",children:[e.jsx("div",{className:"section-title",children:"MCP 服务器"}),e.jsx("div",{className:"hint",children:"已配置的 MCP 服务器分三层生效:用户级 → 项目根 .mcp.json → 项目级(同名后者整体替换前者)。配置文件支持 Claude Code 的 mcpServers 格式,可直接粘贴。"}),e.jsxs("div",{className:"keyrow",children:[e.jsx("button",{type:"button",className:"wudao",disabled:c,onClick:p,"data-testid":"mcp-refresh",children:c?"刷新中…":"刷新"}),e.jsx("span",{className:"meta",children:`${v.length} 个服务器`})]}),a!==null?e.jsx("div",{className:"entry-error",children:`无法读取 MCP 配置:${a}`}):null,r!==null&&r.warnings.length>0?r.warnings.map(x=>e.jsxs("div",{className:"entry-error",children:[e.jsx(ae,{name:"triangle-alert",size:12})," ",x]},x)):null,r!==null&&v.length===0&&a===null?e.jsx("div",{className:"hint",children:"尚未配置任何 MCP 服务器——把配置写入下面任一文件即可(保存后新会话生效)"}):null,Sm.map(x=>{const j=v.filter(M=>M.tier===x.tier),N=r?.files[x.file];return e.jsxs("div",{className:"installed-group","data-mcp-tier":x.tier,children:[e.jsxs("div",{className:"group-title",children:[x.title,e.jsx("span",{className:"meta",children:N!==void 0?`(${N})`:""})]}),e.jsx("div",{className:"hint",children:x.hint}),j.length===0?e.jsx("div",{className:"muted",children:"(无)"}):j.map(M=>e.jsxs("div",{className:"installed-row","data-mcp-server":M.name,children:[e.jsx("span",{className:"plugin-name",children:M.name}),e.jsx("span",{className:"meta",children:M.transport==="http"?"http":"stdio"}),e.jsx("span",{className:"plugin-desc",children:M.command}),e.jsx("span",{className:"meta","data-mcp-status":M.name,children:Cm(M)}),M.replaces.length>0?e.jsx("span",{className:"meta",children:`替换了${M.replaces.map(y=>y==="user"?"用户级":"项目根").join("、")}的同名配置`}):null]},M.name))]},x.tier)}),e.jsx("div",{className:"hint",children:"提示:MCP 工具每次调用都会先征求确认(权限层设计);会话里输入 /mcp 可随时查看连接状态。"})]})}const $m=t=>t instanceof Error?t.message:String(t);function Rm({client:t,notify:s,status:n}){const[a,l]=i.useState("workspace");i.useEffect(()=>{let o=!0;return t.settingsStatus().then(c=>{o&&c.settings.permissionsDefaultMode&&l(c.settings.permissionsDefaultMode)}).catch(()=>{}),()=>{o=!1}},[t]);const r=o=>{t.settingsSet("permissions.defaultMode",o).then(()=>{l(o),s(`新会话默认权限档 → ${o}(已持久化;本会话仍为 ${_n(n?.mode??"workspace")})`)}).catch(c=>s(`⚠️ 设置默认权限档失败:${$m(c)}`))};return e.jsxs("div",{className:"settings-section set-sec",children:[e.jsx("h3",{className:"section-title set-title",children:"权限档(新会话默认)"}),e.jsx(oa,{value:$i(a),onChange:r,direction:"down"}),e.jsxs("div",{className:"hint",children:["新会话以此档起步(CLI 旗标优先);当前会话档 = ",_n(n?.mode??"workspace"),",由输入框旁的档位 chip / shift+tab 实时切换"]})]})}const _s=t=>t instanceof Error?t.message:String(t),Ht=t=>t.startsWith("⚠️")?t:`⚠️ ${t}`,Mm=t=>{const s=_s(t);return s.includes("unknown op: plugin")||s.includes("plugin ops not supported")},qt=t=>t===null?"—":`技能 ${t.skills} · 命令 ${t.commands} · Agents ${t.agents} · 钩子 ${t.hooks} · MCP ${t.mcp}`,Gt=t=>t===void 0?"":`;热重扫:技能 ${t.skills} · 插件 ${t.plugins} · 钩子 ${t.hooks}`,Tm=[{scope:"user",title:"用户(user)——本机所有会话"},{scope:"project",title:"项目(project)——当前工作区"},{scope:"adhoc",title:"本会话挂载(adhoc)——随启动参数"}];function Am({client:t,settings:s,notify:n,refresh:a}){const[l,r]=i.useState(!1),[o,c]=i.useState(null),[d,m]=i.useState(null),[p,v]=i.useState(null),[x,j]=i.useState(null),[N,M]=i.useState(""),[y,g]=i.useState("user"),[O,$]=i.useState(null),k=O!==null,[G,T]=i.useState(!1),V=S=>{T(!0),t.settingsSet("docSuite.enabled",S).then(()=>{n(`文档三件套已${S?"开启":"关闭"} —— 下会话生效`),a()}).catch(w=>n(`⚠️ ${_s(w)}`)).finally(()=>T(!1))},q=i.useCallback(async()=>{const[S,w]=await Promise.all([t.pluginList(),t.pluginMarketList()]);v(S.installed),m(w.marketplaces),j(b=>{const E=w.marketplaces.map(U=>U.name);return b!==null&&E.includes(b)?b:E[0]??null}),c(null)},[t]);i.useEffect(()=>{let S=!1;return $("load"),q().catch(w=>{S||(Mm(w)?r(!0):c(_s(w)))}).finally(()=>{S||$(null)}),()=>{S=!0}},[q]);const X=(S,w)=>{$(S),w().catch(b=>n(Ht(_s(b)))).finally(()=>$(null))},W=()=>{const S=N.trim();S!==""&&X("add",async()=>{const w=await t.pluginMarketAdd(S);M(""),n(`已添加市场 ${w.name}(${w.source})`),await q()})},[_,z]=i.useState(""),[R,P]=i.useState(null),A=()=>{const S=_.trim();S!==""&&X("spec-preview",async()=>{const w=await t.pluginInstallSpec(S,!0);P(w),n(w.preview?`预览 ${S}:${w.name??"未知名称"}(${qt(w.detail)})`:"服务器未走预览路径——未安装")})},H=()=>{const S=_.trim();S!==""&&X("spec-install",async()=>{const w=await t.pluginInstallSpec(S,!1);P(null),z(""),n(`已安装 ${w.name??S} → ${w.dir??""}(${qt(w.detail)})${Gt(w.rescan)}`);for(const b of w.warnings)n(Ht(b));await q()})},J=S=>{X(`update:${S}`,async()=>{const w=await t.pluginMarketUpdate(S);n(`市场 ${w.name} 已更新(${w.source})`),await q()})},se=S=>{X(`remove:${S}`,async()=>{const w=await t.pluginMarketRemove(S);n(`已移除市场 ${S}${w.removedPlugins.length>0?`——连带卸载:${w.removedPlugins.join("、")}`:""}${Gt(w.rescan)}`);for(const b of w.warnings)n(Ht(b));await q()})},he=(S,w)=>{X(`install:${S}@${w}`,async()=>{const b=await t.pluginInstall(S,w,y);n(`已安装 ${S}@${w} → ${b.dir}(${qt(b.detail)})${Gt(b.rescan)}`);for(const E of b.warnings)n(Ht(E));await q()})},le=S=>{const w=S.id;X(`toggle:${w}`,async()=>{const b=S.enabled?await t.pluginDisable(w):await t.pluginEnable(w);n(`${b.enabled?"已启用":"已停用"} ${b.id}${Gt(b.rescan)}`),await q()})},K=S=>{X(`uninstall:${S}`,async()=>{const w=await t.pluginUninstall(S);n(`已卸载 ${w.id}${Gt(w.rescan)}`);for(const b of w.warnings)n(Ht(b));await q()})};if(l)return e.jsxs("div",{className:"settings-section","data-plugin-unsupported":!0,children:[e.jsx("div",{className:"section-title",children:"插件"}),e.jsx("div",{className:"hint",children:"此 wudao 服务器不支持插件管理——升级 wudao 后可用"})]});const D=d??[],f=D.find(S=>S.name===x)??null;return e.jsxs("div",{className:"plugin-tab","data-plugin-tab":!0,children:[e.jsxs("div",{className:"settings-section","data-doc-suite-section":!0,children:[e.jsx("div",{className:"section-title",children:"内置"}),e.jsxs("label",{className:"setrow",children:[e.jsxs("span",{className:"setrow-main",children:[e.jsx("span",{className:"setrow-title",children:"文档三件套"}),e.jsx("span",{className:"setrow-note",children:"用自然语言创建和编辑 Excel、Word、PPT 文件(关闭后新会话生效)"})]}),e.jsx("input",{type:"checkbox",className:"wudao-switch","data-doc-suite-toggle":!0,checked:s?.settings.docSuiteEnabled??!0,disabled:G,onChange:S=>V(S.target.checked)})]})]}),e.jsxs("div",{className:"settings-section","data-plugin-spec-install":!0,children:[e.jsx("div",{className:"section-title",children:"从来源安装"}),e.jsx("div",{className:"hint",children:"直接安装一个插件包:本地目录(./dir)、GitHub 简写(owner/repo)、git URL(#ref 可选)——纯代码包(无可映射的技能/命令)会被拒绝"}),e.jsxs("div",{className:"keyrow",children:[e.jsx("input",{type:"text",className:"wudao-input plugin-spec-input",placeholder:"插件来源(./本地目录、owner/repo 或 git URL)","aria-label":"插件来源",value:_,onChange:S=>{z(S.target.value),P(null)}}),e.jsx("button",{type:"button",className:"wudao",disabled:_.trim()===""||k,onClick:A,children:"预览"})]}),R!==null?e.jsxs("div",{className:"market-row","data-plugin-spec-preview":!0,children:[e.jsxs("span",{className:"market-name",children:[R.name??"未知名称",R.format!==void 0?` · ${R.format==="ccb-family"?"上游包格式":"claude-plugin"}`:""]}),e.jsx("span",{className:"hint",children:`将映射:${qt(R.detail)}`}),e.jsxs("span",{className:"keyrow",children:[e.jsx("button",{type:"button",className:"wudao",disabled:k,onClick:H,children:"安装"}),e.jsx("button",{type:"button",className:"wudao",disabled:k,onClick:()=>P(null),children:"取消"})]})]}):null]}),e.jsxs("div",{className:"settings-section",children:[e.jsx("div",{className:"section-title",children:"市场"}),e.jsx("div",{className:"hint",children:"添加 CC 生态市场源:owner/repo · git URL(#ref)· 本地目录 · marketplace.json 路径——添加即克隆/复制到本机,不执行任何代码"}),e.jsxs("div",{className:"keyrow",children:[e.jsx("input",{type:"text",className:"wudao-input market-source-input",placeholder:"市场源(owner/repo、git URL、本地目录或 marketplace.json 路径)","aria-label":"市场源",value:N,onChange:S=>M(S.target.value)}),e.jsx("button",{type:"button",className:"wudao",disabled:N.trim()===""||k,onClick:W,children:"添加市场"})]}),O!==null?e.jsx("div",{className:"plugin-pending",children:"处理中…"}):null,d===null&&o===null?e.jsx("div",{className:"muted",children:"读取中…"}):null,o!==null?e.jsx("div",{className:"entry-error",children:`无法读取插件列表:${o}`}):null,d!==null&&D.length===0?e.jsx("div",{className:"hint",children:"尚未添加市场——在上方粘贴源添加(如 superpowers-market 或本地目录)"}):null,e.jsx("div",{className:"market-list",children:D.map(S=>e.jsxs("div",{className:"market-row","data-market":S.name,children:[e.jsxs("button",{type:"button",className:"wudao market-name","data-market-select":S.name,"aria-pressed":x===S.name,disabled:k,title:"在下方发现列表查看该市场的插件",onClick:()=>j(S.name),children:[S.name,x===S.name?" ←":""]}),e.jsx("span",{className:"meta",children:`${S.plugins.length} 个插件`}),S.description!==void 0?e.jsx("span",{className:"meta",children:S.description}):null,e.jsx("span",{className:"market-source",children:S.source}),e.jsx("button",{type:"button",className:"wudao",disabled:k,onClick:()=>J(S.name),children:"更新"}),e.jsx("button",{type:"button",className:"wudao danger",disabled:k,onClick:()=>se(S.name),children:"移除"})]},S.name))})]}),e.jsxs("div",{className:"settings-section",children:[e.jsx("div",{className:"section-title",children:`发现${f!==null?` —— ${f.name}`:""}`}),e.jsxs("div",{className:"prefrow",children:[e.jsx("span",{className:"pref-label",children:"安装作用域:"}),e.jsx("button",{type:"button","data-scope":"user",className:`wudao${y==="user"?" primary":""}`,disabled:k,onClick:()=>g("user"),children:"用户(本机)"}),e.jsx("button",{type:"button","data-scope":"project",className:`wudao${y==="project"?" primary":""}`,disabled:k,onClick:()=>g("project"),children:"项目(本工作区)"})]}),e.jsx("div",{className:"hint",children:"user = ~/.wudao/plugins(所有会话可用)· project = <工作区>/.wudao/plugins(仅本项目)"}),f===null?e.jsx("div",{className:"hint",children:"选择一个市场后,这里列出它的插件(名称/描述/版本/「将安装」明细)"}):f.plugins.length===0?e.jsx("div",{className:"hint",children:"该市场没有可列出的插件——若目录被手动改动,试一次「更新」"}):e.jsx("div",{className:"plugin-list",children:f.plugins.map(S=>e.jsxs("div",{className:"plugin-entry","data-plugin":S.name,children:[e.jsxs("div",{className:"plugin-head",children:[e.jsx("span",{className:"plugin-name",children:S.name}),S.version!==void 0?e.jsx("span",{className:"meta",children:S.version}):null]}),S.description!==void 0?e.jsx("div",{className:"plugin-desc",children:S.description}):null,e.jsx("div",{className:"plugin-detail",children:`将安装:${qt(S.detail)}`}),e.jsx("div",{className:"plugin-actions",children:e.jsx("button",{type:"button",className:"wudao","data-install":`${S.name}@${f.name}`,disabled:k,onClick:()=>he(S.name,f.name),children:"安装"})})]},S.name))})]}),e.jsxs("div",{className:"settings-section",children:[e.jsx("div",{className:"section-title",children:"已装插件"}),p===null?e.jsx("div",{className:"muted",children:"读取中…"}):p.length===0?e.jsx("div",{className:"hint",children:"尚未安装插件——在上方发现列表选择插件安装"}):Tm.filter(S=>p.some(w=>w.scope===S.scope)).map(S=>e.jsxs("div",{className:"installed-group","data-scope":S.scope,children:[e.jsx("div",{className:"group-title",children:S.title}),p.filter(w=>w.scope===S.scope).map(w=>e.jsxs("div",{className:"installed-row","data-plugin-id":w.id,children:[e.jsx("span",{className:"plugin-name",children:w.name}),e.jsx("span",{className:"meta",children:w.market}),w.version!==void 0?e.jsx("span",{className:"meta",children:w.version}):null,e.jsx("span",{className:`meta state ${w.enabled?"on":"off"}`,children:w.enabled?"已启用":"已停用"}),w.scope==="adhoc"?null:e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"wudao",disabled:k,onClick:()=>le(w),children:w.enabled?"停用":"启用"}),e.jsx("button",{type:"button",className:"wudao danger",disabled:k,onClick:()=>K(w.id),children:"卸载"})]})]},w.id))]},S.scope)),e.jsx("div",{className:"hint",children:"安装/启停/卸载后热重扫立即生效;停用保留安装记录(随时再启用),卸载删除目录"})]})]})}const Dm=["openai-chat","anthropic","responses"],Om={"openai-chat":["temperature","top_p","top_k","max_tokens","reasoning_effort","reasoning","stop","metadata"],anthropic:["temperature","top_p","top_k","max_tokens","thinking","stop_sequences","metadata"],responses:["temperature","top_p","max_completion_tokens","reasoning","instructions","store","metadata"]},Im=new Set(["authorization","x-api-key","host","content-length","content-type","connection","keep-alive","proxy-authenticate","proxy-authorization","te","trailer","transfer-encoding","upgrade","cookie"]),ca=["{{sessionId}}","{{uuid}}","{{iso8601}}"];function Lm(t){return t.split(/(\{\{[^}]*\}\})/).filter(s=>s.startsWith("{{")).filter(s=>!ca.includes(s))}const Pm=/^[a-z0-9]+(-[a-z0-9]+)*$/,da=[{value:"",label:"全部层"},{value:"headers",label:"仅 headers"},{value:"prompt",label:"仅 prompt"},{value:"headers+prompt",label:"headers+prompt"}];function Je(t){const s=t.indexOf(":");return s===-1?{id:t,layer:""}:{id:t.slice(0,s),layer:t.slice(s+1)}}function Tt(t,s){return s===""?t:`${t}:${s}`}function _m(t){return Im.has(t.trim().toLowerCase())}const Ct=t=>t instanceof Error?t.message:String(t),ut=Dm,Jl={builtin:"内置",global:"全局",workspace:"工作区"};function qs(t){return{"openai-chat":t(),anthropic:t(),responses:t()}}const ua=()=>({key:"",value:""}),ha=()=>({key:"",value:""});function Ql(){return{id:"",displayName:"",promptText:"",headers:qs(()=>[ua()]),body:qs(()=>[ha()])}}function Zl(t){const s=qs(()=>[]),n=qs(()=>[]);for(const a of ut){const l=t.headers[a];l!==void 0&&(s[a]=Object.entries(l).map(([o,c])=>({key:o,value:c}))),s[a].length===0&&(s[a]=[ua()]);const r=t.body?.[a];r!==void 0&&(n[a]=Object.entries(r).map(([o,c])=>({key:o,value:JSON.stringify(c)??""}))),n[a].length===0&&(n[a]=[ha()])}return{id:t.id,displayName:t.displayName,promptText:t.prompt?.system?.text??"",headers:s,body:n}}function Fm(t){for(const s of ut)if(Object.keys(t.headers[s]??{}).length>0||Object.keys(t.body?.[s]??{}).length>0)return s;return ut[0]??"openai-chat"}function zm(t){const s=t.trim();if(s==="")return!1;try{return JSON.parse(s),!0}catch{return!1}}function Li(t,s){const n=[],a=t.id.trim();s&&(a===""||!Pm.test(a))&&n.push("id: kebab-case required (/^[a-z0-9]+(-[a-z0-9]+)*$/)"),t.displayName.trim()===""&&n.push("displayName: 不能为空");for(const l of ut){for(const r of t.headers[l])if(r.key.trim()===""&&r.value!=="")n.push(`headers.${l}: 键不能为空`);else if(r.key.trim()!==""){_m(r.key)&&n.push(`headers.${l}.${r.key.trim()}: "${r.key.trim().toLowerCase()}" 是禁用键(鉴权/传输控制头由适配器持有,persona 不可控)`);for(const o of Lm(r.value))n.push(`headers.${l}.${r.key.trim()}: unknown template slot ${o} (allowed: ${ca.join("|")})`)}for(const r of t.body[l])r.key!==""&&!zm(r.value)&&n.push(`body.${l}.${r.key}: 值必须是合法 JSON(如 0.7、"text"、false)`)}return n}function Bm(t,s){if(Li(t,s).length>0)return null;const n={},a={};for(const r of ut){const o=t.headers[r].filter(d=>d.key.trim()!=="");o.length>0&&(n[r]=Object.fromEntries(o.map(d=>[d.key.trim(),d.value])));const c=t.body[r].filter(d=>d.key!==""&&d.value.trim()!=="");c.length>0&&(a[r]=Object.fromEntries(c.map(d=>[d.key,JSON.parse(d.value)])))}const l=t.promptText;return{id:t.id.trim(),displayName:t.displayName.trim(),source:{kind:"workspace-source",provenance:"user-defined (wudao settings persona tab)",pinnedVersion:"1"},headers:n,...Object.keys(a).length>0?{body:a}:{},...l.trim()!==""?{prompt:{system:{mode:"prefix",text:l}}}:{}}}const Km=Object.freeze({kind:"workspace-source",provenance:"user-defined (wudao settings persona tab)",pinnedVersion:"1"});function Gs(t,s){if(Object.is(t,s))return!0;if(typeof t!="object"||typeof s!="object"||t===null||s===null||Array.isArray(t)!==Array.isArray(s))return!1;if(Array.isArray(t)&&Array.isArray(s))return t.length===s.length&&t.every((o,c)=>Gs(o,s[c]??null));const n=Object.keys(t),a=Object.keys(s);if(n.length!==a.length)return!1;const l=s,r=t;return n.every(o=>Object.prototype.hasOwnProperty.call(l,o)&&Gs(r[o],l[o]))}function er(t){const s=new Set(["id","displayName","source","headers","body","prompt"]);if(!Object.keys(t).every(n=>s.has(n))||!Gs(t.source,Km)||t.id!==t.id.trim()||t.displayName!==t.displayName.trim())return!1;for(const n of ut){const a=t.headers[n];if(a!==void 0){if(Object.keys(a).length===0)return!1;for(const[r,o]of Object.entries(a))if(r.trim()!==r||typeof o!="string")return!1}const l=t.body?.[n];if(l!==void 0){if(Object.keys(l).length===0)return!1;for(const[r,o]of Object.entries(l)){if(r.trim()!==r)return!1;try{if(!Gs(JSON.parse(JSON.stringify(o)),o))return!1}catch{return!1}}}}if(t.prompt!==void 0){const n=Object.keys(t.prompt);if(n.length!==1||n[0]!=="system")return!1;const a=t.prompt.system;if(a===void 0)return!1;const l=Object.keys(a);if(l.length!==2||!l.includes("mode")||!l.includes("text")||a.mode!=="prefix"||typeof a.text!="string"||a.text.trim()==="")return!1}return!0}function Um({client:t,settings:s,notify:n,refresh:a}){const[l,r]=i.useState(null),[o,c]=i.useState(null),[d,m]=i.useState(!1),[p,v]=i.useState(null),[x,j]=i.useState(!1),[N,M]=i.useState(null),[y,g]=i.useState(null),[O,$]=i.useState(!1),[k,G]=i.useState("openai-chat"),[T,V]=i.useState([]),[q,X]=i.useState(null),[W,_]=i.useState(null),[z,R]=i.useState(!1),P=i.useRef(null);i.useEffect(()=>{z&&P.current?.focus()},[z]);const A=i.useRef({composing:!1,endedAt:0}),[H,J]=i.useState(null),[se,he]=i.useState(null),le=H??s?.settings.personaId??"",K=Je(le).id,D=se??Je(le).layer,f=()=>{t.personaList().then(F=>{r(F.personas),c(null)}).catch(F=>{const Y=Ct(F);/unknown op|not supported/i.test(Y)?m(!0):c(Y)})};i.useEffect(()=>{f()},[t]);const S=()=>{v(null),j(!1),M(null),g(null),V([]),X(null),R(!1),$(!1)},w=F=>{$(!1),g(null),M(null),V([]),X(null),v(F),R(!0);const Y=(l??[]).find(Q=>Q.id===F);j(Y?.editable===!0),t.personaGet(F).then(Q=>{M(Q.definition),G(Fm(Q.definition)),Y?.editable===!0&&er(Q.definition)&&g(Zl(Q.definition))}).catch(Q=>{M(null),n(`⚠️ 读取失败:${Ct(Q)}`)})},b=()=>{S(),$(!0),g(Ql()),G("openai-chat"),R(!0)},E=()=>{R(!1),$(!1)},U=()=>{if(y===null)return;const F=Bm(y,O);F!==null&&(_("save"),t.personaSave(F).then(Y=>{Y.ok?(n(`已保存 persona ${F.id}`),V([]),$(!1),v(F.id),j(!0),f(),a()):V(Y.errors)}).catch(Y=>n(`⚠️ 保存失败:${Ct(Y)}`)).finally(()=>_(null)))},ee=()=>{if(p===null)return;const F=p;_(`del:${F}`),t.personaDelete({id:F}).then(Y=>{Y.ok?(X(null),n(`已删除 persona ${F}`),S(),f(),a()):X({id:F,providers:Y.references.providers,isGlobalDefault:Y.references.isGlobalDefault})}).catch(Y=>n(`⚠️ 删除失败:${Ct(Y)}`)).finally(()=>_(null))},oe=()=>{if(q===null)return;const F=q.id;_(`del:${F}`),t.personaDelete({id:F,unbind:!0}).then(Y=>{Y.ok?(X(null),n(`已解绑并删除 persona ${F}`),S(),f(),a()):n(`⚠️ 删除失败:仍被引用(${Y.references.providers.join(", ")})`)}).catch(Y=>n(`⚠️ 删除失败:${Ct(Y)}`)).finally(()=>_(null))},Ne=F=>{_("default"),t.settingsSet("persona.id",F).then(()=>{n(F===""?"已清除全局默认 persona":`全局默认 persona → ${F}`),a()}).catch(Y=>n(`⚠️ 写入失败:${Ct(Y)}`)).finally(()=>_(null))},ke=F=>{g(Y=>Y===null?Y:{...Y,...F})},me=(F,Y,Q)=>{g(ie=>ie===null?ie:{...ie,headers:{...ie.headers,[F]:ie.headers[F].map((je,ne)=>ne===Y?{...je,...Q}:je)}})},$e=(F,Y,Q)=>{g(ie=>ie===null?ie:{...ie,body:{...ie.body,[F]:ie.body[F].map((je,ne)=>ne===Y?{...je,...Q}:je)}})},ge=F=>{g(Y=>Y===null?Y:{...Y,headers:{...Y.headers,[F]:[...Y.headers[F],ua()]}})},Me=F=>{g(Y=>Y===null?Y:{...Y,body:{...Y.body,[F]:[...Y.body[F],ha()]}})},Ge=(F,Y)=>{g(Q=>Q===null?Q:{...Q,headers:{...Q.headers,[F]:Q.headers[F].filter((ie,je)=>je!==Y)}})},ze=(F,Y)=>{g(Q=>Q===null?Q:{...Q,body:{...Q.body,[F]:Q.body[F].filter((ie,je)=>je!==Y)}})};if(d)return e.jsxs("div",{className:"settings-section set-sec","data-persona-tab":!0,children:[e.jsx("h3",{className:"section-title set-title",children:"Persona"}),e.jsx("div",{className:"hint",children:"升级 wudao 后可用"})]});const Le=y??(N!==null?Zl(N):null),pe=Le!==null&&y===null,Be=x&&N!==null&&!er(N),Te=N?.prompt?.system?.mode??"prefix",Pe=(l??[]).find(F=>F.id===p),Ve=F=>{const Y=[...Li(F,O),...T],Q=new Set;for(const ne of ut){for(const re of F.headers[ne])if(re.key.trim()!=="")for(const fe of Y)fe.startsWith(`headers.${ne}.${re.key.trim()}:`)&&Q.add(fe);for(const re of F.body[ne])if(re.key!=="")for(const fe of Y)fe.startsWith(`body.${ne}.${re.key}:`)&&Q.add(fe)}const ie=Y.filter(ne=>!Q.has(ne)),je=(ne,re,fe)=>fe===""?[]:Y.filter(be=>be.startsWith(`${ne}.${re}.${fe}:`));return e.jsxs("div",{className:"persona-form",children:[e.jsx("div",{className:"detail-head",children:O?e.jsx("strong",{children:"新建 persona"}):e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:F.displayName!==""?F.displayName:F.id}),e.jsx("span",{className:"meta persona-id",children:F.id}),Pe!==void 0?e.jsx("span",{className:"meta",children:Jl[Pe.source]}):null,pe?e.jsx("span",{className:"meta",children:"只读"}):null]})}),ie.length>0?e.jsx("div",{className:"entry-error",children:ie.join(`
321
+ `)}):null,e.jsxs("div",{className:"prefrow",children:[e.jsx("span",{className:"pref-label",children:"id:"}),e.jsx("input",{type:"text",className:"wudao-input ctl","aria-label":"id",placeholder:"kebab-case(仅创建时可改)",value:F.id,disabled:pe||!O,onChange:ne=>ke({id:ne.target.value})})]}),e.jsxs("div",{className:"prefrow",children:[e.jsx("span",{className:"pref-label",children:"displayName:"}),e.jsx("input",{type:"text",className:"wudao-input ctl","aria-label":"displayName",value:F.displayName,disabled:pe,onChange:ne=>ke({displayName:ne.target.value})})]}),e.jsxs("div",{className:"prefrow",children:[e.jsx("span",{className:"pref-label",children:"prompt:"}),e.jsxs("select",{className:"ctl","aria-label":"prompt mode",value:Te,disabled:!0,children:[e.jsx("option",{value:"prefix",children:"prefix"}),e.jsx("option",{value:"snapshot",children:"snapshot"})]})]}),e.jsx("textarea",{className:"wudao-input persona-prompt","aria-label":"prompt",rows:4,placeholder:"system 前缀文本(prefix 模式;空 = 不带 prompt 层)",value:F.promptText,disabled:pe,onChange:ne=>ke({promptText:ne.target.value})}),e.jsx("div",{className:"persona-wire-tabs",role:"tablist","aria-label":"wire 协议分页",children:ut.map(ne=>{const re=F.headers[ne].filter(fe=>fe.key.trim()!=="").length+F.body[ne].filter(fe=>fe.key!=="").length;return e.jsxs("button",{type:"button",role:"tab","data-wire":ne,"aria-selected":k===ne,className:`segctl-opt${k===ne?" on":""}`,onClick:()=>G(ne),children:[ne,e.jsx("span",{className:`wire-count${re===0?" zero":""}`,children:re})]},ne)})}),e.jsxs("div",{className:"persona-layer",children:[e.jsx("div",{className:"pref-label",children:`headers(${k})`}),F.headers[k].map((ne,re)=>{const fe=je("headers",k,ne.key.trim());return e.jsxs("div",{className:`row keyrow${fe.length>0?" error":""}`,children:[e.jsx("input",{type:"text",className:"wudao-input ctl","aria-label":re===0?`headers.${k}.key`:`headers.${k}.${re}.key`,placeholder:"header 名(如 user-agent)",value:ne.key,disabled:pe,onChange:be=>me(k,re,{key:be.target.value})}),e.jsx("input",{type:"text",className:"wudao-input ctl","aria-label":re===0?`headers.${k}.value`:`headers.${k}.${re}.value`,placeholder:"值",value:ne.value,disabled:pe,onChange:be=>me(k,re,{value:be.target.value})}),e.jsx("button",{type:"button",className:"ctl",disabled:pe,onClick:()=>Ge(k,re),children:"移除"}),fe.map(be=>e.jsx("span",{className:"entry-error",children:be},be))]},re)}),e.jsx("button",{type:"button",className:"ctl",disabled:pe,onClick:()=>ge(k),children:"+ 添加头"})]}),e.jsxs("div",{className:"persona-layer",children:[e.jsx("div",{className:"pref-label",children:`body(${k})`}),F.body[k].map((ne,re)=>{const fe=je("body",k,ne.key);return e.jsxs("div",{className:`row keyrow${fe.length>0?" error":""}`,children:[e.jsxs("select",{className:"ctl","aria-label":re===0?`body.${k}.key`:`body.${k}.${re}.key`,value:ne.key,disabled:pe,onChange:be=>$e(k,re,{key:be.target.value}),children:[e.jsx("option",{value:"",children:"(选择键)"}),Om[k].map(be=>e.jsx("option",{value:be,children:be},be))]}),e.jsx("input",{type:"text",className:"wudao-input ctl","aria-label":re===0?`body.${k}.value`:`body.${k}.${re}.value`,placeholder:'JSON 值(如 0.7、"text"、false)',value:ne.value,disabled:pe,onChange:be=>$e(k,re,{value:be.target.value})}),e.jsx("button",{type:"button",className:"ctl",disabled:pe,onClick:()=>ze(k,re),children:"移除"}),fe.map(be=>e.jsx("span",{className:"entry-error",children:be},be))]},re)}),e.jsx("button",{type:"button",className:"ctl",disabled:pe,onClick:()=>Me(k),children:"+ 添加 body 键"})]}),pe?e.jsx("div",{className:"hint",children:Be?"此 persona 含高级字段(快照/工具名映射/默认层/置信度),由手工编写,仅支持查看":`${N?.source.kind==="external-research"?"社区逆向指纹(external-research)":"内置指纹(workspace-source)"} · 只读`}):e.jsxs("div",{className:"keyrow",children:[e.jsx("button",{type:"button",className:"ctl persona-save",disabled:W==="save",onClick:U,children:"保存"}),O?e.jsx("button",{type:"button",className:"ctl",onClick:S,children:"取消"}):e.jsx("button",{type:"button",className:"ctl persona-del",disabled:W!==null,onClick:ee,children:"删除"})]})]})},Re=z?O?{aria:"新建 persona",head:"新建 persona",body:Ve(Le??Ql())}:p===null?null:{aria:`persona ${Pe?.displayName??p}`,head:Pe?.displayName??p,body:Le!==null?Ve(Le):e.jsx("div",{className:"muted",children:"读取中…"})}:null;return e.jsxs("div",{className:"settings-section set-sec","data-persona-tab":!0,children:[e.jsx("h3",{className:"section-title set-title",children:"Persona"}),e.jsx("div",{className:"hint",children:"persona = 三层请求指纹(headers / body / prompt)。内置指纹只读;全局 persona 在此新建与编辑;供应商绑定在各供应商详情处设置。"}),e.jsxs("div",{className:"prefrow persona-default",children:[e.jsx("span",{className:"pref-label",children:"全局默认:"}),e.jsxs("select",{className:"ctl persona-pick","aria-label":"全局默认 persona",title:"未设置时按供应商绑定回落;供应商绑定可在各供应商详情处设置",value:K,disabled:W==="default",onChange:F=>{const Y=F.target.value,Q=Y===""?"":Tt(Y,D);J(Q),Ne(Q)},children:[e.jsx("option",{value:"",children:"(未设置)"}),(l??[]).map(F=>e.jsx("option",{value:F.id,children:F.displayName??F.id},F.id))]}),e.jsx("select",{className:"ctl persona-pick-layer","aria-label":"全局默认层",title:"限定该 persona 只作用于选中的层(全部层 = 完整指纹)",value:D,disabled:W==="default",onChange:F=>{const Y=F.target.value;if(he(Y),K!==""){const Q=Tt(K,Y);J(Q),Ne(Q)}},children:da.map(F=>e.jsx("option",{value:F.value,children:F.label},F.value))})]}),o!==null?e.jsx("div",{className:"entry-error",children:`无法读取 persona 列表:${o}`}):null,e.jsx("button",{type:"button",className:"ctl persona-add",onClick:b,children:"+ 新建"}),e.jsx("div",{className:"provider-master",children:e.jsxs("div",{className:"provider-cards",children:[l===null&&o===null?e.jsx("div",{className:"provider-empty",children:"读取中…"}):null,(l??[]).map(F=>e.jsxs("button",{type:"button",className:"persona-row","data-persona":F.id,"aria-current":p===F.id&&!O?"true":void 0,onClick:()=>w(F.id),children:[e.jsx("span",{className:"persona-name",children:F.displayName??F.id}),e.jsx("span",{className:"meta persona-id",children:F.id}),e.jsx("span",{className:"meta persona-layers",children:F.layers}),e.jsx("span",{className:"meta persona-src",children:Jl[F.source]})]},F.id))]})}),z&&Re!==null?e.jsx("div",{className:"scrim pvd-overlay",onClick:F=>{F.target===F.currentTarget&&E()},children:e.jsxs("div",{className:"modal-card pop-in pvd",role:"dialog","aria-modal":"true","aria-label":Re.aria,ref:P,tabIndex:-1,onCompositionStart:()=>{A.current=qe(A.current)},onCompositionEnd:()=>{A.current=Fe(A.current,Date.now())},onKeyDown:F=>{He(F.nativeEvent,A.current,Date.now())||F.key==="Escape"&&(F.preventDefault(),F.stopPropagation(),E())},children:[e.jsxs("div",{className:"pvd-head",children:[e.jsx("h3",{children:Re.head}),e.jsx("button",{type:"button",className:"ctl pvd-close","aria-label":"关闭",title:"关闭(丢弃未保存的修改)",onClick:E,children:"✕"})]}),e.jsx("div",{className:"pvd-body",children:q!==null&&!O?e.jsxs("div",{className:"persona-delete-confirm",children:[e.jsx("div",{children:"该 persona 正被引用,「解绑并删除」将同时清除:"}),e.jsxs("ul",{children:[q.providers.map(F=>e.jsx("li",{children:`供应商 ${F} 的 persona 绑定`},F)),q.isGlobalDefault?e.jsx("li",{children:"全局默认 persona(persona.id 清空)"}):null]}),e.jsxs("div",{className:"keyrow",children:[e.jsx("button",{type:"button",className:"ctl persona-del",disabled:W!==null,onClick:oe,children:"解绑并删除"}),e.jsx("button",{type:"button",className:"ctl",onClick:()=>X(null),children:"取消"})]})]}):Re.body})]})}):null,e.jsx("div",{className:"hint",children:`头值模板槽:${ca.join(" ")}(逐请求解析;未知槽位在保存前即被拒)`})]})}const Pi=[{mode:"auto",label:"自动"},{mode:"on",label:"中文"},{mode:"off",label:"不限"}],tr=[{mode:"auto",label:"自动"},{mode:"zh",label:"中文"},{mode:"en",label:"EN"},{mode:"off",label:"不限"}],sr=t=>Pi.find(s=>s.mode===t)?.label??"语言";function Wm({value:t,disabled:s=!1,onPick:n,onPersistDefault:a}){const[l,r]=i.useState(!1),o=i.useRef(null),c=i.useRef(null),d=(v=!0)=>{r(!1),v&&setTimeout(()=>{document.activeElement===document.body&&c.current?.focus()},0)};i.useEffect(()=>{if(!l)return;const v=x=>{o.current!==null&&!o.current.contains(x.target)&&d(!1)};return document.addEventListener("pointerdown",v),()=>document.removeEventListener("pointerdown",v)},[l]);const m=t??{reply:"auto",reasoning:"auto"},p=m.reply!=="auto"||m.reasoning!=="auto";return e.jsxs("div",{className:"pop",ref:o,onKeyDown:v=>{v.key==="Escape"&&(v.preventDefault(),d())},children:[e.jsxs("button",{type:"button",ref:c,className:`chip lang${p?" sel":""}`,disabled:s,"aria-haspopup":"menu","aria-expanded":l,title:`回答:${sr(m.reply)} 思考:${tr.find(v=>v.mode===m.reasoning)?.label??"自动"} — 会话内切换,下一轮生效`,onClick:()=>{r(!l)},children:[e.jsx(dd,{size:14}),m.reply==="auto"?"语言":sr(m.reply),e.jsx("span",{className:"caret","aria-hidden":!0,children:"▾"})]}),l?e.jsxs("div",{className:"menu lang-menu",role:"menu","aria-label":"语言",children:[e.jsx("div",{className:"lang-head",children:"回答"}),Pi.map(v=>e.jsx("button",{type:"button",role:"menuitemradio","aria-checked":v.mode===m.reply,className:`mi${v.mode===m.reply?" on":""}`,"data-knob":"reply","data-mode":v.mode,onClick:()=>{n("reply",v.mode),d()},children:e.jsx("span",{className:"mlabel",children:v.label})},v.mode)),a!==void 0?e.jsx("button",{type:"button",className:"mf","data-persist":"reply",title:"把当前回答语言存为全局默认(新会话起步值)",onClick:()=>{a("reply"),d()},children:"设为默认"}):null,e.jsx("div",{className:"lang-head",children:"思考"}),tr.map(v=>e.jsx("button",{type:"button",role:"menuitemradio","aria-checked":v.mode===m.reasoning,className:`mi${v.mode===m.reasoning?" on":""}`,"data-knob":"reasoning","data-mode":v.mode,onClick:()=>{n("reasoning",v.mode),d()},children:e.jsx("span",{className:"mlabel",children:v.label})},v.mode)),a!==void 0?e.jsx("button",{type:"button",className:"mf","data-persist":"reasoning",title:"把当前思考语言存为全局默认(新会话起步值)",onClick:()=>{a("reasoning"),d()},children:"设为默认"}):null]}):null]})}const Hm=t=>t instanceof Error?t.message:String(t),nr={simple:"简洁模式",buddy:"Buddy 模式",advanced:"高级模式"};function qm(t){switch(t){case"offered":return"待同意";case"proposing":return"生成中";case"gated":return"待激活";case"gate-failed":return"门禁未过";case"rejected":return"已驳回";case"ignored":return"已忽略";case"abandoned":return"已放弃";case"activated":return"已生效";case"undone":return"已撤销";default:return t}}function Gm({client:t,settings:s,notify:n,refresh:a,onModeApplied:l,language:r=null,memorySignature:o}){const[c,d]=i.useState(null),m=(f,S,w)=>{d(`set:${f}`),t.settingsSet(f,S).then(()=>{n(w),f==="ui.defaultMode"&&(S==="simple"||S==="buddy"||S==="advanced")&&l?.(S),a()}).catch(b=>n(`⚠️ ${Hm(b)}`)).finally(()=>d(null))},p=(f,S)=>{d(`set:${ul(f)}`),t.settingsSet(ul(f),S).then(()=>{n(`已设为默认:${f==="reply"?"回答":"思考"} ${S} —— 新会话生效`),a()}).catch(w=>n(`⚠️ 默认语言保存失败:${w instanceof Error?w.message:String(w)}`)).finally(()=>d(null))},[v,x]=i.useState(void 0),[j,N]=i.useState(void 0),[M,y]=i.useState(null),[g,O]=i.useState(0),[$,k]=i.useState(null),[G,T]=i.useState(null),[V,q]=i.useState(""),X=i.useCallback(()=>{if(typeof t.memoryList!="function"){x(null);return}t.memoryList().then(f=>{x(Si(f)),O(typeof f.blocked=="number"&&f.blocked>0?f.blocked:0)}).catch(()=>{x(null)})},[t]);i.useEffect(()=>{X()},[X]);const W=i.useCallback(()=>{if(typeof t.longtermMemoryList!="function"){N(null);return}t.longtermMemoryList().then(f=>{N(Array.isArray(f.entries)?f.entries:[])}).catch(()=>{N(null)})},[t]);i.useEffect(()=>{W()},[W]);const _=f=>{y(f),t.longtermMemoryForget(f).then(()=>{W()}).catch(()=>{W()}).finally(()=>y(null))},z=i.useRef({sig:void 0,armed:!1});i.useEffect(()=>{const f=z.current;if(!f.armed){z.current={sig:o,armed:!0};return}o!==f.sig&&(z.current={sig:o,armed:!0},X())},[o,X]);const R=f=>{n(`⚠️ 记忆操作失败:${f instanceof Error?f.message:String(f)}`)},[P,A]=i.useState(void 0),[H,J]=i.useState(null),se=i.useCallback(()=>{if(typeof t.improvementFace!="function"){A(null);return}t.improvementFace("list").then(f=>{A(Array.isArray(f.records)?f.records:[])}).catch(()=>{A(null)})},[t]);i.useEffect(()=>{se()},[se]);const he=f=>{n(`⚠️ 改进提案操作失败:${f instanceof Error?f.message:String(f)}`)},le=(f,S)=>{J(f),t.improvementFace(S,f).then(w=>{n(w.message),se()}).catch(he).finally(()=>J(null))},K=(f,S)=>{k(f),t.memoryDecide(f,S).then(w=>{n(w.message),X()}).catch(R).finally(()=>k(null))},D=f=>{k(f),t.memoryEdit(f,V).then(S=>{n(S.message),T(null),q(""),X()}).catch(R).finally(()=>k(null))};return e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"settings-section set-sec",children:[e.jsx("h3",{className:"section-title set-title",children:"偏好"}),e.jsxs("label",{className:"setrow",children:[e.jsxs("span",{className:"setrow-main",children:[e.jsx("span",{className:"setrow-title",children:"跨会话记忆"}),e.jsx("span",{className:"setrow-note",children:"会话间自动回忆与后台整理"})]}),e.jsx("input",{type:"checkbox",className:"wudao-switch",checked:s?.settings.memoryEnabled??!0,disabled:c==="set:memoryEnabled",onChange:f=>m("memoryEnabled",f.target.checked,`记忆已${f.target.checked?"开启":"关闭"} —— 下会话生效`)})]}),Ln()==="desktop"?e.jsxs("label",{className:"setrow",children:[e.jsxs("span",{className:"setrow-main",children:[e.jsx("span",{className:"setrow-title",children:"关闭窗口时保持后台运行"}),e.jsx("span",{className:"setrow-note",children:"关窗不退出应用,正在跑的活继续推进;点程序坞图标或托盘「打开主窗口」随时回来;合盖休眠时活同样暂停"})]}),e.jsx("input",{type:"checkbox",className:"wudao-switch","data-background-on-close":!0,checked:s?.settings.desktopBackgroundOnClose??!1,disabled:c==="set:desktop.backgroundOnClose",onChange:f=>m("desktop.backgroundOnClose",f.target.checked,f.target.checked?"关窗后台运行已开启 —— 关窗不退出,活继续跑":"关窗后台运行已关闭 —— 关窗即退出应用")})]}):null,Ln()==="desktop"&&(s?.settings.schedulesLaunchAgentSupported??!0)?e.jsxs("label",{className:"setrow",children:[e.jsxs("span",{className:"setrow-main",children:[e.jsx("span",{className:"setrow-title",children:"定时任务离线唤起"}),e.jsx("span",{className:"setrow-note",children:"应用没开着,到点也会自动打开应用执行;合盖休眠时等唤醒后立即补跑"})]}),e.jsx("input",{type:"checkbox",className:"wudao-switch","data-schedule-launch-agent":!0,checked:s?.settings.schedulesLaunchAgent??!1,disabled:c==="set:schedules.launchAgent",onChange:f=>m("schedules.launchAgent",f.target.checked,f.target.checked?"定时任务离线唤起已开启 —— 应用没开着,到点也会自动唤起执行":"定时任务离线唤起已关闭 —— 定时任务只在应用开着时执行")})]}):null,e.jsxs("div",{className:"setrow",children:[e.jsxs("span",{className:"setrow-main",children:[e.jsx("span",{className:"setrow-title",children:"默认界面"}),e.jsx("span",{className:"setrow-note",children:"下次打开应用进入的界面;立即切换,重载后完全生效"})]}),e.jsx("div",{className:"segctl",role:"radiogroup","aria-label":"默认界面",children:["simple","buddy","advanced"].map(f=>e.jsx("button",{type:"button",role:"radio","aria-checked":(s?.settings.uiDefaultMode??"advanced")===f,"data-default-mode":f,className:`segctl-opt${(s?.settings.uiDefaultMode??"advanced")===f?" on":""}`,disabled:c==="set:ui.defaultMode",onClick:()=>m("ui.defaultMode",f,`默认界面 → ${nr[f]} —— 已切换,重载后完全生效`),children:nr[f]},f))})]}),e.jsxs("div",{className:"setrow",children:[e.jsxs("span",{className:"setrow-main",children:[e.jsx("span",{className:"setrow-title",children:"默认推理档"}),e.jsx("span",{className:"setrow-note",children:"新会话生效;当前会话用输入框下方的强度 chip 切"})]}),e.jsx("div",{className:"segctl",role:"radiogroup","aria-label":"默认推理档",children:(s?.efforts??[]).map(f=>e.jsx("button",{type:"button",role:"radio","aria-checked":s?.defaultEffort===f,"data-default-effort":f,className:`segctl-opt${s?.defaultEffort===f?" on":""}`,disabled:c==="set:model.defaultEffort",onClick:()=>m("model.defaultEffort",f,`默认推理档 → ${f} —— 新会话生效`),children:f},f))})]}),e.jsx("div",{className:"hint",children:"写入全局设置(~/.wudao/settings.json)"})]}),j!=null?e.jsxs("div",{className:"settings-section set-sec memory-manage","data-lt-memory":!0,children:[e.jsx("h3",{className:"section-title set-title",children:"长期记忆"}),e.jsx("div",{className:"hint",children:"跨会话记住的偏好与经验——新会话自动带上,删掉就忘"}),j.length===0?e.jsx("div",{className:"mem-empty",children:"还没有长期记忆——对话中让它记住的事会存在这里"}):j.map(f=>e.jsxs("div",{className:"mem-row","data-lt-entry":f.id,children:[e.jsx("span",{className:"mem-kind",children:`${f.kind} · 用过 ${f.useCount} 次`}),e.jsx("span",{className:"mem-text",children:f.text}),e.jsx("button",{type:"button",className:"wudao mem-del",disabled:M===f.id,onClick:()=>_(f.id),children:M===f.id?"删除中…":"忘掉"})]},f.id))]}):null,v!=null?e.jsxs("div",{className:"settings-section set-sec memory-manage",children:[e.jsx("h3",{className:"section-title set-title",children:"管理记忆"}),e.jsx("div",{className:"hint",children:"模型替你记下的内容都在这里——确认后参与回忆,丢弃即删除该条"}),g>0?e.jsx("div",{className:"hint mem-blocked","data-blocked-count":g,children:`已拦 ${g} 条可疑学习输入(含密钥或指令注入形状,未入库——明细在 .wudao/memory-blocked.jsonl)`}):null,v.length===0?e.jsx("div",{className:"mem-empty",children:"还没有记忆——用得越久攒得越多"}):v.map(f=>{const S=f.status==="pending",w=Hl(f.created);return G===f.id?e.jsxs("div",{className:"mem-row editing","data-mem-id":f.id,children:[e.jsx("span",{className:`mem-badge${S?"":" ok"}`,children:S?"待审":"生效"}),e.jsxs("span",{className:"mem-main mem-edit",children:[e.jsx("textarea",{value:V,disabled:$!==null,onChange:b=>q(b.target.value)}),e.jsxs("span",{className:"mem-acts",children:[e.jsx("button",{type:"button",className:"wudao action",disabled:$!==null||V.trim()==="",onClick:()=>D(f.id),children:"保存"}),e.jsx("button",{type:"button",className:"wudao",disabled:$!==null,onClick:()=>{T(null),q("")},children:"取消"})]})]})]},f.id):e.jsxs("div",{className:"mem-row","data-mem-id":f.id,children:[e.jsx("span",{className:`mem-badge${S?"":" ok"}`,children:S?"待审":"生效"}),e.jsxs("span",{className:"mem-main",children:[e.jsx("span",{className:"mem-kind",children:`${ki(f.kind)} · ${wi(f.scope)}${w!==""?` · ${w}`:""} · 被想起 ${f.hits} 次`}),e.jsx("span",{className:"mem-content",children:f.content})]}),e.jsxs("span",{className:"mem-acts",children:[e.jsx("button",{type:"button",className:"wudao",disabled:$!==null,onClick:()=>{T(f.id),q(f.content)},children:"改写"}),S?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"wudao action",disabled:$!==null,onClick:()=>K(f.id,"ok"),children:"确认"}),e.jsx("button",{type:"button",className:"wudao danger",disabled:$!==null,onClick:()=>K(f.id,"del"),children:"丢弃"})]}):null]})]},f.id)})]}):null,P!=null?e.jsxs("div",{className:"settings-section set-sec memory-manage",children:[e.jsx("h3",{className:"section-title set-title",children:"改进提案"}),e.jsx("div",{className:"hint",children:"失败反复出现时,助手会提议把它总结成一条工作规则——规则在激活前经过自动门禁和你的两次确认,随时可撤销"}),P.length===0?e.jsx("div",{className:"mem-empty",children:"还没有改进提案——同一个失败出现三次后会在这里提议"}):P.map(f=>{const S=Hl(f.createdAt),w=f.subject.length>60?`${f.subject.slice(0,59)}…`:f.subject;return e.jsxs("div",{className:"mem-row","data-improve-id":f.id,"data-improve-status":f.status,children:[e.jsx("span",{className:`mem-badge${f.status==="gated"||f.status==="activated"?" ok":""}`,children:qm(f.status)}),e.jsxs("span",{className:"mem-main",children:[e.jsx("span",{className:"mem-kind",children:`${w} · 已出现 ${f.count} 次${S!==""?` · ${S}`:""}`}),f.status==="offered"?e.jsxs(e.Fragment,{children:[f.preview!==void 0&&f.preview!==""?e.jsx("span",{className:"mem-content",children:f.preview}):null,f.attempts>0&&f.lastError!==void 0?e.jsx("span",{className:"hint",children:`上次生成失败:${f.lastError}`}):null]}):null,f.status==="proposing"?e.jsx("span",{className:"hint",children:"正在生成提案并自动过门禁——完成或失败后这里更新"}):null,(f.status==="gated"||f.status==="activated"||f.status==="undone"||f.status==="gate-failed")&&f.ruleText!==void 0?e.jsxs(e.Fragment,{children:[f.problemSummary!==void 0?e.jsx("span",{className:"mem-content",children:f.problemSummary}):null,e.jsx("span",{className:"mem-content",children:f.ruleText}),e.jsx("span",{className:"hint",children:`适用范围:${f.scope??"全工作区"}${f.paths!==void 0?`(${f.paths.join("、")})`:""}${f.gate!==void 0?` · 门禁${f.gate.ok?"已过":"未过"}(${f.gate.suites.filter(b=>b.status==="pass").length}/${f.gate.suites.length} 项套件全绿)`:""}`}),f.status==="activated"&&f.ruleFile!==void 0?e.jsx("span",{className:"hint",children:`已写入 ${f.ruleFile}——下次会话生效`}):null,f.status==="gate-failed"&&f.lastError!==void 0?e.jsx("span",{className:"hint",children:`未激活(${f.lastError})——原样留档`}):null]}):null,(f.status==="rejected"||f.status==="ignored"||f.status==="abandoned")&&f.lastError!==void 0?e.jsx("span",{className:"hint",children:f.lastError}):null]}),e.jsxs("span",{className:"mem-acts",children:[f.status==="offered"?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"wudao action",disabled:H!==null,onClick:()=>le(f.id,"consent"),children:"生成提案"}),e.jsx("button",{type:"button",className:"wudao",disabled:H!==null,onClick:()=>le(f.id,"ignore"),children:"忽略"})]}):null,f.status==="gated"?e.jsxs(e.Fragment,{children:[e.jsx("button",{type:"button",className:"wudao action",disabled:H!==null,onClick:()=>le(f.id,"activate"),children:"激活"}),e.jsx("button",{type:"button",className:"wudao danger",disabled:H!==null,onClick:()=>le(f.id,"reject"),children:"驳回"})]}):null,f.status==="activated"?e.jsx("button",{type:"button",className:"wudao",disabled:H!==null,onClick:()=>le(f.id,"undo"),children:"撤销"}):null,f.status==="undone"?e.jsx("button",{type:"button",className:"wudao",disabled:H!==null,onClick:()=>le(f.id,"activate"),children:"重新激活"}):null]})]},f.id)})]}):null,r!=null?e.jsxs("div",{className:"settings-section set-sec",children:[e.jsx("h3",{className:"section-title set-title",children:"语言"}),e.jsx("div",{className:"prefrow",children:e.jsx(Wm,{value:r,disabled:c!==null&&c.startsWith("set:language."),onPick:(f,S)=>p(f,S),onPersistDefault:f=>p(f,r[f])})}),e.jsx("div",{className:"hint",children:"回答与思考的语言偏好(新会话默认生效;当前会话临时切换可用 /language 命令)。"})]}):null]})}const ar=t=>t instanceof Error?t.message:String(t);function _i(t){return t.map(s=>({name:s.name.trim(),ctx:s.ctx.trim()})).filter(s=>s.name!=="").map(s=>{const n=Number.parseInt(s.ctx,10);return s.ctx!==""&&Number.isInteger(n)&&n>0?{name:s.name,contextLength:n}:{name:s.name}})}function Vm({client:t,card:s,keyDraft:n,fallbackWindow:a,notify:l,refresh:r,onClose:o,onSaved:c}){const[d,m]=i.useState(()=>s.models.map(K=>({name:K.name,ctx:K.contextLength!=null?String(K.contextLength):""}))),[p,v]=i.useState(""),[x,j]=i.useState(""),[N,M]=i.useState(!1),[y,g]=i.useState(null),[O,$]=i.useState(null),[k,G]=i.useState(!1),[T,V]=i.useState(!1),q=i.useRef(null),X=i.useRef(null),W=i.useRef({composing:!1,endedAt:0});i.useEffect(()=>{q.current?.focus()},[]);const _=()=>{G(!0),$(null),t.settingsListModels(s.provider,n.trim()!==""?{key:n.trim()}:void 0).then(K=>{if(!K.ok){$({state:K.state,message:K.message});return}const D=new Set;g(K.models.filter(f=>f.name===""||D.has(f.name)?!1:(D.add(f.name),!0)))}).catch(K=>$({state:"network",message:ar(K)})).finally(()=>G(!1))};i.useEffect(()=>{_()},[]);const z=new Set(d.map(K=>K.name.trim()).filter(K=>K!=="")),R=p.trim(),P=R!==""&&!z.has(R),A=p.trim().toLowerCase(),H=y===null?[]:A===""?y:y.filter(K=>K.name.toLowerCase().includes(A)),J=K=>{v(K.name),K.contextLength!=null&&j(String(K.contextLength)),M(!1)},se=()=>{P&&(m(K=>[...K,{name:R,ctx:x.trim()}]),v(""),j(""),M(!1))},he=(K,D)=>{m(f=>f.map((S,w)=>w===K?{...S,...D}:S))},le=()=>{V(!0);const K=_i(d),D=s.custom?{...s.label.trim()!==""?{label:s.label.trim()}:{},baseUrl:(s.baseUrl??"").trim(),...s.defaultModel!==""?{defaultModel:s.defaultModel}:{},...s.defaultContextLength!=null?{defaultContextLength:s.defaultContextLength}:{},...s.reasoningFormat!==void 0?{reasoningFormat:s.reasoningFormat}:{},...(s.wire??"")!==""?{wire:s.wire}:{},...s.persona!==void 0?{persona:s.persona}:{},...s.effort!==void 0?{effort:s.effort}:{},models:K}:{models:K,...s.reasoningFormat!==void 0?{reasoningFormat:s.reasoningFormat}:{},...s.wire!==void 0?{wire:s.wire}:{},...s.persona!==void 0?{persona:s.persona}:{},...s.effort!==void 0?{effort:s.effort}:{}};t.settingsSaveProvider(s.provider,D).then(f=>{f.ok?(l(`已保存供应商 ${f.provider} 的模型配置`),c(d),r(),o()):l(`⚠️ 保存失败:${f.error}`)}).catch(f=>l(`⚠️ 保存失败:${ar(f)}`)).finally(()=>V(!1))};return e.jsx("div",{className:"scrim",onClick:K=>{K.target===K.currentTarget&&o()},children:e.jsxs("div",{className:"modal-card pop-in mcm",role:"dialog","aria-modal":"true","aria-label":`配置模型 ${s.provider}`,ref:X,tabIndex:-1,onCompositionStart:()=>{W.current=qe(W.current)},onCompositionEnd:()=>{W.current=Fe(W.current,Date.now())},onKeyDown:K=>{He(K.nativeEvent,W.current,Date.now())||K.key==="Escape"&&(K.preventDefault(),K.stopPropagation(),o())},children:[e.jsxs("div",{className:"mcm-head",children:[e.jsx("h3",{children:`配置模型 · ${s.provider}`}),e.jsx("button",{type:"button",className:"ctl mcm-close","aria-label":"关闭",title:"关闭(丢弃未保存的修改)",onClick:o,children:"✕"})]}),e.jsxs("div",{className:"mcm-add",children:[e.jsxs("div",{className:"mcm-add-name",children:[e.jsx("input",{ref:q,type:"text",className:"wudao-input ctl mcm-name","aria-label":"模型名称",placeholder:"模型名称(手输,或从下拉选择)",value:p,onChange:K=>v(K.target.value)}),e.jsx("button",{type:"button",className:"ctl mcm-drop-toggle","aria-label":"选择模型","aria-expanded":N,title:k?"正在拉取 /models…":y===null?"拉取 /models 目录":"展开 /models 目录(输入框文字为过滤词)",disabled:k,onClick:()=>{if(y===null){M(!0),_();return}M(K=>!K)},children:N?"收起 ▴":"选择 ▾"}),e.jsx("button",{type:"button",className:"ctl mcm-refresh","aria-label":"刷新模型列表",title:"重新拉取 /models",disabled:k,onClick:_,children:"⟳"}),N&&y!==null?e.jsxs("div",{className:"mcm-drop",role:"listbox","aria-label":"可用模型",children:[H.map(K=>{const D=z.has(K.name);return e.jsxs("button",{type:"button",role:"option","aria-selected":"false",className:"mcm-opt",disabled:D,onClick:()=>J(K),children:[e.jsx("span",{className:"mcm-opt-name",children:K.name}),K.contextLength!=null?e.jsx("span",{className:"mcm-opt-ctx",children:K.contextLength}):null,D?e.jsx("span",{className:"mcm-opt-tag",children:"已配置"}):null]},K.name)}),H.length===0?e.jsx("div",{className:"mcm-drop-empty",children:"无匹配模型"}):null]}):null]}),e.jsx("input",{type:"text",className:"wudao-input ctl mcm-ctx","aria-label":"上下文窗口",inputMode:"numeric",placeholder:a!=null?`留空 = 继承 ${a}`:"留空 = 继承供应商默认",title:"上下文窗口(token);留空 = 继承供应商默认窗口",value:x,onChange:K=>j(K.target.value)}),e.jsx("button",{type:"button",className:"ctl",disabled:!P,onClick:se,children:"添加"})]}),k?e.jsx("div",{className:"muted mcm-pulling",children:"正在拉取 /models…"}):null,O!==null?e.jsxs("div",{className:"mcm-pull-error test-result fail","data-state":O.state,children:[e.jsx("span",{children:O.message}),e.jsx("button",{type:"button",className:"ctl",onClick:_,children:"重试"})]}):null,e.jsx("div",{className:"mcm-list-head",title:"上下文窗口留空 = 继承供应商默认",children:`已配置(${d.length})`}),e.jsx("div",{className:"mcm-rows",children:d.length===0?e.jsx("div",{className:"muted mcm-empty",children:"从上方添加模型(手输或 /models 下拉选择)"}):d.map((K,D)=>{const f=K.name.trim()!==""?K.name:`第${D+1}行`;return e.jsxs("div",{className:"mcm-row",children:[e.jsx("input",{type:"text",className:"wudao-input ctl mcm-name","aria-label":`模型名 ${f}`,value:K.name,onChange:S=>he(D,{name:S.target.value})}),e.jsx("input",{type:"text",className:"wudao-input ctl mcm-ctx","aria-label":`上下文 ${f}`,inputMode:"numeric",placeholder:a!=null?`继承 ${a}`:"继承供应商默认",value:K.ctx,onChange:S=>he(D,{ctx:S.target.value})}),e.jsx("button",{type:"button",className:"ctl mcm-del","aria-label":`删除模型 ${f}`,title:"删除该行",onClick:()=>m(S=>S.filter((w,b)=>b!==D)),children:"✕"})]},D)})}),e.jsxs("div",{className:"btnrow mcm-foot",children:[e.jsx("button",{type:"button",className:"ctl",onClick:o,children:"取消"}),e.jsx("button",{type:"button",className:"ctl wudao primary",disabled:T,onClick:le,children:"保存"})]})]})})}const xt=t=>t instanceof Error?t.message:String(t),Ym=["none","deepseek","zai","qwen","qwen-chat-template","openrouter","together","baseten"],Xm=["low","medium","high","max","none"],$n="",Rn="::none",$t="",Rt="::none",ma=[{value:"",label:"OpenAI 兼容(默认)"},{value:"anthropic",label:"Anthropic 协议"},{value:"responses",label:"OpenAI Responses"}],Jm=t=>ma.find(s=>s.value===(t??""))?.label??"OpenAI 兼容(默认)",Mn=t=>({label:t.label,baseUrl:t.custom?t.baseUrl??"":t.registeredBaseUrl??"",rows:t.models.map(s=>({name:s.name,ctx:s.contextLength!=null?String(s.contextLength):""})),wire:t.wire??"",persona:t.persona,effort:t.effort}),Qm={id:"",label:"",baseUrl:"",reasoningFormat:"none",wire:""};function Zm({client:t,notify:s,refresh:n,onCreated:a,onCancel:l}){const[r,o]=i.useState(Qm),[c,d]=i.useState(!1),[m,p]=i.useState(void 0),[v,x]=i.useState(null),[j,N]=i.useState("");i.useEffect(()=>{let y=!0;return t.personaList().then(g=>{y&&x(g.personas)}).catch(()=>{}),()=>{y=!1}},[t]);const M=()=>{const y=r.id.trim(),g=r.baseUrl.trim();y===""||g===""||(d(!0),t.settingsSaveProvider(y,{...r.label.trim()!==""?{label:r.label.trim()}:{},baseUrl:g,reasoningFormat:r.reasoningFormat,...r.wire!==""?{wire:r.wire}:{},...m!==void 0?{persona:m}:{},models:[]}).then(O=>{O.ok?(a(y),s(`已添加供应商 ${O.provider} —— 保存 Key 后即可使用`),n()):s(`⚠️ 添加失败:${O.error}`)}).catch(O=>s(`⚠️ 添加失败:${xt(O)}`)).finally(()=>d(!1)))};return e.jsxs("div",{className:"provider-detail new-provider-detail",children:[e.jsxs("div",{className:"detail-head",children:[e.jsx("span",{className:"dot draft",title:"未保存"}),e.jsx("strong",{children:"新增供应商"}),e.jsx("span",{className:"meta",children:"未保存"})]}),e.jsxs("div",{className:"detail-group",children:[e.jsx("div",{className:"detail-group-title",children:"基本信息"}),e.jsxs("div",{className:"detail-field",children:[e.jsx("span",{className:"detail-field-label",children:"id"}),e.jsx("input",{type:"text",className:"wudao-input ctl add-id","aria-label":"新供应商 id",placeholder:"id(字母开头,如 my-gateway)",value:r.id,onChange:y=>o(g=>({...g,id:y.target.value}))})]}),e.jsxs("div",{className:"detail-field",children:[e.jsx("span",{className:"detail-field-label",children:"显示名称"}),e.jsx("input",{type:"text",className:"wudao-input ctl add-label","aria-label":"显示名称",placeholder:"显示名称(可空 = id)",value:r.label,onChange:y=>o(g=>({...g,label:y.target.value}))})]}),e.jsxs("div",{className:"detail-field",children:[e.jsx("span",{className:"detail-field-label",children:"Base URL"}),e.jsx("input",{type:"text",className:"wudao-input ctl add-baseurl","aria-label":"Base URL",placeholder:"https://…(必填)",value:r.baseUrl,onChange:y=>o(g=>({...g,baseUrl:y.target.value}))})]})]}),e.jsxs("div",{className:"detail-group",children:[e.jsx("div",{className:"detail-group-title",children:"协议与格式"}),e.jsxs("div",{className:"detail-field",children:[e.jsx("span",{className:"detail-field-label",children:"推理格式"}),e.jsx("select",{className:"ctl add-format","aria-label":"推理格式",value:r.reasoningFormat,onChange:y=>o(g=>({...g,reasoningFormat:y.target.value})),children:Ym.map(y=>e.jsx("option",{value:y,children:y},y))})]}),e.jsxs("div",{className:"detail-field",children:[e.jsx("span",{className:"detail-field-label",children:"协议"}),e.jsx("select",{className:"ctl add-wire","aria-label":"协议",value:r.wire,onChange:y=>o(g=>({...g,wire:y.target.value})),children:ma.map(y=>e.jsx("option",{value:y.value,children:y.label},y.value))})]})]}),e.jsxs("div",{className:"detail-group",children:[e.jsx("div",{className:"detail-group-title",children:"Persona"}),e.jsxs("div",{className:"detail-field pair",children:[e.jsx("span",{className:"detail-field-label",children:"Persona 绑定"}),e.jsxs("select",{className:"ctl detail-persona","aria-label":"Persona 绑定",title:"跟随全局 = 用全局默认 persona;强制无 = 显式不挂 persona;其余 = 绑定该 persona",value:m===void 0?$t:m===null?Rt:Je(m).id,onChange:y=>{const g=y.target.value;p(g===$t?void 0:g===Rt?null:Tt(g,j))},children:[e.jsx("option",{value:$t,children:"跟随全局"}),(v??[]).map(y=>e.jsx("option",{value:y.id,children:y.displayName!=null?`${y.displayName} (${y.id})`:y.id},y.id)),e.jsx("option",{value:Rt,children:"强制无"})]}),e.jsx("select",{className:"ctl detail-persona-layer","aria-label":"Persona 层",title:"限定绑定的 persona 只作用于选中的层(全部层 = 完整指纹)",value:j,onChange:y=>{const g=y.target.value;N(g),p(O=>typeof O=="string"?Tt(Je(O).id,g):O)},children:da.map(y=>e.jsx("option",{value:y.value,children:y.label},y.value))})]})]}),e.jsxs("div",{className:"detail-actions",children:[e.jsx("button",{type:"button",className:"ctl",disabled:r.id.trim()===""||r.baseUrl.trim()===""||c,onClick:M,children:"创建"}),e.jsx("button",{type:"button",className:"ctl",onClick:l,children:"取消"})]})]})}function ep({client:t,card:s,models:n,currentProvider:a,currentModel:l,defaultModel:r,notify:o,refresh:c}){const[d,m]=i.useState(()=>Mn(s)),[p,v]=i.useState(!1),[x,j]=i.useState(!1),[N,M]=i.useState(!0),[y,g]=i.useState(null),[O,$]=i.useState(""),[k,G]=i.useState(null),[T,V]=i.useState(null),[q,X]=i.useState(null),[W,_]=i.useState(()=>typeof s.persona=="string"?Je(s.persona).layer:"");i.useEffect(()=>{let b=!0;return t.personaList().then(E=>{b&&X(E.personas)}).catch(()=>{}),()=>{b=!1}},[t]),i.useEffect(()=>{N&&(m(Mn(s)),_(typeof s.persona=="string"?Je(s.persona).layer:""))},[s]);const z=b=>{M(!1),m(b)},R=()=>{m(Mn(s)),_(typeof s.persona=="string"?Je(s.persona).layer:""),M(!0),$(""),v(!1)},P=()=>{const b=O.trim(),E=n[0],U=b!==""?{key:b,...E!==void 0?{model:E}:{}}:E!==void 0?{model:E}:void 0;G("test"),t.settingsTestConnection(s.provider,U).then(ee=>{V(ee)}).catch(ee=>o(`⚠️ 测试失败:${xt(ee)}`)).finally(()=>G(null))},A=(b,E)=>{t.submit(b).then(()=>o(E)).catch(U=>o(`⚠️ ${xt(U)}`))},H=b=>{t.settingsSet("model.defaultModel",{provider:s.provider,model:b}).then(()=>{o(`已设为默认:${s.provider}/${b} —— 下次启动 wudao ui 生效`),c()}).catch(E=>o(`⚠️ 默认模型保存失败:${xt(E)}`))},J=()=>{g("save");const b=O.trim();b!==""&&(G("save"),t.settingsSaveKey(s.provider,b).then(ee=>{$(""),o(`已保存 ${ee.provider} 的 Key(凭据文件现有 ${ee.keyCount} 个,权限 0600)——下会话可用`),c()}).catch(ee=>o(`⚠️ 保存失败:${xt(ee)}`)).finally(()=>G(null)));const E=_i(d.rows),U=s.custom?{...d.label.trim()!==""?{label:d.label.trim()}:{},baseUrl:d.baseUrl.trim(),...s.defaultModel!==""?{defaultModel:s.defaultModel}:{},...s.defaultContextLength!=null?{defaultContextLength:s.defaultContextLength}:{},...s.reasoningFormat!==void 0?{reasoningFormat:s.reasoningFormat}:{},...d.wire!==""?{wire:d.wire}:{},...d.persona!==void 0?{persona:d.persona}:{},...d.effort!==void 0?{effort:d.effort}:{},models:E}:{models:E,...d.label.trim()!==""&&d.label.trim()!==s.label?{label:d.label.trim()}:{},...d.baseUrl.trim()!==""?{baseUrl:d.baseUrl.trim()}:{},...s.reasoningFormat!==void 0?{reasoningFormat:s.reasoningFormat}:{},...s.wire!==void 0?{wire:s.wire}:{},...d.persona!==void 0?{persona:d.persona}:{},...d.effort!==void 0?{effort:d.effort}:{}};t.settingsSaveProvider(s.provider,U).then(ee=>{ee.ok?(M(!0),v(!1),o(`已保存供应商 ${ee.provider} 的注册表配置`),c()):o(`⚠️ 保存失败:${ee.error}`)}).catch(ee=>o(`⚠️ 保存失败:${xt(ee)}`)).finally(()=>g(null))},se=()=>{g("del"),t.settingsDeleteProvider(s.provider).then(b=>{b.ok?(o(`已删除供应商 ${s.provider}`),c()):o(`⚠️ 删除失败:${b.error}`)}).catch(b=>o(`⚠️ 删除失败:${xt(b)}`)).finally(()=>g(null))},he=b=>s.provider===a&&b===l,le=b=>r!=null&&r.provider===s.provider&&r.model===b,K=s.defaultContextLength??s.windowFallback,D=!zs({provider:s.provider},a),f=typeof d.persona=="string"?Je(d.persona).id:null,S=s.persona===void 0?"跟随全局":s.persona===null?"强制无":(()=>{const{id:b,layer:E}=Je(s.persona),U=E===""?b:`${b}:${E}`,ee=(q??[]).find(oe=>oe.id===b)?.displayName;return ee!=null?`${ee} (${U})`:U})(),w=s.effort===void 0?"跟随全局":s.effort===null?"强制不发送":s.effort;return e.jsxs("div",{className:"provider-detail",children:[e.jsxs("div",{className:"detail-head",children:[e.jsxs("div",{className:"detail-head-id",children:[e.jsx("span",{className:`dot ${s.status}`,title:Gn[s.status]}),e.jsx("strong",{children:s.provider==="wudao"?"兼容端点(wudao)":s.label})]}),e.jsxs("div",{className:"detail-head-tags",children:[e.jsx("span",{className:"meta mono-id",children:s.provider}),e.jsx("span",{className:"meta tag",children:s.custom?"自定义":"内置"})]})]}),e.jsxs("div",{className:"detail-group",children:[e.jsx("div",{className:"detail-group-title",children:"接入"}),e.jsxs("div",{className:"detail-field",children:[e.jsx("span",{className:"detail-field-label",children:"名称"}),p?e.jsx("input",{type:"text",className:"wudao-input ctl detail-label-input","aria-label":`${s.label} 显示名称`,value:d.label,onChange:b=>z(E=>({...E,label:b.target.value}))}):e.jsx("span",{className:"detail-read-text",children:s.label})]}),e.jsxs("div",{className:"detail-field",children:[e.jsx("span",{className:"detail-field-label",children:"baseUrl"}),p?e.jsx("input",{type:"text",className:"wudao-input ctl detail-baseurl","aria-label":`${s.label} Base URL`,placeholder:s.custom?void 0:"留空 = 使用编译内置端点;填入则覆盖",value:d.baseUrl,onChange:b=>z(E=>({...E,baseUrl:b.target.value}))}):e.jsx("span",{className:"card-endpoint",children:s.baseUrl??"(使用编译内置端点)"})]}),e.jsxs("div",{className:"detail-field",children:[e.jsx("span",{className:"detail-field-label",children:"协议"}),p&&s.custom?e.jsx("select",{className:"ctl detail-wire","aria-label":`${s.label} 协议`,title:"选 Anthropic 协议后,该供应商走 /v1/messages 适配器(无需再设 WUDAO_WIRE)",value:d.wire,onChange:b=>z(E=>({...E,wire:b.target.value})),children:ma.map(b=>e.jsx("option",{value:b.value,children:b.label},b.value))}):e.jsx("span",{className:"card-endpoint detail-wire-fixed",children:Jm(s.wire)})]}),e.jsxs("div",{className:"detail-field key-field",children:[e.jsx("span",{className:"detail-field-label",children:"API Key"}),p?e.jsxs("div",{className:"keyrow",children:[e.jsx("input",{type:"password",className:"wudao-input key-input ctl",placeholder:"粘贴 API Key — 随「保存修改」写入本机凭据文件(0600)","aria-label":`${s.label} API Key`,value:O,onChange:b=>$(b.target.value)}),e.jsx("button",{type:"button",className:"ctl",disabled:k!==null,onClick:P,children:"测试连接"})]}):e.jsxs("div",{className:"keyrow",children:[e.jsx("span",{className:`key-badge ${Vn(s).cls}`,title:Fi[s.keySource??"none"],children:Vn(s).text}),e.jsx("button",{type:"button",className:"ctl",disabled:k!==null,onClick:P,children:"测试连接"})]})]}),T!==null?e.jsx("div",{className:`test-result ${T.ok?"ok":`fail ${T.state}`}`,"data-state":T.state,children:T.message}):null]}),e.jsxs("div",{className:"model-manager",children:[e.jsxs("div",{className:"model-manager-head",children:["模型",e.jsx("button",{type:"button",className:"wudao primary model-config",onClick:()=>j(!0),children:"配置模型"})]}),d.rows.map((b,E)=>{const U=he(b.name);return e.jsxs("div",{className:`model-row model-read-row${U?" live":""}`,children:[e.jsx("span",{className:"model-row-name",children:b.name}),e.jsx("span",{className:"model-row-ctx",children:b.ctx.trim()!==""?b.ctx.trim():K!=null?`继承 ${K}`:"继承供应商默认"}),e.jsxs("span",{className:"model-row-state",children:[le(b.name)?e.jsx("button",{type:"button",className:"ctl model-star",disabled:!0,"aria-label":`已是默认模型 ${b.name}`,title:"启动默认模型(model.defaultModel)——下次启动 wudao ui 生效",children:e.jsx(ae,{name:"star",size:13,filled:!0})}):e.jsx("button",{type:"button",className:"ctl model-star","aria-label":`设为默认模型 ${b.name}`,title:"设为 wudao ui 的启动默认模型(model.defaultModel)——下次启动生效",disabled:b.name.trim()==="",onClick:()=>H(b.name.trim()),children:e.jsx(ae,{name:"star",size:13})}),U?e.jsx("span",{className:"model-badge live",title:"当前会话正在使用的模型",children:"当前"}):null,e.jsx("button",{type:"button",className:"ctl model-use","aria-label":`切换到 ${b.name}`,title:D?`submit /provider ${s.provider} (switches the endpoint)`:`submit /model ${b.name}`,disabled:!D&&b.name===l,onClick:()=>{const ee=yr({provider:s.provider,model:b.name},a);A(ee,D?`供应商 → ${s.provider} — 下一轮起切换端点,历史将全部重新处理(缓存全冷)`:`模型 → ${b.name} — 下一轮生效`)},children:"使用"})]})]},E)}),d.rows.length===0?e.jsx("div",{className:"model-empty muted",children:"尚未配置模型 —— 点击「配置模型」添加"}):null]}),e.jsxs("div",{className:"detail-group",children:[e.jsx("div",{className:"detail-group-title",children:"行为"}),e.jsxs("div",{className:"detail-field pair",children:[e.jsx("span",{className:"detail-field-label",children:"Persona 绑定"}),p?e.jsxs(e.Fragment,{children:[e.jsxs("select",{className:"ctl detail-persona","aria-label":"Persona 绑定",title:"跟随全局 = 用全局默认 persona;强制无 = 显式不挂 persona;其余 = 绑定该 persona",value:d.persona===void 0?$t:d.persona===null?Rt:Je(d.persona).id,onChange:b=>{const E=b.target.value;z(U=>({...U,persona:E===$t?void 0:E===Rt?null:Tt(E,W)}))},children:[e.jsx("option",{value:$t,children:"跟随全局"}),(q??[]).map(b=>e.jsx("option",{value:b.id,children:b.displayName!=null?`${b.displayName} (${b.id})`:b.id},b.id)),f!==null&&!(q??[]).some(b=>b.id===f)?e.jsx("option",{value:f,children:`${f}(未注册)`}):null,e.jsx("option",{value:Rt,children:"强制无"})]}),e.jsx("select",{className:"ctl detail-persona-layer","aria-label":"Persona 层",title:"限定绑定的 persona 只作用于选中的层(全部层 = 完整指纹)",value:W,onChange:b=>{const E=b.target.value;_(E),z(U=>({...U,persona:typeof U.persona=="string"?Tt(Je(U.persona).id,E):U.persona}))},children:da.map(b=>e.jsx("option",{value:b.value,children:b.label},b.value))})]}):e.jsx("span",{className:"detail-read-text",children:S})]}),e.jsxs("div",{className:"detail-field",children:[e.jsx("span",{className:"detail-field-label",children:"推理档绑定"}),p?e.jsxs("select",{className:"ctl detail-effort","aria-label":"推理档绑定",title:"跟随全局 = 用全局默认推理档;强制不发送 = 该供应商不发送 reasoning_effort;其余 = 绑定该档位",value:d.effort===void 0?$n:d.effort===null?Rn:d.effort,onChange:b=>{const E=b.target.value;z(U=>({...U,effort:E===$n?void 0:E===Rn?null:E}))},children:[e.jsx("option",{value:$n,children:"跟随全局"}),Xm.map(b=>e.jsx("option",{value:b,children:b},b)),e.jsx("option",{value:Rn,children:"强制不发送"})]}):e.jsx("span",{className:"detail-read-text",children:w})]})]}),e.jsx("div",{className:"detail-actions",children:p?e.jsxs(e.Fragment,{children:[N?null:e.jsx("span",{className:"detail-unsaved",children:"未保存的修改"}),e.jsx("button",{type:"button",className:"ctl detail-save",disabled:y!==null,onClick:J,children:"保存修改"}),e.jsx("button",{type:"button",className:"ctl detail-cancel",onClick:R,children:"取消编辑"}),s.custom?e.jsx("button",{type:"button",className:"ctl detail-del",disabled:y!==null,onClick:se,children:"删除供应商"}):null]}):e.jsx("button",{type:"button",className:"ctl detail-edit",onClick:()=>v(!0),children:"编辑"})}),x?e.jsx(Vm,{client:t,card:s,keyDraft:O,fallbackWindow:K,notify:o,refresh:c,onClose:()=>j(!1),onSaved:b=>m(E=>({...E,rows:b}))}):null]})}function Fs(t,s){const n=(s?.model?.choices??[]).filter(a=>a.provider===t.provider).map(a=>a.model);return n.includes(t.defaultModel)?n:[...n,t.defaultModel]}const Gn={ready:"可用","missing-key":"缺 Key","missing-endpoint":"缺端点"},Fi={env:"key: 环境变量",credentials:"key: 凭据文件",none:"key: 未配置"},lr={env:{cls:"on",text:"已配 · 环境变量"},credentials:{cls:"on",text:"已配 · 凭据文件"},none:{cls:"off",text:"未配 Key"}},Vn=t=>lr[t.keySource??"none"]??lr.none,rr=t=>t instanceof Error?t.message:String(t);function tp({client:t,settings:s,status:n,notify:a,refresh:l,loadError:r}){const[o,c]=i.useState(null),[d,m]=i.useState(""),[p,v]=i.useState(null),[x,j]=i.useState(!1),[N,M]=i.useState(!1),y=i.useRef(null);i.useEffect(()=>{N&&y.current?.focus()},[N]);const g=i.useRef({composing:!1,endedAt:0}),O=(R,P)=>{t.submit(R).then(()=>a(P)).catch(A=>a(`⚠️ ${rr(A)}`))},$=R=>{c(`del:${R}`),t.settingsDeleteProvider(R).then(P=>{P.ok?(a(`已删除供应商 ${R}`),l()):a(`⚠️ 删除失败:${P.error}`)}).catch(P=>a(`⚠️ 删除失败:${rr(P)}`)).finally(()=>c(null))},k=n?.model?.provider??s?.current.provider,G=n?.model?.label??s?.current.model??"",T=s?.providers??[],V=T.filter(R=>R.invalidReason===void 0),q=d.trim().toLowerCase(),X=q===""?T:T.filter(R=>{const P=[...R.models.map(A=>A.name),...Fs(R,n)];return[R.label,R.provider,R.baseUrl??"",R.endpoint??"",...P].join(`
322
+ `).toLowerCase().includes(q)}),W=x?null:V.find(R=>R.provider===p)??null,_=()=>{M(!1),j(!1)},z=s===null?null:x?{aria:"新增供应商",head:"新增供应商",body:e.jsx(Zm,{client:t,notify:a,refresh:l,onCreated:R=>{v(R),j(!1)},onCancel:_})}:W!==null?{aria:`供应商 ${W.label}`,head:`供应商 · ${W.provider==="wudao"?"兼容端点(wudao)":W.label}`,body:e.jsx(ep,{client:t,card:W,models:Fs(W,n),currentProvider:k,currentModel:G,defaultModel:s.defaultModel,notify:a,refresh:l},W.provider)}:null;return e.jsxs(e.Fragment,{children:[s?.envKey===!0?e.jsx("div",{className:"hint",children:"检测到环境变量 Key(WUDAO_API_KEY)——环境变量优先于凭据文件;保存到文件的 Key 只在没有环境变量时生效"}):null,e.jsxs("div",{className:"settings-section set-sec",children:[e.jsx("h3",{className:"section-title set-title",children:"供应商"}),s===null&&r!=null?e.jsxs("div",{className:"provider-load-error",role:"alert",children:[e.jsx("span",{className:"entry-error",children:`无法读取设置:${r}`}),e.jsx("button",{type:"button",className:"ctl",onClick:l,children:"重试"})]}):null,s===null&&r==null?e.jsx("div",{className:"muted",children:"读取中…"}):null,s!==null?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"provider-toolbar",children:[e.jsx("input",{type:"text",className:"wudao-input ctl provider-search","aria-label":"搜索供应商",placeholder:"搜索:名称 / id / baseUrl / 模型名",value:d,onChange:R=>m(R.target.value)}),e.jsx("button",{type:"button",className:"ctl",onClick:()=>{j(!0),M(!0)},children:"+ 添加供应商"})]}),e.jsx("div",{className:"provider-master",children:e.jsxs("div",{className:"provider-cards",children:[x?e.jsxs("div",{className:"provider-card provider-draft","data-draft":"true","data-provider":"__draft__","aria-current":"true",children:[e.jsxs("div",{className:"card-head",children:[e.jsx("span",{className:"dot draft",title:"未保存"}),e.jsx("span",{className:"card-name",children:"新增供应商"}),e.jsx("span",{className:"meta",children:"未保存"}),e.jsx("button",{type:"button",className:"ctl draft-cancel",onClick:()=>j(!1),children:"✕ 取消草稿"})]}),e.jsx("div",{className:"card-status",children:"在右侧补全信息后创建"})]}):null,X.map(R=>{if(R.invalidReason!==void 0)return e.jsxs("div",{className:"provider-card invalid-card","data-status":R.status,"data-invalid":"true","data-provider":R.provider,children:[e.jsxs("div",{className:"card-head",children:[e.jsx("span",{className:`dot ${R.status}`,title:"注册表条目无效"}),e.jsx("button",{type:"button",className:"card-name",disabled:!0,children:R.label}),e.jsx("span",{className:"meta",children:"注册表条目无效"})]}),e.jsx("div",{className:"invalid-reason",children:R.invalidReason}),e.jsx("div",{className:"keyrow",children:e.jsx("button",{type:"button",className:"ctl",disabled:o===`del:${R.provider}`,onClick:()=>$(R.provider),children:"删除"})})]},R.provider);const P=k===R.provider,A=W?.provider===R.provider,H=Vn(R),J=()=>{j(!1),v(R.provider),M(!0)};return e.jsxs("div",{className:"provider-card","data-status":R.status,"data-provider":R.provider,"aria-current":A?"true":void 0,onClick:J,children:[e.jsxs("div",{className:"card-head",children:[e.jsx("span",{className:`dot ${R.status}`,title:Gn[R.status]}),e.jsx("button",{type:"button",className:"card-name",title:"选中查看详情",onClick:J,children:R.provider==="wudao"?"兼容端点(wudao)":R.label}),P?e.jsx("span",{className:"meta tag-default",children:"默认"}):null,e.jsx("span",{className:`key-badge ${H.cls}`,title:Fi[R.keySource??"none"],children:H.text})]}),e.jsxs("div",{className:"card-status",children:[e.jsx("span",{className:"status-word",children:Gn[R.status]}),e.jsx("span",{className:"meta card-id",children:R.provider}),R.custom?e.jsx("span",{className:"meta",children:"自定义"}):null]}),e.jsx("div",{className:"card-endpoint",title:R.endpoint??void 0,children:R.endpoint??"(未设置端点 —— 需要 WUDAO_BASE_URL)"}),e.jsx("div",{className:"card-model-count",children:`${Fs(R,n).length} 个模型`}),e.jsx("div",{className:"card-actions",children:e.jsx("button",{type:"button",className:"ctl card-apply",disabled:P,title:P?"已是当前供应商":`submit /provider ${R.provider} (switches the endpoint)`,onClick:se=>{se.stopPropagation(),O(`/provider ${R.provider}`,`供应商 → ${R.provider} — 下一轮起切换端点,历史将全部重新处理(缓存全冷)`)},children:"应用"})})]},R.provider)}),X.length===0?e.jsx("div",{className:"provider-empty",children:"无匹配供应商"}):null]})}),N&&z!==null?e.jsx("div",{className:"scrim pvd-overlay",onClick:R=>{R.target===R.currentTarget&&_()},children:e.jsxs("div",{className:"modal-card pop-in pvd",role:"dialog","aria-modal":"true","aria-label":z.aria,ref:y,tabIndex:-1,onCompositionStart:()=>{g.current=qe(g.current)},onCompositionEnd:()=>{g.current=Fe(g.current,Date.now())},onKeyDown:R=>{He(R.nativeEvent,g.current,Date.now())||R.key==="Escape"&&(R.preventDefault(),R.stopPropagation(),_())},children:[e.jsxs("div",{className:"pvd-head",children:[e.jsx("h3",{children:z.head}),e.jsx("button",{type:"button",className:"ctl pvd-close","aria-label":"关闭",title:"关闭(丢弃未保存的修改)",onClick:_,children:"✕"})]}),e.jsx("div",{className:"pvd-body",children:z.body})]})}):null,e.jsx("div",{className:"hint",children:`凭据文件:${s.credentials.path}(现有 ${s.credentials.keyCount} 个 Key,仅本机)`})]}):null]})]})}const Et=[{id:"provider",label:"供应商"},{id:"permissions",label:"权限"},{id:"appearance",label:"外观"},{id:"preferences",label:"偏好"},{id:"persona",label:"Persona"},{id:"mcp",label:"MCP"},{id:"plugins",label:"插件"}],sp=t=>t instanceof Error?t.message:String(t),np=4e3;function ap({client:t,status:s,onClose:n,onModeApplied:a,onAccentPicked:l,pendingAsk:r=!1,language:o=null}){const[c,d]=i.useState(null),[m,p]=i.useState(null),[v,x]=i.useState([]),j=i.useRef(0),N=i.useRef(new Map),[M,y]=i.useState("provider"),g=i.useRef([]),O=_=>{if(!["ArrowRight","ArrowLeft","Home","End"].includes(_.key))return;_.preventDefault();const R=Et.findIndex(A=>A.id===M);let P;_.key==="Home"?P=0:_.key==="End"?P=Et.length-1:P=(R+(_.key==="ArrowRight"?1:-1)+Et.length)%Et.length,y(Et[P].id),g.current[P]?.focus()},$=i.useRef(null),k=i.useRef({composing:!1,endedAt:0});st(),i.useEffect(()=>{$.current?.focus()},[]);const G=i.useCallback(_=>{const z=N.current.get(_);z!==void 0&&(clearTimeout(z),N.current.delete(_)),x(R=>R.filter(P=>P.id!==_))},[]),T=i.useCallback(_=>{const z=++j.current;x(R=>[...R,{id:z,text:_}].slice(-3)),N.current.set(z,setTimeout(()=>{N.current.delete(z),x(R=>R.filter(P=>P.id!==z))},np))},[]);i.useEffect(()=>{const _=N.current;return()=>{for(const z of _.values())clearTimeout(z);_.clear()}},[]);const V=i.useCallback(()=>{t.settingsStatus().then(_=>{d(_),p(null)}).catch(_=>p(sp(_)))},[t]);i.useEffect(()=>{V()},[V]);const q=r?e.jsxs("div",{className:"settings-pending-ask",role:"status",children:[e.jsx(ae,{name:"triangle-alert",size:12})," 有权限请求待确认 — 关闭设置后处理"]}):null,X=m!==null?e.jsx("div",{className:"entry-error",children:`无法读取设置:${m}`}):null,W=e.jsxs(e.Fragment,{children:[X,q]});return e.jsxs("div",{className:"settings-page",ref:$,tabIndex:-1,onCompositionStart:()=>{k.current=qe(k.current)},onCompositionEnd:()=>{k.current=Fe(k.current,Date.now())},onKeyDown:_=>{He(_.nativeEvent,k.current,Date.now())||_.key==="Escape"&&(_.preventDefault(),n())},children:[e.jsxs("div",{className:"set",children:[e.jsxs("div",{className:"set-nav",children:[e.jsxs("div",{className:"settings-head",children:[e.jsx("h3",{children:"设置"}),e.jsx("button",{type:"button",className:"ctl",onClick:n,children:"返回会话"})]}),e.jsx("div",{className:"settings-tabs",role:"tablist","aria-label":"设置分区",onKeyDown:O,children:Et.map((_,z)=>e.jsx("button",{type:"button",role:"tab",id:`settings-tab-${_.id}`,"aria-controls":`settings-panel-${_.id}`,"aria-selected":M===_.id,"data-settings-tab":_.id,className:`sb-i${M===_.id?" on":""}`,onClick:()=>y(_.id),ref:R=>{g.current[z]=R},children:_.label},_.id))})]}),M==="provider"?e.jsxs("div",{role:"tabpanel",id:"settings-panel-provider","aria-labelledby":"settings-tab-provider",className:"set-body",children:[q,e.jsx(tp,{client:t,settings:c,status:s,notify:T,refresh:V,loadError:m})]}):null,M==="permissions"?e.jsxs("div",{role:"tabpanel",id:"settings-panel-permissions","aria-labelledby":"settings-tab-permissions",className:"set-body",children:[W,e.jsx(Rm,{client:t,notify:T,status:s})]}):null,M==="appearance"?e.jsxs("div",{role:"tabpanel",id:"settings-panel-appearance","aria-labelledby":"settings-tab-appearance",className:"set-body",children:[W,e.jsx(km,{client:t,notify:T,onAccentPicked:l})]}):null,M==="preferences"?e.jsxs("div",{role:"tabpanel",id:"settings-panel-preferences","aria-labelledby":"settings-tab-preferences",className:"set-body",children:[W,e.jsx(Gm,{client:t,settings:c,notify:T,refresh:V,onModeApplied:a,language:o,memorySignature:s?.memorySignature})]}):null,M==="persona"?e.jsxs("div",{role:"tabpanel",id:"settings-panel-persona","aria-labelledby":"settings-tab-persona",className:"set-body",children:[W,e.jsx(Um,{client:t,settings:c,notify:T,refresh:V})]}):null,M==="mcp"?e.jsxs("div",{role:"tabpanel",id:"settings-panel-mcp","aria-labelledby":"settings-tab-mcp",className:"set-body",children:[W,e.jsx(Em,{client:t})]}):null,M==="plugins"?e.jsxs("div",{role:"tabpanel",id:"settings-panel-plugins","aria-labelledby":"settings-tab-plugins",className:"set-body",children:[W,e.jsx(Am,{client:t,settings:c,notify:T,refresh:V})]}):null]}),v.length>0?e.jsx("div",{className:"settings-toasts",role:"status","aria-live":"polite",children:v.map(_=>{const z=At(_.text);return e.jsxs("div",{className:"settings-toast","data-variant":z.variant,children:[z.variant==="warn"?e.jsx(ae,{name:"triangle-alert",size:12}):z.variant==="ok"?e.jsx(ht,{size:12,className:"ic"}):null,e.jsx("span",{className:"settings-toast-text",children:z.text}),e.jsx("button",{type:"button",className:"settings-toast-close","aria-label":"关闭",onClick:()=>G(_.id),children:"×"})]},_.id)})}):null]})}const ir={ready:"可用","missing-key":"缺 Key","missing-endpoint":"缺端点"},lp=["读懂你的代码库 —— 直接读文件、检索、解释这段代码在做什么","动手干活 —— 修 bug、写页面、跑命令和测试,任何写入先征求你的同意","从一句话开始 —— 用大白话描述你想构建什么,它自己规划步骤并完成"],Tn=["欢迎","选择供应商","粘贴 Key","选择模型","权限","完成"],rt=t=>t instanceof Error?t.message:String(t);function rp({client:t,status:s,settings:n,onDone:a,step:l,total:r}){const[o,c]=i.useState(1),[d,m]=i.useState(null),[p,v]=i.useState(""),[x,j]=i.useState(!1),[N,M]=i.useState(null),[y,g]=i.useState(!1),[O,$]=i.useState(null),[k,G]=i.useState("workspace"),[T,V]=i.useState([]),[q,X]=i.useState([]),[W,_]=i.useState(!1),z=i.useRef(null),R=i.useRef({composing:!1,endedAt:0}),P=n.providers.find(E=>E.provider===d)??null,A=P!==null?Fs(P,s).filter(E=>E!==""):[],H=P?.status==="missing-endpoint",J=l??o,se=Math.max(1,r??Tn.length),he=Tn[Math.min(Math.max(J,1),Tn.length)-1]??"",le=`${String(J).padStart(2,"0")}/${String(se).padStart(2,"0")}`,K=`${Math.min(100,Math.round(J/se*100))}%`;st(),i.useEffect(()=>{z.current?.focus()},[]);const D=E=>{V(U=>[...U.slice(-4),E])},f=()=>{t.settingsSet("wizard.completedVersion",zn).catch(E=>{}),a()},S=E=>{X(U=>[...U,E])},w=()=>{if(d===null)return;const E=p.trim();if(E!==""){if(j(!0),M(null),H){t.settingsSaveKey(d,E).then(()=>{g(!0),v(""),D("Key 已保存到凭据文件(权限 0600)—— 仅保存在本机")}).catch(U=>{M({ok:!1,state:"http",message:`Key 保存失败:${rt(U)}`})}).finally(()=>j(!1));return}t.settingsTestConnection(d,{key:E,...P!==null?{model:P.defaultModel}:{}}).then(U=>{if(M(U),U.ok)return t.settingsSaveKey(d,E).then(()=>{g(!0),v(""),D("Key 已保存到凭据文件(权限 0600)—— 仅保存在本机")}).catch(ee=>D(`⚠️ Key 保存失败:${rt(ee)}`))}).catch(U=>M({ok:!1,state:"http",message:`测试失败:${rt(U)}`})).finally(()=>j(!1))}},b=()=>{if(d===null)return;const E=O??P?.defaultModel??"";t.settingsSet("permissions.defaultMode",k).then(()=>D(`新会话默认权限档 → ${k==="workspace"?"accept(默认档)":k}(已持久化)`)).catch(U=>S(`默认权限档写入失败:${rt(U)}`)),t.setMode(k).then(()=>D(`本会话权限档 → ${k==="workspace"?"accept(默认档)":k}`)).catch(U=>S(`权限档设置失败:${rt(U)}`)),t.settingsSet("ui.defaultMode","simple").then(()=>D("默认界面 → 简洁模式 —— 下次打开生效")).catch(U=>S(`默认界面写入失败:${rt(U)}`)),t.settingsSet("wizard.completedVersion",zn).catch(U=>S(`向导标记写入失败:${rt(U)}`)),t.submit(`/provider ${d}`).then(()=>D(`供应商 → ${d} — 本会话即刻生效(历史将在新端点重算,缓存全冷)`)).catch(U=>S(`provider 切换失败:${rt(U)} —— 请重新选择供应商后重试(保存的 Key 已生效)`)),E!==""&&t.submit(`/model ${E}`).then(()=>D(`模型 → ${E} — 下一轮生效`)).catch(U=>D(`⚠️ model 切换失败:${rt(U)}`)),c(6)};return e.jsxs("div",{className:"wizard-overlay",role:"dialog","aria-label":"新手向导",ref:z,tabIndex:-1,onCompositionStart:()=>{R.current=qe(R.current)},onCompositionEnd:()=>{R.current=Fe(R.current,Date.now())},onKeyDown:E=>{He(E.nativeEvent,R.current,Date.now())||E.key==="Escape"&&(E.preventDefault(),o===6?a():_(!0))},children:[e.jsxs("div",{className:"wiz pop-in",children:[e.jsx("div",{className:"wiz-bar","aria-hidden":!0,style:{width:K}}),e.jsxs("div",{className:"wiz-head",children:[e.jsx("span",{className:"wiz-step",children:le}),e.jsx("span",{className:"wiz-title",children:he})]}),o===1?e.jsxs("div",{className:"wiz-body","data-step":"welcome",children:[e.jsx("h2",{children:"wudao · 你的 AI 编程助手"}),e.jsx("p",{className:"wizard-sub",children:"三次点击完成配置,马上开始。"}),e.jsx("ul",{className:"wizard-points",children:lp.map(E=>e.jsx("li",{children:E},E))})]}):null,o===2?e.jsxs("div",{className:"wiz-body","data-step":"provider",children:[e.jsx("h3",{children:"选择模型供应商"}),e.jsx("p",{className:"wizard-sub",children:"选一个你有 API Key 的供应商 —— 之后随时可以换或再加。"}),e.jsxs("div",{className:"wizard-cards",children:[n.providers.length===0?e.jsx("div",{className:"wizard-empty",role:"status",children:"暂无可用供应商 —— 可先跳过,稍后在设置的「供应商」中添加"}):null,n.providers.map(E=>e.jsxs("button",{type:"button",className:`wizard-provider-card${d===E.provider?" sel":""}`,"data-status":E.status,"data-selected":d===E.provider,onClick:()=>m(E.provider),children:[e.jsx("span",{className:`dot ${E.status}`,title:ir[E.status]}),e.jsx("span",{className:"card-name",children:E.provider==="wudao"?"兼容端点(wudao)":E.label}),E.status==="missing-endpoint"?e.jsx("span",{className:"wizard-badge",title:"该供应商需要先设置 WUDAO_BASE_URL 端点;向导中粘贴的 Key 将不经连接测试直接保存",children:"需 BASE_URL"}):null,e.jsx("span",{className:"meta",children:ir[E.status]}),e.jsx("span",{className:"meta",children:`推荐模型 ${E.defaultModel}`})]},E.provider))]})]}):null,o===3?e.jsxs("div",{className:"wiz-body","data-step":"key",children:[e.jsx("h3",{children:`粘贴 ${P?.label??d} 的 API Key`}),e.jsx("p",{className:"wizard-sub",children:"Key 只写入本机凭据文件(~/.wudao/.credentials.yaml,权限 0600),不会出现在任何配置或界面上。"}),H?e.jsx("div",{className:"hint","data-endpoint-warning":"",children:"未配置 BASE_URL,连接测试跳过 —— 可稍后在设置中配置"}):null,e.jsxs("div",{className:"keyrow",children:[e.jsx("input",{type:"password",className:"wudao-input key-input",placeholder:"粘贴 API Key","aria-label":"API Key",value:p,disabled:y,onChange:E=>{v(E.target.value),g(!1),M(null)}}),e.jsx("button",{type:"button",className:"wudao",disabled:p.trim()===""||x||y,onClick:w,children:x?H?"保存中…":"测试中…":H?"保存 Key":"测试连接"})]}),N!==null?e.jsx("div",{className:`test-result ${N.ok?"ok":`fail ${N.state}`}`,"data-state":N.state,children:N.message}):null,y?e.jsxs("div",{className:"hint",children:[H?"Key 已保存(未配置 BASE_URL,连接测试已跳过)—— 可以继续。":"测试通过,Key 已保存 —— 可以继续。",e.jsx("button",{type:"button",className:"wizard-skip",onClick:()=>{g(!1),M(null)},children:"重新粘贴另一个 Key"})]}):null]}):null,o===4?e.jsxs("div",{className:"wiz-body","data-step":"model",children:[e.jsx("h3",{children:"选择模型"}),e.jsx("p",{className:"wizard-sub",children:`推荐使用 ${P?.defaultModel??""}(该供应商默认);有其他需要也可以换。`}),e.jsxs("div",{className:"card-models",children:[A.length===0?e.jsx("div",{className:"wizard-empty",role:"status",children:"该供应商暂无可用模型 —— 可返回上一步重选,或稍后在设置的「供应商」中刷新模型列表"}):null,A.map(E=>e.jsxs("button",{type:"button",className:`model-chip${O===E?" primary":""}`,onClick:()=>$(E),children:[E,E===P?.defaultModel?"(推荐)":""]},E))]})]}):null,o===5?e.jsxs("div",{className:"wiz-body","data-step":"permission",children:[e.jsx("h3",{children:"权限默认:accept"}),e.jsx("p",{className:"wizard-sub",children:"accept(接受编辑):工作区内自由读写,只读命令(git status 等)放行,其他操作会询问 —— 你可以改为 ask(每次询问)、auto(全自动)或 plan(只读探查);这里是新会话的起步档,本会话也即刻生效,之后能随时在设置里调整。"}),e.jsx(oa,{value:k,onChange:G,direction:"down"})]}):null,o===6?e.jsxs("div",{className:"wiz-body","data-step":"done",children:[e.jsxs("h3",{children:["完成 ",e.jsx(ae,{name:"party-popper",size:15})]}),e.jsx("p",{className:"wizard-sub",children:`已配置 ${P?.label??d}/${O??""} —— 从一句话开始试试:描述你想构建什么。`}),T.length>0?e.jsx("div",{className:"settings-receipts",children:T.map((E,U)=>{const ee=At(E);return e.jsxs("div",{"data-variant":ee.variant,children:[ee.variant==="warn"?e.jsx(ae,{name:"triangle-alert",size:12}):ee.variant==="ok"?e.jsx(ht,{size:12,className:"ic"}):null,e.jsx("span",{children:ee.text})]},`${U}-${E.slice(0,12)}`)})}):null,q.length>0?e.jsxs("div",{className:"entry-error",children:[q.slice(-3).map((E,U)=>e.jsx("div",{children:E},`${U}-${E.slice(0,12)}`)),q.length>3?e.jsx("div",{children:`+${q.length-3} more`}):null]}):null]}):null,e.jsxs("div",{className:"wizard-actions",children:[o>1&&o<6?e.jsx("button",{type:"button",className:"wizard-skip",onClick:f,children:"跳过,先逛逛"}):e.jsx("span",{}),e.jsxs("span",{className:"wizard-nav",children:[o>=3&&o<=5?e.jsx("button",{type:"button",className:"wudao",onClick:()=>c(o-1),children:"上一步"}):null,o===1?e.jsx("button",{type:"button",className:"wudao primary",onClick:()=>c(2),children:"开始配置"}):null,o===2?e.jsx("button",{type:"button",className:"wudao primary",disabled:d===null,onClick:()=>{v(""),M(null),g(!1),c(3)},children:"下一步"}):null,o===3?e.jsx("button",{type:"button",className:"wudao primary",disabled:!y,onClick:()=>{$(P?.defaultModel??null),c(4)},children:"下一步"}):null,o===4?e.jsx("button",{type:"button",className:"wudao primary",onClick:()=>c(5),children:"下一步"}):null,o===5?e.jsx("button",{type:"button",className:"wudao primary",onClick:b,children:"完成"}):null,o===6?e.jsx("button",{type:"button",className:"wudao primary",onClick:a,children:"开始使用"}):null]})]})]}),W?e.jsx("div",{className:"scrim wizard-confirm",onClick:E=>{E.target===E.currentTarget&&_(!1)},children:e.jsxs("div",{className:"modal-card pop-in",role:"dialog","aria-label":"退出向导",tabIndex:-1,onKeyDown:E=>{E.key==="Escape"&&(E.preventDefault(),E.stopPropagation(),_(!1))},children:[e.jsx("h3",{children:"退出配置向导?"}),e.jsx("div",{className:"muted",children:"将标记为已跳过(只读浏览模式),之后可从顶部横幅的「去配置」重新进入。"}),e.jsxs("div",{className:"btnrow",children:[e.jsx("button",{type:"button",className:"wudao danger",onClick:()=>{_(!1),f()},children:"跳过并退出"}),e.jsx("button",{type:"button",className:"wudao",onClick:()=>_(!1),children:"继续配置"})]})]})}):null]})}const et=12,Yn=4.5,or=2*Math.PI*Yn;function ip({ctx:t}){const[s,n]=i.useState(!1);if(i.useEffect(()=>{if(!s)return;const l=r=>{r.key==="Escape"&&n(!1)};return window.addEventListener("keydown",l),()=>window.removeEventListener("keydown",l)},[s]),t===null)return null;const a=t.used===null?0:Math.max(0,Math.min(1,t.used/t.window));return e.jsxs("span",{className:"ctx",children:[e.jsxs("button",{type:"button",className:"ctx-btn","aria-label":"上下文用量","aria-expanded":s,title:"上下文用量(点击查看)",onClick:()=>n(!s),children:[e.jsxs("svg",{width:et,height:et,viewBox:`0 0 ${et} ${et}`,"aria-hidden":!0,children:[e.jsx("circle",{cx:et/2,cy:et/2,r:Yn,fill:"none",stroke:"var(--hair-2)",strokeWidth:"2"}),e.jsx("circle",{cx:et/2,cy:et/2,r:Yn,fill:"none",stroke:t.nearLimit?"var(--warn)":"var(--accent)",strokeWidth:"2",strokeDasharray:`${a*or} ${or}`,transform:`rotate(-90 ${et/2} ${et/2})`})]}),e.jsx("span",{className:"ctx-num","aria-hidden":!0,children:`▲${t.used===null?"…":Oe(t.used)}`})]}),s?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"ctxmeter-backdrop",onClick:()=>n(!1)}),e.jsxs("span",{className:"ctxmeter-legend",role:"note",children:[e.jsx("span",{className:"row",children:t.used===null?"已用 …(本轮未回报)":`已用 ${Oe(t.used)}`}),e.jsx("span",{className:"row",children:`窗口 ${Oe(t.window)}`}),e.jsx("span",{className:"row",children:t.used===null?"占比 …":`占比 ${Math.round(a*100)}%`}),t.nearLimit?e.jsxs("span",{className:"row warn",children:[e.jsx(ae,{name:"triangle-alert",size:11})," 接近上限——过长时历史会自动压缩"]}):null]})]}):null]})}function op(t){const{busy:s,mode:n,commands:a,connected:l,ctx:r,lane:o,onLane:c,parked:d,onDropParked:m,onSubmit:p,onSideAsk:v,onInterrupt:x,onCycleMode:j,onShield:N,onDraftApplied:M,draft:y,onBufferChange:g,onImagesChange:O,imageSeed:$,onImageSeedApplied:k,onFilesChange:G,fileSeed:T,onFileSeedApplied:V,modelLabel:q,modelProvider:X,modelChoices:W,modelRecent:_,onPickModel:z,onPersistModelDefault:R,effort:P,efforts:A,onPickEffort:H,effortProviderLabel:J,onPersistEffortDefault:se,controlsLead:he}=t;return e.jsx("div",{className:"simple-composer",children:e.jsx(Ri,{busy:s,mode:n,commands:a,connected:l,onSubmit:p,onSideAsk:v,onInterrupt:x,onShield:N,onCycleMode:j,idlePlaceholder:"用大白话描述你想构建什么",busyPlaceholder:o==="queue"?"排队发送 —— 当前任务结束后处理":"注入当前运行的任务……",controlsLead:he,controlsPrefix:e.jsxs(e.Fragment,{children:[s?e.jsxs("div",{className:"lane-toggle",role:"radiogroup","aria-label":"发送方式",children:[e.jsxs("button",{type:"button",role:"radio","aria-checked":o==="queue",className:`chip${o==="queue"?" on":""}`,"data-lane":"queue",onClick:()=>c("queue"),title:"不打扰当前任务,等它结束后作为新任务发送 —— 当前任务结束后再处理你的消息",children:[e.jsx(ae,{name:"hourglass",size:13})," 排队"]}),e.jsxs("button",{type:"button",role:"radio","aria-checked":o==="steer",className:`chip${o==="steer"?" on":""}`,"data-lane":"steer",onClick:()=>c("steer"),title:"在下一次思考前插入,立即影响当前任务 —— 消息会在下一步前插入当前任务",children:[e.jsx(ae,{name:"zap",size:13})," 注入当前轮"]})]}):null,d.length>0?e.jsx("div",{className:"parked-row",children:d.map((le,K)=>e.jsxs("span",{className:"parked-chip",children:[e.jsx(ae,{name:"hourglass",size:12}),`${le.slice(0,24)}${le.length>24?"…":""}`,e.jsx("button",{type:"button",className:"drop","aria-label":"放弃这条排队消息",onClick:()=>m(K),children:"×"})]},K))}):null]}),controlsSuffix:e.jsx(ip,{ctx:r}),onDraftApplied:M,onBufferChange:g,onImagesChange:O,onImageSeedApplied:k,onFilesChange:G,onFileSeedApplied:V,modelLabel:q,modelProvider:X,modelChoices:W,modelRecent:_,onPickModel:z,onPersistModelDefault:R,effort:P,efforts:A,onPickEffort:H,...J!==void 0?{effortProviderLabel:J}:{},...se!==void 0?{onPersistEffortDefault:se}:{},...$!==void 0?{imageSeed:$}:{},...T!==void 0?{fileSeed:T}:{},...y!==void 0?{draft:y}:{}})})}function zi({awaiting:t,onOpenSession:s,onResumeLatest:n,onAskFromHistory:a}={}){const l=t!==void 0&&s!==void 0&&t.length>0?t:null;return e.jsxs("div",{className:"hero",children:[e.jsx("h1",{children:"你好呀,我是悟道Harness"}),e.jsx("p",{children:"你的桌面 AI 搭子——读文件、写代码、改 bug、查资料,都能直接在你电脑上替你干完;聊出来的东西也能顺手做成文档和表格。"}),e.jsx("p",{className:"hero-hint",children:"想到什么,直接打字吩咐我就行。"}),n!==void 0||a!==void 0?e.jsxs("div",{className:"hero-actions",children:[n!==void 0?e.jsx("button",{type:"button",className:"hero-act",onClick:n,children:"继续上次会话"}):null,a!==void 0?e.jsx("button",{type:"button",className:"hero-act",onClick:a,children:"从历史会话提问"}):null]}):null,l!==null?e.jsxs("p",{className:"hero-await",role:"status",children:["有 ",l.length," 个会话在等你授权:",l.map((r,o)=>e.jsxs(i.Fragment,{children:[o>0?"、":"",e.jsx("button",{type:"button",className:"hero-await-name",title:`回到「${r.title}」`,onClick:()=>s?.(r.id),children:r.title})]},r.id))]}):null]})}function Bi(t,s){const[n,a]=i.useState(null),l=i.useRef(t);return l.current=t,i.useEffect(()=>{if(!s)return;const r=l.current.recentWorkspaces;if(r===void 0)return;let o=!1;return r.call(l.current).then(c=>{o||a((c.workspaces??[]).slice(0,5))},()=>{o||a(c=>c??[])}),()=>{o=!0}},[s]),n}function Ki({client:t,root:s,connected:n,bootRoot:a,onPick:l,onOpenOther:r}){const[o,c]=i.useState(!1),d=Bi(t,o);return e.jsxs("div",{className:"ws-chip-wrap",children:[e.jsxs("button",{type:"button",className:"chip work",title:s,"aria-haspopup":"menu","aria-expanded":o,disabled:!n,onClick:()=>c(m=>!m),children:[e.jsx(es,{size:14})," ",Jt(s)," ",e.jsx(tt,{size:12})]}),o?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"ws-backdrop",onClick:()=>c(!1)}),e.jsxs("div",{className:"ws-menu",role:"menu",children:[a!==void 0&&a!==""?e.jsxs("button",{type:"button",className:"ws-item ws-default",role:"menuitem",title:a,onClick:()=>{c(!1),l(a)},children:["默认空间 · ",Jt(a)]}):null,(d??[]).map(m=>e.jsx("button",{type:"button",className:"ws-item",role:"menuitem",title:m.path,onClick:()=>{c(!1),l(m.path)},children:Jt(m.path)},m.path)),d===null?e.jsx("div",{className:"ws-loading",children:"加载中…"}):null,e.jsx("button",{type:"button",className:"ws-item ws-open-other",role:"menuitem",onClick:()=>{c(!1),r()},children:"打开其他目录…"})]})]}):null]})}function Ui(t){return!t.some(s=>s.kind==="user"||s.kind==="assistant"||s.kind==="tool"||s.kind==="edit"||s.kind==="error")}function cp(t){const{status:s,history:n,connected:a,commands:l,onSubmit:r,onInterrupt:o,onCycleMode:c,onAnswerPermission:d,onRecallSteer:m,onDetachTool:p,pendingAsk:v,onAnswerAskUser:x,onShield:j,notify:N,parked:M,onPark:y,onDropParked:g,onDraftApplied:O,draft:$,onBufferChange:k,onImagesChange:G,imageSeed:T,onImageSeedApplied:V,onFilesChange:q,fileSeed:X,onFileSeedApplied:W,modelLabel:_,modelProvider:z,modelChoices:R,modelRecent:P,onPickModel:A,onPersistModelDefault:H,effort:J,efforts:se,onPickEffort:he,effortProviderLabel:le,onPersistEffortDefault:K,workspaceRoot:D,bootRoot:f,onSwitchWorkspace:S,onOpenOtherWorkspace:w,rootCard:b,onAgentRootSwitch:E,onAgentRootKeep:U,fileOpsClient:ee,onSideAsk:oe,sideQas:Ne,onPromoteSideQa:ke}=t,me=s?.busy??!1,$e=s?.pendingPermission??null,ge=i.useRef(null),[Me,Ge]=i.useState("queue"),ze=i.useCallback((Q,ie,je)=>{if(me&&Me==="queue"){if(ie!==void 0&&ie.length>0)return N("⚠️ 排队消息暂不支持图片 —— 请等当前任务结束后再发"),!1;if(je!==void 0&&je.length>0)return N("⚠️ 排队消息暂不支持文件 —— 请等当前任务结束后再发"),!1;y(Q);return}return r(Q,ie,je)},[me,Me,N,y,r]),[Le,pe]=i.useState(!1),Be=i.useRef(!1),Te=i.useRef(!1),Pe=i.useCallback(Q=>{Be.current||(Be.current=!0,pe(!0),d(Q).then(ie=>{ie&&(Te.current=!0)}).catch(ie=>{N(`⚠️ 回答未送达(${ie instanceof Error?ie.message:String(ie)})——请再选一次`)}).finally(()=>{Be.current=!1,pe(!1)}))},[N,d]),Ve=i.useRef(null);i.useEffect(()=>{const Q=Ve.current;Q!==null&&$e===null&&!Te.current&&N("⚠️ 权限请求已结束(未被允许)——如需继续,请重新描述要做的事"),$e!==null&&Q===null&&(Te.current=!1),Ve.current=$e},[$e,N]);const{onScroll:Re,jump:F,show:Y}=Er(ge);return e.jsxs("div",{className:"simple","data-mode":"simple",children:[e.jsxs("div",{className:"chat",ref:ge,onScroll:Re,children:[Ui(n)?e.jsx(zi,{}):null,e.jsx(up,{history:n,onSubmit:r,busyTools:s?.live.busyTools??[]}),s?.planBoard!=null?e.jsx(Ii,{plan:s.planBoard,busy:me,onSubmit:r}):null,s!==null&&me&&$e===null?e.jsxs("div",{className:"turnlive",children:[e.jsx(Hh,{busy:me,live:s.live,queued:s.queued,onRecall:m}),s.live.reasoning!==""?e.jsx(la,{text:s.live.reasoning,streaming:s.live.thinking??!1,defaultOpen:!0}):null,s.live.answer!==""?e.jsx(ri,{text:s.live.answer}):null,s.live.busyTools.filter(Q=>!dp(Q,n)).map((Q,ie)=>e.jsx(li,{tool:Q,onDetach:p},`${Q.name}:${Q.summary}:${ie}`))]}):null,$e===null&&v!=null&&x!==void 0?e.jsx(Di,{inline:!0,question:v.question,options:v.options,onAnswer:Q=>{x(Q).catch(()=>{})},onDismiss:()=>{x().catch(()=>{})}}):null]}),e.jsx($r,{show:Y,onJump:F}),b!==null?e.jsx(Oi,{panelRoot:b.panelRoot,agentRoot:b.agentRoot,queued:b.queued,onSwitch:E,onKeep:U}):null,(Ne?.length??0)>0&&ke!==void 0?e.jsx(Mi,{qas:Ne??[],onPromote:ke}):null,$e===null?e.jsx(op,{busy:me,mode:s?.mode??"workspace",commands:l,connected:a,ctx:s?.ctxTokens??null,lane:Me,onLane:Ge,parked:M,onDropParked:g,onSubmit:ze,onSideAsk:oe,onInterrupt:o,onCycleMode:c,onShield:j,onDraftApplied:O,onBufferChange:k,onImagesChange:G,onImageSeedApplied:V,onFilesChange:q,onFileSeedApplied:W,modelLabel:_,modelProvider:z,modelChoices:R,modelRecent:P,onPickModel:A,onPersistModelDefault:H,effort:J,efforts:se,onPickEffort:he,...le!==void 0?{effortProviderLabel:le}:{},...K!==void 0?{onPersistEffortDefault:K}:{},controlsLead:e.jsx(Ki,{client:ee,root:D,bootRoot:f,connected:a,onPick:S,onOpenOther:w}),...T!==void 0?{imageSeed:T}:{},...X!==void 0?{fileSeed:X}:{},...$!==void 0?{draft:$}:{}}):e.jsxs(e.Fragment,{children:[e.jsx(gm,{ask:$e,busy:Le,onChoose:Q=>Pe(Q.allow)}),e.jsx("div",{className:"approval-note",children:"权限卡临时接管输入位置 · 处理后自动恢复"})]})]})}function dp(t,s){return t.name==="edit"?!0:t.name==="write_file"?s.some(n=>n.kind==="edit"&&n.path===t.summary):!1}function up({history:t,onSubmit:s,busyTools:n=[]}){const a=yi(t.length),l=a.hidden;return e.jsxs(e.Fragment,{children:[l>0?e.jsx("div",{ref:a.sentinelRef,className:"history-hydrate-sentinel",onClick:a.hydrate,role:"button",tabIndex:0,onKeyDown:r=>{(r.key==="Enter"||r.key===" ")&&a.hydrate()},children:Ni(l)}):null,t.slice(l).map((r,o)=>{const c=l+o;return e.jsxs(i.Fragment,{children:[o>0?e.jsx("div",{className:"entry-gap"}):null,e.jsx("div",{className:"entry",children:r.kind==="tool"||r.kind==="edit"?e.jsxs(e.Fragment,{children:[e.jsx(ni,{entry:r,running:r.kind==="edit"?Uu(r,n):!1}),r.kind==="tool"&&r.isError===!0&&ia(r.resultPreview??"")!==null?e.jsx(vi,{text:r.resultPreview??"",onRetry:s}):null]}):r.kind==="error"?e.jsx(xh,{text:r.text,onAction:s}):e.jsx(Js,{entry:r})})]},Mt(r,c))})]})}const hp=["model","tool","agent","ui","system"],Xe=t=>typeof t=="number"&&Number.isFinite(t)?t:0,Vt=t=>t>=1e3?`${(t/1e3).toFixed(1)}s`:`${Math.round(t)}ms`,it=t=>t>=1e3?`${(t/1e3).toFixed(1)}k`:String(t);function mp(t,s){const n={};let a=0,l=0,r=0,o=0,c=0,d=0;const m=new Map;let p=0,v=0,x=0,j=0,N=0,M=0;const y=1e3,g=60,O=new Array(g).fill(0);for(const $ of t){n[$.cat]=(n[$.cat]??0)+1;const k=Math.floor((s-$.ts)/y);if(k>=0&&k<g&&(O[g-1-k]=(O[g-1-k]??0)+1),$.cat==="model"&&$.name==="model.call")a+=1,l+=Xe($.dur),r+=Xe($.data?.tokensIn),o+=Xe($.data?.tokensOut),c+=Xe($.data?.cacheHitTokens),$.data?.ok===!1&&(d+=1);else if($.cat==="tool"&&$.name==="tool.finish"){const G=String($.data?.name??"?"),T=m.get(G)??{count:0,dur:0,errs:0,bytes:0};T.count+=1,T.dur+=Xe($.dur),T.bytes=Math.max(T.bytes,Xe($.data?.resultBytes??0)),$.data?.ok===!1&&(T.errs+=1),m.set(G,T)}else $.cat==="agent"&&$.name==="agent.turn"?(p+=1,v+=Xe($.dur),x+=Xe($.data?.toolCalls),j+=Xe($.data?.reasoningChars),N+=Xe($.data?.answerChars)):$.cat==="agent"&&$.name==="agent.retry"&&(M+=1)}return{byCat:n,model:{count:a,avgDur:a===0?0:l/a,tokensIn:r,tokensOut:o,cacheHit:c,errs:d},tools:[...m.entries()].map(([$,k])=>({name:$,count:k.count,avgDur:k.dur/k.count,errs:k.errs,bytes:k.bytes})).sort(($,k)=>k.count-$.count).slice(0,12),turns:{count:p,avgDur:p===0?0:v/p,toolCalls:x,reasoningChars:j,answerChars:N,retries:M},buckets:O}}function pp(t){const s=Math.max(1,...t);return t.map((n,a)=>`${(a/(t.length-1)*100).toFixed(2)},${(40-n/s*38).toFixed(2)}`).join(" ")}function fp({client:t,status:s,connected:n,onClose:a}){const l=ce.useRef([]),[r,o]=ce.useState(0),[c,d]=ce.useState("*"),[m,p]=ce.useState(!1),[v,x]=ce.useState("unknown"),[j,N]=ce.useState(null),M=ce.useRef([]),[y,g]=ce.useState("events"),O=ce.useRef(!1);O.current=m,ce.useEffect(()=>{if(!n)return;let T=!0;t.probeRecent(void 0,200).then(W=>{!T||!Array.isArray(W)||(l.current=[...W.slice(-500).map(_=>_),...l.current].slice(-500),o(_=>_+1))}).catch(()=>{}),t.probeStats().then(W=>{if(!T)return;const _=Object.values(W??{}).reduce((z,R)=>z+(typeof R=="object"&&R!==null&&"count"in R?Xe(R.count):0),0);x(_===0&&l.current.length===0?"off":"on")}).catch(()=>{}),t.probeStream().catch(()=>{});const V=t.onProbe(W=>{O.current||(l.current.push(W),l.current.length>500&&l.current.splice(0,l.current.length-500))});t.sessionAnatomy().then(W=>{T&&N({systemPrompt:W.systemPrompt,messages:W.messages??[]})}).catch(()=>{});const q=t.onLoopEvent((W,_)=>{if(O.current)return;const z=W,R=M.current;if(z.type==="reasoning_delta"||z.type==="assistant_delta"){const P=R[R.length-1];P!==void 0&&P.kind==="turn"&&P.turn===(z.turn??0)?z.type==="reasoning_delta"?P.reasoning+=z.text??"":P.answer+=z.text??"":R.push({kind:"turn",at:_,turn:z.turn??0,reasoning:z.type==="reasoning_delta"?z.text??"":"",answer:z.type==="assistant_delta"?z.text??"":""})}else if(z.type==="tool_call_started")R.push({kind:"tool",at:_,id:z.toolCallId??"?",name:z.toolName??"?",input:Xn(z.input)});else if(z.type==="tool_call_finished"){const P=[...R].reverse().find(A=>A.kind==="tool"&&A.id===z.toolCallId);P!==void 0&&P.kind==="tool"&&(P.output=typeof z.result=="string"?z.result:Xn(z.result),P.isError=z.isError===!0,P.durMs=z.durationMs)}R.length>300&&R.splice(0,R.length-300)}),X=setInterval(()=>o(W=>W+1),250);return()=>{T=!1,V(),q(),clearInterval(X),t.probeStream("off").catch(()=>{})}},[t,n]);const $=ce.useMemo(()=>mp(l.current,Date.now()),[r]),k=ce.useMemo(()=>l.current.filter(T=>c==="*"||T.cat===c).slice(-60).reverse(),[r,c]),G=()=>{t.probeEnable(!0).then(()=>{x("on"),l.current=[],o(T=>T+1)}).catch(()=>{})};return e.jsxs("div",{className:"dash","data-testid":"dash",children:[e.jsxs("div",{className:"dash-head",children:[e.jsx("h2",{children:"监控"}),e.jsxs("span",{className:"k",style:{color:"var(--text-2)"},children:[s?.model?.label??"-"," · ",s?.busy?"运行中":"空闲",s?.cachePercent!=null?` · 缓存 ${s.cachePercent}%`:"",s?.ctxTokens!=null&&s.ctxTokens.used!=null?` · ctx ${it(s.ctxTokens.used)}/${it(s.ctxTokens.window)}`:""]}),e.jsx("span",{className:"spacer"}),e.jsxs("div",{className:"dash-cat-chips",role:"tablist",children:[e.jsx("button",{type:"button",role:"tab","aria-selected":y==="events",className:y==="events"?"on":void 0,onClick:()=>g("events"),children:"探针"}),e.jsx("button",{type:"button",role:"tab","aria-selected":y==="anatomy",className:y==="anatomy"?"on":void 0,onClick:()=>g("anatomy"),children:"会话解剖"})]}),e.jsx("button",{type:"button",className:"icobtn","aria-label":"返回会话",title:"返回会话",onClick:a,children:e.jsx(ts,{})})]}),y==="events"&&v==="off"?e.jsxs("div",{className:"dash-banner",role:"status",children:["探针总闸未开启(WUDAO_PROBE)——开启后 agent/工具事件下一轮起可见;model.call 计量需带 WUDAO_PROBE=on 重启生效。",e.jsx("button",{type:"button",onClick:G,children:"现在开启"})]}):null,y==="events"?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"dash-kpis",children:[e.jsxs("div",{className:"dash-kpi",children:[e.jsx("span",{className:"k",children:"模型调用"}),e.jsx("span",{className:"v",children:$.model.count}),e.jsxs("span",{className:"s",children:["均 ",Vt($.model.avgDur),$.model.errs>0?` · 败 ${$.model.errs}`:""]})]}),e.jsxs("div",{className:"dash-kpi",children:[e.jsx("span",{className:"k",children:"Token 流量"}),e.jsx("span",{className:"v",children:it($.model.tokensIn+$.model.tokensOut)}),e.jsxs("span",{className:"s",children:["入 ",it($.model.tokensIn)," · 出 ",it($.model.tokensOut)," · 缓存命中 ",it($.model.cacheHit)]})]}),e.jsxs("div",{className:"dash-kpi",children:[e.jsx("span",{className:"k",children:"工具调用"}),e.jsx("span",{className:"v",children:($.byCat.tool??0)/2>=0?Math.round(($.byCat.tool??0)/2):0}),e.jsxs("span",{className:"s",children:["完成 ",($.byCat.tool??0)%2===0?($.byCat.tool??0)/2:Math.floor(($.byCat.tool??0)/2),"(start+finish 合计 ",$.byCat.tool??0," 帧)"]})]}),e.jsxs("div",{className:"dash-kpi",children:[e.jsx("span",{className:"k",children:"回合"}),e.jsx("span",{className:"v",children:$.turns.count}),e.jsxs("span",{className:"s",children:["均 ",Vt($.turns.avgDur)," · 工具 ",$.turns.toolCalls," · 重试 ",$.turns.retries]})]}),e.jsxs("div",{className:"dash-kpi",children:[e.jsx("span",{className:"k",children:"思考/正文"}),e.jsxs("span",{className:"v",children:[it($.turns.reasoningChars),"/",it($.turns.answerChars)]}),e.jsx("span",{className:"s",children:"累计字符"})]})]}),e.jsxs("div",{className:"dash-chart",children:[e.jsx("span",{className:"k",children:"事件速率 · 近 60s(每秒一格)"}),e.jsx("svg",{viewBox:"0 0 100 40",preserveAspectRatio:"none","aria-hidden":"true",children:e.jsx("polyline",{fill:"none",stroke:"currentColor",strokeWidth:"1",points:pp($.buckets)})})]}),e.jsxs("div",{className:"dash-cols",children:[e.jsxs("div",{className:"dash-panel",children:[e.jsx("div",{className:"dash-panel-head",children:"工具聚合(按完成次数)"}),e.jsx("div",{className:"dash-scroll",children:$.tools.length===0?e.jsx("div",{className:"dash-empty",children:"暂无工具事件"}):e.jsxs("table",{className:"dash-tools",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"工具"}),e.jsx("th",{children:"次数"}),e.jsx("th",{children:"均耗时"}),e.jsx("th",{children:"错误"}),e.jsx("th",{children:"结果B"})]})}),e.jsx("tbody",{children:$.tools.map(T=>e.jsxs("tr",{children:[e.jsx("td",{children:T.name}),e.jsx("td",{children:T.count}),e.jsx("td",{children:Vt(T.avgDur)}),e.jsx("td",{children:T.errs>0?T.errs:""}),e.jsx("td",{children:T.bytes>0?it(T.bytes):""})]},T.name))})]})})]}),e.jsxs("div",{className:"dash-panel",children:[e.jsxs("div",{className:"dash-panel-head",children:["实时事件",e.jsx("span",{className:"spacer"}),e.jsx("div",{className:"dash-cat-chips",children:["*",...hp].map(T=>e.jsx("button",{type:"button",className:c===T?"on":void 0,onClick:()=>d(T),children:T==="*"?"全部":T},T))}),e.jsx("button",{type:"button",className:"icobtn","aria-label":m?"继续":"暂停",title:m?"继续":"暂停",onClick:()=>p(T=>!T),children:m?"继续":"暂停"})]}),e.jsx("div",{className:"dash-scroll dash-stream",children:k.length===0?e.jsx("div",{className:"dash-empty",children:"等待事件…(发一条消息试试)"}):k.map((T,V)=>e.jsxs("div",{className:`dash-row cat-${T.cat}`,children:[e.jsx("span",{className:"t",children:new Date(T.ts).toLocaleTimeString("zh-CN",{hour12:!1})}),e.jsx("span",{className:`c cat-${T.cat}`,children:T.cat}),e.jsx("span",{className:"n",children:T.name}),e.jsxs("span",{className:"d",children:[T.dur!==void 0?`${Vt(T.dur)} `:"",T.data!==void 0?vp(T):""]})]},`${T.ts}:${T.name}:${V}`))})]})]})]}):null,y==="anatomy"?e.jsxs("div",{className:"dash-cols dash-anatomy",children:[e.jsxs("div",{className:"dash-panel",children:[e.jsxs("div",{className:"dash-panel-head",children:["持久上下文(",j?.messages.length??0," 条)",e.jsx("span",{className:"spacer"}),e.jsx("button",{type:"button",className:"icobtn","aria-label":"刷新",title:"刷新",onClick:()=>{t.sessionAnatomy().then(T=>N({systemPrompt:T.systemPrompt,messages:T.messages??[]})).catch(()=>{})},children:e.jsx(Ar,{})})]}),e.jsxs("div",{className:"dash-scroll",children:[e.jsxs("details",{className:"dash-prompt",children:[e.jsxs("summary",{children:["系统提示词 · ",j?.systemPrompt.length??0," 字"]}),e.jsx("pre",{children:j?.systemPrompt??"(暂无——老 server 或无缝)"})]}),j===null?e.jsx("div",{className:"dash-empty",children:"读取中…"}):j.messages.length===0?e.jsx("div",{className:"dash-empty",children:"(空会话)"}):j.messages.map((T,V)=>e.jsx(xp,{row:T},V))]})]}),e.jsxs("div",{className:"dash-panel",children:[e.jsx("div",{className:"dash-panel-head",children:"实时时间线(思考 / 工具入参·出参·异常)"}),e.jsx("div",{className:"dash-scroll dash-stream",children:M.current.length===0?e.jsx("div",{className:"dash-empty",children:"等待事件…(发一条消息,思考与工具调用会实时出现在这里)"}):[...M.current].reverse().map((T,V)=>T.kind==="turn"?e.jsxs("div",{className:"dash-row",children:[e.jsx("span",{className:"t",children:new Date(T.at).toLocaleTimeString("zh-CN",{hour12:!1})}),e.jsxs("span",{className:"c",children:["turn",T.turn]}),T.reasoning!==""?e.jsxs("details",{className:"dash-detail",children:[e.jsxs("summary",{children:["思考 · ",T.reasoning.length," 字"]}),e.jsx("pre",{children:T.reasoning})]}):null,T.answer!==""?e.jsxs("details",{className:"dash-detail",open:!0,children:[e.jsxs("summary",{children:["正文 · ",T.answer.length," 字"]}),e.jsx("pre",{children:T.answer})]}):null]},`t${V}`):e.jsxs("div",{className:"dash-row",children:[e.jsx("span",{className:"t",children:new Date(T.at).toLocaleTimeString("zh-CN",{hour12:!1})}),e.jsx("span",{className:"c",style:T.isError===!0?{color:"var(--danger)"}:void 0,children:T.isError===!0?"异常":"工具"}),e.jsxs("details",{className:"dash-detail",children:[e.jsxs("summary",{children:[T.name,T.durMs!==void 0?` · ${Vt(T.durMs)}`:"",T.isError===!0?" · 异常":""]}),T.input!==void 0?e.jsx("pre",{children:`入参
323
+ ${T.input}`}):null,T.output!==void 0?e.jsx("pre",{children:`出参
324
+ ${T.output}`}):null]})]},`t${V}`))})]})]}):null]})}function xp({row:t}){const s=t.role??"?";return e.jsxs("div",{className:`dash-msg role-${s}`,children:[e.jsxs("div",{className:"dash-msg-head",children:[e.jsx("span",{className:"role",children:s==="tool"?`tool·${t.name??t.toolCallId??"?"}`:s}),t.isError===!0?e.jsx("span",{className:"err",children:"异常"}):null]}),typeof t.reasoning=="string"&&t.reasoning!==""?e.jsxs("details",{className:"dash-detail",children:[e.jsxs("summary",{children:["思考 · ",t.reasoning.length," 字"]}),e.jsx("pre",{children:t.reasoning})]}):null,t.toolCalls!==void 0&&t.toolCalls.length>0?e.jsxs("details",{className:"dash-detail",open:!0,children:[e.jsxs("summary",{children:["工具调用 · ",t.toolCalls.length," 个"]}),t.toolCalls.map((n,a)=>e.jsx("pre",{children:`${n.name??"?"}(${Xn(n.arguments)})`},a))]}):null,typeof t.content=="string"&&t.content!==""?e.jsxs("details",{className:"dash-detail",open:s==="user",children:[e.jsxs("summary",{children:[s==="user"?"用户提示词":"内容"," · ",t.content.length," 字"]}),e.jsx("pre",{children:t.content})]}):null]})}const Xn=t=>{try{return JSON.stringify(t)??""}catch{return String(t)}};function vp(t){const s=t.data??{},n=[];typeof s.model=="string"&&n.push(s.model),typeof s.name=="string"&&n.push(s.name),typeof s.toolCalls=="number"&&n.push(`工具×${s.toolCalls}`),typeof s.reasoningChars=="number"&&s.reasoningChars>0&&n.push(`思${s.reasoningChars}字`),typeof s.answerChars=="number"&&s.answerChars>0&&n.push(`文${s.answerChars}字`),typeof s.reason=="string"&&n.push(s.reason),s.ok===!1&&n.push("失败");const a=n.join(" ");return a.length>60?`${a.slice(0,60)}…`:a}function Jn(t){return[...t].sort((s,n)=>s.type!==n.type?s.type==="dir"?-1:1:s.name<n.name?-1:s.name>n.name?1:0)}const gp=new Set(["node_modules","__pycache__","dist","target"]);function jp(t){return t.hidden===!0||t.name.startsWith(".")||gp.has(t.name)}function An(t){const s=t.split("/").filter(n=>n!=="");return s[s.length-1]??t}const cr=t=>t instanceof Error?t.message:String(t);function As(t,s){return t===""?s:`${t}/${s}`}function bp(t,s){if(!t.startsWith("/"))return null;const n=s.replace(/^\/+/,"");return n===""?t:`${t}/${n}`}const dr=(t,s)=>{const n=bp(t,s);n!==null&&Qt("reveal_path",{path:n})};function ur(){return e.jsxs("div",{className:"tree-loading",role:"status",children:[e.jsx("span",{className:"tree-spin","aria-hidden":!0}),"加载中…"]})}function hr({message:t,onRetry:s}){return e.jsx("div",{className:"tree-err",role:"button",tabIndex:0,title:t,onClick:s,onKeyDown:n=>{(n.key==="Enter"||n.key===" ")&&(n.preventDefault(),s())},children:"加载失败 · 点击重试"})}function yp({client:t,workspaceRoot:s,bootRoot:n,selectedPath:a,onSelect:l,onAtMention:r,refreshKey:o,onSwitchWorkspace:c,onOpenOtherWorkspace:d,onPathsChange:m,modifiedPaths:p,modifiedKey:v,onManualRefresh:x}){const[j,N]=i.useState(new Map),[M,y]=i.useState(new Set),[g,O]=i.useState(!1),[$,k]=i.useState(0),[G,T]=i.useState(""),[V,q]=i.useState(!1),X=Bi(t,V),[W,_]=i.useState(null),z=i.useRef(t);z.current=t;const R=i.useRef(M);R.current=M;const P=D=>{z.current.fileTree(D).then(f=>N(S=>new Map(S).set(D,{entries:Jn(f.entries),error:null})),f=>N(S=>new Map(S).set(D,{entries:[],error:cr(f)})))},A=`${o}#${$}`;i.useEffect(()=>{let D=!1;N(new Map);const f=[...R.current];return Promise.all(["",...f].map(async S=>{try{const w=await z.current.fileTree(S);return[S,{entries:Jn(w.entries),error:null}]}catch(w){return[S,{entries:[],error:cr(w)}]}})).then(S=>{D||N(new Map(S))}),()=>{D=!0}},[A]);const H=D=>{const f=M.has(D);y(S=>{const w=new Set(S);return f?w.delete(D):w.add(D),w}),!f&&!j.has(D)&&P(D),l(D,!0)},J=(D,f)=>f?[{label:"复制路径",onSelect:()=>Us(D)},{label:"在 viewer 打开目录列表",onSelect:()=>l(D,!0)},{label:"在访达中显示",onSelect:()=>dr(s,D)}]:[{label:"复制路径",onSelect:()=>Us(D)},{label:"@-mention 到输入",onSelect:()=>r(D)},{label:"在 viewer 打开",onSelect:()=>l(D,!1)},{label:"在访达中显示",onSelect:()=>dr(s,D)}],se=G.trim().toLowerCase(),he=(D,f)=>{if(D.name.toLowerCase().includes(se))return!0;if(D.type!=="dir")return!1;const S=j.get(f);return S!==void 0&&S.entries.some(w=>he(w,As(f,w.name)))};i.useEffect(()=>{if(m===void 0)return;const D=[],f=(w,b)=>{for(const E of b){const U=As(w,E.name);D.push(U);const ee=E.type==="dir"?j.get(U):void 0;ee!==void 0&&f(U,ee.entries)}},S=j.get("");S!==void 0&&S.error===null&&f("",S.entries),m(D)},[j,m]);const le=(D,f,S)=>D.filter(w=>g||!jp(w)).filter(w=>se===""||he(w,As(f,w.name))).map(w=>{const b=As(f,w.name),E=w.type==="dir",U=E&&M.has(b),ee=E&&U?j.get(b):void 0,oe=!E&&(p?.has(b)??!1),Ne=()=>{E?H(b):l(b,!1)};return e.jsxs("div",{className:`tree-node ${w.type}${oe?" modified":""}`,"data-path":b,children:[e.jsxs("div",{className:`ft-row${a===b?" on":""}`,role:"button",tabIndex:0,onKeyDown:ke=>{(ke.key==="Enter"||ke.key===" ")&&(ke.preventDefault(),Ne())},onClick:Ne,onContextMenu:ke=>{ke.preventDefault(),_({x:ke.clientX,y:ke.clientY,path:b,isDir:E})},children:[Array.from({length:S},(ke,me)=>e.jsx("span",{className:"ft-indent"},me)),e.jsx("span",{className:"caret",children:E?U?e.jsx(tt,{size:12}):e.jsx(bt,{size:12}):null}),e.jsx("span",{className:"ico",children:E?U?e.jsx(Zc,{size:14}):e.jsx(es,{size:14}):e.jsx(ta,{size:14})}),e.jsx("span",{className:"name",children:w.name}),E?null:e.jsx("button",{type:"button",className:"at-btn",title:`@ ${b}`,onClick:ke=>{ke.stopPropagation(),r(b)},children:"@"})]}),E&&U?e.jsx("div",{className:"kids",children:ee===void 0?e.jsx(ur,{}):ee.error!==null?e.jsx(hr,{message:ee.error,onRetry:()=>P(b)}):le(ee.entries,b,S+1)}):null]},w.name)}),K=j.get("");return e.jsxs("div",{className:"filetree",children:[e.jsxs("div",{className:"tree-top",children:[e.jsx("button",{type:"button",className:"ws-switcher",title:s,"aria-haspopup":"menu","aria-expanded":V,onClick:()=>q(D=>!D),children:e.jsxs("span",{className:"tree-root",children:[e.jsx(es,{size:14})," ",An(s)," ",e.jsx(tt,{size:12})]})}),e.jsx("button",{type:"button",className:"tree-toggle","aria-pressed":g,"aria-label":g?"隐藏隐藏项":"显示隐藏项",title:g?"隐藏隐藏项":"显示隐藏项",onClick:()=>O(D=>!D),children:e.jsx(ad,{size:14})}),e.jsx("button",{type:"button",className:"tree-refresh","aria-label":"刷新",title:"刷新",onClick:()=>{k(D=>D+1),x?.()},children:e.jsx(Ar,{size:14})}),V?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"ws-backdrop",onClick:()=>q(!1)}),e.jsxs("div",{className:"ws-menu",role:"menu",children:[n!==void 0&&n!==""?e.jsxs("button",{type:"button",className:"ws-item ws-default",role:"menuitem",title:n,onClick:()=>{q(!1),c?.(n)},children:["默认空间 · ",An(n)]}):null,(X??[]).map(D=>e.jsx("button",{type:"button",className:"ws-item",role:"menuitem",title:D.path,onClick:()=>{q(!1),c?.(D.path)},children:An(D.path)},D.path)),X===null?e.jsx("div",{className:"ws-loading",children:"加载中…"}):null,e.jsx("button",{type:"button",className:"ws-item ws-open-other",role:"menuitem",onClick:()=>{q(!1),d?.()},children:"打开其他目录…"})]})]}):null]}),e.jsx("div",{className:"tree-filter",children:e.jsx("input",{type:"text",value:G,placeholder:"过滤…","aria-label":"过滤文件树",onChange:D=>T(D.target.value)})}),e.jsx("div",{className:"tree-body",children:K===void 0?e.jsx(ur,{}):K.error!==null?e.jsx(hr,{message:K.error,onRetry:()=>P("")}):K.entries.length===0?e.jsx("div",{className:"tree-empty",role:"status",children:"空目录"}):le(K.entries,"",0)}),W!==null?e.jsx(Gr,{x:W.x,y:W.y,items:J(W.path,W.isDir),onClose:()=>_(null)}):null]})}function Np({path:t,value:s,language:n,dirty:a,saving:l,conflict:r,onChange:o,onSave:c,onOverwrite:d,onReopen:m,onDiscard:p}){const v=i.useRef(null),x=i.useRef(null),j=i.useRef(null),N=s.split(`
325
+ `),M=()=>{const g=v.current;g!==null&&(x.current!==null&&(x.current.scrollTop=g.scrollTop,x.current.scrollLeft=g.scrollLeft),j.current!==null&&(j.current.scrollTop=g.scrollTop))},y=g=>{if(g.key==="Tab"){g.preventDefault();const O=g.currentTarget,$=O.selectionStart;o(`${s.slice(0,$)} ${s.slice(O.selectionEnd)}`);const k=$+2;requestAnimationFrame(()=>O.setSelectionRange(k,k))}else g.key==="Escape"&&!a&&(g.preventDefault(),p())};return e.jsxs("div",{className:"editor-root",children:[e.jsxs("div",{className:"fv-edit",children:[e.jsx("button",{type:"button",className:"fv-btn primary",disabled:!a||l,onClick:c,children:"保存"}),e.jsx("button",{type:"button",className:"fv-btn",disabled:l,onClick:p,children:"放弃"}),e.jsx("span",{className:"grow"}),e.jsx("span",{className:"fv-edit-path",children:t})]}),r!==null?e.jsxs("div",{className:"fv-conflict",role:"alert",children:[e.jsxs("span",{children:[e.jsx(ae,{name:"triangle-alert",size:12})," 文件已被外部修改"]}),e.jsx("button",{type:"button",className:"fv-btn",disabled:l,onClick:()=>m(r),children:"用磁盘内容重开"}),e.jsx("button",{type:"button",className:"fv-btn primary",disabled:l,onClick:d,children:"覆盖保存"})]}):null,e.jsxs("div",{className:"editor-wrap",children:[e.jsx("div",{className:"editor-gutter",ref:j,"aria-hidden":!0,children:N.map((g,O)=>e.jsx("div",{children:O+1},O))}),e.jsxs("div",{className:"editor-stack",children:[e.jsx("pre",{className:"editor-hl",ref:x,"aria-hidden":!0,children:N.map((g,O)=>e.jsxs(ce.Fragment,{children:[O>0?`
326
+ `:null,e.jsx(dt,{text:g,lang:n})]},O))}),e.jsx("textarea",{className:"editor-ta",ref:v,value:s,spellCheck:!1,"aria-label":`编辑 ${t}`,wrap:"off",onChange:g=>o(g.target.value),onScroll:M,onKeyDown:y})]})]})]})}function mr(t,s){let n=t instanceof HTMLElement?t:t?.parentElement??null;for(;n!==null;){if(n===s)return null;const a=n.getAttribute("data-line");if(a!==null){const l=Number(a);return Number.isFinite(l)&&l>=1?l:null}n=n.parentElement}return null}function kp(t,s){if(s===null)return null;const n=mr(s.anchorNode,t),a=mr(s.focusNode,t);if(n===null||a===null)return null;const l=s.toString().split(`
327
+ `).map(r=>r.replace(/\s+$/,"")).join(`
328
+ `).trim();return l===""?null:{first:Math.min(n,a),last:Math.max(n,a),text:l}}function wp(t,s,n,a){const l=s===n?`第 ${s} 行`:`第 ${s}-${n} 行`,r=a.length>3e3?`${a.slice(0,1400)}
329
+ …(中略)
330
+ ${a.slice(-1400)}`:a;return`请修改 ${t} ${l}:
331
+
332
+ \`\`\`
333
+ ${r}
334
+ \`\`\`
335
+
336
+ 我的要求:`}const Sp=100*1024,pr=2e3,Dn=t=>t instanceof Error?t.message:String(t),Cp=t=>t.endsWith(".md");function Ep(t){if(t==="")return[];const s=t.split(`
337
+ `);return s.length>1&&s[s.length-1]===""&&s.pop(),s}function $p({client:t,path:s,isDir:n,onOpenPath:a,onReadFailed:l,refreshEpoch:r,onClose:o,onPrefill:c}){const[d,m]=i.useState({s:"loading"}),[p,v]=i.useState("preview"),[x,j]=i.useState(null),[N,M]=i.useState(!1),[y,g]=i.useState(null),[O,$]=i.useState(null),[k,G]=i.useState(null),[T,V]=i.useState(0),[q,X]=i.useState(null);i.useEffect(()=>{s!==null&&(v("preview"),j(null),g(null),$(null),G(null))},[t,s,n,l,r]),i.useEffect(()=>{if(s===null)return;let P=!1;return m({s:"loading"}),X(null),n?t.fileTree(s).then(A=>{P||m({s:"dir",entries:Jn(A.entries)})},A=>{P||(m({s:"error",message:Dn(A)}),l?.(s))}):t.fileRead(s).then(A=>{P||m({s:"file",r:A})},A=>{P||(m({s:"error",message:Dn(A)}),l?.(s))}),()=>{P=!0}},[t,s,n,l,r,T]);const W=s===null?[]:s.split("/").filter(P=>P!==""),_=s!==null&&!n&&Cp(s)&&d.s==="file"&&d.r.binary!==!0&&x===null,z=e.jsx("button",{type:"button",className:"fv-close","aria-label":"关闭",title:"关闭",onClick:()=>o?.(),children:e.jsx(ts,{size:14})});let R;if(s===null)R=e.jsx("div",{className:"viewer-empty",children:"从左侧选择文件查看内容"});else if(d.s==="loading")R=e.jsx("div",{className:"viewer-empty",children:"加载中…"});else if(d.s==="error")R=e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"fv-head",children:[e.jsx("span",{className:"fv-file",children:s}),z]}),e.jsxs("div",{className:"viewer-err",children:[e.jsx(ae,{name:"triangle-alert",size:13})," ",d.message]})]});else if(d.s==="dir")R=e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"fv-head",children:[e.jsx("span",{className:"fv-file",children:s}),z]}),e.jsx("div",{className:"viewer-dirwrap",children:e.jsxs("table",{className:"viewer-dir",children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:"名称"}),e.jsx("th",{children:"类型"}),e.jsx("th",{children:"大小"})]})}),e.jsx("tbody",{children:d.entries.map(P=>e.jsxs("tr",{children:[e.jsx("td",{className:"viewer-entry-name",children:P.type==="dir"?e.jsxs(e.Fragment,{children:[e.jsx(es,{size:14})," ",P.name]}):e.jsxs(e.Fragment,{children:[e.jsx(ta,{size:14})," ",P.name]})}),e.jsx("td",{children:P.type==="dir"?"目录":"文件"}),e.jsx("td",{children:P.type==="file"&&P.size!==void 0?`${P.size} bytes`:"—"})]},P.name))})]})})]});else{const P=d.r;if(P.binary===!0)R=e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"fv-head",children:[e.jsx("span",{className:"fv-file",children:s}),z]}),e.jsx("div",{className:"viewer-binary",children:`二进制文件 · ${P.totalBytes} bytes · 不支持预览`})]});else{const A=P.truncated||P.totalBytes>Sp,H=Ep(P.content),J=A?H.slice(0,pr):H,se=!A&&t.fileWrite!==void 0,he=()=>{j({base:P.content,value:P.content}),g(null),$(null),G(null)},le=D=>{if(c===void 0||s===null){X(null);return}const f=window.getSelection(),S=kp(D.currentTarget,f);if(S===null){X(null);return}let w=0,b=0;try{const E=f?.getRangeAt(0).getBoundingClientRect();w=E?.right??0,b=E?.top??0}catch{}X({...S,path:s,x:w,y:b})},K=D=>{x===null||s===null||t.fileWrite===void 0||(M(!0),t.fileWrite(s,x.value,D).then(f=>{M(!1),"written"in f?(G(`已保存 ${s} · ${x.value.split(`
338
+ `).length} 行`),j(null),g(null),$(null),V(S=>S+1)):g(f.current)},f=>{M(!1),$(Dn(f))}))};R=e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"fv-head",children:[e.jsx("span",{className:"fv-file",children:s}),x===null&&se?e.jsx("button",{type:"button",className:"fv-btn",onClick:he,children:"编辑"}):null,z]}),k!==null&&x===null?e.jsx("div",{className:"fv-saved",children:k}):null,x!==null?e.jsxs(e.Fragment,{children:[O!==null?e.jsxs("div",{className:"viewer-err",children:[e.jsx(ae,{name:"triangle-alert",size:13})," ",O]}):null,e.jsx(Np,{path:s,value:x.value,language:Wn(s)??P.language,dirty:x.value!==x.base,saving:N,conflict:y,onChange:D=>j({...x,value:D}),onSave:()=>K(x.base),onOverwrite:()=>K(y??x.base),onReopen:D=>{j({base:D,value:D}),g(null),$(null)},onDiscard:()=>{j(null),g(null),$(null)}})]}):_&&p==="preview"?e.jsx("div",{className:"viewer-md",children:e.jsx(Yr,{source:P.content})}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"viewer-code",onMouseUp:le,children:J.map((D,f)=>e.jsxs("div",{className:"viewer-line","data-line":f+1,children:[e.jsx("span",{className:"viewer-gutter",children:f+1}),e.jsx("span",{className:"viewer-src",children:e.jsx(dt,{text:D,lang:Wn(s)??P.language})})]},f))}),q!==null&&c!==void 0?e.jsx("button",{type:"button",className:"fv-selchip",style:{left:`${q.x}px`,top:`${q.y}px`},onClick:()=>{c(wp(q.path,q.first,q.last,q.text));try{window.getSelection()?.removeAllRanges()}catch{}X(null)},children:"改这段"}):null,A?e.jsx("div",{className:"viewer-truncated",children:`截断:文件 ${P.totalBytes} bytes,仅显示前 ${pr} 行`}):null]})]})}}return e.jsxs("div",{className:"fileviewer",children:[s===null?null:e.jsxs("div",{className:"breadcrumb",children:[W.map((P,A)=>{const H=A===W.length-1,J=W.slice(0,A+1).join("/");return e.jsxs(ce.Fragment,{children:[A>0?e.jsx("span",{className:"crumb-sep",children:"/"}):null,H?e.jsx("span",{className:"crumb current","aria-current":"page",children:P}):e.jsx("span",{className:"crumb",role:"button",tabIndex:0,title:J,onKeyDown:se=>{(se.key==="Enter"||se.key===" ")&&(se.preventDefault(),a?.(J,!0))},onClick:()=>a?.(J,!0),children:P})]},J)}),_?e.jsxs("span",{className:"md-toggle",children:[e.jsx("button",{type:"button",className:"mdmode","data-mode":"source","aria-pressed":p==="source",title:"渲染后的 markdown 源码",onClick:()=>v("source"),children:"源码"}),e.jsx("button",{type:"button",className:"mdmode","data-mode":"preview","aria-pressed":p==="preview",title:"markdown 渲染预览",onClick:()=>v("preview"),children:"预览"})]}):null]}),R]})}function Rp(t){const s=[],n=new Set;for(const a of t)if(!(a.kind!=="notice"||a.changes===void 0||a.changes.length===0)){s.push({files:a.changes,detail:a.detail});for(const l of a.changes)n.add(l.path)}return{runs:s,fileCount:n.size}}function Mp(t){const s=[];for(const n of t){if(n.cmd===void 0){s.push({kind:"plain",file:n});continue}const a=s[s.length-1];a!==void 0&&a.kind==="cmd"&&a.cmd===n.cmd?s[s.length-1]={kind:"cmd",cmd:a.cmd,files:[...a.files,n]}:s.push({kind:"cmd",cmd:n.cmd,files:[n]})}return s}function Tp(t){return t.plus===void 0||t.minus===void 0||t.plus<=0&&t.minus<=0?null:{plus:t.plus,minus:t.minus}}function Ap(t){return t.plus!==void 0&&t.minus!==void 0&&t.plus<=0&&t.minus<=0?"这一轮结束时,这个文件的内容没有变化":"这份文件的改动明细过长,明细中已省略——完整记录可用 /rewind 回看"}function fr({f:t}){const s=Tp(t);return e.jsxs("span",{className:"chg-badge","data-op":t.op,children:[t.op==="created"?"新建":`修改 ×${t.writes}`,s!==null&&s.plus>0?e.jsx("span",{className:"chg-cnt chg-cnt-plus",children:` +${s.plus}`}):null,s!==null&&s.minus>0?e.jsx("span",{className:"chg-cnt chg-cnt-minus",children:` −${s.minus}`}):null]})}function Dp({path:t,onChoose:s}){const n=i.useRef(!1),a=i.useRef(null);i.useEffect(()=>{a.current?.focus()},[]);const l=r=>{n.current||(n.current=!0,s(r))};return e.jsx("div",{className:"scrim",children:e.jsxs("div",{className:"modal-card pop-in revert-confirm",role:"dialog","aria-label":"恢复文件",ref:a,tabIndex:-1,onKeyDown:r=>{r.key==="Escape"||r.key==="n"||r.key==="N"||r.key==="Enter"?(r.preventDefault(),l(!1)):(r.key==="y"||r.key==="Y")&&(r.preventDefault(),l(!0))},children:[e.jsxs("h3",{children:["↩ 恢复 ",t]}),e.jsx("div",{className:"muted",children:"这一轮开始前它是这个样子。"}),e.jsx("div",{className:"revert-warn",children:"如果这一轮之后你又改过它,恢复会覆盖这些改动——覆盖前会自动再留一份快照,随时可以再恢复回来。"}),e.jsxs("div",{className:"btnrow",children:[e.jsx("button",{type:"button",className:"wudao",onClick:()=>l(!0),children:"恢复"}),e.jsx("button",{type:"button",className:"wudao",onClick:()=>l(!1),children:"取消 (Esc)"})]})]})})}function Op({count:t,onChoose:s}){const n=i.useRef(!1),a=i.useRef(null);i.useEffect(()=>{a.current?.focus()},[]);const l=r=>{n.current||(n.current=!0,s(r))};return e.jsx("div",{className:"scrim",children:e.jsxs("div",{className:"modal-card pop-in revert-confirm",role:"dialog","aria-label":"撤销命令改动",ref:a,tabIndex:-1,onKeyDown:r=>{r.key==="Escape"||r.key==="n"||r.key==="N"||r.key==="Enter"?(r.preventDefault(),l(!1)):(r.key==="y"||r.key==="Y")&&(r.preventDefault(),l(!0))},children:[e.jsx("h3",{children:"↩ 撤销这条命令的改动"}),e.jsx("div",{className:"muted",children:`这条命令改了 ${t} 个文件,会把它们恢复到命令开始前的样子。`}),e.jsx("div",{className:"revert-warn",children:"如果这之后你又改过其中某个文件,恢复会覆盖这些改动——覆盖前每个文件都会自动再留一份快照,随时可以再恢复回来。"}),e.jsxs("div",{className:"btnrow",children:[e.jsx("button",{type:"button",className:"wudao",onClick:()=>l(!0),children:"撤销"}),e.jsx("button",{type:"button",className:"wudao",onClick:()=>l(!1),children:"取消 (Esc)"})]})]})})}function Ip({run:t,ordinal:s,onRevert:n,onGroupRevert:a}){const[l,r]=i.useState(!1),[o,c]=i.useState(null),[d,m]=i.useState(null),p=i.useRef(null),v=t.detail!==void 0&&t.detail.length>0,x=i.useMemo(()=>v?kh(t.detail??""):new Set,[v,t.detail]);i.useEffect(()=>{if(!l||o===null)return;[...p.current?.querySelectorAll("[data-dtx-file]")??[]].find(O=>O.getAttribute("data-dtx-file")===o)?.scrollIntoView({block:"start"}),c(null)},[l,o]);const j=g=>g.beforeSha!==void 0&&n!==void 0?e.jsx("span",{className:"chg-revert",role:"button",tabIndex:0,"data-path":g.path,title:"这一轮开始前它是这个样子","aria-label":`恢复 ${g.path} 到这一轮开始前的样子`,onClick:()=>n(g.path,g.beforeSha),onKeyDown:O=>{(O.key==="Enter"||O.key===" ")&&(O.preventDefault(),n(g.path,g.beforeSha))},children:"恢复到这里"}):null,N=g=>g.cmd!==void 0?e.jsx("span",{className:"chg-cmd-badge",title:g.cmd,children:"命令改动"}):null,M=g=>e.jsxs("div",{className:"chg-file-wrap",children:[v&&x.has(g.path)?e.jsxs("button",{type:"button",className:"chg-file",title:`在改动明细中定位 ${g.path}`,onClick:()=>{r(!0),c(g.path)},children:[e.jsx("span",{className:"chg-path",children:g.path}),e.jsx(fr,{f:g})]}):e.jsxs("div",{className:"chg-file",title:v?Ap(g):void 0,children:[e.jsx("span",{className:"chg-path",children:g.path}),e.jsx(fr,{f:g})]}),N(g),j(g)]},g.path),y=g=>{const O=g.files.filter(k=>k.beforeSha!==void 0),$=O.length===0;return e.jsx("span",{className:"chg-cmd-undo",role:"button",tabIndex:0,"aria-disabled":$?"true":void 0,title:$?"首次改动暂无可恢复快照":`撤销这条命令的改动(${O.length} 个文件)`,"aria-label":$?"首次改动暂无可恢复快照":`撤销这条命令改的 ${O.length} 个文件`,onClick:()=>{$||a===void 0||m({cmd:g.cmd,files:O})},onKeyDown:k=>{if(k.key==="Enter"||k.key===" "){if(k.preventDefault(),$||a===void 0)return;m({cmd:g.cmd,files:O})}},children:"撤销这条命令的改动"})};return e.jsxs("div",{className:"chg-run",ref:p,children:[e.jsx("div",{className:"chg-run-h",children:`第 ${s} 轮 · ${t.files.length} 文件`}),e.jsx("div",{className:"chg-files",children:Mp(t.files).map((g,O)=>g.kind==="plain"?M(g.file):e.jsxs("div",{className:"chg-cmdgroup",children:[e.jsxs("div",{className:"chg-cmd-h",title:g.cmd,children:[e.jsx("span",{className:"chg-cmd-label",children:`这条命令改了 ${g.files.length} 个文件`}),y(g)]}),g.files.map(M)]},`cmd-${O}-${g.cmd.length}`))}),v?e.jsxs("button",{type:"button",className:"chg-exp","aria-expanded":l,"aria-label":l?`收起第 ${s} 轮改动明细`:`展开第 ${s} 轮改动明细`,onClick:()=>r(!l),children:[e.jsx("span",{children:l?"收起改动明细":"展开改动明细"}),l?e.jsx(tt,{size:12}):e.jsx(bt,{size:12})]}):null,l&&v?e.jsx(bi,{detail:t.detail??"",className:"chg-detail",as:"pre"}):null,d!==null&&a!==void 0?e.jsx(Op,{count:d.files.length,onChoose:g=>{const O=d;m(null),g&&O.files.forEach($=>a($.path,$.beforeSha))}}):null]})}function Lp({agg:t,onClose:s,onRevert:n}){const a=i.useRef(null),[l,r]=i.useState(null);return i.useEffect(()=>{a.current?.focus()},[]),e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"scrim",children:e.jsxs("div",{className:"modal-card pop-in changes-panel",role:"dialog","aria-label":"会话改动",ref:a,tabIndex:-1,onKeyDown:o=>{o.key==="Escape"&&l===null&&(o.preventDefault(),s())},children:[e.jsx("h3",{children:"会话改动"}),e.jsx("div",{className:"chg-head muted",children:`共改动 ${t.fileCount} 个文件 · ${t.runs.length} 轮`}),e.jsx("div",{className:"chg-runs",children:t.runs.map((o,c)=>e.jsx(Ip,{run:o,ordinal:c+1,onRevert:n!==void 0?(d,m)=>r({path:d,sha:m}):void 0,onGroupRevert:n},`${c}-${o.files.length}`))}),e.jsx("div",{className:"btnrow",children:e.jsx("button",{type:"button",className:"wudao",onClick:s,children:"关闭"})})]})}),l!==null&&n!==void 0?e.jsx(Dp,{path:l.path,onChoose:o=>{const c=l;r(null),o&&n(c.path,c.sha)}}):null]})}const Pp=new Set(["screen.capture","computer.type","computer.key","computer.click","app.activate","app.list","computer.scroll","computer.drag","screen.observe","computer.wait"]);function _p(t){const s=[];let n=[],a=0,l=()=>{n.length>0&&(s.push({actions:n}),n=[])};for(const r of t){if(r.kind==="user"){l();continue}if(r.kind!=="tool"||!Pp.has(r.name))continue;a++;const o=n[n.length-1];if(o!==void 0&&o.name===r.name&&o.summary===r.summary){const c=o.durationMs!==void 0&&r.durationMs!==void 0?o.durationMs+r.durationMs:void 0;n[n.length-1]={...o,isError:o.isError||r.isError===!0,durationMs:c,count:o.count+1,preview:r.resultPreview??""};continue}n.push({name:r.name,summary:r.summary,isError:r.isError===!0,durationMs:r.durationMs,count:1,preview:r.resultPreview??""})}return l(),{runs:s,totalSteps:a}}const Fp={"screen.capture":"截了一张全屏图","computer.type":"输入了","computer.key":"按键","computer.click":"点击","app.activate":"打开了","app.list":"看了当前打开的应用","computer.scroll":"滚动了","computer.drag":"拖动了","screen.observe":"观察了","computer.wait":"等待了"},zp=new Set(["computer.type","computer.key","computer.click","app.activate","computer.scroll","computer.drag","screen.observe","computer.wait"]);function Bp({row:t}){const s=Fp[t.name]??t.name,n=t.summary!=="";return e.jsxs("div",{className:"cap-act","data-err":t.isError?"true":void 0,children:[e.jsx("span",{className:"cap-verb",children:n?s:t.name}),n&&zp.has(t.name)?e.jsx("span",{className:"cap-text",children:t.summary}):null,t.count>1?e.jsx("span",{className:"cap-badge",children:`×${t.count}`}):null,t.durationMs!==void 0?e.jsx("span",{className:"cap-dur",children:`· ${Nr(t.durationMs)}`}):null,!n&&t.preview!==""?e.jsx("div",{className:"cap-preview",children:t.preview}):null]})}function Kp({agg:t,onClose:s}){const n=i.useRef(null);return i.useEffect(()=>{n.current?.focus()},[]),e.jsx("div",{className:"scrim",children:e.jsxs("div",{className:"modal-card pop-in computer-panel",role:"dialog","aria-label":"电脑操作",ref:n,tabIndex:-1,onKeyDown:a=>{a.key==="Escape"&&(a.preventDefault(),s())},children:[e.jsx("h3",{children:"电脑操作"}),e.jsx("div",{className:"cap-head muted",children:`共电脑操作 ${t.totalSteps} 步 · ${t.runs.length} 轮`}),e.jsx("div",{className:"cap-runs",children:t.runs.map((a,l)=>e.jsxs("div",{className:"cap-run",children:[e.jsx("div",{className:"cap-run-h",children:`第 ${l+1} 轮 · ${a.actions.reduce((r,o)=>r+o.count,0)} 步`}),e.jsx("div",{className:"cap-acts",children:a.actions.map((r,o)=>e.jsx(Bp,{row:r},`${r.name}-${o}`))})]},`${l}-${a.actions.length}`))}),e.jsx("div",{className:"btnrow",children:e.jsx("button",{type:"button",className:"wudao",onClick:s,children:"关闭"})})]})})}function On(t){const s=new Date(t),n=a=>String(a).padStart(2,"0");return`${s.getMonth()+1}月${s.getDate()}日 ${n(s.getHours())}:${n(s.getMinutes())}`}function Up(t,s,n=Date.now){const a=l=>{if(l===void 0||s===null)return null;const r=s.find(c=>c.id===l);if(r===void 0)return null;const o=r.name?.trim()??"";return o!==""?o:r.firstUser};return t.map(l=>{const r=l.paused===!0,o=l.enabled!==!1,c=l.consecutiveFailures??0,d=r?"paused":o?"active":"breaker",m=d==="paused"?"已暂停":d==="breaker"?"已停用":"生效中",p=n(),v=l.triggerKind==="event",x=l.triggerKind==="idle";let j;d==="paused"?j="已暂停——恢复后按计划继续":d==="breaker"?j="已停用——恢复或试跑可重开":v?j="等信号到达":x?j=l.nextRunAt!==null&&l.nextRunAt!==void 0&&l.nextRunAt<=p?"等用户空闲":"等空闲":l.nextRunAt===null||l.nextRunAt===void 0?j="无待跑":j=l.nextRunAt<=p?"马上":On(l.nextRunAt);let N;if(d==="breaker")N=`连败 ${c} 次没跑成,已自动停用`;else if(l.lastRun!==void 0&&l.lastRun!==null){const M=l.lastRun.mode==="skipped"?"会话忙,跳过了":l.lastRun.ok?"跑成了":"没跑成";N=`上次 ${On(l.lastRun.at)} ${M}`,c>0&&(N+=`——已连败 ${c} 次`)}else l.lastFiredAt!==void 0&&l.lastFiredAt!==null?N=`上次触发 ${On(l.lastFiredAt)}`:N=l.kind==="reminder"?"还没响过":"还没跑过";return{id:l.id,kind:l.kind,promptText:l.prompt.slice(0,80),trigger:l.trigger,triggerKind:v?"event":x?"idle":"calendar",state:d,stateText:m,nextText:j,lastText:N,sessionName:a(l.sessionId),breaker:d==="breaker",paused:r,failures:c}})}function Wp({promptText:t,onChoose:s}){const n=i.useRef(!1),a=i.useRef(null);i.useEffect(()=>{a.current?.focus()},[]);const l=r=>{n.current||(n.current=!0,s(r))};return e.jsx("div",{className:"scrim",children:e.jsxs("div",{className:"modal-card pop-in remove-confirm",role:"dialog","aria-label":"删除定时任务",ref:a,tabIndex:-1,onKeyDown:r=>{r.key==="Escape"||r.key==="n"||r.key==="N"||r.key==="Enter"?(r.preventDefault(),l(!1)):(r.key==="y"||r.key==="Y")&&(r.preventDefault(),l(!0))},children:[e.jsx("h3",{children:"删除这条定时任务?"}),e.jsx("div",{className:"muted",children:t}),e.jsx("div",{className:"revert-warn",children:"删除后它不会再到点跑——这是唯一入口,删了要重新设。"}),e.jsxs("div",{className:"btnrow",children:[e.jsx("button",{type:"button",className:"wudao",onClick:()=>l(!0),children:"删除"}),e.jsx("button",{type:"button",className:"wudao",onClick:()=>l(!1),children:"取消 (Esc)"})]})]})})}function Hp({failures:t,promptText:s,onChoose:n}){const a=i.useRef(!1),l=i.useRef(null);i.useEffect(()=>{l.current?.focus()},[]);const r=o=>{a.current||(a.current=!0,n(o))};return e.jsx("div",{className:"scrim",children:e.jsxs("div",{className:"modal-card pop-in run-confirm",role:"dialog","aria-label":"试跑熔断任务",ref:l,tabIndex:-1,onKeyDown:o=>{o.key==="Escape"||o.key==="n"||o.key==="N"||o.key==="Enter"?(o.preventDefault(),r(!1)):(o.key==="y"||o.key==="Y")&&(o.preventDefault(),r(!0))},children:[e.jsxs("h3",{children:["连败 ",t," 次已熔断,仍要试跑?"]}),e.jsx("div",{className:"muted",children:s}),e.jsx("div",{className:"revert-warn",children:"试跑前会清零连败计数并重新打开它——跑成跑不成都会如实告诉你。"}),e.jsxs("div",{className:"btnrow",children:[e.jsx("button",{type:"button",className:"wudao",onClick:()=>r(!0),children:"试跑"}),e.jsx("button",{type:"button",className:"wudao",onClick:()=>r(!1),children:"取消 (Esc)"})]})]})})}function qp({rows:t,onClose:s,onToggle:n,onRemove:a,onRun:l}){const r=i.useRef(null),[o,c]=i.useState(null),[d,m]=i.useState(null);return i.useEffect(()=>{r.current?.focus()},[]),e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"scrim",children:e.jsxs("div",{className:"modal-card pop-in schedules-panel",role:"dialog","aria-label":"定时任务",ref:r,tabIndex:-1,onKeyDown:p=>{p.key==="Escape"&&o===null&&d===null&&(p.preventDefault(),s())},children:[e.jsx("h3",{children:"定时任务"}),e.jsx("div",{className:"sch-head muted",children:`共 ${t.length} 条`}),e.jsx("div",{className:"sch-rows",children:t.length===0?e.jsx("div",{className:"muted",children:"没有定时任务了"}):t.map(p=>e.jsxs("div",{className:"sch-row","data-state":p.state,children:[e.jsxs("div",{className:"sch-main",children:[e.jsx("span",{className:"sch-prompt",children:p.promptText}),e.jsx("span",{className:"sch-badge sch-state","data-state":p.state,children:p.stateText})]}),e.jsxs("div",{className:"sch-meta",children:[e.jsx("span",{className:"sch-trig",children:p.trigger}),e.jsx("span",{className:"sch-next",children:p.triggerKind==="event"?p.nextText:`下次 ${p.nextText}`}),e.jsx("span",{className:"sch-last","data-ok":p.lastText.includes("跑成了")||void 0,children:p.lastText}),p.sessionName!==null?e.jsx("span",{className:"sch-session",children:`绑定会话 ${p.sessionName}`}):null]}),e.jsxs("div",{className:"sch-acts",children:[e.jsx("button",{type:"button",className:"sch-act","data-act":"toggle",onClick:()=>n(p.id,p.paused),children:p.paused?"恢复":"暂停"}),e.jsx("button",{type:"button",className:"sch-act","data-act":"run",onClick:()=>{p.breaker?m(p):l(p.id,!1)},children:"试跑"}),e.jsx("button",{type:"button",className:"sch-act sch-del","data-act":"remove",onClick:()=>c(p.id),children:"删除"})]})]},p.id))}),e.jsx("div",{className:"btnrow",children:e.jsx("button",{type:"button",className:"wudao",onClick:s,children:"关闭"})})]})}),o!==null?e.jsx(Wp,{promptText:t.find(p=>p.id===o)?.promptText??o,onChoose:p=>{const v=o;c(null),p&&a(v)}}):null,d!==null?e.jsx(Hp,{failures:d.failures,promptText:d.promptText,onChoose:p=>{const v=d;m(null),p&&l(v.id,!0)}}):null]})}const Gp="wudao-screenshot",Vp="截图.png";function Yp(t){if(typeof t!="object"||t===null)return null;const s=t;return typeof s.data!="string"||s.data===""||typeof s.mediaType!="string"||!s.mediaType.startsWith("image/")?null:{data:s.data,mediaType:s.mediaType}}function Xp(t){const s=atob(t),n=new Uint8Array(s.length);for(let a=0;a<s.length;a+=1)n[a]=s.charCodeAt(a);return n}function Jp(t){const s=Yp(t);if(s===null)return null;try{return new File([Xp(s.data)],Vp,{type:s.mediaType})}catch{return null}}const Qp="pet-file-drop",Zp=20*1024*1024;function ef(t){if(typeof t!="object"||t===null)return null;const s=t.paths;if(!Array.isArray(s)||s.length===0)return null;const n=[];for(const a of s){if(typeof a!="object"||a===null)continue;const{path:l,name:r,bytes:o}=a;typeof l!="string"||typeof r!="string"||typeof o!="number"||n.push({path:l,name:r,bytes:o})}return n.length>0?n:null}function tf(t,s){return t.bytes>Zp?"oversize":s.length>=Xs?"count":s.reduce((a,l)=>a+ss(l.byteLength),0)+ss(t.bytes)>hi?"budget":null}function sf(t,s){const n=[],a=[...s],l=new Map;for(const o of t){const c=tf(o,a);c===null?(n.push(o),a.push({byteLength:o.bytes})):l.set(c,(l.get(c)??0)+1)}if(l.size===0)return{accepted:n,notice:null};const r=[];for(const o of["oversize","count","budget"]){const c=l.get(o);c!==void 0&&(o==="oversize"?r.push(`${c} 个超出单文件 20MiB 上限`):o==="count"?r.push(`${c} 个超出数量上限(最多同时附加 ${Xs} 个)`):r.push(`${c} 个超出批量 50MiB 上限`))}return{accepted:n,notice:`⚠️ ${r.join(" · ")}`}}function nf(t){const s=atob(t),n=new Uint8Array(s.length);for(let a=0;a<s.length;a+=1)n[a]=s.charCodeAt(a);return n}async function af(t,s){const n=[];for(const a of s)try{const l=await t.readDroppedFile(a.path);n.push(ra(new File([nf(l)],a.name)))}catch(l){t.warn(`pet drop: skipping ${a.name} (${l instanceof Error?l.message:String(l)})`)}if(n.length!==0)try{t.onStaged(n)}catch(a){t.warn(`pet drop: onStaged failed (${a instanceof Error?a.message:String(a)})`)}}async function lf(t){const s=await Qt("read_dropped_file",{path:t});if(typeof s!="string")throw new Error(`read_dropped_file refused ${t}`);return s}let Qn=null;function xr(t){Qn=t}function rf(t,s){const n=(...c)=>console.warn(...c),a={readDroppedFile:lf,onStaged:c=>{if(Qn===null){n("pet drop: no stage sink (App not mounted)");return}Qn(c)},warn:n,listen:(c,d)=>ns(c,d)};let l=null,r=!1,o=Promise.resolve();return Promise.resolve(a.listen(Qp,c=>{const d=ef(c);if(d===null)return;const{accepted:m,notice:p}=sf(d,[]);if(p!==null&&a.warn(`pet drop: ${p}`),m.length===0)return;const v=m;o=o.then(()=>af(a,v)).catch(()=>{})})).then(c=>{r?c?.():l=c}),()=>{r=!0,l?.()}}const Ds="input-pointer";function of(){i.useEffect(()=>{const t=document.documentElement;t.classList.remove(Ds);const s=()=>{t.classList.add(Ds)},n=()=>{t.classList.remove(Ds)};return window.addEventListener("pointerdown",s),window.addEventListener("keydown",n),()=>{window.removeEventListener("pointerdown",s),window.removeEventListener("keydown",n),t.classList.remove(Ds)}},[])}function cf({client:t}){const s=gc(t),n=s.status,{view:a,setViewLane:l}=Yc(s),r=Xc(),o=r.slot(a.key),c=a.busy,d=n?.busy??!1,m=a.viewingMain,p=i.useRef(a);p.current=a;const v=i.useRef(r);v.current=r;const[x,j]=i.useState([]),N=o.notes,[M,y]=i.useState(null),[g,O]=i.useState("resume"),[$,k]=i.useState(!1),[G,T]=i.useState(null),[V,q]=i.useState(!1),[X,W]=i.useState(!1),[_,z]=i.useState("checking"),[R,P]=i.useState(null),[A,H]=i.useState("advanced"),[J]=i.useState(Pc),se=i.useRef(!1),he=i.useRef(!1),le=i.useRef(null),K=i.useRef(null);K.current===null&&(K.current=Gc());const D=K.current,[f,S]=i.useState(()=>bl(D)),[w,b]=i.useState(()=>{const u=bl(D).length;return typeof D.activeTabIndex=="number"?Math.min(Math.max(Math.trunc(D.activeTabIndex),0),Math.max(u-1,0)):0}),[E,U]=i.useState(()=>typeof D.centerCollapsed=="boolean"?D.centerCollapsed:!1),[ee,oe]=i.useState(()=>typeof D.leftCollapsed=="boolean"?D.leftCollapsed:jn()),[Ne,ke]=i.useState(()=>typeof D.rightCollapsed=="boolean"?D.rightCollapsed:!1),[me,$e]=i.useState(()=>typeof D.treeW=="number"&&Number.isFinite(D.treeW)?ct(D.treeW):vl),[ge,Me]=i.useState(()=>typeof D.chatW=="number"&&Number.isFinite(D.chatW)?ct(D.chatW):gl),[Ge,ze]=i.useState(!1),Le=i.useRef(null),pe=i.useCallback(()=>{Le.current={leftCollapsed:ee,chatW:ge},ze(!0),oe(!0),Me(Fc)},[ee,ge]),Be=i.useCallback(()=>{const u=Le.current;ze(!1),u!==null&&(oe(u.leftCollapsed),Me(u.chatW)),Le.current=null},[]),Te=i.useCallback(()=>{Ge?Be():pe()},[Ge,pe,Be]);i.useEffect(()=>{A!=="advanced"&&Be()},[A,Be]);const[Pe,Ve]=i.useState(0),[Re,F]=i.useState(null),[Y,Q]=i.useState(!1),ie=i.useRef([]),[je,ne]=i.useState(!1),[re,fe]=i.useState(!1),[be,Ye]=i.useState(null),[mt,Dt]=i.useState(null),[Ke,_e]=i.useState(0),[Qe,Ot]=i.useState(!1),[ls,It]=i.useState(!1),[nt,rs]=i.useState(null),[Lt,is]=i.useState(null),[Qs,Pt]=i.useState(0),[Zs,os]=i.useState(!1),[at,L]=i.useState(()=>D?.buddyCollapsed===!0||yn()),[te,de]=i.useState(Lc),xe=i.useRef(!1),[ue,Ue]=i.useState(""),[Ie,yt]=i.useState(""),[Ce,cs]=i.useState(null),_t=i.useRef(""),pa=i.useCallback(u=>{_t.current=u},[]),ot=i.useRef([]),fa=i.useCallback(u=>{ot.current=u},[]),[ds,en]=i.useState(null),xa=i.useCallback(()=>{en(null)},[]),pt=i.useRef([]),va=i.useCallback(u=>{pt.current=u},[]),[us,tn]=i.useState(null),ga=i.useCallback(()=>{tn(null)},[]),[hs,ms]=i.useState(null),I=i.useCallback(u=>{const h=t.getSnapshot(),C=p.current,B=C.sid!==null?h.lanes?.[C.sid]:void 0;v.current.stampNote(C.key,u,B!==void 0?B.history.length:h.history.length,B!==void 0?B.historyEpoch:h.historyEpoch)},[t]),[ps,fs]=i.useState(0),Wi=i.useCallback((u,h)=>{if(u!==(n?.sessionId??null)){I("命名只对当前打开的会话生效:先打开它再命名");return}t.submit(`/rename ${h}`).then(()=>{fs(C=>C+1),I(`会话已命名:${h}`)}).catch(C=>I(`⚠️ 命名失败:${C instanceof Error?C.message:String(C)}`))},[t,I,n?.sessionId]),Hi=i.useCallback(u=>t.sessionDelete(u).then(h=>h.deleted?(fs(C=>C+1),I("已删除会话"),!0):(h.reason==="active"?I("会话正在使用中,暂不能删除"):I("没有找到这个会话(可能已删除)"),!1),h=>(I(`⚠️ 删除失败:${h instanceof Error?h.message:String(h)}`),!1)),[t,I]),qi=i.useCallback(u=>t.sessionRestore(u).then(h=>h.restored?(fs(C=>C+1),_e(C=>C+1),I("已恢复,回到列表可继续"),!0):(h.reason==="target-exists"?I("已存在同名会话"):I("回收站里已没有这条"),!1),h=>(I(`⚠️ 恢复失败:${h instanceof Error?h.message:String(h)}`),!1)),[t,I]),sn=i.useRef({name:null,armed:!1});i.useEffect(()=>{const u=sn.current,h=n?.sessionName??null;if(!u.armed){sn.current={name:h,armed:!0};return}h!==u.name&&(sn.current={name:h,armed:!0},fs(C=>C+1))},[n?.sessionName]),i.useEffect(()=>{let u=!1,h=null;return ns(Gp,C=>{const B=Jp(C);if(B===null)return;const{accepted:Z,notice:ye}=di([B],ot.current);if(ye!==null&&I(ye),Z.length===0)return;const we=[...ot.current,...Z.map(Se=>ui(Se))];ot.current=we,en(Se=>({drafts:we,nonce:(Se?.nonce??0)+1}))}).then(C=>{u?C?.():h=C}),()=>{u=!0,h?.()}},[I]),i.useEffect(()=>(xr(u=>{const{accepted:h,notice:C}=mi(u.map(Z=>Z.file),pt.current);if(C!==null&&I(C),h.length===0)return;const B=[...pt.current,...h.map(Z=>ra(Z))];pt.current=B,tn(Z=>({drafts:B,nonce:(Z?.nonce??0)+1}))}),()=>xr(null)),[I]),i.useEffect(()=>{if(s.connection!=="connected")return;let u=!1;return t.listSlashCommands().then(h=>{u||j(h)}).catch(()=>{}),()=>{u=!0}},[t,s.connection]),i.useEffect(()=>{vt(Bs()),Zt(Fn())},[]),i.useEffect(()=>{if(s.connection!=="connected")return;let u=!1;return t.settingsStatus().then(h=>{u||(P(h),z(C=>C==="checking"?vc({providers:h.providers,wizardCompletedVersion:h.settings.wizardCompletedVersion})?"show":"done":C),H(h.settings.uiDefaultMode??"advanced"),se.current||vt(h.settings.uiTheme??"dark"),he.current||Zt(h.settings.uiAccent??"green"))}).catch(()=>{u||z(h=>h==="checking"?"done":h)}),()=>{u=!0}},[t,s.connection]);const Nt=i.useCallback(()=>{t.settingsStatus().then(P).catch(()=>{})},[t]),ja=i.useCallback((u,h)=>{const C=yr({provider:h,model:u},n?.model?.provider),B=C.startsWith("/provider");t.submit(C).then(()=>I(B?`供应商 → ${h} — 历史在新端点重新处理,下一轮生效(缓存全冷)`:`模型 → ${u} — 下一轮生效`)).catch(Z=>I(`⚠️ ${C.split(" ")[0]} 失败:${Z instanceof Error?Z.message:String(Z)}`))},[t,I,n]),ba=i.useCallback(()=>{const u=n?.model;if(u==null||u.label==="")return;const h=u.provider??"deepseek";t.settingsSet("model.defaultModel",{provider:h,model:u.label}).then(()=>I(`已设为默认:${h}/${u.label} —— 下次启动 wudao ui 生效`)).catch(C=>I(`⚠️ 默认模型保存失败:${C instanceof Error?C.message:String(C)}`))},[t,I,n]),ya=i.useCallback(()=>{const u=n?.model?.provider,h=R?.current?.effort;if(u==null||u===""||h==null||h===""){I("⚠️ 当前会话没有生效的推理档,无法设为默认");return}const C=(R?.providers??[]).find(B=>B.provider===u);if(C===void 0){I(`⚠️ 找不到供应商 ${u} 的注册表卡片,无法保存`);return}t.settingsSaveProvider(u,dc(C,h)).then(B=>{B.ok?(I(`已设为 ${C.label} 默认推理档:${h} —— 新会话生效`),Nt()):I(`⚠️ 保存失败:${B.error}`)}).catch(B=>I(`⚠️ 保存失败:${B instanceof Error?B.message:String(B)}`))},[t,I,n,R,Nt]);i.useEffect(()=>{if(s.connection!=="connected")return;let u=!1;return t.agentRootStatus().then(h=>{u||(typeof h?.agentRoot=="string"&&h.agentRoot!==""&&Ue(h.agentRoot),typeof h?.bootRoot=="string"&&h.bootRoot!==""&&yt(h.bootRoot),!xe.current&&typeof h?.panelRoot=="string"&&h.panelRoot!==""&&de(h.panelRoot))}).catch(()=>{}),()=>{u=!0}},[t,s.connection]),i.useEffect(()=>{if(Ce===null||!Ce.queued||n===null||d)return;let u=!1;return t.agentRootStatus().then(h=>{u||(typeof h?.agentRoot=="string"&&h.agentRoot!==""&&Ue(h.agentRoot),typeof h?.bootRoot=="string"&&h.bootRoot!==""&&yt(h.bootRoot),h?.aligned===!0&&cs(null))}).catch(()=>{}),()=>{u=!0}},[t,n,d,Ce]),i.useEffect(()=>{if(!re)return;Ye(null);let u=!1;return t.sessions().then(h=>{u||Ye(h)}).catch(h=>{u||(fe(!1),I(`⚠️ 会话列表加载失败:${h instanceof Error?h.message:String(h)}`))}),()=>{u=!0}},[t,re,I,ps]),i.useEffect(()=>{if(!re)return;Dt(null);let u=!1;return t.sessionTrashList().then(h=>{u||Dt(h)}).catch(()=>{}),()=>{u=!0}},[t,re,Ke]);const[xs,Na]=i.useState(null),[ka,wa]=i.useState(null);i.useEffect(()=>{const u=n?.sessionId;if(u===void 0)return;let h=!1;return t.sessions().then(C=>{if(h)return;const B=C.find(Z=>Z.id===u);Na(B!==void 0&&B.name!==void 0&&B.name!==""?B.name:null),h||is(C),h||wa(C)}).catch(()=>{h||Na(null),h||is(null),h||wa([])}),()=>{h=!0}},[t,n?.sessionId,ps]),i.useEffect(()=>{let u=!1;return t.schedulesList().then(h=>{u||rs(h)}).catch(()=>{u||rs(null)}),()=>{u=!0}},[t,n?.sessionId,Qs,ps]);const kt=i.useCallback(u=>{I(`⚠️ 定时任务操作没成功:${u instanceof Error?u.message:String(u)}`)},[I]),Gi=i.useCallback((u,h)=>{t.schedulesSetEnabled(u,h).then(C=>{I(C.message),Pt(B=>B+1)},kt)},[t,I,kt]),Vi=i.useCallback(u=>{t.schedulesRemove(u).then(h=>{I(h.message),Pt(C=>C+1)},kt)},[t,I,kt]),Yi=i.useCallback((u,h)=>{t.schedulesRunNow(u,h?{resetBreaker:!0}:void 0).then(C=>{I(C.message),Pt(B=>B+1)},kt)},[t,I,kt]),Ze=i.useMemo(()=>qc(a.history,N.filter(u=>u.epoch===a.historyEpoch)),[a.history,N,a.historyEpoch]),Sa=i.useRef(null),Xi=i.useMemo(()=>{const u=new Set((n?.live.busyTools??[]).filter(C=>C.name==="edit"||C.name==="write_file").map(C=>C.summary)),h=Sa.current;return h!==null&&h.size===u.size&&[...u].every(C=>h.has(C))?h:(Sa.current=u,u)},[n?.live.busyTools]),nn=o.armedEdit,[Ji,Ca]=i.useState(0),Ft=o.forkBadges,an=o.forkEcho,vs=i.useRef(null);vs.current=nn;const Ea=i.useRef(null);i.useEffect(()=>{const u=Ea.current;u!==null&&u.key===a.key&&u.epoch!==a.historyEpoch&&(r.setArmedEdit(a.key,null),r.setForkBadges(a.key,new Set),Ca(h=>h+1)),Ea.current={key:a.key,epoch:a.historyEpoch}},[a.key,a.historyEpoch,r]);const $a=i.useRef(null);i.useEffect(()=>{const u=$a.current;u!==null&&u.key===a.key&&u.epoch!==a.historyEpoch&&r.filterNotes(a.key,h=>h.epoch===a.historyEpoch),$a.current={key:a.key,epoch:a.historyEpoch}},[a.key,a.historyEpoch,r]),i.useEffect(()=>{if(an!==null)for(let u=Ze.length-1;u>=0;u-=1){const h=Ze[u];if(h===void 0||h.kind!=="user")continue;if(h.text!==an)return;const C=Mt(h,u);r.setForkBadges(a.key,Ft.has(C)?Ft:new Set([...Ft,C])),r.setForkEcho(a.key,null);return}},[Ze,an,a.key,r,Ft]);const gs=i.useCallback(u=>{if(!m){I("⚠️ 岔开仅支持主车道(当前在副车道视图)");return}if(c){I("⚠️ 运行中无法岔开(任务进行中)");return}t.edit(u).then(h=>{if(h===null){I(`无法从第 ${u} 轮岔开——没有这条消息`);return}T(C=>({text:h,nonce:(C?.nonce??0)+1})),r.setArmedEdit(p.current.key,{n:u})}).catch(h=>I(`⚠️ 岔开失败:${h instanceof Error?h.message:String(h)}`))},[c,t,I,m]),Ra=i.useRef(gs);Ra.current=gs;const Qi=i.useCallback(u=>{Ra.current(u)},[]),Zi=i.useCallback(()=>{const u=vs.current;t.disarmEdit().then(()=>{r.setArmedEdit(p.current.key,null)}).catch(h=>{I(`⚠️ 解除岔开失败:${h instanceof Error?h.message:String(h)}——下次发送仍将${u!==null?`从第 ${u.n} 轮`:""}开分支`)})},[t,I]),ln=i.useCallback(u=>{vs.current!==null&&(vs.current=null,v.current.setArmedEdit(p.current.key,null),v.current.setForkEcho(p.current.key,u),Ca(h=>h+1))},[]),rn=i.useMemo(()=>Rp(a.history),[a.history]),on=i.useMemo(()=>_p(a.history),[a.history]),cn=nu({client:t,sessionId:a.sessionId,history:a.history,historyEpoch:a.historyEpoch}),{line:Ma,morning:dn,awaiting:eo}=Gd(t,n?.sessionId,s.historyEpoch),Ta=Jd(t,eo),to=Ta.names,so=Ta.set,[un,no]=i.useState(iu),Aa=i.useRef(un),Da=i.useRef(null);i.useEffect(()=>{const u=n?.model;if(u==null||u.label===""||u.provider===void 0||u.provider==="")return;const h={provider:u.provider,model:u.label},C=Da.current;if(C!==null&&C.provider===h.provider&&C.model===h.model)return;Da.current=h;const B=ou(cu(Aa.current,h));Aa.current=B,no(B)},[n?.model?.label,n?.model?.provider]);const Oa=i.useRef(-1),Ia=i.useRef(""),zt=i.useRef(0),js=i.useRef(new Set),[ao,La]=i.useState(0);i.useEffect(()=>{const u=a.history.filter(zc);if(Ia.current!==a.key||Oa.current!==a.historyEpoch){Ia.current=a.key,Oa.current=a.historyEpoch,zt.current=u.length;return}if(u.length>zt.current){for(const h of u.slice(zt.current))h.summary!==""&&js.current.add(h.summary);La(h=>h+1),Ve(h=>h+1)}zt.current=Math.max(zt.current,u.length)},[a.history,a.historyEpoch,a.key]);const Pa=i.useRef(null);i.useEffect(()=>{const u=Pa.current??(Pa.current={at:a.historyEpoch,changes:0});u.at!==a.historyEpoch&&(u.at=a.historyEpoch,u.changes+=1,u.changes>1&&Ve(h=>h+1))},[a.historyEpoch]);const hn=i.useCallback(()=>{js.current.size!==0&&(js.current.clear(),La(u=>u+1))},[]),mn=V||(n?.pendingPermission??null)!==null||M!==null||$,_a=i.useRef({hidden:!1,mode:"advanced",session:null});i.useEffect(()=>{const u=_a.current,h=u.hidden&&!mn,C=u.mode!==A,B=u.session!==a.sessionId;if(h&&B){_t.current="";for(const Z of ot.current)Ps(Z);ot.current=[],pt.current=[]}else(h||C)&&_t.current.trim()!==""&&ms(Z=>({text:_t.current,nonce:(Z?.nonce??0)+1})),(h||C)&&ot.current.length>0&&en(Z=>({drafts:ot.current,nonce:(Z?.nonce??0)+1})),(h||C)&&pt.current.length>0&&tn(Z=>({drafts:pt.current,nonce:(Z?.nonce??0)+1}));_a.current={hidden:mn,mode:A,session:a.sessionId}},[mn,A,a.sessionId]);const Fa=i.useRef(jn()),za=i.useRef(yn());i.useEffect(()=>{const u=()=>{const h=jn();h&&!Fa.current&&oe(!0),Fa.current=h;const C=yn();C&&!za.current&&L(!0),za.current=C,$e(B=>{const Z=ct(B);return Z!==B?Z:B}),Me(B=>{const Z=ct(B);return Z!==B?Z:B})};return window.addEventListener("resize",u),()=>window.removeEventListener("resize",u)},[]),i.useEffect(()=>{try{window.localStorage.setItem(Rr,JSON.stringify({treeW:me,chatW:ge,leftCollapsed:ee,centerCollapsed:E,rightCollapsed:Ne,buddyCollapsed:at,tabs:f.map(({path:u,isDir:h})=>({path:u,isDir:h})),activeTabIndex:w}))}catch{}},[me,ge,ee,E,Ne,at,f,w]);const bs=f[w]??null,ys=(u,h)=>{const C=f.findIndex(Z=>Z.path===u);if(C>=0){b(C);return}if(f.length>=Bn){const Z=w===0?1:0,ye=f[Z];if(ye!==void 0){const we=f.filter((Se,Ee)=>Ee!==Z).concat({path:u,name:Yt(u),isDir:h});S(we),b(we.length-1),I(`标签已满(${Bn} 个):已关闭「${ye.name}」`);return}}const B=[...f,{path:u,name:Yt(u),isDir:h}];S(B),b(B.length-1)},Ns=u=>{const h=f.filter((C,B)=>B!==u);S(h),b(C=>h.length===0?0:u<C?C-1:u===C?Math.min(C,h.length-1):C)},lo=()=>{bs!==null&&Ns(w)},ro=(u,h)=>{ys(u,h===!0)},Ba=i.useRef(()=>{});Ba.current=u=>{const h=f.findIndex(C=>C.path===u);h>=0&&Ns(h)};const io=i.useCallback(u=>{Ba.current(u)},[]),Ka=i.useRef(()=>{});Ka.current=u=>{ys(u,!1)};const oo=i.useCallback(u=>{Ka.current(u)},[]),co=i.useCallback(u=>{F(h=>({path:u,nonce:(h?.nonce??0)+1}))},[]),uo=i.useCallback(()=>{F(null)},[]),ho=i.useCallback(u=>{ie.current=u},[]),mo=i.useCallback(()=>ie.current,[]),po=u=>{Q(!1),ys(u,!1)};i.useEffect(()=>{const u=h=>{if(!(!h.ctrlKey||h.metaKey)){if(h.key==="w"||h.key==="W"){if(f.length===0)return;h.preventDefault(),Ns(w);return}if(h.key==="Tab"){if(f.length<2)return;h.preventDefault(),b(C=>(C+(h.shiftKey?-1:1)+f.length)%f.length);return}if(/^[1-9]$/.test(h.key)){const C=Number(h.key)-1;if(C>=f.length)return;h.preventDefault(),b(C)}}};return window.addEventListener("keydown",u),()=>window.removeEventListener("keydown",u)},[f,w]),i.useEffect(()=>{const u=h=>{if(h.altKey)return;const C=h.target;if(!(C instanceof HTMLInputElement&&C.classList.contains("search-input")&&h.ctrlKey&&(h.key==="p"||h.key==="P"))){if(h.ctrlKey&&(h.key==="p"||h.key==="P")){h.preventDefault(),Q(B=>!B);return}if((h.metaKey||h.ctrlKey)&&h.key===","){h.preventDefault(),q(!0);return}if(h.ctrlKey&&(h.key==="b"||h.key==="B")){h.preventDefault(),oe(B=>!B);return}if(h.ctrlKey&&h.shiftKey&&h.code==="Backslash"){h.preventDefault(),Te();return}h.ctrlKey&&!h.shiftKey&&h.key==="\\"&&(h.preventDefault(),U(B=>!B))}};return window.addEventListener("keydown",u),()=>window.removeEventListener("keydown",u)},[Te]);const Ua=i.useCallback(u=>h=>{h.preventDefault();const C=h.clientX,B=u==="left"?me:ge,Z=u==="left"?$e:Me,ye=Se=>{const Ee=Se.clientX-C;Z(ct(u==="left"?B+Ee:B-Ee))},we=()=>{window.removeEventListener("mousemove",ye),window.removeEventListener("mouseup",we)};window.addEventListener("mousemove",ye),window.addEventListener("mouseup",we)},[me,ge]),Wa=i.useCallback(u=>()=>{u==="left"?$e(vl):Me(gl)},[]),Ha=i.useCallback(u=>h=>{const C=u==="left"?$e:Me;if(h.key==="ArrowLeft"||h.key==="ArrowRight"){h.preventDefault();const B=(h.key==="ArrowRight"?1:-1)*(u==="left"?1:-1);C(ct((u==="left"?me:ge)+16*B));return}if(h.key==="Home"){h.preventDefault(),C(ct(Os));return}h.key==="End"&&(h.preventDefault(),C(ct(Is())))},[me,ge]),{onScroll:fo,jump:xo,show:vo}=Er(le);of();const lt=i.useCallback((u,h,C)=>{const B=h!==void 0&&h.length>0,Z=C!==void 0&&C.length>0;M!==null&&y(null);const ye=vu(u);if(ye.kind==="noop"&&!B&&!Z)return;const we=ye.kind==="pass"?ye:{kind:"pass",text:""};if((B||Z)&&ye.kind!=="pass"&&ye.kind!=="noop")return I(`⚠️ ${u.trim().split(/\s+/)[0]??"该命令"} 是界面命令,不支持附加图片或文件 —— 未发送`),!1;if(ye.kind==="exit"){t.close();return}if(ye.kind==="help"){I(xu(x,{mode:_n(n?.mode??"workspace")}));return}if(ye.kind==="clear"){if(c){I("⚠️ 运行中无法 /clear(任务进行中)");return}k(!0);return}if(ye.kind==="resume"){if(c&&!a.capable){I("⚠️ 运行中无法 /resume(任务进行中)");return}t.sessions().then(Se=>{if(Se.length===0){I("(暂无可恢复的会话)");return}O("resume"),y(Se)}).catch(Se=>I(`⚠️ /resume 失败:${Se instanceof Error?Se.message:String(Se)}`));return}if(ye.kind==="edit"){if(c){I("⚠️ 运行中无法 /edit(任务进行中)");return}gs(ye.n);return}if(T(null),!B&&!Z){const Se=()=>{ms(Ee=>({text:we.text,nonce:(Ee?.nonce??0)+1}))};t.submit(we.text,a.sid===null?void 0:{sid:a.sid}).then(Ee=>{Ee==="frontend"?I(pl):Ee==="notice"||Ee==="noop"?Se():ln(we.text)}).catch(Ee=>{I(`⚠️ submit 失败:${Ee instanceof Error?Ee.message:String(Ee)}`),Se()});return}return(async()=>{let Se,Ee;try{Se=B?(await t.attachmentSave(h)).map(Ae=>({kind:"image",ref:Ae})):void 0}catch(Ae){return I(`⚠️ 图片发送失败:${nh(Ae instanceof Error?Ae.message:String(Ae))}`),!1}try{Ee=Z?await t.fileSave(C):void 0}catch(Ae){return I(`⚠️ 文件发送失败:${rh(Ae instanceof Error?Ae.message:String(Ae))}`),!1}try{const Ae=await t.submit(we.text,{...Se!==void 0&&Se.length>0?{images:Se}:{},...Ee!==void 0&&Ee.length>0?{files:Ee}:{},...a.sid!==null?{sid:a.sid}:{}});Ae==="frontend"&&I(pl);const cl=Ae==="started"||Ae==="steered";return cl&&ln(we.text),cl}catch(Ae){return I(`⚠️ submit 失败:${Ae instanceof Error?Ae.message:String(Ae)}`),!1}})()},[t,x,c,I,M,n?.mode,gs,ln,a.capable,a.sid]),qa=i.useCallback(()=>{t.interrupt(a.sid===null?void 0:a.sid).catch(()=>{})},[t,a.sid]),Ga=i.useRef(lt);Ga.current=lt;const go=i.useCallback(u=>{Ga.current(u)},[]),[ks,pn]=i.useState([]),fn=i.useRef(!1),jo=i.useCallback(u=>{pn(h=>[...h,u])},[]),bo=i.useCallback(u=>{pn(h=>h.filter((C,B)=>B!==u))},[]);i.useEffect(()=>{if(s.connection!=="connected")return;if(d){fn.current=!1;return}if(!m||ks.length===0||fn.current)return;const u=ks[0];u!==void 0&&(fn.current=!0,pn(h=>h.slice(1)),lt(u))},[s.connection,d,m,ks,lt]);const[Va,ws]=i.useState([]),Bt=a.sessionId??void 0;i.useEffect(()=>{ws([])},[Bt]);const Ya=i.useCallback(u=>{if(Bt===void 0||Bt===""){I("⚠️ 旁问需要已连接的会话");return}const h=`sq-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;t.sideQuestion(Bt,u).then(C=>{ws(B=>[...B,{id:h,question:u,answer:C.answer,rounds:C.rounds}])}).catch(C=>{ws(B=>[...B,{id:h,question:u,answer:`⚠️ 旁问失败:${C instanceof Error?C.message:String(C)}`,rounds:0}])})},[t,Bt,I]),Xa=i.useCallback(u=>{ws(h=>h.filter(C=>C.id!==u.id)),lt(xm(u))},[lt]),yo=i.useCallback(u=>t.answerPermission(u),[t]),Ja=i.useCallback((u,h)=>{t.recallSteer(u,h).catch(()=>{})},[t]),Qa=i.useCallback(hc(t,I),[t,I]),No=i.useCallback(u=>t.answerAskUser(u),[t]),Za=i.useCallback(u=>{t.setMode(u).then(()=>I(`权限档 → ${xl(u)}`)).catch(h=>I(`⚠️ 权限档切换失败:${h instanceof Error?h.message:String(h)}`))},[t,I]),ko=i.useCallback(u=>{T(h=>({text:u,nonce:(h?.nonce??0)+1}))},[]),el=i.useCallback(()=>{T(null),ms(null)},[]),tl=i.useCallback(()=>{const u=cc(n?.mode??"workspace");t.setMode(u).then(()=>I(`权限档 → ${xl(u)}`)).catch(h=>I(`⚠️ setMode 失败:${h instanceof Error?h.message:String(h)}`))},[t,I,n?.mode]),Ss=i.useCallback(u=>{t.panelRootSet(u).then(h=>{const C=typeof h?.root=="string"&&h.root!==""?h.root:u;xe.current=!0,de(C),S([]),b(0),ie.current=[],hn(),t.agentRootSwitch(C).then(B=>{Ue(C),I(B?.applied===!1?`工作区切换已排队——当前任务结束后生效 → ${C}`:`工作区已切换(agent 工作目录已跟随)→ ${C}`)},B=>{I(`⚠️ agent 工作目录切换失败:${B instanceof Error?B.message:String(B)}——文件面板已切到 ${C}`)})},h=>{I(`⚠️ 切换失败:${h instanceof Error?h.message:String(h)}`)})},[t,I,hn]),sl=Ss,xn=i.useCallback(()=>{if(ea()===void 0){I("浏览器模式无法选择目录 — 请通过命令行启动 wudao ui --dir <path>");return}Po().then(u=>{u!==null&&Ss(u)})},[I,Ss]),Cs=i.useRef(!1),nl=i.useCallback(()=>{const u=Ce;u===null||Cs.current||(Cs.current=!0,t.agentRootSwitch(u.panelRoot).then(h=>{Cs.current=!1,h?.applied===!0?(Ue(u.panelRoot),cs(null)):cs({...u,queued:!0})},h=>{Cs.current=!1,I(`⚠️ 切换 agent 工作目录失败:${h instanceof Error?h.message:String(h)}`)}))},[t,I,Ce]),al=i.useCallback(()=>{if(Ce===null)return;const u=Ce.agentRoot;cs(null),I(u!==""?`agent 工作目录保持不变 → ${Yt(u)} (${u})`:"agent 工作目录保持不变")},[I,Ce]);i.useEffect(()=>{document.title="悟道Harness"},[n?.sessionId]);const ll=i.useMemo(()=>{if(m&&xs!==null)return xs;for(const u of Ze){if(u.kind!=="user")continue;const h=u.text,C=h.indexOf(`
339
+ `),B=(C===-1?h:h.slice(0,C)).trim();if(B!=="")return B}return"悟道Harness"},[m,xs,Ze]),wo=i.useMemo(()=>new Set(Ze.flatMap(u=>u.kind==="tool"?[u.name]:[])).size,[Ze]),rl=n!==null&&n.ctxTokens!==null&&n.ctxTokens.used!==null?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"ok",children:"✓"}),` ${wo} tools`]}):null;Ud(d,n?.sessionId??null);const vn=i.useCallback(()=>{se.current=!0;const u=Bs(),h=u==="dark"?"light":"dark";vt(h),t.settingsSet("ui.theme",h).then(()=>I(`主题 → ${h==="dark"?"暗色":"浅色"}`)).catch(C=>{vt(u),I(`⚠️ 主题切换未保存:${C instanceof Error?C.message:String(C)}`)})},[t,I]);i.useEffect(()=>{const u=h=>{const C=h.detail;C==="new-chat"?ne(!0):C==="settings"?q(!0):C==="toggle-left"?oe(B=>!B):C==="toggle-theme"&&vn()};return window.addEventListener("wudao:menu-action",u),()=>window.removeEventListener("wudao:menu-action",u)},[vn]);const wt=i.useCallback(u=>{const h=(B,Z)=>{if(!B.ok){if(Z?.(),B.reason==="occupied"){I(`⚠️ 会话正被另一个 wudao 进程(#${B.holderPid})占用——请关闭旧窗口,或稍候重试`);return}I("(会话不存在 —— 可能已被删除)")}},C=B=>I(`⚠️ resume 失败:${B instanceof Error?B.message:String(B)}`);if(a.capable){y(null);const B=Qc(n,s.lanes,u);if(B.kind==="view-main"){l(null);return}if(B.kind==="view-lane"){l(B.laneId);return}const Z=B.laneId;l(Z);const ye=()=>l(we=>we===Z?null:we);t.resume(u,Z).then(we=>h(we,ye)).catch(we=>{ye(),C(we)});return}if(c){I("⚠️ 运行中无法 切换会话(任务进行中)");return}y(null),t.resume(u).then(h,C)},[a.capable,n,s.lanes,c,t,I,l]),So=i.useMemo(()=>Jc(n,s.lanes),[n,s.lanes]),Es=i.useMemo(()=>{const u=[...ka??[]].filter(h=>h.lane!=="pet");return u.sort((h,C)=>h.mtime<C.mtime?1:h.mtime>C.mtime?-1:0),u[0]??null},[ka]),il=i.useCallback(u=>{y(null),t.resumeFork(u).then(h=>{if(h.ok){l(null),I("已基于这段对话开了新篇——直接输入你的问题,原对话保持不变"),ms(C=>({text:_t.current,nonce:(C?.nonce??0)+1}));return}if(h.reason==="busy"){I("⚠️ 任务进行中——等它跑完再追问");return}if(h.reason==="occupied"){I(`⚠️ 会话正被另一个 wudao 进程(#${h.holderPid})占用——请关闭旧窗口,或稍候重试`);return}I("(会话不存在 —— 可能已被删除)")},h=>I(`⚠️ 追问失败:${h instanceof Error?h.message:String(h)}`))},[t,I,l]),Co=i.useCallback(()=>{Es!==null&&wt(Es.id)},[Es,wt]),Eo=i.useCallback(()=>{if(c&&!a.capable){I("⚠️ 运行中无法 切换会话(任务进行中)");return}t.sessions().then(u=>{if(u.length===0){I("(暂无可追问的会话)");return}O("followup"),y(u)}).catch(u=>I(`⚠️ 打开会话列表失败:${u instanceof Error?u.message:String(u)}`))},[c,a.capable,t,I]),$s=i.useCallback((u=!1)=>{const h=u?"已开启新会话":"历史已清空",C=u?"原会话已保留在列表,随时点开切回":"已保存的历史仍在磁盘,可 /resume 恢复",B=Z=>{t.clearView(),r.filterNotes(a.key,()=>!1),I(Z)};if(s.connection!=="connected"){if(!m){I(`(${h} —— 离线且副车道无法本地清空;${C})`);return}B(`(${h} —— 离线:仅视图;${C})`);return}t.submit("/clear",a.sid===null?void 0:{sid:a.sid}).then(Z=>{Z==="cleared"?I(`(${h} —— 全新会话;${C})`):Z==="frontend"&&B(`(${h} —— 仅重置视图;${C})`)},Z=>{B(`(${h} —— /clear 未被接受: ${Z instanceof Error?Z.message:String(Z)};仅视图)`)})},[t,I,s.connection,r,a.key,a.sid,m]),$o=i.useCallback(()=>{if(c&&a.capable){const u=`wudao-${Date.now().toString(36)}-${Math.random().toString(16).slice(2,6)}`,h=`L-${u}`;l(h),t.resume(u,h).catch(C=>{l(null),I(`⚠️ 新会话创建失败:${C instanceof Error?C.message:String(C)}`)});return}if(c&&!a.capable){I("⚠️ 任务进行中,稍后再开新对话");return}$s(!0)},[c,I,$s,a.capable,t,l]),Ro=i.useMemo(()=>({client:t,sessionId:a.sessionId??""}),[t,a.sessionId]),Mo=m||n===null?n:{...n,busy:a.busy,planBoard:null,queued:[],live:{reasoning:"",answer:"",busyTools:[]}};if(s.connection!=="connected"&&s.connection!=="reconnecting"&&s.connection!=="gave-up"){const u=s.connection;return e.jsx("div",{className:"app",children:e.jsx("div",{className:"connect-shell",children:e.jsxs("div",{className:"connect-card",role:u==="auth-failed"?"alert":"status",children:[e.jsx("div",{className:"logo","aria-hidden":!0}),u==="auth-failed"?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"connect-title",children:"认证失败"}),e.jsx("div",{className:"connect-msg err",children:"Token 无效或已过期 —— 请重新打开启动时打印的 URL 完成认证"})]}):u==="closed"?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"connect-title",children:"连接已断开"}),e.jsx("div",{className:"connect-msg",children:"若刷新后仍连不上,请从 wudao 桌面应用重新打开会话(旧地址可能已失效)。"}),e.jsx("button",{type:"button",className:"wudao action",onClick:()=>window.location.reload(),children:"刷新页面重连"})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"connect-row",children:[e.jsx(Vs,{className:"spin"}),e.jsx("span",{className:"connect-title",children:"正在连接 wudao 服务…"})]}),e.jsx("div",{className:"connect-msg",children:"若长时间停留在此,请重新打开 wudao 桌面应用。"})]}),e.jsx("div",{className:"connect-meta",children:`wudao ui · ${u}${s.lastClose!==null?` · close ${s.lastClose.code}`:""}`})]})})})}const St=n?.pendingPermission??null,Rs=n?.pendingAskUser??null,Kt=s.connection==="connected",ol=e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"chat",ref:le,onScroll:fo,children:[m?e.jsx(_h,{client:t,refreshTick:Ji}):null,cn.payload!==null?e.jsx(ru,{payload:cn.payload,now:Date.now(),onClose:cn.onDismiss}):null,m&&dn!==null?e.jsx(Xd,{line:dn}):null,m&&dn===null&&Ma!==null?e.jsx(Vd,{line:Ma}):null,e.jsx(Bh,{client:t,memorySignature:n?.memorySignature}),Ui(Ze)?e.jsx(zi,{awaiting:to,onOpenSession:wt,...Es!==null?{onResumeLatest:Co,onAskFromHistory:Eo}:{}}):null,e.jsx(Lh,{history:Ze,onAction:go,onOpenFile:oo,onForkTurn:Qi,forkBadgeKeys:Ft,runningEditPaths:Xi}),m&&n?.planBoard!=null?e.jsx(Ii,{plan:n.planBoard,busy:c,onSubmit:lt}):null,n!==null&&m&&c&&St===null?e.jsx(Ju,{live:n.live,queued:n.queued,onRecall:Ja,onDetachTool:Qa}):null]}),e.jsx($r,{show:vo,onJump:xo}),nn!==null?e.jsx(Ph,{n:nn.n,onCancel:Zi}):null,Ce!==null?e.jsx(Oi,{panelRoot:Ce.panelRoot,agentRoot:Ce.agentRoot,queued:Ce.queued,onSwitch:nl,onKeep:al}):null,St!==null?e.jsx(jm,{ask:St,onChoose:u=>{t.answerPermission(u.allow,u.reason,u.scope).catch(()=>{})}}):null,St===null&&Rs!==null?e.jsx(Di,{inline:!0,question:Rs.question,options:Rs.options,onAnswer:u=>{t.answerAskUser(u).catch(()=>{})},onDismiss:()=>{t.answerAskUser().catch(()=>{})}}):null,St===null&&M===null&&!$?e.jsxs(e.Fragment,{children:[e.jsx(Mi,{qas:Va,onPromote:Xa}),e.jsx(Ri,{busy:c,mode:n?.mode??"workspace",commands:x,connected:Kt,onSubmit:lt,onInterrupt:qa,onShield:Za,onCycleMode:tl,onDraftApplied:el,onMentionApplied:uo,onBufferChange:pa,onImagesChange:fa,onImageSeedApplied:xa,onFilesChange:va,onFileSeedApplied:ga,idlePlaceholder:J,slashChip:!0,modelLabel:n?.model?.label??null,modelProvider:n?.model?.provider,modelChoices:n?.model?.choices,modelRecent:un,onPickModel:ja,onPersistModelDefault:ba,effort:R?.current?.effort??null,efforts:R!=null?[...R.efforts??[]]:void 0,onPickEffort:u=>{t.submit(`/effort ${u}`).then(()=>{I(`effort → ${u} — 下一轮生效`),Nt()}).catch(h=>I(`⚠️ /effort 失败:${h instanceof Error?h.message:String(h)}`))},effortProviderLabel:Ol(R,n?.model?.provider),onPersistEffortDefault:ya,...A==="buddy"?{controlsLead:e.jsx(Ki,{client:t,root:te,bootRoot:Ie!==""?Ie:void 0,connected:Kt,onPick:sl,onOpenOther:xn})}:{},...G!==null?{draft:G}:hs!==null?{draft:hs}:{},...ds!==null?{imageSeed:ds}:{},...us!==null?{fileSeed:us}:{},...Re!==null?{mention:Re}:{},onSideAsk:Ya})]}):null]});return e.jsx(pi.Provider,{value:Ro,children:e.jsxs("div",{className:"app",children:[e.jsxs("div",{className:"topbar","data-tauri-drag-region":"",onMouseDown:u=>{if(u.target.closest("button")===null){if(u.detail===2){_o();return}Fo()}},children:[e.jsxs("span",{className:"sp","data-tauri-drag-region":"",children:[e.jsx("span",{className:"tb-name","data-tauri-drag-region":"",title:ll,children:ll}),A!=="simple"&&rl!==null?e.jsx("span",{className:"tb-run","data-tauri-drag-region":"",children:rl}):null]}),A!=="buddy"?e.jsx("button",{type:"button",className:"icobtn new-chat","aria-label":"新对话",title:"新对话(清空当前会话)",onClick:()=>{if(c){I("⚠️ 运行中无法 /clear(任务进行中)");return}ne(!0)},children:e.jsx(Tr,{})}):null,rn.fileCount>0?e.jsx("button",{type:"button",className:"tb-changes","aria-label":"查看会话改动",title:"本会话改了哪些文件",onClick:()=>Ot(!0),children:`改动 ${rn.fileCount} 文件`}):null,on.totalSteps>0?e.jsx("button",{type:"button",className:"tb-changes tb-computer","aria-label":"查看电脑操作",title:"本会话在电脑上做了什么",onClick:()=>It(!0),children:`电脑操作 ${on.totalSteps} 步`}):null,nt!==null&&nt.length>0?e.jsx("button",{type:"button",className:"tb-changes tb-sched","aria-label":"查看定时任务",title:"定时任务与提醒",onClick:()=>os(!0),children:`定时 ${nt.length}`}):null,A!=="buddy"?e.jsx("button",{type:"button",className:"icobtn sessions","aria-label":"会话列表",title:"切换会话",onClick:()=>{if(c&&!a.capable){I("⚠️ 运行中无法 切换会话(任务进行中)");return}fe(!0)},children:e.jsx(sd,{})}):null,A==="advanced"?e.jsx("button",{type:"button",className:"icobtn","aria-pressed":Ge,"aria-label":"审查专注",title:Ge?"退出审查专注 (Ctrl+Shift+\\)":"审查专注 (Ctrl+Shift+\\)",onClick:Te,children:e.jsx(cd,{})}):null,e.jsx("button",{type:"button",className:"icobtn","aria-label":"切换主题",title:"切换主题(浅色/暗色)",onClick:vn,children:e.jsx(td,{})}),e.jsx("button",{type:"button",className:"icobtn","aria-label":"监控",title:"监控(探针仪表盘)",onClick:()=>W(!0),children:e.jsx(ed,{})}),e.jsx("button",{type:"button",className:"icobtn","aria-label":"设置",title:"设置",onClick:()=>q(!0),children:e.jsx(Dr,{})})]}),_!=="show"&&R!==null&&!kr(R.providers)?e.jsxs("div",{className:"no-key-banner",role:"status",children:["未配置任何模型 Key —— 当前为只读浏览模式",e.jsx("button",{type:"button",className:"wudao action",onClick:()=>z("show"),children:"去配置"})]}):null,s.connection==="reconnecting"?e.jsxs("div",{className:"banner quiet",role:"status",children:["连接断开",s.lastClose!==null?`(close ${s.lastClose.code})`:""," — 正在重连",s.reconnectAttempt>1?`(第 ${s.reconnectAttempt}/${Pn} 次)`:"","… 重连后自动回放历史"]}):null,s.connection==="gave-up"?e.jsxs("div",{className:"banner",role:"alert",children:[`连接已断开 — 已连续重连 ${Pn} 次未成功。在 wudao 桌面应用窗口里遇到时,重启应用即可;在浏览器标签里,请从 wudao 桌面应用重新打开会话(这个旧页面的地址可能已失效)。`,e.jsx("button",{type:"button",className:"wudao action",onClick:()=>t.reconnect(),children:"重连"})]}):null,X?e.jsx(fp,{client:t,status:n,connected:Kt,onClose:()=>W(!1)}):null,V?e.jsx(ap,{client:t,status:n,pendingAsk:St!==null,onClose:()=>{q(!1),Nt()},onModeApplied:u=>{H(u),I(`已切换到${u==="simple"?"简洁模式":u==="buddy"?"Buddy 模式":"高级模式"} — 重载后完全生效`)},onAccentPicked:()=>{he.current=!0},language:R?.language??null}):A==="simple"?e.jsx(cp,{status:Mo,history:Ze,connected:Kt,commands:x,onSubmit:lt,onSideAsk:Ya,sideQas:Va,onPromoteSideQa:Xa,onInterrupt:qa,onCycleMode:tl,onAnswerPermission:yo,onRecallSteer:Ja,onDetachTool:Qa,pendingAsk:Rs,onAnswerAskUser:No,onShield:Za,notify:I,parked:ks,onPark:jo,onDropParked:bo,onDraftApplied:el,onBufferChange:pa,onImagesChange:fa,onImageSeedApplied:xa,onFilesChange:va,onFileSeedApplied:ga,modelLabel:n?.model?.label??null,modelProvider:n?.model?.provider,modelChoices:n?.model?.choices,modelRecent:un,onPickModel:ja,onPersistModelDefault:ba,effort:R?.current?.effort??null,efforts:R!=null?[...R.efforts??[]]:void 0,onPickEffort:u=>{t.submit(`/effort ${u}`).then(()=>{I(`effort → ${u} — 下一轮生效`),Nt()}).catch(h=>I(`⚠️ /effort 失败:${h instanceof Error?h.message:String(h)}`))},effortProviderLabel:Ol(R,n?.model?.provider),onPersistEffortDefault:ya,workspaceRoot:te,bootRoot:Ie!==""?Ie:void 0,onSwitchWorkspace:Ss,onOpenOtherWorkspace:xn,rootCard:Ce,onAgentRootSwitch:nl,onAgentRootKeep:al,fileOpsClient:t,...G!==null?{draft:G}:hs!==null?{draft:hs}:{},...ds!==null?{imageSeed:ds}:{},...us!==null?{fileSeed:us}:{}}):A==="buddy"?e.jsxs("div",{className:"buddy",style:{"--buddy-w":at?"0px":`${_c}px`},children:[e.jsx("div",{className:"buddy-cell buddy-left",children:at?null:e.jsx(Pd,{client:t,activeSessionId:a.sessionId,onResume:wt,onNewChat:$o,onOpenSettings:()=>q(!0),onOpenSearch:()=>{if(c&&!a.capable){I("⚠️ 运行中无法 切换会话(任务进行中)");return}fe(!0)},onRenameSession:Wi,sessionsEpoch:ps,awaitingIds:so,busySessionIds:So,onFollowUp:il})}),e.jsx("div",{className:"buddy-cell buddy-main",children:ol}),e.jsx("button",{type:"button",className:"ide-toggle buddy-toggle","aria-label":at?"展开会话列表":"折叠会话列表",title:at?"展开会话列表":"折叠会话列表",onClick:()=>L(u=>!u),children:at?"▸":"◂"})]}):e.jsx(e.Fragment,{children:e.jsxs("div",{className:"ide",style:{"--tree-w":ee?"0px":`${me}px`,"--mid-w":E?"0px":"1fr","--chat-w":Ne?"0px":`${ge}px`},children:[e.jsx("div",{className:"ide-cell ide-left",children:_!=="checking"?e.jsx(yp,{client:t,workspaceRoot:te,bootRoot:Ie!==""?Ie:void 0,selectedPath:bs?.path??null,onSelect:ro,onAtMention:co,refreshKey:Pe,onSwitchWorkspace:sl,onOpenOtherWorkspace:xn,onPathsChange:ho,modifiedPaths:js.current,modifiedKey:ao,onManualRefresh:hn},te):null}),e.jsxs("div",{className:"ide-cell ide-center",children:[e.jsxs("div",{className:"tabbar",role:"tablist",children:[f.length===0?e.jsx("span",{className:"tab-empty",title:"从左侧选择文件打开标签",children:"+"}):f.map((u,h)=>e.jsxs("div",{className:`tab${h===w?" active":""}`,"data-path":u.path,role:"tab","aria-selected":h===w,title:u.path,tabIndex:0,onKeyDown:C=>{(C.key==="Enter"||C.key===" ")&&(C.preventDefault(),b(h))},onClick:()=>b(h),children:[u.isDir?e.jsx(es,{size:12}):e.jsx(Mr,{size:12}),e.jsx("span",{className:"tname",children:u.name}),e.jsx("button",{type:"button",className:"tclose","aria-label":`关闭 ${u.name}`,title:`关闭 ${u.name}`,onClick:C=>{C.stopPropagation(),Ns(h)},children:e.jsx(ts,{size:12})})]},u.path)),E?null:e.jsx("button",{type:"button",className:"tabbar-collapse","aria-label":"折叠中栏",title:"折叠中栏",onClick:()=>U(!0),children:"◂"})]}),e.jsx($p,{client:t,path:bs?.path??null,isDir:bs?.isDir??!1,onOpenPath:ys,onReadFailed:io,refreshEpoch:a.historyEpoch,onClose:lo,onPrefill:ko})]}),e.jsx("div",{className:"ide-cell ide-right",children:ol}),e.jsx("button",{type:"button",className:"ide-toggle","data-side":"left","aria-label":ee?"展开文件树":"折叠文件树",title:ee?"展开文件树":"折叠文件树",onClick:()=>oe(u=>!u),children:ee?"▸":"◂"}),e.jsx("button",{type:"button",className:"ide-toggle","data-side":"right","aria-label":Ne?"展开会话栏":"折叠会话栏",title:Ne?"展开会话栏":"折叠会话栏",onClick:()=>ke(u=>!u),children:Ne?"◂":"▸"}),E?e.jsx("button",{type:"button",className:"ide-toggle","data-side":"center","aria-label":"展开中栏",title:"展开中栏",onClick:()=>U(!1),children:"▸"}):null,ee?null:e.jsx("div",{className:"ide-drag","data-side":"left",role:"separator","aria-orientation":"vertical","aria-label":"文件树宽度",title:"拖动调整宽度 · 双击重置",tabIndex:0,"aria-valuemin":Os,"aria-valuemax":Is(),"aria-valuenow":me,onKeyDown:Ha("left"),onMouseDown:Ua("left"),onDoubleClick:Wa("left")}),Ne?null:e.jsx("div",{className:"ide-drag","data-side":"right",role:"separator","aria-orientation":"vertical","aria-label":"会话栏宽度",title:"拖动调整宽度 · 双击重置",tabIndex:0,"aria-valuemin":Os,"aria-valuemax":Is(),"aria-valuenow":ge,onKeyDown:Ha("right"),onMouseDown:Ua("right"),onDoubleClick:Wa("right")})]})}),A!=="simple"?e.jsx(Yh,{status:n,ctxInfo:()=>t.ctxInfo(),stale:!Kt,sessionName:xs??void 0,buddy:A==="buddy",workspaceName:ue!==""?Yt(ue):void 0,workspacePath:ue!==""?ue:void 0}):null,Y?e.jsx(Vc,{getAllKnownPaths:mo,onOpenPath:po,onClose:()=>Q(!1)}):null,re?e.jsx(Fd,{rows:be,onPick:u=>{fe(!1),wt(u)},onClose:()=>fe(!1),onSearch:u=>t.sessionSearch(u),activeId:a.sessionId,onDelete:Hi,trashRows:mt,onRestore:qi}):null,Qe?e.jsx(Lp,{agg:rn,onClose:()=>Ot(!1),onRevert:(u,h)=>{t.fileRevert(u,h).then(C=>I(C.message),C=>I(`恢复没成功:${C instanceof Error?C.message:String(C)}`))}}):null,ls?e.jsx(Kp,{agg:on,onClose:()=>It(!1)}):null,Zs&&nt!==null?e.jsx(qp,{rows:Up(nt,Lt),onClose:()=>os(!1),onToggle:Gi,onRemove:Vi,onRun:Yi}):null,M!==null?e.jsx(ym,{rows:M,intent:g,onPick:g==="followup"?il:wt,onCancel:()=>{y(null),O("resume")}}):null,$?e.jsx(Nm,{onChoose:u=>{k(!1),u?$s():I("(已取消清空)")}}):null,je?e.jsx(Kd,{onChoose:u=>{ne(!1),u&&$s()}}):null,e.jsx("div",{className:"sr-only","aria-live":"polite",role:"status",children:`${c?"生成中…":"空闲"}${N.length>0?` · ${N[N.length-1].text}`:""}`}),_==="show"&&R!==null?e.jsx(rp,{client:t,status:n,settings:R,onDone:()=>{z("done"),Nt()}}):null]})})}function df(t,s){return Xo(t,s)}function uf(t,s=Vo){let n=null,a=-1/0,l=null,r=null,o=!1;const c=()=>{r=null;const d=l;l=null,d!==null&&(n=d,a=t.now(),Promise.resolve(t.emit(dl,d)).catch(()=>{}))};return{push(d){if(o)return;if(n!==null&&df(d,n)){l=null,r!==null&&(clearTimeout(r),r=null);return}const m=a+s-t.now();if(m<=0){r!==null&&(clearTimeout(r),r=null),l=null,n=d,a=t.now(),Promise.resolve(t.emit(dl,d)).catch(()=>{});return}l=d,r===null&&(r=setTimeout(c,m))},cancel(){o=!0,l=null,r!==null&&(clearTimeout(r),r=null)}}}function hf(t,s){const n={emit:(j,N)=>gr(j,N),listen:(j,N)=>ns(j,N),now:()=>Date.now(),submit:j=>t.submit(j)},a=()=>t.getSnapshot().pet!==void 0,l=j=>{if(j.startsWith("/")){Promise.resolve(n.emit(Yo,{text:"精灵窗口不支持斜杠命令——直接提问,或到主窗口输入命令"})).catch(()=>{});return}t.petSubmit(j).catch(()=>{})},r=uf(n);let o=!1;const c=t.subscribe(()=>{const j=t.getSnapshot(),N=zo(j.pet!==void 0?{status:j.pet}:j);if(N!==null){if(j.connection==="connected"){o=!0,r.push(N);return}o&&r.push(Bo)}});let d=null,m=null,p=null,v=!1;Promise.resolve(n.listen(Ko,j=>{const N=String(j?.text??"").trim();N!==""&&(a()?l(N):n.submit(N).catch(()=>{}))})).then(j=>{v?j?.():d=j}),Promise.resolve(n.listen(Uo,j=>{const N=Wo(j);N!==null&&(a()?t.petAnswerPermission(N.allow,void 0,N.scope):t.answerPermission(N.allow,void 0,N.scope)).catch(()=>{})})).then(j=>{v?j?.():m=j}),Promise.resolve(n.listen(Ho,j=>{const N=j?.text;if(typeof N!="string")return;const M=N.trim();M!==""&&(a()?l(M):n.submit(M).catch(()=>{}))})).then(j=>{v?j?.():p=j});let x=null;return Promise.resolve(n.listen(qo,()=>{a()&&t.petHistory().then(j=>{Promise.resolve(n.emit(Go,{turns:j})).catch(()=>{})},()=>{})})).then(j=>{v?j?.():x=j}),()=>{v=!0,c(),d?.(),m?.(),p?.(),x?.(),r.cancel()}}const mf="tauri://close-requested",vr="main";function pf(t){return t===!0?"hide":"close"}function ff(t=window){if(typeof t!="object"||t===null)return null;const s=t.__TAURI_INTERNALS__;if(typeof s!="object"||s===null)return null;const n=s.metadata;if(typeof n!="object"||n===null)return null;const a=n.currentWindow?.label;return typeof a=="string"&&a!==""?a:null}async function xf(){const t=ea();if(!t)return!1;try{return await t("plugin:window|hide"),!0}catch{return!1}}async function vf(){const t=ea();if(!t)return!1;try{return await t("plugin:window|destroy"),!0}catch{return!1}}async function gf(t){let s;try{s=await t.readSetting()}catch{s=void 0}return pf(s)==="hide"&&await(t.hide??xf)()?"hidden":(await(t.destroy??vf)(),"closed")}function jf(t){ff()===vr&&ns(mf,()=>{gf({readSetting:async()=>(await t.settingsStatus())?.settings?.desktopBackgroundOnClose})},{kind:"Window",label:vr})}const Zn=Ln();Zn!==null&&(document.documentElement.dataset.shell=Zn);Zn==="desktop"&&document.documentElement.classList.add("glass");fc();Qt("get_pet_skin",{}).then(t=>{document.documentElement.dataset.petSkin=br(t)});ns(Zo,t=>{if(typeof t!="object"||t===null)return;const s=t.skin;if(typeof s!="string")return;const n=br(s);n===s&&(document.documentElement.dataset.petSkin=n)});const bf=ac(),as=new uc({url:lc(),token:bf});as.connect();hf(as);rf();jf(as);Jo(as);const yf=Qo.createRoot(document.getElementById("root")??document.body);yf.render(e.jsx(i.StrictMode,{children:e.jsx(cf,{client:as})}));