claude-simple 0.2.4 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,38 +1,38 @@
1
- var qs=Object.defineProperty;var Uo=Object.getOwnPropertyDescriptor;var Bo=Object.getOwnPropertyNames;var Fo=Object.prototype.hasOwnProperty;var X=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ws=(e,t)=>{for(var s in t)qs(e,s,{get:t[s],enumerable:!0})},Os=(e,t,s,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Bo(t))!Fo.call(e,o)&&o!==s&&qs(e,o,{get:()=>t[o],enumerable:!(a=Uo(t,o))||a.enumerable});return e},Vn=(e,t,s)=>(Os(e,t,"default"),s&&Os(s,t,"default"));var n={};import*as mr from"https://cdn.jsdelivr.net/gh/forechoandlook/mini-react@v0.1.13/dist/mini-react.min.js";var C=X(()=>{Vn(n,mr)});var Vs={};Ws(Vs,{AGENT_DEFAULT_MODEL:()=>zs,AGENT_LABELS:()=>R,AGENT_MODELS:()=>Yn,LOW_TURN_THRESHOLD:()=>Qn,activityHits:()=>ue,activityLoading:()=>Te,addCustomModel:()=>Et,agentFilter:()=>Q,agentsMeta:()=>lt,chatDensity:()=>Me,collapsedFolders:()=>rt,ctx:()=>f,currentAgent:()=>S,currentEffort:()=>pe,currentModel:()=>$,currentPermission:()=>Mt,currentProject:()=>y,currentTab:()=>j,expandedFolders:()=>it,favoritesOnly:()=>Pe,filesPath:()=>A,filesRoot:()=>O,filteredSessions:()=>Re,getCustomModels:()=>nn,getDefaultModel:()=>re,getEffortsForModel:()=>It,getModelsForAgent:()=>fe,getSessionMeta:()=>ct,gitRoot:()=>J,hubMachineReady:()=>Ee,hubMode:()=>k,isProcessing:()=>ie,machinesList:()=>D,metaKey:()=>U,projectGroups:()=>Ke,removeCustomModel:()=>ts,selectedMachineId:()=>T,sessionDisplayTitle:()=>Je,sessionFilter:()=>B,sessionMetaMap:()=>v,sessionSearch:()=>N,sessionSort:()=>Gs,sessionsData:()=>E,setAgent:()=>me,setChatDensity:()=>Zn,setSelectedMachine:()=>Z,showHiddenOnly:()=>Ne,sidebarView:()=>Le,timeRange:()=>te,viewingFile:()=>F,workspacesData:()=>P,wsStatus:()=>Se});function Z(e){let t=e||null;T.value=t,f.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function U(e,t,s){let a=`${e||"claude"}:${t}`;return s||f?.machineId?`${s||f.machineId}:${a}`:a}function ct(e,t,s){return v.peek()?.[U(e,t,s)]||{favorite:!1,notes:"",title:"",hidden:!1}}function Je(e,{preferSnippet:t=!1}={}){if(!e)return"Session";if(t&&e.snippet)return e.snippet;let a=(ct(e.agent,e.sessionId,e.machineId).title||"").trim();return a||e.display||e.sessionId?.slice(0,8)||"Session"}function Zn(e){let t=["clean","normal","full"].includes(e)?e:"normal";Me.value=t,localStorage.setItem("chatDensity",t),document.getElementById("messages")?.setAttribute("data-density",t)}function Oo(e){return e?typeof e=="string"?{value:e,label:e}:e.value?{value:String(e.value),label:e.label||e.value,...Array.isArray(e.efforts)&&e.efforts.length?{efforts:e.efforts.map(String)}:{},...e.defaultEffort?{defaultEffort:String(e.defaultEffort)}:{}}:null:null}function es(){try{let e=localStorage.getItem(Js);if(!e)return{};let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function Ks(e){localStorage.setItem(Js,JSON.stringify(e))}function nn(e){let t=(e||"claude").toLowerCase(),s=es()[t];return Array.isArray(s)?s.filter(Boolean).map(String):[]}function Et(e,t){let s=(e||"claude").toLowerCase(),a=String(t||"").trim();if(!a)return!1;let o=es(),i=Array.isArray(o[s])?[...o[s]]:[];return i.includes(a)||i.push(a),o[s]=i,Ks(o),!0}function ts(e,t){let s=(e||"claude").toLowerCase(),a=String(t||"").trim(),o=es(),i=Array.isArray(o[s])?o[s].filter(r=>r!==a):[];return o[s]=i,Ks(o),!0}function fe(e){let t=(e||"claude").toLowerCase(),s=lt.peek()?.defaults?.[t],a=s?.models?.length?s.models.map(Oo).filter(Boolean):(Yn[t]||Yn.claude).map(r=>({...r})),o=nn(t),i=new Set(a.map(r=>r.value));for(let r of o){if(i.has(r)){a=a.map(c=>{if(c.value!==r)return c;let p=String(c.label||c.value);return{...c,custom:!0,label:p.includes("\u2605")?p:`${p} \u2605`}});continue}i.add(r),a.push({value:r,label:`${r} \u2605`,custom:!0})}return a}function re(e){let t=(e||"claude").toLowerCase(),s=lt.peek()?.defaults?.[t];return s?.model?String(s.model):zs[t]||fe(t)[0]?.value||"claude-sonnet-4-5"}function It(e,t){let a=fe(e).find(i=>i.value===t);if(a?.efforts?.length)return a.efforts;let o=lt.peek()?.defaults?.[(e||"claude").toLowerCase()];return o?.efforts?.length?o.efforts.map(String):["low","medium","high","xhigh","max"]}function me(e){let t=(e||"claude").toLowerCase();S.value=t,localStorage.setItem("agent",t);let s=fe(t),a=re(t);s.some(o=>o.value===$.peek())||($.value=a,localStorage.setItem("model",a))}function qo(e,t){return!t||t==="all"?!0:(e.agent||"claude")===t}function Wo(e,t){let s=parseInt(t||"0",10)||0;if(s<=0)return!0;let a=e.updatedAt||0;if(typeof a=="string"){let o=Number(a);a=Number.isFinite(o)&&o>0?o<1e12?o*1e3:o:Date.parse(a)||0}else typeof a=="number"&&a>0&&a<1e12&&(a=a*1e3);return a>=Date.now()-s*864e5}function Go(e,t){if(!t)return!0;let s=v.value?.[U(e.agent,e.sessionId,e.machineId)];return[e.display,e.cwd,e.projectName,e.agent,e.sessionId,e.snippet,e.machineId,s?.notes,s?.title].filter(Boolean).join(" ").toLowerCase().includes(t)}function Xn(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}var E,P,B,N,Gs,it,rt,A,F,y,j,ie,Se,S,$,pe,Mt,O,J,lt,Le,Q,te,ue,Te,v,Pe,Ne,Qn,Me,k,D,T,Ee,f,R,Yn,zs,Js,Re,Ke,I=X(()=>{C();E=(0,n.signal)([]),P=(0,n.signal)([]),B=(0,n.signal)(null),N=(0,n.signal)(""),Gs=(0,n.signal)("time"),it=(0,n.signal)(new Set),rt=(0,n.signal)(new Set),A=(0,n.signal)(""),F=(0,n.signal)(null),y=(0,n.signal)(null),j=(0,n.signal)("chat"),ie=(0,n.signal)(!1),Se=(0,n.signal)("idle"),S=(0,n.signal)(localStorage.getItem("agent")||"claude"),$=(0,n.signal)(localStorage.getItem("model")||"claude-sonnet-4-5"),pe=(0,n.signal)(""),Mt=(0,n.signal)("default"),O=(0,n.signal)(""),J=(0,n.signal)(""),lt=(0,n.signal)(null),Le=(0,n.signal)(localStorage.getItem("sidebarView")||"projects"),Q=(0,n.signal)(localStorage.getItem("agentFilter")||"all"),te=(0,n.signal)(localStorage.getItem("timeRange")||"14"),ue=(0,n.signal)(null),Te=(0,n.signal)(!1),v=(0,n.signal)({}),Pe=(0,n.signal)(localStorage.getItem("favoritesOnly")==="1"),Ne=(0,n.signal)(localStorage.getItem("showHiddenOnly")==="1"),Qn=2,Me=(0,n.signal)(localStorage.getItem("chatDensity")||"normal"),k=(0,n.signal)(!1),D=(0,n.signal)([]),T=(0,n.signal)(null),Ee=(0,n.signal)(!1),f={token:localStorage.getItem("token"),sessionId:null,agent:null,machineId:null,ws:null,shellBubble:null,configDir:null};R={claude:"Claude",codex:"Codex",grok:"Grok"},Yn={claude:[{value:"claude-sonnet-4-5",label:"sonnet-4-5"},{value:"claude-sonnet-4-6",label:"sonnet-4-6"},{value:"claude-opus-4-5",label:"opus-4-5"},{value:"claude-haiku-4-5",label:"haiku-4-5"}],codex:[{value:"gpt-5.4",label:"gpt-5.4"},{value:"gpt-5.3",label:"gpt-5.3"},{value:"gpt-5.2",label:"gpt-5.2"},{value:"o3",label:"o3"},{value:"o4-mini",label:"o4-mini"},{value:"codex-mini-latest",label:"codex-mini"}],grok:[{value:"grok-4.5",label:"grok-4.5"},{value:"grok-4",label:"grok-4"},{value:"grok-3",label:"grok-3"},{value:"grok-3-mini",label:"grok-3-mini"}]},zs={claude:"claude-sonnet-4-5",codex:"gpt-5.4",grok:"grok-4.5"};Js="customModelsByAgent";Re=(0,n.computed)(()=>{let e=B.value,t=N.value.toLowerCase().trim(),s=Gs.value,a=Q.value,o=te.value,i=Pe.value,r=Ne.value,c=v.value,p=ue.value,l=p?.results?.length&&t?Xn(p.results):Xn(E.value);e&&(l=l.filter(u=>u&&(u.cwd===e||u.configDir===e)));let d=T.value;return k.value&&d&&(l=l.filter(u=>u&&(!u.machineId||u.machineId===d))),l=l.filter(u=>u&&qo(u,a)&&Wo(u,o)),r?l=l.filter(u=>u&&c?.[U(u.agent,u.sessionId,u.machineId)]?.hidden):l=l.filter(u=>u&&!c?.[U(u.agent,u.sessionId,u.machineId)]?.hidden),i&&(l=l.filter(u=>u&&c?.[U(u.agent,u.sessionId,u.machineId)]?.favorite)),t&&!(p?.results&&p.q===t)&&(l=l.filter(u=>u&&Go(u,t))),l=[...l].sort((u,m)=>{let b=c?.[U(u.agent,u.sessionId,u.machineId)]?.favorite?1:0,x=c?.[U(m.agent,m.sessionId,m.machineId)]?.favorite?1:0;return b!==x?x-b:s==="project"&&(u.cwd||"").localeCompare(m.cwd||"")||m.updatedAt-u.updatedAt}),!e&&!t&&!i?l.slice(0,120):l}),Ke=(0,n.computed)(()=>{let e=Xn(Re.value),t=new Map;for(let s of e){if(!s)continue;let a=s.machineId?`${s.machineId}::${s.cwd||"(no path)"}`:s.cwd||"(no path)";t.has(a)||t.set(a,{cwd:s.cwd||null,machineId:s.machineId||null,projectName:s.projectName||(s.cwd?s.cwd.split("/").filter(Boolean).pop():"(no path)"),updatedAt:0,agents:{},sessions:[],latest:null});let o=t.get(a);o.sessions.push(s),o.agents[s.agent||"claude"]=(o.agents[s.agent||"claude"]||0)+1,(s.updatedAt||0)>o.updatedAt&&(o.updatedAt=s.updatedAt,o.latest=s)}return[...t.values()].sort((s,a)=>a.updatedAt-s.updatedAt)})});function Ct(e={}){return e.machineId!==void 0?e.machineId:f.machineId||T.peek()||null}function Jo(e){let t=e.split("?")[0];return t==="/api/hub"||t==="/api/machines"||t.startsWith("/api/auth/")}async function h(e,t,s,a,o={}){let i=Ct(o),r={"Content-Type":"application/json",...f.token?{Authorization:`Bearer ${f.token}`}:{}};k.peek()&&i&&!Jo(t)&&(r["X-Machine-Id"]=i);let c=o.etag===!0?`${f.token||""}:${i||""}:${t}`:o.etag||null;if(e.toUpperCase()==="GET"&&c){let d=Ys.get(c);d&&(r["If-None-Match"]=d)}let p=async()=>{let d=await fetch(t,{method:e,signal:a,headers:r,...s!==void 0?{body:JSON.stringify(s)}:{}});if(d.status===304)return ns;let u=await d.json().catch(()=>({}));if(!d.ok)throw new Error(u.error||`HTTP ${d.status}`);if(c){let m=d.headers.get("ETag");m&&Ys.set(c,m)}return u};if(e.toUpperCase()!=="GET"||a||o.dedupe===!1)return p();let l=`${f.token||""}:${i||""}:${t}`;return zo.get(l,p)}function At(e){return f.ws?.readyState===WebSocket.OPEN?(f.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||sn.push(e),!1)}function Xs(){for(;sn.length&&f.ws?.readyState===WebSocket.OPEN;)f.ws.send(JSON.stringify(sn.shift()))}function Qs(){sn.length=0}function Zs(e={}){let t=new URLSearchParams(e);f.token&&t.set("token",f.token);let s=Ct();return k.peek()&&s&&t.set("machine",s),t.toString()}function Ue(e={}){let t={...e};f.token&&(t.Authorization=`Bearer ${f.token}`);let s=Ct();return k.peek()&&s&&(t["X-Machine-Id"]=s),t}async function dt(){try{let e=await fetch("/api/hub");if(!e.ok)return k.value=!1,!1;let t=await e.json();if(t?.hub)return k.value=!0,t}catch{}return k.value=!1,!1}var zo,Ys,ns,sn,K=X(()=>{I();C();zo=(0,n.createFetch)({cache:!1,dedupe:!0,retry:0}),Ys=new Map,ns=Symbol("not-modified");sn=[]});function Ve(){try{let e=localStorage.getItem(aa);return e?JSON.parse(e):null}catch{return null}}function ss(e){try{let s={...Ve()||{},...e,updatedAt:Date.now()};localStorage.setItem(aa,JSON.stringify(s))}catch{}}var aa,an=X(()=>{aa="lastSessionContext"});async function as(){if(jt&&!(typeof navigator>"u"||!navigator.wakeLock?.request)&&document.visibilityState==="visible"&&!Ye)try{Ye=await navigator.wakeLock.request("screen"),Ye.addEventListener("release",()=>{Ye=null,jt&&document.visibilityState==="visible"&&setTimeout(()=>{as().catch(()=>{})},500)})}catch{Ye=null}}async function oa(){let e=Ye;if(Ye=null,!!e)try{await e.release()}catch{}}function ia(e){jt=!!e,jt?as().catch(()=>{}):oa().catch(()=>{})}function ra(){typeof document>"u"||document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&jt?as().catch(()=>{}):document.visibilityState==="hidden"&&oa().catch(()=>{})})}var Ye,jt,la=X(()=>{Ye=null,jt=!1});function _(e){if(e==null||e==="")return null;if(typeof e=="number")return!Number.isFinite(e)||e<=0?null:e<1e12?Math.round(e*1e3):Math.round(e);if(typeof e=="string"){let t=e.trim();if(/^\d+(\.\d+)?$/.test(t))return _(Number(t));let s=Date.parse(t);return Number.isNaN(s)?null:s}return null}function ut(e){let t=_(e);if(t==null)return"";let s=Date.now()-t;return s<0?new Date(t).toLocaleDateString():s<6e4?"just now":s<36e5?`${Math.floor(s/6e4)}m ago`:s<864e5?`${Math.floor(s/36e5)}h ago`:s<7*864e5?`${Math.floor(s/864e5)}d ago`:new Date(t).toLocaleDateString()}function Xe(e,t=!0){let s=e||"claude",o={claude:"bg-orange-500/15 text-orange-400",codex:"bg-emerald-500/15 text-emerald-400",grok:"bg-sky-500/15 text-sky-400"}[s]||"bg-base-300 text-base-content/50",i=t?s==="claude"?"CC":s==="codex"?"CX":s==="grok"?"GX":s.slice(0,2).toUpperCase():R[s]||s;return`<span class="text-[9px] px-1 py-0.5 rounded font-mono font-semibold flex-shrink-0 ${o}" title="${(0,n.esc)(R[s]||s)}">${i}</span>`}function ca(e){return Object.entries(e||{}).filter(([,t])=>t>0).map(([t,s])=>`${Xe(t)}<span class="text-[9px] text-base-content/40 -ml-0.5">${s}</span>`).join("")}function Qe(e){if(!e)return"";let t="",s=e.split("/").filter(Boolean);return s.length<=3?e:"\u2026/"+s.slice(-2).join("/")}var Dt=X(()=>{C();I()});function Ko(){return R[S.peek()]||"Assistant"}function ba(e){return e.scrollHeight-e.scrollTop-e.clientHeight<80}function se(e,t){e&&(t||ba(e))&&(e.scrollTop=e.scrollHeight)}function Vo(){da||(da=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(xe=400,on({probe:!0}),f.ws?.readyState===WebSocket.OPEN&&f.sessionId))try{f.ws.send(JSON.stringify({type:"subscribe",sessionId:f.sessionId}))}catch{}}),window.addEventListener("online",()=>{xe=400,on({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?on({force:!0}):on({probe:!0})}))}function Ut(){let e=(0,n.$)("conn-dot");if(!e)return;let t=Se.peek();e.classList.remove("bg-success","bg-warning","bg-error","bg-base-content/30","animate-pulse"),t==="open"?(e.classList.add("bg-success"),e.title="\u5DF2\u8FDE\u63A5"):t==="connecting"||t==="reconnecting"?(e.classList.add("bg-warning","animate-pulse"),e.title=t==="connecting"?"\u8FDE\u63A5\u4E2D\u2026":"\u91CD\u8FDE\u4E2D\u2026"):t==="offline"?(e.classList.add("bg-error"),e.title="\u79BB\u7EBF"):(e.classList.add("bg-base-content/30"),e.title="\u672A\u8FDE\u63A5")}function on(e={}){let t=f.ws?.readyState;if(e.force){xe=400,je({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&Ce&&Date.now()-Ce>45e3)try{f.ws.close()}catch{}else if(e.probe&&f.ws.readyState===WebSocket.OPEN)try{f.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(xe=Math.min(xe,800),je({quiet:!0}))}function Yo(){Ae||(Se.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Ut(),Ae=setTimeout(()=>{Ae=null,je({quiet:!0})},xe),xe=Math.min(Math.round(xe*1.8),15e3))}function ga(){ln&&(clearInterval(ln),ln=null)}function Xo(e,t){ga(),ln=setInterval(()=>{if(!(t!==Ht||e.readyState!==WebSocket.OPEN)){if(Ce&&Date.now()-Ce>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&Ce&&Date.now()-Ce>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function Ze(){let e=ie.peek()||!!y.peek()&&Se.peek()==="open";ia(e)}function Qo(){xe=400,Ae&&(clearTimeout(Ae),Ae=null),dn=!1;let e=f.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{f.ws?.close()}catch{}je({quiet:!1}),g("\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65\u2026")}function je(e={}){Vo(),Ae&&(clearTimeout(Ae),Ae=null),e.quiet&&(dn=!0);let t=f.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);pa!==t&&(Qs(),pa=t);let s=++Ht;try{f.ws?.close()}catch{}Se.value="connecting",Ut();let a=location.protocol==="https:"?"wss":"ws",o=new URLSearchParams;f.token&&o.set("token",f.token),t&&o.set("machine",t),f.sessionId&&o.set("sessionId",f.sessionId);let i=new WebSocket(`${a}://${location.host}/ws/chat?${o}`);f.ws=i,i.addEventListener("open",()=>{if(s===Ht){if(xe=1e3,Ce=Date.now(),Se.value="open",Ut(),f.sessionId)try{i.send(JSON.stringify({type:"subscribe",sessionId:f.sessionId}))}catch{}Xs(),Xo(i,s),Ze(),cn&&!dn&&g(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),cn=!1,dn=!1}}),i.addEventListener("message",r=>{if(s!==Ht)return;let c;try{c=JSON.parse(r.data)}catch{return}if(c.type==="pong"){Ce=Date.now();return}if(c.type==="ping"){if(Ce=Date.now(),i.readyState===WebSocket.OPEN)try{i.send(JSON.stringify({type:"pong"}))}catch{}return}if(c.type==="run-status"){c.running?ie.value=!0:ie.peek()&&(ie.value=!1,xa()),Ze();return}va(c)}),i.addEventListener("close",()=>{s===Ht&&(ga(),cn=!0,Se.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Ut(),Yo())}),i.addEventListener("error",()=>{})}function xa(){if(!Rt||ie.peek())return;let e=Rt;Rt=null;let t=(0,n.$)("chat-input");t&&(t.value=e,fn(t)),setTimeout(()=>xn(),0)}function Pt(){ie.value=!1,Ze(),xa()}function va(e){if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)va(t);return}if(e.type==="session-created"){f.sessionId=e.sessionId,e.agent&&me(e.agent),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="result"){Nt(),_t(),le();let t=e.usage;if(t){let s={input_tokens:t.inputTokens??t.input_tokens,output_tokens:t.outputTokens??t.output_tokens,cache_read_input_tokens:t.cacheReadInputTokens??t.cache_read_input_tokens,cache_creation_input_tokens:t.cacheCreationInputTokens??t.cache_creation_input_tokens,total_tokens:t.totalTokens??t.total_tokens,reasoning_tokens:t.reasoningTokens??t.reasoning_tokens,costUSD:t.costUSD??t.cost_usd};f.lastUsage=s,f.sessionId&&(f.lastUsageSessionId=f.sessionId),ft(s)}e.is_error||g("\u2713 Done"),Pt();return}if(e.type==="complete"){Nt(),_t(),le(),!e.aborted&&e.agent==="claude"?g("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?g("\u2713 Done"):e.aborted&&g("\u5DF2\u505C\u6B62")),Pt();return}if(e.type==="error"){Nt(),_t(),et("error","Error",e.message),Pt();return}if(e.type==="shell-start"){f.shellBubble=null;return}if(e.type==="shell-output"){f.shellBubble||(f.shellBubble=mi(e.stream==="stderr"?"shell-err":"shell")),hi(f.shellBubble,e.data);return}if(e.type==="shell-exit"){f.shellBubble=null,g(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),Pt();return}if(e.type==="assistant"){_t();for(let t of e.message?.content||[])t.type==="text"&&t.text?(le(),et("assistant",Ko(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&ls(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){ya(e.ts);return}if(e.type==="assistant_delta"){Zo(e.data||"");return}if(e.type==="assistant_stream_end"){_t();return}if(e.type==="thought_stream_start"){wa();return}if(e.type==="thought_delta"){ei(e.data||"");return}if(e.type==="thought_stream_end"){Nt();return}if(e.type==="status"){let t=(0,n.$)("stream-status");if(t)t.textContent=e.message||"";else{let s=(0,n.$)("messages");s&&e.message&&(s.insertAdjacentHTML("beforeend",`<div id="stream-status" class="text-center text-[10px] text-base-content/35 py-0.5">${(0,n.esc)(e.message)}</div>`),se(s))}return}if(e.type==="permission_resolved"){let t=e.requestId||e.request_id;t&&(0,n.$)(`perm-${t}`)?.remove();return}(e.type==="permission_request"||e.request_id&&e.tool_name)&&xi(e)}function ya(e){let t=(0,n.$)("messages");if(!t||(le(),Nt(),be&&t.contains(be)))return;let s=mn(e||Date.now()),a=hn(e||Date.now());t.insertAdjacentHTML("beforeend",`
1
+ var Vs=Object.defineProperty;var zo=Object.getOwnPropertyDescriptor;var Jo=Object.getOwnPropertyNames;var Ko=Object.prototype.hasOwnProperty;var Q=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ys=(e,t)=>{for(var s in t)Vs(e,s,{get:t[s],enumerable:!0})},Ks=(e,t,s,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Jo(t))!Ko.call(e,o)&&o!==s&&Vs(e,o,{get:()=>t[o],enumerable:!(a=zo(t,o))||a.enumerable});return e},Zn=(e,t,s)=>(Ks(e,t,"default"),s&&Ks(s,t,"default"));var n={};import*as Sr from"https://cdn.jsdelivr.net/gh/forechoandlook/mini-react@v0.1.13/dist/mini-react.min.js";var C=Q(()=>{Zn(n,Sr)});var ta={};Ys(ta,{AGENT_DEFAULT_MODEL:()=>Qs,AGENT_LABELS:()=>R,AGENT_MODELS:()=>es,LOW_TURN_THRESHOLD:()=>ns,activityHits:()=>fe,activityLoading:()=>Te,addCustomModel:()=>At,agentFilter:()=>Z,agentsMeta:()=>pt,chatDensity:()=>Ie,collapsedFolders:()=>dt,ctx:()=>f,currentAgent:()=>k,currentEffort:()=>ue,currentModel:()=>S,currentPermission:()=>Le,currentProject:()=>y,currentTab:()=>j,expandedFolders:()=>ct,favoritesOnly:()=>Re,filesPath:()=>A,filesRoot:()=>O,filteredSessions:()=>Ue,getCustomModels:()=>ln,getDefaultModel:()=>le,getEffortsForModel:()=>jt,getModelsForAgent:()=>me,getSessionMeta:()=>ut,gitRoot:()=>J,hubMachineReady:()=>Ce,hubMode:()=>$,isProcessing:()=>re,machinesList:()=>D,metaKey:()=>B,projectGroups:()=>Ye,removeCustomModel:()=>os,selectedMachineId:()=>E,sessionDisplayTitle:()=>Ve,sessionFilter:()=>U,sessionMetaMap:()=>v,sessionSearch:()=>N,sessionSort:()=>Xs,sessionsData:()=>T,setAgent:()=>he,setChatDensity:()=>ss,setSelectedMachine:()=>ee,showHiddenOnly:()=>Be,sidebarView:()=>Me,timeRange:()=>ne,viewingFile:()=>F,workspacesData:()=>H,wsStatus:()=>Ee});function ee(e){let t=e||null;E.value=t,f.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function B(e,t,s){let a=`${e||"claude"}:${t}`;return s||f?.machineId?`${s||f.machineId}:${a}`:a}function ut(e,t,s){return v.peek()?.[B(e,t,s)]||{favorite:!1,notes:"",title:"",hidden:!1}}function Ve(e,{preferSnippet:t=!1}={}){if(!e)return"Session";if(t&&e.snippet)return e.snippet;let a=(ut(e.agent,e.sessionId,e.machineId).title||"").trim();return a||e.display||e.sessionId?.slice(0,8)||"Session"}function ss(e){let t=["clean","normal","full"].includes(e)?e:"normal";Ie.value=t,localStorage.setItem("chatDensity",t),document.getElementById("messages")?.setAttribute("data-density",t)}function Vo(e){return e?typeof e=="string"?{value:e,label:e}:e.value?{value:String(e.value),label:e.label||e.value,...Array.isArray(e.efforts)&&e.efforts.length?{efforts:e.efforts.map(String)}:{},...e.defaultEffort?{defaultEffort:String(e.defaultEffort)}:{}}:null:null}function as(){try{let e=localStorage.getItem(Zs);if(!e)return{};let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function ea(e){localStorage.setItem(Zs,JSON.stringify(e))}function ln(e){let t=(e||"claude").toLowerCase(),s=as()[t];return Array.isArray(s)?s.filter(Boolean).map(String):[]}function At(e,t){let s=(e||"claude").toLowerCase(),a=String(t||"").trim();if(!a)return!1;let o=as(),i=Array.isArray(o[s])?[...o[s]]:[];return i.includes(a)||i.push(a),o[s]=i,ea(o),!0}function os(e,t){let s=(e||"claude").toLowerCase(),a=String(t||"").trim(),o=as(),i=Array.isArray(o[s])?o[s].filter(r=>r!==a):[];return o[s]=i,ea(o),!0}function me(e){let t=(e||"claude").toLowerCase(),s=pt.peek()?.defaults?.[t],a=s?.models?.length?s.models.map(Vo).filter(Boolean):(es[t]||es.claude).map(r=>({...r})),o=ln(t),i=new Set(a.map(r=>r.value));for(let r of o){if(i.has(r)){a=a.map(c=>{if(c.value!==r)return c;let p=String(c.label||c.value);return{...c,custom:!0,label:p.includes("\u2605")?p:`${p} \u2605`}});continue}i.add(r),a.push({value:r,label:`${r} \u2605`,custom:!0})}return a}function le(e){let t=(e||"claude").toLowerCase(),s=pt.peek()?.defaults?.[t];return s?.model?String(s.model):Qs[t]||me(t)[0]?.value||"claude-sonnet-4-5"}function jt(e,t){let a=me(e).find(i=>i.value===t);if(a?.efforts?.length)return a.efforts;let o=pt.peek()?.defaults?.[(e||"claude").toLowerCase()];return o?.efforts?.length?o.efforts.map(String):["low","medium","high","xhigh","max"]}function he(e){let t=(e||"claude").toLowerCase();k.value=t,localStorage.setItem("agent",t),Le.value=t==="codex"?"bypassPermissions":"default";let s=typeof document>"u"?null:document.getElementById("sel-permission");s&&(s.value=Le.peek());let a=me(t),o=le(t);a.some(i=>i.value===S.peek())||(S.value=o,localStorage.setItem("model",o))}function Yo(e,t){return!t||t==="all"?!0:(e.agent||"claude")===t}function Xo(e,t){let s=parseInt(t||"0",10)||0;if(s<=0)return!0;let a=e.updatedAt||0;if(typeof a=="string"){let o=Number(a);a=Number.isFinite(o)&&o>0?o<1e12?o*1e3:o:Date.parse(a)||0}else typeof a=="number"&&a>0&&a<1e12&&(a=a*1e3);return a>=Date.now()-s*864e5}function Qo(e,t){if(!t)return!0;let s=v.value?.[B(e.agent,e.sessionId,e.machineId)];return[e.display,e.cwd,e.projectName,e.agent,e.sessionId,e.snippet,e.machineId,s?.notes,s?.title].filter(Boolean).join(" ").toLowerCase().includes(t)}function ts(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}var T,H,U,N,Xs,ct,dt,A,F,y,j,re,Ee,k,S,ue,Le,O,J,pt,Me,Z,ne,fe,Te,v,Re,Be,ns,Ie,$,D,E,Ce,f,R,es,Qs,Zs,Ue,Ye,I=Q(()=>{C();T=(0,n.signal)([]),H=(0,n.signal)([]),U=(0,n.signal)(null),N=(0,n.signal)(""),Xs=(0,n.signal)("time"),ct=(0,n.signal)(new Set),dt=(0,n.signal)(new Set),A=(0,n.signal)(""),F=(0,n.signal)(null),y=(0,n.signal)(null),j=(0,n.signal)("chat"),re=(0,n.signal)(!1),Ee=(0,n.signal)("idle"),k=(0,n.signal)(localStorage.getItem("agent")||"claude"),S=(0,n.signal)(localStorage.getItem("model")||"claude-sonnet-4-5"),ue=(0,n.signal)(""),Le=(0,n.signal)(k.peek()==="codex"?"bypassPermissions":"default"),O=(0,n.signal)(""),J=(0,n.signal)(""),pt=(0,n.signal)(null),Me=(0,n.signal)(localStorage.getItem("sidebarView")||"projects"),Z=(0,n.signal)(localStorage.getItem("agentFilter")||"all"),ne=(0,n.signal)(localStorage.getItem("timeRange")||"14"),fe=(0,n.signal)(null),Te=(0,n.signal)(!1),v=(0,n.signal)({}),Re=(0,n.signal)(localStorage.getItem("favoritesOnly")==="1"),Be=(0,n.signal)(localStorage.getItem("showHiddenOnly")==="1"),ns=2,Ie=(0,n.signal)(localStorage.getItem("chatDensity")||"normal"),$=(0,n.signal)(!1),D=(0,n.signal)([]),E=(0,n.signal)(null),Ce=(0,n.signal)(!1),f={token:localStorage.getItem("token"),sessionId:null,agent:null,machineId:null,ws:null,shellBubble:null,configDir:null};R={claude:"Claude",codex:"Codex",grok:"Grok"},es={claude:[{value:"claude-sonnet-4-5",label:"sonnet-4-5"},{value:"claude-sonnet-4-6",label:"sonnet-4-6"},{value:"claude-opus-4-5",label:"opus-4-5"},{value:"claude-haiku-4-5",label:"haiku-4-5"}],codex:[{value:"gpt-5.4",label:"gpt-5.4"},{value:"gpt-5.3",label:"gpt-5.3"},{value:"gpt-5.2",label:"gpt-5.2"},{value:"o3",label:"o3"},{value:"o4-mini",label:"o4-mini"},{value:"codex-mini-latest",label:"codex-mini"}],grok:[{value:"grok-4.5",label:"grok-4.5"},{value:"grok-4",label:"grok-4"},{value:"grok-3",label:"grok-3"},{value:"grok-3-mini",label:"grok-3-mini"}]},Qs={claude:"claude-sonnet-4-5",codex:"gpt-5.4",grok:"grok-4.5"};Zs="customModelsByAgent";Ue=(0,n.computed)(()=>{let e=U.value,t=N.value.toLowerCase().trim(),s=Xs.value,a=Z.value,o=ne.value,i=Re.value,r=Be.value,c=v.value,p=fe.value,l=p?.results?.length&&t?ts(p.results):ts(T.value);e&&(l=l.filter(u=>u&&(u.cwd===e||u.configDir===e)));let d=E.value;return $.value&&d&&(l=l.filter(u=>u&&(!u.machineId||u.machineId===d))),l=l.filter(u=>u&&Yo(u,a)&&Xo(u,o)),r?l=l.filter(u=>u&&c?.[B(u.agent,u.sessionId,u.machineId)]?.hidden):l=l.filter(u=>u&&!c?.[B(u.agent,u.sessionId,u.machineId)]?.hidden),i&&(l=l.filter(u=>u&&c?.[B(u.agent,u.sessionId,u.machineId)]?.favorite)),t&&!(p?.results&&p.q===t)&&(l=l.filter(u=>u&&Qo(u,t))),l=[...l].sort((u,m)=>{let b=c?.[B(u.agent,u.sessionId,u.machineId)]?.favorite?1:0,x=c?.[B(m.agent,m.sessionId,m.machineId)]?.favorite?1:0;return b!==x?x-b:s==="project"&&(u.cwd||"").localeCompare(m.cwd||"")||m.updatedAt-u.updatedAt}),!e&&!t&&!i?l.slice(0,120):l}),Ye=(0,n.computed)(()=>{let e=ts(Ue.value),t=new Map;for(let s of e){if(!s)continue;let a=s.machineId?`${s.machineId}::${s.cwd||"(no path)"}`:s.cwd||"(no path)";t.has(a)||t.set(a,{cwd:s.cwd||null,machineId:s.machineId||null,projectName:s.projectName||(s.cwd?s.cwd.split("/").filter(Boolean).pop():"(no path)"),updatedAt:0,agents:{},sessions:[],latest:null});let o=t.get(a);o.sessions.push(s),o.agents[s.agent||"claude"]=(o.agents[s.agent||"claude"]||0)+1,(s.updatedAt||0)>o.updatedAt&&(o.updatedAt=s.updatedAt,o.latest=s)}return[...t.values()].sort((s,a)=>a.updatedAt-s.updatedAt)})});function Dt(e={}){return e.machineId!==void 0?e.machineId:f.machineId||E.peek()||null}function ei(e){let t=e.split("?")[0];return t==="/api/hub"||t==="/api/machines"||t.startsWith("/api/auth/")}async function h(e,t,s,a,o={}){let i=Dt(o),r={"Content-Type":"application/json",...f.token?{Authorization:`Bearer ${f.token}`}:{}};$.peek()&&i&&!ei(t)&&(r["X-Machine-Id"]=i);let c=o.etag===!0?`${f.token||""}:${i||""}:${t}`:o.etag||null;if(e.toUpperCase()==="GET"&&c){let d=na.get(c);d&&(r["If-None-Match"]=d)}let p=async()=>{let d=await fetch(t,{method:e,signal:a,headers:r,...s!==void 0?{body:JSON.stringify(s)}:{}});if(d.status===304)return is;let u=await d.json().catch(()=>({}));if(!d.ok)throw new Error(u.error||`HTTP ${d.status}`);if(c){let m=d.headers.get("ETag");m&&na.set(c,m)}return u};if(e.toUpperCase()!=="GET"||a||o.dedupe===!1)return p();let l=`${f.token||""}:${i||""}:${t}`;return Zo.get(l,p)}function _t(e){return f.ws?.readyState===WebSocket.OPEN?(f.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||cn.push(e),!1)}function sa(){for(;cn.length&&f.ws?.readyState===WebSocket.OPEN;)f.ws.send(JSON.stringify(cn.shift()))}function aa(){cn.length=0}function oa(e={}){let t=new URLSearchParams(e);f.token&&t.set("token",f.token);let s=Dt();return $.peek()&&s&&t.set("machine",s),t.toString()}function Fe(e={}){let t={...e};f.token&&(t.Authorization=`Bearer ${f.token}`);let s=Dt();return $.peek()&&s&&(t["X-Machine-Id"]=s),t}async function ft(){try{let e=await fetch("/api/hub");if(!e.ok)return $.value=!1,!1;let t=await e.json();if(t?.hub)return $.value=!0,t}catch{}return $.value=!1,!1}var Zo,na,is,cn,K=Q(()=>{I();C();Zo=(0,n.createFetch)({cache:!1,dedupe:!0,retry:0}),na=new Map,is=Symbol("not-modified");cn=[]});function Qe(){try{let e=localStorage.getItem(pa);return e?JSON.parse(e):null}catch{return null}}function rs(e){try{let s={...Qe()||{},...e,updatedAt:Date.now()};localStorage.setItem(pa,JSON.stringify(s))}catch{}}var pa,dn=Q(()=>{pa="lastSessionContext"});async function ls(){if(Ht&&!(typeof navigator>"u"||!navigator.wakeLock?.request)&&document.visibilityState==="visible"&&!Ze)try{Ze=await navigator.wakeLock.request("screen"),Ze.addEventListener("release",()=>{Ze=null,Ht&&document.visibilityState==="visible"&&setTimeout(()=>{ls().catch(()=>{})},500)})}catch{Ze=null}}async function ua(){let e=Ze;if(Ze=null,!!e)try{await e.release()}catch{}}function fa(e){Ht=!!e,Ht?ls().catch(()=>{}):ua().catch(()=>{})}function ma(){typeof document>"u"||document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&Ht?ls().catch(()=>{}):document.visibilityState==="hidden"&&ua().catch(()=>{})})}var Ze,Ht,ha=Q(()=>{Ze=null,Ht=!1});function _(e){if(e==null||e==="")return null;if(typeof e=="number")return!Number.isFinite(e)||e<=0?null:e<1e12?Math.round(e*1e3):Math.round(e);if(typeof e=="string"){let t=e.trim();if(/^\d+(\.\d+)?$/.test(t))return _(Number(t));let s=Date.parse(t);return Number.isNaN(s)?null:s}return null}function bt(e){let t=_(e);if(t==null)return"";let s=Date.now()-t;return s<0?new Date(t).toLocaleDateString():s<6e4?"just now":s<36e5?`${Math.floor(s/6e4)}m ago`:s<864e5?`${Math.floor(s/36e5)}h ago`:s<7*864e5?`${Math.floor(s/864e5)}d ago`:new Date(t).toLocaleDateString()}function et(e,t=!0){let s=e||"claude",o={claude:"bg-orange-500/15 text-orange-400",codex:"bg-emerald-500/15 text-emerald-400",grok:"bg-sky-500/15 text-sky-400"}[s]||"bg-base-300 text-base-content/50",i=t?s==="claude"?"CC":s==="codex"?"CX":s==="grok"?"GX":s.slice(0,2).toUpperCase():R[s]||s;return`<span class="text-[9px] px-1 py-0.5 rounded font-mono font-semibold flex-shrink-0 ${o}" title="${(0,n.esc)(R[s]||s)}">${i}</span>`}function ba(e){return Object.entries(e||{}).filter(([,t])=>t>0).map(([t,s])=>`${et(t)}<span class="text-[9px] text-base-content/40 -ml-0.5">${s}</span>`).join("")}function tt(e){if(!e)return"";let t="",s=e.split("/").filter(Boolean);return s.length<=3?e:"\u2026/"+s.slice(-2).join("/")}var Nt=Q(()=>{C();I()});function si(){return R[k.peek()]||"Assistant"}function $a(e){return e.scrollHeight-e.scrollTop-e.clientHeight<80}function ae(e,t){e&&(t||$a(e))&&(e.scrollTop=e.scrollHeight)}function ai(){ga||(ga=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(ve=400,pn({probe:!0}),f.ws?.readyState===WebSocket.OPEN&&f.sessionId))try{f.ws.send(JSON.stringify({type:"subscribe",sessionId:f.sessionId}))}catch{}}),window.addEventListener("online",()=>{ve=400,pn({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?pn({force:!0}):pn({probe:!0})}))}function qt(){let e=(0,n.$)("conn-dot");if(!e)return;let t=Ee.peek();e.classList.remove("bg-success","bg-warning","bg-error","bg-base-content/30","animate-pulse"),t==="open"?(e.classList.add("bg-success"),e.title="\u5DF2\u8FDE\u63A5"):t==="connecting"||t==="reconnecting"?(e.classList.add("bg-warning","animate-pulse"),e.title=t==="connecting"?"\u8FDE\u63A5\u4E2D\u2026":"\u91CD\u8FDE\u4E2D\u2026"):t==="offline"?(e.classList.add("bg-error"),e.title="\u79BB\u7EBF"):(e.classList.add("bg-base-content/30"),e.title="\u672A\u8FDE\u63A5")}function pn(e={}){let t=f.ws?.readyState;if(e.force){ve=400,_e({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&je&&Date.now()-je>45e3)try{f.ws.close()}catch{}else if(e.probe&&f.ws.readyState===WebSocket.OPEN)try{f.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(ve=Math.min(ve,800),_e({quiet:!0}))}function oi(){De||(Ee.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",qt(),De=setTimeout(()=>{De=null,_e({quiet:!0})},ve),ve=Math.min(Math.round(ve*1.8),15e3))}function Sa(){fn&&(clearInterval(fn),fn=null)}function ii(e,t){Sa(),fn=setInterval(()=>{if(!(t!==Bt||e.readyState!==WebSocket.OPEN)){if(je&&Date.now()-je>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&je&&Date.now()-je>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function nt(){let e=re.peek()||!!y.peek()&&Ee.peek()==="open";fa(e)}function ri(){ve=400,De&&(clearTimeout(De),De=null),hn=!1;let e=f.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{f.ws?.close()}catch{}_e({quiet:!1}),g("\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65\u2026")}function _e(e={}){ai(),De&&(clearTimeout(De),De=null),e.quiet&&(hn=!0);let t=f.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);xa!==t&&(aa(),xa=t);let s=++Bt;try{f.ws?.close()}catch{}Ee.value="connecting",qt();let a=location.protocol==="https:"?"wss":"ws",o=new URLSearchParams;f.token&&o.set("token",f.token),t&&o.set("machine",t),f.sessionId&&o.set("sessionId",f.sessionId);let i=new WebSocket(`${a}://${location.host}/ws/chat?${o}`);f.ws=i,i.addEventListener("open",()=>{if(s===Bt){if(ve=1e3,je=Date.now(),Ee.value="open",qt(),f.sessionId)try{i.send(JSON.stringify({type:"subscribe",sessionId:f.sessionId}))}catch{}sa(),ii(i,s),nt(),mn&&!hn&&g(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),mn=!1,hn=!1}}),i.addEventListener("message",r=>{if(s!==Bt)return;let c;try{c=JSON.parse(r.data)}catch{return}if(c.type==="pong"){je=Date.now();return}if(c.type==="ping"){if(je=Date.now(),i.readyState===WebSocket.OPEN)try{i.send(JSON.stringify({type:"pong"}))}catch{}return}if(c.type==="run-status"){c.running?re.value=!0:re.peek()&&(re.value=!1,La()),nt();return}Ea(c)}),i.addEventListener("close",()=>{s===Bt&&(Sa(),mn=!0,Ee.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",qt(),oi())}),i.addEventListener("error",()=>{})}function La(){if(!Ot||re.peek())return;let e=Ot;Ot=null;let t=(0,n.$)("chat-input");t&&(t.value=e,xn(t)),setTimeout(()=>Wt(),0)}function Ut(){re.value=!1,nt(),La()}function Ea(e){if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)Ea(t);return}if(e.type==="session-created"){f.sessionId=e.sessionId,e.agent&&he(e.agent),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="result"){Ft(),Rt(),ce();let t=e.usage;if(t){let s={input_tokens:t.inputTokens??t.input_tokens,output_tokens:t.outputTokens??t.output_tokens,cache_read_input_tokens:t.cacheReadInputTokens??t.cache_read_input_tokens,cache_creation_input_tokens:t.cacheCreationInputTokens??t.cache_creation_input_tokens,total_tokens:t.totalTokens??t.total_tokens,reasoning_tokens:t.reasoningTokens??t.reasoning_tokens,costUSD:t.costUSD??t.cost_usd};f.lastUsage=s,f.sessionId&&(f.lastUsageSessionId=f.sessionId),gt(s)}e.is_error||g("\u2713 Done"),Ut();return}if(e.type==="complete"){Ft(),Rt(),ce(),!e.aborted&&e.agent==="claude"?g("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?g("\u2713 Done"):e.aborted&&g("\u5DF2\u505C\u6B62")),Ut();return}if(e.type==="error"){Ft(),Rt(),st("error","Error",e.message),Ut();return}if(e.type==="shell-start"){f.shellBubble=null;return}if(e.type==="shell-output"){f.shellBubble||(f.shellBubble=Si(e.stream==="stderr"?"shell-err":"shell")),Li(f.shellBubble,e.data);return}if(e.type==="shell-exit"){f.shellBubble=null,g(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),Ut();return}if(e.type==="assistant"){Rt();for(let t of e.message?.content||[])t.type==="text"&&t.text?(ce(),st("assistant",si(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&fs(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){Ma(e.ts);return}if(e.type==="assistant_delta"){li(e.data||"");return}if(e.type==="assistant_stream_end"){Rt();return}if(e.type==="thought_stream_start"){Ta();return}if(e.type==="thought_delta"){ci(e.data||"");return}if(e.type==="thought_stream_end"){Ft();return}if(e.type==="status"){let t=(0,n.$)("stream-status");if(t)t.textContent=e.message||"";else{let s=(0,n.$)("messages");s&&e.message&&(s.insertAdjacentHTML("beforeend",`<div id="stream-status" class="text-center text-[10px] text-base-content/35 py-0.5">${(0,n.esc)(e.message)}</div>`),ae(s))}return}if(e.type==="permission_resolved"){let t=e.requestId||e.request_id;t&&(0,n.$)(`perm-${t}`)?.remove();return}(e.type==="permission_request"||e.request_id&&e.tool_name)&&Ti(e)}function Ma(e){let t=(0,n.$)("messages");if(!t||(ce(),Ft(),ge&&t.contains(ge)))return;let s=vn(e||Date.now()),a=yn(e||Date.now());t.insertAdjacentHTML("beforeend",`
2
2
  <div class="msg-row assistant px-2 live-stream" data-ts="${(0,n.esc)(a)}">
3
3
  <div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-base-200 break-words md">
4
4
  <div class="msg-stream-body whitespace-pre-wrap"></div>
5
5
  </div>
6
6
  ${s?`<div class="msg-ts" title="${(0,n.esc)(a)}">${(0,n.esc)(s)}</div>`:""}
7
- </div>`),be=t.lastElementChild,ne=be.querySelector(".msg-stream-body"),(0,n.$)("stream-status")?.remove(),se(t,!0)}function Zo(e){e&&(ne||ya(Date.now()),ne&&(ne.textContent+=e,se((0,n.$)("messages"),!0)))}function _t(){if(!be||!ne){be=null,ne=null;return}let e=ne.textContent||"";e.trim()?(ne.classList.remove("whitespace-pre-wrap"),ne.classList.add("md"),ne.innerHTML=pn(e),La(be)):be.remove(),be=null,ne=null,(0,n.$)("stream-status")?.remove()}function wa(){let e=(0,n.$)("messages");e&&(Be&&e.contains(Be)||(e.insertAdjacentHTML("beforeend",`
7
+ </div>`),ge=t.lastElementChild,se=ge.querySelector(".msg-stream-body"),(0,n.$)("stream-status")?.remove(),ae(t,!0)}function li(e){e&&(se||Ma(Date.now()),se&&(se.textContent+=e,ae((0,n.$)("messages"),!0)))}function Rt(){if(!ge||!se){ge=null,se=null;return}let e=se.textContent||"";e.trim()?(se.classList.remove("whitespace-pre-wrap"),se.classList.add("md"),se.innerHTML=bn(e),Da(ge)):ge.remove(),ge=null,se=null,(0,n.$)("stream-status")?.remove()}function Ta(){let e=(0,n.$)("messages");e&&(Oe&&e.contains(Oe)||(e.insertAdjacentHTML("beforeend",`
8
8
  <div class="msg-row assistant px-2 thought-stream">
9
9
  <div class="max-w-[88%] rounded-lg border border-base-300/60 bg-base-200/50 px-2.5 py-1.5 text-[11px] text-base-content/45">
10
10
  <div class="font-medium text-base-content/35 mb-0.5">thinking\u2026</div>
11
11
  <div class="thought-body font-mono whitespace-pre-wrap max-h-24 overflow-y-auto opacity-80"></div>
12
12
  </div>
13
- </div>`),Be=e.lastElementChild,ge=Be.querySelector(".thought-body"),se(e,!0)))}function ei(e){e&&(ge||wa(),ge&&(ge.textContent+=e,ge.scrollTop=ge.scrollHeight,se((0,n.$)("messages"),!0)))}function Nt(){if(Be&&ge){let e=(ge.textContent||"").length;Be.innerHTML=`
14
- <div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}Be=null,ge=null}function ni(e){let[t,...s]=e.slice(1).trim().split(/\s+/),a=s.join(" ");switch(t.toLowerCase()){case"agent":{if(!a)return g(`Current agent: ${S.peek()} \xB7 agents: claude | codex | grok`),!0;let o=a.toLowerCase();return["claude","codex","grok"].includes(o)?(o!==S.peek()?(f.sessionId=null,me(o),$.value=re(o),localStorage.setItem("model",$.peek()),document.dispatchEvent(new CustomEvent("agent-changed")),g(`Agent \u2192 ${R[o]} \xB7 model ${$.peek()} \xB7 new session`)):g(`Agent already ${R[o]}`),!0):(g(`Unknown agent "${a}" \xB7 valid: claude | codex | grok`),!0)}case"model":{if(!a){let c=S.peek(),p=fe(c).map(l=>l.value).join(" | ");return g(`Current model: ${$.peek()} (${c})${p?`
15
- Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe(i).some(c=>c.value===o);return r||Et(i,o),$.value=o,localStorage.setItem("model",o),g(`Model set to ${o}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let o=It(S.peek(),$.peek());return a?o.includes(a.toLowerCase())?(pe.value=a.toLowerCase(),g(`Effort set to ${a.toLowerCase()}`),!0):(g(`Unknown effort level "${a}" \xB7 valid: ${o.join(" | ")}`),!0):(g(`Current effort: ${pe.peek()||"(default)"} \xB7 levels: ${o.join(" | ")}`),!0)}case"clear":return mt(),f.sessionId=null,f.lastUsage=null,g("Cleared \xB7 new session"),!0;case"usage":return si(),!0;case"help":return g(`Available slash commands:
13
+ </div>`),Oe=e.lastElementChild,xe=Oe.querySelector(".thought-body"),ae(e,!0)))}function ci(e){e&&(xe||Ta(),xe&&(xe.textContent+=e,xe.scrollTop=xe.scrollHeight,ae((0,n.$)("messages"),!0)))}function Ft(){if(Oe&&xe){let e=(xe.textContent||"").length;Oe.innerHTML=`
14
+ <div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}Oe=null,xe=null}function pi(e){let[t,...s]=e.slice(1).trim().split(/\s+/),a=s.join(" ");switch(t.toLowerCase()){case"agent":{if(!a)return g(`Current agent: ${k.peek()} \xB7 agents: claude | codex | grok`),!0;let o=a.toLowerCase();return["claude","codex","grok"].includes(o)?(o!==k.peek()?(f.sessionId=null,he(o),S.value=le(o),localStorage.setItem("model",S.peek()),document.dispatchEvent(new CustomEvent("agent-changed")),g(`Agent \u2192 ${R[o]} \xB7 model ${S.peek()} \xB7 new session`)):g(`Agent already ${R[o]}`),!0):(g(`Unknown agent "${a}" \xB7 valid: claude | codex | grok`),!0)}case"model":{if(!a){let c=k.peek(),p=me(c).map(l=>l.value).join(" | ");return g(`Current model: ${S.peek()} (${c})${p?`
15
+ Available: ${p}`:""}`),!0}let o=di[a.toLowerCase()]||a,i=k.peek()||"claude",r=me(i).some(c=>c.value===o);return r||At(i,o),S.value=o,localStorage.setItem("model",o),g(`Model set to ${o}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let o=jt(k.peek(),S.peek());return a?o.includes(a.toLowerCase())?(ue.value=a.toLowerCase(),g(`Effort set to ${a.toLowerCase()}`),!0):(g(`Unknown effort level "${a}" \xB7 valid: ${o.join(" | ")}`),!0):(g(`Current effort: ${ue.peek()||"(default)"} \xB7 levels: ${o.join(" | ")}`),!0)}case"clear":return xt(),f.sessionId=null,f.lastUsage=null,g("Cleared \xB7 new session"),!0;case"usage":return ui(),!0;case"help":return g(`Available slash commands:
16
16
  /agent [claude|codex|grok]
17
17
  /model [haiku|sonnet|opus|<model-id>]
18
18
  /effort [low|medium|high|xhigh|max]
19
19
  /usage
20
20
  /clear
21
- /help`),!0;default:return!1}}function V(e){if(e==null||Number.isNaN(Number(e)))return"\u2014";let t=Number(e);return t>=1e6?`${(t/1e6).toFixed(2)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(Math.round(t))}async function si(){let e=S.peek()||"claude",t=$.peek()||"\u2014",s=f.sessionId,a=[`Agent: ${R[e]||e}`,`Model: ${t}`,`Session: ${s?s.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(f.lastUsage&&(!s||f.lastUsageSessionId===s)){let o=f.lastUsage;a.push(`Last turn: \u2191${V(o.input_tokens)} \u2193${V(o.output_tokens)}`+(o.cache_read_input_tokens?` \xB7 ${V(o.cache_read_input_tokens)} cached`:"")+(o.reasoning_tokens?` \xB7 ${V(o.reasoning_tokens)} reason`:"")+(o.total_tokens?` \xB7 \u03A3${V(o.total_tokens)}`:"")+(o.costUSD!=null?` \xB7 $${Number(o.costUSD).toFixed(4)}`:""))}if(!s){g(a.join(`
22
- `)),is("\u25C8 /usage \xB7 no session yet");return}g("Loading usage\u2026");try{let o=new URLSearchParams({sessionId:s,agent:e}),r=(await h("GET",`/api/usage?${o}`)).context||{};if(r.model&&(a[1]=`Model: ${r.model}`),r.title&&a.push(`Title: ${r.title}`),r.tokensUsed!=null||r.windowTokens!=null||r.usagePercent!=null){let p=r.tokensUsed!=null?V(r.tokensUsed):"\u2014",l=r.windowTokens!=null?V(r.windowTokens):"\u2014",d=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";a.push(`Context window: ${p} / ${l} (${d})`)}if(r.turnCount!=null&&a.push(`Turns: ${r.turnCount}`),r.toolCallCount!=null&&a.push(`Tools: ${r.toolCallCount}`),r.sessionDurationSeconds!=null){let p=Math.floor(r.sessionDurationSeconds/60),l=Math.round(r.sessionDurationSeconds%60);a.push(`Duration: ${p}m ${l}s`)}if(r.sessionTotals){let p=r.sessionTotals;a.push(`Session totals: \u2191${V(p.input_tokens)} \u2193${V(p.output_tokens)}`+(p.cache_read_input_tokens?` \xB7 ${V(p.cache_read_input_tokens)} cached`:"")+(p.total_tokens?` \xB7 \u03A3${V(p.total_tokens)}`:"")+(p.costUSD?` \xB7 $${Number(p.costUSD).toFixed(4)}`:""))}if(r.lastTurn&&!f.lastUsage){let p=r.lastTurn;a.push(`Last completed turn: \u2191${V(p.input_tokens)} \u2193${V(p.output_tokens)}`+(p.cache_read_input_tokens?` \xB7 ${V(p.cache_read_input_tokens)} cached`:"")+(p.costUSD!=null?` \xB7 $${Number(p.costUSD).toFixed(4)}`:""))}r.note&&a.push(r.note);let c=(0,n.$)("messages");if(c){let p=[...c.children];for(let l=p.length-1;l>=0;l--)if(p[l].textContent==="Loading usage\u2026"){p[l].remove();break}}g(a.join(`
23
- `)),(r.tokensUsed!=null||r.windowTokens!=null)&&rs({tokensUsed:r.tokensUsed,windowTokens:r.windowTokens,usagePercent:r.usagePercent,model:r.model||t,turnCount:r.turnCount,toolCallCount:r.toolCallCount}),r.sessionTotals?ft(r.sessionTotals):r.lastTurn?ft(r.lastTurn):f.lastUsage&&ft(f.lastUsage)}catch(o){let i=(0,n.$)("messages");if(i){let r=[...i.children];for(let c=r.length-1;c>=0;c--)if(r[c].textContent==="Loading usage\u2026"){r[c].remove();break}}g(`${a.join(`
21
+ /help`),!0;default:return!1}}function Y(e){if(e==null||Number.isNaN(Number(e)))return"\u2014";let t=Number(e);return t>=1e6?`${(t/1e6).toFixed(2)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(Math.round(t))}async function ui(){let e=k.peek()||"claude",t=S.peek()||"\u2014",s=f.sessionId,a=[`Agent: ${R[e]||e}`,`Model: ${t}`,`Session: ${s?s.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(f.lastUsage&&(!s||f.lastUsageSessionId===s)){let o=f.lastUsage;a.push(`Last turn: \u2191${Y(o.input_tokens)} \u2193${Y(o.output_tokens)}`+(o.cache_read_input_tokens?` \xB7 ${Y(o.cache_read_input_tokens)} cached`:"")+(o.reasoning_tokens?` \xB7 ${Y(o.reasoning_tokens)} reason`:"")+(o.total_tokens?` \xB7 \u03A3${Y(o.total_tokens)}`:"")+(o.costUSD!=null?` \xB7 $${Number(o.costUSD).toFixed(4)}`:""))}if(!s){g(a.join(`
22
+ `)),ps("\u25C8 /usage \xB7 no session yet");return}g("Loading usage\u2026");try{let o=new URLSearchParams({sessionId:s,agent:e}),r=(await h("GET",`/api/usage?${o}`)).context||{};if(r.model&&(a[1]=`Model: ${r.model}`),r.title&&a.push(`Title: ${r.title}`),r.tokensUsed!=null||r.windowTokens!=null||r.usagePercent!=null){let p=r.tokensUsed!=null?Y(r.tokensUsed):"\u2014",l=r.windowTokens!=null?Y(r.windowTokens):"\u2014",d=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";a.push(`Context window: ${p} / ${l} (${d})`)}if(r.turnCount!=null&&a.push(`Turns: ${r.turnCount}`),r.toolCallCount!=null&&a.push(`Tools: ${r.toolCallCount}`),r.sessionDurationSeconds!=null){let p=Math.floor(r.sessionDurationSeconds/60),l=Math.round(r.sessionDurationSeconds%60);a.push(`Duration: ${p}m ${l}s`)}if(r.sessionTotals){let p=r.sessionTotals;a.push(`Session totals: \u2191${Y(p.input_tokens)} \u2193${Y(p.output_tokens)}`+(p.cache_read_input_tokens?` \xB7 ${Y(p.cache_read_input_tokens)} cached`:"")+(p.total_tokens?` \xB7 \u03A3${Y(p.total_tokens)}`:"")+(p.costUSD?` \xB7 $${Number(p.costUSD).toFixed(4)}`:""))}if(r.lastTurn&&!f.lastUsage){let p=r.lastTurn;a.push(`Last completed turn: \u2191${Y(p.input_tokens)} \u2193${Y(p.output_tokens)}`+(p.cache_read_input_tokens?` \xB7 ${Y(p.cache_read_input_tokens)} cached`:"")+(p.costUSD!=null?` \xB7 $${Number(p.costUSD).toFixed(4)}`:""))}r.note&&a.push(r.note);let c=(0,n.$)("messages");if(c){let p=[...c.children];for(let l=p.length-1;l>=0;l--)if(p[l].textContent==="Loading usage\u2026"){p[l].remove();break}}g(a.join(`
23
+ `)),(r.tokensUsed!=null||r.windowTokens!=null)&&us({tokensUsed:r.tokensUsed,windowTokens:r.windowTokens,usagePercent:r.usagePercent,model:r.model||t,turnCount:r.turnCount,toolCallCount:r.toolCallCount}),r.sessionTotals?gt(r.sessionTotals):r.lastTurn?gt(r.lastTurn):f.lastUsage&&gt(f.lastUsage)}catch(o){let i=(0,n.$)("messages");if(i){let r=[...i.children];for(let c=r.length-1;c>=0;c--)if(r[c].textContent==="Loading usage\u2026"){r[c].remove();break}}g(`${a.join(`
24
24
  `)}
25
- (usage fetch failed: ${o.message})`)}}function xn(){let e=(0,n.$)("chat-input"),t=e?.value.trim();if(!t||!y.peek())return;if(ie.peek()){Rt=t,e.value="",fn(e),un(""),fa(),g(`\u5DF2\u6392\u961F\u4E0B\u4E00\u6761\uFF0C\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u540E\u53D1\u9001\uFF1A${t.length>80?t.slice(0,80)+"\u2026":t}`);return}if(e.value="",fn(e),un(""),fa(),t.startsWith("/")&&ni(t))return;ie.value=!0,Ze();let s=Date.now();if(t.startsWith("!"))et("shell","$ Shell",t.slice(1).trim(),{ts:s}),At({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:y.peek().path})||g("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{le(),et("user","You",t,{ts:s});let a=pe.peek(),o=Mt.peek(),i=S.peek()||"claude";At({type:"command",cmd:"turn.start",agent:i,command:t,sessionId:f.sessionId,options:{agent:i,cwd:y.peek().path,sessionId:f.sessionId,configDir:f.configDir,model:$.peek(),...a&&{effort:a},...o&&o!=="default"&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||g("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function ka(){f.sessionId&&At({type:"command",cmd:"turn.interrupt",sessionId:f.sessionId}),Rt=null,Pt()}function un(e){let t=e.startsWith("!"),s=(0,n.$)("chat-input"),a=(0,n.$)("send-btn");if(!s||!a)return;s.classList.toggle("textarea-warning",t),s.style.fontFamily=t?"monospace":"",a.classList.toggle("btn-warning",t),a.classList.toggle("btn-primary",!t),a.textContent=t?"Run":"Send";let o=R[S.peek()]||"agent";s.placeholder=t?"Shell command (without !)\u2026":`Ask ${o}\u2026 or !cmd for shell`}function ai(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches?96:140}function fn(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,ai())+"px"}function mn(e){let t=_(e);if(t==null)return"";let s=new Date(t);if(Number.isNaN(s.getTime()))return"";let a=new Date,o=s.toDateString()===a.toDateString(),i=s.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1});return o?i:`${s.toLocaleDateString(void 0,{month:"numeric",day:"numeric"})} ${i}`}function hn(e){let t=_(e);return t==null?"":new Date(t).toISOString()}function ri(e,t,s){if(e==="system")return t;let a=mn(s),o=hn(s),i=a?`<div class="msg-ts" title="${(0,n.esc)(o)}">${(0,n.esc)(a)}</div>`:"";return`<div class="msg-row ${e==="user"?"user":e==="shell"||e==="shell-err"?"assistant":e} px-2" data-ts="${(0,n.esc)(o)}">${t}${i}</div>`}function li(e,t,s){let a='<button class="msg-expand-btn text-[10px] text-primary/70 mt-1.5 block cursor-pointer hover:text-primary">\u25BC Show more</button>',o;switch(e){case"user":{let r=/!\[.*?\]\(.*?\)/.test(t)?pn(t):null,c=t.length>oi,p=c?`<div class="msg-body">${r??(0,n.esc)(t.trimEnd())}</div>${a}`:r??(0,n.esc)(t.trimEnd());o=`<div class="max-w-[80%] rounded-2xl rounded-tr-sm px-3 py-2 text-sm bg-primary/15 border border-primary/20 text-base-content break-words${c?" msg-card":""}${r?" md":""}"${r?"":' style="white-space:pre-wrap"'}>${p}</div>`;break}case"assistant":{let i=t.length>ii,r=i?`<div class="msg-body">${pn(t)}</div>${a}`:pn(t);o=`<div class="max-w-[min(92%,52rem)] rounded-2xl rounded-tl-sm px-3.5 py-2.5 text-sm bg-base-200 border border-base-300/40 break-words md leading-relaxed${i?" msg-card":""}">${r}</div>`;break}case"error":o=`<div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-error/10 border border-error/20 text-error break-words" style="white-space:pre-wrap">${(0,n.esc)(t)}</div>`;break;case"shell":case"shell-err":o=`<div class="w-full max-w-[96%] rounded-lg code-surface px-3 py-2 text-sm font-mono ${e==="shell-err"?"text-error":""} break-words" style="white-space:pre-wrap">${(0,n.esc)(t)}</div>`;break;case"system":return`<div class="text-center text-[11px] text-base-content/30 py-0.5 select-none">${(0,n.esc)(t)}</div>`;default:o=`<div class="rounded-lg px-3 py-2 text-sm bg-base-300 break-words" style="white-space:pre-wrap">${(0,n.esc)(t)}</div>`}return ri(e,o,s)}function et(e,t,s,a={}){let o=(0,n.$)("messages");if(!o)return;let i=_(a.ts)??(e==="system"?null:Date.now());o.insertAdjacentHTML("beforeend",li(e,s,i)),La(o.lastElementChild),se(o,e==="user")}function g(e){et("system","",e)}async function ci(e,t){let s=t||`upload-${Date.now()}`,a=Ue({"x-filename":s});delete a["Content-Type"],e?.type&&!a["Content-Type"]&&!a["content-type"]&&(a["Content-Type"]=e.type);let o=await fetch("/api/upload-image",{method:"POST",headers:a,body:e});if(!o.ok){let r=await o.json().catch(()=>({}));throw new Error(r.error||`Upload failed: ${o.status}`)}let i=await o.json();if(!i?.path)throw new Error("upload returned no path");return i.path}function di(e,t){if(!e)return;let s=e.selectionStart??e.value.length,a=e.selectionEnd??e.value.length,i=(s>0&&e.value[s-1]!==`
25
+ (usage fetch failed: ${o.message})`)}}function Wt(){let e=(0,n.$)("chat-input"),t=e?.value.trim();if(!t||!y.peek())return;if(re.peek()){Ot=t,e.value="",xn(e),gn(""),ya(),g(`\u5DF2\u6392\u961F\u4E0B\u4E00\u6761\uFF0C\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u540E\u53D1\u9001\uFF1A${t.length>80?t.slice(0,80)+"\u2026":t}`);return}if(e.value="",xn(e),gn(""),ya(),t.startsWith("/")&&pi(t))return;re.value=!0,nt();let s=Date.now();if(Ca(t))st("shell","$ Shell",t.slice(1).trim(),{ts:s}),_t({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:y.peek().path})||g("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{ce(),st("user","You",t,{ts:s});let a=ue.peek(),o=Le.peek(),i=k.peek()||"claude";_t({type:"command",cmd:"turn.start",agent:i,command:t,sessionId:f.sessionId,options:{agent:i,cwd:y.peek().path,sessionId:f.sessionId,configDir:f.configDir,model:S.peek(),...a&&{effort:a},...o&&o!=="default"&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||g("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function Ia(){f.sessionId&&_t({type:"command",cmd:"turn.interrupt",sessionId:f.sessionId}),Ot=null,Ut()}function gn(e){let t=Ca(e),s=(0,n.$)("chat-input"),a=(0,n.$)("send-btn");if(!s||!a)return;s.classList.toggle("textarea-warning",t),s.style.fontFamily=t?"monospace":"",a.classList.toggle("btn-warning",t),a.classList.toggle("btn-primary",!t),a.textContent=t?"Run":"Send";let o=R[k.peek()]||"agent",i=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches;t?s.placeholder=i?"Shell \u547D\u4EE4\u2026":"Shell command (without !)\u2026":s.placeholder=i?`\u95EE ${o}\u2026`:`Ask ${o}\u2026 or !cmd for shell`}function Ca(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function fi(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function xn(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,fi())+"px"}function vn(e){let t=_(e);if(t==null)return"";let s=new Date(t);if(Number.isNaN(s.getTime()))return"";let a=new Date,o=s.toDateString()===a.toDateString(),i=s.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1});return o?i:`${s.toLocaleDateString(void 0,{month:"numeric",day:"numeric"})} ${i}`}function yn(e){let t=_(e);return t==null?"":new Date(t).toISOString()}function bi(e,t,s){if(e==="system")return t;let a=vn(s),o=yn(s),i=a?`<div class="msg-ts" title="${(0,n.esc)(o)}">${(0,n.esc)(a)}</div>`:"";return`<div class="msg-row ${e==="user"?"user":e==="shell"||e==="shell-err"?"assistant":e} px-2" data-ts="${(0,n.esc)(o)}">${t}${i}</div>`}function gi(e,t,s){let a='<button class="msg-expand-btn text-[10px] text-primary/70 mt-1.5 block cursor-pointer hover:text-primary">\u25BC Show more</button>',o;switch(e){case"user":{let r=/!\[.*?\]\(.*?\)/.test(t)?bn(t):null,c=t.length>mi,p=c?`<div class="msg-body">${r??(0,n.esc)(t.trimEnd())}</div>${a}`:r??(0,n.esc)(t.trimEnd());o=`<div class="max-w-[80%] rounded-2xl rounded-tr-sm px-3 py-2 text-sm bg-primary/15 border border-primary/20 text-base-content break-words${c?" msg-card":""}${r?" md":""}"${r?"":' style="white-space:pre-wrap"'}>${p}</div>`;break}case"assistant":{let i=t.length>hi,r=i?`<div class="msg-body">${bn(t)}</div>${a}`:bn(t);o=`<div class="max-w-[min(92%,52rem)] rounded-2xl rounded-tl-sm px-3.5 py-2.5 text-sm bg-base-200 border border-base-300/40 break-words md leading-relaxed${i?" msg-card":""}">${r}</div>`;break}case"error":o=`<div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-error/10 border border-error/20 text-error break-words" style="white-space:pre-wrap">${(0,n.esc)(t)}</div>`;break;case"shell":case"shell-err":o=`<div class="w-full max-w-[96%] rounded-lg code-surface px-3 py-2 text-sm font-mono ${e==="shell-err"?"text-error":""} break-words" style="white-space:pre-wrap">${(0,n.esc)(t)}</div>`;break;case"system":return`<div class="text-center text-[11px] text-base-content/30 py-0.5 select-none">${(0,n.esc)(t)}</div>`;default:o=`<div class="rounded-lg px-3 py-2 text-sm bg-base-300 break-words" style="white-space:pre-wrap">${(0,n.esc)(t)}</div>`}return bi(e,o,s)}function st(e,t,s,a={}){let o=(0,n.$)("messages");if(!o)return;let i=_(a.ts)??(e==="system"?null:Date.now());o.insertAdjacentHTML("beforeend",gi(e,s,i)),Da(o.lastElementChild),ae(o,e==="user")}function g(e){st("system","",e)}async function xi(e,t){let s=t||`upload-${Date.now()}`,a=await Aa(e,s),o=Fe({"x-filename":s});delete o["Content-Type"],a?.type&&!o["Content-Type"]&&!o["content-type"]&&(o["Content-Type"]=a.type);let i=await fetch("/api/upload-image",{method:"POST",headers:o,body:a});if(!i.ok){let c=await i.json().catch(()=>({}));throw new Error(c.error||`Upload failed: ${i.status}`)}let r=await i.json();if(!r?.path)throw new Error("upload returned no path");return r.path}function vi(e,t){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=6&&String.fromCharCode(...e.slice(0,6))==="GIF87a"?"image/gif":e.length>=12&&String.fromCharCode(...e.slice(8,12))==="WEBP"?"image/webp":t||"image/png"}async function Aa(e,t){if(!e||!cs({type:e.type,name:t}))return e;let s;try{s=(await e.slice(0,80).text()).trim()}catch{return e}if(!/^(?:data:image\/[a-z0-9.+-]+;base64,|iVBORw0KGgo|\/9j\/|R0lGOD|UklGR)/i.test(s))return e;let a;try{a=(await e.text()).trim()}catch{return e}let i=/^data:image\/[a-z0-9.+-]+;base64,([a-z0-9+/=\s]+)$/i.exec(a)?.[1]||a;if(!i||!/^[a-z0-9+/=\s]+$/i.test(i)||i.length%4===1)return e;try{let r=atob(i.replace(/\s/g,"")),c=Uint8Array.from(r,d=>d.charCodeAt(0)),p=vi(c,e.type);return p===(e.type||"image/png")&&!/^(image\/png|image\/jpeg|image\/gif|image\/webp)$/.test(p)?e:c.length>=3&&(c[0]===137&&c[1]===80&&c[2]===78||c[0]===255&&c[1]===216&&c[2]===255||String.fromCharCode(...c.slice(0,6))==="GIF87a"||String.fromCharCode(...c.slice(8,12))==="WEBP")?new Blob([c],{type:p}):e}catch{return e}}function yi(e,t){if(!e)return;let s=e.selectionStart??e.value.length,a=e.selectionEnd??e.value.length,i=(s>0&&e.value[s-1]!==`
26
26
  `?`
27
27
  `:"")+t+`
28
- `;e.value=e.value.slice(0,s)+i+e.value.slice(a),e.selectionStart=e.selectionEnd=s+i.length,e.dispatchEvent(new Event("input"))}function $a(e){return e?e.type&&e.type.startsWith("image/")?!0:/\.(png|jpe?g|gif|webp|bmp|svg|heic|heif|avif)$/i.test(e.name||""):!1}function pi(e,t){let s=e?.name||t.split("/").pop()||"file";if($a(e)){rn+=1;let o=`img${rn}`;return{ref:`![${o}](${t})`,label:o,kind:"image"}}rn+=1;let a=`file${rn}`;return{ref:`[${a}](${t})`,label:a,kind:"file"}}function fa(){for(let e of Fe)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}Fe.length=0,os()}function os(){let e=(0,n.$)("chat-attach-bar");if(e){if(!Fe.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=Fe.map((t,s)=>`
28
+ `;e.value=e.value.slice(0,s)+i+e.value.slice(a),e.selectionStart=e.selectionEnd=s+i.length,e.dispatchEvent(new Event("input"))}function cs(e){return e?e.type&&e.type.startsWith("image/")?!0:/\.(png|jpe?g|gif|webp|bmp|svg|heic|heif|avif)$/i.test(e.name||""):!1}function wi(e,t){let s=e?.name||t.split("/").pop()||"file";if(cs(e)){un+=1;let o=`img${un}`;return{ref:`![${o}](${t})`,label:o,kind:"image"}}un+=1;let a=`file${un}`;return{ref:`[${a}](${t})`,label:a,kind:"file"}}function ya(){for(let e of qe)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}qe.length=0,ds()}function ds(){let e=(0,n.$)("chat-attach-bar");if(e){if(!qe.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=qe.map((t,s)=>`
29
29
  <div class="chat-thumb relative" title="${(0,n.esc)(t.ref||t.path)}">
30
30
  ${t.previewUrl?`<img src="${t.previewUrl}" alt="${(0,n.esc)(t.label||"img")}">`:`<span class="chat-thumb-path">${(0,n.esc)(t.label||t.name||"file")}</span>`}
31
31
  <span class="chat-thumb-label">${(0,n.esc)(t.label||t.kind||"")}</span>
32
32
  <button type="button" class="chat-thumb-x" data-rm-attach="${s}" aria-label="remove">\u2715</button>
33
- </div>`).join("")}}async function ui(e){if(!e)return;let t=e.name||`upload-${Date.now()}`,s=await ci(e,t),{ref:a,label:o,kind:i}=pi(e,s),r="";if(i==="image")try{r=URL.createObjectURL(e)}catch{}return Fe.push({path:s,ref:a,label:o,kind:i,name:t,previewUrl:r}),os(),di((0,n.$)("chat-input"),a),s}async function bn(e){let t=[...e||[]].filter(Boolean);if(!t.length)return;let s=(0,n.$)("chat-input");s&&(s.disabled=!0);try{for(let a of t)try{await ui(a)}catch(o){g(`\u4E0A\u4F20\u5931\u8D25 ${a.name||"file"}: ${o.message}`)}}finally{s&&(s.disabled=!1,s.focus())}}function fi(){let e=(0,n.$)("chat-file-input");if(e){e.value="",e.click();return}let t=document.createElement("input");t.type="file",t.accept="image/*,*/*",t.multiple=!0,t.addEventListener("change",()=>bn(t.files)),t.click()}function Sa(){document.addEventListener("paste",async e=>{let t=(0,n.$)("chat-input");if(!t)return;let s=(0,n.$)("chat-composer");if(!(s&&(s.contains(document.activeElement)||document.activeElement===t))&&document.activeElement!==t)return;let o=[...e.clipboardData?.items||[]],i=[];for(let p of o)if(p.kind==="file"){let l=p.getAsFile();l&&i.push(l)}let r=i.filter(p=>$a(p)),c=r.length?r:i;c.length&&(e.preventDefault(),await bn(c))}),!ua&&(ua=!0,document.addEventListener("dragover",e=>{let t=(0,n.$)("chat-composer");!t||!e.dataTransfer?.types?.includes("Files")||!t.contains(e.target)&&e.target!==t||(e.preventDefault(),t.classList.add("chat-drop-active"))}),document.addEventListener("dragleave",e=>{let t=(0,n.$)("chat-composer");t&&(e.target===t||t.contains(e.target))&&(t.contains(e.relatedTarget)||t.classList.remove("chat-drop-active"))}),document.addEventListener("drop",async e=>{let t=(0,n.$)("chat-composer");if(!t||(t.classList.remove("chat-drop-active"),!t.contains(e.target)&&e.target!==t))return;let s=[...e.dataTransfer?.files||[]];s.length&&(e.preventDefault(),await bn(s))}))}function Ie(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function is(e){let t=(0,n.$)("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="flex items-center gap-1.5 px-1 py-0.5 text-[10px] font-mono text-base-content/30 select-none">
34
- <span class="text-base-content/20">\u25C8</span>${(0,n.esc)(e)}
35
- </div>`),se(t))}function ft(e){if(!e)return;let t=e.input_tokens??e.inputTokens??0,s=e.output_tokens??e.outputTokens??0,a=e.total_tokens??e.totalTokens??t+s,o=e.cache_read_input_tokens??e.cachedReadTokens?` \xB7 ${Ie(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",i=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${Ie(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${Ie(e.reasoning_tokens??e.reasoningTokens)} reason`:"",c=e.costUSD??e.cost_usd,p=c!=null?` \xB7 $${Number(c).toFixed(4)}`:"",l=a?` \xB7 \u03A3${Ie(a)}`:"";is(`\u2191${Ie(t)} \u2193${Ie(s)}${o}${i}${r}${l}${p}`)}function rs(e){if(!e)return;let t=e.tokensUsed??e.contextTokensUsed,s=e.windowTokens??e.contextWindowTokens,a=e.usagePercent??e.contextWindowUsage;if(t==null&&s==null&&a==null)return;let o=[];t!=null&&s!=null?o.push(`context ${Ie(t)} / ${Ie(s)}`):t!=null&&o.push(`context ${Ie(t)}`),a!=null&&o.push(`${a}%`),e.model&&o.push(e.model),e.turnCount!=null&&o.push(`${e.turnCount} turns`),e.toolCallCount!=null&&o.push(`${e.toolCallCount} tools`),is(`\u25A3 ${o.join(" \xB7 ")}`)}function mt(){let e=(0,n.$)("messages"),t=(0,n.$)("permission-requests");e&&(e.innerHTML=""),t&&(t.innerHTML=""),f.shellBubble=null,he=null,be=ne=null,Be=ge=null}function mi(e){let t=(0,n.$)("messages");if(!t)return null;let s=e==="shell-err"?" text-error":"";return t.insertAdjacentHTML("beforeend",`<div class="mx-2 rounded-lg code-surface px-3 py-2 text-sm font-mono${s} whitespace-pre-wrap break-words"></div>`),se(t),t.lastElementChild}function hi(e,t){e&&(e.textContent+=t,se(e.closest("#messages")))}function bi(e){let t=typeof e.input=="object"?JSON.stringify(e.input,null,2):String(e.input||""),a=((typeof e.input=="object"?Object.values(e.input).find(o=>typeof o=="string"&&o.trim()):t)||"").replace(/\n/g," ").slice(0,Me.peek()==="full"?120:80);return{inputStr:t,preview:a}}function ma(e,{inBatch:t=!1}={}){let{inputStr:s,preview:a}=bi(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
33
+ </div>`).join("")}}async function ki(e){if(!e)return;let t=e.name||`upload-${Date.now()}`,s=await Aa(e,t),a=await xi(s,t),{ref:o,label:i,kind:r}=wi(e,a),c="";if(r==="image")try{c=URL.createObjectURL(s)}catch{}return qe.push({path:a,ref:o,label:i,kind:r,name:t,previewUrl:c}),ds(),yi((0,n.$)("chat-input"),o),a}async function wn(e){let t=[...e||[]].filter(Boolean);if(!t.length)return;let s=(0,n.$)("chat-input");s&&(s.disabled=!0);try{for(let a of t)try{await ki(a)}catch(o){g(`\u4E0A\u4F20\u5931\u8D25 ${a.name||"file"}: ${o.message}`)}}finally{s&&(s.disabled=!1,s.focus())}}function $i(){let e=(0,n.$)("chat-file-input");if(e){e.value="",e.click();return}let t=document.createElement("input");t.type="file",t.accept="image/*,*/*",t.multiple=!0,t.addEventListener("change",()=>wn(t.files)),t.click()}function ja(){document.addEventListener("paste",async e=>{let t=(0,n.$)("chat-input");if(!t)return;let s=(0,n.$)("chat-composer");if(!(s&&(s.contains(document.activeElement)||document.activeElement===t))&&document.activeElement!==t)return;let o=[...e.clipboardData?.items||[]],i=[];for(let p of o)if(p.kind==="file"){let l=p.getAsFile();l&&i.push(l)}let r=i.filter(p=>cs(p)),c=r.length?r:i;c.length&&(e.preventDefault(),await wn(c))}),!va&&(va=!0,document.addEventListener("dragover",e=>{let t=(0,n.$)("chat-composer");!t||!e.dataTransfer?.types?.includes("Files")||!t.contains(e.target)&&e.target!==t||(e.preventDefault(),t.classList.add("chat-drop-active"))}),document.addEventListener("dragleave",e=>{let t=(0,n.$)("chat-composer");t&&(e.target===t||t.contains(e.target))&&(t.contains(e.relatedTarget)||t.classList.remove("chat-drop-active"))}),document.addEventListener("drop",async e=>{let t=(0,n.$)("chat-composer");if(!t||(t.classList.remove("chat-drop-active"),!t.contains(e.target)&&e.target!==t))return;let s=[...e.dataTransfer?.files||[]];s.length&&(e.preventDefault(),await wn(s))}))}function Ae(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function ps(e){let t=(0,n.$)("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
34
+ <span class="token-bar-mark">\u25C8</span><span class="token-bar-text">${(0,n.esc)(e)}</span>
35
+ </div>`),ae(t))}function gt(e){if(!e)return;let t=e.input_tokens??e.inputTokens??0,s=e.output_tokens??e.outputTokens??0,a=e.total_tokens??e.totalTokens??t+s,o=e.cache_read_input_tokens??e.cachedReadTokens?` \xB7 ${Ae(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",i=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${Ae(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${Ae(e.reasoning_tokens??e.reasoningTokens)} reason`:"",c=e.costUSD??e.cost_usd,p=c!=null?` \xB7 $${Number(c).toFixed(4)}`:"",l=a?` \xB7 \u03A3${Ae(a)}`:"";ps(`\u2191${Ae(t)} \u2193${Ae(s)}${o}${i}${r}${l}${p}`)}function us(e){if(!e)return;let t=e.tokensUsed??e.contextTokensUsed,s=e.windowTokens??e.contextWindowTokens,a=e.usagePercent??e.contextWindowUsage;if(t==null&&s==null&&a==null)return;let o=[];t!=null&&s!=null?o.push(`context ${Ae(t)} / ${Ae(s)}`):t!=null&&o.push(`context ${Ae(t)}`),a!=null&&o.push(`${a}%`),e.model&&o.push(e.model),e.turnCount!=null&&o.push(`${e.turnCount} turns`),e.toolCallCount!=null&&o.push(`${e.toolCallCount} tools`),ps(`\u25A3 ${o.join(" \xB7 ")}`)}function xt(){let e=(0,n.$)("messages"),t=(0,n.$)("permission-requests");e&&(e.innerHTML=""),t&&(t.innerHTML=""),f.shellBubble=null,be=null,ge=se=null,Oe=xe=null}function Si(e){let t=(0,n.$)("messages");if(!t)return null;let s=e==="shell-err"?" text-error":"";return t.insertAdjacentHTML("beforeend",`<div class="mx-2 rounded-lg code-surface px-3 py-2 text-sm font-mono${s} whitespace-pre-wrap break-words"></div>`),ae(t),t.lastElementChild}function Li(e,t){e&&(e.textContent+=t,ae(e.closest("#messages")))}function Ei(e){let t=typeof e.input=="object"?JSON.stringify(e.input,null,2):String(e.input||""),a=((typeof e.input=="object"?Object.values(e.input).find(o=>typeof o=="string"&&o.trim()):t)||"").replace(/\n/g," ").slice(0,Ie.peek()==="full"?120:80);return{inputStr:t,preview:a}}function wa(e,{inBatch:t=!1}={}){let{inputStr:s,preview:a}=Ei(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
36
36
  <div class="flex items-center gap-1.5 text-xs font-mono">
37
37
  <span class="text-warning">\u26A1</span>
38
38
  <span class="text-warning font-semibold">${(0,n.esc)(e.name||"tool")}</span>
@@ -40,21 +40,21 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
40
40
  <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>
41
41
  </div>
42
42
  <div class="tool-detail">${(0,n.esc)(s)}</div>
43
- </div>`}function gi(e){let t=[...new Set(e.names)],s=t.slice(0,4).join(", ")+(t.length>4?"\u2026":""),a=e.el.querySelector(".tool-batch-summary");a&&(a.innerHTML=`<span class="text-warning">\u26A1</span>
43
+ </div>`}function Mi(e){let t=[...new Set(e.names)],s=t.slice(0,4).join(", ")+(t.length>4?"\u2026":""),a=e.el.querySelector(".tool-batch-summary");a&&(a.innerHTML=`<span class="text-warning">\u26A1</span>
44
44
  <span class="font-semibold text-base-content/70">${e.count} tool${e.count===1?"":"s"}</span>
45
45
  <span class="text-base-content/40 truncate flex-1">${(0,n.esc)(s)}</span>
46
- <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function le(){he=null}function ls(e,t={}){let s=(0,n.$)("messages");if(!s)return;let a=Me.peek()||"normal",o=_(t.ts);if(a==="clean"){if(!he||!s.contains(he.el)){let p=mn(o),l=hn(o);s.insertAdjacentHTML("beforeend",`
46
+ <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function ce(){be=null}function fs(e,t={}){let s=(0,n.$)("messages");if(!s)return;let a=Ie.peek()||"normal",o=_(t.ts);if(a==="clean"){if(!be||!s.contains(be.el)){let p=vn(o),l=yn(o);s.insertAdjacentHTML("beforeend",`
47
47
  <div class="msg-row assistant px-2" data-ts="${(0,n.esc)(l)}">
48
48
  <div class="tool-batch w-full max-w-[96%] px-2 py-1.5">
49
49
  <div class="tool-batch-summary flex items-center gap-1.5 text-xs font-mono"></div>
50
50
  <div class="tool-batch-list"></div>
51
51
  </div>
52
52
  ${p?`<div class="msg-ts" title="${(0,n.esc)(l)}">${(0,n.esc)(p)}</div>`:""}
53
- </div>`),he={el:s.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}he.names.push(e.name||"tool"),he.count++,he.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",ma(e,{inBatch:!0})),gi(he),se(s);return}he=null;let i=mn(o),r=hn(o);s.insertAdjacentHTML("beforeend",`
53
+ </div>`),be={el:s.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}be.names.push(e.name||"tool"),be.count++,be.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",wa(e,{inBatch:!0})),Mi(be),ae(s);return}be=null;let i=vn(o),r=yn(o);s.insertAdjacentHTML("beforeend",`
54
54
  <div class="msg-row assistant px-2" data-ts="${(0,n.esc)(r)}">
55
- <div class="w-full max-w-[96%]">${ma(e)}</div>
55
+ <div class="w-full max-w-[96%]">${wa(e)}</div>
56
56
  ${i?`<div class="msg-ts" title="${(0,n.esc)(r)}">${(0,n.esc)(i)}</div>`:""}
57
- </div>`),se(s)}function gn(){let e=(0,n.$)("messages");e&&e.setAttribute("data-density",Me.peek()||"normal")}function xi(e){let t=e.request_id||e.requestId;if(!t||(0,n.$)(`perm-${t}`))return;let s=e.tool_input?JSON.stringify(e.tool_input).slice(0,200):"";(0,n.$)("permission-requests")?.insertAdjacentHTML("beforeend",`
57
+ </div>`),ae(s)}function kn(){let e=(0,n.$)("messages");e&&e.setAttribute("data-density",Ie.peek()||"normal")}function Ti(e){let t=e.request_id||e.requestId;if(!t||(0,n.$)(`perm-${t}`))return;let s=e.tool_input?JSON.stringify(e.tool_input).slice(0,200):"";(0,n.$)("permission-requests")?.insertAdjacentHTML("beforeend",`
58
58
  <div id="perm-${t}" class="perm-banner mx-3 mb-2 rounded-lg border border-warning/25 bg-warning/8 p-3">
59
59
  <div class="text-xs text-warning font-semibold mb-1">\u26A0\uFE0F Permission Required</div>
60
60
  <div class="font-mono text-xs text-base-content/60 break-all mb-2">
@@ -64,47 +64,47 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
64
64
  <button class="btn btn-success btn-xs" data-perm-id="${t}" data-perm-allow="1">Allow</button>
65
65
  <button class="btn btn-error btn-xs" data-perm-id="${t}" data-perm-allow="0">Deny</button>
66
66
  </div>
67
- </div>`),(0,n.$)("messages").scrollTop=999999}function vi(){if(ha||typeof marked>"u")return;let e=a=>String(a??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=(a,o)=>{let i=String(o||"").trim().split(/\s+/)[0]||"",r=i||"text",c=i?`language-${(0,n.esc)(i)}`:"";return`<div class="code-block">
67
+ </div>`),(0,n.$)("messages").scrollTop=999999}function Ii(){if(ka||typeof marked>"u")return;let e=a=>String(a??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=(a,o)=>{let i=String(o||"").trim().split(/\s+/)[0]||"",r=i||"text",c=i?`language-${(0,n.esc)(i)}`:"";return`<div class="code-block">
68
68
  <div class="code-block-header">
69
69
  <span class="code-block-lang">${(0,n.esc)(r)}</span>
70
70
  <button type="button" class="code-copy" data-copy="1" title="Copy code">Copy</button>
71
71
  </div>
72
72
  <pre><code class="hljs ${c}">${e(a)}</code></pre>
73
- </div>`},s={code(a,o){return a&&typeof a=="object"&&a.text!=null?t(a.text,a.lang||o):t(a,o)},table(a,o){return a&&typeof a=="object"&&!Array.isArray(a)&&a.header?!1:`<div class="table-wrap"><table><thead>${a}</thead><tbody>${o}</tbody></table></div>`}};try{if(typeof marked.use=="function")marked.use({gfm:!0,breaks:!0,renderer:s});else if(typeof marked.setOptions=="function"){let a=new marked.Renderer;a.code=s.code,a.table=s.table,marked.setOptions({gfm:!0,breaks:!0,renderer:a})}}catch(a){console.warn("[md] marked setup failed",a)}ha=!0}function pn(e){if(typeof marked>"u")return(0,n.esc)(e);try{return vi(),marked.parse(String(e??""),{breaks:!0,gfm:!0})}catch{return(0,n.esc)(e)}}function La(e){!e||typeof hljs>"u"||(e.querySelectorAll("pre code:not(.hljs)").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),e.querySelectorAll("pre code.hljs").forEach(t=>{t.classList.add("hljs")}))}function Ta(){gn(),ra(),(0,n.watch)(Se,a=>{Ut(),Ze();let o=(0,n.$)("ws-banner"),i=(0,n.$)("ws-banner-text");if(!o)return;if(a==="open"||a==="idle"){o.classList.add("hidden"),i&&(i.textContent="");return}if(a==="connecting"&&!cn){o.classList.add("hidden");return}o.classList.remove("hidden");let r=a==="offline"?"\u7F51\u7EDC\u5DF2\u65AD\u5F00\uFF0C\u6062\u590D\u540E\u4F1A\u81EA\u52A8\u91CD\u8FDE":a==="connecting"?"\u6B63\u5728\u8FDE\u63A5\u2026":"\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u6B63\u5728\u91CD\u8FDE\u2026\uFF08\u7184\u5C4F\u6216\u5207\u7F51\u65F6\u5E38\u89C1\uFF09";i?i.textContent=r:o.textContent=r}),(0,n.watch)(y,()=>Ze()),n.delegate.on("click","#btn-refresh-conn, #ws-banner-retry",a=>{a.preventDefault(),Qo()}),(0,n.watch)(ie,a=>{(0,n.$)("send-btn")?.classList.toggle("hidden",a),(0,n.$)("stop-btn")?.classList.toggle("hidden",!a);let o=(0,n.$)("chat-input");o&&(o.disabled=!1,a?o.placeholder="\u56DE\u590D\u4E2D\u2026 \u53EF\u5148\u5199\u597D\u4E0B\u4E00\u6761\uFF0C\u7ED3\u675F\u540E\u81EA\u52A8\u53D1\u9001 \xB7 \u6216\u70B9 \u25A0 \u505C\u6B62":un(o.value||""));let i=(0,n.$)("messages");if(!i)return;let r=(0,n.$)("typing-indicator");a&&!r?(i.insertAdjacentHTML("beforeend",'<div id="typing-indicator" class="flex justify-start px-2"><div class="flex items-center gap-1.5 rounded-2xl rounded-tl-sm px-3 py-2 bg-base-200 text-xs text-base-content/40"><span class="dot"></span><span class="dot"></span><span class="dot"></span></div></div>'),se(i)):a||(r?.remove(),le()),Ze()}),(0,n.watch)(Me,()=>gn()),n.delegate.on("keydown","#chat-input",a=>{a.key==="Enter"&&(a.metaKey||a.ctrlKey)&&(a.preventDefault(),xn())}),n.delegate.on("input","#chat-input",(a,o)=>{fn(o),un(o.value)}),n.delegate.on("click","#btn-attach",a=>{a.preventDefault(),fi()}),n.delegate.on("change","#chat-file-input",(a,o)=>{let i=o?.files;i?.length&&bn(i),o&&(o.value="")}),n.delegate.on("click","[data-rm-attach]",(a,o)=>{a.preventDefault(),a.stopPropagation();let i=parseInt(o.dataset.rmAttach,10);if(Number.isNaN(i)||i<0||i>=Fe.length)return;let r=Fe[i];if(r?.previewUrl)try{URL.revokeObjectURL(r.previewUrl)}catch{}let c=(0,n.$)("chat-input");c&&r?.ref&&(c.value=c.value.split(r.ref).join("").replace(/\n{3,}/g,`
73
+ </div>`},s={code(a,o){return a&&typeof a=="object"&&a.text!=null?t(a.text,a.lang||o):t(a,o)},table(a,o){return a&&typeof a=="object"&&!Array.isArray(a)&&a.header?!1:`<div class="table-wrap"><table><thead>${a}</thead><tbody>${o}</tbody></table></div>`}};try{if(typeof marked.use=="function")marked.use({gfm:!0,breaks:!0,renderer:s});else if(typeof marked.setOptions=="function"){let a=new marked.Renderer;a.code=s.code,a.table=s.table,marked.setOptions({gfm:!0,breaks:!0,renderer:a})}}catch(a){console.warn("[md] marked setup failed",a)}ka=!0}function bn(e){if(typeof marked>"u")return(0,n.esc)(e);try{return Ii(),marked.parse(String(e??""),{breaks:!0,gfm:!0})}catch{return(0,n.esc)(e)}}function Da(e){!e||typeof hljs>"u"||(e.querySelectorAll("pre code:not(.hljs)").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),e.querySelectorAll("pre code.hljs").forEach(t=>{t.classList.add("hljs")}))}function _a(){kn(),ma(),(0,n.watch)(Ee,a=>{qt(),nt();let o=(0,n.$)("ws-banner"),i=(0,n.$)("ws-banner-text");if(!o)return;if(a==="open"||a==="idle"){o.classList.add("hidden"),i&&(i.textContent="");return}if(a==="connecting"&&!mn){o.classList.add("hidden");return}o.classList.remove("hidden");let r=a==="offline"?"\u7F51\u7EDC\u5DF2\u65AD\u5F00\uFF0C\u6062\u590D\u540E\u4F1A\u81EA\u52A8\u91CD\u8FDE":a==="connecting"?"\u6B63\u5728\u8FDE\u63A5\u2026":"\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u6B63\u5728\u91CD\u8FDE\u2026\uFF08\u7184\u5C4F\u6216\u5207\u7F51\u65F6\u5E38\u89C1\uFF09";i?i.textContent=r:o.textContent=r}),(0,n.watch)(y,()=>nt()),n.delegate.on("click","#btn-refresh-conn, #ws-banner-retry",a=>{a.preventDefault(),ri()}),(0,n.watch)(re,a=>{(0,n.$)("send-btn")?.classList.toggle("hidden",a),(0,n.$)("stop-btn")?.classList.toggle("hidden",!a);let o=(0,n.$)("chat-input");o&&(o.disabled=!1,a?o.placeholder="\u56DE\u590D\u4E2D\u2026 \u53EF\u5148\u5199\u597D\u4E0B\u4E00\u6761\uFF0C\u7ED3\u675F\u540E\u81EA\u52A8\u53D1\u9001 \xB7 \u6216\u70B9 \u25A0 \u505C\u6B62":gn(o.value||""));let i=(0,n.$)("messages");if(!i)return;let r=(0,n.$)("typing-indicator");a&&!r?(i.insertAdjacentHTML("beforeend",'<div id="typing-indicator" class="flex justify-start px-2"><div class="flex items-center gap-1.5 rounded-2xl rounded-tl-sm px-3 py-2 bg-base-200 text-xs text-base-content/40"><span class="dot"></span><span class="dot"></span><span class="dot"></span></div></div>'),ae(i)):a||(r?.remove(),ce()),nt()}),(0,n.watch)(Ie,()=>kn()),n.delegate.on("keydown","#chat-input",a=>{if(a.key!=="Enter")return;let o=a.metaKey||a.ctrlKey,i=window.matchMedia("(max-width: 640px)").matches&&!a.shiftKey&&!o;(o||i)&&(a.preventDefault(),Wt())}),n.delegate.on("submit","#chat-form",a=>{a.preventDefault(),Wt()}),n.delegate.on("input","#chat-input",(a,o)=>{xn(o),gn(o.value)}),n.delegate.on("click","#btn-attach",a=>{a.preventDefault(),$i()}),n.delegate.on("change","#chat-file-input",(a,o)=>{let i=o?.files;i?.length&&wn(i),o&&(o.value="")}),n.delegate.on("click","[data-rm-attach]",(a,o)=>{a.preventDefault(),a.stopPropagation();let i=parseInt(o.dataset.rmAttach,10);if(Number.isNaN(i)||i<0||i>=qe.length)return;let r=qe[i];if(r?.previewUrl)try{URL.revokeObjectURL(r.previewUrl)}catch{}let c=(0,n.$)("chat-input");c&&r?.ref&&(c.value=c.value.split(r.ref).join("").replace(/\n{3,}/g,`
74
74
 
75
- `),c.dispatchEvent(new Event("input"))),Fe.splice(i,1),os()}),n.delegate.on("click","[data-perm-id]",(a,o)=>{At({type:"command",cmd:"approval.respond",requestId:o.dataset.permId,allow:o.dataset.permAllow==="1",sessionId:f.sessionId}),o.closest(".perm-banner")?.remove()}),n.delegate.on("click",".tool-card",(a,o)=>{let i=o.closest(".tool-batch");if(i&&!i.classList.contains("open")&&!o.classList.contains("tool-batch-item"))return;a.stopPropagation();let r=(0,n.$)("messages"),c=o.getBoundingClientRect().top;if(o.classList.toggle("open"),r){let p=o.getBoundingClientRect().top;r.scrollTop+=p-c}}),n.delegate.on("click",".tool-batch",(a,o)=>{if(a.target.closest(".tool-card")&&o.classList.contains("open"))return;let i=(0,n.$)("messages"),r=o.getBoundingClientRect().top;if(o.classList.toggle("open"),i){let c=o.getBoundingClientRect().top;i.scrollTop+=c-r}});let e=(0,n.$)("messages"),t=(0,n.$)("scroll-top-btn"),s=(0,n.$)("scroll-bottom-btn");if(e&&t&&s){let a=()=>{let o=e.scrollHeight-e.clientHeight>200;t.classList.toggle("hidden",!o||e.scrollTop<200),s.classList.toggle("hidden",!o||ba(e))};e.addEventListener("scroll",a,{passive:!0}),new ResizeObserver(a).observe(e),new MutationObserver(a).observe(e,{childList:!0,subtree:!0}),t.addEventListener("click",()=>e.scrollTo({top:0,behavior:"smooth"})),s.addEventListener("click",()=>e.scrollTo({top:e.scrollHeight,behavior:"smooth"})),a()}n.delegate.on("click",".msg-expand-btn",(a,o)=>{a.stopPropagation();let r=o.closest(".msg-card").classList.toggle("open");o.textContent=r?"\u25B2 Show less":"\u25BC Show more"}),n.delegate.on("click",".code-copy",async(a,o)=>{a.preventDefault(),a.stopPropagation();let c=o.closest(".code-block")?.querySelector("pre code")?.textContent??"";try{await navigator.clipboard.writeText(c),o.textContent="Copied",o.classList.add("copied"),setTimeout(()=>{o.textContent="Copy",o.classList.remove("copied")},1400)}catch{o.textContent="Failed",setTimeout(()=>{o.textContent="Copy"},1400)}})}var Ht,Ae,xe,Ce,ln,da,cn,pa,dn,Rt,be,ne,Be,ge,ti,oi,ii,Fe,rn,ua,he,ha,ht=X(()=>{C();I();K();la();Dt();Dt();Ht=0,Ae=null,xe=1e3,Ce=0,ln=null,da=!1,cn=!1,pa=null,dn=!1,Rt=null;be=null,ne=null,Be=null,ge=null;ti={haiku:"claude-haiku-4-5",sonnet:"claude-sonnet-4-6",opus:"claude-opus-4-5",sonnet4:"claude-sonnet-4-6",haiku4:"claude-haiku-4-5"};oi=200,ii=500;Fe=[],rn=0,ua=!1;he=null;ha=!1});function Ea(e,t){Ma=e,cs=t,window.addEventListener("hashchange",()=>{if(ds){ds=!1;return}Ca(location.hash.slice(1)||"/")}),(0,n.watch)(j,s=>{f.sessionId&&vn(`/session/${f.sessionId}/${s}`)})}function ps(e){let t=(e||"").match(/^\/session\/([^/]+)(?:\/([^/]+))?$/);return t?{id:t[1],tab:t[2]||null}:null}function Ia(){Ca(location.hash.slice(1)||"/")}function Ca(e){let t=ps(e);if(!t){document.dispatchEvent(new CustomEvent("router:home"));return}let{id:s,tab:a}=t;!Ma||!cs||(s!==f.sessionId?document.dispatchEvent(new CustomEvent("router:session",{detail:{id:s,tab:a}})):a&&a!==j.peek()&&cs(a))}function vn(e){ds=!0,location.hash=e}function yn(){f.sessionId&&vn(`/session/${f.sessionId}/${j.peek()}`)}var Hr,Ma,cs,ds,wn=X(()=>{C();I();Hr=(0,n.createRouter)({"/":()=>{},"/session/*":()=>{},"/session/*/*":()=>{},"*":()=>{}}),Ma=null,cs=null,ds=!1});async function $n(){try{return await kn.get("sessions")??null}catch{return null}}async function Aa(e){try{await kn.set("sessions",e,{ttl:yi})}catch{}}async function ja(){try{return await kn.get("workspaces")??null}catch{return null}}async function Bt(e){try{await kn.set("workspaces",e,{ttl:3600*1e3})}catch{}}var kn,yi,Sn=X(()=>{C();kn=(0,n.idb)("claude-ui"),yi=300*1e3});function An(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function ve(){let e=An(E.peek()),t=T.peek();k.peek()&&t&&(e=e.filter(a=>a&&(!a.machineId||a.machineId===t)));let s=Q.peek();return s&&s!=="all"&&(e=e.filter(a=>a&&(a.agent||"claude")===s)),e}function Va(e){let t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),a=String(e.getDate()).padStart(2,"0");return`${t}-${s}-${a}`}function Ai(e,t){let s=[],o=new Date(e,t,1).getDay(),r=new Date(e,t+1,0).getDate(),c=new Date(e,t,0).getDate();for(let l=o-1;l>=0;l--)s.push({date:new Date(e,t-1,c-l),isCurrentMonth:!1});for(let l=1;l<=r;l++)s.push({date:new Date(e,t,l),isCurrentMonth:!0});let p=7-s.length%7;if(p<7)for(let l=1;l<=p;l++)s.push({date:new Date(e,t+1,l),isCurrentMonth:!1});return s}function Ya(e,t){let s=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),a=s+1440*60*1e3;return t.filter(o=>{let i=_(o.updatedAt);return i!=null&&i>=s&&i<a})}function Xa(e){return e==null||isNaN(e)?"0":e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function at(e){let t=(0,n.$)("calendar-grid");if(!t)return;e=An(e??ve());let s=(0,n.$)("calendar-month-year");if(s){let d=new Date(Cn,st,1);s.textContent=d.toLocaleDateString([],{month:"long",year:"numeric"})}let a=e.length,o=new Set(e.map(d=>d.cwd).filter(Boolean)).size,i=e.reduce((d,u)=>d+(Number(u.totalTokens)||0),0),r=(0,n.$)("stats-total-sessions"),c=(0,n.$)("stats-total-projects"),p=(0,n.$)("stats-total-tokens");r&&(r.textContent=String(a)),c&&(c.textContent=String(o)),p&&(p.textContent=Xa(i));let l=Ai(Cn,st);Wt||(Wt=Va(new Date)),t.innerHTML=l.map(d=>{let u=d.date,m=Va(u),x=Ya(u,e).length,W=u.toDateString()===new Date().toDateString(),We=m===Wt,de="",Ge="text-base-content/65",$e="border border-transparent",w="cursor-default",G=d.isCurrentMonth?"":"opacity-25";x>0?(w="cursor-pointer",x<=2?(de="bg-primary/15",Ge="text-primary font-bold",$e="border border-primary/30"):x<=5?(de="bg-primary/30",Ge="text-primary font-bold",$e="border border-primary/50"):(de="bg-primary/60",Ge="text-primary-content font-bold",$e="border border-primary/80")):(de="bg-base-300/25",d.isCurrentMonth&&(w="hover:bg-base-300/50")),W?$e="border-2 border-primary":We&&($e="border-2 border-accent");let ze=u.getDate()===1?`<span class="absolute top-0.5 left-1 text-[8px] opacity-60 uppercase">${u.toLocaleDateString([],{month:"short"})}</span>`:"";return`
76
- <div class="aspect-square rounded-xl flex flex-col items-center justify-center p-2 relative transition-all min-h-[50px] md:min-h-[60px] ${de} ${Ge} ${$e} ${w} ${G}"
75
+ `),c.dispatchEvent(new Event("input"))),qe.splice(i,1),ds()}),n.delegate.on("click","[data-perm-id]",(a,o)=>{_t({type:"command",cmd:"approval.respond",requestId:o.dataset.permId,allow:o.dataset.permAllow==="1",sessionId:f.sessionId}),o.closest(".perm-banner")?.remove()}),n.delegate.on("click",".tool-card",(a,o)=>{let i=o.closest(".tool-batch");if(i&&!i.classList.contains("open")&&!o.classList.contains("tool-batch-item"))return;a.stopPropagation();let r=(0,n.$)("messages"),c=o.getBoundingClientRect().top;if(o.classList.toggle("open"),r){let p=o.getBoundingClientRect().top;r.scrollTop+=p-c}}),n.delegate.on("click",".tool-batch",(a,o)=>{if(a.target.closest(".tool-card")&&o.classList.contains("open"))return;let i=(0,n.$)("messages"),r=o.getBoundingClientRect().top;if(o.classList.toggle("open"),i){let c=o.getBoundingClientRect().top;i.scrollTop+=c-r}});let e=(0,n.$)("messages"),t=(0,n.$)("scroll-top-btn"),s=(0,n.$)("scroll-bottom-btn");if(e&&t&&s){let a=()=>{let o=e.scrollHeight-e.clientHeight>200;t.classList.toggle("hidden",!o||e.scrollTop<200),s.classList.toggle("hidden",!o||$a(e))};e.addEventListener("scroll",a,{passive:!0}),new ResizeObserver(a).observe(e),new MutationObserver(a).observe(e,{childList:!0,subtree:!0}),t.addEventListener("click",()=>e.scrollTo({top:0,behavior:"smooth"})),s.addEventListener("click",()=>e.scrollTo({top:e.scrollHeight,behavior:"smooth"})),a()}n.delegate.on("click",".msg-expand-btn",(a,o)=>{a.stopPropagation();let r=o.closest(".msg-card").classList.toggle("open");o.textContent=r?"\u25B2 Show less":"\u25BC Show more"}),n.delegate.on("click",".code-copy",async(a,o)=>{a.preventDefault(),a.stopPropagation();let c=o.closest(".code-block")?.querySelector("pre code")?.textContent??"";try{await navigator.clipboard.writeText(c),o.textContent="Copied",o.classList.add("copied"),setTimeout(()=>{o.textContent="Copy",o.classList.remove("copied")},1400)}catch{o.textContent="Failed",setTimeout(()=>{o.textContent="Copy"},1400)}})}var Bt,De,ve,je,fn,ga,mn,xa,hn,Ot,ge,se,Oe,xe,di,mi,hi,qe,un,va,be,ka,vt=Q(()=>{C();I();K();ha();Nt();Nt();Bt=0,De=null,ve=1e3,je=0,fn=null,ga=!1,mn=!1,xa=null,hn=!1,Ot=null;ge=null,se=null,Oe=null,xe=null;di={haiku:"claude-haiku-4-5",sonnet:"claude-sonnet-4-6",opus:"claude-opus-4-5",sonnet4:"claude-sonnet-4-6",haiku4:"claude-haiku-4-5"};mi=200,hi=500;qe=[],un=0,va=!1;be=null;ka=!1});function Ha(e,t){Pa=e,ms=t,window.addEventListener("hashchange",()=>{if(hs){hs=!1;return}Ra(location.hash.slice(1)||"/")}),(0,n.watch)(j,s=>{f.sessionId&&$n(`/session/${f.sessionId}/${s}`)})}function bs(e){let t=(e||"").match(/^\/session\/([^/]+)(?:\/([^/]+))?$/);return t?{id:t[1],tab:t[2]||null}:null}function Na(){Ra(location.hash.slice(1)||"/")}function Ra(e){let t=bs(e);if(!t){document.dispatchEvent(new CustomEvent("router:home"));return}let{id:s,tab:a}=t;!Pa||!ms||(s!==f.sessionId?document.dispatchEvent(new CustomEvent("router:session",{detail:{id:s,tab:a}})):a&&a!==j.peek()&&ms(a))}function $n(e){hs=!0,location.hash=e}function Sn(){f.sessionId&&$n(`/session/${f.sessionId}/${j.peek()}`)}var zr,Pa,ms,hs,Ln=Q(()=>{C();I();zr=(0,n.createRouter)({"/":()=>{},"/session/*":()=>{},"/session/*/*":()=>{},"*":()=>{}}),Pa=null,ms=null,hs=!1});async function Mn(){try{return await En.get("sessions")??null}catch{return null}}async function Ba(e){try{await En.set("sessions",e,{ttl:Ci})}catch{}}async function Ua(){try{return await En.get("workspaces")??null}catch{return null}}async function Gt(e){try{await En.set("workspaces",e,{ttl:3600*1e3})}catch{}}var En,Ci,Tn=Q(()=>{C();En=(0,n.idb)("claude-ui"),Ci=300*1e3});function Pn(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function ye(){let e=Pn(T.peek()),t=E.peek();$.peek()&&t&&(e=e.filter(a=>a&&(!a.machineId||a.machineId===t)));let s=Z.peek();return s&&s!=="all"&&(e=e.filter(a=>a&&(a.agent||"claude")===s)),e}function so(e){let t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),a=String(e.getDate()).padStart(2,"0");return`${t}-${s}-${a}`}function Fi(e,t){let s=[],o=new Date(e,t,1).getDay(),r=new Date(e,t+1,0).getDate(),c=new Date(e,t,0).getDate();for(let l=o-1;l>=0;l--)s.push({date:new Date(e,t-1,c-l),isCurrentMonth:!1});for(let l=1;l<=r;l++)s.push({date:new Date(e,t,l),isCurrentMonth:!0});let p=7-s.length%7;if(p<7)for(let l=1;l<=p;l++)s.push({date:new Date(e,t+1,l),isCurrentMonth:!1});return s}function ao(e,t){let s=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),a=s+1440*60*1e3;return t.filter(o=>{let i=_(o.updatedAt);return i!=null&&i>=s&&i<a})}function oo(e){return e==null||isNaN(e)?"0":e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function rt(e){let t=(0,n.$)("calendar-grid");if(!t)return;e=Pn(e??ye());let s=(0,n.$)("calendar-month-year");if(s){let d=new Date(_n,it,1);s.textContent=d.toLocaleDateString([],{month:"long",year:"numeric"})}let a=e.length,o=new Set(e.map(d=>d.cwd).filter(Boolean)).size,i=e.reduce((d,u)=>d+(Number(u.totalTokens)||0),0),r=(0,n.$)("stats-total-sessions"),c=(0,n.$)("stats-total-projects"),p=(0,n.$)("stats-total-tokens");r&&(r.textContent=String(a)),c&&(c.textContent=String(o)),p&&(p.textContent=oo(i));let l=Fi(_n,it);Vt||(Vt=so(new Date)),t.innerHTML=l.map(d=>{let u=d.date,m=so(u),x=ao(u,e).length,W=u.toDateString()===new Date().toDateString(),ze=m===Vt,pe="",Je="text-base-content/65",Se="border border-transparent",w="cursor-default",G=d.isCurrentMonth?"":"opacity-25";x>0?(w="cursor-pointer",x<=2?(pe="bg-primary/15",Je="text-primary font-bold",Se="border border-primary/30"):x<=5?(pe="bg-primary/30",Je="text-primary font-bold",Se="border border-primary/50"):(pe="bg-primary/60",Je="text-primary-content font-bold",Se="border border-primary/80")):(pe="bg-base-300/25",d.isCurrentMonth&&(w="hover:bg-base-300/50")),W?Se="border-2 border-primary":ze&&(Se="border-2 border-accent");let Ke=u.getDate()===1?`<span class="absolute top-0.5 left-1 text-[8px] opacity-60 uppercase">${u.toLocaleDateString([],{month:"short"})}</span>`:"";return`
76
+ <div class="aspect-square rounded-xl flex flex-col items-center justify-center p-2 relative transition-all min-h-[50px] md:min-h-[60px] ${pe} ${Je} ${Se} ${w} ${G}"
77
77
  data-cal-date="${m}" title="${u.toDateString()}: ${x} session(s)">
78
- ${ze}
78
+ ${Ke}
79
79
  <span class="text-sm font-semibold">${u.getDate()}</span>
80
80
  ${x>0?`<span class="text-[10px] mt-0.5 opacity-80 font-medium whitespace-nowrap">${x}s</span>`:""}
81
- </div>`}).join(""),ji(e),_i(e)}function ji(e){let t=(0,n.$)("selected-day-title"),s=(0,n.$)("selected-day-sessions");if(!t||!s)return;let[a,o,i]=Wt.split("-").map(Number),r=new Date(a,o-1,i);t.textContent=`Activity on ${r.toLocaleDateString([],{weekday:"short",month:"short",day:"numeric",year:"numeric"})}`,e=An(e);let c=Ya(r,e),p=c.reduce((d,u)=>d+(Number(u.totalTokens)||0),0),l=(0,n.$)("stats-selected-tokens");if(l&&(l.textContent=Xa(p)),!c.length){s.innerHTML='<div class="text-center text-xs text-base-content/40 my-auto py-6">No sessions active on this day</div>';return}c.sort((d,u)=>(_(u.updatedAt)||0)-(_(d.updatedAt)||0)),s.innerHTML=c.map(d=>{let u=_(d.updatedAt),m=u!=null?new Date(u).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"";return`
81
+ </div>`}).join(""),Oi(e),Wi(e)}function Oi(e){let t=(0,n.$)("selected-day-title"),s=(0,n.$)("selected-day-sessions");if(!t||!s)return;let[a,o,i]=Vt.split("-").map(Number),r=new Date(a,o-1,i);t.textContent=`Activity on ${r.toLocaleDateString([],{weekday:"short",month:"short",day:"numeric",year:"numeric"})}`,e=Pn(e);let c=ao(r,e),p=c.reduce((d,u)=>d+(Number(u.totalTokens)||0),0),l=(0,n.$)("stats-selected-tokens");if(l&&(l.textContent=oo(p)),!c.length){s.innerHTML='<div class="text-center text-xs text-base-content/40 my-auto py-6">No sessions active on this day</div>';return}c.sort((d,u)=>(_(u.updatedAt)||0)-(_(d.updatedAt)||0)),s.innerHTML=c.map(d=>{let u=_(d.updatedAt),m=u!=null?new Date(u).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"";return`
82
82
  <div class="flex items-center gap-2.5 p-2.5 rounded-lg bg-base-300/40 hover:bg-base-300 border border-base-300/50 cursor-pointer text-left transition-all ${f.sessionId===d.sessionId?"border-primary bg-primary/5":""}"
83
83
  data-session-id="${(0,n.esc)(d.sessionId)}"
84
84
  data-session-cwd="${(0,n.esc)(d.cwd||"")}"
85
85
  data-session-config-dir="${(0,n.esc)(d.configDir||"")}"
86
86
  data-session-agent="${(0,n.esc)(d.agent||"claude")}"
87
87
  data-session-machine="${(0,n.esc)(d.machineId||"")}">
88
- <div class="flex-shrink-0">${Xe(d.agent)}</div>
88
+ <div class="flex-shrink-0">${et(d.agent)}</div>
89
89
  <div class="flex-1 min-w-0">
90
- <div class="text-xs font-semibold truncate text-base-content/90">${(0,n.esc)(Je(d))}</div>
91
- <div class="text-[10px] text-base-content/40 truncate mt-0.5">${(0,n.esc)(d.projectName||Qe(d.cwd)||"No workspace")}</div>
90
+ <div class="text-xs font-semibold truncate text-base-content/90">${(0,n.esc)(Ve(d))}</div>
91
+ <div class="text-[10px] text-base-content/40 truncate mt-0.5">${(0,n.esc)(d.projectName||tt(d.cwd)||"No workspace")}</div>
92
92
  </div>
93
93
  <div class="text-[9px] text-base-content/45 font-mono whitespace-nowrap bg-base-300 px-1.5 py-0.5 rounded">${m}</div>
94
- </div>`}).join("")}function Qa(e,t){return[...An(e)].filter(s=>s&&s.sessionId).sort((s,a)=>(_(a.updatedAt)||0)-(_(s.updatedAt)||0)).slice(0,t)}function _i(e){let t=(0,n.$)("recent-sessions-list");if(!t)return;let s=Qa(e,6);if(!s.length){t.innerHTML='<div class="col-span-full text-center text-xs text-base-content/40 py-4">No recent sessions</div>';return}t.innerHTML=s.map(a=>{let o=ut(a.updatedAt);return`
94
+ </div>`}).join("")}function io(e,t){return[...Pn(e)].filter(s=>s&&s.sessionId).sort((s,a)=>(_(a.updatedAt)||0)-(_(s.updatedAt)||0)).slice(0,t)}function Wi(e){let t=(0,n.$)("recent-sessions-list");if(!t)return;let s=io(e,6);if(!s.length){t.innerHTML='<div class="col-span-full text-center text-xs text-base-content/40 py-4">No recent sessions</div>';return}t.innerHTML=s.map(a=>{let o=bt(a.updatedAt);return`
95
95
  <div class="flex items-center gap-2.5 p-3 rounded-xl bg-base-200 hover:bg-base-300 border border-base-300/80 cursor-pointer text-left transition-all ${f.sessionId===a.sessionId?"border-primary bg-primary/5":""}"
96
96
  data-session-id="${(0,n.esc)(a.sessionId)}"
97
97
  data-session-cwd="${(0,n.esc)(a.cwd||"")}"
98
98
  data-session-config-dir="${(0,n.esc)(a.configDir||"")}"
99
99
  data-session-agent="${(0,n.esc)(a.agent||"claude")}"
100
100
  data-session-machine="${(0,n.esc)(a.machineId||"")}">
101
- <div class="flex-shrink-0">${Xe(a.agent)}</div>
101
+ <div class="flex-shrink-0">${et(a.agent)}</div>
102
102
  <div class="flex-1 min-w-0">
103
- <div class="text-xs font-bold truncate text-base-content/95">${(0,n.esc)(Je(a))}</div>
104
- <div class="text-[10px] text-base-content/40 truncate mt-1">${(0,n.esc)(a.projectName||Qe(a.cwd)||"No workspace")}</div>
103
+ <div class="text-xs font-bold truncate text-base-content/95">${(0,n.esc)(Ve(a))}</div>
104
+ <div class="text-[10px] text-base-content/40 truncate mt-1">${(0,n.esc)(a.projectName||tt(a.cwd)||"No workspace")}</div>
105
105
  </div>
106
106
  <div class="text-[9px] text-base-content/40 whitespace-nowrap self-start mt-0.5">${o}</div>
107
- </div>`}).join("")}function vt(){let e=(0,n.$)("recent-menu");e&&(e.classList.add("hidden"),e.classList.remove("recent-menu-open"),e.style.top="",e.style.left="",e.style.right="",e.style.width="",e.style.maxHeight=""),(0,n.$)("recent-menu-backdrop")?.classList.add("hidden")}function gs(){let e=(0,n.$)("recent-menu"),t=(0,n.$)("topbar");if(!e||!t)return;let s=t.getBoundingClientRect(),o=Math.round(s.bottom+6),i=window.matchMedia("(max-width: 640px)").matches?8:null;if(e.style.top=`${o}px`,i!=null)e.style.left=`${i}px`,e.style.right=`${i}px`;else{let p=(0,n.$)("btn-recent-sessions")?.getBoundingClientRect();if(p){let l=Math.min(320,window.innerWidth-16),d=p.left;d+l>window.innerWidth-8&&(d=window.innerWidth-l-8),d<8&&(d=8),e.style.left=`${Math.round(d)}px`,e.style.right="auto",e.style.width=`${l}px`}}let r=Math.max(160,window.innerHeight-o-12);e.style.maxHeight=`${Math.min(r,Math.round(window.innerHeight*.7))}px`}function Hi(e){let t=(0,n.$)("recent-menu");t&&(Pi(e??ve()),t.classList.remove("hidden"),t.classList.add("recent-menu-open"),gs(),(0,n.$)("recent-menu-backdrop")?.classList.remove("hidden"))}function Za(e){let t=(0,n.$)("recent-menu");t&&(t.classList.contains("hidden")?Hi(e):vt())}function Pi(e){let t=(0,n.$)("recent-menu-list"),s=(0,n.$)("recent-menu-empty"),a=(0,n.$)("recent-menu-count");if(!t)return;let o=Qa(e??ve(),Di);if(a&&(a.textContent=o.length?`${o.length}`:""),!o.length){t.innerHTML="",s?.classList.remove("hidden");return}s?.classList.add("hidden"),t.innerHTML=o.map(i=>{let r=ut(i.updatedAt),c=f.sessionId===i.sessionId&&(!i.machineId||!f.machineId||i.machineId===f.machineId),p=i.machineId?`<span class="text-[9px] font-mono text-base-content/35 truncate max-w-[4.5rem]" title="${(0,n.esc)(i.machineId)}">@${(0,n.esc)(i.machineId)}</span>`:"";return`
107
+ </div>`}).join("")}function $t(){let e=(0,n.$)("recent-menu");e&&(e.classList.add("hidden"),e.classList.remove("recent-menu-open"),e.style.top="",e.style.left="",e.style.right="",e.style.width="",e.style.maxHeight=""),(0,n.$)("recent-menu-backdrop")?.classList.add("hidden")}function ks(){let e=(0,n.$)("recent-menu"),t=(0,n.$)("topbar");if(!e||!t)return;let s=t.getBoundingClientRect(),o=Math.round(s.bottom+6),i=window.matchMedia("(max-width: 640px)").matches?8:null;if(e.style.top=`${o}px`,i!=null)e.style.left=`${i}px`,e.style.right=`${i}px`;else{let p=(0,n.$)("btn-recent-sessions")?.getBoundingClientRect();if(p){let l=Math.min(320,window.innerWidth-16),d=p.left;d+l>window.innerWidth-8&&(d=window.innerWidth-l-8),d<8&&(d=8),e.style.left=`${Math.round(d)}px`,e.style.right="auto",e.style.width=`${l}px`}}let r=Math.max(160,window.innerHeight-o-12);e.style.maxHeight=`${Math.min(r,Math.round(window.innerHeight*.7))}px`}function Gi(e){let t=(0,n.$)("recent-menu");t&&(zi(e??ye()),t.classList.remove("hidden"),t.classList.add("recent-menu-open"),ks(),(0,n.$)("recent-menu-backdrop")?.classList.remove("hidden"))}function ro(e){let t=(0,n.$)("recent-menu");t&&(t.classList.contains("hidden")?Gi(e):$t())}function zi(e){let t=(0,n.$)("recent-menu-list"),s=(0,n.$)("recent-menu-empty"),a=(0,n.$)("recent-menu-count");if(!t)return;let o=io(e??ye(),qi);if(a&&(a.textContent=o.length?`${o.length}`:""),!o.length){t.innerHTML="",s?.classList.remove("hidden");return}s?.classList.add("hidden"),t.innerHTML=o.map(i=>{let r=bt(i.updatedAt),c=f.sessionId===i.sessionId&&(!i.machineId||!f.machineId||i.machineId===f.machineId),p=i.machineId?`<span class="text-[9px] font-mono text-base-content/35 truncate max-w-[4.5rem]" title="${(0,n.esc)(i.machineId)}">@${(0,n.esc)(i.machineId)}</span>`:"";return`
108
108
  <button type="button"
109
109
  class="recent-menu-item w-full text-left px-2 py-1.5 rounded-md flex items-start gap-2
110
110
  ${c?"bg-primary/15 text-primary":"hover:bg-base-200"}"
@@ -113,17 +113,17 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
113
113
  data-session-config-dir="${(0,n.esc)(i.configDir||"")}"
114
114
  data-session-agent="${(0,n.esc)(i.agent||"claude")}"
115
115
  data-session-machine="${(0,n.esc)(i.machineId||"")}">
116
- <span class="flex-shrink-0 mt-0.5">${Xe(i.agent)}</span>
116
+ <span class="flex-shrink-0 mt-0.5">${et(i.agent)}</span>
117
117
  <span class="flex-1 min-w-0">
118
- <span class="block text-xs font-semibold truncate leading-snug">${(0,n.esc)(Je(i))}</span>
119
- <span class="block text-[10px] text-base-content/40 truncate mt-0.5">${(0,n.esc)(i.projectName||Qe(i.cwd)||"\u2014")}</span>
118
+ <span class="block text-xs font-semibold truncate leading-snug">${(0,n.esc)(Ve(i))}</span>
119
+ <span class="block text-[10px] text-base-content/40 truncate mt-0.5">${(0,n.esc)(i.projectName||tt(i.cwd)||"\u2014")}</span>
120
120
  </span>
121
121
  <span class="flex flex-col items-end gap-0.5 flex-shrink-0 self-start">
122
122
  <span class="text-[9px] text-base-content/40 whitespace-nowrap">${(0,n.esc)(r)}</span>
123
123
  ${p}
124
124
  ${c?'<span class="text-[9px] opacity-70">\u5F53\u524D</span>':""}
125
125
  </span>
126
- </button>`}).join("")}function eo(e){Wt=e}function xs(e){st+=e,st<0?(st=11,Cn--):st>11&&(st=0,Cn++)}var Cn,st,Wt,Di,vs=X(()=>{C();I();Dt();Cn=new Date().getFullYear(),st=new Date().getMonth(),Wt=null;Di=15});function to(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function Ni(){let e=parseInt(te.peek()||"14",10),t=new URLSearchParams;e>0&&t.set("days",String(e)),t.set("limit","400");let s=t.toString();return s?`/api/sessions?${s}`:"/api/sessions"}async function ye({waitFresh:e=!0}={}){let t=to(await $n());if(t.length){let a=T.peek();if(k.peek()&&a){let o=t.filter(i=>!i.machineId||i.machineId===a);E.value=o.length?o:t}else E.value=t}let s=async()=>{let a=Ni(),o=await h("GET",a,void 0,void 0,{etag:!0});if(o===ns)return E.peek();let i=to(o);return E.value=i,Aa(i),i};if(e||!t.length)try{await s()}catch(a){if(!t.length){let o=(0,n.$)("session-list");o&&(o.innerHTML=`<div class="px-3 py-3 text-xs text-error">${(0,n.esc)(a.message)}</div>`)}}else s().catch(()=>{})}async function Gt({waitFresh:e=!0}={}){let t=await ja();t&&(P.value=t);let s=async()=>{let a=await h("GET","/api/workspaces");P.value=a,Bt(a)};if(e||!t)try{await s()}catch{}else s().catch(()=>{})}function ao(e,{showProject:t=!1}={}){let s=f.sessionId===e.sessionId&&(f.agent||S.peek())===(e.agent||"claude"),a=v.peek()?.[U(e.agent,e.sessionId,e.machineId)]||{},o=!!(a.title&&String(a.title).trim()),i=e.snippet&&N.peek()?e.snippet:Je(e),r=!!a.favorite,c=!!a.hidden,p=!!(a.notes&&String(a.notes).trim()),l=Number(e.turnCount)||0,d=l>0&&l<=Qn,u=t?`<div class="text-[10px] text-base-content/40 font-mono truncate" title="${(0,n.esc)(e.cwd||"")}">${(0,n.esc)(e.projectName||Qe(e.cwd)||"\u2014")}</div>`:"",m=[d?`<span class="session-thin-badge" title="Only ${l} turn${l===1?"":"s"}">thin\xB7${l}</span>`:"",o?`<span class="session-renamed-badge" title="Custom name (original: ${(0,n.esc)(e.display||"")})">renamed</span>`:"",c?'<span class="session-hidden-badge" title="Hidden">hidden</span>':"",p?`<span class="session-note-dot" title="${(0,n.esc)(a.notes)}">\u{1F4DD}</span>`:""].filter(Boolean).join(""),b=e.machineId?`<span class="text-[9px] px-1 py-0.5 rounded bg-base-300 text-base-content/50 font-mono flex-shrink-0" title="Machine">${(0,n.esc)(e.machineId)}</span>`:"",x=o?`${i}
126
+ </button>`}).join("")}function lo(e){Vt=e}function $s(e){it+=e,it<0?(it=11,_n--):it>11&&(it=0,_n++)}var _n,it,Vt,qi,Ss=Q(()=>{C();I();Nt();_n=new Date().getFullYear(),it=new Date().getMonth(),Vt=null;qi=15});function co(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function Ji(){let e=parseInt(ne.peek()||"14",10),t=new URLSearchParams;e>0&&t.set("days",String(e)),t.set("limit","400");let s=t.toString();return s?`/api/sessions?${s}`:"/api/sessions"}async function we({waitFresh:e=!0}={}){let t=co(await Mn());if(t.length){let a=E.peek();if($.peek()&&a){let o=t.filter(i=>!i.machineId||i.machineId===a);T.value=o.length?o:t}else T.value=t}let s=async()=>{let a=Ji(),o=await h("GET",a,void 0,void 0,{etag:!0});if(o===is)return T.peek();let i=co(o);return T.value=i,Ba(i),i};if(e||!t.length)try{await s()}catch(a){if(!t.length){let o=(0,n.$)("session-list");o&&(o.innerHTML=`<div class="px-3 py-3 text-xs text-error">${(0,n.esc)(a.message)}</div>`)}}else s().catch(()=>{})}async function Yt({waitFresh:e=!0}={}){let t=await Ua();t&&(H.value=t);let s=async()=>{let a=await h("GET","/api/workspaces");H.value=a,Gt(a)};if(e||!t)try{await s()}catch{}else s().catch(()=>{})}function fo(e,{showProject:t=!1}={}){let s=f.sessionId===e.sessionId&&(f.agent||k.peek())===(e.agent||"claude"),a=v.peek()?.[B(e.agent,e.sessionId,e.machineId)]||{},o=!!(a.title&&String(a.title).trim()),i=e.snippet&&N.peek()?e.snippet:Ve(e),r=!!a.favorite,c=!!a.hidden,p=!!(a.notes&&String(a.notes).trim()),l=Number(e.turnCount)||0,d=l>0&&l<=ns,u=t?`<div class="text-[10px] text-base-content/40 font-mono truncate" title="${(0,n.esc)(e.cwd||"")}">${(0,n.esc)(e.projectName||tt(e.cwd)||"\u2014")}</div>`:"",m=[d?`<span class="session-thin-badge" title="Only ${l} turn${l===1?"":"s"}">thin\xB7${l}</span>`:"",o?`<span class="session-renamed-badge" title="Custom name (original: ${(0,n.esc)(e.display||"")})">renamed</span>`:"",c?'<span class="session-hidden-badge" title="Hidden">hidden</span>':"",p?`<span class="session-note-dot" title="${(0,n.esc)(a.notes)}">\u{1F4DD}</span>`:""].filter(Boolean).join(""),b=e.machineId?`<span class="text-[9px] px-1 py-0.5 rounded bg-base-300 text-base-content/50 font-mono flex-shrink-0" title="Machine">${(0,n.esc)(e.machineId)}</span>`:"",x=o?`${i}
127
127
  (original: ${e.display||e.sessionId})`:e.display||"";return`<div class="session-row px-2.5 py-1.5 cursor-pointer hover:bg-base-300 border-l-2
128
128
  ${s?"border-primary bg-primary/5":"border-transparent"} ${r?"session-fav":""} ${c?"session-hidden-row":""} ${d?"session-thin":""}"
129
129
  data-session-id="${(0,n.esc)(e.sessionId)}"
@@ -139,7 +139,7 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
139
139
  data-fav-session-agent="${(0,n.esc)(e.agent||"claude")}"
140
140
  data-fav-session-machine="${(0,n.esc)(e.machineId||"")}"
141
141
  title="${r?"Unfavorite":"Favorite"}">${r?"\u2605":"\u2606"}</button>
142
- ${Xe(e.agent)}
142
+ ${et(e.agent)}
143
143
  <div class="min-w-0 flex-1">
144
144
  <div class="session-title-wrap flex items-center gap-1 min-w-0"
145
145
  data-rename-session-id="${(0,n.esc)(e.sessionId)}"
@@ -161,36 +161,36 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
161
161
  ${u}
162
162
  ${m||b?`<div class="flex items-center gap-1 mt-0.5 flex-wrap">${b}${m}</div>`:""}
163
163
  </div>
164
- <span class="text-[9px] text-base-content/30 flex-shrink-0 mt-0.5">${ut(e.updatedAt)}</span>
164
+ <span class="text-[9px] text-base-content/30 flex-shrink-0 mt-0.5">${bt(e.updatedAt)}</span>
165
165
  </div>
166
- </div>`}async function zt(){try{let e=await h("GET","/api/agents");lt.value=e;let t=S.peek()||"claude",s=fe(t),a=$.peek();if(a&&!s.some(o=>o.value===a)){let o=re(t);$.value=o,localStorage.setItem("model",o)}return we(),e}catch(e){return console.warn("[agents] failed to load model list",e),null}}function ys(){let e=(0,n.$)("sel-effort");if(!e)return;let t=S.peek()||"claude",s=$.peek(),a=It(t,s),o=pe.peek()||"",i=['<option value="">effort: off</option>'].concat(a.map(r=>`<option value="${(0,n.esc)(r)}" ${r===o?"selected":""}>${(0,n.esc)(r)}</option>`));e.innerHTML=i.join(""),o&&!a.includes(o)?(pe.value="",e.value=""):e.value=o}function we(){let e=(0,n.$)("sel-model");if(!e)return;let t=S.peek()||"claude",s=fe(t),a=$.peek();if(a&&!s.some(i=>i.value===a)&&(s=[{value:a,label:`${a} \u2605`,custom:!0},...s]),e.innerHTML=s.map(i=>`<option value="${(0,n.esc)(i.value)}" ${i.value===a?"selected":""}>${(0,n.esc)(i.label)}</option>`).join(""),s.some(i=>i.value===a))e.value=a;else{let i=re(t)||s[0]?.value;$.value=i,localStorage.setItem("model",i),e.value=i,a=i}let o=(0,n.$)("sel-agent");o&&(o.value=t),ys()}function ws({editCurrent:e=!1}={}){let t=S.peek()||"claude",s=e&&$.peek()||"",a=e?`Edit model id for ${t}:`:`Add model id for ${t} (saved in this browser):`,o=window.prompt(a,s);if(o==null)return;let i=o.trim();i&&(e&&s&&s!==i&&nn(t).includes(s)&&ts(t,s),Et(t,i),$.value=i,localStorage.setItem("model",i),we())}function Ri(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
166
+ </div>`}async function Xt(){try{let e=await h("GET","/api/agents");pt.value=e;let t=k.peek()||"claude",s=me(t),a=S.peek();if(a&&!s.some(o=>o.value===a)){let o=le(t);S.value=o,localStorage.setItem("model",o)}return ke(),e}catch(e){return console.warn("[agents] failed to load model list",e),null}}function Ls(){let e=(0,n.$)("sel-effort");if(!e)return;let t=k.peek()||"claude",s=S.peek(),a=jt(t,s),o=ue.peek()||"",i=['<option value="">effort: off</option>'].concat(a.map(r=>`<option value="${(0,n.esc)(r)}" ${r===o?"selected":""}>${(0,n.esc)(r)}</option>`));e.innerHTML=i.join(""),o&&!a.includes(o)?(ue.value="",e.value=""):e.value=o}function ke(){let e=(0,n.$)("sel-model");if(!e)return;let t=k.peek()||"claude",s=me(t),a=S.peek();if(a&&!s.some(i=>i.value===a)&&(s=[{value:a,label:`${a} \u2605`,custom:!0},...s]),e.innerHTML=s.map(i=>`<option value="${(0,n.esc)(i.value)}" ${i.value===a?"selected":""}>${(0,n.esc)(i.label)}</option>`).join(""),s.some(i=>i.value===a))e.value=a;else{let i=le(t)||s[0]?.value;S.value=i,localStorage.setItem("model",i),e.value=i,a=i}let o=(0,n.$)("sel-agent");o&&(o.value=t),Ls()}function Es({editCurrent:e=!1}={}){let t=k.peek()||"claude",s=e&&S.peek()||"",a=e?`Edit model id for ${t}:`:`Add model id for ${t} (saved in this browser):`,o=window.prompt(a,s);if(o==null)return;let i=o.trim();i&&(e&&s&&s!==i&&ln(t).includes(s)&&os(t,s),At(t,i),S.value=i,localStorage.setItem("model",i),ke())}function Ki(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
167
167
  No projects in this range.<br>
168
168
  <span class="text-base-content/30">Try \u201CAll\u201D time or another agent.</span>
169
- </div>`;let t=it.value,s=rt.value,a=!!N.value.trim(),o=e[0]?.cwd||"(no path)";return e.map(i=>{let r=i.cwd||"(no path)",c=!1;s.has(r)?c=!1:t.has(r)?c=!0:c=a||r===o||e.length<=3;let p=i.latest?.display||i.latest?.snippet||"",l=i.machineId?`<span class="text-[9px] font-mono text-base-content/40 flex-shrink-0">@${(0,n.esc)(i.machineId)}</span>`:"",d=`
169
+ </div>`;let t=ct.value,s=dt.value,a=!!N.value.trim(),o=e[0]?.cwd||"(no path)";return e.map(i=>{let r=i.cwd||"(no path)",c=!1;s.has(r)?c=!1:t.has(r)?c=!0:c=a||r===o||e.length<=3;let p=i.latest?.display||i.latest?.snippet||"",l=i.machineId?`<span class="text-[9px] font-mono text-base-content/40 flex-shrink-0">@${(0,n.esc)(i.machineId)}</span>`:"",d=`
170
170
  <div class="project-header px-2.5 py-2 cursor-pointer hover:bg-base-300/80 select-none border-b border-base-300/40"
171
171
  data-folder="${(0,n.esc)(r)}" data-project-cwd="${(0,n.esc)(i.cwd||"")}" data-project-machine="${(0,n.esc)(i.machineId||"")}">
172
172
  <div class="flex items-center gap-1.5">
173
173
  <span class="text-[10px] text-base-content/40 w-3 flex-shrink-0">${c?"\u25BE":"\u25B8"}</span>
174
174
  <span class="text-[12px] font-semibold truncate flex-1" title="${(0,n.esc)(i.cwd||"")}">${(0,n.esc)(i.projectName)}</span>
175
175
  ${l}
176
- <span class="text-[9px] text-base-content/30 flex-shrink-0">${ut(i.updatedAt)}</span>
176
+ <span class="text-[9px] text-base-content/30 flex-shrink-0">${bt(i.updatedAt)}</span>
177
177
  </div>
178
178
  <div class="flex items-center gap-1.5 mt-0.5 pl-4">
179
- <span class="text-[10px] text-base-content/35 font-mono truncate flex-1" title="${(0,n.esc)(i.cwd||"")}">${(0,n.esc)(Qe(i.cwd))}</span>
180
- <span class="flex items-center gap-0.5 flex-shrink-0">${ca(i.agents)}</span>
179
+ <span class="text-[10px] text-base-content/35 font-mono truncate flex-1" title="${(0,n.esc)(i.cwd||"")}">${(0,n.esc)(tt(i.cwd))}</span>
180
+ <span class="flex items-center gap-0.5 flex-shrink-0">${ba(i.agents)}</span>
181
181
  </div>
182
182
  ${p&&!c?`<div class="pl-4 mt-0.5 text-[10px] text-base-content/45 truncate" title="${(0,n.esc)(p)}">\u21B3 ${(0,n.esc)(p)}</div>`:""}
183
- </div>`,u=i.sessions.slice(0,40),m=i.sessions.length>40?`<div class="px-3 py-1 text-[10px] text-base-content/30">+${i.sessions.length-40} more</div>`:"",b=c?`<div class="pb-1 border-b border-base-300/30">${u.map(x=>ao(x)).join("")}${m}</div>`:"";return d+b}).join("")}function Ui(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
183
+ </div>`,u=i.sessions.slice(0,40),m=i.sessions.length>40?`<div class="px-3 py-1 text-[10px] text-base-content/30">+${i.sessions.length-40} more</div>`:"",b=c?`<div class="pb-1 border-b border-base-300/30">${u.map(x=>fo(x)).join("")}${m}</div>`:"";return d+b}).join("")}function Vi(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
184
184
  No recent activity.<br>
185
185
  <span class="text-base-content/30">Widen the time range or clear filters.</span>
186
186
  </div>`;let t=new Map;for(let s of e){let o=(s.updatedAt?new Date(s.updatedAt):new Date).toLocaleDateString(void 0,{weekday:"short",month:"short",day:"numeric"});t.has(o)||t.set(o,[]),t.get(o).push(s)}return[...t.entries()].map(([s,a])=>`
187
187
  <div class="px-2.5 pt-2.5 pb-1 text-[10px] uppercase tracking-wide text-base-content/35 font-medium sticky top-0 bg-base-200/95 backdrop-blur-sm z-[1]">${(0,n.esc)(s)}</div>
188
- ${a.map(o=>ao(o,{showProject:!0})).join("")}
189
- `).join("")}function oo(){let e=Le.value,t=Array.isArray(Re.value)?Re.value:[],s=Array.isArray(Ke.value)?Ke.value:[];return e==="timeline"?Ui(t):Ri(s)}function io(){document.querySelectorAll("[data-view]").forEach(i=>{let r=i.dataset.view===Le.peek();i.classList.toggle("bg-primary/15",r),i.classList.toggle("text-primary",r),i.classList.toggle("font-medium",r),i.classList.toggle("text-base-content/50",!r)}),document.querySelectorAll("[data-agent-filter]").forEach(i=>{i.classList.toggle("active",i.dataset.agentFilter===Q.peek())});let e=(0,n.$)("time-range");e&&e.value!==te.peek()&&(e.value=te.peek());let t=(0,n.$)("search-status");if(!t)return;let s=ue.peek(),a=Array.isArray(s?.results)?s.results:null,o=(N.peek()||"").trim();if(Te.peek())t.classList.remove("hidden"),t.textContent="Searching content\u2026";else if(o&&a)t.classList.remove("hidden"),t.textContent=`${a.length} hit${a.length===1?"":"s"} \xB7 ${te.peek()==="0"?"all time":te.peek()+"d"}${s.deep===!1?"":" (incl. content)"}`;else if(o)t.classList.remove("hidden"),t.textContent="Local filter only \u2014 type to deep-search";else{let i=Re.peek(),r=Ke.peek(),c=Array.isArray(i)?i.length:0,p=Array.isArray(r)?r.length:0;t.classList.remove("hidden"),t.textContent=Le.peek()==="projects"?`${p} project${p===1?"":"s"} \xB7 ${c} session${c===1?"":"s"}`:`${c} recent session${c===1?"":"s"}`}}async function ks(e){let t=(e||"").trim();if(!t){ue.value=null,Te.value=!1;return}Te.value=!0;try{let s=new URLSearchParams({q:t,days:te.peek()||"14",limit:"50",deep:"1"});Q.peek()&&Q.peek()!=="all"&&s.set("agent",Q.peek());let a=await h("GET",`/api/activity?${s}`);N.peek().trim()===t&&(ue.value={q:t.toLowerCase(),results:a.results||[],deep:!0})}catch(s){N.peek().trim()===t&&(ue.value={q:t.toLowerCase(),results:[],error:s.message})}finally{Te.value=!1}}function jn(e){clearTimeout(no);let t=(e||"").trim();if(!t){ue.value=null,Te.value=!1;return}no=setTimeout(()=>ks(t),350)}function so(e){if(!e)return"";if(typeof marked>"u")return`<pre class="whitespace-pre-wrap text-xs">${(0,n.esc)(e)}</pre>`;try{return marked.parse(String(e),{breaks:!0,gfm:!0})}catch{return`<pre class="whitespace-pre-wrap text-xs">${(0,n.esc)(e)}</pre>`}}async function $s(){let e=(0,n.$)("memory-area");if(e){if(!f.sessionId){e.innerHTML='<div class="p-4 text-xs text-base-content/40">Open or resume a session to view its memory.</div>';return}e.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let t=new URLSearchParams({agent:f.agent||S.peek()||"claude"}),s=await h("GET",`/api/sessions/${f.sessionId}/memory?${t}`),a=[];s.index&&a.push(`<div class="mb-4"><div class="text-[11px] uppercase tracking-wide text-base-content/40 mb-1">Index (MEMORY.md)</div>
190
- <div class="md">${so(s.index)}</div></div>`);for(let o of s.files||[])a.push(`<div class="mb-3 border border-base-300 rounded-lg overflow-hidden">
188
+ ${a.map(o=>fo(o,{showProject:!0})).join("")}
189
+ `).join("")}function mo(){let e=Me.value,t=Array.isArray(Ue.value)?Ue.value:[],s=Array.isArray(Ye.value)?Ye.value:[];return e==="timeline"?Vi(t):Ki(s)}function ho(){document.querySelectorAll("[data-view]").forEach(i=>{let r=i.dataset.view===Me.peek();i.classList.toggle("bg-primary/15",r),i.classList.toggle("text-primary",r),i.classList.toggle("font-medium",r),i.classList.toggle("text-base-content/50",!r)}),document.querySelectorAll("[data-agent-filter]").forEach(i=>{i.classList.toggle("active",i.dataset.agentFilter===Z.peek())});let e=(0,n.$)("time-range");e&&e.value!==ne.peek()&&(e.value=ne.peek());let t=(0,n.$)("search-status");if(!t)return;let s=fe.peek(),a=Array.isArray(s?.results)?s.results:null,o=(N.peek()||"").trim();if(Te.peek())t.classList.remove("hidden"),t.textContent="Searching content\u2026";else if(o&&a)t.classList.remove("hidden"),t.textContent=`${a.length} hit${a.length===1?"":"s"} \xB7 ${ne.peek()==="0"?"all time":ne.peek()+"d"}${s.deep===!1?"":" (incl. content)"}`;else if(o)t.classList.remove("hidden"),t.textContent="Local filter only \u2014 type to deep-search";else{let i=Ue.peek(),r=Ye.peek(),c=Array.isArray(i)?i.length:0,p=Array.isArray(r)?r.length:0;t.classList.remove("hidden"),t.textContent=Me.peek()==="projects"?`${p} project${p===1?"":"s"} \xB7 ${c} session${c===1?"":"s"}`:`${c} recent session${c===1?"":"s"}`}}async function Ms(e){let t=(e||"").trim();if(!t){fe.value=null,Te.value=!1;return}Te.value=!0;try{let s=new URLSearchParams({q:t,days:ne.peek()||"14",limit:"50",deep:"1"});Z.peek()&&Z.peek()!=="all"&&s.set("agent",Z.peek());let a=await h("GET",`/api/activity?${s}`);N.peek().trim()===t&&(fe.value={q:t.toLowerCase(),results:a.results||[],deep:!0})}catch(s){N.peek().trim()===t&&(fe.value={q:t.toLowerCase(),results:[],error:s.message})}finally{Te.value=!1}}function Hn(e){clearTimeout(po);let t=(e||"").trim();if(!t){fe.value=null,Te.value=!1;return}po=setTimeout(()=>Ms(t),350)}function uo(e){if(!e)return"";if(typeof marked>"u")return`<pre class="whitespace-pre-wrap text-xs">${(0,n.esc)(e)}</pre>`;try{return marked.parse(String(e),{breaks:!0,gfm:!0})}catch{return`<pre class="whitespace-pre-wrap text-xs">${(0,n.esc)(e)}</pre>`}}async function Ts(){let e=(0,n.$)("memory-area");if(e){if(!f.sessionId){e.innerHTML='<div class="p-4 text-xs text-base-content/40">Open or resume a session to view its memory.</div>';return}e.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let t=new URLSearchParams({agent:f.agent||k.peek()||"claude"}),s=await h("GET",`/api/sessions/${f.sessionId}/memory?${t}`),a=[];s.index&&a.push(`<div class="mb-4"><div class="text-[11px] uppercase tracking-wide text-base-content/40 mb-1">Index (MEMORY.md)</div>
190
+ <div class="md">${uo(s.index)}</div></div>`);for(let o of s.files||[])a.push(`<div class="mb-3 border border-base-300 rounded-lg overflow-hidden">
191
191
  <div class="px-3 py-1.5 bg-base-300/50 text-xs font-mono text-base-content/70">${(0,n.esc)(o.name)}</div>
192
- <div class="px-3 py-2 md">${so(o.content)}</div>
193
- </div>`);a.length||a.push('<div class="text-base-content/40 text-xs">No memory saved for this project yet.</div>'),e.innerHTML=`<div class="p-4">${a.join("")}</div>`}catch(t){e.innerHTML=`<div class="p-4 text-error text-xs">${(0,n.esc)(t?.message??String(t))}</div>`}}}var no,yt=X(()=>{C();I();K();Sn();Dt();no=null});function ro(e,t){Dn=e||"",_n=t||""}async function lo(e){let t=(0,n.$)("project-notes-bar");if(t)try{let s=await h("GET",`/api/projects/notes?root=${encodeURIComponent(e)}`);Dn=s.goal||"",_n=s.notes||"",wt(),t.style.display="flex"}catch(s){console.error("Error fetching project notes:",s),t.style.display="none"}}function wt(){let e=(0,n.$)("project-notes-bar");if(!e)return;let t=Dn||"No goal yet \u2014 click Edit",s=_n||"";e.innerHTML=`
192
+ <div class="px-3 py-2 md">${uo(o.content)}</div>
193
+ </div>`);a.length||a.push('<div class="text-base-content/40 text-xs">No memory saved for this project yet.</div>'),e.innerHTML=`<div class="p-4">${a.join("")}</div>`}catch(t){e.innerHTML=`<div class="p-4 text-error text-xs">${(0,n.esc)(t?.message??String(t))}</div>`}}}var po,St=Q(()=>{C();I();K();Tn();Nt();po=null});function bo(e,t){Nn=e||"",Rn=t||""}async function go(e){let t=(0,n.$)("project-notes-bar");if(t)try{let s=await h("GET",`/api/projects/notes?root=${encodeURIComponent(e)}`);Nn=s.goal||"",Rn=s.notes||"",Lt(),t.style.display="flex"}catch(s){console.error("Error fetching project notes:",s),t.style.display="none"}}function Lt(){let e=(0,n.$)("project-notes-bar");if(!e)return;let t=Nn||"No goal yet \u2014 click Edit",s=Rn||"";e.innerHTML=`
194
194
  <div class="flex items-start gap-2 w-full">
195
195
  <div class="flex-1 min-w-0">
196
196
  <div class="truncate">
@@ -201,24 +201,24 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
201
201
  </div>
202
202
  <button id="btn-edit-project-notes" class="btn btn-ghost btn-xs px-1.5 hover:bg-base-300 flex-shrink-0">Edit</button>
203
203
  </div>
204
- `}function co(){let e=(0,n.$)("project-notes-bar");e&&(e.innerHTML=`
204
+ `}function xo(){let e=(0,n.$)("project-notes-bar");e&&(e.innerHTML=`
205
205
  <div class="flex flex-col gap-1.5 w-full">
206
206
  <div class="flex items-center gap-2">
207
207
  <span class="text-[10px] font-bold text-base-content/40 uppercase w-12 flex-shrink-0">Goal</span>
208
208
  <input id="project-goal-input" type="text" class="input input-xs input-bordered flex-1 text-xs"
209
- placeholder="One-line project goal\u2026" value="${(0,n.esc)(Dn)}">
209
+ placeholder="One-line project goal\u2026" value="${(0,n.esc)(Nn)}">
210
210
  </div>
211
211
  <div class="flex items-start gap-2">
212
212
  <span class="text-[10px] font-bold text-base-content/40 uppercase w-12 flex-shrink-0 mt-1">Notes</span>
213
213
  <textarea id="project-notes-input" rows="2" class="textarea textarea-xs textarea-bordered flex-1 text-xs leading-snug"
214
- placeholder="Longer project notes (stack, links, status\u2026)">${(0,n.esc)(_n)}</textarea>
214
+ placeholder="Longer project notes (stack, links, status\u2026)">${(0,n.esc)(Rn)}</textarea>
215
215
  </div>
216
216
  <div class="flex items-center gap-1 justify-end">
217
217
  <button id="btn-save-project-notes" class="btn btn-primary btn-xs px-2">Save</button>
218
218
  <button id="btn-cancel-project-notes" class="btn btn-ghost btn-xs px-2">Cancel</button>
219
219
  </div>
220
220
  </div>
221
- `,(0,n.$)("project-goal-input")?.focus())}async function Jt(){try{let e=await h("GET","/api/sessions/meta");v.value=e||{}}catch(e){console.warn("session meta load failed",e)}}function ce(){let e=(0,n.$)("session-notes-bar");if(!e)return;let t=f.sessionId,s=f.agent||S.peek()||"claude";if(!t){e.style.display="none",e.innerHTML="";return}if(e.querySelector(".session-rename-input"))return;let a=ct(s,t),o=(a.notes||"").trim(),i=!!a.favorite,r=!!a.hidden,p=(a.title||"").trim()||t.slice(0,8);e.style.display="flex",e.innerHTML=`
221
+ `,(0,n.$)("project-goal-input")?.focus())}async function Qt(){try{let e=await h("GET","/api/sessions/meta");v.value=e||{}}catch(e){console.warn("session meta load failed",e)}}function de(){let e=(0,n.$)("session-notes-bar");if(!e)return;let t=f.sessionId,s=f.agent||k.peek()||"claude";if(!t){e.style.display="none",e.innerHTML="";return}if(e.querySelector(".session-rename-input"))return;let a=ut(s,t),o=(a.notes||"").trim(),i=!!a.favorite,r=!!a.hidden,p=(a.title||"").trim()||t.slice(0,8);e.style.display="flex",e.innerHTML=`
222
222
  <div class="flex-1 min-w-0 flex items-center gap-2">
223
223
  <button type="button" class="session-fav-btn ${i?"is-fav":""}" data-fav-toggle="1"
224
224
  data-fav-session-id="${(0,n.esc)(t)}" data-fav-session-agent="${(0,n.esc)(s)}"
@@ -238,12 +238,12 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
238
238
  id="session-notes-text" title="${(0,n.esc)(o||"Add a note for this session")}">${(0,n.esc)(o||"No session note")}</span>
239
239
  </div>
240
240
  <button id="btn-edit-session-notes" class="btn btn-ghost btn-xs px-1.5">Note</button>
241
- `}function po(){let e=(0,n.$)("session-notes-bar");if(!e||!f.sessionId)return;let t=f.agent||S.peek()||"claude",s=ct(t,f.sessionId);e.innerHTML=`
241
+ `}function vo(){let e=(0,n.$)("session-notes-bar");if(!e||!f.sessionId)return;let t=f.agent||k.peek()||"claude",s=ut(t,f.sessionId);e.innerHTML=`
242
242
  <input id="session-notes-input" type="text" class="input input-xs input-bordered flex-1 text-xs"
243
243
  placeholder="Note for this session\u2026" value="${(0,n.esc)(s.notes||"")}">
244
244
  <button id="btn-save-session-notes" class="btn btn-primary btn-xs px-2">Save</button>
245
245
  <button id="btn-cancel-session-notes" class="btn btn-ghost btn-xs px-2">Cancel</button>
246
- `;let a=(0,n.$)("session-notes-input");a?.focus(),a?.select()}function Hn(){return{favorite:!1,notes:"",title:"",hidden:!1}}function Pn(e,t){return{favorite:t.favorite!==void 0?!!t.favorite:!!e.favorite,notes:t.notes!==void 0?String(t.notes||""):String(e.notes||""),title:t.title!==void 0?String(t.title||"").trim():String(e.title||"").trim(),hidden:t.hidden!==void 0?!!t.hidden:!!e.hidden,updatedAt:Date.now()}}function uo(e){return!e?.favorite&&!e?.hidden&&!(e?.notes||"").trim()&&!(e?.title||"").trim()}async function fo(e,t,{machineId:s}={}){let a=s||f.machineId||null,o=U(t,e,a),i=v.peek()?.[o]||Hn(),r=!i.favorite;v.value={...v.peek(),[o]:{...i,favorite:r,updatedAt:Date.now()}};try{let c=await h("PUT","/api/sessions/meta",{sessionId:e,agent:t,favorite:r,machineId:a||void 0},void 0,{machineId:a||void 0});v.value={...v.peek(),[o]:Pn(i,{favorite:c.favorite??r,notes:c.notes,title:c.title,hidden:c.hidden})}}catch(c){v.value={...v.peek(),[o]:i},alert(`Favorite failed: ${c.message}`)}f.sessionId===e&&ce()}async function mo(e,t,{machineId:s}={}){if(!e)return!1;let a=s||f.machineId||null,o=U(t,e,a),i=v.peek()?.[o]||Hn(),r=!i.hidden;v.value={...v.peek(),[o]:{...i,hidden:r,updatedAt:Date.now()}};try{let c=await h("PUT","/api/sessions/meta",{sessionId:e,agent:t,hidden:r,machineId:a||void 0},void 0,{machineId:a||void 0}),p=Pn(i,{favorite:c.favorite,notes:c.notes,title:c.title,hidden:c.hidden??r});if(uo(p)){let l={...v.peek()};delete l[o],v.value=l}else v.value={...v.peek(),[o]:p}}catch(c){return v.value={...v.peek(),[o]:i},alert(`Hide failed: ${c.message}`),!1}return f.sessionId===e&&ce(),!0}async function Ss(e,t,s,{machineId:a}={}){let o=a||f.machineId||null,i=U(t,e,o),r=v.peek()?.[i]||Hn();try{let c=await h("PUT","/api/sessions/meta",{sessionId:e,agent:t,notes:s,machineId:o||void 0},void 0,{machineId:o||void 0});v.value={...v.peek(),[i]:Pn(r,{favorite:c.favorite,notes:c.notes??s,title:c.title,hidden:c.hidden})}}catch(c){return alert(`Save note failed: ${c.message}`),!1}return!0}async function Bi(e,t,s,{machineId:a}={}){if(!e)return!1;let o=a||f.machineId||null,i=U(t,e,o),r=v.peek()?.[i]||Hn(),c=String(s||"").trim().slice(0,200);v.value={...v.peek(),[i]:{...r,title:c,updatedAt:Date.now()}};try{let p=await h("PUT","/api/sessions/meta",{sessionId:e,agent:t,title:c,machineId:o||void 0},void 0,{machineId:o||void 0}),l=Pn(r,{favorite:p.favorite,notes:p.notes,title:p.title!==void 0?p.title:c,hidden:p.hidden});if(uo(l)){let d={...v.peek()};delete d[i],v.value=d}else v.value={...v.peek(),[i]:l}}catch(p){return v.value={...v.peek(),[i]:r},alert(`Rename failed: ${p.message}`),!1}return f.sessionId===e&&ce(),!0}function Ls({sessionId:e,agent:t="claude",machineId:s=null,fallbackDisplay:a="",mountEl:o}={}){if(!e||!o)return;document.querySelectorAll(".session-rename-input").forEach(m=>{m.dispatchEvent(new CustomEvent("session-rename-cancel",{bubbles:!0}))});let r=(ct(t,e,s).title||"").trim()||a||e.slice(0,8),c=o.innerHTML,p=o.className;o.classList.add("session-rename-active"),o.innerHTML=`<input type="text" class="session-rename-input input input-xs input-bordered w-full min-w-0 text-xs font-mono"
246
+ `;let a=(0,n.$)("session-notes-input");a?.focus(),a?.select()}function Bn(){return{favorite:!1,notes:"",title:"",hidden:!1}}function Un(e,t){return{favorite:t.favorite!==void 0?!!t.favorite:!!e.favorite,notes:t.notes!==void 0?String(t.notes||""):String(e.notes||""),title:t.title!==void 0?String(t.title||"").trim():String(e.title||"").trim(),hidden:t.hidden!==void 0?!!t.hidden:!!e.hidden,updatedAt:Date.now()}}function yo(e){return!e?.favorite&&!e?.hidden&&!(e?.notes||"").trim()&&!(e?.title||"").trim()}async function wo(e,t,{machineId:s}={}){let a=s||f.machineId||null,o=B(t,e,a),i=v.peek()?.[o]||Bn(),r=!i.favorite;v.value={...v.peek(),[o]:{...i,favorite:r,updatedAt:Date.now()}};try{let c=await h("PUT","/api/sessions/meta",{sessionId:e,agent:t,favorite:r,machineId:a||void 0},void 0,{machineId:a||void 0});v.value={...v.peek(),[o]:Un(i,{favorite:c.favorite??r,notes:c.notes,title:c.title,hidden:c.hidden})}}catch(c){v.value={...v.peek(),[o]:i},alert(`Favorite failed: ${c.message}`)}f.sessionId===e&&de()}async function ko(e,t,{machineId:s}={}){if(!e)return!1;let a=s||f.machineId||null,o=B(t,e,a),i=v.peek()?.[o]||Bn(),r=!i.hidden;v.value={...v.peek(),[o]:{...i,hidden:r,updatedAt:Date.now()}};try{let c=await h("PUT","/api/sessions/meta",{sessionId:e,agent:t,hidden:r,machineId:a||void 0},void 0,{machineId:a||void 0}),p=Un(i,{favorite:c.favorite,notes:c.notes,title:c.title,hidden:c.hidden??r});if(yo(p)){let l={...v.peek()};delete l[o],v.value=l}else v.value={...v.peek(),[o]:p}}catch(c){return v.value={...v.peek(),[o]:i},alert(`Hide failed: ${c.message}`),!1}return f.sessionId===e&&de(),!0}async function Is(e,t,s,{machineId:a}={}){let o=a||f.machineId||null,i=B(t,e,o),r=v.peek()?.[i]||Bn();try{let c=await h("PUT","/api/sessions/meta",{sessionId:e,agent:t,notes:s,machineId:o||void 0},void 0,{machineId:o||void 0});v.value={...v.peek(),[i]:Un(r,{favorite:c.favorite,notes:c.notes??s,title:c.title,hidden:c.hidden})}}catch(c){return alert(`Save note failed: ${c.message}`),!1}return!0}async function Yi(e,t,s,{machineId:a}={}){if(!e)return!1;let o=a||f.machineId||null,i=B(t,e,o),r=v.peek()?.[i]||Bn(),c=String(s||"").trim().slice(0,200);v.value={...v.peek(),[i]:{...r,title:c,updatedAt:Date.now()}};try{let p=await h("PUT","/api/sessions/meta",{sessionId:e,agent:t,title:c,machineId:o||void 0},void 0,{machineId:o||void 0}),l=Un(r,{favorite:p.favorite,notes:p.notes,title:p.title!==void 0?p.title:c,hidden:p.hidden});if(yo(l)){let d={...v.peek()};delete d[i],v.value=d}else v.value={...v.peek(),[i]:l}}catch(p){return v.value={...v.peek(),[i]:r},alert(`Rename failed: ${p.message}`),!1}return f.sessionId===e&&de(),!0}function Cs({sessionId:e,agent:t="claude",machineId:s=null,fallbackDisplay:a="",mountEl:o}={}){if(!e||!o)return;document.querySelectorAll(".session-rename-input").forEach(m=>{m.dispatchEvent(new CustomEvent("session-rename-cancel",{bubbles:!0}))});let r=(ut(t,e,s).title||"").trim()||a||e.slice(0,8),c=o.innerHTML,p=o.className;o.classList.add("session-rename-active"),o.innerHTML=`<input type="text" class="session-rename-input input input-xs input-bordered w-full min-w-0 text-xs font-mono"
247
247
  value="${(0,n.esc)(r)}"
248
248
  placeholder="Session name (empty = original)"
249
249
  maxlength="200"
@@ -251,8 +251,8 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
251
251
  data-rename-session-id="${(0,n.esc)(e)}"
252
252
  data-rename-session-agent="${(0,n.esc)(t)}"
253
253
  data-rename-session-machine="${(0,n.esc)(s||"")}"
254
- autocomplete="off" spellcheck="false" />`;let l=o.querySelector(".session-rename-input");if(!l)return;let d=!1,u=async m=>{if(d)return;d=!0;let b=m?l.value:r;if(o.className=p,!m){o.innerHTML=c;return}await Bi(e,t,b,{machineId:s}),document.querySelectorAll(".session-rename-input").forEach(x=>x.remove()),f.sessionId===e&&ce(),v.value={...v.peek()}};l.addEventListener("keydown",m=>{m.stopPropagation(),m.key==="Enter"?(m.preventDefault(),u(!0)):m.key==="Escape"&&(m.preventDefault(),u(!1))}),l.addEventListener("click",m=>m.stopPropagation()),l.addEventListener("mousedown",m=>m.stopPropagation()),l.addEventListener("session-rename-cancel",()=>u(!1)),l.addEventListener("blur",()=>{setTimeout(()=>u(!0),0)}),requestAnimationFrame(()=>{l.focus(),l.select()})}var Dn,_n,Kt=X(()=>{C();I();K();Dn="",_n=""});var bo={};Ws(bo,{goHome:()=>Un,openProject:()=>Ts,resumeSession:()=>ke,switchTab:()=>He});function Rn(e){for(let t of["files-machine-hint","git-machine-hint"]){let s=(0,n.$)(t);s&&(e?(s.textContent=`@${e}`,s.classList.remove("hidden"),s.title=`Paths are on machine ${e}`):(s.textContent="",s.classList.add("hidden"),s.title=""))}}function Ts(e){let t=e?.path||"";(0,n.batch)(()=>{y.value=e,B.value=t,t&&(O.value=t,J.value=t,A.value="",F.value=null)}),f.sessionId=null,(0,n.$)("topbar-project").textContent=t||"Project";let s=(0,n.$)("files-root-input");s&&t&&(s.value=t);let a=(0,n.$)("git-root-input");a&&t&&(a.value=t),Rn(e?.machineId||T.peek()||f.machineId),(0,n.$)("welcome").classList.add("hidden");let o=(0,n.$)("project-view");o.classList.remove("hidden"),o.style.display="flex",mt(),je(),He("chat")}function Un(){y.value=null,B.value=null,O.value="",J.value="",A.value="",F.value=null,f.sessionId=null,Rn(null),document.documentElement.classList.remove("boot-restore");let e=(0,n.$)("topbar-project");e&&(e.textContent="Select a session");let t=(0,n.$)("welcome");t&&(t.classList.remove("hidden"),t.style.display="",at(ve()));let s=(0,n.$)("project-view");s&&(s.classList.add("hidden"),s.style.display="none"),vn("/")}async function ke(e,t,s,a,o,i={}){let r=i.tab&&["chat","files","git","shell","memory"].includes(i.tab)?i.tab:"chat",c=i.skipHistory??(r!=="chat"&&r!=="memory"),p=E.peek().find(w=>w.sessionId===e&&(!o||w.machineId===o||!w.machineId)),l=Ve(),d=l?.sessionId===e?l:null,u=a||p?.agent||d?.agent||"claude",m=o||p?.machineId||d?.machineId||T.peek()||null,b=t||p?.cwd||d?.cwd||null,x=s||p?.configDir||d?.configDir||null;if(m&&m!==f.machineId){Z(m);try{f.ws?.close()}catch{}f.ws=null}f.sessionId=e,f.configDir=x,f.agent=u,me(u),we();let W=b;ho(W,m,e),je(),W&&h("POST","/api/resolve-path",{path:W},void 0,{machineId:m||void 0}).then(w=>{f.sessionId!==e||!w?.path||w.path===W||(W=w.path,ho(W,m,e),ss({sessionId:e,cwd:W}))}).catch(()=>{}),mt(),He(r);{let w=E.peek();E.value=Array.isArray(w)?[...w]:[]}ss({sessionId:e,cwd:W||b,configDir:x,agent:u,machineId:m,tab:r});let We=R[u]||u,de=`${m||""}:${u}:${e}`,Ge=(w,G,ze={})=>{if(f.sessionId!==e)return;if((0,n.$)("messages").innerHTML="",!w.length){g(`${We} \xB7 ${e.slice(0,8)}\u2026 \u2014 no history`);return}le();let z=40,oe=0,St=()=>{if(f.sessionId!==e)return;let tn=Math.min(oe+z,w.length);for(;oe<tn;oe++){let L=w[oe],Bs=_(L.ts??L.timestamp),Kn=L.type||(L.role?"text":null);if(Kn==="text"||L.role&&L.content!=null&&!L.name){(L.role==="assistant"||L.role==="user")&&le();let Fs=typeof L.content=="string"?L.content:Array.isArray(L.content)?L.content.map(Ro=>Ro?.text||"").filter(Boolean).join(`
255
- `):String(L.content??"");Fs&&et(L.role==="user"?"user":"assistant",L.role==="user"?"You":We,Fs,{ts:Bs})}else Kn==="tool_use"||L.name?ls({name:L.name||"tool",input:L.input??L.arguments??{}},{ts:Bs}):(Kn==="token_usage"||L.usage)&&(le(),ft(L.usage||L))}if(oe<w.length){requestAnimationFrame(St);return}le(),G&&rs(G);let Lt=w.filter(L=>L.type==="token_usage").length||w.filter(L=>L.role==="user").length,Tt=ze.truncated?` (showing last ${w.length} of ${ze.total||"?"})`:"";g(`\u2500\u2500 ${We} history \xB7 ${Lt} turn${Lt!==1?"s":""}${Tt} \u2500\u2500`)};St()},$e=async()=>{let w=Nn.get(de);if(w&&w.msgs?.length&&Date.now()-w.at<Fi){Ge(w.msgs,w.context,w.meta);return}g(`Loading ${We} history\u2026`);try{let G=m||T.peek()||f.machineId||null;if(k.peek()&&!G)throw new Error("\u672A\u9009\u62E9\u673A\u5668\uFF0C\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2");G&&f.machineId!==G&&Z(G);let ze=async Lt=>{let Tt=new URLSearchParams({tail:"0",compact:"1"});return Lt&&Tt.set("agent",Lt),G&&Tt.set("machine",G),h("GET",`/api/sessions/${e}/messages?${Tt}`,void 0,void 0,{machineId:G||void 0,dedupe:!1})},z=await ze(u),oe=Array.isArray(z)?z:z?.messages||[];!oe.length&&u&&(z=await ze(null),oe=Array.isArray(z)?z:z?.messages||[]);let St=Array.isArray(z)?null:z?.context||null,tn=Array.isArray(z)?{}:{truncated:z?.truncated,total:z?.total};oe.length?Nn.set(de,{msgs:oe,context:St,meta:tn,at:Date.now()}):Nn.delete(de),Ge(oe,St,tn)}catch(G){if(f.sessionId!==e)return;Nn.delete(de),(0,n.$)("messages").innerHTML="",g(`${We} \xB7 ${e.slice(0,8)}\u2026 (history unavailable: ${G.message})`)}};c?$e().catch(()=>{}):(await new Promise(w=>requestAnimationFrame(w)),$e().catch(()=>{})),yn(),ce()}function ho(e,t,s){if(e){let a=e.split("/").filter(Boolean).pop()||e;(0,n.batch)(()=>{y.value={id:a,name:a,path:e,machineId:t},B.value=e,O.value=e,J.value=e,A.value="",F.value=null}),(0,n.$)("topbar-project").textContent=t?`${e} @${t}`:e;let o=(0,n.$)("files-root-input");o&&(o.value=e);let i=(0,n.$)("git-root-input");i&&(i.value=e),Rn(t),(0,n.$)("welcome")?.classList.add("hidden");let r=(0,n.$)("project-view");r&&(r.classList.remove("hidden"),r.style.display="flex",r.style.flexDirection="column",r.style.flex="1",r.style.minHeight="0",r.style.overflow="hidden")}else{(0,n.$)("welcome")?.classList.add("hidden");let a=(0,n.$)("project-view");a&&(a.classList.remove("hidden"),a.style.display="flex",a.style.flexDirection="column",a.style.flex="1",a.style.minHeight="0"),Rn(t)}}function He(e){j.value=e}var Nn,Fi,Vt=X(()=>{C();I();K();an();ht();wn();yt();Kt();vs();Nn=new Map,Fi=180*1e3});I();K();C();I();K();var pt=null;function ea(){return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone===!0||document.referrer.includes("android-app://")}function ta(){document.getElementById("btn-pwa-install")?.classList.remove("hidden")}function na(){ea()&&document.documentElement.classList.add("pwa-standalone"),window.addEventListener("beforeinstallprompt",s=>{s.preventDefault(),pt=s,document.dispatchEvent(new CustomEvent("pwa-installable")),ta()}),window.addEventListener("appinstalled",()=>{pt=null,document.getElementById("btn-pwa-install")?.classList.add("hidden")});let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1;if(!ea()&&(e||/Android/i.test(navigator.userAgent))&&requestAnimationFrame(()=>ta()),!("serviceWorker"in navigator))return;let t=()=>{navigator.serviceWorker.register("/sw.js",{scope:"/"}).then(s=>{s.addEventListener("updatefound",()=>{let a=s.installing;a&&a.addEventListener("statechange",()=>{a.state==="installed"&&navigator.serviceWorker.controller&&console.info("[pwa] New version ready \u2014 reload to apply")})})}).catch(s=>console.warn("[pwa] SW register failed",s))};document.readyState==="complete"?setTimeout(t,0):window.addEventListener("load",()=>setTimeout(t,0))}async function sa(){if(!pt)return!1;pt.prompt();let e=await pt.userChoice.catch(()=>null);return pt=null,document.getElementById("btn-pwa-install")?.classList.add("hidden"),e?.outcome==="accepted"}an();ht();wn();C();K();I();Sn();function Da(){document.getElementById("root").insertAdjacentHTML("beforeend",`
254
+ autocomplete="off" spellcheck="false" />`;let l=o.querySelector(".session-rename-input");if(!l)return;let d=!1,u=async m=>{if(d)return;d=!0;let b=m?l.value:r;if(o.className=p,!m){o.innerHTML=c;return}await Yi(e,t,b,{machineId:s}),document.querySelectorAll(".session-rename-input").forEach(x=>x.remove()),f.sessionId===e&&de(),v.value={...v.peek()}};l.addEventListener("keydown",m=>{m.stopPropagation(),m.key==="Enter"?(m.preventDefault(),u(!0)):m.key==="Escape"&&(m.preventDefault(),u(!1))}),l.addEventListener("click",m=>m.stopPropagation()),l.addEventListener("mousedown",m=>m.stopPropagation()),l.addEventListener("session-rename-cancel",()=>u(!1)),l.addEventListener("blur",()=>{setTimeout(()=>u(!0),0)}),requestAnimationFrame(()=>{l.focus(),l.select()})}var Nn,Rn,Zt=Q(()=>{C();I();K();Nn="",Rn=""});var So={};Ys(So,{goHome:()=>qn,openProject:()=>As,resumeSession:()=>$e,switchTab:()=>Ne});function On(e){for(let t of["files-machine-hint","git-machine-hint"]){let s=(0,n.$)(t);s&&(e?(s.textContent=`@${e}`,s.classList.remove("hidden"),s.title=`Paths are on machine ${e}`):(s.textContent="",s.classList.add("hidden"),s.title=""))}}function As(e){let t=e?.path||"";(0,n.batch)(()=>{y.value=e,U.value=t,t&&(O.value=t,J.value=t,A.value="",F.value=null)}),f.sessionId=null,(0,n.$)("topbar-project").textContent=t||"Project";let s=(0,n.$)("files-root-input");s&&t&&(s.value=t);let a=(0,n.$)("git-root-input");a&&t&&(a.value=t),On(e?.machineId||E.peek()||f.machineId),(0,n.$)("welcome").classList.add("hidden");let o=(0,n.$)("project-view");o.classList.remove("hidden"),o.style.display="flex",xt(),_e(),Ne("chat")}function qn(){y.value=null,U.value=null,O.value="",J.value="",A.value="",F.value=null,f.sessionId=null,On(null),document.documentElement.classList.remove("boot-restore");let e=(0,n.$)("topbar-project");e&&(e.textContent="Select a session");let t=(0,n.$)("welcome");t&&(t.classList.remove("hidden"),t.style.display="",rt(ye()));let s=(0,n.$)("project-view");s&&(s.classList.add("hidden"),s.style.display="none"),$n("/")}async function $e(e,t,s,a,o,i={}){let r=i.tab&&["chat","files","git","shell","memory"].includes(i.tab)?i.tab:"chat",c=i.skipHistory??(r!=="chat"&&r!=="memory"),p=T.peek().find(w=>w.sessionId===e&&(!o||w.machineId===o||!w.machineId)),l=Qe(),d=l?.sessionId===e?l:null,u=a||p?.agent||d?.agent||"claude",m=o||p?.machineId||d?.machineId||E.peek()||null,b=t||p?.cwd||d?.cwd||null,x=s||p?.configDir||d?.configDir||null;if(m&&m!==f.machineId){ee(m);try{f.ws?.close()}catch{}f.ws=null}f.sessionId=e,f.configDir=x,f.agent=u,he(u),ke();let W=b;$o(W,m,e),_e(),W&&h("POST","/api/resolve-path",{path:W},void 0,{machineId:m||void 0}).then(w=>{f.sessionId!==e||!w?.path||w.path===W||(W=w.path,$o(W,m,e),rs({sessionId:e,cwd:W}))}).catch(()=>{}),xt(),Ne(r);{let w=T.peek();T.value=Array.isArray(w)?[...w]:[]}rs({sessionId:e,cwd:W||b,configDir:x,agent:u,machineId:m,tab:r});let ze=R[u]||u,pe=`${m||""}:${u}:${e}`,Je=(w,G,Ke={})=>{if(f.sessionId!==e)return;if((0,n.$)("messages").innerHTML="",!w.length){g(`${ze} \xB7 ${e.slice(0,8)}\u2026 \u2014 no history`);return}ce();let z=40,ie=0,Tt=()=>{if(f.sessionId!==e)return;let rn=Math.min(ie+z,w.length);for(;ie<rn;ie++){let L=w[ie],zs=_(L.ts??L.timestamp),Qn=L.type||(L.role?"text":null);if(Qn==="text"||L.role&&L.content!=null&&!L.name){(L.role==="assistant"||L.role==="user")&&ce();let Js=typeof L.content=="string"?L.content:Array.isArray(L.content)?L.content.map(Go=>Go?.text||"").filter(Boolean).join(`
255
+ `):String(L.content??"");Js&&st(L.role==="user"?"user":"assistant",L.role==="user"?"You":ze,Js,{ts:zs})}else Qn==="tool_use"||L.name?fs({name:L.name||"tool",input:L.input??L.arguments??{}},{ts:zs}):(Qn==="token_usage"||L.usage)&&(ce(),gt(L.usage||L))}if(ie<w.length){requestAnimationFrame(Tt);return}ce(),G&&us(G);let It=w.filter(L=>L.type==="token_usage").length||w.filter(L=>L.role==="user").length,Ct=Ke.truncated?` (showing last ${w.length} of ${Ke.total||"?"})`:"";g(`\u2500\u2500 ${ze} history \xB7 ${It} turn${It!==1?"s":""}${Ct} \u2500\u2500`)};Tt()},Se=async()=>{let w=Fn.get(pe);if(w&&w.msgs?.length&&Date.now()-w.at<Xi){Je(w.msgs,w.context,w.meta);return}g(`Loading ${ze} history\u2026`);try{let G=m||E.peek()||f.machineId||null;if($.peek()&&!G)throw new Error("\u672A\u9009\u62E9\u673A\u5668\uFF0C\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2");G&&f.machineId!==G&&ee(G);let Ke=async It=>{let Ct=new URLSearchParams({tail:"0",compact:"1"});return It&&Ct.set("agent",It),G&&Ct.set("machine",G),h("GET",`/api/sessions/${e}/messages?${Ct}`,void 0,void 0,{machineId:G||void 0,dedupe:!1})},z=await Ke(u),ie=Array.isArray(z)?z:z?.messages||[];!ie.length&&u&&(z=await Ke(null),ie=Array.isArray(z)?z:z?.messages||[]);let Tt=Array.isArray(z)?null:z?.context||null,rn=Array.isArray(z)?{}:{truncated:z?.truncated,total:z?.total};ie.length?Fn.set(pe,{msgs:ie,context:Tt,meta:rn,at:Date.now()}):Fn.delete(pe),Je(ie,Tt,rn)}catch(G){if(f.sessionId!==e)return;Fn.delete(pe),(0,n.$)("messages").innerHTML="",g(`${ze} \xB7 ${e.slice(0,8)}\u2026 (history unavailable: ${G.message})`)}};c?Se().catch(()=>{}):(await new Promise(w=>requestAnimationFrame(w)),Se().catch(()=>{})),Sn(),de()}function $o(e,t,s){if(e){let a=e.split("/").filter(Boolean).pop()||e;(0,n.batch)(()=>{y.value={id:a,name:a,path:e,machineId:t},U.value=e,O.value=e,J.value=e,A.value="",F.value=null}),(0,n.$)("topbar-project").textContent=t?`${e} @${t}`:e;let o=(0,n.$)("files-root-input");o&&(o.value=e);let i=(0,n.$)("git-root-input");i&&(i.value=e),On(t),(0,n.$)("welcome")?.classList.add("hidden");let r=(0,n.$)("project-view");r&&(r.classList.remove("hidden"),r.style.display="flex",r.style.flexDirection="column",r.style.flex="1",r.style.minHeight="0",r.style.overflow="hidden")}else{(0,n.$)("welcome")?.classList.add("hidden");let a=(0,n.$)("project-view");a&&(a.classList.remove("hidden"),a.style.display="flex",a.style.flexDirection="column",a.style.flex="1",a.style.minHeight="0"),On(t)}}function Ne(e){j.value=e}var Fn,Xi,en=Q(()=>{C();I();K();dn();vt();Ln();St();Zt();Ss();Fn=new Map,Xi=180*1e3});I();K();C();I();K();var mt=null;function ia(){return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone===!0||document.referrer.includes("android-app://")}function ti(e){let t=String(e||"").replace(/^\[|\]$/g,"");return!!(/^\d{1,3}(\.\d{1,3}){3}$/.test(t)||t.includes(":")&&/^[0-9a-f:]+$/i.test(t))}function ni(){if(!("serviceWorker"in navigator)||!window.isSecureContext)return!1;let e=location.hostname;return e==="localhost"||e==="127.0.0.1"||e==="::1"?!0:ti(e)?!1:location.protocol==="https:"}function ra(){document.getElementById("btn-pwa-install")?.classList.remove("hidden")}function la(){ia()&&document.documentElement.classList.add("pwa-standalone"),window.addEventListener("beforeinstallprompt",s=>{s.preventDefault(),mt=s,document.dispatchEvent(new CustomEvent("pwa-installable")),ra()}),window.addEventListener("appinstalled",()=>{mt=null,document.getElementById("btn-pwa-install")?.classList.add("hidden")});let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1;if(!ia()&&(e||/Android/i.test(navigator.userAgent))&&requestAnimationFrame(()=>ra()),!ni()){"serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then(s=>s.forEach(a=>a.unregister())).catch(()=>{});return}let t=()=>{navigator.serviceWorker.register("/sw.js",{scope:"/"}).then(s=>{s.addEventListener("updatefound",()=>{let a=s.installing;a&&a.addEventListener("statechange",()=>{a.state==="installed"&&navigator.serviceWorker.controller&&console.info("[pwa] New version ready \u2014 reload to apply")})})}).catch(()=>{navigator.serviceWorker.getRegistrations().then(s=>s.forEach(a=>a.unregister())).catch(()=>{})})};document.readyState==="complete"?setTimeout(t,0):window.addEventListener("load",()=>setTimeout(t,0))}async function ca(){if(!mt)return!1;mt.prompt();let e=await mt.userChoice.catch(()=>null);return mt=null,document.getElementById("btn-pwa-install")?.classList.add("hidden"),e?.outcome==="accepted"}function Xe(e,t){e&&(t?e.setAttribute("inert",""):e.removeAttribute("inert"))}function ht(e){return!e||e.classList.contains("hidden")?!0:e.style.display==="none"}function V(){let e=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,t=document.getElementById("sidebar");if(t){let a=!e||t.classList.contains("open");Xe(t,!a)}Xe(document.getElementById("welcome"),ht(document.getElementById("welcome"))),Xe(document.getElementById("auth-screen"),ht(document.getElementById("auth-screen"))),Xe(document.getElementById("chat-opts"),ht(document.getElementById("chat-opts"))),Xe(document.getElementById("machine-picker"),ht(document.getElementById("machine-picker")));for(let a of["files","git","shell","memory"]){let o=document.getElementById(`tab-${a}`);Xe(o,ht(o))}let s=document.getElementById("tab-chat");s&&Xe(s,ht(s))}function Pt(){let e=window.visualViewport,t=document.documentElement;if(!e)return;let s=e.height<window.innerHeight-80;t.classList.toggle("vv-keyboard",s),t.style.setProperty("--vvh",`${Math.round(e.height)}px`),t.style.setProperty("--vv-top",`${Math.round(e.offsetTop)}px`)}function da(){V(),Pt();let e=window.visualViewport;e&&(e.addEventListener("resize",Pt),e.addEventListener("scroll",Pt)),window.addEventListener("resize",()=>{Pt(),V()}),window.addEventListener("orientationchange",()=>{setTimeout(()=>{Pt(),V()},250)})}dn();vt();Ln();C();K();I();Tn();function Fa(){document.getElementById("root").insertAdjacentHTML("beforeend",`
256
256
  <dialog id="modal-settings" class="modal">
257
257
  <div class="modal-box max-w-lg">
258
258
  <h3 class="font-bold text-base mb-4">\u2699\uFE0F Settings \u2014 Workspaces</h3>
@@ -271,15 +271,15 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
271
271
  </div>
272
272
  </div>
273
273
  <form method="dialog" class="modal-backdrop"><button>close</button></form>
274
- </dialog>`),Ln(),document.getElementById("ws-add-btn").addEventListener("click",us),document.getElementById("ws-new-name").addEventListener("keydown",e=>{e.key==="Enter"&&us()}),document.getElementById("ws-new-dir").addEventListener("keydown",e=>{e.key==="Enter"&&us()})}function Ln(){let e=(0,n.$)("ws-list");if(!e)return;let t=P.peek();if(!t.length){e.innerHTML='<div class="text-xs text-base-content/40">No workspaces configured</div>';return}e.innerHTML=t.map(s=>`
274
+ </dialog>`),In(),document.getElementById("ws-add-btn").addEventListener("click",gs),document.getElementById("ws-new-name").addEventListener("keydown",e=>{e.key==="Enter"&&gs()}),document.getElementById("ws-new-dir").addEventListener("keydown",e=>{e.key==="Enter"&&gs()})}function In(){let e=(0,n.$)("ws-list");if(!e)return;let t=H.peek();if(!t.length){e.innerHTML='<div class="text-xs text-base-content/40">No workspaces configured</div>';return}e.innerHTML=t.map(s=>`
275
275
  <div class="flex items-center gap-2 px-3 py-2 bg-base-200 rounded-lg">
276
276
  <div class="flex-1 min-w-0">
277
277
  <div class="text-sm font-medium">${(0,n.esc)(s.name)}</div>
278
278
  <div class="text-xs font-mono text-base-content/50 truncate">${(0,n.esc)(s.configDir)}</div>
279
279
  </div>
280
280
  ${t.length>1?`<button class="btn btn-ghost btn-xs text-error" data-ws-delete="${(0,n.esc)(s.id)}">\u2715</button>`:'<span class="text-[10px] text-base-content/30">default</span>'}
281
- </div>`).join(""),e.querySelectorAll("[data-ws-delete]").forEach(s=>{s.addEventListener("click",()=>wi(s.dataset.wsDelete))})}async function us(){let e=(0,n.$)("ws-new-name").value.trim(),t=(0,n.$)("ws-new-dir").value.trim(),s=(0,n.$)("ws-error");if(s.classList.add("hidden"),!e||!t){s.textContent="Name and path are required",s.classList.remove("hidden");return}try{let a=await h("POST","/api/workspaces",{name:e,configDir:t});P.value=[...P.peek(),a],Bt(P.peek()),(0,n.$)("ws-new-name").value="",(0,n.$)("ws-new-dir").value="",Ln()}catch(a){s.textContent=a.message,s.classList.remove("hidden")}}async function wi(e){try{await h("DELETE",`/api/workspaces/${e}`),P.value=P.peek().filter(t=>t.id!==e),Bt(P.peek()),Ln()}catch(t){alert(t.message)}}function _a(){Ln(),(0,n.$)("modal-settings")?.showModal()}C();K();I();var In=!1,Oe="chat",bt=!1,q=null,ee=null,tt=[],Ha=0,Tn=null,fs=localStorage.getItem("ai_last_auto_report")||"",En=[],Ua="",qe="ma_last_session_id";function gt(e){if(typeof marked<"u")try{return marked.parse(String(e??""),{breaks:!0,gfm:!0})}catch{}return(0,n.esc)(e).replace(/\n/g,"<br>")}function xt(e){!e||typeof hljs>"u"||e.querySelectorAll("pre code").forEach(t=>{try{hljs.highlightElement(t)}catch{}})}async function ms(e,t,s){let a=Ue({"Content-Type":"application/json"}),o=await fetch(e,{method:"POST",headers:a,body:JSON.stringify(t||{})});if(!o.ok){let l=await o.json().catch(()=>({}));throw new Error(l.error||`HTTP ${o.status}`)}let i=o.body.getReader(),r=new TextDecoder,c="",p="message";for(;;){let{done:l,value:d}=await i.read();if(l)break;c+=r.decode(d,{stream:!0});let u=c.split(`
282
- `);c=u.pop()||"";for(let m of u)if(m.startsWith("event:"))p=m.slice(6).trim();else if(m.startsWith("data:")){let b=m.slice(5).trim();if(!b)continue;let x;try{x=JSON.parse(b)}catch{continue}s[p]?.(x),s.any?.(p,x),p="message"}else m.trim()===""&&(p="message")}}function ki(){return`
281
+ </div>`).join(""),e.querySelectorAll("[data-ws-delete]").forEach(s=>{s.addEventListener("click",()=>Ai(s.dataset.wsDelete))})}async function gs(){let e=(0,n.$)("ws-new-name").value.trim(),t=(0,n.$)("ws-new-dir").value.trim(),s=(0,n.$)("ws-error");if(s.classList.add("hidden"),!e||!t){s.textContent="Name and path are required",s.classList.remove("hidden");return}try{let a=await h("POST","/api/workspaces",{name:e,configDir:t});H.value=[...H.peek(),a],Gt(H.peek()),(0,n.$)("ws-new-name").value="",(0,n.$)("ws-new-dir").value="",In()}catch(a){s.textContent=a.message,s.classList.remove("hidden")}}async function Ai(e){try{await h("DELETE",`/api/workspaces/${e}`),H.value=H.peek().filter(t=>t.id!==e),Gt(H.peek()),In()}catch(t){alert(t.message)}}function Oa(){In(),(0,n.$)("modal-settings")?.showModal()}C();K();I();var Dn=!1,We="chat",yt=!1,q=null,te=null,at=[],qa=0,Cn=null,xs=localStorage.getItem("ai_last_auto_report")||"",jn=[],Ja="",Ge="ma_last_session_id";function wt(e){if(typeof marked<"u")try{return marked.parse(String(e??""),{breaks:!0,gfm:!0})}catch{}return(0,n.esc)(e).replace(/\n/g,"<br>")}function kt(e){!e||typeof hljs>"u"||e.querySelectorAll("pre code").forEach(t=>{try{hljs.highlightElement(t)}catch{}})}async function vs(e,t,s){let a=Fe({"Content-Type":"application/json"}),o=await fetch(e,{method:"POST",headers:a,body:JSON.stringify(t||{})});if(!o.ok){let l=await o.json().catch(()=>({}));throw new Error(l.error||`HTTP ${o.status}`)}let i=o.body.getReader(),r=new TextDecoder,c="",p="message";for(;;){let{done:l,value:d}=await i.read();if(l)break;c+=r.decode(d,{stream:!0});let u=c.split(`
282
+ `);c=u.pop()||"";for(let m of u)if(m.startsWith("event:"))p=m.slice(6).trim();else if(m.startsWith("data:")){let b=m.slice(5).trim();if(!b)continue;let x;try{x=JSON.parse(b)}catch{continue}s[p]?.(x),s.any?.(p,x),p="message"}else m.trim()===""&&(p="message")}}function ji(){return`
283
283
  <div id="meta-agent-panel" class="meta-agent-panel hidden" aria-hidden="true">
284
284
  <div class="meta-agent-backdrop" data-ma-close="1"></div>
285
285
  <div class="meta-agent-sheet">
@@ -408,29 +408,29 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
408
408
  </div>
409
409
  </div>
410
410
  </div>
411
- </div>`}function ae(e){Oe=e;let t=(0,n.$)("ma-mode-chat"),s=(0,n.$)("ma-mode-history"),a=(0,n.$)("ma-mode-report"),o=(0,n.$)("ma-mode-config");for(let[r,c]of[[t,"chat"],[s,"history"],[a,"report"],[o,"config"]]){if(!r)continue;let p=e===c;r.classList.toggle("hidden",!p),r.classList.toggle("flex",p)}let i=(r,c)=>{let p=(0,n.$)(r);p&&(p.classList.toggle("border-primary/40",c),p.classList.toggle("text-primary",c))};i("ma-btn-chat",e==="chat"),i("ma-btn-history",e==="history"),i("ma-btn-report",e==="report"),e==="history"&&nt()}function Ft(){let e=(0,n.$)("ma-session-title"),t=(0,n.$)("ma-resume-bar"),s=(0,n.$)("ma-resume-text");if(!q){e&&(e.textContent="\u65B0\u5BF9\u8BDD"),t?.classList.add("hidden");return}let a=ee?.title||q.slice(0,8),o=qa(ee?.updatedAt);if(e&&(e.textContent=o?`${a} \xB7 ${o}`:a),t&&s){t.classList.remove("hidden");let i=ee?.messageCount;s.textContent=i?`\u5DF2\u52A0\u8F7D\u5386\u53F2 \xB7 ${i} \u6761\u6D88\u606F \xB7 \u53D1\u9001\u5373\u53EF\u7EE7\u7EED`:"\u5DF2\u52A0\u8F7D\u5386\u53F2\u4F1A\u8BDD \xB7 \u53D1\u9001\u5373\u53EF\u7EE7\u7EED"}}function hs(e="chat"){let t=(0,n.$)("meta-agent-panel");if(t){if(t.classList.remove("hidden"),t.setAttribute("aria-hidden","false"),In=!0,ae(e),e==="chat"){De();let s=localStorage.getItem(qe);!q&&s?_e(s,{silent:!0}).catch(()=>{localStorage.removeItem(qe)}):Ft()}e==="history"&&De().then(()=>nt()),e==="report"&&Wa(),e==="config"&&Ga(),setTimeout(()=>{Oe==="chat"&&(0,n.$)("ma-input")?.focus(),Oe==="history"&&(0,n.$)("ma-history-search")?.focus()},50)}}function Ba(){let e=(0,n.$)("meta-agent-panel");e&&(e.classList.add("hidden"),e.setAttribute("aria-hidden","true"),In=!1)}function Fa(){In?Ba():hs(Oe==="config"?"chat":Oe)}function H(e,t,s={}){let a=(0,n.$)("ma-messages");if(!a)return null;let o=document.createElement("div");return o.className=`ma-msg ma-msg-${e}`,e==="user"?o.innerHTML=`<div class="ma-bubble user">${(0,n.esc)(t)}</div>`:e==="assistant"?(o.innerHTML=`<div class="ma-bubble assistant md">${gt(t)}</div>`,xt(o)):e==="error"?o.innerHTML=`<div class="ma-bubble error">${(0,n.esc)(t)}</div>`:e==="system"?o.innerHTML=`<div class="ma-sys">${(0,n.esc)(t)}</div>`:e==="tool"&&(o.innerHTML=`<div class="ma-tool" data-tool-id="${(0,n.esc)(s.id||"")}">
411
+ </div>`}function oe(e){We=e;let t=(0,n.$)("ma-mode-chat"),s=(0,n.$)("ma-mode-history"),a=(0,n.$)("ma-mode-report"),o=(0,n.$)("ma-mode-config");for(let[r,c]of[[t,"chat"],[s,"history"],[a,"report"],[o,"config"]]){if(!r)continue;let p=e===c;r.classList.toggle("hidden",!p),r.classList.toggle("flex",p)}let i=(r,c)=>{let p=(0,n.$)(r);p&&(p.classList.toggle("border-primary/40",c),p.classList.toggle("text-primary",c))};i("ma-btn-chat",e==="chat"),i("ma-btn-history",e==="history"),i("ma-btn-report",e==="report"),e==="history"&&ot()}function zt(){let e=(0,n.$)("ma-session-title"),t=(0,n.$)("ma-resume-bar"),s=(0,n.$)("ma-resume-text");if(!q){e&&(e.textContent="\u65B0\u5BF9\u8BDD"),t?.classList.add("hidden");return}let a=te?.title||q.slice(0,8),o=Xa(te?.updatedAt);if(e&&(e.textContent=o?`${a} \xB7 ${o}`:a),t&&s){t.classList.remove("hidden");let i=te?.messageCount;s.textContent=i?`\u5DF2\u52A0\u8F7D\u5386\u53F2 \xB7 ${i} \u6761\u6D88\u606F \xB7 \u53D1\u9001\u5373\u53EF\u7EE7\u7EED`:"\u5DF2\u52A0\u8F7D\u5386\u53F2\u4F1A\u8BDD \xB7 \u53D1\u9001\u5373\u53EF\u7EE7\u7EED"}}function ys(e="chat"){let t=(0,n.$)("meta-agent-panel");if(t){if(t.classList.remove("hidden"),t.setAttribute("aria-hidden","false"),Dn=!0,oe(e),e==="chat"){Pe();let s=localStorage.getItem(Ge);!q&&s?He(s,{silent:!0}).catch(()=>{localStorage.removeItem(Ge)}):zt()}e==="history"&&Pe().then(()=>ot()),e==="report"&&Qa(),e==="config"&&Za(),setTimeout(()=>{We==="chat"&&(0,n.$)("ma-input")?.focus(),We==="history"&&(0,n.$)("ma-history-search")?.focus()},50)}}function Ka(){let e=(0,n.$)("meta-agent-panel");e&&(e.classList.add("hidden"),e.setAttribute("aria-hidden","true"),Dn=!1)}function Va(){Dn?Ka():ys(We==="config"?"chat":We)}function P(e,t,s={}){let a=(0,n.$)("ma-messages");if(!a)return null;let o=document.createElement("div");return o.className=`ma-msg ma-msg-${e}`,e==="user"?o.innerHTML=`<div class="ma-bubble user">${(0,n.esc)(t)}</div>`:e==="assistant"?(o.innerHTML=`<div class="ma-bubble assistant md">${wt(t)}</div>`,kt(o)):e==="error"?o.innerHTML=`<div class="ma-bubble error">${(0,n.esc)(t)}</div>`:e==="system"?o.innerHTML=`<div class="ma-sys">${(0,n.esc)(t)}</div>`:e==="tool"&&(o.innerHTML=`<div class="ma-tool" data-tool-id="${(0,n.esc)(s.id||"")}">
412
412
  <span class="ma-tool-name">${(0,n.esc)(s.name||"tool")}</span>
413
413
  <span class="ma-tool-phase">${(0,n.esc)(s.phase||"")}</span>
414
414
  <pre class="ma-tool-args">${(0,n.esc)(JSON.stringify(s.args||{},null,0).slice(0,200))}</pre>
415
- </div>`),a.appendChild(o),a.scrollTop=a.scrollHeight,o}function Pa(e,t){let s=e?.querySelector(".ma-bubble");s&&(s.innerHTML=gt(t),xt(s),(0,n.$)("ma-messages").scrollTop=(0,n.$)("ma-messages").scrollHeight)}function Oa(e,t,s){let a=(0,n.$)("ma-messages");if(!a)return;let o=a.querySelector(`[data-tool-id="${CSS.escape(e)}"]`);if(!o)return;o.classList.toggle("done",t==="done"),o.classList.toggle("error",t==="error");let i=o.querySelector(".ma-tool-phase");if(i&&(i.textContent=t),s&&t!=="start"){let r=o.querySelector(".ma-tool-result");r||(r=document.createElement("pre"),r.className="ma-tool-result",o.appendChild(r)),r.textContent=JSON.stringify(s,null,0).slice(0,500)}}function $i(e){let t=(0,n.$)("ma-messages");if(!t)return;let s=document.createElement("div");s.className="ma-approval",s.dataset.approvalId=e.id;let a=e.args?.command??"";s.innerHTML=`
415
+ </div>`),a.appendChild(o),a.scrollTop=a.scrollHeight,o}function Wa(e,t){let s=e?.querySelector(".ma-bubble");s&&(s.innerHTML=wt(t),kt(s),(0,n.$)("ma-messages").scrollTop=(0,n.$)("ma-messages").scrollHeight)}function Ya(e,t,s){let a=(0,n.$)("ma-messages");if(!a)return;let o=a.querySelector(`[data-tool-id="${CSS.escape(e)}"]`);if(!o)return;o.classList.toggle("done",t==="done"),o.classList.toggle("error",t==="error");let i=o.querySelector(".ma-tool-phase");if(i&&(i.textContent=t),s&&t!=="start"){let r=o.querySelector(".ma-tool-result");r||(r=document.createElement("pre"),r.className="ma-tool-result",o.appendChild(r)),r.textContent=JSON.stringify(s,null,0).slice(0,500)}}function Di(e){let t=(0,n.$)("ma-messages");if(!t)return;let s=document.createElement("div");s.className="ma-approval",s.dataset.approvalId=e.id;let a=e.args?.command??"";s.innerHTML=`
416
416
  <div class="ma-approval-label">\u26A0 Agent \u60F3\u8981\u6267\u884C\u547D\u4EE4\uFF0C\u662F\u5426\u5141\u8BB8\uFF1F</div>
417
417
  <pre class="ma-approval-cmd">${(0,n.esc)(a)}</pre>
418
418
  <div class="ma-approval-actions">
419
419
  <button type="button" class="btn btn-xs btn-error" data-approve="0">\u62D2\u7EDD</button>
420
420
  <button type="button" class="btn btn-xs btn-success" data-approve="1">\u5141\u8BB8\u6267\u884C</button>
421
- </div>`,s.querySelectorAll("[data-approve]").forEach(o=>{o.addEventListener("click",async()=>{let i=o.dataset.approve==="1";s.querySelectorAll("button").forEach(r=>{r.disabled=!0}),s.querySelector(".ma-approval-label").textContent=i?"\u2713 \u5DF2\u5141\u8BB8\uFF0C\u6B63\u5728\u6267\u884C\u2026":"\u2717 \u5DF2\u62D2\u7EDD";try{await h("POST","/api/ai/approve",{id:e.id,approved:i})}catch(r){s.querySelector(".ma-approval-label").textContent=`\u786E\u8BA4\u5931\u8D25\uFF1A${r.message}`}})}),t.appendChild(s),t.scrollTop=t.scrollHeight}function Si(){return Ha+=1,`img${Ha}`}function Li(e,t){if(!e)return;let s=e.selectionStart??e.value.length,a=e.selectionEnd??e.value.length;e.value=e.value.slice(0,s)+t+e.value.slice(a),e.selectionStart=e.selectionEnd=s+t.length,e.dispatchEvent(new Event("input"))}async function Na(e,t){let s=Ue({"x-filename":t||`paste-${Date.now()}.png`});delete s["Content-Type"];let a=await fetch("/api/upload-image",{method:"POST",headers:s,body:e});if(!a.ok){let l=await a.json().catch(()=>({}));throw new Error(l.error||`Upload failed: ${a.status}`)}let{path:o}=await a.json();if(!o)throw new Error("upload returned no path");let i=Si(),r=`[${i}](${o})`,c=(0,n.$)("ma-input");Li(c,(c?.value&&!c.value.endsWith(`
421
+ </div>`,s.querySelectorAll("[data-approve]").forEach(o=>{o.addEventListener("click",async()=>{let i=o.dataset.approve==="1";s.querySelectorAll("button").forEach(r=>{r.disabled=!0}),s.querySelector(".ma-approval-label").textContent=i?"\u2713 \u5DF2\u5141\u8BB8\uFF0C\u6B63\u5728\u6267\u884C\u2026":"\u2717 \u5DF2\u62D2\u7EDD";try{await h("POST","/api/ai/approve",{id:e.id,approved:i})}catch(r){s.querySelector(".ma-approval-label").textContent=`\u786E\u8BA4\u5931\u8D25\uFF1A${r.message}`}})}),t.appendChild(s),t.scrollTop=t.scrollHeight}function _i(){return qa+=1,`img${qa}`}function Pi(e,t){if(!e)return;let s=e.selectionStart??e.value.length,a=e.selectionEnd??e.value.length;e.value=e.value.slice(0,s)+t+e.value.slice(a),e.selectionStart=e.selectionEnd=s+t.length,e.dispatchEvent(new Event("input"))}async function Ga(e,t){let s=Fe({"x-filename":t||`paste-${Date.now()}.png`});delete s["Content-Type"];let a=await fetch("/api/upload-image",{method:"POST",headers:s,body:e});if(!a.ok){let l=await a.json().catch(()=>({}));throw new Error(l.error||`Upload failed: ${a.status}`)}let{path:o}=await a.json();if(!o)throw new Error("upload returned no path");let i=_i(),r=`[${i}](${o})`,c=(0,n.$)("ma-input");Pi(c,(c?.value&&!c.value.endsWith(`
422
422
  `)&&c.value.length?`
423
423
  `:"")+r+`
424
- `);let p="";try{p=URL.createObjectURL(e)}catch{}return tt.push({path:o,previewUrl:p,label:i,ref:r}),bs(),{path:o,ref:r,label:i}}function bs(){let e=(0,n.$)("ma-attach-bar");if(e){if(!tt.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=tt.map((t,s)=>`
424
+ `);let p="";try{p=URL.createObjectURL(e)}catch{}return at.push({path:o,previewUrl:p,label:i,ref:r}),ws(),{path:o,ref:r,label:i}}function ws(){let e=(0,n.$)("ma-attach-bar");if(e){if(!at.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=at.map((t,s)=>`
425
425
  <div class="ma-thumb relative" title="${(0,n.esc)(t.ref||t.path)}">
426
426
  ${t.previewUrl?`<img src="${t.previewUrl}" alt="${(0,n.esc)(t.label||"img")}">`:`<span class="ma-thumb-path">${(0,n.esc)(t.label||"img")}</span>`}
427
427
  <span class="ma-thumb-label">${(0,n.esc)(t.label||"")}</span>
428
428
  <button type="button" class="ma-thumb-x" data-rm-img="${s}">\u2715</button>
429
- </div>`).join(""),e.querySelectorAll("[data-rm-img]").forEach(t=>{t.addEventListener("click",()=>{let s=parseInt(t.dataset.rmImg,10),a=tt[s];if(a?.previewUrl)try{URL.revokeObjectURL(a.previewUrl)}catch{}let o=(0,n.$)("ma-input");o&&a?.ref&&(o.value=o.value.split(a.ref).join("").replace(/\n{3,}/g,`
429
+ </div>`).join(""),e.querySelectorAll("[data-rm-img]").forEach(t=>{t.addEventListener("click",()=>{let s=parseInt(t.dataset.rmImg,10),a=at[s];if(a?.previewUrl)try{URL.revokeObjectURL(a.previewUrl)}catch{}let o=(0,n.$)("ma-input");o&&a?.ref&&(o.value=o.value.split(a.ref).join("").replace(/\n{3,}/g,`
430
430
 
431
- `),o.dispatchEvent(new Event("input"))),tt.splice(s,1),bs()})})}}function qa(e){if(!e)return"";let t=new Date(e);if(Number.isNaN(t.getTime()))return"";let s=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0"),o=String(t.getHours()).padStart(2,"0"),i=String(t.getMinutes()).padStart(2,"0");return`${s}-${a} ${o}:${i}`}async function De(){try{En=(await h("GET","/api/ai/sessions")).sessions||[]}catch{En=[]}return En}function nt(){let e=(0,n.$)("ma-history-list");if(!e)return;let t=(Ua||"").trim().toLowerCase(),s=En;if(t&&(s=s.filter(a=>`${a.title||""} ${a.preview||""} ${a.id||""}`.toLowerCase().includes(t))),!s.length){e.innerHTML=`<div class="text-center text-xs text-base-content/40 py-10">
431
+ `),o.dispatchEvent(new Event("input"))),at.splice(s,1),ws()})})}}function Xa(e){if(!e)return"";let t=new Date(e);if(Number.isNaN(t.getTime()))return"";let s=String(t.getMonth()+1).padStart(2,"0"),a=String(t.getDate()).padStart(2,"0"),o=String(t.getHours()).padStart(2,"0"),i=String(t.getMinutes()).padStart(2,"0");return`${s}-${a} ${o}:${i}`}async function Pe(){try{jn=(await h("GET","/api/ai/sessions")).sessions||[]}catch{jn=[]}return jn}function ot(){let e=(0,n.$)("ma-history-list");if(!e)return;let t=(Ja||"").trim().toLowerCase(),s=jn;if(t&&(s=s.filter(a=>`${a.title||""} ${a.preview||""} ${a.id||""}`.toLowerCase().includes(t))),!s.length){e.innerHTML=`<div class="text-center text-xs text-base-content/40 py-10">
432
432
  ${t?"\u6CA1\u6709\u5339\u914D\u7684\u4F1A\u8BDD":"\u8FD8\u6CA1\u6709\u5386\u53F2\u5BF9\u8BDD\u3002\u53D1\u4E00\u6761\u6D88\u606F\u540E\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002"}
433
- </div>`;return}e.innerHTML=s.map(a=>{let o=a.id===q,i=qa(a.updatedAt)||"",r=a.messageCount||0;return`
433
+ </div>`;return}e.innerHTML=s.map(a=>{let o=a.id===q,i=Xa(a.updatedAt)||"",r=a.messageCount||0;return`
434
434
  <div class="ma-hist-item ${o?"active":""}" data-hist-id="${(0,n.esc)(a.id)}">
435
435
  <div class="flex items-start gap-2">
436
436
  <button type="button" class="ma-hist-open flex-1 min-w-0 text-left" data-hist-open="${(0,n.esc)(a.id)}">
@@ -443,22 +443,23 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
443
443
  <button type="button" class="btn btn-ghost btn-xs px-1 text-error" data-hist-del="${(0,n.esc)(a.id)}" title="\u5220\u9664">\u2715</button>
444
444
  </div>
445
445
  </div>
446
- </div>`}).join(""),e.querySelectorAll("[data-hist-open]").forEach(a=>{a.addEventListener("click",async()=>{await _e(a.dataset.histOpen),ae("chat"),(0,n.$)("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-resume]").forEach(a=>{a.addEventListener("click",async o=>{o.stopPropagation(),await _e(a.dataset.histResume),ae("chat"),(0,n.$)("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-del]").forEach(a=>{a.addEventListener("click",async o=>{o.stopPropagation();let i=a.dataset.histDel;if(confirm("\u5220\u9664\u8BE5\u5386\u53F2\u4F1A\u8BDD\uFF1F\u4E0D\u53EF\u6062\u590D\u3002"))try{await h("DELETE",`/api/ai/sessions/${i}`),q===i&&(q=null,ee=null,localStorage.removeItem(qe),_e(null)),await De(),nt()}catch(r){alert(r.message)}})})}function Ra(e){return typeof e=="string"?e:Array.isArray(e)&&e.map(t=>typeof t=="string"?t:t?.type==="text"?t.text||"":t?.type==="image_url"?"[\u56FE\u7247]":"").filter(Boolean).join(`
447
- `)||"[\u2026]"}function Ti(e){let t=(0,n.$)("ma-messages");if(t){if(t.innerHTML="",!e?.length){H("system","\u6B64\u4F1A\u8BDD\u6682\u65E0\u6D88\u606F\u3002");return}for(let s of e){if(s.role==="user"){H("user",Ra(s.content));continue}if(s.role==="assistant"){if(s.tool_calls?.length)for(let a of s.tool_calls){let o=a.function?.name||a.name||"tool",i={};try{i=JSON.parse(a.function?.arguments||a.arguments||"{}")}catch{}H("tool","",{name:o,args:i,phase:"history",id:a.id||o})}s.content&&H("assistant",typeof s.content=="string"?s.content:Ra(s.content));continue}if(s.role==="tool"){let a=s.content;try{a=JSON.parse(s.content)}catch{}let o=s.tool_call_id||"";if(o)Oa(o,"done",a);else{H("tool","",{name:"tool_result",args:{},phase:"done",id:`tr_${Math.random().toString(36).slice(2,8)}`});let i=t.querySelectorAll(".ma-tool"),r=i[i.length-1];if(r){r.classList.add("done");let c=r.querySelector(".ma-tool-result");c||(c=document.createElement("pre"),c.className="ma-tool-result",r.appendChild(c)),c.textContent=typeof a=="string"?a.slice(0,500):JSON.stringify(a,null,0).slice(0,500)}}}}t.scrollTop=t.scrollHeight}}async function Mi(){if(!q){await _e(null);return}if(confirm("\u5220\u9664\u5F53\u524D Meta Agent \u4F1A\u8BDD\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"))try{await h("DELETE",`/api/ai/sessions/${q}`),q=null,ee=null,localStorage.removeItem(qe),await De(),await _e(null),Oe==="history"&&nt()}catch(e){H("error",e.message)}}async function _e(e,t={}){if(!e){q=null,ee=null,localStorage.removeItem(qe);let s=(0,n.$)("ma-messages");return s&&(s.innerHTML=""),H("system","\u65B0\u5BF9\u8BDD \u2014 \u8D34\u56FE \u2192 [imgN](\u8DEF\u5F84)\uFF1B\u9700\u8981\u770B\u56FE\u65F6\u8C03\u7528 VLM\u3002\u5386\u53F2\u5728\u300C\u5386\u53F2\u300D\u9875\uFF0C\u53EF\u968F\u65F6 resume\u3002"),Ft(),null}try{let s=await h("GET",`/api/ai/sessions/${e}`);return q=s.id,ee={id:s.id,title:s.title,updatedAt:s.updatedAt,messageCount:(s.messages||[]).length},localStorage.setItem(qe,s.id),Ti(s.messages||[]),t.silent||H("system","\u2191 \u5386\u53F2\u5DF2\u52A0\u8F7D\u3002\u5728\u4E0B\u65B9\u7EE7\u7EED\u8F93\u5165\u5373\u53EF resume\uFF08\u670D\u52A1\u7AEF\u4FDD\u7559\u5B8C\u6574 tool / VLM \u4E0A\u4E0B\u6587\uFF09\u3002"),Ft(),Oe==="history"&&nt(),s}catch(s){throw t.silent||H("error",s.message),s}}async function Mn(){if(bt)return;let e=(0,n.$)("ma-input"),t=(e?.value||"").trim();if(!t)return;bt=!0,(0,n.$)("ma-send").disabled=!0,H("user",t),e.value="",e.style.height="";for(let o of tt)if(o.previewUrl)try{URL.revokeObjectURL(o.previewUrl)}catch{}tt=[],bs();let s=null,a="";try{await ms("/api/ai/chat",{message:t,sessionId:q},{session:o=>{q=o.id,ee={...ee||{},id:o.id,title:o.title||ee?.title||t.slice(0,40),updatedAt:Date.now()},localStorage.setItem(qe,o.id),Ft()},content:o=>{a=o.content||"",s||(s=H("assistant","")),Pa(s,a)},tool:o=>{o.phase==="start"?H("tool","",{name:o.name,args:o.args,phase:"start",id:o.id}):Oa(o.id,o.phase,o.result)},approval:o=>$i(o),done:o=>{o.sessionId&&(q=o.sessionId,localStorage.setItem(qe,o.sessionId)),(o.title||o.sessionId)&&(ee={id:q,title:o.title||ee?.title||"\u5BF9\u8BDD",updatedAt:Date.now(),messageCount:(ee?.messageCount||0)+2}),o.content&&s&&Pa(s,o.content),Ft(),De()},error:o=>{H("error",o.message||"error")}})}catch(o){H("error",o.message)}finally{bt=!1,(0,n.$)("ma-send").disabled=!1}}async function Ei(){if(bt)return;bt=!0;let e=parseInt((0,n.$)("ma-report-days")?.value||"1",10),t=(0,n.$)("ma-report-body");t.innerHTML=`<div class="text-sm text-base-content/50 py-6 text-center">\u6B63\u5728\u6C47\u603B\u8FD1 ${e} \u5929\u6D3B\u52A8\u2026</div>`,(0,n.$)("ma-gen-report").disabled=!0;let s="",a=document.createElement("div");a.className="ma-report-tools flex flex-col gap-1 mb-3";try{await ms("/api/ai/report",{days:e},{content:o=>{s=o.content||"",t.innerHTML="",t.appendChild(a);let i=document.createElement("div");i.className="md ma-report-md",i.innerHTML=gt(s),xt(i),t.appendChild(i)},tool:o=>{if(o.phase==="start"){let i=document.createElement("div");i.className="ma-tool",i.dataset.toolId=o.id||o.name,i.innerHTML=`<span class="ma-tool-name">${(0,n.esc)(o.name)}</span> <span class="ma-tool-phase">start</span>`,a.appendChild(i)}else{let i=a.querySelector(`[data-tool-id="${CSS.escape(o.id||o.name)}"]`);i&&(i.classList.add(o.phase==="error"?"error":"done"),i.querySelector(".ma-tool-phase").textContent=o.phase)}},done:o=>{if(o.content){t.innerHTML="",t.appendChild(a);let i=document.createElement("div");i.className="md ma-report-md",i.innerHTML=gt(o.content),xt(i),t.appendChild(i)}},error:o=>{t.innerHTML=`<div class="alert alert-error text-sm">${(0,n.esc)(o.message)}</div>`}})}catch(o){t.innerHTML=`<div class="alert alert-error text-sm">${(0,n.esc)(o.message)}</div>`}finally{bt=!1,(0,n.$)("ma-gen-report").disabled=!1}}async function Wa(){try{let e=new Date,t=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,s=await h("GET",`/api/ai/reports/${t}`);if(s?.markdown){let a=(0,n.$)("ma-report-body");a.innerHTML=`
446
+ </div>`}).join(""),e.querySelectorAll("[data-hist-open]").forEach(a=>{a.addEventListener("click",async()=>{await He(a.dataset.histOpen),oe("chat"),(0,n.$)("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-resume]").forEach(a=>{a.addEventListener("click",async o=>{o.stopPropagation(),await He(a.dataset.histResume),oe("chat"),(0,n.$)("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-del]").forEach(a=>{a.addEventListener("click",async o=>{o.stopPropagation();let i=a.dataset.histDel;if(confirm("\u5220\u9664\u8BE5\u5386\u53F2\u4F1A\u8BDD\uFF1F\u4E0D\u53EF\u6062\u590D\u3002"))try{await h("DELETE",`/api/ai/sessions/${i}`),q===i&&(q=null,te=null,localStorage.removeItem(Ge),He(null)),await Pe(),ot()}catch(r){alert(r.message)}})})}function za(e){return typeof e=="string"?e:Array.isArray(e)&&e.map(t=>typeof t=="string"?t:t?.type==="text"?t.text||"":t?.type==="image_url"?"[\u56FE\u7247]":"").filter(Boolean).join(`
447
+ `)||"[\u2026]"}function Hi(e){let t=(0,n.$)("ma-messages");if(t){if(t.innerHTML="",!e?.length){P("system","\u6B64\u4F1A\u8BDD\u6682\u65E0\u6D88\u606F\u3002");return}for(let s of e){if(s.role==="user"){P("user",za(s.content));continue}if(s.role==="assistant"){if(s.tool_calls?.length)for(let a of s.tool_calls){let o=a.function?.name||a.name||"tool",i={};try{i=JSON.parse(a.function?.arguments||a.arguments||"{}")}catch{}P("tool","",{name:o,args:i,phase:"history",id:a.id||o})}s.content&&P("assistant",typeof s.content=="string"?s.content:za(s.content));continue}if(s.role==="tool"){let a=s.content;try{a=JSON.parse(s.content)}catch{}let o=s.tool_call_id||"";if(o)Ya(o,"done",a);else{P("tool","",{name:"tool_result",args:{},phase:"done",id:`tr_${Math.random().toString(36).slice(2,8)}`});let i=t.querySelectorAll(".ma-tool"),r=i[i.length-1];if(r){r.classList.add("done");let c=r.querySelector(".ma-tool-result");c||(c=document.createElement("pre"),c.className="ma-tool-result",r.appendChild(c)),c.textContent=typeof a=="string"?a.slice(0,500):JSON.stringify(a,null,0).slice(0,500)}}}}t.scrollTop=t.scrollHeight}}async function Ni(){if(!q){await He(null);return}if(confirm("\u5220\u9664\u5F53\u524D Meta Agent \u4F1A\u8BDD\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"))try{await h("DELETE",`/api/ai/sessions/${q}`),q=null,te=null,localStorage.removeItem(Ge),await Pe(),await He(null),We==="history"&&ot()}catch(e){P("error",e.message)}}async function He(e,t={}){if(!e){q=null,te=null,localStorage.removeItem(Ge);let s=(0,n.$)("ma-messages");return s&&(s.innerHTML=""),P("system","\u65B0\u5BF9\u8BDD \u2014 \u8D34\u56FE \u2192 [imgN](\u8DEF\u5F84)\uFF1B\u9700\u8981\u770B\u56FE\u65F6\u8C03\u7528 VLM\u3002\u5386\u53F2\u5728\u300C\u5386\u53F2\u300D\u9875\uFF0C\u53EF\u968F\u65F6 resume\u3002"),zt(),null}try{let s=await h("GET",`/api/ai/sessions/${e}`);return q=s.id,te={id:s.id,title:s.title,updatedAt:s.updatedAt,messageCount:(s.messages||[]).length},localStorage.setItem(Ge,s.id),Hi(s.messages||[]),t.silent||P("system","\u2191 \u5386\u53F2\u5DF2\u52A0\u8F7D\u3002\u5728\u4E0B\u65B9\u7EE7\u7EED\u8F93\u5165\u5373\u53EF resume\uFF08\u670D\u52A1\u7AEF\u4FDD\u7559\u5B8C\u6574 tool / VLM \u4E0A\u4E0B\u6587\uFF09\u3002"),zt(),We==="history"&&ot(),s}catch(s){throw t.silent||P("error",s.message),s}}async function An(){if(yt)return;let e=(0,n.$)("ma-input"),t=(e?.value||"").trim();if(!t)return;yt=!0,(0,n.$)("ma-send").disabled=!0,P("user",t),e.value="",e.style.height="";for(let o of at)if(o.previewUrl)try{URL.revokeObjectURL(o.previewUrl)}catch{}at=[],ws();let s=null,a="";try{await vs("/api/ai/chat",{message:t,sessionId:q},{session:o=>{q=o.id,te={...te||{},id:o.id,title:o.title||te?.title||t.slice(0,40),updatedAt:Date.now()},localStorage.setItem(Ge,o.id),zt()},content:o=>{a=o.content||"",s||(s=P("assistant","")),Wa(s,a)},tool:o=>{o.phase==="start"?P("tool","",{name:o.name,args:o.args,phase:"start",id:o.id}):Ya(o.id,o.phase,o.result)},approval:o=>Di(o),done:o=>{o.sessionId&&(q=o.sessionId,localStorage.setItem(Ge,o.sessionId)),(o.title||o.sessionId)&&(te={id:q,title:o.title||te?.title||"\u5BF9\u8BDD",updatedAt:Date.now(),messageCount:(te?.messageCount||0)+2}),o.content&&s&&Wa(s,o.content),zt(),Pe()},error:o=>{P("error",o.message||"error")}})}catch(o){P("error",o.message)}finally{yt=!1,(0,n.$)("ma-send").disabled=!1}}async function Ri(){if(yt)return;yt=!0;let e=parseInt((0,n.$)("ma-report-days")?.value||"1",10),t=(0,n.$)("ma-report-body");t.innerHTML=`<div class="text-sm text-base-content/50 py-6 text-center">\u6B63\u5728\u6C47\u603B\u8FD1 ${e} \u5929\u6D3B\u52A8\u2026</div>`,(0,n.$)("ma-gen-report").disabled=!0;let s="",a=document.createElement("div");a.className="ma-report-tools flex flex-col gap-1 mb-3";try{await vs("/api/ai/report",{days:e},{content:o=>{s=o.content||"",t.innerHTML="",t.appendChild(a);let i=document.createElement("div");i.className="md ma-report-md",i.innerHTML=wt(s),kt(i),t.appendChild(i)},tool:o=>{if(o.phase==="start"){let i=document.createElement("div");i.className="ma-tool",i.dataset.toolId=o.id||o.name,i.innerHTML=`<span class="ma-tool-name">${(0,n.esc)(o.name)}</span> <span class="ma-tool-phase">start</span>`,a.appendChild(i)}else{let i=a.querySelector(`[data-tool-id="${CSS.escape(o.id||o.name)}"]`);i&&(i.classList.add(o.phase==="error"?"error":"done"),i.querySelector(".ma-tool-phase").textContent=o.phase)}},done:o=>{if(o.content){t.innerHTML="",t.appendChild(a);let i=document.createElement("div");i.className="md ma-report-md",i.innerHTML=wt(o.content),kt(i),t.appendChild(i)}},error:o=>{t.innerHTML=`<div class="alert alert-error text-sm">${(0,n.esc)(o.message)}</div>`}})}catch(o){t.innerHTML=`<div class="alert alert-error text-sm">${(0,n.esc)(o.message)}</div>`}finally{yt=!1,(0,n.$)("ma-gen-report").disabled=!1}}async function Qa(){try{let e=new Date,t=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,s=await h("GET",`/api/ai/reports/${t}`);if(s?.markdown){let a=(0,n.$)("ma-report-body");a.innerHTML=`
448
448
  <div class="text-[10px] text-base-content/40 mb-2">${(0,n.esc)(s.title||t)} \xB7 ${(0,n.esc)(s.generatedAt||"")}</div>
449
- <div class="md ma-report-md">${gt(s.markdown)}</div>`,xt(a)}}catch{}}async function Ii(){let e=(0,n.$)("ma-report-list");try{let t=await h("GET","/api/ai/reports");e.classList.remove("hidden");let s=t.reports||[];if(!s.length){e.innerHTML='<div class="text-xs text-base-content/40 px-2 py-1">\u6682\u65E0\u5386\u53F2\u62A5\u544A</div>';return}e.innerHTML=s.map(a=>`
449
+ <div class="md ma-report-md">${wt(s.markdown)}</div>`,kt(a)}}catch{}}async function Bi(){let e=(0,n.$)("ma-report-list");try{let t=await h("GET","/api/ai/reports");e.classList.remove("hidden");let s=t.reports||[];if(!s.length){e.innerHTML='<div class="text-xs text-base-content/40 px-2 py-1">\u6682\u65E0\u5386\u53F2\u62A5\u544A</div>';return}e.innerHTML=s.map(a=>`
450
450
  <button type="button" class="ma-report-item w-full text-left px-2 py-1 rounded hover:bg-base-200 text-xs"
451
451
  data-day="${(0,n.esc)(a.day)}">
452
452
  <span class="font-semibold">${(0,n.esc)(a.day)}</span>
453
453
  <span class="text-base-content/45 ml-1">${(0,n.esc)(a.title||"")}</span>
454
454
  </button>`).join(""),e.querySelectorAll("[data-day]").forEach(a=>{a.addEventListener("click",async()=>{try{let o=await h("GET",`/api/ai/reports/${a.dataset.day}`),i=(0,n.$)("ma-report-body");i.innerHTML=`
455
455
  <div class="text-[10px] text-base-content/40 mb-2">${(0,n.esc)(o.title||o.day)} \xB7 ${(0,n.esc)(o.generatedAt||"")}</div>
456
- <div class="md ma-report-md">${gt(o.markdown)}</div>`,xt(i)}catch(o){(0,n.$)("ma-report-body").innerHTML=`<div class="alert alert-error text-sm">${(0,n.esc)(o.message)}</div>`}})})}catch(t){e.classList.remove("hidden"),e.innerHTML=`<div class="text-xs text-error px-2">${(0,n.esc)(t.message)}</div>`}}async function Ga(){try{let e=await h("GET","/api/ai/config");(0,n.$)("ma-cfg-url").value=e.url||"",(0,n.$)("ma-cfg-model").value=e.model||"",(0,n.$)("ma-cfg-key").placeholder=e.hasKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"API Key",(0,n.$)("ma-cfg-key").value="",(0,n.$)("ma-cfg-vlm-url").value=e.vlm_url||"",(0,n.$)("ma-cfg-vlm-model").value=e.vlm_model||"",(0,n.$)("ma-cfg-vlm-key").value="",(0,n.$)("ma-cfg-vlm-key").placeholder=e.hasVlmKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"\u53EF\u9009",(0,n.$)("ma-cfg-system").value=e.system||"",(0,n.$)("ma-auto-report")&&((0,n.$)("ma-auto-report").checked=!!e.auto_report),(0,n.$)("ma-auto-hour")&&((0,n.$)("ma-auto-hour").value=String(e.auto_report_hour??18)),Ot(e)}catch(e){(0,n.$)("ma-cfg-status").textContent=e.message}}async function Ci(){let e=(0,n.$)("ma-cfg-status");e.textContent="\u4FDD\u5B58\u4E2D\u2026";try{let t={url:(0,n.$)("ma-cfg-url").value.trim(),model:(0,n.$)("ma-cfg-model").value.trim(),vlm_url:(0,n.$)("ma-cfg-vlm-url").value.trim(),vlm_model:(0,n.$)("ma-cfg-vlm-model").value.trim(),system:(0,n.$)("ma-cfg-system").value,auto_report:!!(0,n.$)("ma-auto-report")?.checked,auto_report_hour:parseInt((0,n.$)("ma-auto-hour")?.value||"18",10)},s=(0,n.$)("ma-cfg-key").value.trim(),a=(0,n.$)("ma-cfg-vlm-key").value.trim();s&&(t.key=s),a&&(t.vlm_key=a);let o=await h("PUT","/api/ai/config",t);e.textContent=o.hasKey?"\u5DF2\u4FDD\u5B58 \u2713":"\u5DF2\u4FDD\u5B58\uFF08\u672A\u8BBE\u7F6E Key\uFF09",(0,n.$)("ma-cfg-key").value="",(0,n.$)("ma-cfg-vlm-key").value="",Ot(o)}catch(t){e.textContent=t.message}}function Ot(e){if(Tn&&(clearInterval(Tn),Tn=null),!e?.auto_report)return;let t=e.auto_report_hour??18;Tn=setInterval(async()=>{if(!f.token)return;let s=new Date;if(s.getHours()!==t)return;let a=`${s.getFullYear()}-${String(s.getMonth()+1).padStart(2,"0")}-${String(s.getDate()).padStart(2,"0")}`;if(fs!==a&&!(s.getMinutes()>10))try{fs=a,localStorage.setItem("ai_last_auto_report",a),await ms("/api/ai/report",{days:e.auto_report_days||1},{done:()=>{console.info("[meta-agent] auto report saved for",a)},error:o=>console.warn("[meta-agent] auto report",o.message)})}catch(o){console.warn("[meta-agent] auto report failed",o),fs="",localStorage.removeItem("ai_last_auto_report")}},60*1e3)}function za(){(0,n.$)("meta-agent-panel")||(document.getElementById("root")?.insertAdjacentHTML("beforeend",ki()),document.querySelectorAll("[data-ma-close]").forEach(e=>{e.addEventListener("click",Ba)}),(0,n.$)("ma-btn-chat")?.addEventListener("click",()=>ae("chat")),(0,n.$)("ma-btn-history")?.addEventListener("click",async()=>{await De(),ae("history")}),(0,n.$)("ma-open-history")?.addEventListener("click",async()=>{await De(),ae("history")}),(0,n.$)("ma-btn-report")?.addEventListener("click",()=>{ae("report"),Wa()}),(0,n.$)("ma-btn-config")?.addEventListener("click",()=>{ae("config"),Ga()}),(0,n.$)("ma-send")?.addEventListener("click",Mn),(0,n.$)("ma-input")?.addEventListener("keydown",e=>{(e.metaKey||e.ctrlKey)&&e.key==="Enter"&&(e.preventDefault(),Mn())}),(0,n.$)("ma-input")?.addEventListener("input",()=>{let e=(0,n.$)("ma-input");e.style.height="auto",e.style.height=Math.min(e.scrollHeight,120)+"px"}),(0,n.$)("ma-new-chat")?.addEventListener("click",()=>{_e(null),ae("chat")}),(0,n.$)("ma-del-session")?.addEventListener("click",Mi),(0,n.$)("ma-resume-focus")?.addEventListener("click",()=>{(0,n.$)("ma-input")?.focus()}),(0,n.$)("ma-history-refresh")?.addEventListener("click",async()=>{await De(),nt()}),(0,n.$)("ma-history-new")?.addEventListener("click",()=>{_e(null),ae("chat")}),(0,n.$)("ma-history-search")?.addEventListener("input",e=>{Ua=e.target.value||"",nt()}),(0,n.$)("ma-quick-today")?.addEventListener("click",()=>{ae("chat"),(0,n.$)("ma-input").value="\u6839\u636E\u6211\u6700\u8FD1\u7684\u4F1A\u8BDD\uFF0C\u603B\u7ED3\u4ECA\u5929\u6211\u505A\u4E86\u4EC0\u4E48\uFF1F\u6309\u9879\u76EE\u5217\u51FA\u4EAE\u70B9\u4E0E\u672A\u5B8C\u6210\u4E8B\u9879\u3002",Mn()}),(0,n.$)("ma-quick-projects")?.addEventListener("click",()=>{ae("chat"),(0,n.$)("ma-input").value="\u5217\u51FA\u6700\u8FD1 14 \u5929\u6D3B\u8DC3\u7684\u9879\u76EE\uFF0C\u6BCF\u4E2A\u9879\u76EE\u4E00\u53E5\u8BDD\u8BF4\u660E\u6700\u8FD1\u5728\u505A\u4EC0\u4E48\u3002",Mn()}),(0,n.$)("ma-gen-report")?.addEventListener("click",Ei),(0,n.$)("ma-load-reports")?.addEventListener("click",Ii),(0,n.$)("ma-cfg-save")?.addEventListener("click",Ci),(0,n.$)("ma-auto-report")?.addEventListener("change",async()=>{try{let e=await h("PUT","/api/ai/config",{auto_report:!!(0,n.$)("ma-auto-report").checked,auto_report_hour:parseInt((0,n.$)("ma-auto-hour")?.value||"18",10)});Ot(e)}catch{}}),(0,n.$)("ma-auto-hour")?.addEventListener("change",async()=>{try{let e=await h("PUT","/api/ai/config",{auto_report:!!(0,n.$)("ma-auto-report")?.checked,auto_report_hour:parseInt((0,n.$)("ma-auto-hour").value||"18",10)});Ot(e)}catch{}}),(0,n.$)("ma-image-input")?.addEventListener("change",async e=>{let t=[...e.target.files||[]],s=(0,n.$)("ma-input");s&&(s.disabled=!0);try{for(let a of t)if(a.type.startsWith("image/")){if(a.size>12*1024*1024){H("error",`${a.name} \u8FC7\u5927 (>12MB)`);continue}await Na(a,a.name||`upload-${Date.now()}.png`)}}catch(a){H("error",`\u56FE\u7247\u4E0A\u4F20\u5931\u8D25: ${a.message}`)}finally{e.target.value="",s&&(s.disabled=!1,s.focus())}}),document.addEventListener("paste",async e=>{if(!In||Oe!=="chat")return;let t=(0,n.$)("ma-input"),s=(0,n.$)("meta-agent-panel"),a=document.activeElement;if(!s||!a||!s.contains(a))return;let i=[...e.clipboardData?.items||[]].filter(r=>r.type.startsWith("image/"));if(i.length){e.preventDefault(),t&&(t.disabled=!0);try{for(let r of i){let c=r.getAsFile();if(!c)continue;let p=(r.type.split("/")[1]||"png").replace(/[^a-z0-9]/gi,"")||"png";await Na(c,`paste-${Date.now()}.${p}`)}}catch(r){H("error",`\u7C98\u8D34\u56FE\u7247\u5931\u8D25: ${r.message}`)}finally{t&&(t.disabled=!1,t.focus())}}}),_e(null,{silent:!0}))}function qt(){f.token&&(k.peek()&&!Ct()||(De(),h("GET","/api/ai/config").then(Ot).catch(()=>{})))}I();var Ja=()=>`
456
+ <div class="md ma-report-md">${wt(o.markdown)}</div>`,kt(i)}catch(o){(0,n.$)("ma-report-body").innerHTML=`<div class="alert alert-error text-sm">${(0,n.esc)(o.message)}</div>`}})})}catch(t){e.classList.remove("hidden"),e.innerHTML=`<div class="text-xs text-error px-2">${(0,n.esc)(t.message)}</div>`}}async function Za(){try{let e=await h("GET","/api/ai/config");(0,n.$)("ma-cfg-url").value=e.url||"",(0,n.$)("ma-cfg-model").value=e.model||"",(0,n.$)("ma-cfg-key").placeholder=e.hasKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"API Key",(0,n.$)("ma-cfg-key").value="",(0,n.$)("ma-cfg-vlm-url").value=e.vlm_url||"",(0,n.$)("ma-cfg-vlm-model").value=e.vlm_model||"",(0,n.$)("ma-cfg-vlm-key").value="",(0,n.$)("ma-cfg-vlm-key").placeholder=e.hasVlmKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"\u53EF\u9009",(0,n.$)("ma-cfg-system").value=e.system||"",(0,n.$)("ma-auto-report")&&((0,n.$)("ma-auto-report").checked=!!e.auto_report),(0,n.$)("ma-auto-hour")&&((0,n.$)("ma-auto-hour").value=String(e.auto_report_hour??18)),Jt(e)}catch(e){(0,n.$)("ma-cfg-status").textContent=e.message}}async function Ui(){let e=(0,n.$)("ma-cfg-status");e.textContent="\u4FDD\u5B58\u4E2D\u2026";try{let t={url:(0,n.$)("ma-cfg-url").value.trim(),model:(0,n.$)("ma-cfg-model").value.trim(),vlm_url:(0,n.$)("ma-cfg-vlm-url").value.trim(),vlm_model:(0,n.$)("ma-cfg-vlm-model").value.trim(),system:(0,n.$)("ma-cfg-system").value,auto_report:!!(0,n.$)("ma-auto-report")?.checked,auto_report_hour:parseInt((0,n.$)("ma-auto-hour")?.value||"18",10)},s=(0,n.$)("ma-cfg-key").value.trim(),a=(0,n.$)("ma-cfg-vlm-key").value.trim();s&&(t.key=s),a&&(t.vlm_key=a);let o=await h("PUT","/api/ai/config",t);e.textContent=o.hasKey?"\u5DF2\u4FDD\u5B58 \u2713":"\u5DF2\u4FDD\u5B58\uFF08\u672A\u8BBE\u7F6E Key\uFF09",(0,n.$)("ma-cfg-key").value="",(0,n.$)("ma-cfg-vlm-key").value="",Jt(o)}catch(t){e.textContent=t.message}}function Jt(e){if(Cn&&(clearInterval(Cn),Cn=null),!e?.auto_report)return;let t=e.auto_report_hour??18;Cn=setInterval(async()=>{if(!f.token)return;let s=new Date;if(s.getHours()!==t)return;let a=`${s.getFullYear()}-${String(s.getMonth()+1).padStart(2,"0")}-${String(s.getDate()).padStart(2,"0")}`;if(xs!==a&&!(s.getMinutes()>10))try{xs=a,localStorage.setItem("ai_last_auto_report",a),await vs("/api/ai/report",{days:e.auto_report_days||1},{done:()=>{console.info("[meta-agent] auto report saved for",a)},error:o=>console.warn("[meta-agent] auto report",o.message)})}catch(o){console.warn("[meta-agent] auto report failed",o),xs="",localStorage.removeItem("ai_last_auto_report")}},60*1e3)}function eo(){(0,n.$)("meta-agent-panel")||(document.getElementById("root")?.insertAdjacentHTML("beforeend",ji()),document.querySelectorAll("[data-ma-close]").forEach(e=>{e.addEventListener("click",Ka)}),(0,n.$)("ma-btn-chat")?.addEventListener("click",()=>oe("chat")),(0,n.$)("ma-btn-history")?.addEventListener("click",async()=>{await Pe(),oe("history")}),(0,n.$)("ma-open-history")?.addEventListener("click",async()=>{await Pe(),oe("history")}),(0,n.$)("ma-btn-report")?.addEventListener("click",()=>{oe("report"),Qa()}),(0,n.$)("ma-btn-config")?.addEventListener("click",()=>{oe("config"),Za()}),(0,n.$)("ma-send")?.addEventListener("click",An),(0,n.$)("ma-input")?.addEventListener("keydown",e=>{(e.metaKey||e.ctrlKey)&&e.key==="Enter"&&(e.preventDefault(),An())}),(0,n.$)("ma-input")?.addEventListener("input",()=>{let e=(0,n.$)("ma-input");e.style.height="auto",e.style.height=Math.min(e.scrollHeight,120)+"px"}),(0,n.$)("ma-new-chat")?.addEventListener("click",()=>{He(null),oe("chat")}),(0,n.$)("ma-del-session")?.addEventListener("click",Ni),(0,n.$)("ma-resume-focus")?.addEventListener("click",()=>{(0,n.$)("ma-input")?.focus()}),(0,n.$)("ma-history-refresh")?.addEventListener("click",async()=>{await Pe(),ot()}),(0,n.$)("ma-history-new")?.addEventListener("click",()=>{He(null),oe("chat")}),(0,n.$)("ma-history-search")?.addEventListener("input",e=>{Ja=e.target.value||"",ot()}),(0,n.$)("ma-quick-today")?.addEventListener("click",()=>{oe("chat"),(0,n.$)("ma-input").value="\u6839\u636E\u6211\u6700\u8FD1\u7684\u4F1A\u8BDD\uFF0C\u603B\u7ED3\u4ECA\u5929\u6211\u505A\u4E86\u4EC0\u4E48\uFF1F\u6309\u9879\u76EE\u5217\u51FA\u4EAE\u70B9\u4E0E\u672A\u5B8C\u6210\u4E8B\u9879\u3002",An()}),(0,n.$)("ma-quick-projects")?.addEventListener("click",()=>{oe("chat"),(0,n.$)("ma-input").value="\u5217\u51FA\u6700\u8FD1 14 \u5929\u6D3B\u8DC3\u7684\u9879\u76EE\uFF0C\u6BCF\u4E2A\u9879\u76EE\u4E00\u53E5\u8BDD\u8BF4\u660E\u6700\u8FD1\u5728\u505A\u4EC0\u4E48\u3002",An()}),(0,n.$)("ma-gen-report")?.addEventListener("click",Ri),(0,n.$)("ma-load-reports")?.addEventListener("click",Bi),(0,n.$)("ma-cfg-save")?.addEventListener("click",Ui),(0,n.$)("ma-auto-report")?.addEventListener("change",async()=>{try{let e=await h("PUT","/api/ai/config",{auto_report:!!(0,n.$)("ma-auto-report").checked,auto_report_hour:parseInt((0,n.$)("ma-auto-hour")?.value||"18",10)});Jt(e)}catch{}}),(0,n.$)("ma-auto-hour")?.addEventListener("change",async()=>{try{let e=await h("PUT","/api/ai/config",{auto_report:!!(0,n.$)("ma-auto-report")?.checked,auto_report_hour:parseInt((0,n.$)("ma-auto-hour").value||"18",10)});Jt(e)}catch{}}),(0,n.$)("ma-image-input")?.addEventListener("change",async e=>{let t=[...e.target.files||[]],s=(0,n.$)("ma-input");s&&(s.disabled=!0);try{for(let a of t)if(a.type.startsWith("image/")){if(a.size>12*1024*1024){P("error",`${a.name} \u8FC7\u5927 (>12MB)`);continue}await Ga(a,a.name||`upload-${Date.now()}.png`)}}catch(a){P("error",`\u56FE\u7247\u4E0A\u4F20\u5931\u8D25: ${a.message}`)}finally{e.target.value="",s&&(s.disabled=!1,s.focus())}}),document.addEventListener("paste",async e=>{if(!Dn||We!=="chat")return;let t=(0,n.$)("ma-input"),s=(0,n.$)("meta-agent-panel"),a=document.activeElement;if(!s||!a||!s.contains(a))return;let i=[...e.clipboardData?.items||[]].filter(r=>r.type.startsWith("image/"));if(i.length){e.preventDefault(),t&&(t.disabled=!0);try{for(let r of i){let c=r.getAsFile();if(!c)continue;let p=(r.type.split("/")[1]||"png").replace(/[^a-z0-9]/gi,"")||"png";await Ga(c,`paste-${Date.now()}.${p}`)}}catch(r){P("error",`\u7C98\u8D34\u56FE\u7247\u5931\u8D25: ${r.message}`)}finally{t&&(t.disabled=!1,t.focus())}}}),He(null,{silent:!0}))}function Kt(){f.token&&($.peek()&&!Dt()||(Pe(),h("GET","/api/ai/config").then(Jt).catch(()=>{})))}I();var to=()=>`
457
457
  <div id="auth-screen" class="${f.token?"hidden":""} flex items-center justify-center h-full p-4" ${f.token?'style="display:none"':""}>
458
458
  <div class="card bg-base-200 border border-base-300 w-full max-w-sm shadow-xl">
459
459
  <div class="card-body gap-3 p-8">
460
460
  <h1 class="text-xl font-bold">\u{1F916} Agent UI</h1>
461
461
  <p id="auth-subtitle" class="text-sm text-base-content/60 mb-1">Claude \xB7 Codex \xB7 Grok</p>
462
+ <form id="auth-form" class="flex flex-col gap-3" autocomplete="on" action="#">
462
463
  <label class="form-control">
463
464
  <div class="label py-1"><span class="label-text text-xs uppercase tracking-wide">Username</span></div>
464
465
  <input id="auth-username" type="text" class="input input-bordered input-sm" placeholder="username" autocomplete="username">
@@ -467,11 +468,12 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
467
468
  <div class="label py-1"><span class="label-text text-xs uppercase tracking-wide">Password</span></div>
468
469
  <input id="auth-password" type="password" class="input input-bordered input-sm" placeholder="\u2022\u2022\u2022\u2022\u2022\u2022" autocomplete="current-password">
469
470
  </label>
470
- <button id="auth-btn" class="btn btn-primary btn-sm mt-1" data-mode="login">Sign In</button>
471
+ <button type="submit" id="auth-btn" class="btn btn-primary btn-sm mt-1" data-mode="login">Sign In</button>
472
+ </form>
471
473
  <div id="auth-error" class="alert alert-error text-xs py-2 hidden"></div>
472
474
  </div>
473
475
  </div>
474
- </div>`,Ka=(e={})=>{let t=!!e.restoreSession,s=f.token?"":"hidden",a=f.token?"display:flex":"display:none";return`
476
+ </div>`,no=(e={})=>{let t=!!e.restoreSession,s=f.token?"":"hidden",a=f.token?"display:flex":"display:none";return`
475
477
  <div id="sidebar-overlay" class="hidden fixed inset-0 bg-black/50 z-[9]"></div>
476
478
  <div id="app" class="${s} flex-col flex-1 overflow-hidden" style="${a}">
477
479
  <div id="topbar" class="flex items-center gap-2 px-3 bg-base-200 border-b border-base-300 flex-shrink-0" style="height:44px">
@@ -507,8 +509,8 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
507
509
  <div class="flex gap-2 topbar-actions">
508
510
  <button id="btn-refresh-conn" class="btn btn-ghost btn-xs border border-base-300" title="\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65">\u21BB</button>
509
511
  <button id="btn-pwa-install" class="btn btn-ghost btn-xs border border-base-300 hidden" title="\u5B89\u88C5\u5230\u4E3B\u5C4F\u5E55">\u5B89\u88C5</button>
510
- <button id="btn-meta-agent" class="btn btn-ghost btn-xs border border-primary/40 text-primary" title="Meta Agent \u2014 \u62A5\u544A / \u95EE\u7B54 / VLM">\u2726 Agent</button>
511
- <button id="btn-new-session" class="btn btn-ghost btn-xs border border-base-300">\uFF0B New</button>
512
+ <button id="btn-meta-agent" class="btn btn-ghost btn-xs border border-primary/40 text-primary" title="Meta Agent \u2014 \u62A5\u544A / \u95EE\u7B54 / VLM"><span class="hidden sm:inline">\u2726 Agent</span><span class="sm:hidden">\u2726</span></button>
513
+ <button id="btn-new-session" class="btn btn-ghost btn-xs border border-base-300" title="New session"><span class="hidden sm:inline">\uFF0B New</span><span class="sm:hidden">\uFF0B</span></button>
512
514
  <button id="btn-theme" class="btn btn-ghost btn-xs border border-base-300">\u{1F319}</button>
513
515
  <button id="btn-settings" class="btn btn-ghost btn-xs border border-base-300">\u2699\uFE0F</button>
514
516
  <button id="btn-logout" class="btn btn-ghost btn-xs border border-base-300">Sign out</button>
@@ -673,9 +675,10 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
673
675
  <button id="scroll-bottom-btn" class="scroll-fab hidden" title="Jump to bottom">\u2193</button>
674
676
  </div>
675
677
  <div id="permission-requests"></div>
678
+ <form id="chat-form" autocomplete="off" action="#" class="flex flex-col flex-shrink-0">
676
679
  <div id="chat-composer" class="flex flex-col border-t border-base-300 bg-base-200 flex-shrink-0">
677
680
  <div id="chat-attach-bar" class="hidden flex flex-wrap gap-1.5 px-3 pt-2"></div>
678
- <div id="chat-opts" class="hidden flex items-center gap-1.5 px-3 pt-2 flex-wrap">
681
+ <div id="chat-opts" class="hidden flex items-center gap-1.5 px-3 pt-2 flex-wrap" inert>
679
682
  <select id="sel-agent" class="select select-xs select-bordered text-xs font-semibold" title="Agent">
680
683
  <option value="claude">Claude</option>
681
684
  <option value="codex">Codex</option>
@@ -718,25 +721,37 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
718
721
  <option value="full">density: full</option>
719
722
  </select>
720
723
  </div>
721
- <div id="composer-row" class="flex gap-2 items-end px-3 pt-2 pb-2">
722
- <button type="button" id="btn-opts" class="btn btn-ghost btn-sm px-2 text-base-content/30 hover:text-base-content flex-shrink-0" title="Options">\u2699</button>
723
- <button type="button" id="btn-attach" class="btn btn-ghost btn-sm px-2 text-base-content/40 hover:text-base-content flex-shrink-0" title="\u6DFB\u52A0\u56FE\u7247 / \u6587\u4EF6">\u{1F4CE}</button>
724
- <input type="file" id="chat-file-input" class="hidden" multiple accept="image/*,*/*">
725
- <textarea id="chat-input" rows="1" placeholder="Ask\u2026 (\u{1F4CE} \u56FE\u7247/\u6587\u4EF6 \xB7 !cmd \xB7 \u2318\u21B5)"
726
- class="chat-input flex-1 text-sm resize-none leading-relaxed"
727
- name="agent-chat-message"
728
- autocomplete="off"
729
- autocorrect="off"
730
- autocapitalize="off"
731
- spellcheck="false"
732
- data-1p-ignore="true"
733
- data-lpignore="true"
734
- data-form-type="other"
735
- data-bwignore="true"></textarea>
736
- <button type="button" id="send-btn" class="btn btn-primary btn-sm flex-shrink-0">Send</button>
737
- <button type="button" id="stop-btn" class="btn btn-error btn-sm hidden flex-shrink-0">\u25A0</button>
724
+ <div id="composer-row" class="px-3 pt-2 pb-2">
725
+ <div class="composer-surface">
726
+ <textarea id="chat-input" rows="1" placeholder="\u95EE\u70B9\u4EC0\u4E48\u2026"
727
+ class="chat-input w-full text-sm resize-none leading-relaxed"
728
+ name="q"
729
+ enterkeyhint="send"
730
+ inputmode="text"
731
+ autocomplete="off"
732
+ autocorrect="off"
733
+ autocapitalize="sentences"
734
+ spellcheck="false"
735
+ data-1p-ignore="true"
736
+ data-lpignore="true"
737
+ data-form-type="other"
738
+ data-bwignore="true"></textarea>
739
+ <div class="composer-actions">
740
+ <div class="composer-tools">
741
+ <button type="button" id="btn-opts" class="composer-icon-btn" title="Options" aria-label="Options">\u2699</button>
742
+ <button type="button" id="btn-attach" class="composer-icon-btn" title="\u6DFB\u52A0\u56FE\u7247 / \u6587\u4EF6" aria-label="\u6DFB\u52A0\u56FE\u7247 / \u6587\u4EF6">\u{1F4CE}</button>
743
+ <input type="file" id="chat-file-input" class="hidden" multiple accept="image/*,*/*" tabindex="-1">
744
+ </div>
745
+ <div class="composer-submit">
746
+ <span class="composer-hint">Enter \u53D1\u9001</span>
747
+ <button type="submit" id="send-btn" class="composer-send-btn">Send</button>
748
+ <button type="button" id="stop-btn" class="composer-stop-btn hidden" aria-label="\u505C\u6B62\u751F\u6210">\u25A0</button>
749
+ </div>
750
+ </div>
751
+ </div>
738
752
  </div>
739
753
  </div>
754
+ </form>
740
755
  </div>
741
756
  <div id="tab-files" class="hidden flex-col flex-1 overflow-hidden">
742
757
  <div class="flex items-center gap-2 px-3 py-1.5 border-b border-base-300 flex-shrink-0 bg-base-200">
@@ -811,7 +826,7 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
811
826
  </div>
812
827
  </div>
813
828
  <form method="dialog" class="modal-backdrop"><button>close</button></form>
814
- </dialog>`};vs();yt();Vt();C();I();K();Sn();an();yt();Kt();Vt();C();I();K();yt();Kt();async function kt(){try{let e=await h("GET","/api/machines");D.value=Array.isArray(e)?e:[]}catch{try{let e=await dt();e?.machines&&(D.value=e.machines)}catch{}}return D.peek()||[]}function Ms(){let e=(0,n.$)("machine-picker-list"),t=(0,n.$)("machine-picker-empty");if(!e)return;let s=D.peek()||[];if(!s.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=s.map(a=>{let o=a.online!==!1,i=[a.hostname,a.platform].filter(Boolean).join(" \xB7 ");return`
829
+ </dialog>`};Ss();St();en();C();I();K();Tn();dn();St();Zt();en();C();I();K();St();Zt();async function Et(){try{let e=await h("GET","/api/machines");D.value=Array.isArray(e)?e:[]}catch{try{let e=await ft();e?.machines&&(D.value=e.machines)}catch{}}return D.peek()||[]}function js(){let e=(0,n.$)("machine-picker-list"),t=(0,n.$)("machine-picker-empty");if(!e)return;let s=D.peek()||[];if(!s.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=s.map(a=>{let o=a.online!==!1,i=[a.hostname,a.platform].filter(Boolean).join(" \xB7 ");return`
815
830
  <button type="button" class="machine-pick-card w-full text-left px-4 py-3 rounded-xl border border-base-300
816
831
  hover:border-primary hover:bg-primary/5 transition-colors ${o?"":"opacity-50"}"
817
832
  data-pick-machine="${(0,n.esc)(a.id)}" ${o?"":"disabled"}>
@@ -820,7 +835,7 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
820
835
  <span class="font-semibold text-sm font-mono">${(0,n.esc)(a.id)}</span>
821
836
  </div>
822
837
  ${i?`<div class="text-xs text-base-content/45 mt-1 pl-4">${(0,n.esc)(i)}</div>`:""}
823
- </button>`}).join("")}function $t(){let e=(0,n.$)("machine-picker");if(!e)return;e.classList.remove("hidden"),Ee.value=!1,Ms();let t=(0,n.$)("machine-picker-status");if(t){let s=(D.peek()||[]).filter(a=>a.online!==!1).length;t.textContent=`${s} online`}}function Es(){(0,n.$)("machine-picker")?.classList.add("hidden"),Ee.value=!0}function Yt(){(0,n.$)("machine-menu")?.classList.add("hidden")}function Bn(){let e=(0,n.$)("machine-menu-list"),t=(0,n.$)("machine-menu-empty");if(!e)return;let s=D.peek()||[],a=T.peek()||"";if(!s.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=s.map(o=>{let i=o.online!==!1,r=o.id===a,c=[o.hostname,o.platform].filter(Boolean).join(" \xB7 "),p=o.connectedAt?new Date(o.connectedAt).toLocaleTimeString():"";return`
838
+ </button>`}).join("")}function Mt(){let e=(0,n.$)("machine-picker");if(!e)return;e.classList.remove("hidden"),V(),Ce.value=!1,js();let t=(0,n.$)("machine-picker-status");if(t){let s=(D.peek()||[]).filter(a=>a.online!==!1).length;t.textContent=`${s} online`}}function Ds(){(0,n.$)("machine-picker")?.classList.add("hidden"),V(),Ce.value=!0}function tn(){(0,n.$)("machine-menu")?.classList.add("hidden")}function Wn(){let e=(0,n.$)("machine-menu-list"),t=(0,n.$)("machine-menu-empty");if(!e)return;let s=D.peek()||[],a=E.peek()||"";if(!s.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=s.map(o=>{let i=o.online!==!1,r=o.id===a,c=[o.hostname,o.platform].filter(Boolean).join(" \xB7 "),p=o.connectedAt?new Date(o.connectedAt).toLocaleTimeString():"";return`
824
839
  <button type="button"
825
840
  class="machine-menu-item w-full text-left px-2 py-1.5 rounded-md text-xs
826
841
  ${r?"bg-primary/15 text-primary":"hover:bg-base-200"}
@@ -834,12 +849,13 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
834
849
  <span class="text-[9px] ${i?"text-success":"text-error"}">${i?"online":"offline"}</span>
835
850
  </div>
836
851
  ${c||p?`<div class="text-[10px] text-base-content/40 pl-3.5 mt-0.5 truncate">${(0,n.esc)(c)}${p?" \xB7 "+(0,n.esc)(p):""}</div>`:""}
837
- </button>`}).join("")}function ot(){let e=(0,n.$)("machine-menu-wrap"),t=(0,n.$)("topbar-machine-label"),s=(0,n.$)("topbar-machine-dot");if(!k.peek()){e?.classList.add("hidden");return}e?.classList.remove("hidden");let a=T.peek()||"",i=(D.peek()||[]).find(c=>c.id===a),r=i?i.online!==!1:!1;t&&(t.textContent=a||"\u9009\u62E9\u673A\u5668"),s&&(s.classList.toggle("bg-success",!!a&&r),s.classList.toggle("bg-warning",!!a&&!r),s.classList.toggle("bg-base-content/30",!a)),Bn()}var go=null;function xo(){go||(go=setInterval(async()=>{if(!k.peek()||!f.token)return;await kt(),ot();let e=T.peek();if(e){let t=(D.peek()||[]).find(s=>s.id===e);if(t&&t.online===!1){let s=(0,n.$)("topbar-machine-label");s&&(s.textContent=`${e} (offline)`)}}},15e3))}async function vo(e,{forceReload:t=!1}={}){if(!e)return;let s=T.peek(),a=s&&s!==e;if(Z(e),Es(),Yt(),ot(),a||t){try{f.ws?.close()}catch{}f.ws=null,f.sessionId=null,(0,n.batch)(()=>{y.value=null,B.value=null,F.value=null});try{let{filesRoot:i,gitRoot:r,filesPath:c}=await Promise.resolve().then(()=>(I(),Vs));i.value="",r.value="",c.value=""}catch{}if(a){let{goHome:i}=await Promise.resolve().then(()=>(Vt(),bo));i()}}let o=(0,n.$)("topbar-project");o&&!y.peek()&&(o.textContent=`Machine \xB7 ${e}`),qt(),await Promise.all([ye(),Gt(),Jt(),zt().catch(()=>{})]),Ee.value=!0}async function Fn(e={}){(0,n.$)("auth-screen").style.display="none";let t=(0,n.$)("app");t.classList.remove("hidden"),t.style.display="flex";let s=e.hub;s===void 0?s=await dt():s?(k.value=!0,s.machines&&(D.value=s.machines)):k.value=!1;let a=e.deepLink||null,o=Ve();if(!!(a?.id||(location.hash||"").startsWith("#/session/"))){let c=(0,n.$)("welcome");c&&(c.classList.add("hidden"),c.style.display="none");let p=(0,n.$)("project-view");p&&(p.classList.remove("hidden"),p.style.display="flex",p.style.flexDirection="column",p.style.flex="1",p.style.minHeight="0")}if(k.peek()){let c=localStorage.getItem("machineId")||o?.machineId||"";c&&(Z(c),Es(),Ee.value=!0,qt());let p=kt().then(u=>(ot(),c&&!u.some(b=>b.id===c&&b.online!==!1)&&u.length&&(u.some(x=>x.id===c)||(Z(null),$t())),u));xo(),ot();let l=Promise.all([ye({waitFresh:!1}),Gt({waitFresh:!1}),Jt().catch(()=>{}),zt().catch(()=>{})]);if(a?.id){let u=E.peek().find(m=>m.sessionId===a.id)||(o?.sessionId===a.id?o:null);await ke(a.id,u?.cwd||o?.cwd||null,u?.configDir||o?.configDir||null,u?.agent||o?.agent||null,u?.machineId||o?.machineId||c||null,{tab:a.tab||"chat"}),p.catch(()=>{}),l.catch(()=>{});return}if(!c){if(await p,!(D.peek()||[]).length){$t(),l.catch(()=>{});return}$t(),l.catch(()=>{});return}await l;let d=(0,n.$)("topbar-project");d&&d.textContent==="Select a session"&&(d.textContent=`Machine \xB7 ${c}`);return}qt();let r=Promise.all([ye({waitFresh:!1}),Gt({waitFresh:!1}),Jt().catch(()=>{}),zt().catch(()=>{})]);if(a?.id){await $n().then(p=>{Array.isArray(p)?E.value=p:p&&Array.isArray(p.sessions)&&(E.value=p.sessions)}).catch(()=>{});let c=E.peek().find(p=>p.sessionId===a.id)||(o?.sessionId===a.id?o:null);await ke(a.id,c?.cwd||o?.cwd||null,c?.configDir||o?.configDir||null,c?.agent||o?.agent||null,null,{tab:a.tab||"chat"}),r.catch(()=>{});return}await r}Kt();C();I();K();ht();yt();Vt();function yo(){(0,n.$)("sidebar").classList.add("open"),(0,n.$)("sidebar-overlay").classList.remove("hidden")}function On(){(0,n.$)("sidebar").classList.remove("open"),(0,n.$)("sidebar-overlay").classList.add("hidden")}function wo(){window.innerWidth<=640&&On()}function ko(){let e=(0,n.$)("sidebar-toggle"),t=(0,n.$)("sidebar"),s=!1,a=t.style.width||"260px";e.addEventListener("click",()=>{s=!s,s?(a=t.style.width||"260px",t.style.width="0",t.style.minWidth="0",t.style.overflow="hidden"):(t.style.width=a,t.style.minWidth="",t.style.overflow=""),e.textContent=s?"\u25B6":"\u25C0"})}function $o(){let e=(0,n.$)("sidebar-resize"),t=(0,n.$)("sidebar"),s=!1;e.addEventListener("mousedown",a=>{s=!0,document.body.style.userSelect="none",document.body.style.cursor="col-resize",a.preventDefault()}),document.addEventListener("mousemove",a=>{if(!s)return;let o=Math.min(Math.max(a.clientX,160),520);t.style.width=o+"px",t.style.minWidth=""}),document.addEventListener("mouseup",()=>{s&&(s=!1,document.body.style.userSelect="",document.body.style.cursor="")})}function Is(e){document.documentElement.setAttribute("data-theme",e),localStorage.setItem("theme",e);let t=(0,n.$)("btn-theme");t&&(t.textContent=e==="dark"||e==="night"||e==="black"?"\u{1F319}":"\u2600\uFE0F");let s=document.getElementById("hljs-theme");if(s||(s=document.querySelector('link[href*="highlight"][href*="styles"]'),s&&(s.id="hljs-theme")),s){let a=e==="dark"||e==="night"||e==="black";s.href=a?"https://cdn.jsdelivr.net/npm/@highlightjs/cdn-assets@11/styles/github-dark.min.css":"https://cdn.jsdelivr.net/npm/@highlightjs/cdn-assets@11/styles/github.min.css"}}function So(){let e=document.documentElement.getAttribute("data-theme")||"dark";Is(e==="dark"?"light":"dark")}function Lo(){let e=(0,n.$)("new-session-agent");e&&(e.value=S.peek()||"claude");let t=(0,n.$)("new-session-workspace");if(t){let o=P.peek();t.innerHTML=o.map(i=>`<option value="${(0,n.esc)(i.configDir)}">${(0,n.esc)(i.name)} \u2014 ${(0,n.esc)(i.configDir)}</option>`).join(""),f.configDir&&(t.value=f.configDir)}let s=(0,n.$)("new-session-machine-wrap"),a=(0,n.$)("new-session-machine");if(s&&a)if(k.peek()){s.style.display="";let o=D.peek()||[],i=T.peek()||"";a.innerHTML=o.length?o.map(r=>`<option value="${(0,n.esc)(r.id)}">${(0,n.esc)(r.id)}${r.hostname?" \u2014 "+(0,n.esc)(r.hostname):""}</option>`).join(""):'<option value="">(no machines online)</option>',i&&(a.value=i),a.disabled=!0}else s.style.display="none",a&&(a.disabled=!1);Cs(),(0,n.$)("new-session-path").value=y.peek()?.path||"",(0,n.$)("new-session-error").classList.add("hidden"),(0,n.$)("modal-new-session").showModal(),setTimeout(()=>(0,n.$)("new-session-path").focus(),50)}function Cs(){let e=(0,n.$)("new-session-agent")?.value||"claude",t=(0,n.$)("new-session-ws-wrap");t&&(t.style.display=e==="claude"?"":"none")}async function As(){let e=(0,n.$)("new-session-path").value.trim(),t=(0,n.$)("new-session-agent")?.value||"claude",s=t==="claude"?(0,n.$)("new-session-workspace").value:null,a=(0,n.$)("new-session-error");if(a.classList.add("hidden"),!e){a.textContent="Working directory is required",a.classList.remove("hidden");return}if(k.peek()){let o=T.peek()||(0,n.$)("new-session-machine")?.value||D.peek()?.[0]?.id;if(!o){a.textContent="\u8BF7\u5148\u9009\u62E9\u4E00\u53F0\u673A\u5668",a.classList.remove("hidden"),$t();return}Z(o)}try{let o=await h("POST","/api/resolve-path",{path:e});if(!o.isDir)throw new Error("Path is not a directory");(0,n.$)("modal-new-session").close();let i=o.path.split("/").filter(Boolean).pop()||o.path;f.sessionId=null,f.configDir=s||null,f.agent=t,me(t),$.value=re(t)||$.peek(),localStorage.setItem("model",$.peek()),we(),(0,n.batch)(()=>{y.value={id:i,name:i,path:o.path,machineId:T.peek()||f.machineId},B.value=o.path,O.value=o.path,J.value=o.path,A.value="",F.value=null}),(0,n.$)("topbar-project").textContent=o.path;let r=(0,n.$)("files-root-input");r&&(r.value=o.path);let c=(0,n.$)("git-root-input");c&&(c.value=o.path),(0,n.$)("welcome").classList.add("hidden");let p=(0,n.$)("project-view");p.classList.remove("hidden"),p.style.display="flex",mt(),je(),He("chat"),g(`New ${R[t]||t} session \xB7 ${o.path}`)}catch(o){a.textContent=o.message,a.classList.remove("hidden")}}function Oi(){let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1,t=/Android/i.test(navigator.userAgent),s;e?s=`<ol class="list-decimal pl-4 space-y-2 text-sm text-base-content/80">
852
+ </button>`}).join("")}function lt(){let e=(0,n.$)("machine-menu-wrap"),t=(0,n.$)("topbar-machine-label"),s=(0,n.$)("topbar-machine-dot");if(!$.peek()){e?.classList.add("hidden");return}e?.classList.remove("hidden");let a=E.peek()||"",i=(D.peek()||[]).find(c=>c.id===a),r=i?i.online!==!1:!1;t&&(t.textContent=a||"\u9009\u62E9\u673A\u5668"),s&&(s.classList.toggle("bg-success",!!a&&r),s.classList.toggle("bg-warning",!!a&&!r),s.classList.toggle("bg-base-content/30",!a)),Wn()}var Lo=null;function Eo(){Lo||(Lo=setInterval(async()=>{if(!$.peek()||!f.token)return;await Et(),lt();let e=E.peek();if(e){let t=(D.peek()||[]).find(s=>s.id===e);if(t&&t.online===!1){let s=(0,n.$)("topbar-machine-label");s&&(s.textContent=`${e} (offline)`)}}},15e3))}async function Mo(e,{forceReload:t=!1}={}){if(!e)return;let s=E.peek(),a=s&&s!==e;if(ee(e),Ds(),tn(),lt(),a||t){try{f.ws?.close()}catch{}f.ws=null,f.sessionId=null,(0,n.batch)(()=>{y.value=null,U.value=null,F.value=null});try{let{filesRoot:i,gitRoot:r,filesPath:c}=await Promise.resolve().then(()=>(I(),ta));i.value="",r.value="",c.value=""}catch{}if(a){let{goHome:i}=await Promise.resolve().then(()=>(en(),So));i()}}let o=(0,n.$)("topbar-project");o&&!y.peek()&&(o.textContent=`Machine \xB7 ${e}`),Kt(),await Promise.all([we(),Yt(),Qt(),Xt().catch(()=>{})]),Ce.value=!0}async function Gn(e={}){(0,n.$)("auth-screen").style.display="none";let t=(0,n.$)("app");t.classList.remove("hidden"),t.style.display="flex",queueMicrotask(V);let s=e.hub;s===void 0?s=await ft():s?($.value=!0,s.machines&&(D.value=s.machines)):$.value=!1;let a=e.deepLink||null,o=Qe();if(!!(a?.id||(location.hash||"").startsWith("#/session/"))){let c=(0,n.$)("welcome");c&&(c.classList.add("hidden"),c.style.display="none");let p=(0,n.$)("project-view");p&&(p.classList.remove("hidden"),p.style.display="flex",p.style.flexDirection="column",p.style.flex="1",p.style.minHeight="0")}if($.peek()){let c=localStorage.getItem("machineId")||o?.machineId||"";c&&(ee(c),Ds(),Ce.value=!0,Kt());let p=Et().then(u=>(lt(),c&&!u.some(b=>b.id===c&&b.online!==!1)&&u.length&&(u.some(x=>x.id===c)||(ee(null),Mt())),u));Eo(),lt();let l=Promise.all([we({waitFresh:!1}),Yt({waitFresh:!1}),Qt().catch(()=>{}),Xt().catch(()=>{})]);if(a?.id){let u=T.peek().find(m=>m.sessionId===a.id)||(o?.sessionId===a.id?o:null);await $e(a.id,u?.cwd||o?.cwd||null,u?.configDir||o?.configDir||null,u?.agent||o?.agent||null,u?.machineId||o?.machineId||c||null,{tab:a.tab||"chat"}),p.catch(()=>{}),l.catch(()=>{});return}if(!c){if(await p,!(D.peek()||[]).length){Mt(),l.catch(()=>{});return}Mt(),l.catch(()=>{});return}await l;let d=(0,n.$)("topbar-project");d&&d.textContent==="Select a session"&&(d.textContent=`Machine \xB7 ${c}`);return}Kt();let r=Promise.all([we({waitFresh:!1}),Yt({waitFresh:!1}),Qt().catch(()=>{}),Xt().catch(()=>{})]);if(a?.id){await Mn().then(p=>{Array.isArray(p)?T.value=p:p&&Array.isArray(p.sessions)&&(T.value=p.sessions)}).catch(()=>{});let c=T.peek().find(p=>p.sessionId===a.id)||(o?.sessionId===a.id?o:null);await $e(a.id,c?.cwd||o?.cwd||null,c?.configDir||o?.configDir||null,c?.agent||o?.agent||null,null,{tab:a.tab||"chat"}),r.catch(()=>{});return}await r}Zt();C();I();K();vt();St();en();function To(){(0,n.$)("sidebar").classList.add("open"),(0,n.$)("sidebar-overlay").classList.remove("hidden"),V()}function zn(){(0,n.$)("sidebar").classList.remove("open"),(0,n.$)("sidebar-overlay").classList.add("hidden"),V()}function Io(){window.innerWidth<=640&&zn()}function Co(){let e=(0,n.$)("sidebar-toggle"),t=(0,n.$)("sidebar"),s=!1,a=t.style.width||"260px";e.addEventListener("click",()=>{s=!s,s?(a=t.style.width||"260px",t.style.width="0",t.style.minWidth="0",t.style.overflow="hidden"):(t.style.width=a,t.style.minWidth="",t.style.overflow=""),e.textContent=s?"\u25B6":"\u25C0"})}function Ao(){let e=(0,n.$)("sidebar-resize"),t=(0,n.$)("sidebar"),s=!1;e.addEventListener("mousedown",a=>{s=!0,document.body.style.userSelect="none",document.body.style.cursor="col-resize",a.preventDefault()}),document.addEventListener("mousemove",a=>{if(!s)return;let o=Math.min(Math.max(a.clientX,160),520);t.style.width=o+"px",t.style.minWidth=""}),document.addEventListener("mouseup",()=>{s&&(s=!1,document.body.style.userSelect="",document.body.style.cursor="")})}function _s(e){document.documentElement.setAttribute("data-theme",e),localStorage.setItem("theme",e);let t=(0,n.$)("btn-theme");t&&(t.textContent=e==="dark"||e==="night"||e==="black"?"\u{1F319}":"\u2600\uFE0F");let s=document.getElementById("hljs-theme");if(s||(s=document.querySelector('link[href*="highlight"][href*="styles"]'),s&&(s.id="hljs-theme")),s){let a=e==="dark"||e==="night"||e==="black";s.href=a?"https://cdn.jsdelivr.net/npm/@highlightjs/cdn-assets@11/styles/github-dark.min.css":"https://cdn.jsdelivr.net/npm/@highlightjs/cdn-assets@11/styles/github.min.css"}}function jo(){let e=document.documentElement.getAttribute("data-theme")||"dark";_s(e==="dark"?"light":"dark")}function Do(){let e=(0,n.$)("new-session-agent");e&&(e.value=k.peek()||"claude");let t=(0,n.$)("new-session-workspace");if(t){let o=H.peek();t.innerHTML=o.map(i=>`<option value="${(0,n.esc)(i.configDir)}">${(0,n.esc)(i.name)} \u2014 ${(0,n.esc)(i.configDir)}</option>`).join(""),f.configDir&&(t.value=f.configDir)}let s=(0,n.$)("new-session-machine-wrap"),a=(0,n.$)("new-session-machine");if(s&&a)if($.peek()){s.style.display="";let o=D.peek()||[],i=E.peek()||"";a.innerHTML=o.length?o.map(r=>`<option value="${(0,n.esc)(r.id)}">${(0,n.esc)(r.id)}${r.hostname?" \u2014 "+(0,n.esc)(r.hostname):""}</option>`).join(""):'<option value="">(no machines online)</option>',i&&(a.value=i),a.disabled=!0}else s.style.display="none",a&&(a.disabled=!1);Ps(),(0,n.$)("new-session-path").value=y.peek()?.path||"",(0,n.$)("new-session-error").classList.add("hidden"),(0,n.$)("modal-new-session").showModal(),setTimeout(()=>(0,n.$)("new-session-path").focus(),50)}function Ps(){let e=(0,n.$)("new-session-agent")?.value||"claude",t=(0,n.$)("new-session-ws-wrap");t&&(t.style.display=e==="claude"?"":"none")}async function Hs(){let e=(0,n.$)("new-session-path").value.trim(),t=(0,n.$)("new-session-agent")?.value||"claude",s=t==="claude"?(0,n.$)("new-session-workspace").value:null,a=(0,n.$)("new-session-error");if(a.classList.add("hidden"),!e){a.textContent="Working directory is required",a.classList.remove("hidden");return}if($.peek()){let o=E.peek()||(0,n.$)("new-session-machine")?.value||D.peek()?.[0]?.id;if(!o){a.textContent="\u8BF7\u5148\u9009\u62E9\u4E00\u53F0\u673A\u5668",a.classList.remove("hidden"),Mt();return}ee(o)}try{let o=await h("POST","/api/resolve-path",{path:e});if(!o.isDir)throw new Error("Path is not a directory");(0,n.$)("modal-new-session").close();let i=o.path.split("/").filter(Boolean).pop()||o.path;f.sessionId=null,f.configDir=s||null,f.agent=t,he(t),S.value=le(t)||S.peek(),localStorage.setItem("model",S.peek()),ke(),(0,n.batch)(()=>{y.value={id:i,name:i,path:o.path,machineId:E.peek()||f.machineId},U.value=o.path,O.value=o.path,J.value=o.path,A.value="",F.value=null}),(0,n.$)("topbar-project").textContent=o.path;let r=(0,n.$)("files-root-input");r&&(r.value=o.path);let c=(0,n.$)("git-root-input");c&&(c.value=o.path),(0,n.$)("welcome").classList.add("hidden");let p=(0,n.$)("project-view");p.classList.remove("hidden"),p.style.display="flex",xt(),_e(),Ne("chat"),g(`New ${R[t]||t} session \xB7 ${o.path}`)}catch(o){a.textContent=o.message,a.classList.remove("hidden")}}function Qi(){let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1,t=/Android/i.test(navigator.userAgent),s;e?s=`<ol class="list-decimal pl-4 space-y-2 text-sm text-base-content/80">
838
853
  <li>\u70B9\u5E95\u90E8\u5206\u4EAB\u6309\u94AE <strong>\u5206\u4EAB</strong>\uFF08\u65B9\u6846+\u5411\u4E0A\u7BAD\u5934\uFF09</li>
839
854
  <li>\u4E0B\u6ED1\u627E\u5230\u5E76\u70B9 <strong>\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55</strong></li>
840
855
  <li>\u786E\u8BA4\u540D\u79F0\u540E\u70B9 <strong>\u6DFB\u52A0</strong></li>
841
856
  </ol>
842
- <p class="text-xs text-base-content/50 mt-3">\u9700\u7528 <strong>Safari</strong> \u6253\u5F00\u672C\u7AD9\uFF1B\u5FAE\u4FE1/Chrome \u5185\u7F6E\u6D4F\u89C8\u5668\u901A\u5E38\u6CA1\u6709\u300C\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55\u300D\u3002</p>`:t?s=`<ol class="list-decimal pl-4 space-y-2 text-sm text-base-content/80">
857
+ <p class="text-xs text-base-content/50 mt-3">\u9700\u7528 <strong>Safari</strong> \u6253\u5F00\u672C\u7AD9\uFF1B\u5FAE\u4FE1/Chrome \u5185\u7F6E\u6D4F\u89C8\u5668\u901A\u5E38\u6CA1\u6709\u300C\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55\u300D\u3002</p>
858
+ <p class="text-xs text-warning/80 mt-2">\u5F53\u524D\u82E5\u662F IP + \u81EA\u7B7E HTTPS\uFF0CSafari \u4ECD\u4F1A\u663E\u793A\u300C\u4E0D\u5B89\u5168\u300D\u3002\u52A0\u5230\u4E3B\u5C4F\u5E55\u53EF\u53BB\u6389\u6D4F\u89C8\u5668\u5916\u58F3\uFF0C\u4F46\u4E0D\u80FD\u53BB\u6389\u7CFB\u7EDF\u8F93\u5165\u6761\u3002\u5F7B\u5E95\u5E72\u51C0\u9700\u8981\u6B63\u5F0F\u57DF\u540D\u8BC1\u4E66\u3002</p>`:t?s=`<ol class="list-decimal pl-4 space-y-2 text-sm text-base-content/80">
843
859
  <li>\u70B9\u53F3\u4E0A\u89D2\u83DC\u5355 <strong>\u22EE</strong></li>
844
860
  <li>\u9009\u62E9 <strong>\u5B89\u88C5\u5E94\u7528</strong> \u6216 <strong>\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55</strong></li>
845
861
  </ol>
@@ -852,29 +868,29 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
852
868
  <form method="dialog"><button class="btn btn-sm">\u77E5\u9053\u4E86</button></form>
853
869
  </div>
854
870
  </div>
855
- <form method="dialog" class="modal-backdrop"><button>close</button></form>`,a.showModal()}async function js(){let e=(0,n.$)("auth-screen");e&&(e.classList.remove("hidden"),e.style.display="flex");let t=(0,n.$)("app");t&&(t.classList.add("hidden"),t.style.display="none");let s=await h("GET","/api/auth/status"),a=(0,n.$)("auth-btn");s.needsSetup?((0,n.$)("auth-subtitle").textContent="Create your account to get started",a.textContent="Create Account",a.dataset.mode="register"):a.dataset.mode="login"}async function To(){let e=(0,n.$)("auth-username").value.trim(),t=(0,n.$)("auth-password").value,s=(0,n.$)("auth-error");s.classList.add("hidden");try{let a=await h("POST",`/api/auth/${(0,n.$)("auth-btn").dataset.mode||"login"}`,{username:e,password:t});f.token=a.token,localStorage.setItem("token",a.token),Fn()}catch(a){s.textContent=a.message,s.classList.remove("hidden")}}function Ds(){return f.token?/^#\/session\//.test(location.hash||""):!1}function Mo(e={}){if(Is(localStorage.getItem("theme")||"dark"),!document.getElementById("xterm-css")){let l=document.createElement("link");l.id="xterm-css",l.rel="stylesheet",l.href="/xterm.min.css",document.head.appendChild(l)}if(!document.getElementById("xterm-js")){let l=document.createElement("script");l.id="xterm-js",l.src="/xterm.min.js",document.head.appendChild(l)}if(!document.getElementById("xterm-fit-js")){let l=document.createElement("script");l.id="xterm-fit-js",l.src="/addon-fit.min.js",document.head.appendChild(l)}let t=e.restoreSession??Ds(),s=document.getElementById("root");if(s.style.cssText="display:flex;flex-direction:column;flex:1;height:100%",s.innerHTML=Ja()+Ka({restoreSession:t}),t){let l=(0,n.$)("session-list");l&&(l.innerHTML='<div class="px-3 py-3 text-[10px] text-base-content/35">Loading sessions\u2026</div>')}(0,n.effect)(()=>{let l=P.value,d=(0,n.$)("ws-tabs");if(!d)return;if(l.length<=1){d.innerHTML="";return}let u=B.peek();d.innerHTML=[{id:null,name:"All"},...l].map(m=>`<button class="px-3 py-1.5 text-[11px] flex-shrink-0 border-b-2 whitespace-nowrap
871
+ <form method="dialog" class="modal-backdrop"><button>close</button></form>`,a.showModal()}async function Rs(){let e=(0,n.$)("auth-screen");e&&(e.classList.remove("hidden"),e.style.display="flex");let t=(0,n.$)("app");t&&(t.classList.add("hidden"),t.style.display="none");let s=(0,n.$)("auth-btn"),a,o=new AbortController,i=setTimeout(()=>o.abort(),8e3);try{a=await h("GET","/api/auth/status",void 0,o.signal)}catch(r){console.warn("[auth status]",r);let c=(0,n.$)("auth-error");c&&(c.textContent="\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u5668\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u670D\u52A1\u5730\u5740\u540E\u91CD\u8BD5\u3002",c.classList.remove("hidden")),s&&(s.dataset.mode="login");return}finally{clearTimeout(i)}a.needsSetup?((0,n.$)("auth-subtitle").textContent="Create your account to get started",s.textContent="Create Account",s.dataset.mode="register"):s.dataset.mode="login"}async function Ns(){let e=(0,n.$)("auth-username").value.trim(),t=(0,n.$)("auth-password").value,s=(0,n.$)("auth-error");s.classList.add("hidden");try{let a=await h("POST",`/api/auth/${(0,n.$)("auth-btn").dataset.mode||"login"}`,{username:e,password:t});f.token=a.token,localStorage.setItem("token",a.token),Gn()}catch(a){s.textContent=a.message,s.classList.remove("hidden")}}function Bs(){return f.token?/^#\/session\//.test(location.hash||""):!1}function _o(e={}){if(_s(localStorage.getItem("theme")||"dark"),!document.getElementById("xterm-css")){let l=document.createElement("link");l.id="xterm-css",l.rel="stylesheet",l.href="/xterm.min.css",document.head.appendChild(l)}if(!document.getElementById("xterm-js")){let l=document.createElement("script");l.id="xterm-js",l.src="/xterm.min.js",document.head.appendChild(l)}if(!document.getElementById("xterm-fit-js")){let l=document.createElement("script");l.id="xterm-fit-js",l.src="/addon-fit.min.js",document.head.appendChild(l)}let t=e.restoreSession??Bs(),s=document.getElementById("root");if(s.style.cssText="display:flex;flex-direction:column;flex:1;height:100%",s.innerHTML=to()+no({restoreSession:t}),t){let l=(0,n.$)("session-list");l&&(l.innerHTML='<div class="px-3 py-3 text-[10px] text-base-content/35">Loading sessions\u2026</div>')}(0,n.effect)(()=>{let l=H.value,d=(0,n.$)("ws-tabs");if(!d)return;if(l.length<=1){d.innerHTML="";return}let u=U.peek();d.innerHTML=[{id:null,name:"All"},...l].map(m=>`<button class="px-3 py-1.5 text-[11px] flex-shrink-0 border-b-2 whitespace-nowrap
856
872
  ${(m.id===null?!u:u===m.configDir)?"border-primary text-primary":"border-transparent text-base-content/50 hover:text-base-content"}"
857
873
  data-ws-tab="${(0,n.esc)(m.configDir||"")}">
858
874
  ${(0,n.esc)(m.name)}
859
- </button>`).join("")}),(0,n.effect)(()=>{Re.value,Ke.value,Le.value,Te.value,ue.value,v.value;let l=(0,n.$)("session-list");l&&(l.querySelector(".session-rename-input")||(l.innerHTML=oo(),io()))}),(0,n.effect)(()=>{E.value,Q.value,T.value,k.value;let l=(0,n.$)("welcome");l&&(document.documentElement.classList.contains("boot-restore")||document.documentElement.classList.contains("boot-pending")||l.classList.contains("hidden")||l.style.display==="none"||at())}),(0,n.watch)(B,l=>{let d=(0,n.$)("session-filter-badge");d&&(d.style.display=l?"inline":"none",d.title=l||"")}),(0,n.effect)(()=>{let l=y.value;if(l&&l.path)lo(l.path);else{let d=(0,n.$)("project-notes-bar");d&&(d.style.display="none")}}),(0,n.watch)(j,l=>{document.querySelectorAll("[data-tab]").forEach(u=>{let m=u.dataset.tab===l;u.classList.toggle("text-primary",m),u.classList.toggle("border-primary",m),u.classList.toggle("text-base-content/50",!m),u.classList.toggle("border-transparent",!m)});let d=(0,n.$)("project-view");d&&!d.classList.contains("hidden")&&(d.style.display="flex",d.style.flexDirection="column",d.style.minHeight="0",d.style.flex="1"),["chat","files","git","shell","memory"].forEach(u=>{let m=(0,n.$)(`tab-${u}`);if(!m)return;let b=u===l;m.classList.toggle("hidden",!b),b?(m.style.display="flex",m.style.flexDirection="column",m.style.flex="1 1 0",m.style.minHeight="0",m.style.overflow="hidden"):m.style.display="none"}),l==="memory"&&$s(),l==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))})}),$o(),ko();let a=null;document.addEventListener("sessions-changed",()=>{a&&clearTimeout(a),a=setTimeout(()=>{a=null,ye({waitFresh:!1})},1200)}),document.addEventListener("router:home",Un),document.addEventListener("router:session",async({detail:{id:l,tab:d}})=>{let u=E.peek().find(b=>b.sessionId===l),m=Ve();await ke(l,u?.cwd||(m?.sessionId===l?m.cwd:null)||null,u?.configDir||(m?.sessionId===l?m.configDir:null)||null,u?.agent||(m?.sessionId===l?m.agent:null)||null,u?.machineId||(m?.sessionId===l?m.machineId:null)||null,{tab:d||"chat"})}),n.delegate.on("click","#btn-home",Un),n.delegate.on("click","#auth-btn",To),n.delegate.on("keydown","#auth-username, #auth-password",l=>{l.key==="Enter"&&To()}),n.delegate.on("click","#hamburger",()=>(0,n.$)("sidebar").classList.contains("open")?On():yo()),n.delegate.on("click","#sidebar-overlay",On),n.delegate.on("input","#session-search",(l,d)=>{N.value=d.value,jn(d.value)}),n.delegate.on("click","#session-filter-badge",()=>{B.value=null}),n.delegate.on("click","[data-ws-tab]",(l,d)=>{B.value=d.dataset.wsTab||null}),n.delegate.on("click","#sidebar-refresh",()=>{ye(),N.peek().trim()&&ks(N.peek())}),n.delegate.on("click","[data-view]",(l,d)=>{Le.value=d.dataset.view,localStorage.setItem("sidebarView",d.dataset.view)}),n.delegate.on("click","[data-agent-filter]",(l,d)=>{Q.value=d.dataset.agentFilter,localStorage.setItem("agentFilter",d.dataset.agentFilter),N.peek().trim()&&jn(N.peek())}),n.delegate.on("change","#time-range",(l,d)=>{te.value=d.value,localStorage.setItem("timeRange",d.value),ye({waitFresh:!0}),N.peek().trim()&&jn(N.peek())}),n.delegate.on("dblclick","[data-project-cwd]",(l,d)=>{let u=d.dataset.projectCwd;if(!u)return;let m=u.split("/").filter(Boolean).pop()||u;Ts({id:m,name:m,path:u}),g(`Project \xB7 ${u}`)}),n.delegate.on("click","#btn-pwa-install",async()=>{await sa()||Oi()}),document.addEventListener("pwa-installable",()=>{document.getElementById("btn-pwa-install")?.classList.remove("hidden")}),n.delegate.on("click","#btn-settings",_a),n.delegate.on("click","#btn-meta-agent",()=>Fa()),n.delegate.on("click","#btn-meta-agent-welcome",()=>hs("chat")),n.delegate.on("click","#btn-theme",So),n.delegate.on("click","#btn-cal-prev",()=>{xs(-1),at(ve())}),n.delegate.on("click","#btn-cal-next",()=>{xs(1),at(ve())}),n.delegate.on("click","[data-cal-date]",(l,d)=>{eo(d.dataset.calDate),at(ve())}),n.delegate.on("click","[data-session-id]",(l,d)=>{l.target.closest("[data-fav-toggle]")||l.target.closest("[data-hide-toggle]")||l.target.closest("[data-rename-session]")||l.target.closest(".session-rename-input")||l.target.closest(".session-title-wrap.session-rename-active")||(ke(d.dataset.sessionId,d.dataset.sessionCwd||null,d.dataset.sessionConfigDir||null,d.dataset.sessionAgent||"claude",d.dataset.sessionMachine||null),wo())}),n.delegate.on("click","[data-rename-session]",(l,d)=>{l.preventDefault(),l.stopPropagation();let u=d.closest(".session-title-wrap")||d,m=u.dataset.renameSessionId||u.dataset.sessionId;m&&Ls({sessionId:m,agent:u.dataset.renameSessionAgent||"claude",machineId:u.dataset.renameSessionMachine||null,fallbackDisplay:u.dataset.renameSessionDisplay||"",mountEl:u})}),n.delegate.on("click","[data-rename-bar]",(l,d)=>{if(l.preventDefault(),l.stopPropagation(),!f.sessionId)return;let u=document.getElementById("session-title-display")||d;Ls({sessionId:f.sessionId,agent:f.agent||S.peek()||"claude",machineId:f.machineId||null,mountEl:u})}),n.delegate.on("click","[data-folder]",(l,d)=>{let u=d.dataset.folder,b=d.querySelector("span")?.textContent.trim()==="\u25BE",x=new Set(it.peek()),W=new Set(rt.peek());b?(x.delete(u),W.add(u)):(x.add(u),W.delete(u)),(0,n.batch)(()=>{it.value=x,rt.value=W})}),n.delegate.on("click","#memory-refresh",$s),n.delegate.on("click","[data-tab]",(l,d)=>He(d.dataset.tab));let o=async(l,d)=>{let u=(0,n.$)(l),m=u?.value.trim();if(!m){d.value="";return}try{let b=await h("POST","/api/resolve-path",{path:m});if(b.isDir===!1)throw new Error("Path is not a directory on the target machine");d.value=b.path,u.value=b.path;let x=y.peek();x&&(y.value={...x,path:b.path})}catch(b){u.style.color="oklch(var(--er))",u.title=b.message,setTimeout(()=>{u.style.color="",u.title=""},2e3)}};n.delegate.on("click","#files-root-btn",()=>o("files-root-input",O)),n.delegate.on("click","#git-root-btn",()=>o("git-root-input",J)),n.delegate.on("keydown","#files-root-input",l=>{l.key==="Enter"&&o("files-root-input",O)}),n.delegate.on("keydown","#git-root-input",l=>{l.key==="Enter"&&o("git-root-input",J)}),n.delegate.on("click","#btn-opts",()=>{(0,n.$)("chat-opts").classList.toggle("hidden")}),n.delegate.on("change","#sel-agent",(l,d)=>{let u=S.peek(),m=d.value;u!==m&&(f.sessionId=null,me(m),$.value=re(m)||$.peek(),localStorage.setItem("model",$.peek()),we(),g(`Agent \u2192 ${R[m]||m} \xB7 model ${$.peek()} \xB7 new session`))}),n.delegate.on("change","#sel-convert-agent",async(l,d)=>{let u=d.value;if(!u)return;let m=f.sessionId;if(!m){alert("No active session to convert."),d.value="";return}let b=f.agent||S.peek()||"claude";if(b===u){alert("Cannot convert to the same agent."),d.value="";return}d.disabled=!0,g(`Converting session ${m.slice(0,8)} from ${b} to ${u}...`);try{let x=await h("POST",`/api/sessions/${m}/convert`,{targetAgent:u,sourceAgent:b});x&&x.success?(g(`\u2713 Converted successfully. New session: ${x.targetSessionId.slice(0,8)}`),await ye(),await ke(x.targetSessionId,y.peek()?.path||null,null,x.targetAgent),yn()):g("Failed to convert session.")}catch(x){g(`Error converting session: ${x.message}`),alert(`Error converting session: ${x.message}`)}finally{d.disabled=!1,d.value=""}}),n.delegate.on("change","#sel-model",(l,d)=>{$.value=d.value,localStorage.setItem("model",d.value),ys()}),n.delegate.on("click","#btn-model-add",()=>ws({editCurrent:!1})),n.delegate.on("click","#btn-model-edit",()=>ws({editCurrent:!0})),n.delegate.on("change","#sel-effort",(l,d)=>{pe.value=d.value}),n.delegate.on("change","#sel-permission",(l,d)=>{Mt.value=d.value}),n.delegate.on("change","#sel-density",(l,d)=>{Zn(d.value),g(`Density \u2192 ${d.value} (applies to new tool calls; reload session to re-group history)`)}),document.addEventListener("agent-changed",we),n.delegate.on("click","#btn-new-session, #btn-new-session-welcome",Lo),n.delegate.on("click","#new-session-cancel",()=>(0,n.$)("modal-new-session").close()),n.delegate.on("click","#new-session-start",As),n.delegate.on("change","#new-session-agent",Cs),n.delegate.on("keydown","#new-session-path",l=>{l.key==="Enter"&&As()}),n.delegate.on("click","#send-btn",xn),n.delegate.on("click","#stop-btn",ka),n.delegate.on("click","#btn-logout",()=>{f.token=null,localStorage.removeItem("token"),Z(null),Ee.value=!1,location.reload()}),n.delegate.on("click","[data-pick-machine]",async(l,d)=>{let u=d.dataset.pickMachine;if(!u||u===T.peek()){Yt();return}await vo(u,{forceReload:!0})});let i=async()=>{let l=(0,n.$)("machine-picker-status");if(l&&(l.textContent="\u5237\u65B0\u4E2D\u2026"),await kt(),Ms(),Bn(),ot(),l){let d=(D.peek()||[]).filter(u=>u.online!==!1).length;l.textContent=`${d} online`}};n.delegate.on("click","#btn-refresh-machines",i),n.delegate.on("click","#btn-refresh-machines-menu",async l=>{l.stopPropagation(),await i()}),n.delegate.on("click","#btn-machine-menu",async l=>{l.stopPropagation(),vt();let d=(0,n.$)("machine-menu");d&&(d.classList.contains("hidden")?(await kt(),Bn(),d.classList.remove("hidden")):d.classList.add("hidden"))}),n.delegate.on("click","#btn-recent-sessions",l=>{l.preventDefault(),l.stopPropagation(),Yt(),Za(ve());let d=!(0,n.$)("recent-menu")?.classList.contains("hidden"),u=(0,n.$)("btn-recent-sessions");u&&u.setAttribute("aria-expanded",d?"true":"false")}),n.delegate.on("click","#recent-menu-backdrop",l=>{l.preventDefault(),l.stopPropagation(),vt(),(0,n.$)("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",l=>{let d=(0,n.$)("machine-menu-wrap");d&&!d.contains(l.target)&&Yt();let u=(0,n.$)("recent-menu"),m=(0,n.$)("btn-recent-sessions"),b=l.target;if(u&&!u.classList.contains("hidden")){if(u.contains(b)||m?.contains(b))return;vt(),m?.setAttribute("aria-expanded","false")}}),window.addEventListener("resize",()=>{(0,n.$)("recent-menu")&&!(0,n.$)("recent-menu").classList.contains("hidden")&&gs()}),n.delegate.on("click","#recent-menu [data-session-id]",()=>{vt(),(0,n.$)("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),n.delegate.on("click","#btn-edit-project-notes, #project-goal-text, #project-notes-text",()=>{co()}),n.delegate.on("click","#btn-cancel-project-notes",()=>{wt()});let r=async()=>{let l=(0,n.$)("project-goal-input")?.value?.trim()??"",d=(0,n.$)("project-notes-input")?.value?.trim()??"",u=y.peek();if(!(!u||!u.path))try{let m=await h("POST","/api/projects/notes",{root:u.path,goal:l,notes:d});ro(m.goal||"",m.notes||""),wt()}catch(m){alert(`Error saving project notes: ${m.message}`)}};n.delegate.on("click","#btn-save-project-notes",r),n.delegate.on("keydown","#project-goal-input",l=>{l.key==="Enter"&&r(),l.key==="Escape"&&wt()}),n.delegate.on("keydown","#project-notes-input",l=>{l.key==="Escape"&&wt()}),n.delegate.on("click","[data-fav-toggle]",(l,d)=>{l.stopPropagation(),l.preventDefault();let u=d.dataset.favSessionMachine||f.machineId;u&&(f.machineId=u,localStorage.setItem("machineId",u)),fo(d.dataset.favSessionId,d.dataset.favSessionAgent||"claude",{machineId:u||null})}),n.delegate.on("click","[data-hide-toggle]",(l,d)=>{l.stopPropagation(),l.preventDefault();let u=d.dataset.hideSessionMachine||f.machineId;u&&(f.machineId=u,localStorage.setItem("machineId",u)),mo(d.dataset.hideSessionId,d.dataset.hideSessionAgent||"claude",{machineId:u||null})}),n.delegate.on("click","#btn-edit-session-notes, #session-notes-text",()=>{po()}),n.delegate.on("click","#btn-cancel-session-notes",()=>ce()),n.delegate.on("click","#btn-save-session-notes",async()=>{let l=(0,n.$)("session-notes-input")?.value?.trim()||"";if(!f.sessionId)return;let d=f.agent||S.peek()||"claude";await Ss(f.sessionId,d,l)&&ce()}),n.delegate.on("keydown","#session-notes-input",async l=>{if(l.key==="Escape"&&ce(),l.key==="Enter"){let d=l.target.value.trim();if(!f.sessionId)return;let u=f.agent||S.peek()||"claude";await Ss(f.sessionId,u,d)&&ce()}}),n.delegate.on("click","#btn-fav-filter",()=>{let l=!Pe.peek();Pe.value=l,localStorage.setItem("favoritesOnly",l?"1":"0"),(0,n.$)("btn-fav-filter")?.classList.toggle("active",l),l&&Ne.peek()&&(Ne.value=!1,localStorage.setItem("showHiddenOnly","0"),(0,n.$)("btn-hidden-filter")?.classList.remove("active"))}),n.delegate.on("click","#btn-hidden-filter",()=>{let l=!Ne.peek();Ne.value=l,localStorage.setItem("showHiddenOnly",l?"1":"0"),(0,n.$)("btn-hidden-filter")?.classList.toggle("active",l),l&&Pe.peek()&&(Pe.value=!1,localStorage.setItem("favoritesOnly","0"),(0,n.$)("btn-fav-filter")?.classList.remove("active"))}),we(),gn();let c=(0,n.$)("sel-density");c&&(c.value=Me.peek()||"normal");let p=(0,n.$)("time-range");p&&(p.value=te.peek()||"14"),document.querySelectorAll("[data-agent-filter]").forEach(l=>{l.classList.toggle("active",l.dataset.agentFilter===Q.peek())}),(0,n.$)("btn-fav-filter")?.classList.toggle("active",Pe.peek()),(0,n.$)("btn-hidden-filter")?.classList.toggle("active",Ne.peek()),document.querySelectorAll("[data-view]").forEach(l=>{let d=l.dataset.view===Le.peek();l.classList.toggle("bg-primary/15",d),l.classList.toggle("text-primary",d),l.classList.toggle("font-medium",d),l.classList.toggle("text-base-content/50",!d)})}ht();C();I();K();function qi(e){let t=e.split(".").pop()?.toLowerCase();return{js:"\u{1F4C4}",ts:"\u{1F4C4}",jsx:"\u{1F4C4}",tsx:"\u{1F4C4}",py:"\u{1F40D}",md:"\u{1F4DD}",json:"\u2699\uFE0F",html:"\u{1F310}",css:"\u{1F3A8}",sh:"\u26A1",env:"\u{1F511}",docx:"\u{1F4D8}",pptx:"\u{1F4D9}",xlsx:"\u{1F4D7}",pdf:"\u{1F4D5}"}[t]||"\u{1F4C4}"}function Wi(e){let t=(e||"").split("/").pop()||"",s=t.lastIndexOf(".");return s>=0?t.slice(s+1).toLowerCase():""}function Eo(e){let t=Wi(e);return t==="docx"||t==="pptx"||t==="xlsx"||t==="pdf"?t:null}function Gi(e){return e==null?"":e>1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function zi(e){let t=atob(e),s=new Uint8Array(t.length);for(let a=0;a<t.length;a++)s[a]=t.charCodeAt(a);return s.buffer}var _s=new Map;function qn(e){if(_s.has(e))return _s.get(e);let t=new Promise((s,a)=>{let o=document.querySelector(`script[data-src="${e}"]`);if(o){if(o.dataset.loaded==="1")return s();o.addEventListener("load",()=>s()),o.addEventListener("error",()=>a(new Error(`Failed to load ${e}`)));return}let i=document.createElement("script");i.src=e,i.async=!0,i.dataset.src=e,i.onload=()=>{i.dataset.loaded="1",s()},i.onerror=()=>a(new Error(`Failed to load ${e}`)),document.head.appendChild(i)});return _s.set(e,t),t}function Ji(e){let s=((e||"").split("/").pop()||"").toLowerCase(),a={dockerfile:"dockerfile",makefile:"makefile",gemfile:"ruby",rakefile:"ruby",procfile:"yaml","cmakelists.txt":"cmake"};if(a[s])return a[s];let o=s.includes(".")?s.split(".").pop():"";return{js:"javascript",mjs:"javascript",cjs:"javascript",jsx:"javascript",ts:"typescript",tsx:"typescript",mts:"typescript",cts:"typescript",py:"python",pyw:"python",pyi:"python",rb:"ruby",go:"go",rs:"rust",java:"java",kt:"kotlin",kts:"kotlin",c:"c",h:"c",cpp:"cpp",cc:"cpp",cxx:"cpp",hpp:"cpp",hh:"cpp",cs:"csharp",swift:"swift",php:"php",scala:"scala",sh:"bash",bash:"bash",zsh:"bash",fish:"bash",ps1:"powershell",psm1:"powershell",html:"xml",htm:"xml",xhtml:"xml",xml:"xml",svg:"xml",css:"css",scss:"scss",less:"less",json:"json",jsonc:"json",json5:"json",yml:"yaml",yaml:"yaml",toml:"ini",ini:"ini",conf:"ini",env:"bash",md:"markdown",mdx:"markdown",markdown:"markdown",sql:"sql",graphql:"graphql",gql:"graphql",vue:"xml",svelte:"xml",r:"r",lua:"lua",pl:"perl",pm:"perl",dart:"dart",ex:"elixir",exs:"elixir",erl:"erlang",zig:"zig",nim:"nim",clj:"clojure",cljs:"clojure",diff:"diff",patch:"diff",dockerfile:"dockerfile"}[o]||""}function Ki(e){!e||typeof hljs>"u"||e.querySelectorAll("pre code.file-preview-code").forEach(t=>{try{delete t.dataset.highlighted,hljs.highlightElement(t)}catch{}})}function Xt(e,t,s){let a=Gi(t);return`
875
+ </button>`).join("")}),(0,n.effect)(()=>{Ue.value,Ye.value,Me.value,Te.value,fe.value,v.value;let l=(0,n.$)("session-list");l&&(l.querySelector(".session-rename-input")||(l.innerHTML=mo(),ho()))}),(0,n.effect)(()=>{T.value,Z.value,E.value,$.value;let l=(0,n.$)("welcome");l&&(document.documentElement.classList.contains("boot-restore")||document.documentElement.classList.contains("boot-pending")||l.classList.contains("hidden")||l.style.display==="none"||rt())}),(0,n.watch)(U,l=>{let d=(0,n.$)("session-filter-badge");d&&(d.style.display=l?"inline":"none",d.title=l||"")}),(0,n.effect)(()=>{let l=y.value;if(l&&l.path)go(l.path);else{let d=(0,n.$)("project-notes-bar");d&&(d.style.display="none")}}),(0,n.watch)(j,l=>{document.querySelectorAll("[data-tab]").forEach(u=>{let m=u.dataset.tab===l;u.classList.toggle("text-primary",m),u.classList.toggle("border-primary",m),u.classList.toggle("text-base-content/50",!m),u.classList.toggle("border-transparent",!m)});let d=(0,n.$)("project-view");d&&!d.classList.contains("hidden")&&(d.style.display="flex",d.style.flexDirection="column",d.style.minHeight="0",d.style.flex="1"),["chat","files","git","shell","memory"].forEach(u=>{let m=(0,n.$)(`tab-${u}`);if(!m)return;let b=u===l;m.classList.toggle("hidden",!b),b?(m.style.display="flex",m.style.flexDirection="column",m.style.flex="1 1 0",m.style.minHeight="0",m.style.overflow="hidden"):m.style.display="none"}),l==="memory"&&Ts(),l==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))}),V()}),Ao(),Co();let a=null;document.addEventListener("sessions-changed",()=>{a&&clearTimeout(a),a=setTimeout(()=>{a=null,we({waitFresh:!1})},1200)}),document.addEventListener("router:home",qn),document.addEventListener("router:session",async({detail:{id:l,tab:d}})=>{let u=T.peek().find(b=>b.sessionId===l),m=Qe();await $e(l,u?.cwd||(m?.sessionId===l?m.cwd:null)||null,u?.configDir||(m?.sessionId===l?m.configDir:null)||null,u?.agent||(m?.sessionId===l?m.agent:null)||null,u?.machineId||(m?.sessionId===l?m.machineId:null)||null,{tab:d||"chat"})}),n.delegate.on("click","#btn-home",qn),n.delegate.on("click","#auth-btn",Ns),n.delegate.on("submit","#auth-form",l=>{l.preventDefault(),Ns()}),n.delegate.on("keydown","#auth-username, #auth-password",l=>{l.key==="Enter"&&Ns()}),n.delegate.on("click","#hamburger",()=>(0,n.$)("sidebar").classList.contains("open")?zn():To()),n.delegate.on("click","#sidebar-overlay",zn),n.delegate.on("input","#session-search",(l,d)=>{N.value=d.value,Hn(d.value)}),n.delegate.on("click","#session-filter-badge",()=>{U.value=null}),n.delegate.on("click","[data-ws-tab]",(l,d)=>{U.value=d.dataset.wsTab||null}),n.delegate.on("click","#sidebar-refresh",()=>{we(),N.peek().trim()&&Ms(N.peek())}),n.delegate.on("click","[data-view]",(l,d)=>{Me.value=d.dataset.view,localStorage.setItem("sidebarView",d.dataset.view)}),n.delegate.on("click","[data-agent-filter]",(l,d)=>{Z.value=d.dataset.agentFilter,localStorage.setItem("agentFilter",d.dataset.agentFilter),N.peek().trim()&&Hn(N.peek())}),n.delegate.on("change","#time-range",(l,d)=>{ne.value=d.value,localStorage.setItem("timeRange",d.value),we({waitFresh:!0}),N.peek().trim()&&Hn(N.peek())}),n.delegate.on("dblclick","[data-project-cwd]",(l,d)=>{let u=d.dataset.projectCwd;if(!u)return;let m=u.split("/").filter(Boolean).pop()||u;As({id:m,name:m,path:u}),g(`Project \xB7 ${u}`)}),n.delegate.on("click","#btn-pwa-install",async()=>{await ca()||Qi()}),document.addEventListener("pwa-installable",()=>{document.getElementById("btn-pwa-install")?.classList.remove("hidden")}),n.delegate.on("click","#btn-settings",Oa),n.delegate.on("click","#btn-meta-agent",()=>Va()),n.delegate.on("click","#btn-meta-agent-welcome",()=>ys("chat")),n.delegate.on("click","#btn-theme",jo),n.delegate.on("click","#btn-cal-prev",()=>{$s(-1),rt(ye())}),n.delegate.on("click","#btn-cal-next",()=>{$s(1),rt(ye())}),n.delegate.on("click","[data-cal-date]",(l,d)=>{lo(d.dataset.calDate),rt(ye())}),n.delegate.on("click","[data-session-id]",(l,d)=>{l.target.closest("[data-fav-toggle]")||l.target.closest("[data-hide-toggle]")||l.target.closest("[data-rename-session]")||l.target.closest(".session-rename-input")||l.target.closest(".session-title-wrap.session-rename-active")||($e(d.dataset.sessionId,d.dataset.sessionCwd||null,d.dataset.sessionConfigDir||null,d.dataset.sessionAgent||"claude",d.dataset.sessionMachine||null),Io())}),n.delegate.on("click","[data-rename-session]",(l,d)=>{l.preventDefault(),l.stopPropagation();let u=d.closest(".session-title-wrap")||d,m=u.dataset.renameSessionId||u.dataset.sessionId;m&&Cs({sessionId:m,agent:u.dataset.renameSessionAgent||"claude",machineId:u.dataset.renameSessionMachine||null,fallbackDisplay:u.dataset.renameSessionDisplay||"",mountEl:u})}),n.delegate.on("click","[data-rename-bar]",(l,d)=>{if(l.preventDefault(),l.stopPropagation(),!f.sessionId)return;let u=document.getElementById("session-title-display")||d;Cs({sessionId:f.sessionId,agent:f.agent||k.peek()||"claude",machineId:f.machineId||null,mountEl:u})}),n.delegate.on("click","[data-folder]",(l,d)=>{let u=d.dataset.folder,b=d.querySelector("span")?.textContent.trim()==="\u25BE",x=new Set(ct.peek()),W=new Set(dt.peek());b?(x.delete(u),W.add(u)):(x.add(u),W.delete(u)),(0,n.batch)(()=>{ct.value=x,dt.value=W})}),n.delegate.on("click","#memory-refresh",Ts),n.delegate.on("click","[data-tab]",(l,d)=>Ne(d.dataset.tab));let o=async(l,d)=>{let u=(0,n.$)(l),m=u?.value.trim();if(!m){d.value="";return}try{let b=await h("POST","/api/resolve-path",{path:m});if(b.isDir===!1)throw new Error("Path is not a directory on the target machine");d.value=b.path,u.value=b.path;let x=y.peek();x&&(y.value={...x,path:b.path})}catch(b){u.style.color="oklch(var(--er))",u.title=b.message,setTimeout(()=>{u.style.color="",u.title=""},2e3)}};n.delegate.on("click","#files-root-btn",()=>o("files-root-input",O)),n.delegate.on("click","#git-root-btn",()=>o("git-root-input",J)),n.delegate.on("keydown","#files-root-input",l=>{l.key==="Enter"&&o("files-root-input",O)}),n.delegate.on("keydown","#git-root-input",l=>{l.key==="Enter"&&o("git-root-input",J)}),n.delegate.on("click","#btn-opts",()=>{(0,n.$)("chat-opts").classList.toggle("hidden"),V()}),n.delegate.on("change","#sel-agent",(l,d)=>{let u=k.peek(),m=d.value;u!==m&&(f.sessionId=null,he(m),S.value=le(m)||S.peek(),localStorage.setItem("model",S.peek()),(0,n.$)("sel-permission").value=Le.peek(),ke(),g(`Agent \u2192 ${R[m]||m} \xB7 model ${S.peek()} \xB7 new session`))}),n.delegate.on("change","#sel-convert-agent",async(l,d)=>{let u=d.value;if(!u)return;let m=f.sessionId;if(!m){alert("No active session to convert."),d.value="";return}let b=f.agent||k.peek()||"claude";if(b===u){alert("Cannot convert to the same agent."),d.value="";return}d.disabled=!0,g(`Converting session ${m.slice(0,8)} from ${b} to ${u}...`);try{let x=await h("POST",`/api/sessions/${m}/convert`,{targetAgent:u,sourceAgent:b});x&&x.success?(g(`\u2713 Converted successfully. New session: ${x.targetSessionId.slice(0,8)}`),await we(),await $e(x.targetSessionId,y.peek()?.path||null,null,x.targetAgent),Sn()):g("Failed to convert session.")}catch(x){g(`Error converting session: ${x.message}`),alert(`Error converting session: ${x.message}`)}finally{d.disabled=!1,d.value=""}}),n.delegate.on("change","#sel-model",(l,d)=>{S.value=d.value,localStorage.setItem("model",d.value),Ls()}),n.delegate.on("click","#btn-model-add",()=>Es({editCurrent:!1})),n.delegate.on("click","#btn-model-edit",()=>Es({editCurrent:!0})),n.delegate.on("change","#sel-effort",(l,d)=>{ue.value=d.value}),n.delegate.on("change","#sel-permission",(l,d)=>{Le.value=d.value}),n.delegate.on("change","#sel-density",(l,d)=>{ss(d.value),g(`Density \u2192 ${d.value} (applies to new tool calls; reload session to re-group history)`)}),document.addEventListener("agent-changed",ke),n.delegate.on("click","#btn-new-session, #btn-new-session-welcome",Do),n.delegate.on("click","#new-session-cancel",()=>(0,n.$)("modal-new-session").close()),n.delegate.on("click","#new-session-start",Hs),n.delegate.on("change","#new-session-agent",Ps),n.delegate.on("keydown","#new-session-path",l=>{l.key==="Enter"&&Hs()}),n.delegate.on("click","#send-btn",Wt),n.delegate.on("click","#stop-btn",Ia),n.delegate.on("click","#btn-logout",()=>{f.token=null,localStorage.removeItem("token"),ee(null),Ce.value=!1,location.reload()}),n.delegate.on("click","[data-pick-machine]",async(l,d)=>{let u=d.dataset.pickMachine;if(!u||u===E.peek()){tn();return}await Mo(u,{forceReload:!0})});let i=async()=>{let l=(0,n.$)("machine-picker-status");if(l&&(l.textContent="\u5237\u65B0\u4E2D\u2026"),await Et(),js(),Wn(),lt(),l){let d=(D.peek()||[]).filter(u=>u.online!==!1).length;l.textContent=`${d} online`}};n.delegate.on("click","#btn-refresh-machines",i),n.delegate.on("click","#btn-refresh-machines-menu",async l=>{l.stopPropagation(),await i()}),n.delegate.on("click","#btn-machine-menu",async l=>{l.stopPropagation(),$t();let d=(0,n.$)("machine-menu");d&&(d.classList.contains("hidden")?(await Et(),Wn(),d.classList.remove("hidden")):d.classList.add("hidden"))}),n.delegate.on("click","#btn-recent-sessions",l=>{l.preventDefault(),l.stopPropagation(),tn(),ro(ye());let d=!(0,n.$)("recent-menu")?.classList.contains("hidden"),u=(0,n.$)("btn-recent-sessions");u&&u.setAttribute("aria-expanded",d?"true":"false")}),n.delegate.on("click","#recent-menu-backdrop",l=>{l.preventDefault(),l.stopPropagation(),$t(),(0,n.$)("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",l=>{let d=(0,n.$)("machine-menu-wrap");d&&!d.contains(l.target)&&tn();let u=(0,n.$)("recent-menu"),m=(0,n.$)("btn-recent-sessions"),b=l.target;if(u&&!u.classList.contains("hidden")){if(u.contains(b)||m?.contains(b))return;$t(),m?.setAttribute("aria-expanded","false")}}),window.addEventListener("resize",()=>{(0,n.$)("recent-menu")&&!(0,n.$)("recent-menu").classList.contains("hidden")&&ks()}),n.delegate.on("click","#recent-menu [data-session-id]",()=>{$t(),(0,n.$)("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),n.delegate.on("click","#btn-edit-project-notes, #project-goal-text, #project-notes-text",()=>{xo()}),n.delegate.on("click","#btn-cancel-project-notes",()=>{Lt()});let r=async()=>{let l=(0,n.$)("project-goal-input")?.value?.trim()??"",d=(0,n.$)("project-notes-input")?.value?.trim()??"",u=y.peek();if(!(!u||!u.path))try{let m=await h("POST","/api/projects/notes",{root:u.path,goal:l,notes:d});bo(m.goal||"",m.notes||""),Lt()}catch(m){alert(`Error saving project notes: ${m.message}`)}};n.delegate.on("click","#btn-save-project-notes",r),n.delegate.on("keydown","#project-goal-input",l=>{l.key==="Enter"&&r(),l.key==="Escape"&&Lt()}),n.delegate.on("keydown","#project-notes-input",l=>{l.key==="Escape"&&Lt()}),n.delegate.on("click","[data-fav-toggle]",(l,d)=>{l.stopPropagation(),l.preventDefault();let u=d.dataset.favSessionMachine||f.machineId;u&&(f.machineId=u,localStorage.setItem("machineId",u)),wo(d.dataset.favSessionId,d.dataset.favSessionAgent||"claude",{machineId:u||null})}),n.delegate.on("click","[data-hide-toggle]",(l,d)=>{l.stopPropagation(),l.preventDefault();let u=d.dataset.hideSessionMachine||f.machineId;u&&(f.machineId=u,localStorage.setItem("machineId",u)),ko(d.dataset.hideSessionId,d.dataset.hideSessionAgent||"claude",{machineId:u||null})}),n.delegate.on("click","#btn-edit-session-notes, #session-notes-text",()=>{vo()}),n.delegate.on("click","#btn-cancel-session-notes",()=>de()),n.delegate.on("click","#btn-save-session-notes",async()=>{let l=(0,n.$)("session-notes-input")?.value?.trim()||"";if(!f.sessionId)return;let d=f.agent||k.peek()||"claude";await Is(f.sessionId,d,l)&&de()}),n.delegate.on("keydown","#session-notes-input",async l=>{if(l.key==="Escape"&&de(),l.key==="Enter"){let d=l.target.value.trim();if(!f.sessionId)return;let u=f.agent||k.peek()||"claude";await Is(f.sessionId,u,d)&&de()}}),n.delegate.on("click","#btn-fav-filter",()=>{let l=!Re.peek();Re.value=l,localStorage.setItem("favoritesOnly",l?"1":"0"),(0,n.$)("btn-fav-filter")?.classList.toggle("active",l),l&&Be.peek()&&(Be.value=!1,localStorage.setItem("showHiddenOnly","0"),(0,n.$)("btn-hidden-filter")?.classList.remove("active"))}),n.delegate.on("click","#btn-hidden-filter",()=>{let l=!Be.peek();Be.value=l,localStorage.setItem("showHiddenOnly",l?"1":"0"),(0,n.$)("btn-hidden-filter")?.classList.toggle("active",l),l&&Re.peek()&&(Re.value=!1,localStorage.setItem("favoritesOnly","0"),(0,n.$)("btn-fav-filter")?.classList.remove("active"))}),ke(),(0,n.$)("sel-permission").value=Le.peek(),kn();let c=(0,n.$)("sel-density");c&&(c.value=Ie.peek()||"normal");let p=(0,n.$)("time-range");p&&(p.value=ne.peek()||"14"),document.querySelectorAll("[data-agent-filter]").forEach(l=>{l.classList.toggle("active",l.dataset.agentFilter===Z.peek())}),(0,n.$)("btn-fav-filter")?.classList.toggle("active",Re.peek()),(0,n.$)("btn-hidden-filter")?.classList.toggle("active",Be.peek()),document.querySelectorAll("[data-view]").forEach(l=>{let d=l.dataset.view===Me.peek();l.classList.toggle("bg-primary/15",d),l.classList.toggle("text-primary",d),l.classList.toggle("font-medium",d),l.classList.toggle("text-base-content/50",!d)})}vt();C();I();K();function Zi(e){let t=e.split(".").pop()?.toLowerCase();return{js:"\u{1F4C4}",ts:"\u{1F4C4}",jsx:"\u{1F4C4}",tsx:"\u{1F4C4}",py:"\u{1F40D}",md:"\u{1F4DD}",json:"\u2699\uFE0F",html:"\u{1F310}",css:"\u{1F3A8}",sh:"\u26A1",env:"\u{1F511}",docx:"\u{1F4D8}",pptx:"\u{1F4D9}",xlsx:"\u{1F4D7}",pdf:"\u{1F4D5}"}[t]||"\u{1F4C4}"}function er(e){let t=(e||"").split("/").pop()||"",s=t.lastIndexOf(".");return s>=0?t.slice(s+1).toLowerCase():""}function Po(e){let t=er(e);return t==="docx"||t==="pptx"||t==="xlsx"||t==="pdf"?t:null}function tr(e){return e==null?"":e>1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function nr(e){let t=atob(e),s=new Uint8Array(t.length);for(let a=0;a<t.length;a++)s[a]=t.charCodeAt(a);return s.buffer}var Us=new Map;function Jn(e){if(Us.has(e))return Us.get(e);let t=new Promise((s,a)=>{let o=document.querySelector(`script[data-src="${e}"]`);if(o){if(o.dataset.loaded==="1")return s();o.addEventListener("load",()=>s()),o.addEventListener("error",()=>a(new Error(`Failed to load ${e}`)));return}let i=document.createElement("script");i.src=e,i.async=!0,i.dataset.src=e,i.onload=()=>{i.dataset.loaded="1",s()},i.onerror=()=>a(new Error(`Failed to load ${e}`)),document.head.appendChild(i)});return Us.set(e,t),t}function sr(e){let s=((e||"").split("/").pop()||"").toLowerCase(),a={dockerfile:"dockerfile",makefile:"makefile",gemfile:"ruby",rakefile:"ruby",procfile:"yaml","cmakelists.txt":"cmake"};if(a[s])return a[s];let o=s.includes(".")?s.split(".").pop():"";return{js:"javascript",mjs:"javascript",cjs:"javascript",jsx:"javascript",ts:"typescript",tsx:"typescript",mts:"typescript",cts:"typescript",py:"python",pyw:"python",pyi:"python",rb:"ruby",go:"go",rs:"rust",java:"java",kt:"kotlin",kts:"kotlin",c:"c",h:"c",cpp:"cpp",cc:"cpp",cxx:"cpp",hpp:"cpp",hh:"cpp",cs:"csharp",swift:"swift",php:"php",scala:"scala",sh:"bash",bash:"bash",zsh:"bash",fish:"bash",ps1:"powershell",psm1:"powershell",html:"xml",htm:"xml",xhtml:"xml",xml:"xml",svg:"xml",css:"css",scss:"scss",less:"less",json:"json",jsonc:"json",json5:"json",yml:"yaml",yaml:"yaml",toml:"ini",ini:"ini",conf:"ini",env:"bash",md:"markdown",mdx:"markdown",markdown:"markdown",sql:"sql",graphql:"graphql",gql:"graphql",vue:"xml",svelte:"xml",r:"r",lua:"lua",pl:"perl",pm:"perl",dart:"dart",ex:"elixir",exs:"elixir",erl:"erlang",zig:"zig",nim:"nim",clj:"clojure",cljs:"clojure",diff:"diff",patch:"diff",dockerfile:"dockerfile"}[o]||""}function ar(e){!e||typeof hljs>"u"||e.querySelectorAll("pre code.file-preview-code").forEach(t=>{try{delete t.dataset.highlighted,hljs.highlightElement(t)}catch{}})}function nn(e,t,s){let a=tr(t);return`
860
876
  <div class="flex items-center gap-2 px-4 py-1.5 border-b border-base-300 flex-shrink-0 bg-base-200">
861
877
  <span class="text-xs text-base-content/40 flex-1 truncate">${(0,n.esc)(e)} \xB7 ${(0,n.esc)(a)}${s?` \xB7 <span class="text-primary/70">${(0,n.esc)(s)}</span>`:""}</span>
862
878
  <button type="button" class="btn btn-ghost btn-xs" data-download-path="${(0,n.esc)(e)}">\u2193 Download</button>
863
- </div>`}function Vi(e){return!Array.isArray(e)||!e.length?'<div class="p-4 text-xs text-base-content/40">Empty directory</div>':(e.sort((t,s)=>s.isDir-t.isDir||t.name.localeCompare(s.name)),e.map(t=>`
879
+ </div>`}function or(e){return!Array.isArray(e)||!e.length?'<div class="p-4 text-xs text-base-content/40">Empty directory</div>':(e.sort((t,s)=>s.isDir-t.isDir||t.name.localeCompare(s.name)),e.map(t=>`
864
880
  <div class="flex items-center gap-2 px-4 py-1.5 hover:bg-base-300 group"
865
881
  ${t.isDir?`data-dir-path="${(0,n.esc)(t.path)}"`:`data-file-path="${(0,n.esc)(t.path)}"`}>
866
- <span class="cursor-pointer flex-shrink-0">${t.isDir?"\u{1F4C1}":qi(t.name)}</span>
882
+ <span class="cursor-pointer flex-shrink-0">${t.isDir?"\u{1F4C1}":Zi(t.name)}</span>
867
883
  <span class="text-sm flex-1 truncate cursor-pointer ${t.isDir?"text-primary":""}">${(0,n.esc)(t.name)}</span>
868
884
  ${t.isDir?"":`
869
885
  <button type="button" class="file-row-action btn btn-ghost btn-xs px-1.5 text-base-content/50 hover:text-base-content"
870
886
  data-download-path="${(0,n.esc)(t.path)}" title="Download" aria-label="Download">\u2193</button>
871
887
  <button type="button" class="file-row-action btn btn-ghost btn-xs px-1.5 text-error/60 hover:text-error"
872
888
  data-delete-path="${(0,n.esc)(t.path)}" title="Delete" aria-label="Delete">\u2715</button>`}
873
- </div>`).join(""))}function Yi(e,t,s){let a=/[\x00-\x08\x0e-\x1f]/.test(t.slice(0,512)),o=Ji(e),i=o?`language-${(0,n.esc)(o)}`:"",r=a?`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${(0,n.esc)(e)}">Download</button></div>`:`<pre class="file-preview p-4 font-mono text-xs leading-relaxed overflow-auto flex-1 m-0"><code class="hljs file-preview-code ${i}">${(0,n.esc)(t)}</code></pre>`;return Xt(e,s,a?"binary":o||"text")+r}async function Xi(e){if(await qn("https://cdn.jsdelivr.net/npm/mammoth@1.8.0/mammoth.browser.min.js"),typeof mammoth>"u")throw new Error("mammoth failed to load");let t=await mammoth.convertToHtml({arrayBuffer:e});return`<div class="office-preview office-docx overflow-auto flex-1 p-4 md">${t.messages?.length?`<div class="office-warn text-xs text-warning/80 px-3 py-1">${t.messages.length} conversion note(s)</div>`:""}<div class="office-docx-body">${t.value||'<p class="text-base-content/40">Empty document</p>'}</div></div>`}async function Qi(e){if(await qn("https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js"),typeof XLSX>"u")throw new Error("SheetJS failed to load");let t=XLSX.read(new Uint8Array(e),{type:"array"}),s=t.SheetNames||[];if(!s.length)return'<div class="p-4 text-xs text-base-content/40">Empty workbook</div>';let a=s.map((i,r)=>`<button type="button" class="office-sheet-tab${r===0?" active":""}" data-sheet-idx="${r}">${(0,n.esc)(i)}</button>`).join(""),o=s.map((i,r)=>{let c=t.Sheets[i],p;try{p=XLSX.utils.sheet_to_html(c,{id:`xlsx-sheet-${r}`,editable:!1})}catch{p='<p class="text-base-content/40 text-xs p-2">Unable to render this sheet</p>'}return`<div class="office-sheet-pane${r===0?"":" hidden"}" data-sheet-pane="${r}">${p}</div>`}).join("");return`
889
+ </div>`).join(""))}function ir(e,t,s){let a=/[\x00-\x08\x0e-\x1f]/.test(t.slice(0,512)),o=sr(e),i=o?`language-${(0,n.esc)(o)}`:"",r=a?`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${(0,n.esc)(e)}">Download</button></div>`:`<pre class="file-preview p-4 font-mono text-xs leading-relaxed overflow-auto flex-1 m-0"><code class="hljs file-preview-code ${i}">${(0,n.esc)(t)}</code></pre>`;return nn(e,s,a?"binary":o||"text")+r}async function rr(e){if(await Jn("https://cdn.jsdelivr.net/npm/mammoth@1.8.0/mammoth.browser.min.js"),typeof mammoth>"u")throw new Error("mammoth failed to load");let t=await mammoth.convertToHtml({arrayBuffer:e});return`<div class="office-preview office-docx overflow-auto flex-1 p-4 md">${t.messages?.length?`<div class="office-warn text-xs text-warning/80 px-3 py-1">${t.messages.length} conversion note(s)</div>`:""}<div class="office-docx-body">${t.value||'<p class="text-base-content/40">Empty document</p>'}</div></div>`}async function lr(e){if(await Jn("https://cdn.sheetjs.com/xlsx-0.20.3/package/dist/xlsx.full.min.js"),typeof XLSX>"u")throw new Error("SheetJS failed to load");let t=XLSX.read(new Uint8Array(e),{type:"array"}),s=t.SheetNames||[];if(!s.length)return'<div class="p-4 text-xs text-base-content/40">Empty workbook</div>';let a=s.map((i,r)=>`<button type="button" class="office-sheet-tab${r===0?" active":""}" data-sheet-idx="${r}">${(0,n.esc)(i)}</button>`).join(""),o=s.map((i,r)=>{let c=t.Sheets[i],p;try{p=XLSX.utils.sheet_to_html(c,{id:`xlsx-sheet-${r}`,editable:!1})}catch{p='<p class="text-base-content/40 text-xs p-2">Unable to render this sheet</p>'}return`<div class="office-sheet-pane${r===0?"":" hidden"}" data-sheet-pane="${r}">${p}</div>`}).join("");return`
874
890
  <div class="office-preview office-xlsx flex flex-col flex-1 min-h-0 overflow-hidden">
875
891
  <div class="office-sheet-tabs flex gap-1 px-2 py-1.5 border-b border-base-300 overflow-x-auto flex-shrink-0 bg-base-200">${a}</div>
876
892
  <div class="office-sheet-body flex-1 overflow-auto p-2">${o}</div>
877
- </div>`}function Zi(e){let t=[],s=/<a:p[\s>][\s\S]*?<\/a:p>/g,a=/<a:t(?:\s[^>]*)?>([\s\S]*?)<\/a:t>/g,o,i=e.match(s)||[e];for(let r of i){let c=[];for(a.lastIndex=0;(o=a.exec(r))!==null;){let p=o[1].replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&quot;/g,'"').replace(/&apos;/g,"'");p&&c.push(p)}c.length&&t.push(c.join(""))}return t}async function er(e){if(await qn("https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js"),typeof JSZip>"u")throw new Error("JSZip failed to load");let t=await JSZip.loadAsync(e),s=Object.keys(t.files).filter(o=>/^ppt\/slides\/slide\d+\.xml$/i.test(o)).sort((o,i)=>{let r=parseInt(o.match(/slide(\d+)/i)?.[1]||"0",10),c=parseInt(i.match(/slide(\d+)/i)?.[1]||"0",10);return r-c});if(!s.length)return'<div class="p-4 text-xs text-base-content/40">No slides found in this presentation</div>';let a=[];for(let o=0;o<s.length;o++){let i=await t.files[s[o]].async("string"),r=Zi(i),c=r.length?r.map(p=>`<p>${(0,n.esc)(p)}</p>`).join(""):'<p class="text-base-content/40 italic">\uFF08\u6B64\u9875\u65E0\u53EF\u63D0\u53D6\u6587\u672C / \u53EF\u80FD\u4EE5\u56FE\u7247\u4E3A\u4E3B\uFF09</p>';a.push(`
893
+ </div>`}function cr(e){let t=[],s=/<a:p[\s>][\s\S]*?<\/a:p>/g,a=/<a:t(?:\s[^>]*)?>([\s\S]*?)<\/a:t>/g,o,i=e.match(s)||[e];for(let r of i){let c=[];for(a.lastIndex=0;(o=a.exec(r))!==null;){let p=o[1].replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&quot;/g,'"').replace(/&apos;/g,"'");p&&c.push(p)}c.length&&t.push(c.join(""))}return t}async function dr(e){if(await Jn("https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js"),typeof JSZip>"u")throw new Error("JSZip failed to load");let t=await JSZip.loadAsync(e),s=Object.keys(t.files).filter(o=>/^ppt\/slides\/slide\d+\.xml$/i.test(o)).sort((o,i)=>{let r=parseInt(o.match(/slide(\d+)/i)?.[1]||"0",10),c=parseInt(i.match(/slide(\d+)/i)?.[1]||"0",10);return r-c});if(!s.length)return'<div class="p-4 text-xs text-base-content/40">No slides found in this presentation</div>';let a=[];for(let o=0;o<s.length;o++){let i=await t.files[s[o]].async("string"),r=cr(i),c=r.length?r.map(p=>`<p>${(0,n.esc)(p)}</p>`).join(""):'<p class="text-base-content/40 italic">\uFF08\u6B64\u9875\u65E0\u53EF\u63D0\u53D6\u6587\u672C / \u53EF\u80FD\u4EE5\u56FE\u7247\u4E3A\u4E3B\uFF09</p>';a.push(`
878
894
  <article class="office-slide-card">
879
895
  <header class="office-slide-num">Slide ${o+1}</header>
880
896
  <div class="office-slide-body">${c}</div>
@@ -882,7 +898,7 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
882
898
  <div class="office-preview office-pptx overflow-auto flex-1 p-3 space-y-3">
883
899
  <p class="text-xs text-base-content/50 px-1">\u6587\u672C\u9884\u89C8\uFF08\u7248\u5F0F/\u56FE\u7247\u4E0D\u8FD8\u539F\uFF09\xB7 ${s.length} slide(s)</p>
884
900
  ${a.join("")}
885
- </div>`}async function tr(){if(await qn("https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"),typeof pdfjsLib>"u")throw new Error("pdf.js failed to load");return pdfjsLib.GlobalWorkerOptions.workerSrc="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js",pdfjsLib}async function nr(e){let s=await(await tr()).getDocument({data:e}).promise,a=s.numPages,o=Math.min(a,40),i=[];for(let c=1;c<=o;c++){let p=await s.getPage(c),l=p.getViewport({scale:1}),d=Math.min(1.5,820/l.width),u=p.getViewport({scale:d}),m=document.createElement("canvas");m.width=Math.floor(u.width),m.height=Math.floor(u.height),m.className="office-pdf-page",m.dataset.page=String(c),await p.render({canvasContext:m.getContext("2d"),viewport:u}).promise,i.push(`
901
+ </div>`}async function pr(){if(await Jn("https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"),typeof pdfjsLib>"u")throw new Error("pdf.js failed to load");return pdfjsLib.GlobalWorkerOptions.workerSrc="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js",pdfjsLib}async function ur(e){let s=await(await pr()).getDocument({data:e}).promise,a=s.numPages,o=Math.min(a,40),i=[];for(let c=1;c<=o;c++){let p=await s.getPage(c),l=p.getViewport({scale:1}),d=Math.min(1.5,820/l.width),u=p.getViewport({scale:d}),m=document.createElement("canvas");m.width=Math.floor(u.width),m.height=Math.floor(u.height),m.className="office-pdf-page",m.dataset.page=String(c),await p.render({canvasContext:m.getContext("2d"),viewport:u}).promise,i.push(`
886
902
  <figure class="office-pdf-figure">
887
903
  <figcaption class="office-pdf-cap">Page ${c} / ${a}</figcaption>
888
904
  ${m.outerHTML}
@@ -891,12 +907,12 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
891
907
  <p class="text-xs text-base-content/50 px-1">PDF preview \xB7 ${a} page(s)</p>
892
908
  ${r}
893
909
  ${i.join("")}
894
- </div>`}async function sr(e,t,s){let a=Eo(e),o={docx:"Word",pptx:"PowerPoint",xlsx:"Excel",pdf:"PDF"},i=zi(t),r;if(a==="docx")r=await Xi(i);else if(a==="xlsx")r=await Qi(i);else if(a==="pptx")r=await er(i);else if(a==="pdf")r=await nr(i);else throw new Error("Unsupported office type");return Xt(e,s,o[a]||a)+r}function ar(e,t){let s=e?e.split("/"):[],a=t?s.slice(0,-1):s,o='<span class="cursor-pointer text-primary hover:underline" data-dir-path="">root</span>',i="";for(let r of a)i=i?`${i}/${r}`:r,o+=` <span class="text-base-content/40">/</span> <span class="cursor-pointer text-primary hover:underline" data-dir-path="${(0,n.esc)(i)}">${(0,n.esc)(r)}</span>`;return t&&(o+=` <span class="text-base-content/40">/</span> <span>${(0,n.esc)(s.at(-1))}</span>`),o}function or(){let e=y.peek(),t=O.peek()||e?.path;if(!t)return;let s=document.createElement("input");s.type="file",s.multiple=!0,s.addEventListener("change",async()=>{let a=A.peek(),o=e?.id||"_",i=[...s.files],r=!1;for(let c of i){let p=a?`${a}/${c.name}`:c.name,l=`/api/projects/${o}/file?root=${encodeURIComponent(t)}&path=${encodeURIComponent(p)}`;try{let d=await fetch(l,{method:"POST",headers:Ue(),body:c,duplex:"half"});if(!d.ok){let u=await d.json().catch(()=>({}));throw new Error(u.error||`HTTP ${d.status}`)}}catch(d){alert(`Upload failed (${c.name}): ${d.message}`),r=!0;break}}if(!r){let c=A.peek();A.value=c+"\0",A.value=c}}),s.click()}async function ir(e,t){let s=O.peek()||e?.path||"";if(!s){alert("No path selected \u2014 set root first");return}let a=e?.id||"_",o=(t||"").split("/").pop()||"download",i=new URLSearchParams({root:s,path:t,download:"true"}),r=`/api/projects/${a}/file?${i}`;try{let c=await fetch(r,{headers:Ue(),credentials:"same-origin"});if(!c.ok){let u=await c.json().catch(()=>({}));throw new Error(u.error||`HTTP ${c.status}`)}let p=await c.blob(),l=URL.createObjectURL(p),d=document.createElement("a");d.href=l,d.download=o,d.rel="noopener",d.style.display="none",document.body.appendChild(d),d.click(),d.remove(),setTimeout(()=>URL.revokeObjectURL(l),6e4)}catch(c){try{let p=`/api/projects/${a}/file?${Zs({root:s,path:t,download:"true"})}`,l=document.createElement("a");l.href=p,l.download=o,l.rel="noopener",l.target="_blank",document.body.appendChild(l),l.click(),l.remove()}catch{alert(`Download failed: ${c.message}`)}}}async function rr(e,t){if(!confirm(`Delete "${t.split("/").pop()}"?`))return;let s=O.peek()||e?.path||"",a=e?.id||"_";try{await h("DELETE",`/api/projects/${a}/file?root=${encodeURIComponent(s)}&path=${encodeURIComponent(t)}`),A.value=A.peek()+" ",A.value=A.peek().trimEnd()}catch(o){alert(`Delete failed: ${o.message}`)}}async function lr(e,t,s,a){let o=s.size??(typeof s.content=="string"?s.content.length:0),i=Eo(t);if(i&&s.encoding==="base64"){e.innerHTML=Xt(t,o,i)+`<div class="p-4 text-xs text-base-content/40">Parsing ${i.toUpperCase()}\u2026</div>`;try{let r=await sr(t,s.content,o);if(a.aborted)return;e.innerHTML=r}catch(r){if(a.aborted)return;e.innerHTML=Xt(t,o,i)+`<div class="p-4 text-xs text-error">Preview failed: ${(0,n.esc)(r.message)} \u2014 <button class="text-primary hover:underline" data-download-path="${(0,n.esc)(t)}">Download</button></div>`}return}if(s.encoding==="base64"){e.innerHTML=Xt(t,o,"binary")+`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${(0,n.esc)(t)}">Download</button></div>`;return}e.innerHTML=Yi(t,s.content||"",o),Ki(e)}function Io(){(0,n.effect)(()=>{let e=(0,n.$)("files-breadcrumb");if(!e)return;let t=F.value!==null;e.innerHTML=`
895
- ${ar(F.value??A.value,t)}
910
+ </div>`}async function fr(e,t,s){let a=Po(e),o={docx:"Word",pptx:"PowerPoint",xlsx:"Excel",pdf:"PDF"},i=nr(t),r;if(a==="docx")r=await rr(i);else if(a==="xlsx")r=await lr(i);else if(a==="pptx")r=await dr(i);else if(a==="pdf")r=await ur(i);else throw new Error("Unsupported office type");return nn(e,s,o[a]||a)+r}function mr(e,t){let s=e?e.split("/"):[],a=t?s.slice(0,-1):s,o='<span class="cursor-pointer text-primary hover:underline" data-dir-path="">root</span>',i="";for(let r of a)i=i?`${i}/${r}`:r,o+=` <span class="text-base-content/40">/</span> <span class="cursor-pointer text-primary hover:underline" data-dir-path="${(0,n.esc)(i)}">${(0,n.esc)(r)}</span>`;return t&&(o+=` <span class="text-base-content/40">/</span> <span>${(0,n.esc)(s.at(-1))}</span>`),o}function hr(){let e=y.peek(),t=O.peek()||e?.path;if(!t)return;let s=document.createElement("input");s.type="file",s.multiple=!0,s.addEventListener("change",async()=>{let a=A.peek(),o=e?.id||"_",i=[...s.files],r=!1;for(let c of i){let p=a?`${a}/${c.name}`:c.name,l=`/api/projects/${o}/file?root=${encodeURIComponent(t)}&path=${encodeURIComponent(p)}`;try{let d=await fetch(l,{method:"POST",headers:Fe(),body:c,duplex:"half"});if(!d.ok){let u=await d.json().catch(()=>({}));throw new Error(u.error||`HTTP ${d.status}`)}}catch(d){alert(`Upload failed (${c.name}): ${d.message}`),r=!0;break}}if(!r){let c=A.peek();A.value=c+"\0",A.value=c}}),s.click()}async function br(e,t){let s=O.peek()||e?.path||"";if(!s){alert("No path selected \u2014 set root first");return}let a=e?.id||"_",o=(t||"").split("/").pop()||"download",i=new URLSearchParams({root:s,path:t,download:"true"}),r=`/api/projects/${a}/file?${i}`;try{let c=await fetch(r,{headers:Fe(),credentials:"same-origin"});if(!c.ok){let u=await c.json().catch(()=>({}));throw new Error(u.error||`HTTP ${c.status}`)}let p=await c.blob(),l=URL.createObjectURL(p),d=document.createElement("a");d.href=l,d.download=o,d.rel="noopener",d.style.display="none",document.body.appendChild(d),d.click(),d.remove(),setTimeout(()=>URL.revokeObjectURL(l),6e4)}catch(c){try{let p=`/api/projects/${a}/file?${oa({root:s,path:t,download:"true"})}`,l=document.createElement("a");l.href=p,l.download=o,l.rel="noopener",l.target="_blank",document.body.appendChild(l),l.click(),l.remove()}catch{alert(`Download failed: ${c.message}`)}}}async function gr(e,t){if(!confirm(`Delete "${t.split("/").pop()}"?`))return;let s=O.peek()||e?.path||"",a=e?.id||"_";try{await h("DELETE",`/api/projects/${a}/file?root=${encodeURIComponent(s)}&path=${encodeURIComponent(t)}`),A.value=A.peek()+" ",A.value=A.peek().trimEnd()}catch(o){alert(`Delete failed: ${o.message}`)}}async function xr(e,t,s,a){let o=s.size??(typeof s.content=="string"?s.content.length:0),i=Po(t);if(i&&s.encoding==="base64"){e.innerHTML=nn(t,o,i)+`<div class="p-4 text-xs text-base-content/40">Parsing ${i.toUpperCase()}\u2026</div>`;try{let r=await fr(t,s.content,o);if(a.aborted)return;e.innerHTML=r}catch(r){if(a.aborted)return;e.innerHTML=nn(t,o,i)+`<div class="p-4 text-xs text-error">Preview failed: ${(0,n.esc)(r.message)} \u2014 <button class="text-primary hover:underline" data-download-path="${(0,n.esc)(t)}">Download</button></div>`}return}if(s.encoding==="base64"){e.innerHTML=nn(t,o,"binary")+`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${(0,n.esc)(t)}">Download</button></div>`;return}e.innerHTML=ir(t,s.content||"",o),ar(e)}function Ho(){(0,n.effect)(()=>{let e=(0,n.$)("files-breadcrumb");if(!e)return;let t=F.value!==null;e.innerHTML=`
911
+ ${mr(F.value??A.value,t)}
896
912
  <div class="flex-1"></div>
897
- ${t?"":'<button id="btn-upload" class="btn btn-ghost btn-xs text-base-content/50 hover:text-base-content">\u2191 Upload</button>'}`}),(0,n.asyncEffect)(async e=>{let t=j.value,s=y.value,a=(O.value||s?.path||"").trim(),o=F.value,i=A.value,r=(0,n.$)("files-area");if(!r||t!=="files")return;if(!a){r.innerHTML='<div class="p-4 text-xs text-base-content/40">No path yet \u2014 open a session (uses that machine&apos;s cwd) or type an absolute path and press Go.</div>';return}let c=s?.id||"_";r.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{if(o!==null){let d=await h("GET",`/api/projects/${c}/file?root=${encodeURIComponent(a)}&path=${encodeURIComponent(o)}`,void 0,e);e.aborted||await lr(r,o,d,e);return}let p=await h("GET",`/api/projects/${c}/files?root=${encodeURIComponent(a)}&path=${encodeURIComponent(i)}`,void 0,e);if(e.aborted)return;let l=Array.isArray(p)?p:Array.isArray(p?.files)?p.files:null;if(!l){r.innerHTML=`<div class="p-4 text-xs text-error">${(0,n.esc)(p?.error||"Invalid directory listing")}</div>`;return}r.innerHTML=Vi(l)}catch(p){!e.aborted&&p?.name!=="AbortError"&&(r.innerHTML=`<div class="p-4 text-xs text-error">${(0,n.esc)(p.message)}</div>`)}}),n.delegate.on("click","[data-dir-path]",(e,t)=>{F.value=null,A.value=t.dataset.dirPath}),n.delegate.on("click","[data-file-path]",(e,t)=>{F.value=t.dataset.filePath}),n.delegate.on("click","#btn-upload",()=>or()),n.delegate.on("click","[data-download-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let s=t.dataset.downloadPath;s&&ir(y.peek(),s)}),n.delegate.on("click","[data-delete-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let s=t.dataset.deletePath;s&&rr(y.peek(),s)}),n.delegate.on("click",".office-sheet-tab",(e,t)=>{let s=t.closest(".office-xlsx");if(!s)return;let a=t.dataset.sheetIdx;s.querySelectorAll(".office-sheet-tab").forEach(o=>o.classList.toggle("active",o===t)),s.querySelectorAll(".office-sheet-pane").forEach(o=>{o.classList.toggle("hidden",o.dataset.sheetPane!==a)})})}C();I();K();var Co=(0,n.signal)(!1);function cr(e){return e?e.split(`
913
+ ${t?"":'<button id="btn-upload" class="btn btn-ghost btn-xs text-base-content/50 hover:text-base-content">\u2191 Upload</button>'}`}),(0,n.asyncEffect)(async e=>{let t=j.value,s=y.value,a=(O.value||s?.path||"").trim(),o=F.value,i=A.value,r=(0,n.$)("files-area");if(!r||t!=="files")return;if(!a){r.innerHTML='<div class="p-4 text-xs text-base-content/40">No path yet \u2014 open a session (uses that machine&apos;s cwd) or type an absolute path and press Go.</div>';return}let c=s?.id||"_";r.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{if(o!==null){let d=await h("GET",`/api/projects/${c}/file?root=${encodeURIComponent(a)}&path=${encodeURIComponent(o)}`,void 0,e);e.aborted||await xr(r,o,d,e);return}let p=await h("GET",`/api/projects/${c}/files?root=${encodeURIComponent(a)}&path=${encodeURIComponent(i)}`,void 0,e);if(e.aborted)return;let l=Array.isArray(p)?p:Array.isArray(p?.files)?p.files:null;if(!l){r.innerHTML=`<div class="p-4 text-xs text-error">${(0,n.esc)(p?.error||"Invalid directory listing")}</div>`;return}r.innerHTML=or(l)}catch(p){!e.aborted&&p?.name!=="AbortError"&&(r.innerHTML=`<div class="p-4 text-xs text-error">${(0,n.esc)(p.message)}</div>`)}}),n.delegate.on("click","[data-dir-path]",(e,t)=>{F.value=null,A.value=t.dataset.dirPath}),n.delegate.on("click","[data-file-path]",(e,t)=>{F.value=t.dataset.filePath}),n.delegate.on("click","#btn-upload",()=>hr()),n.delegate.on("click","[data-download-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let s=t.dataset.downloadPath;s&&br(y.peek(),s)}),n.delegate.on("click","[data-delete-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let s=t.dataset.deletePath;s&&gr(y.peek(),s)}),n.delegate.on("click",".office-sheet-tab",(e,t)=>{let s=t.closest(".office-xlsx");if(!s)return;let a=t.dataset.sheetIdx;s.querySelectorAll(".office-sheet-tab").forEach(o=>o.classList.toggle("active",o===t)),s.querySelectorAll(".office-sheet-pane").forEach(o=>{o.classList.toggle("hidden",o.dataset.sheetPane!==a)})})}C();I();K();var No=(0,n.signal)(!1);function vr(e){return e?e.split(`
898
914
  `).map(t=>(0,n.esc)(t).replace(/\b([0-9a-f]{7})\b/,'<span class="gh">$1</span>').replace(/\(([^)]*)\)/,'<span style="color:oklch(var(--wa))">($1)</span>')).join(`
899
- `):'<span class="text-base-content/40">No commits</span>'}function dr(e){if(!e)return"";if(!e.isGit)return'<div class="p-4 text-sm text-base-content/50">Not a git repository</div>';let t={M:"text-warning",D:"text-error"};return`
915
+ `):'<span class="text-base-content/40">No commits</span>'}function yr(e){if(!e)return"";if(!e.isGit)return'<div class="p-4 text-sm text-base-content/50">Not a git repository</div>';let t={M:"text-warning",D:"text-error"};return`
900
916
  <div class="px-4 py-2 text-xs text-base-content/50 border-b border-base-300">
901
917
  Branch: <span class="text-success font-semibold">${(0,n.esc)(e.branch)}</span>
902
918
  </div>
@@ -922,16 +938,16 @@ Available: ${p}`:""}`),!0}let o=ti[a.toLowerCase()]||a,i=S.peek()||"claude",r=fe
922
938
  <span class="text-base-content/40">Loading\u2026</span>
923
939
  </div>
924
940
  </div>
925
- </div>`}function pr(e){return e.split(`
941
+ </div>`}function wr(e){return e.split(`
926
942
  `).map(t=>t.startsWith("+")&&!t.startsWith("+++")?`<span class="diff-add">${(0,n.esc)(t)}</span>`:t.startsWith("-")&&!t.startsWith("---")?`<span class="diff-del">${(0,n.esc)(t)}</span>`:t.startsWith("@@")?`<span class="diff-hunk">${(0,n.esc)(t)}</span>`:/^(diff |index |---|[+]{3})/.test(t)?`<span class="diff-head">${(0,n.esc)(t)}</span>`:`<span>${(0,n.esc)(t)}</span>`).join(`
927
- `)}function Ao(){(0,n.asyncEffect)(async e=>{let t=j.value,s=y.value,a=J.value||s?.path,o=(0,n.$)("git-area");if(!o||t!=="git")return;if(!a){o.innerHTML='<div class="p-4 text-sm text-base-content/50">Enter a project root above, or open a session with a working directory.</div>';return}let i=s?.id||"_";o.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let r=await h("GET",`/api/projects/${i}/git/status?root=${encodeURIComponent(a)}`,void 0,e);e.aborted||(o.innerHTML=dr(r))}catch(r){!e.aborted&&r?.name!=="AbortError"&&(o.innerHTML=`<div class="p-4 text-xs text-error">${(0,n.esc)(r?.message??String(r))}</div>`)}}),(0,n.asyncEffect)(async e=>{let t=y.value,s=J.value||t?.path,a=Co.value,o=(0,n.$)("diff-content");if(!o||!s)return;let i=t?.id||"_";try{let r=await h("GET",`/api/projects/${i}/git/diff?root=${encodeURIComponent(s)}${a?"&staged=true":""}`,void 0,e);e.aborted||(o.innerHTML=r?.diff?pr(r.diff):'<span class="text-base-content/40">No changes</span>')}catch(r){!e.aborted&&r?.name!=="AbortError"&&(o.innerHTML=`<span class="text-error">${(0,n.esc)(r?.message??String(r))}</span>`)}}),n.delegate.on("click","#diff-unstaged, #diff-staged",(e,t)=>{let s=t.id==="diff-staged";Co.value=s,(0,n.$)("diff-unstaged").className=`cursor-pointer ${s?"text-base-content/50":"text-primary"}`,(0,n.$)("diff-staged").className=`cursor-pointer ${s?"text-primary":"text-base-content/50"}`}),n.delegate.on("click","#git-graph-toggle",()=>{let e=(0,n.$)("git-graph-panel"),t=(0,n.$)("git-graph-chevron"),s=e.classList.toggle("hidden");t.textContent=s?"\u25B6":"\u25BC",s||ur()})}function ur(){let e=y.peek(),t=J.peek()||e?.path,s=(0,n.$)("git-graph-content");if(!t||!s)return;let a=e?.id||"_";s.innerHTML='<span class="text-base-content/40">Loading\u2026</span>',h("GET",`/api/projects/${a}/git/log?root=${encodeURIComponent(t)}`).then(o=>{s.innerHTML=o.graph?cr(o.graph):'<span class="text-base-content/40">No commits</span>'}).catch(o=>{s.innerHTML=`<span class="text-error">${(0,n.esc)(o.message)}</span>`})}C();I();var Y=null,M=null,Wn=null,en=!1,Gn=null,Do=null,Qt=0,Zt=null,Hs=!1;function _o(){if(M)return;let e=(0,n.$)("terminal-container");if(e){if(typeof Terminal>"u"){setTimeout(_o,100);return}M=new Terminal({cursorBlink:!0,fontFamily:"Fira Code, Courier New, monospace",fontSize:12,theme:{background:"#0d1117",foreground:"#c9d1d9",cursor:"#58a6ff",black:"#0d1117",red:"#ff7b72",green:"#3fb950",yellow:"#d29922",blue:"#58a6ff",magenta:"#bc8cff",cyan:"#39c5cf",white:"#b1bac4",brightBlack:"#484f58",brightRed:"#ffa198",brightGreen:"#56d364",brightYellow:"#e3b341",brightBlue:"#79c0ff",brightMagenta:"#d8b9ff",brightCyan:"#56d4dd",brightWhite:"#ffffff"}}),typeof FitAddon<"u"&&(Wn=new FitAddon.FitAddon,M.loadAddon(Wn)),M.open(e),Ps(),M.onData(t=>{Y&&Y.readyState===WebSocket.OPEN&&Y.send(JSON.stringify({type:"input",data:t}))}),window.addEventListener("resize",()=>{Ps(),Ns()})}}function Ps(){try{Wn&&M&&Wn.fit()}catch{}}function Ns(){Y&&Y.readyState===WebSocket.OPEN&&M&&Y.send(JSON.stringify({type:"resize",cols:M.cols,rows:M.rows}))}function Ho(){return f.machineId||T.peek()||null}function zn(e){Zt&&(clearTimeout(Zt),Zt=null),Hs=!0;let t=++Qt;if(Y){try{Y.close()}catch{}Y=null}en=!1;let s=location.protocol==="https:"?"wss":"ws",a=M?M.cols:80,o=M?M.rows:24,i=new URLSearchParams;f.token&&i.set("token",f.token),e&&i.set("cwd",e),i.set("cols",String(a)),i.set("rows",String(o));let r=Ho();k.peek()&&r&&i.set("machine",r),Gn=e||null,Do=r,Y=new WebSocket(`${s}://${location.host}/ws/shell?${i}`),Y.addEventListener("open",()=>{t===Qt&&(en=!0,M?.write(`\x1B[32mConnected to interactive terminal\x1B[0m\r
928
- `),Ns())}),Y.addEventListener("message",c=>{if(t!==Qt)return;let p;try{p=JSON.parse(c.data)}catch{return}p.type==="output"?M?.write(p.data):p.type==="exit"?M?.write(`\r
943
+ `)}function Ro(){(0,n.asyncEffect)(async e=>{let t=j.value,s=y.value,a=J.value||s?.path,o=(0,n.$)("git-area");if(!o||t!=="git")return;if(!a){o.innerHTML='<div class="p-4 text-sm text-base-content/50">Enter a project root above, or open a session with a working directory.</div>';return}let i=s?.id||"_";o.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let r=await h("GET",`/api/projects/${i}/git/status?root=${encodeURIComponent(a)}`,void 0,e);e.aborted||(o.innerHTML=yr(r))}catch(r){!e.aborted&&r?.name!=="AbortError"&&(o.innerHTML=`<div class="p-4 text-xs text-error">${(0,n.esc)(r?.message??String(r))}</div>`)}}),(0,n.asyncEffect)(async e=>{let t=y.value,s=J.value||t?.path,a=No.value,o=(0,n.$)("diff-content");if(!o||!s)return;let i=t?.id||"_";try{let r=await h("GET",`/api/projects/${i}/git/diff?root=${encodeURIComponent(s)}${a?"&staged=true":""}`,void 0,e);e.aborted||(o.innerHTML=r?.diff?wr(r.diff):'<span class="text-base-content/40">No changes</span>')}catch(r){!e.aborted&&r?.name!=="AbortError"&&(o.innerHTML=`<span class="text-error">${(0,n.esc)(r?.message??String(r))}</span>`)}}),n.delegate.on("click","#diff-unstaged, #diff-staged",(e,t)=>{let s=t.id==="diff-staged";No.value=s,(0,n.$)("diff-unstaged").className=`cursor-pointer ${s?"text-base-content/50":"text-primary"}`,(0,n.$)("diff-staged").className=`cursor-pointer ${s?"text-primary":"text-base-content/50"}`}),n.delegate.on("click","#git-graph-toggle",()=>{let e=(0,n.$)("git-graph-panel"),t=(0,n.$)("git-graph-chevron"),s=e.classList.toggle("hidden");t.textContent=s?"\u25B6":"\u25BC",s||kr()})}function kr(){let e=y.peek(),t=J.peek()||e?.path,s=(0,n.$)("git-graph-content");if(!t||!s)return;let a=e?.id||"_";s.innerHTML='<span class="text-base-content/40">Loading\u2026</span>',h("GET",`/api/projects/${a}/git/log?root=${encodeURIComponent(t)}`).then(o=>{s.innerHTML=o.graph?vr(o.graph):'<span class="text-base-content/40">No commits</span>'}).catch(o=>{s.innerHTML=`<span class="text-error">${(0,n.esc)(o.message)}</span>`})}C();I();var X=null,M=null,Kn=null,on=!1,Vn=null,Uo=null,sn=0,an=null,Fs=!1;function Fo(){if(M)return;let e=(0,n.$)("terminal-container");if(e){if(typeof Terminal>"u"){setTimeout(Fo,100);return}M=new Terminal({cursorBlink:!0,fontFamily:"Fira Code, Courier New, monospace",fontSize:12,theme:{background:"#0d1117",foreground:"#c9d1d9",cursor:"#58a6ff",black:"#0d1117",red:"#ff7b72",green:"#3fb950",yellow:"#d29922",blue:"#58a6ff",magenta:"#bc8cff",cyan:"#39c5cf",white:"#b1bac4",brightBlack:"#484f58",brightRed:"#ffa198",brightGreen:"#56d364",brightYellow:"#e3b341",brightBlue:"#79c0ff",brightMagenta:"#d8b9ff",brightCyan:"#56d4dd",brightWhite:"#ffffff"}}),typeof FitAddon<"u"&&(Kn=new FitAddon.FitAddon,M.loadAddon(Kn)),M.open(e),Os(),M.onData(t=>{X&&X.readyState===WebSocket.OPEN&&X.send(JSON.stringify({type:"input",data:t}))}),window.addEventListener("resize",()=>{Os(),qs()})}}function Os(){try{Kn&&M&&Kn.fit()}catch{}}function qs(){X&&X.readyState===WebSocket.OPEN&&M&&X.send(JSON.stringify({type:"resize",cols:M.cols,rows:M.rows}))}function Oo(){return f.machineId||E.peek()||null}function Yn(e){an&&(clearTimeout(an),an=null),Fs=!0;let t=++sn;if(X){try{X.close()}catch{}X=null}on=!1;let s=location.protocol==="https:"?"wss":"ws",a=M?M.cols:80,o=M?M.rows:24,i=new URLSearchParams;f.token&&i.set("token",f.token),e&&i.set("cwd",e),i.set("cols",String(a)),i.set("rows",String(o));let r=Oo();$.peek()&&r&&i.set("machine",r),Vn=e||null,Uo=r,X=new WebSocket(`${s}://${location.host}/ws/shell?${i}`),X.addEventListener("open",()=>{t===sn&&(on=!0,M?.write(`\x1B[32mConnected to interactive terminal\x1B[0m\r
944
+ `),qs())}),X.addEventListener("message",c=>{if(t!==sn)return;let p;try{p=JSON.parse(c.data)}catch{return}p.type==="output"?M?.write(p.data):p.type==="exit"?M?.write(`\r
929
945
  \x1B[33m[process exited: ${p.code}]\x1B[0m\r
930
946
  `):p.type==="error"&&M?.write(`\r
931
947
  \x1B[31m[error: ${p.data||p.message||""}]\x1B[0m\r
932
- `)}),Y.addEventListener("close",()=>{t===Qt&&(en=!1,M?.write(`\r
948
+ `)}),X.addEventListener("close",()=>{t===sn&&(on=!1,M?.write(`\r
933
949
  \x1B[33m[disconnected]\x1B[0m\r
934
- `),!(!Hs||j.peek()!=="shell")&&(M?.write(`\x1B[33m[reconnecting\u2026]\x1B[0m\r
935
- `),Zt=setTimeout(()=>{Zt=null,zn(Gn)},1500)))}),Y.addEventListener("error",()=>{t===Qt&&M?.write(`\r
950
+ `),!(!Fs||j.peek()!=="shell")&&(M?.write(`\x1B[33m[reconnecting\u2026]\x1B[0m\r
951
+ `),an=setTimeout(()=>{an=null,Yn(Vn)},1500)))}),X.addEventListener("error",()=>{t===sn&&M?.write(`\r
936
952
  \x1B[31m[WebSocket error]\x1B[0m\r
937
- `)})}function jo(){let e=y.peek()?.path,t=(0,n.$)("term-cwd");t&&(t.textContent=e||"~"),M||_o(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{Ps();let s=Ho();!en||Gn!==(e||null)||Do!==s?(M?.clear(),zn(e)):Ns()})})}function Po(){document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(j.peek()!=="shell"||!Hs||en||zn(Gn))}),(0,n.watch)(j,e=>{e==="shell"&&jo()}),document.addEventListener("shell-tab-shown",()=>{j.peek()==="shell"&&jo()}),document.getElementById("term-reconnect")?.addEventListener("click",()=>{M?.clear(),zn(y.peek()?.path)})}ht();wn();function Rs(){let e=document.documentElement;e.classList.add("boot-ready"),e.classList.remove("boot-pending")}function Jn(){document.documentElement.classList.remove("boot-restore")}var Us=ps(location.hash.slice(1)||"/"),No=Ds()||!!(f.token&&Us?.id);Mo({restoreSession:No});Ta();Io();Ao();Da();Po();Sa();za();Ea(ke,He);(async()=>{let e=dt();if(f.token)try{let t=document.getElementById("auth-screen"),s=document.getElementById("app");if(t&&(t.style.display="none",t.classList.add("hidden")),s&&(s.style.display="flex",s.classList.remove("hidden")),No){document.documentElement.classList.add("boot-restore");let o=document.getElementById("welcome"),i=document.getElementById("project-view");o&&(o.classList.add("hidden"),o.style.display="none"),i&&(i.classList.remove("hidden"),i.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden")}let a=await e;await Fn({hub:a,deepLink:Us}),Us?.id||(Ia(),(location.hash||"").startsWith("#/session/")||Jn()),requestAnimationFrame(()=>{requestAnimationFrame(Rs)})}catch(t){console.error("[boot]",t),f.token=null,localStorage.removeItem("token"),Jn(),await js(),Rs()}else Jn(),await js(),Rs()})();document.addEventListener("router:home",()=>{Jn()});na();
953
+ `)})}function Bo(){let e=y.peek()?.path,t=(0,n.$)("term-cwd");t&&(t.textContent=e||"~"),M||Fo(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{Os();let s=Oo();!on||Vn!==(e||null)||Uo!==s?(M?.clear(),Yn(e)):qs()})})}function qo(){document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(j.peek()!=="shell"||!Fs||on||Yn(Vn))}),(0,n.watch)(j,e=>{e==="shell"&&Bo()}),document.addEventListener("shell-tab-shown",()=>{j.peek()==="shell"&&Bo()}),document.getElementById("term-reconnect")?.addEventListener("click",()=>{M?.clear(),Yn(y.peek()?.path)})}vt();Ln();function Ws(){let e=document.documentElement;e.classList.add("boot-ready"),e.classList.remove("boot-pending")}function Xn(){document.documentElement.classList.remove("boot-restore")}var Gs=bs(location.hash.slice(1)||"/"),Wo=Bs()||!!(f.token&&Gs?.id);_o({restoreSession:Wo});da();_a();Ho();Ro();Fa();qo();ja();eo();Ha($e,Ne);(async()=>{let e=ft();if(f.token)try{let t=document.getElementById("auth-screen"),s=document.getElementById("app");if(t&&(t.style.display="none",t.classList.add("hidden")),s&&(s.style.display="flex",s.classList.remove("hidden")),Wo){document.documentElement.classList.add("boot-restore");let o=document.getElementById("welcome"),i=document.getElementById("project-view");o&&(o.classList.add("hidden"),o.style.display="none"),i&&(i.classList.remove("hidden"),i.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden")}let a=await e;await Gn({hub:a,deepLink:Gs}),Gs?.id||(Na(),(location.hash||"").startsWith("#/session/")||Xn()),requestAnimationFrame(()=>{requestAnimationFrame(Ws)})}catch(t){console.error("[boot]",t),f.token=null,localStorage.removeItem("token"),Xn(),await Rs(),Ws()}else{Xn();try{await Rs()}catch(t){console.error("[boot auth]",t)}finally{Ws()}}})();document.addEventListener("router:home",()=>{Xn()});la();