claude-simple 0.2.31 → 0.2.32

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,11 +1,11 @@
1
- var $d=Object.defineProperty;var F=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(s){throw n=[s],s}};var ls=(e,t)=>{for(var n in t)$d(e,n,{get:t[n],enumerable:!0})};function Ld(){Ho||(Ho=!0,queueMicrotask(()=>{Ho=!1,Oo()}))}function wi(e){for(let t of e)(t._isComputed?En:In).add(t);Ro>0||na||(Sd==="microtask"?Ld():Oo())}function $i(e,t,n,s){let a=new Set(n);for(let r of n)r._subs.delete(t);n.clear(),s?.forEach(r=>r?.()),s?.splice(0);let o=[Gt,us,No];[Gt,us,No]=[t,n,s];try{return e()}catch(r){for(let d of a)d._subs.add(t),n.add(d);throw r}finally{[Gt,us,No]=o}}var Gt,us,Ro,No,En,In,na,cs,Po,Sd,Ho,Oo,ki,I,Bo,je,xe,De,Tn,Ed,p,b,Si,i,qo,Id,ot,ds,Td,sa,Cd,Of,aa,Bf,Uf,Li,Ei=F(()=>{Gt=null,us=null,Ro=0,No=null,En=new Set,In=new Set,na=!1,cs=1e4,Po={flushes:0,runs:0,lastFlushRuns:0},Sd="sync",Ho=!1;Oo=()=>{if(na)return;na=!0;let e=0;Po.flushes++;try{for(;En.size||In.size;){for(;En.size;){let t=En.values().next().value;if(En.delete(t),++e>cs)throw new Error(`mini-react: reactive update loop exceeded ${cs} runs`);t()}if(In.size){let t=In.values().next().value;if(In.delete(t),++e>cs)throw new Error(`mini-react: reactive update loop exceeded ${cs} runs`);t()}}}finally{Po.runs+=e,Po.lastFlushRuns=e,e>cs&&(En.clear(),In.clear()),na=!1}};ki=class{constructor(e,t){this._v=e,this._subs=new Set,this._eq=t??((n,s)=>n===s)}get value(){return Gt&&(this._subs.add(Gt),us?.add(this)),this._v}set value(e){this._eq(e,this._v)||(this._v=e,wi(this._subs))}peek(){return this._v}},I=(e,{equals:t}={})=>new ki(e,t);Bo=e=>{let t=new ki(void 0),n=new Set,s=!0,a=!1,o=u=>{if(!s||a)return t._v;s=!1;try{let l=$i(e,r,n,null),f=l!==t._v;f&&(t._v=l),f&&u&&wi(t._subs)}catch(l){s=!0,console.error("[computed]",l)}return t._v},r=()=>{s||a||(s=!0,t._subs.size&&o(!0))};r._isComputed=!0;let d=()=>o(!1);return Object.defineProperty(t,"value",{get(){return Gt&&(t._subs.add(Gt),us?.add(t)),d()},set(){throw new TypeError("Cannot assign to a computed signal")}}),t.dispose=()=>{if(!a){a=!0;for(let u of n)u._subs.delete(r);n.clear()}},t},je=e=>{let t=new Set,n=[],s=()=>{try{let a=$i(e,s,t,n);typeof a=="function"&&n.push(a)}catch(a){console.error("[effect]",a)}};return s(),()=>{for(let a of t)a._subs.delete(s);t.clear(),n.forEach(a=>a?.()),n.splice(0)}},xe=e=>{Ro++;try{e()}finally{--Ro===0&&Oo()}},De=(e,t)=>{let n=e.peek(),s=!1;return je(()=>{let a=e.value;s&&t(a,n),s=!0,n=a})},Tn=e=>je(()=>{let t=new AbortController;return Promise.resolve(e(t.signal)).catch(n=>{n?.name!=="AbortError"&&console.error("[asyncEffect]",n)}),()=>t.abort()}),Ed={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"},p=e=>String(e??"").replace(/[&<>"]/g,t=>Ed[t]),b=(()=>{let e=new Map,t=n=>{e.has(n)||(e.set(n,[]),document.addEventListener(n,s=>{xe(()=>{for(let[a,o]of e.get(n)){let r=s.target.closest(a);r&&o(s,r)}})},{capture:!0}))};return{on:(n,s,a)=>{t(n);let o=[s,a];return e.get(n).push(o),()=>e.set(n,e.get(n).filter(r=>r!==o))},off:(n,s)=>{e.has(n)&&e.set(n,e.get(n).filter(([a])=>a!==s))}}})(),Si=(e,{keepAlive:t=!1}={})=>{let n=I(location.hash.slice(1)||"/"),s=!1,a=()=>{n.value=location.hash.slice(1)||"/"};window.addEventListener("hashchange",a);let o=t?new Map:null,r=(l,f)=>{if(!t)return f();if(o.has(l))return o.get(l);let m=f();return o.set(l,m),m},d=I(void 0),u=je(()=>{let l=n.value;for(let[f,m]of Object.entries(e)){if(f==="*")continue;let g=new RegExp("^"+f.replace(/:\w+/g,"([^/]+)")+"$"),w=l.match(g);if(w){let y=w.slice(1);d.value=typeof m=="function"?r(`${f}|${y.join("/")}`,()=>m(...y)):m;return}}if(e["*"]){let f=e["*"];d.value=typeof f=="function"?r("*",f):f;return}d.value=null});return{current:n,route:d,navigate:l=>{s||(location.hash=l)},match:l=>{let f=n.value.match(new RegExp("^"+l.replace(/:\w+/g,"([^/]+)")+"$"));return f?f.slice(1):null},invalidate:l=>{if(o){if(l===void 0){o.clear();return}for(let f of[...o.keys()])(f===l||f.startsWith(`${l}|`))&&o.delete(f)}},dispose:()=>{s||(s=!0,window.removeEventListener("hashchange",a),u(),o?.clear())}}},i=e=>document.getElementById(e),qo=()=>typeof navigator>"u"||navigator.onLine!==!1,Id=e=>new Promise(t=>setTimeout(t,e)),ot=e=>e===void 0?"undefined":e===null||typeof e!="object"?JSON.stringify(e):e instanceof Date?`Date(${e.toJSON()})`:Array.isArray(e)?`[${e.map(ot).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ot(e[t])}`).join(",")}}`,ds=(e,t)=>{if(!t)return!0;if(typeof t=="function")return t(e);if(t.queryKey){let n=ot(t.queryKey);if(t.exact?e.hash!==n:!e.hash.startsWith(n.slice(0,-1)))return!1}return!t.tags||t.tags.some(n=>e.tags.has(n))},Td=e=>{try{return JSON.stringify(e),!0}catch{return!1}},sa=(e,t)=>{if(Object.is(e,t))return e;if(!e||!t||typeof e!="object"||typeof t!="object")return t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return t;let a=t.map((o,r)=>sa(e[r],o));return a.every((o,r)=>o===e[r])?e:a}if(Array.isArray(e)||Array.isArray(t)||Object.getPrototypeOf(e)!==Object.prototype||Object.getPrototypeOf(t)!==Object.prototype)return t;let n=Object.keys(t);if(n.length!==Object.keys(e).length)return t;let s={};for(let a of n){if(!(a in e))return t;s[a]=sa(e[a],t[a])}return n.every(a=>s[a]===e[a])?e:s},Cd=({staleTime:e=3e4,gcTime:t=3e5,retry:n=2,retryDelay:s=1e3,refetchOnWindowFocus:a=!1,refetchOnReconnect:o=!0}={})=>{let r=new Map,d=new Set,u=new Map,l=null,f=!1,m=h=>{for(let v of d)v(h)},g=h=>h.state,w=h=>!h.invalidated&&Date.now()-h.state.updatedAt.peek()<h.options.staleTime,y=h=>{h.invalidated=!0,h.state.isStale.value=!0},H=h=>{h.gcTimer&&clearTimeout(h.gcTimer),h.gcTimer=null},me=h=>{H(h),!h.observers&&Number.isFinite(h.options.gcTime)&&(h.gcTimer=setTimeout(()=>{!h.observers&&!h.promise&&(r.delete(h.hash),m({type:"gc",key:h.key}))},h.options.gcTime))},J=h=>{h.pollTimer&&clearTimeout(h.pollTimer),h.pollTimer=null},ue=h=>{J(h);let v=typeof h.options.refetchInterval=="function"?h.options.refetchInterval(h):h.options.refetchInterval;h.observers&&Number.isFinite(v)&&v>0&&(h.pollTimer=setTimeout(async()=>{qo()&&await he(h,{force:!0}).catch(()=>{}),ue(h)},v))},q=(h,v=ot(h.queryKey))=>{let k={staleTime:e,gcTime:t,retry:n,retryDelay:s,...h},S={hash:v,key:h.queryKey,queryFn:h.queryFn,options:k,tags:new Set(h.tags??[]),observers:0,invalidated:!0,promise:null,ctrl:null,version:0,gcTimer:null,pollTimer:null,state:{data:I(h.initialData),error:I(null),status:I(h.initialData===void 0?"idle":"success"),fetchStatus:I("idle"),updatedAt:I(h.initialData===void 0?0:Date.now()),isStale:I(!0)}};return r.set(v,S),S},Q=h=>{if(!h?.queryKey)throw new TypeError("query: queryKey is required");let v=ot(h.queryKey),k=r.get(v)??q(h,v);h.queryFn&&(k.queryFn=h.queryFn),k.options={...k.options,...h};for(let S of h.tags??[])k.tags.add(S);return k},he=(h,{force:v=!1}={})=>{if(!h.queryFn)return Promise.reject(new TypeError(`query ${h.hash} has no queryFn`));if(!v&&w(h))return Promise.resolve(h.state.data.peek());if(h.promise)return h.promise;if(!qo())return h.state.fetchStatus.value="paused",Promise.reject(new Error("Query paused while offline"));H(h);let k=++h.version,S=new AbortController;h.ctrl=S,xe(()=>{h.state.data.peek()===void 0&&(h.state.status.value="pending"),h.state.fetchStatus.value="fetching",h.state.error.value=null}),m({type:"fetch",key:h.key});let B=async(A,V)=>{try{return await h.queryFn({queryKey:h.key,signal:S.signal,meta:h.options.meta})}catch(R){if(S.signal.aborted||R?.name==="AbortError"||A<=0||h.options.retry===!1)throw R;return await Id(typeof V=="function"?V(A,R):V),B(A-1,typeof V=="number"?V*2:V)}},U=B(h.options.retry??n,h.options.retryDelay??s).then(A=>(h.version===k&&!S.signal.aborted&&xe(()=>{h.state.data.value=h.options.structuralSharing===!1?A:sa(h.state.data.peek(),A),h.state.status.value="success",h.state.fetchStatus.value="idle",h.state.updatedAt.value=Date.now(),h.state.isStale.value=!1,h.invalidated=!1}),m({type:"success",key:h.key}),A)).catch(A=>{throw h.version===k&&!S.signal.aborted&&xe(()=>{h.state.error.value=A,h.state.status.value=h.state.data.peek()===void 0?"error":"success",h.state.fetchStatus.value="idle"}),S.signal.aborted||m({type:"error",key:h.key,error:A}),A}).finally(()=>{h.promise===U&&(h.promise=null,h.ctrl=null,me(h))});return h.promise=U,U},Ae=h=>Promise.all([...r.values()].filter(v=>ds(v,h)&&v.observers).map(v=>he(v,{force:!0}).catch(()=>{}))),L={query(h){let v=Q(h);v.observers++,H(v),ue(v),h.enabled!==!1&&(!w(v)||h.refetchOnMount)&&he(v).catch(()=>{});let k=()=>{v.observers=Math.max(0,v.observers-1),me(v),ue(v)};return[g(v),{refetch:()=>he(v,{force:!0}),invalidate:()=>L.invalidateQueries({queryKey:v.key,exact:!0}),setData:S=>L.setQueryData(v.key,S),cancel:()=>L.cancelQueries({queryKey:v.key,exact:!0}),dispose:k}]},prefetchQuery(h){let v=Q(h);return he(v)},fetchQuery(h){let v=Q(h);return he(v)},getQueryData(h){return r.get(ot(h))?.state.data.peek()},getQueryState(h){let v=r.get(ot(h));return v&&g(v)},setQueryData(h,v,{tags:k}={}){let S=r.get(ot(h))??Q({queryKey:h,tags:k}),B=typeof v=="function"?v(S.state.data.peek()):v,U=S.options.structuralSharing===!1?B:sa(S.state.data.peek(),B);xe(()=>{S.state.data.value=U,S.state.status.value="success",S.state.error.value=null,S.state.updatedAt.value=Date.now(),S.state.isStale.value=!1}),S.invalidated=!1;for(let A of k??[])S.tags.add(A);return m({type:"set",key:S.key}),l&&l.postMessage({type:"invalidate",hash:S.hash}),U},invalidateQueries(h){for(let v of r.values())ds(v,h)&&y(v);return m({type:"invalidate",filter:h}),l&&l.postMessage({type:"invalidate",filter:h}),Ae(h)},cancelQueries(h){for(let v of r.values())ds(v,h)&&v.ctrl?.abort()},removeQueries(h){for(let v of[...r.values()])ds(v,h)&&(v.ctrl?.abort(),H(v),J(v),r.delete(v.hash))},mutate({mutationFn:h,variables:v,optimistic:k,invalidate:S,onMutate:B,onSuccess:U,onError:A,networkMode:V="online"}={}){if(typeof h!="function")return Promise.reject(new TypeError("mutate: mutationFn is required"));let R=[],ve=j=>(Array.isArray(j)?j:[j]).filter(Boolean).forEach(ce=>{let Wt=L.getQueryData(ce.queryKey);R.push([ce.queryKey,Wt]),L.setQueryData(ce.queryKey,Ln=>ce.updater(Ln))}),Ke=async()=>{let j=await B?.(v,{client:L});k&&ve(typeof k=="function"?k(v):k);try{let ce=await h(v);return await U?.(ce,v,j),S&&await L.invalidateQueries(S),m({type:"mutation-success"}),ce}catch(ce){for(let[Wt,Ln]of R)L.setQueryData(Wt,Ln);throw await A?.(ce,v,j),m({type:"mutation-error",error:ce}),ce}};return!qo()&&V==="offlineFirst"?(ge.push(Ke),m({type:"mutation-queued"}),Promise.resolve({queued:!0})):Ke()},infiniteQuery({queryKey:h,queryFn:v,initialPageParam:k=0,getNextPageParam:S,...B}){let[U,A]=L.query({queryKey:h,...B,queryFn:async V=>({pages:[await v({...V,pageParam:k})],pageParams:[k]})});return[U,{...A,fetchNextPage:async()=>{let V=U.data.peek()??{pages:[],pageParams:[]},R=S?.(V.pages.at(-1),V.pages);if(R==null)return;let ve=await v({queryKey:h,pageParam:R,signal:new AbortController().signal});return L.setQueryData(h,{pages:[...V.pages,ve],pageParams:[...V.pageParams,R]}),ve}}]},dehydrate({shouldDehydrate:h=k=>k.state.status.peek()==="success",version:v=1}={}){return{version:v,timestamp:Date.now(),queries:[...r.values()].filter(h).filter(k=>Td(k.state.data.peek())).map(k=>({key:k.key,data:k.state.data.peek(),updatedAt:k.state.updatedAt.peek(),staleTime:k.options.staleTime,tags:[...k.tags]}))}},hydrate(h,{version:v=1}={}){if(!h||h.version!==v||!Array.isArray(h.queries))return!1;for(let k of h.queries){let S=r.get(ot(k.key))??Q({queryKey:k.key,staleTime:k.staleTime,tags:k.tags});xe(()=>{S.state.data.value=k.data,S.state.status.value="success",S.state.updatedAt.value=k.updatedAt,S.state.isStale.value=Date.now()-k.updatedAt>=S.options.staleTime}),S.invalidated=S.state.isStale.peek()}return m({type:"hydrate"}),!0},persist({storage:h=typeof localStorage>"u"?null:localStorage,key:v="mini-react-query",version:k=1}={}){if(!h)throw new Error("persist: a storage adapter is required");let S=!1,B=async()=>{let A=JSON.stringify(L.dehydrate({version:k}));return h.set?h.set(v,A):h.setItem(v,A)},U=L.subscribe(()=>{S||(S=!0,queueMicrotask(()=>{S=!1,B().catch(()=>{})}))});return{restore:async()=>{let A=await(h.get?h.get(v):h.getItem(v));return A?L.hydrate(JSON.parse(A),{version:k}):!1},save:B,dispose:U}},sync(h="mini-react-query"){return typeof BroadcastChannel>"u"?()=>{}:(l?.close(),l=new BroadcastChannel(h),l.onmessage=v=>{if(v.data?.type!=="invalidate")return;let k=v.data.hash?S=>S.hash===v.data.hash:v.data.filter;for(let S of r.values())ds(S,k)&&y(S);Ae(k)},()=>{l?.close(),l=null})},subscribe(h){return d.add(h),()=>d.delete(h)},getDebugSnapshot(){return[...r.values()].map(h=>({key:h.key,observers:h.observers,status:h.state.status.peek(),fetchStatus:h.state.fetchStatus.peek(),updatedAt:h.state.updatedAt.peek(),stale:h.state.isStale.peek(),tags:[...h.tags]}))},async fetchJSON(h,v={},{queryKey:k=["GET",h,v.body??null],...S}={}){let B=ot(k);return L.fetchQuery({queryKey:k,...S,queryFn:async({signal:U})=>{let A=new Headers(v.headers),V=u.get(B);V?.etag&&A.set("If-None-Match",V.etag);let R=await fetch(h,{...v,headers:A,signal:U});if(R.status===304&&V)return L.getQueryData(k);if(!R.ok)throw new Error(`HTTP ${R.status}`);let ve=R.headers.get("cache-control")?.match(/max-age=(\d+)/)?.[1];if(ve){let Ke=r.get(B);Ke&&(Ke.options.staleTime=Number(ve)*1e3)}return u.set(B,{etag:R.headers.get("etag")}),R.json()}})},destroy(){f=!0;for(let h of r.values())h.ctrl?.abort(),H(h),J(h);l?.close(),d.clear()}},ge=[],be=()=>{a&&Ae()},ae=()=>{for(o&&Ae();ge.length;)ge.shift()().catch(()=>{})};typeof window<"u"&&(window.addEventListener("focus",be),window.addEventListener("online",ae));let Ft=L.destroy;return L.destroy=()=>{f||(typeof window<"u"&&(window.removeEventListener("focus",be),window.removeEventListener("online",ae)),Ft())},L},Of=Cd(),aa=({cache:e=!0,ttl:t=3e4,retry:n=2,retryDelay:s=1e3,store:a=null,dedupe:o=!0}={})=>{let r=new Map,d=new Map,u=new Map,l=(m,g)=>{if(a)return a.get(m);let w=r.get(m);return w&&Date.now()-w.ts<g?w.data:void 0},f=async(m,g,w)=>{if(a)return a.set(m,g,{ttl:w});r.set(m,{data:g,ts:Date.now()})};return{get:(m,g,w={})=>{let y=w.ttl??t,H=e&&w.cache!==!1&&y!==0,me=w.dedupe??o;if(me&&d.has(m))return d.get(m);let J=()=>{let q=u.get(m)??0,Q=(he,Ae)=>Promise.resolve(g()).then(async L=>(H&&(u.get(m)??0)===q&&await f(m,L,y),L)).catch(L=>{if(he>0&&L?.name!=="AbortError")return new Promise(ge=>setTimeout(ge,Ae)).then(()=>Q(he-1,Ae*2));throw L});return Q(w.retry??n,s)},ue=q=>(me&&(d.set(m,q),q.finally(()=>{d.get(m)===q&&d.delete(m)}).catch(()=>{})),q);if(!H)return ue(J());if(!a){let q=l(m,y);return q!==void 0?Promise.resolve(q):ue(J())}return ue(Promise.resolve(l(m,y)).then(q=>q!==void 0?q:J()))},invalidate:m=>{if(m!==void 0)u.set(m,(u.get(m)??0)+1);else{for(let g of r.keys())u.set(g,(u.get(g)??0)+1);for(let g of d.keys())u.set(g,(u.get(g)??0)+1)}if(a)return m===void 0?a.clear():a.delete(m);m===void 0?r.clear():r.delete(m)}}},Bf=new TextEncoder,Uf=new TextDecoder,Li=(e,t="kv")=>{let n=null,s=()=>n?Promise.resolve(n):new Promise((o,r)=>{let d=indexedDB.open(e,1);d.onupgradeneeded=u=>u.target.result.createObjectStore(t),d.onsuccess=u=>{n=u.target.result,o(n)},d.onerror=u=>r(u.target.error)}),a=async(o,r)=>{let d=await s();return new Promise((u,l)=>{let f=d.transaction(t,o),m=r(f.objectStore(t));m.onsuccess=()=>u(m.result),m.onerror=()=>l(m.error)})};return{async get(o){let r=await a("readonly",d=>d.get(o));if(r){if(r.expires&&Date.now()>r.expires){this.delete(o);return}return r.val}},async set(o,r,{ttl:d}={}){await a("readwrite",u=>u.put({val:r,expires:d?Date.now()+d:null},o))},delete:o=>a("readwrite",r=>r.delete(o)),clear:()=>a("readwrite",o=>o.clear()),keys:()=>a("readonly",o=>o.getAllKeys())}}});var G=F(()=>{Ei()});var Ni={};ls(Ni,{AGENT_DEFAULT_MODEL:()=>ji,AGENT_LABELS:()=>Z,AGENT_MODELS:()=>Uo,LOW_TURN_THRESHOLD:()=>Wo,activityHits:()=>rt,activityLoading:()=>gt,addCustomModel:()=>Jt,agentFilter:()=>ye,agentFilters:()=>zt,agentsMeta:()=>Kt,chatDensity:()=>_e,collapsedFolders:()=>Mn,ctx:()=>c,currentAgent:()=>$,currentEffort:()=>te,currentModel:()=>_,currentPermission:()=>de,currentProject:()=>E,currentTab:()=>X,expandedFolders:()=>Cn,favoritesOnly:()=>ze,filesPath:()=>Y,filesRoot:()=>re,filteredSessions:()=>Dt,getCustomModels:()=>ra,getDefaultEffort:()=>Qe,getDefaultModel:()=>Be,getEffortsForModel:()=>Qt,getModelsForAgent:()=>Oe,getSavedModel:()=>Ai,getSessionMeta:()=>An,gitRoot:()=>Se,hubMachineReady:()=>it,hubMode:()=>M,isProcessing:()=>N,machinesList:()=>ie,metaKey:()=>z,projectGroups:()=>Vt,removeCustomModel:()=>zo,selectedMachineId:()=>D,sessionDisplayTitle:()=>bt,sessionFilter:()=>ke,sessionMetaMap:()=>T,sessionSearch:()=>$e,sessionSort:()=>Ii,sessionsData:()=>ne,setAgent:()=>Ne,setChatDensity:()=>Go,setCurrentModel:()=>se,setSelectedMachine:()=>Le,showHiddenOnly:()=>Je,sidebarView:()=>ht,timeRange:()=>oa,viewingFile:()=>oe,workspacesData:()=>pe,wsStatus:()=>fe});function Ci(){try{let e=JSON.parse(localStorage.getItem(Ti)||"{}");return e&&typeof e=="object"?e:{}}catch{return{}}}function Mi(e,t=c.sessionId,n=c.machineId){if(!t)return"";let s=(e||"claude").toLowerCase();return`${n||""}:${s}:${t}`}function Ai(e,t=c.sessionId,n=c.machineId){let s=Mi(e,t,n);if(!s)return null;let a=Ci()[s];return typeof a=="string"&&a.trim()?a:null}function se(e,t=$.peek(),n=c.sessionId,s=c.machineId){let a=String(e||"").trim();if(!a)return;let o=Mi(t,n,s);if(o){let r=Ci();r[o]=a,localStorage.setItem(Ti,JSON.stringify(r))}_.value=a}function Le(e){let t=e||null;D.value=t,c.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function z(e,t,n){let s=`${e||"claude"}:${t}`;return n||c?.machineId?`${n||c.machineId}:${s}`:s}function An(e,t,n){return T.peek()?.[z(e,t,n)]||{favorite:!1,notes:"",title:"",hidden:!1,branch:null}}function bt(e,{preferSnippet:t=!1}={}){if(!e)return"Session";if(t&&e.snippet)return e.snippet;let s=(An(e.agent,e.sessionId,e.machineId).title||"").trim();return s||e.display||e.sessionId?.slice(0,8)||"Session"}function Go(e){let t=["clean","normal","full"].includes(e)?e:"normal";_e.value=t,localStorage.setItem("chatDensity",t),document.getElementById("messages")?.setAttribute("data-density",t)}function Ad(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 Ko(){try{let e=localStorage.getItem(Di);if(!e)return{};let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function _i(e){localStorage.setItem(Di,JSON.stringify(e))}function ra(e){let t=(e||"claude").toLowerCase(),n=Ko()[t];return Array.isArray(n)?n.filter(Boolean).map(String):[]}function Jt(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim();if(!s)return!1;let a=Ko(),o=Array.isArray(a[n])?[...a[n]]:[];return o.includes(s)||o.push(s),a[n]=o,_i(a),!0}function zo(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim(),a=Ko(),o=Array.isArray(a[n])?a[n].filter(r=>r!==s):[];return a[n]=o,_i(a),!0}function Oe(e){let t=(e||"claude").toLowerCase(),n=Kt.peek()?.defaults?.[t],s=n?.models?.length?n.models.map(Ad).filter(Boolean):(Uo[t]||Uo.claude).map(r=>({...r})),a=ra(t),o=new Set(s.map(r=>r.value));for(let r of a){if(o.has(r)){s=s.map(d=>{if(d.value!==r)return d;let u=String(d.label||d.value);return{...d,custom:!0,label:u.includes("\u2605")?u:`${u} \u2605`}});continue}o.add(r),s.push({value:r,label:`${r} \u2605`,custom:!0})}return s}function Be(e){let t=(e||"claude").toLowerCase(),n=Kt.peek()?.defaults?.[t];return n?.model?String(n.model):ji[t]||Oe(t)[0]?.value||"sonnet"}function Qt(e,t){let s=Oe(e).find(o=>o.value===t);if(s?.efforts?.length)return s.efforts;let a=Kt.peek()?.defaults?.[(e||"claude").toLowerCase()];return a?.efforts?.length?a.efforts.map(String):["low","medium","high","xhigh","max"]}function Qe(e,t){let n=(e||"claude").toLowerCase(),s=Kt.peek()?.defaults?.[n];if(s?.effortDefault)return String(s.effortDefault);let o=Oe(n).find(r=>r.value===t);return o?.defaultEffort?String(o.defaultEffort):n==="grok"?"low":n==="gemini"&&String(t||"").match(/-(low|medium|high)$/i)?.[1]?.toLowerCase()||""}function Ne(e){let t=(e||"claude").toLowerCase();$.value=t,localStorage.setItem("agent",t),de.value="bypassPermissions";let n=typeof document>"u"?null:document.getElementById("sel-permission");n&&(n.value=de.peek());let s=Ai(t);s?_.value=s:se(Be(t),t);let a=Qe(t,_.peek());a?te.value=a:t!=="grok"&&t!=="gemini"&&(te.value="")}function jd(e,t){return!t||t==="all"?!0:(e.agent||"claude")===t}function Dd(e,t){if(!t)return!0;let n=T.value?.[z(e.agent,e.sessionId,e.machineId)];return[e.display,e.cwd,e.projectName,e.agent,e.sessionId,e.snippet,e.machineId,n?.notes,n?.title].filter(Boolean).join(" ").toLowerCase().includes(t)}function Fo(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}var ne,pe,ke,$e,Ii,Cn,Mn,Y,oe,E,X,N,fe,Ti,Md,$,_,te,de,re,Se,Kt,ht,ye,zt,oa,rt,gt,T,ze,Je,Wo,_e,M,ie,D,it,c,Z,Uo,ji,Di,Dt,Vt,W=F(()=>{G();ne=I([]),pe=I([]),ke=I(null),$e=I(""),Ii=I("time"),Cn=I(new Set),Mn=I(new Set),Y=I(""),oe=I(null),E=I(null),X=I("chat"),N=I(!1),fe=I("idle"),Ti="modelBySession",Md=localStorage.getItem("agent")||"claude";$=I(Md),_=I("sonnet"),te=I(""),de=I("bypassPermissions"),re=I(""),Se=I(""),Kt=I(null),ht=I(localStorage.getItem("sidebarView")||"projects"),ye=I(localStorage.getItem("agentFilter")||"all"),zt=I((()=>{try{let e=JSON.parse(localStorage.getItem("agentFilters")||"[]");return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}})()),oa=I(localStorage.getItem("timeRange")||"14"),rt=I(null),gt=I(!1),T=I({}),ze=I(localStorage.getItem("favoritesOnly")==="1"),Je=I(localStorage.getItem("showHiddenOnly")==="1"),Wo=2,_e=I(localStorage.getItem("chatDensity")||"normal"),M=I(!1),ie=I([]),D=I(null),it=I(!1),c={token:localStorage.getItem("token"),sessionId:null,agent:null,machineId:null,ws:null,shellBubble:null,configDir:null,externalSessionReadOnly:!1,role:null,username:null,lock:{key:null,token:null,holder:null,held:!1,foreign:!1}};Z={claude:"Claude",codex:"Codex",grok:"Grok",gemini:"Gemini",cursor:"Cursor"},Uo={claude:[{value:"fable",label:"fable"},{value:"opus",label:"opus"},{value:"sonnet",label:"sonnet"},{value:"haiku",label:"haiku"}],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"}],gemini:[{value:"gemini-3.7-flash-high",label:"Gemini 3.7 Flash (High)"},{value:"gemini-3.7-flash-medium",label:"Gemini 3.7 Flash (Medium)"},{value:"gemini-3.7-flash-low",label:"Gemini 3.7 Flash (Low)"},{value:"gemini-3.6-flash-high",label:"Gemini 3.6 Flash (High)"},{value:"gemini-3.6-flash-medium",label:"Gemini 3.6 Flash (Medium)"},{value:"gemini-3.6-flash-low",label:"Gemini 3.6 Flash (Low)"},{value:"gemini-3.5-flash-high",label:"Gemini 3.5 Flash (High)"},{value:"gemini-3.5-flash-medium",label:"Gemini 3.5 Flash (Medium)"},{value:"gemini-3.5-flash-low",label:"Gemini 3.5 Flash (Low)"},{value:"gemini-3.1-pro-high",label:"Gemini 3.1 Pro (High)"},{value:"gemini-3.1-pro-low",label:"Gemini 3.1 Pro (Low)"}],cursor:[{value:"auto",label:"Auto"},{value:"gpt-5.3-codex",label:"GPT-5.3 Codex"},{value:"composer-2.5",label:"Composer 2.5"}]},ji={claude:"sonnet",codex:"gpt-5.4",grok:"grok-4.5",gemini:"gemini-3.7-flash-high",cursor:"auto"};Di="customModelsByAgent";Dt=Bo(()=>{let e=$e.value.toLowerCase().trim(),t=Ii.value,n=ye.value,s=zt.value,a=ze.value,o=Je.value,r=T.value,d=rt.value,u=d?.results?.length&&e?Fo(d.results):Fo(ne.value),l=D.value;return M.value&&l&&(u=u.filter(f=>f&&(!f.machineId||f.machineId===l))),u=u.filter(f=>f&&(s.length?s.includes(f.agent||"claude"):jd(f,n))),o?u=u.filter(f=>f&&r?.[z(f.agent,f.sessionId,f.machineId)]?.hidden):u=u.filter(f=>f&&!r?.[z(f.agent,f.sessionId,f.machineId)]?.hidden),a&&(u=u.filter(f=>f&&r?.[z(f.agent,f.sessionId,f.machineId)]?.favorite)),e&&!(d?.results&&d.q===e)&&(u=u.filter(f=>f&&Dd(f,e))),u=[...u].sort((f,m)=>{let g=r?.[z(f.agent,f.sessionId,f.machineId)]?.favorite?1:0,w=r?.[z(m.agent,m.sessionId,m.machineId)]?.favorite?1:0;return g!==w?w-g:t==="project"&&(f.cwd||"").localeCompare(m.cwd||"")||m.updatedAt-f.updatedAt}),!e&&!a?u.slice(0,120):u}),Vt=Bo(()=>{let e=Fo(Dt.value),t=new Map;for(let n of e){if(!n)continue;let s=n.machineId?`${n.machineId}::${n.cwd||"(no path)"}`:n.cwd||"(no path)";t.has(s)||t.set(s,{cwd:n.cwd||null,machineId:n.machineId||null,projectName:n.projectName||(n.cwd?n.cwd.split("/").filter(Boolean).pop():"(no path)"),updatedAt:0,agents:{},sessions:[],latest:null});let a=t.get(s);a.sessions.push(n),a.agents[n.agent||"claude"]=(a.agents[n.agent||"claude"]||0)+1,(n.updatedAt||0)>a.updatedAt&&(a.updatedAt=n.updatedAt,a.latest=n)}return[...t.values()].sort((n,s)=>s.updatedAt-n.updatedAt)})});function ps(e={}){return e.machineId!==void 0?e.machineId:c.machineId||D.peek()||null}function Pd(e){let t=e.split("?")[0];return t==="/api/hub"||t==="/api/machines"||t==="/api/notifications"||t==="/api/notifications/read"||t==="/api/notes"||t.startsWith("/api/notes/")||t==="/api/queue"||t.startsWith("/api/queue/")||t.startsWith("/api/ai/")||t.startsWith("/api/auth/")||t.startsWith("/api/collab/")}async function x(e,t,n,s,a={}){let o=a.hub?null:ps(a),r={"Content-Type":"application/json",...c.token?{Authorization:`Bearer ${c.token}`}:{}};!a.hub&&M.peek()&&o&&!Pd(t)&&(r["X-Machine-Id"]=o),e.toUpperCase()!=="GET"&&e.toUpperCase()!=="HEAD"&&c.lock?.token&&c.lock?.key&&!String(t).startsWith("/api/collab/")&&(r["X-Lock-Token"]=c.lock.token,r["X-Lock-Key"]=c.lock.key);let u=a.etag===!0?`${c.token||""}:${o||""}:${t}`:a.etag||null;if(e.toUpperCase()==="GET"&&u){let m=Hi.get(u);m&&(r["If-None-Match"]=m)}let l=async()=>{let m=await fetch(t,{method:e,signal:s,headers:r,cache:a.cache||(e.toUpperCase()==="GET"?"no-store":"default"),...n!==void 0?{body:JSON.stringify(n)}:{}});if(m.status===304)return Nd;let g=await m.json().catch(()=>({}));if(!m.ok)throw new Error(g.error||`HTTP ${m.status}`);if(u){let w=m.headers.get("ETag");w&&Hi.set(u,w)}return g};if(e.toUpperCase()!=="GET"||s||a.dedupe===!1)return l();let f=`${c.token||""}:${o||""}:${t}`;return _d.get(f,l)}function lt(e){return c.ws?.readyState===WebSocket.OPEN?(c.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||ia.push(e),!1)}function la(){for(;ia.length&&c.ws?.readyState===WebSocket.OPEN;)c.ws.send(JSON.stringify(ia.shift()))}function ca(){ia.length=0}function Jo(e={}){let t=new URLSearchParams(e);c.token&&t.set("token",c.token);let n=ps();return M.peek()&&n&&t.set("machine",n),t.toString()}function ct(e={},t={}){let n={...e};c.token&&(n.Authorization=`Bearer ${c.token}`);let s=ps();return!t.hub&&M.peek()&&s&&(n["X-Machine-Id"]=s),n}async function da(){try{let e=await fetch("/api/hub");if(!e.ok)return M.value=!1,!1;let t=await e.json();if(t?.hub)return M.value=!0,t}catch{}return M.value=!1,!1}var _d,Hi,Nd,ia,le=F(()=>{W();G();_d=aa({cache:!1,dedupe:!0,retry:0}),Hi=new Map,Nd=Symbol("not-modified");ia=[]});function Yt(e,t){e&&(t?e.setAttribute("inert",""):e.removeAttribute("inert"))}function jn(e){return!e||e.classList.contains("hidden")?!0:e.style.display==="none"}function Ee(){let e=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,t=document.getElementById("sidebar");if(t){let s=!e||t.classList.contains("open");Yt(t,!s)}Yt(document.getElementById("welcome"),jn(document.getElementById("welcome"))),Yt(document.getElementById("auth-screen"),jn(document.getElementById("auth-screen"))),Yt(document.getElementById("chat-opts"),jn(document.getElementById("chat-opts"))),Yt(document.getElementById("machine-picker"),jn(document.getElementById("machine-picker")));for(let s of["files","git","shell","memory"]){let a=document.getElementById(`tab-${s}`);Yt(a,jn(a))}let n=document.getElementById("tab-chat");n&&Yt(n,jn(n))}function fs(){let e=window.visualViewport,t=document.documentElement;if(!e)return;let n=e.height<window.innerHeight-80;t.classList.toggle("vv-keyboard",n),t.style.setProperty("--vvh",`${Math.round(e.height)}px`),t.style.setProperty("--vv-top",`${Math.round(e.offsetTop)}px`)}function Ri(){Ee(),fs();let e=window.visualViewport;e&&(e.addEventListener("resize",fs),e.addEventListener("scroll",fs)),window.addEventListener("resize",()=>{fs(),Ee()}),window.addEventListener("orientationchange",()=>{setTimeout(()=>{fs(),Ee()},250)})}var Dn=F(()=>{});function Xt(){try{let e=localStorage.getItem(Oi);return e?JSON.parse(e):null}catch{return null}}function Qo(e){try{let n={...Xt()||{},...e,updatedAt:Date.now()};localStorage.setItem(Oi,JSON.stringify(n))}catch{}}var Oi,pa=F(()=>{Oi="lastSessionContext"});function Hd(e){let t=String(e??"").trim();if(!t)return"";try{return decodeURIComponent(t)}catch{return t}}function Bi(e){return String(e||"").replace(/\\/g,"/")}function qd(e){return e.replace(/:[0-9]+(?::[0-9]+)?$/,"")}function fa(e,t){let n=Hd(e);if(!n||/^(https?:|mailto:|tel:|javascript:|#)/i.test(n)||(n=Bi(n).split(/[?#]/)[0],n=n.replace(/^file:\/\//i,""),/^\/[A-Za-z]:\//.test(n)&&(n=n.slice(1)),!n||n==="."||n==="/")||/^\/(api|ws|session)\b/.test(n))return null;let s=n.endsWith("/"),a=qd(n.replace(/\/+$/,"")),o=Bi(t).replace(/\/+$/,"");if((a.startsWith("/")||/^[A-Za-z]:\//.test(a))&&o){let d=a.toLowerCase(),u=o.toLowerCase();if(d===u)return{relative:"",isDir:!0,root:o};if(d.startsWith(`${u}/`))return{relative:a.slice(o.length+1),isDir:s,root:o};let l=a.split("/"),f=l.pop()||"",m=l.join("/")||(a.startsWith("/")?"/":"");return{relative:f,isDir:s,root:m}}if(a=a.replace(/^\.\//,""),a.startsWith("../")&&o){let d=o.split("/"),u=a.split("/");for(let f of u)f===".."?d.pop():f&&f!=="."&&d.push(f);let l=d.join("/")||"/";return fa(l,t)}return{relative:a,isDir:s,root:o||t}}var Vo=F(()=>{});function Od(){let e=document.getElementById("mermaid-zoom-overlay");if(e)return e;e=document.createElement("div"),e.id="mermaid-zoom-overlay",e.className="mermaid-zoom-overlay hidden",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-label","Mermaid diagram enlarged"),e.innerHTML='<button type="button" class="mermaid-zoom-close" aria-label="\u5173\u95ED\u653E\u5927\u56FE">\xD7</button><div class="mermaid-zoom-canvas"></div>',document.body.appendChild(e);let t=()=>e.classList.add("hidden");return e.addEventListener("click",n=>{(n.target===e||n.target.closest(".mermaid-zoom-close"))&&t()}),Fi||(Fi=!0,document.addEventListener("keydown",n=>{n.key==="Escape"&&t()})),e}function Wi(e){let t=e.querySelector("svg");if(!t)return;let n=Od(),s=n.querySelector(".mermaid-zoom-canvas");s.innerHTML=t.outerHTML;let a=s.querySelector("svg");a?.removeAttribute("width"),a?.removeAttribute("height"),n.classList.remove("hidden")}function Bd(){let e=globalThis.mermaid;return!e||Ui||(e.initialize({startOnLoad:!1,securityLevel:"strict",theme:document.documentElement.dataset.theme==="dark"?"dark":"default",flowchart:{htmlLabels:!1}}),Ui=!0),e}function Ud(e){let t=String(e||"").replace(/\r\n?/g,`
2
- `).trim();return t=t.replace(/^```(?:mermaid)?\s*/i,"").replace(/\s*```$/,"").trim(),t=t.replace(/^mermaid\s*\n/i,""),t=t.replace(/^graph\s+(TD|TB|BT|RL|LR)\b/i,"flowchart $1"),t}function vt(e){let t=Bd();!t||!e||e.querySelectorAll("pre code.language-mermaid, pre code.lang-mermaid").forEach(n=>{if(n.dataset.mermaidHandled)return;let s=n.closest("pre"),a=Ud(n.textContent);if(!s||!a)return;n.dataset.mermaidHandled="1";let o=document.createElement("div");o.className="mermaid-diagram",o.setAttribute("role","img"),o.setAttribute("aria-label","Mermaid diagram"),s.replaceWith(o);let r=`mermaid-diagram-${++Rd}`;Promise.resolve(t.parse(a)).then(()=>t.render(r,a)).then(({svg:d,bindFunctions:u})=>{o.innerHTML=d,u?.(o),o.tabIndex=0,o.title="\u70B9\u51FB\u653E\u5927\u56FE\u8868",o.addEventListener("click",l=>{l.target.closest("a")||Wi(o)}),o.addEventListener("keydown",l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),Wi(o))})}).catch(d=>{o.replaceWith(s),delete n.dataset.mermaidHandled,s.classList.add("mermaid-error"),s.title=`Mermaid render failed: ${d?.message||"invalid diagram"}`})})}var Ui,Rd,Fi,_n=F(()=>{Ui=!1,Rd=0,Fi=!1});function Xo(e){return Fd.test(String(e||""))}function Wd(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function Gi(e,t){return t===0||e[t-1]===`
3
- `}function Gd(e,t){if(Gi(e,t)&&(e.startsWith("```",t)||e.startsWith("~~~",t))){let n=e.startsWith("```",t)?"```":"~~~",s=e.indexOf(`
4
- `+n,t+3);return s===-1?{end:e.length}:{end:s+1+n.length}}if(e[t]==="`"){let n=1;for(;e[t+n]==="`";)n++;let s=t+n;for(;s<e.length;){if(e[s]==="`"){let a=0;for(;e[s+a]==="`";)a++;if(a===n)return{end:s+a};s+=a;continue}s++}return{end:t+n}}return null}function Kd(e,t){let n=e.slice(t);if(n.startsWith("$$")){let s=n.indexOf("$$",2);if(s>=2){let a=n.slice(2,s);if(a.trim())return{body:a,display:!0,end:t+s+2}}}if(n.startsWith("\\[")){let s=n.indexOf("\\]",2);if(s>=2){let a=n.slice(2,s);if(a.trim())return{body:a,display:!0,end:t+s+2}}}if(n.startsWith("\\(")){let s=n.indexOf("\\)",2);if(s>=2){let a=n.slice(2,s);if(a.trim())return{body:a,display:!1,end:t+s+2}}}if(n[0]==="$"&&n[1]!=="$"){let s=n.match(/^\$([^$\n]|\\\$)+?(?<!\s)\$/);if(s&&s[0][1]!==" "){let a=s[0].slice(1,-1);if(a.trim())return{body:a,display:!1,end:t+s[0].length}}}if(Gi(e,t)){let s=n.match(/^[ \t]*\[[ \t]*\n([\s\S]*?)\n[ \t]*\][ \t]*(?=\n|$)/);if(s&&Xo(s[1]))return{body:s[1],display:!0,end:t+s[0].length};let a=n.match(/^[ \t]*\[([^\]\n]+)\](?!\()/);if(a&&Xo(a[1]))return{body:a[1],display:!0,end:t+a[0].length}}return null}function Ki(e){let t=[],n=String(e??""),s="",a=0;for(;a<n.length;){let o=Gd(n,a);if(o){s+=n.slice(a,o.end),a=o.end;continue}let r=Kd(n,a);if(r){let d=t.length;t.push({body:r.body,display:r.display}),s+=`@@MATH${d}@@`,a=r.end;continue}s+=n[a],a++}return{text:s,slots:t}}function ma(e,t){return t?.length?String(e).replace(/@@MATH(\d+)@@/g,(n,s)=>{let a=t[Number(s)];if(!a)return n;let o=a.display?"\\[":"\\(",r=a.display?"\\]":"\\)";return Wd(`${o}${a.body}${r}`)}):e}function zd(e){return e.parentElement?.closest("pre, code, .mermaid-diagram, .katex, script, style")}function Yo(e,t){let n=[{re:/\\\[([\s\S]+?)\\\]/g,display:!0},{re:/\$\$([\s\S]+?)\$\$/g,display:!0},{re:/\\\(([\s\S]+?)\\\)/g,display:!1},{re:/(?<!\\)\$([^$\n]|\\\$)+?(?<!\s)(?<!\\)\$/g,display:!1},{re:/(?:^|\n)[ \t]*\[[ \t]*\n([\s\S]*?)\n[ \t]*\][ \t]*(?=\n|$)/g,display:!0,latex:!0},{re:/(?:^|\n)[ \t]*\[([^\]\n]+\\[a-zA-Z{}_^][^\]\n]*)\](?!\()/g,display:!0,latex:!0}],s=null;for(let a of n){a.re.lastIndex=t;let o=a.re.exec(e);if(!o||s&&o.index>=s.match.index)continue;let r=o[0],d;o[1]!=null&&(a.latex||r.startsWith("\\[")||r.startsWith("\\(")||r.startsWith("$$")||r.startsWith("$"))?d=o[1]:d=r.startsWith("\\[")||r.startsWith("\\(")||r.startsWith("$$")?r.slice(2,-2):r.slice(1,-1),d.trim()&&(a.latex&&!Xo(d)||(s={match:o,body:d,display:a.display}))}return s}function Jd(e){let t=e.nodeValue||"",n=0,s=Yo(t,n);if(!s||typeof globalThis.katex?.renderToString!="function")return;let a=document.createDocumentFragment();for(;s;){s.match.index>n&&a.append(document.createTextNode(t.slice(n,s.match.index)));let o;try{o=globalThis.katex.renderToString(s.body.trim(),{displayMode:s.display,throwOnError:!1,strict:"warn"})}catch{a.append(document.createTextNode(s.match[0])),n=s.match.index+s.match[0].length,s=Yo(t,n);continue}let r=document.createElement(s.display?"div":"span");r.className=s.display?"math-display":"math-inline",r.innerHTML=o,a.append(r),n=s.match.index+s.match[0].length,s=Yo(t,n)}n<t.length&&a.append(document.createTextNode(t.slice(n))),e.replaceWith(a)}function xt(e){if(!e||typeof globalThis.katex?.renderToString!="function")return;let t=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),n=[];for(;t.nextNode();)zd(t.currentNode)||n.push(t.currentNode);n.forEach(Jd)}var Fd,Zt=F(()=>{Fd=/\\[a-zA-Z]+|[_^]\{|\\[,;!]|\\[{}()[\]]|\\leq\b|\\geq\b|\\neq\b|\\in\b|\\sum\b|\\int\b|\\frac\b|\\min\b|\\max\b|\\mathrm\b|\\text\b|\\left\b|\\right\b/});function Vd(e){return String(e??"").replace(Qd,(t,n)=>`
1
+ var Ld=Object.defineProperty;var W=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(s){throw n=[s],s}};var cs=(e,t)=>{for(var n in t)Ld(e,n,{get:t[n],enumerable:!0})};function Id(){qo||(qo=!0,queueMicrotask(()=>{qo=!1,Oo()}))}function $i(e){for(let t of e)(t._isComputed?Tn:Cn).add(t);Bo>0||sa||(Ed==="microtask"?Id():Oo())}function Li(e,t,n,s){let a=new Set(n);for(let r of n)r._subs.delete(t);n.clear(),s?.forEach(r=>r?.()),s?.splice(0);let o=[zt,ps,Po];[zt,ps,Po]=[t,n,s];try{return e()}catch(r){for(let d of a)d._subs.add(t),n.add(d);throw r}finally{[zt,ps,Po]=o}}var zt,ps,Bo,Po,Tn,Cn,sa,ds,Ho,Ed,qo,Oo,Si,I,Uo,je,xe,De,Mn,Td,p,b,Ei,i,Ro,Cd,ot,us,Md,aa,Ad,Uf,oa,Ff,Wf,Ii,Ti=W(()=>{zt=null,ps=null,Bo=0,Po=null,Tn=new Set,Cn=new Set,sa=!1,ds=1e4,Ho={flushes:0,runs:0,lastFlushRuns:0},Ed="sync",qo=!1;Oo=()=>{if(sa)return;sa=!0;let e=0;Ho.flushes++;try{for(;Tn.size||Cn.size;){for(;Tn.size;){let t=Tn.values().next().value;if(Tn.delete(t),++e>ds)throw new Error(`mini-react: reactive update loop exceeded ${ds} runs`);t()}if(Cn.size){let t=Cn.values().next().value;if(Cn.delete(t),++e>ds)throw new Error(`mini-react: reactive update loop exceeded ${ds} runs`);t()}}}finally{Ho.runs+=e,Ho.lastFlushRuns=e,e>ds&&(Tn.clear(),Cn.clear()),sa=!1}};Si=class{constructor(e,t){this._v=e,this._subs=new Set,this._eq=t??((n,s)=>n===s)}get value(){return zt&&(this._subs.add(zt),ps?.add(this)),this._v}set value(e){this._eq(e,this._v)||(this._v=e,$i(this._subs))}peek(){return this._v}},I=(e,{equals:t}={})=>new Si(e,t);Uo=e=>{let t=new Si(void 0),n=new Set,s=!0,a=!1,o=u=>{if(!s||a)return t._v;s=!1;try{let l=Li(e,r,n,null),f=l!==t._v;f&&(t._v=l),f&&u&&$i(t._subs)}catch(l){s=!0,console.error("[computed]",l)}return t._v},r=()=>{s||a||(s=!0,t._subs.size&&o(!0))};r._isComputed=!0;let d=()=>o(!1);return Object.defineProperty(t,"value",{get(){return zt&&(t._subs.add(zt),ps?.add(t)),d()},set(){throw new TypeError("Cannot assign to a computed signal")}}),t.dispose=()=>{if(!a){a=!0;for(let u of n)u._subs.delete(r);n.clear()}},t},je=e=>{let t=new Set,n=[],s=()=>{try{let a=Li(e,s,t,n);typeof a=="function"&&n.push(a)}catch(a){console.error("[effect]",a)}};return s(),()=>{for(let a of t)a._subs.delete(s);t.clear(),n.forEach(a=>a?.()),n.splice(0)}},xe=e=>{Bo++;try{e()}finally{--Bo===0&&Oo()}},De=(e,t)=>{let n=e.peek(),s=!1;return je(()=>{let a=e.value;s&&t(a,n),s=!0,n=a})},Mn=e=>je(()=>{let t=new AbortController;return Promise.resolve(e(t.signal)).catch(n=>{n?.name!=="AbortError"&&console.error("[asyncEffect]",n)}),()=>t.abort()}),Td={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"},p=e=>String(e??"").replace(/[&<>"]/g,t=>Td[t]),b=(()=>{let e=new Map,t=n=>{e.has(n)||(e.set(n,[]),document.addEventListener(n,s=>{xe(()=>{for(let[a,o]of e.get(n)){let r=s.target.closest(a);r&&o(s,r)}})},{capture:!0}))};return{on:(n,s,a)=>{t(n);let o=[s,a];return e.get(n).push(o),()=>e.set(n,e.get(n).filter(r=>r!==o))},off:(n,s)=>{e.has(n)&&e.set(n,e.get(n).filter(([a])=>a!==s))}}})(),Ei=(e,{keepAlive:t=!1}={})=>{let n=I(location.hash.slice(1)||"/"),s=!1,a=()=>{n.value=location.hash.slice(1)||"/"};window.addEventListener("hashchange",a);let o=t?new Map:null,r=(l,f)=>{if(!t)return f();if(o.has(l))return o.get(l);let m=f();return o.set(l,m),m},d=I(void 0),u=je(()=>{let l=n.value;for(let[f,m]of Object.entries(e)){if(f==="*")continue;let g=new RegExp("^"+f.replace(/:\w+/g,"([^/]+)")+"$"),w=l.match(g);if(w){let y=w.slice(1);d.value=typeof m=="function"?r(`${f}|${y.join("/")}`,()=>m(...y)):m;return}}if(e["*"]){let f=e["*"];d.value=typeof f=="function"?r("*",f):f;return}d.value=null});return{current:n,route:d,navigate:l=>{s||(location.hash=l)},match:l=>{let f=n.value.match(new RegExp("^"+l.replace(/:\w+/g,"([^/]+)")+"$"));return f?f.slice(1):null},invalidate:l=>{if(o){if(l===void 0){o.clear();return}for(let f of[...o.keys()])(f===l||f.startsWith(`${l}|`))&&o.delete(f)}},dispose:()=>{s||(s=!0,window.removeEventListener("hashchange",a),u(),o?.clear())}}},i=e=>document.getElementById(e),Ro=()=>typeof navigator>"u"||navigator.onLine!==!1,Cd=e=>new Promise(t=>setTimeout(t,e)),ot=e=>e===void 0?"undefined":e===null||typeof e!="object"?JSON.stringify(e):e instanceof Date?`Date(${e.toJSON()})`:Array.isArray(e)?`[${e.map(ot).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ot(e[t])}`).join(",")}}`,us=(e,t)=>{if(!t)return!0;if(typeof t=="function")return t(e);if(t.queryKey){let n=ot(t.queryKey);if(t.exact?e.hash!==n:!e.hash.startsWith(n.slice(0,-1)))return!1}return!t.tags||t.tags.some(n=>e.tags.has(n))},Md=e=>{try{return JSON.stringify(e),!0}catch{return!1}},aa=(e,t)=>{if(Object.is(e,t))return e;if(!e||!t||typeof e!="object"||typeof t!="object")return t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return t;let a=t.map((o,r)=>aa(e[r],o));return a.every((o,r)=>o===e[r])?e:a}if(Array.isArray(e)||Array.isArray(t)||Object.getPrototypeOf(e)!==Object.prototype||Object.getPrototypeOf(t)!==Object.prototype)return t;let n=Object.keys(t);if(n.length!==Object.keys(e).length)return t;let s={};for(let a of n){if(!(a in e))return t;s[a]=aa(e[a],t[a])}return n.every(a=>s[a]===e[a])?e:s},Ad=({staleTime:e=3e4,gcTime:t=3e5,retry:n=2,retryDelay:s=1e3,refetchOnWindowFocus:a=!1,refetchOnReconnect:o=!0}={})=>{let r=new Map,d=new Set,u=new Map,l=null,f=!1,m=h=>{for(let v of d)v(h)},g=h=>h.state,w=h=>!h.invalidated&&Date.now()-h.state.updatedAt.peek()<h.options.staleTime,y=h=>{h.invalidated=!0,h.state.isStale.value=!0},A=h=>{h.gcTimer&&clearTimeout(h.gcTimer),h.gcTimer=null},ae=h=>{A(h),!h.observers&&Number.isFinite(h.options.gcTime)&&(h.gcTimer=setTimeout(()=>{!h.observers&&!h.promise&&(r.delete(h.hash),m({type:"gc",key:h.key}))},h.options.gcTime))},O=h=>{h.pollTimer&&clearTimeout(h.pollTimer),h.pollTimer=null},pe=h=>{O(h);let v=typeof h.options.refetchInterval=="function"?h.options.refetchInterval(h):h.options.refetchInterval;h.observers&&Number.isFinite(v)&&v>0&&(h.pollTimer=setTimeout(async()=>{Ro()&&await he(h,{force:!0}).catch(()=>{}),pe(h)},v))},q=(h,v=ot(h.queryKey))=>{let k={staleTime:e,gcTime:t,retry:n,retryDelay:s,...h},S={hash:v,key:h.queryKey,queryFn:h.queryFn,options:k,tags:new Set(h.tags??[]),observers:0,invalidated:!0,promise:null,ctrl:null,version:0,gcTimer:null,pollTimer:null,state:{data:I(h.initialData),error:I(null),status:I(h.initialData===void 0?"idle":"success"),fetchStatus:I("idle"),updatedAt:I(h.initialData===void 0?0:Date.now()),isStale:I(!0)}};return r.set(v,S),S},Q=h=>{if(!h?.queryKey)throw new TypeError("query: queryKey is required");let v=ot(h.queryKey),k=r.get(v)??q(h,v);h.queryFn&&(k.queryFn=h.queryFn),k.options={...k.options,...h};for(let S of h.tags??[])k.tags.add(S);return k},he=(h,{force:v=!1}={})=>{if(!h.queryFn)return Promise.reject(new TypeError(`query ${h.hash} has no queryFn`));if(!v&&w(h))return Promise.resolve(h.state.data.peek());if(h.promise)return h.promise;if(!Ro())return h.state.fetchStatus.value="paused",Promise.reject(new Error("Query paused while offline"));A(h);let k=++h.version,S=new AbortController;h.ctrl=S,xe(()=>{h.state.data.peek()===void 0&&(h.state.status.value="pending"),h.state.fetchStatus.value="fetching",h.state.error.value=null}),m({type:"fetch",key:h.key});let U=async(j,V)=>{try{return await h.queryFn({queryKey:h.key,signal:S.signal,meta:h.options.meta})}catch(R){if(S.signal.aborted||R?.name==="AbortError"||j<=0||h.options.retry===!1)throw R;return await Cd(typeof V=="function"?V(j,R):V),U(j-1,typeof V=="number"?V*2:V)}},F=U(h.options.retry??n,h.options.retryDelay??s).then(j=>(h.version===k&&!S.signal.aborted&&xe(()=>{h.state.data.value=h.options.structuralSharing===!1?j:aa(h.state.data.peek(),j),h.state.status.value="success",h.state.fetchStatus.value="idle",h.state.updatedAt.value=Date.now(),h.state.isStale.value=!1,h.invalidated=!1}),m({type:"success",key:h.key}),j)).catch(j=>{throw h.version===k&&!S.signal.aborted&&xe(()=>{h.state.error.value=j,h.state.status.value=h.state.data.peek()===void 0?"error":"success",h.state.fetchStatus.value="idle"}),S.signal.aborted||m({type:"error",key:h.key,error:j}),j}).finally(()=>{h.promise===F&&(h.promise=null,h.ctrl=null,ae(h))});return h.promise=F,F},Ae=h=>Promise.all([...r.values()].filter(v=>us(v,h)&&v.observers).map(v=>he(v,{force:!0}).catch(()=>{}))),L={query(h){let v=Q(h);v.observers++,A(v),pe(v),h.enabled!==!1&&(!w(v)||h.refetchOnMount)&&he(v).catch(()=>{});let k=()=>{v.observers=Math.max(0,v.observers-1),ae(v),pe(v)};return[g(v),{refetch:()=>he(v,{force:!0}),invalidate:()=>L.invalidateQueries({queryKey:v.key,exact:!0}),setData:S=>L.setQueryData(v.key,S),cancel:()=>L.cancelQueries({queryKey:v.key,exact:!0}),dispose:k}]},prefetchQuery(h){let v=Q(h);return he(v)},fetchQuery(h){let v=Q(h);return he(v)},getQueryData(h){return r.get(ot(h))?.state.data.peek()},getQueryState(h){let v=r.get(ot(h));return v&&g(v)},setQueryData(h,v,{tags:k}={}){let S=r.get(ot(h))??Q({queryKey:h,tags:k}),U=typeof v=="function"?v(S.state.data.peek()):v,F=S.options.structuralSharing===!1?U:aa(S.state.data.peek(),U);xe(()=>{S.state.data.value=F,S.state.status.value="success",S.state.error.value=null,S.state.updatedAt.value=Date.now(),S.state.isStale.value=!1}),S.invalidated=!1;for(let j of k??[])S.tags.add(j);return m({type:"set",key:S.key}),l&&l.postMessage({type:"invalidate",hash:S.hash}),F},invalidateQueries(h){for(let v of r.values())us(v,h)&&y(v);return m({type:"invalidate",filter:h}),l&&l.postMessage({type:"invalidate",filter:h}),Ae(h)},cancelQueries(h){for(let v of r.values())us(v,h)&&v.ctrl?.abort()},removeQueries(h){for(let v of[...r.values()])us(v,h)&&(v.ctrl?.abort(),A(v),O(v),r.delete(v.hash))},mutate({mutationFn:h,variables:v,optimistic:k,invalidate:S,onMutate:U,onSuccess:F,onError:j,networkMode:V="online"}={}){if(typeof h!="function")return Promise.reject(new TypeError("mutate: mutationFn is required"));let R=[],ve=D=>(Array.isArray(D)?D:[D]).filter(Boolean).forEach(de=>{let Kt=L.getQueryData(de.queryKey);R.push([de.queryKey,Kt]),L.setQueryData(de.queryKey,In=>de.updater(In))}),Ke=async()=>{let D=await U?.(v,{client:L});k&&ve(typeof k=="function"?k(v):k);try{let de=await h(v);return await F?.(de,v,D),S&&await L.invalidateQueries(S),m({type:"mutation-success"}),de}catch(de){for(let[Kt,In]of R)L.setQueryData(Kt,In);throw await j?.(de,v,D),m({type:"mutation-error",error:de}),de}};return!Ro()&&V==="offlineFirst"?(ge.push(Ke),m({type:"mutation-queued"}),Promise.resolve({queued:!0})):Ke()},infiniteQuery({queryKey:h,queryFn:v,initialPageParam:k=0,getNextPageParam:S,...U}){let[F,j]=L.query({queryKey:h,...U,queryFn:async V=>({pages:[await v({...V,pageParam:k})],pageParams:[k]})});return[F,{...j,fetchNextPage:async()=>{let V=F.data.peek()??{pages:[],pageParams:[]},R=S?.(V.pages.at(-1),V.pages);if(R==null)return;let ve=await v({queryKey:h,pageParam:R,signal:new AbortController().signal});return L.setQueryData(h,{pages:[...V.pages,ve],pageParams:[...V.pageParams,R]}),ve}}]},dehydrate({shouldDehydrate:h=k=>k.state.status.peek()==="success",version:v=1}={}){return{version:v,timestamp:Date.now(),queries:[...r.values()].filter(h).filter(k=>Md(k.state.data.peek())).map(k=>({key:k.key,data:k.state.data.peek(),updatedAt:k.state.updatedAt.peek(),staleTime:k.options.staleTime,tags:[...k.tags]}))}},hydrate(h,{version:v=1}={}){if(!h||h.version!==v||!Array.isArray(h.queries))return!1;for(let k of h.queries){let S=r.get(ot(k.key))??Q({queryKey:k.key,staleTime:k.staleTime,tags:k.tags});xe(()=>{S.state.data.value=k.data,S.state.status.value="success",S.state.updatedAt.value=k.updatedAt,S.state.isStale.value=Date.now()-k.updatedAt>=S.options.staleTime}),S.invalidated=S.state.isStale.peek()}return m({type:"hydrate"}),!0},persist({storage:h=typeof localStorage>"u"?null:localStorage,key:v="mini-react-query",version:k=1}={}){if(!h)throw new Error("persist: a storage adapter is required");let S=!1,U=async()=>{let j=JSON.stringify(L.dehydrate({version:k}));return h.set?h.set(v,j):h.setItem(v,j)},F=L.subscribe(()=>{S||(S=!0,queueMicrotask(()=>{S=!1,U().catch(()=>{})}))});return{restore:async()=>{let j=await(h.get?h.get(v):h.getItem(v));return j?L.hydrate(JSON.parse(j),{version:k}):!1},save:U,dispose:F}},sync(h="mini-react-query"){return typeof BroadcastChannel>"u"?()=>{}:(l?.close(),l=new BroadcastChannel(h),l.onmessage=v=>{if(v.data?.type!=="invalidate")return;let k=v.data.hash?S=>S.hash===v.data.hash:v.data.filter;for(let S of r.values())us(S,k)&&y(S);Ae(k)},()=>{l?.close(),l=null})},subscribe(h){return d.add(h),()=>d.delete(h)},getDebugSnapshot(){return[...r.values()].map(h=>({key:h.key,observers:h.observers,status:h.state.status.peek(),fetchStatus:h.state.fetchStatus.peek(),updatedAt:h.state.updatedAt.peek(),stale:h.state.isStale.peek(),tags:[...h.tags]}))},async fetchJSON(h,v={},{queryKey:k=["GET",h,v.body??null],...S}={}){let U=ot(k);return L.fetchQuery({queryKey:k,...S,queryFn:async({signal:F})=>{let j=new Headers(v.headers),V=u.get(U);V?.etag&&j.set("If-None-Match",V.etag);let R=await fetch(h,{...v,headers:j,signal:F});if(R.status===304&&V)return L.getQueryData(k);if(!R.ok)throw new Error(`HTTP ${R.status}`);let ve=R.headers.get("cache-control")?.match(/max-age=(\d+)/)?.[1];if(ve){let Ke=r.get(U);Ke&&(Ke.options.staleTime=Number(ve)*1e3)}return u.set(U,{etag:R.headers.get("etag")}),R.json()}})},destroy(){f=!0;for(let h of r.values())h.ctrl?.abort(),A(h),O(h);l?.close(),d.clear()}},ge=[],be=()=>{a&&Ae()},oe=()=>{for(o&&Ae();ge.length;)ge.shift()().catch(()=>{})};typeof window<"u"&&(window.addEventListener("focus",be),window.addEventListener("online",oe));let Gt=L.destroy;return L.destroy=()=>{f||(typeof window<"u"&&(window.removeEventListener("focus",be),window.removeEventListener("online",oe)),Gt())},L},Uf=Ad(),oa=({cache:e=!0,ttl:t=3e4,retry:n=2,retryDelay:s=1e3,store:a=null,dedupe:o=!0}={})=>{let r=new Map,d=new Map,u=new Map,l=(m,g)=>{if(a)return a.get(m);let w=r.get(m);return w&&Date.now()-w.ts<g?w.data:void 0},f=async(m,g,w)=>{if(a)return a.set(m,g,{ttl:w});r.set(m,{data:g,ts:Date.now()})};return{get:(m,g,w={})=>{let y=w.ttl??t,A=e&&w.cache!==!1&&y!==0,ae=w.dedupe??o;if(ae&&d.has(m))return d.get(m);let O=()=>{let q=u.get(m)??0,Q=(he,Ae)=>Promise.resolve(g()).then(async L=>(A&&(u.get(m)??0)===q&&await f(m,L,y),L)).catch(L=>{if(he>0&&L?.name!=="AbortError")return new Promise(ge=>setTimeout(ge,Ae)).then(()=>Q(he-1,Ae*2));throw L});return Q(w.retry??n,s)},pe=q=>(ae&&(d.set(m,q),q.finally(()=>{d.get(m)===q&&d.delete(m)}).catch(()=>{})),q);if(!A)return pe(O());if(!a){let q=l(m,y);return q!==void 0?Promise.resolve(q):pe(O())}return pe(Promise.resolve(l(m,y)).then(q=>q!==void 0?q:O()))},invalidate:m=>{if(m!==void 0)u.set(m,(u.get(m)??0)+1);else{for(let g of r.keys())u.set(g,(u.get(g)??0)+1);for(let g of d.keys())u.set(g,(u.get(g)??0)+1)}if(a)return m===void 0?a.clear():a.delete(m);m===void 0?r.clear():r.delete(m)}}},Ff=new TextEncoder,Wf=new TextDecoder,Ii=(e,t="kv")=>{let n=null,s=()=>n?Promise.resolve(n):new Promise((o,r)=>{let d=indexedDB.open(e,1);d.onupgradeneeded=u=>u.target.result.createObjectStore(t),d.onsuccess=u=>{n=u.target.result,o(n)},d.onerror=u=>r(u.target.error)}),a=async(o,r)=>{let d=await s();return new Promise((u,l)=>{let f=d.transaction(t,o),m=r(f.objectStore(t));m.onsuccess=()=>u(m.result),m.onerror=()=>l(m.error)})};return{async get(o){let r=await a("readonly",d=>d.get(o));if(r){if(r.expires&&Date.now()>r.expires){this.delete(o);return}return r.val}},async set(o,r,{ttl:d}={}){await a("readwrite",u=>u.put({val:r,expires:d?Date.now()+d:null},o))},delete:o=>a("readwrite",r=>r.delete(o)),clear:()=>a("readwrite",o=>o.clear()),keys:()=>a("readonly",o=>o.getAllKeys())}}});var K=W(()=>{Ti()});var Hi={};cs(Hi,{AGENT_DEFAULT_MODEL:()=>_i,AGENT_LABELS:()=>Z,AGENT_MODELS:()=>Fo,LOW_TURN_THRESHOLD:()=>Go,activityHits:()=>rt,activityLoading:()=>bt,addCustomModel:()=>Vt,agentFilter:()=>ye,agentFilters:()=>Qt,agentsMeta:()=>Jt,chatDensity:()=>_e,collapsedFolders:()=>jn,ctx:()=>c,currentAgent:()=>$,currentEffort:()=>te,currentModel:()=>N,currentPermission:()=>ue,currentProject:()=>E,currentTab:()=>X,expandedFolders:()=>An,favoritesOnly:()=>ze,filesPath:()=>Y,filesRoot:()=>ie,filteredSessions:()=>_t,getCustomModels:()=>ia,getDefaultEffort:()=>Qe,getDefaultModel:()=>Oe,getEffortsForModel:()=>Yt,getModelsForAgent:()=>Be,getSavedModel:()=>Di,getSessionMeta:()=>Dn,gitRoot:()=>Se,hubMachineReady:()=>it,hubMode:()=>M,isProcessing:()=>P,machinesList:()=>le,metaKey:()=>J,projectGroups:()=>Xt,removeCustomModel:()=>Jo,selectedMachineId:()=>_,sessionDisplayTitle:()=>vt,sessionFilter:()=>ke,sessionMetaMap:()=>T,sessionSearch:()=>$e,sessionSort:()=>Ci,sessionsData:()=>ne,setAgent:()=>Ne,setChatDensity:()=>Ko,setCurrentModel:()=>se,setSelectedMachine:()=>Le,showHiddenOnly:()=>Je,sidebarView:()=>gt,timeRange:()=>ra,viewingFile:()=>re,workspacesData:()=>fe,wsStatus:()=>me});function Ai(){try{let e=JSON.parse(localStorage.getItem(Mi)||"{}");return e&&typeof e=="object"?e:{}}catch{return{}}}function ji(e,t=c.sessionId,n=c.machineId){if(!t)return"";let s=(e||"claude").toLowerCase();return`${n||""}:${s}:${t}`}function Di(e,t=c.sessionId,n=c.machineId){let s=ji(e,t,n);if(!s)return null;let a=Ai()[s];return typeof a=="string"&&a.trim()?a:null}function se(e,t=$.peek(),n=c.sessionId,s=c.machineId){let a=String(e||"").trim();if(!a)return;let o=ji(t,n,s);if(o){let r=Ai();r[o]=a,localStorage.setItem(Mi,JSON.stringify(r))}N.value=a}function Le(e){let t=e||null;_.value=t,c.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function J(e,t,n){let s=`${e||"claude"}:${t}`;return n||c?.machineId?`${n||c.machineId}:${s}`:s}function Dn(e,t,n){return T.peek()?.[J(e,t,n)]||{favorite:!1,notes:"",title:"",hidden:!1,branch:null}}function vt(e,{preferSnippet:t=!1}={}){if(!e)return"Session";if(t&&e.snippet)return e.snippet;let s=(Dn(e.agent,e.sessionId,e.machineId).title||"").trim();return s||e.display||e.sessionId?.slice(0,8)||"Session"}function Ko(e){let t=["clean","normal","full"].includes(e)?e:"normal";_e.value=t,localStorage.setItem("chatDensity",t),document.getElementById("messages")?.setAttribute("data-density",t)}function Dd(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 zo(){try{let e=localStorage.getItem(Ni);if(!e)return{};let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function Pi(e){localStorage.setItem(Ni,JSON.stringify(e))}function ia(e){let t=(e||"claude").toLowerCase(),n=zo()[t];return Array.isArray(n)?n.filter(Boolean).map(String):[]}function Vt(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim();if(!s)return!1;let a=zo(),o=Array.isArray(a[n])?[...a[n]]:[];return o.includes(s)||o.push(s),a[n]=o,Pi(a),!0}function Jo(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim(),a=zo(),o=Array.isArray(a[n])?a[n].filter(r=>r!==s):[];return a[n]=o,Pi(a),!0}function Be(e){let t=(e||"claude").toLowerCase(),n=Jt.peek()?.defaults?.[t],s=n?.models?.length?n.models.map(Dd).filter(Boolean):(Fo[t]||Fo.claude).map(r=>({...r})),a=ia(t),o=new Set(s.map(r=>r.value));for(let r of a){if(o.has(r)){s=s.map(d=>{if(d.value!==r)return d;let u=String(d.label||d.value);return{...d,custom:!0,label:u.includes("\u2605")?u:`${u} \u2605`}});continue}o.add(r),s.push({value:r,label:`${r} \u2605`,custom:!0})}return s}function Oe(e){let t=(e||"claude").toLowerCase(),n=Jt.peek()?.defaults?.[t];return n?.model?String(n.model):_i[t]||Be(t)[0]?.value||"sonnet"}function Yt(e,t){let s=Be(e).find(o=>o.value===t);if(s?.efforts?.length)return s.efforts;let a=Jt.peek()?.defaults?.[(e||"claude").toLowerCase()];return a?.efforts?.length?a.efforts.map(String):["low","medium","high","xhigh","max"]}function Qe(e,t){let n=(e||"claude").toLowerCase(),s=Jt.peek()?.defaults?.[n];if(s?.effortDefault)return String(s.effortDefault);let o=Be(n).find(r=>r.value===t);return o?.defaultEffort?String(o.defaultEffort):n==="grok"?"low":n==="gemini"&&String(t||"").match(/-(low|medium|high)$/i)?.[1]?.toLowerCase()||""}function Ne(e){let t=(e||"claude").toLowerCase();$.value=t,localStorage.setItem("agent",t),ue.value="bypassPermissions";let n=typeof document>"u"?null:document.getElementById("sel-permission");n&&(n.value=ue.peek());let s=Di(t);s?N.value=s:se(Oe(t),t);let a=Qe(t,N.peek());a?te.value=a:t!=="grok"&&t!=="gemini"&&(te.value="")}function _d(e,t){return!t||t==="all"?!0:(e.agent||"claude")===t}function Nd(e,t){if(!t)return!0;let n=T.value?.[J(e.agent,e.sessionId,e.machineId)];return[e.display,e.cwd,e.projectName,e.agent,e.sessionId,e.snippet,e.machineId,n?.notes,n?.title].filter(Boolean).join(" ").toLowerCase().includes(t)}function Wo(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}var ne,fe,ke,$e,Ci,An,jn,Y,re,E,X,P,me,Mi,jd,$,N,te,ue,ie,Se,Jt,gt,ye,Qt,ra,rt,bt,T,ze,Je,Go,_e,M,le,_,it,c,Z,Fo,_i,Ni,_t,Xt,G=W(()=>{K();ne=I([]),fe=I([]),ke=I(null),$e=I(""),Ci=I("time"),An=I(new Set),jn=I(new Set),Y=I(""),re=I(null),E=I(null),X=I("chat"),P=I(!1),me=I("idle"),Mi="modelBySession",jd=localStorage.getItem("agent")||"claude";$=I(jd),N=I("sonnet"),te=I(""),ue=I("bypassPermissions"),ie=I(""),Se=I(""),Jt=I(null),gt=I(localStorage.getItem("sidebarView")||"projects"),ye=I(localStorage.getItem("agentFilter")||"all"),Qt=I((()=>{try{let e=JSON.parse(localStorage.getItem("agentFilters")||"[]");return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}})()),ra=I(localStorage.getItem("timeRange")||"14"),rt=I(null),bt=I(!1),T=I({}),ze=I(localStorage.getItem("favoritesOnly")==="1"),Je=I(localStorage.getItem("showHiddenOnly")==="1"),Go=2,_e=I(localStorage.getItem("chatDensity")||"normal"),M=I(!1),le=I([]),_=I(null),it=I(!1),c={token:localStorage.getItem("token"),sessionId:null,agent:null,machineId:null,ws:null,shellBubble:null,configDir:null,externalSessionReadOnly:!1,role:null,username:null,lock:{key:null,token:null,holder:null,held:!1,foreign:!1}};Z={claude:"Claude",codex:"Codex",grok:"Grok",gemini:"Gemini",cursor:"Cursor"},Fo={claude:[{value:"fable",label:"fable"},{value:"opus",label:"opus"},{value:"sonnet",label:"sonnet"},{value:"haiku",label:"haiku"}],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"}],gemini:[{value:"gemini-3.7-flash-high",label:"Gemini 3.7 Flash (High)"},{value:"gemini-3.7-flash-medium",label:"Gemini 3.7 Flash (Medium)"},{value:"gemini-3.7-flash-low",label:"Gemini 3.7 Flash (Low)"},{value:"gemini-3.6-flash-high",label:"Gemini 3.6 Flash (High)"},{value:"gemini-3.6-flash-medium",label:"Gemini 3.6 Flash (Medium)"},{value:"gemini-3.6-flash-low",label:"Gemini 3.6 Flash (Low)"},{value:"gemini-3.5-flash-high",label:"Gemini 3.5 Flash (High)"},{value:"gemini-3.5-flash-medium",label:"Gemini 3.5 Flash (Medium)"},{value:"gemini-3.5-flash-low",label:"Gemini 3.5 Flash (Low)"},{value:"gemini-3.1-pro-high",label:"Gemini 3.1 Pro (High)"},{value:"gemini-3.1-pro-low",label:"Gemini 3.1 Pro (Low)"}],cursor:[{value:"auto",label:"Auto"},{value:"gpt-5.3-codex",label:"GPT-5.3 Codex"},{value:"composer-2.5",label:"Composer 2.5"}]},_i={claude:"sonnet",codex:"gpt-5.4",grok:"grok-4.5",gemini:"gemini-3.7-flash-high",cursor:"auto"};Ni="customModelsByAgent";_t=Uo(()=>{let e=$e.value.toLowerCase().trim(),t=Ci.value,n=ye.value,s=Qt.value,a=ze.value,o=Je.value,r=T.value,d=rt.value,u=d?.results?.length&&e?Wo(d.results):Wo(ne.value),l=_.value;return M.value&&l&&(u=u.filter(f=>f&&(!f.machineId||f.machineId===l))),u=u.filter(f=>f&&(s.length?s.includes(f.agent||"claude"):_d(f,n))),o?u=u.filter(f=>f&&r?.[J(f.agent,f.sessionId,f.machineId)]?.hidden):u=u.filter(f=>f&&!r?.[J(f.agent,f.sessionId,f.machineId)]?.hidden),a&&(u=u.filter(f=>f&&r?.[J(f.agent,f.sessionId,f.machineId)]?.favorite)),e&&!(d?.results&&d.q===e)&&(u=u.filter(f=>f&&Nd(f,e))),u=[...u].sort((f,m)=>{let g=r?.[J(f.agent,f.sessionId,f.machineId)]?.favorite?1:0,w=r?.[J(m.agent,m.sessionId,m.machineId)]?.favorite?1:0;return g!==w?w-g:t==="project"&&(f.cwd||"").localeCompare(m.cwd||"")||m.updatedAt-f.updatedAt}),!e&&!a?u.slice(0,120):u}),Xt=Uo(()=>{let e=Wo(_t.value),t=new Map;for(let n of e){if(!n)continue;let s=n.machineId?`${n.machineId}::${n.cwd||"(no path)"}`:n.cwd||"(no path)";t.has(s)||t.set(s,{cwd:n.cwd||null,machineId:n.machineId||null,projectName:n.projectName||(n.cwd?n.cwd.split("/").filter(Boolean).pop():"(no path)"),updatedAt:0,agents:{},sessions:[],latest:null});let a=t.get(s);a.sessions.push(n),a.agents[n.agent||"claude"]=(a.agents[n.agent||"claude"]||0)+1,(n.updatedAt||0)>a.updatedAt&&(a.updatedAt=n.updatedAt,a.latest=n)}return[...t.values()].sort((n,s)=>s.updatedAt-n.updatedAt)})});function fs(e={}){return e.machineId!==void 0?e.machineId:c.machineId||_.peek()||null}function qd(e){let t=e.split("?")[0];return t==="/api/hub"||t==="/api/machines"||t==="/api/notifications"||t==="/api/notifications/read"||t==="/api/notes"||t.startsWith("/api/notes/")||t==="/api/queue"||t.startsWith("/api/queue/")||t.startsWith("/api/ai/")||t.startsWith("/api/auth/")||t.startsWith("/api/collab/")}async function x(e,t,n,s,a={}){let o=a.hub?null:fs(a),r={"Content-Type":"application/json",...c.token?{Authorization:`Bearer ${c.token}`}:{}};!a.hub&&M.peek()&&o&&!qd(t)&&(r["X-Machine-Id"]=o),e.toUpperCase()!=="GET"&&e.toUpperCase()!=="HEAD"&&c.lock?.token&&c.lock?.key&&!String(t).startsWith("/api/collab/")&&(r["X-Lock-Token"]=c.lock.token,r["X-Lock-Key"]=c.lock.key);let u=a.etag===!0?`${c.token||""}:${o||""}:${t}`:a.etag||null;if(e.toUpperCase()==="GET"&&u){let m=Ri.get(u);m&&(r["If-None-Match"]=m)}let l=async()=>{let m=await fetch(t,{method:e,signal:s,headers:r,cache:a.cache||(e.toUpperCase()==="GET"?"no-store":"default"),...n!==void 0?{body:JSON.stringify(n)}:{}});if(m.status===304)return Hd;let g=await m.json().catch(()=>({}));if(!m.ok)throw new Error(g.error||`HTTP ${m.status}`);if(u){let w=m.headers.get("ETag");w&&Ri.set(u,w)}return g};if(e.toUpperCase()!=="GET"||s||a.dedupe===!1)return l();let f=`${c.token||""}:${o||""}:${t}`;return Pd.get(f,l)}function lt(e){return c.ws?.readyState===WebSocket.OPEN?(c.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||la.push(e),!1)}function ca(){for(;la.length&&c.ws?.readyState===WebSocket.OPEN;)c.ws.send(JSON.stringify(la.shift()))}function da(){la.length=0}function Qo(e={}){let t=new URLSearchParams(e);c.token&&t.set("token",c.token);let n=fs();return M.peek()&&n&&t.set("machine",n),t.toString()}function ct(e={},t={}){let n={...e};c.token&&(n.Authorization=`Bearer ${c.token}`);let s=fs();return!t.hub&&M.peek()&&s&&(n["X-Machine-Id"]=s),n}async function ua(){try{let e=await fetch("/api/hub");if(!e.ok)return M.value=!1,!1;let t=await e.json();if(t?.hub)return M.value=!0,t}catch{}return M.value=!1,!1}var Pd,Ri,Hd,la,ce=W(()=>{G();K();Pd=oa({cache:!1,dedupe:!0,retry:0}),Ri=new Map,Hd=Symbol("not-modified");la=[]});function Zt(e,t){e&&(t?e.setAttribute("inert",""):e.removeAttribute("inert"))}function _n(e){return!e||e.classList.contains("hidden")?!0:e.style.display==="none"}function Ee(){let e=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,t=document.getElementById("sidebar");if(t){let s=!e||t.classList.contains("open");Zt(t,!s)}Zt(document.getElementById("welcome"),_n(document.getElementById("welcome"))),Zt(document.getElementById("auth-screen"),_n(document.getElementById("auth-screen"))),Zt(document.getElementById("chat-opts"),_n(document.getElementById("chat-opts"))),Zt(document.getElementById("machine-picker"),_n(document.getElementById("machine-picker")));for(let s of["files","git","shell","memory"]){let a=document.getElementById(`tab-${s}`);Zt(a,_n(a))}let n=document.getElementById("tab-chat");n&&Zt(n,_n(n))}function ms(){let e=window.visualViewport,t=document.documentElement;if(!e)return;let n=e.height<window.innerHeight-80;t.classList.toggle("vv-keyboard",n),t.style.setProperty("--vvh",`${Math.round(e.height)}px`),t.style.setProperty("--vv-top",`${Math.round(e.offsetTop)}px`)}function Oi(){Ee(),ms();let e=window.visualViewport;e&&(e.addEventListener("resize",ms),e.addEventListener("scroll",ms)),window.addEventListener("resize",()=>{ms(),Ee()}),window.addEventListener("orientationchange",()=>{setTimeout(()=>{ms(),Ee()},250)})}var Nn=W(()=>{});function en(){try{let e=localStorage.getItem(Ui);return e?JSON.parse(e):null}catch{return null}}function Vo(e){try{let n={...en()||{},...e,updatedAt:Date.now()};localStorage.setItem(Ui,JSON.stringify(n))}catch{}}var Ui,fa=W(()=>{Ui="lastSessionContext"});function Rd(e){let t=String(e??"").trim();if(!t)return"";try{return decodeURIComponent(t)}catch{return t}}function Fi(e){return String(e||"").replace(/\\/g,"/")}function Bd(e){return e.replace(/:[0-9]+(?::[0-9]+)?$/,"")}function ma(e,t){let n=Rd(e);if(!n||/^(https?:|mailto:|tel:|javascript:|#)/i.test(n)||(n=Fi(n).split(/[?#]/)[0],n=n.replace(/^file:\/\//i,""),/^\/[A-Za-z]:\//.test(n)&&(n=n.slice(1)),!n||n==="."||n==="/")||/^\/(api|ws|session)\b/.test(n))return null;let s=n.endsWith("/"),a=Bd(n.replace(/\/+$/,"")),o=Fi(t).replace(/\/+$/,"");if((a.startsWith("/")||/^[A-Za-z]:\//.test(a))&&o){let d=a.toLowerCase(),u=o.toLowerCase();if(d===u)return{relative:"",isDir:!0,root:o};if(d.startsWith(`${u}/`))return{relative:a.slice(o.length+1),isDir:s,root:o};let l=a.split("/"),f=l.pop()||"",m=l.join("/")||(a.startsWith("/")?"/":"");return{relative:f,isDir:s,root:m}}if(a=a.replace(/^\.\//,""),a.startsWith("../")&&o){let d=o.split("/"),u=a.split("/");for(let f of u)f===".."?d.pop():f&&f!=="."&&d.push(f);let l=d.join("/")||"/";return ma(l,t)}return{relative:a,isDir:s,root:o||t}}var Yo=W(()=>{});function Ud(){let e=document.getElementById("mermaid-zoom-overlay");if(e)return e;e=document.createElement("div"),e.id="mermaid-zoom-overlay",e.className="mermaid-zoom-overlay hidden",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-label","Mermaid diagram enlarged"),e.innerHTML='<button type="button" class="mermaid-zoom-close" aria-label="\u5173\u95ED\u653E\u5927\u56FE">\xD7</button><div class="mermaid-zoom-canvas"></div>',document.body.appendChild(e);let t=()=>e.classList.add("hidden");return e.addEventListener("click",n=>{(n.target===e||n.target.closest(".mermaid-zoom-close"))&&t()}),Gi||(Gi=!0,document.addEventListener("keydown",n=>{n.key==="Escape"&&t()})),e}function Ki(e){let t=e.querySelector("svg");if(!t)return;let n=Ud(),s=n.querySelector(".mermaid-zoom-canvas");s.innerHTML=t.outerHTML;let a=s.querySelector("svg");a?.removeAttribute("width"),a?.removeAttribute("height"),n.classList.remove("hidden")}function Fd(){let e=globalThis.mermaid;return!e||Wi||(e.initialize({startOnLoad:!1,securityLevel:"strict",theme:document.documentElement.dataset.theme==="dark"?"dark":"default",flowchart:{htmlLabels:!1}}),Wi=!0),e}function Wd(e){let t=String(e||"").replace(/\r\n?/g,`
2
+ `).trim();return t=t.replace(/^```(?:mermaid)?\s*/i,"").replace(/\s*```$/,"").trim(),t=t.replace(/^mermaid\s*\n/i,""),t=t.replace(/^graph\s+(TD|TB|BT|RL|LR)\b/i,"flowchart $1"),t}function xt(e){let t=Fd();!t||!e||e.querySelectorAll("pre code.language-mermaid, pre code.lang-mermaid").forEach(n=>{if(n.dataset.mermaidHandled)return;let s=n.closest("pre"),a=Wd(n.textContent);if(!s||!a)return;n.dataset.mermaidHandled="1";let o=document.createElement("div");o.className="mermaid-diagram",o.setAttribute("role","img"),o.setAttribute("aria-label","Mermaid diagram"),s.replaceWith(o);let r=`mermaid-diagram-${++Od}`;Promise.resolve(t.parse(a)).then(()=>t.render(r,a)).then(({svg:d,bindFunctions:u})=>{o.innerHTML=d,u?.(o),o.tabIndex=0,o.title="\u70B9\u51FB\u653E\u5927\u56FE\u8868",o.addEventListener("click",l=>{l.target.closest("a")||Ki(o)}),o.addEventListener("keydown",l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),Ki(o))})}).catch(d=>{o.replaceWith(s),delete n.dataset.mermaidHandled,s.classList.add("mermaid-error"),s.title=`Mermaid render failed: ${d?.message||"invalid diagram"}`})})}var Wi,Od,Gi,Pn=W(()=>{Wi=!1,Od=0,Gi=!1});function Zo(e){return Gd.test(String(e||""))}function Kd(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function zi(e,t){return t===0||e[t-1]===`
3
+ `}function zd(e,t){if(zi(e,t)&&(e.startsWith("```",t)||e.startsWith("~~~",t))){let n=e.startsWith("```",t)?"```":"~~~",s=e.indexOf(`
4
+ `+n,t+3);return s===-1?{end:e.length}:{end:s+1+n.length}}if(e[t]==="`"){let n=1;for(;e[t+n]==="`";)n++;let s=t+n;for(;s<e.length;){if(e[s]==="`"){let a=0;for(;e[s+a]==="`";)a++;if(a===n)return{end:s+a};s+=a;continue}s++}return{end:t+n}}return null}function Jd(e,t){let n=e.slice(t);if(n.startsWith("$$")){let s=n.indexOf("$$",2);if(s>=2){let a=n.slice(2,s);if(a.trim())return{body:a,display:!0,end:t+s+2}}}if(n.startsWith("\\[")){let s=n.indexOf("\\]",2);if(s>=2){let a=n.slice(2,s);if(a.trim())return{body:a,display:!0,end:t+s+2}}}if(n.startsWith("\\(")){let s=n.indexOf("\\)",2);if(s>=2){let a=n.slice(2,s);if(a.trim())return{body:a,display:!1,end:t+s+2}}}if(n[0]==="$"&&n[1]!=="$"){let s=n.match(/^\$([^$\n]|\\\$)+?(?<!\s)\$/);if(s&&s[0][1]!==" "){let a=s[0].slice(1,-1);if(a.trim())return{body:a,display:!1,end:t+s[0].length}}}if(zi(e,t)){let s=n.match(/^[ \t]*\[[ \t]*\n([\s\S]*?)\n[ \t]*\][ \t]*(?=\n|$)/);if(s&&Zo(s[1]))return{body:s[1],display:!0,end:t+s[0].length};let a=n.match(/^[ \t]*\[([^\]\n]+)\](?!\()/);if(a&&Zo(a[1]))return{body:a[1],display:!0,end:t+a[0].length}}return null}function Ji(e){let t=[],n=String(e??""),s="",a=0;for(;a<n.length;){let o=zd(n,a);if(o){s+=n.slice(a,o.end),a=o.end;continue}let r=Jd(n,a);if(r){let d=t.length;t.push({body:r.body,display:r.display}),s+=`@@MATH${d}@@`,a=r.end;continue}s+=n[a],a++}return{text:s,slots:t}}function ha(e,t){return t?.length?String(e).replace(/@@MATH(\d+)@@/g,(n,s)=>{let a=t[Number(s)];if(!a)return n;let o=a.display?"\\[":"\\(",r=a.display?"\\]":"\\)";return Kd(`${o}${a.body}${r}`)}):e}function Qd(e){return e.parentElement?.closest("pre, code, .mermaid-diagram, .katex, script, style")}function Xo(e,t){let n=[{re:/\\\[([\s\S]+?)\\\]/g,display:!0},{re:/\$\$([\s\S]+?)\$\$/g,display:!0},{re:/\\\(([\s\S]+?)\\\)/g,display:!1},{re:/(?<!\\)\$([^$\n]|\\\$)+?(?<!\s)(?<!\\)\$/g,display:!1},{re:/(?:^|\n)[ \t]*\[[ \t]*\n([\s\S]*?)\n[ \t]*\][ \t]*(?=\n|$)/g,display:!0,latex:!0},{re:/(?:^|\n)[ \t]*\[([^\]\n]+\\[a-zA-Z{}_^][^\]\n]*)\](?!\()/g,display:!0,latex:!0}],s=null;for(let a of n){a.re.lastIndex=t;let o=a.re.exec(e);if(!o||s&&o.index>=s.match.index)continue;let r=o[0],d;o[1]!=null&&(a.latex||r.startsWith("\\[")||r.startsWith("\\(")||r.startsWith("$$")||r.startsWith("$"))?d=o[1]:d=r.startsWith("\\[")||r.startsWith("\\(")||r.startsWith("$$")?r.slice(2,-2):r.slice(1,-1),d.trim()&&(a.latex&&!Zo(d)||(s={match:o,body:d,display:a.display}))}return s}function Vd(e){let t=e.nodeValue||"",n=0,s=Xo(t,n);if(!s||typeof globalThis.katex?.renderToString!="function")return;let a=document.createDocumentFragment();for(;s;){s.match.index>n&&a.append(document.createTextNode(t.slice(n,s.match.index)));let o;try{o=globalThis.katex.renderToString(s.body.trim(),{displayMode:s.display,throwOnError:!1,strict:"warn"})}catch{a.append(document.createTextNode(s.match[0])),n=s.match.index+s.match[0].length,s=Xo(t,n);continue}let r=document.createElement(s.display?"div":"span");r.className=s.display?"math-display":"math-inline",r.innerHTML=o,a.append(r),n=s.match.index+s.match[0].length,s=Xo(t,n)}n<t.length&&a.append(document.createTextNode(t.slice(n))),e.replaceWith(a)}function yt(e){if(!e||typeof globalThis.katex?.renderToString!="function")return;let t=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),n=[];for(;t.nextNode();)Qd(t.currentNode)||n.push(t.currentNode);n.forEach(Vd)}var Gd,tn=W(()=>{Gd=/\\[a-zA-Z]+|[_^]\{|\\[,;!]|\\[{}()[\]]|\\leq\b|\\geq\b|\\neq\b|\\in\b|\\sum\b|\\int\b|\\frac\b|\\min\b|\\max\b|\\mathrm\b|\\text\b|\\left\b|\\right\b/});function Xd(e){return String(e??"").replace(Yd,(t,n)=>`
5
5
 
6
6
  > \u26A0\uFE0F \u539F\u59CB\u8BB0\u5F55\u5DF2\u622A\u65AD\uFF08${n} bytes\uFF09
7
7
 
8
- `)}function Ve(e,{fallback:t}={}){let{text:n,slots:s}=Ki(Vd(e));if(typeof marked>"u"){let a=t?t(n):n;return ma(a,s)}try{return ma(marked.parse(n,{breaks:!0,gfm:!0}),s)}catch{let a=t?t(n):n;return ma(a,s)}}var Qd,en=F(()=>{Zt();Qd=/(?:<|\[)\s*(?:…\s*)?truncated\s+([\d,]+)\s+bytes\s*(?:>|\])/gi});function Zo(e,t){let n=fa(e,t||re.peek()||E.peek()?.path||"");if(!n)return!1;if(n.root&&(re.value=n.root),n.isDir)oe.value=null,Y.value=n.relative;else{let s=n.relative.split("/").filter(Boolean);Y.value=s.slice(0,-1).join("/"),oe.value=n.relative}return X.value="files",!0}var er=F(()=>{G();W();le();Vo();_n();Zt();en()});function Xd({sessionId:e=c.sessionId,agent:t=c.agent||$.peek()||"claude",machineId:n=c.machineId||D.peek()||"local"}={}){return e?`session:${n||"local"}:${t||"claude"}:${e}`:null}function tn(){return!((c.role||"editor")==="viewer"||c.lock?.foreign)}function Zd(){document.dispatchEvent(new CustomEvent("session-lock-changed",{detail:c.lock}))}function Nn(e){c.lock={key:null,token:null,holder:null,held:!1,foreign:!1,...e||{}},Zd()}async function yt(e={}){let t=Xd(e);return t?(c.role||"editor")==="viewer"?(Nn({key:t,held:!1,foreign:!0,holder:"viewer"}),{ok:!1,error:"viewers cannot take exclusive locks",code:403}):(c.lock?.key&&c.lock.key!==t&&await ga(),ms||(ms=(async()=>{try{let s={key:t,kind:"session",ttlSec:tr,exclusive:!0,...c.lock?.token&&c.lock?.key===t?{token:c.lock.token}:{}},a=await x("POST","/api/collab/locks",s,void 0,{hub:!0});return Nn({key:t,token:a.token,holder:a.holder,held:!0,foreign:!1,expiresAt:a.expiresAt,version:a.version}),tu(),{ok:!0,lock:a}}catch(s){let a=String(s.message||s);return/locked|HTTP 423|423/.test(a)?(Nn({key:t,held:!1,foreign:!0,holder:"another user"}),{ok:!1,code:423,error:a}):(Nn({key:t,held:!0,foreign:!1,unmanaged:!0}),{ok:!0,skipped:!0,error:a})}finally{ms=null}})(),ms)):(Nn({foreign:!1,held:!0,unmanaged:!0}),{ok:!0,skipped:!0})}async function eu(){let{key:e,token:t,held:n}=c.lock||{};if(!(!e||!t||!n))try{let s=await x("POST","/api/collab/lock-action",{key:e,action:"heartbeat",token:t,ttlSec:tr},void 0,{hub:!0});s?.token&&(c.lock.token=s.token),s?.expiresAt&&(c.lock.expiresAt=s.expiresAt)}catch(s){let a=String(s.message||s);/token mismatch|HTTP 409|409|no lock|HTTP 404|404/.test(a)&&((await yt()).ok||nr())}}function tu(){nr(),ha=setInterval(()=>{eu().catch(()=>{})},Yd)}function nr(){ha&&(clearInterval(ha),ha=null)}async function ga(){nr();let{key:e,token:t}=c.lock||{};if(Nn({held:!1,foreign:!1}),!!e)try{await x("POST","/api/collab/lock-action",{key:e,action:"release",token:t,ttlSec:tr},void 0,{hub:!0})}catch{}}async function zi(){try{let e=await x("GET","/api/collab/me",void 0,void 0,{hub:!0});return c.role=e?.role||c.role||"editor",c.username=e?.username||c.username||null,e}catch{return c.role||(c.role="editor"),null}}var tr,Yd,ha,ms,hs=F(()=>{W();le();tr=60,Yd=2e4,ha=null,ms=null});async function sr(){if(gs&&!(typeof navigator>"u"||!navigator.wakeLock?.request)&&document.visibilityState==="visible"&&!nn)try{nn=await navigator.wakeLock.request("screen"),nn.addEventListener("release",()=>{nn=null,gs&&document.visibilityState==="visible"&&setTimeout(()=>{sr().catch(()=>{})},500)})}catch{nn=null}}async function Ji(){let e=nn;if(nn=null,!!e)try{await e.release()}catch{}}function ba(e){gs=!!e,gs?sr().catch(()=>{}):Ji().catch(()=>{})}function ar(){typeof document>"u"||document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&gs?sr().catch(()=>{}):document.visibilityState==="hidden"&&Ji().catch(()=>{})})}var nn,gs,or=F(()=>{nn=null,gs=!1});function O(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 O(Number(t));let n=Date.parse(t);return Number.isNaN(n)?null:n}return null}function Pn(e){let t=O(e);if(t==null)return"";let n=Date.now()-t;return n<0?new Date(t).toLocaleDateString():n<6e4?"just now":n<36e5?`${Math.floor(n/6e4)}m ago`:n<864e5?`${Math.floor(n/36e5)}h ago`:n<7*864e5?`${Math.floor(n/864e5)}d ago`:new Date(t).toLocaleDateString()}function Hn(e,t=!0){let n=e||"claude",a={claude:"bg-orange-500/15 text-orange-400",codex:"bg-emerald-500/15 text-emerald-400",grok:"bg-sky-500/15 text-sky-400",gemini:"bg-violet-500/15 text-violet-400",cursor:"bg-amber-500/15 text-amber-400"}[n]||"bg-base-300 text-base-content/50",o=t?n==="claude"?"CC":n==="codex"?"CX":n==="grok"?"GX":n==="gemini"?"GM":n==="cursor"?"CU":n.slice(0,2).toUpperCase():Z[n]||n;return`<span class="text-[9px] px-1 py-0.5 rounded font-mono font-semibold flex-shrink-0 ${a}" title="${p(Z[n]||n)}">${o}</span>`}function qn(e){if(!e)return"";let t="",n=e.split("/").filter(Boolean);return n.length<=3?e:"\u2026/"+n.slice(-2).join("/")}var _t=F(()=>{G();W()});function nu(e){let t=O(e);if(t==null)return"";let n=new Date(t);return Number.isNaN(n.getTime())?"":n.toLocaleString()}function Qi(){let e=i("notifications-badge");if(e){if(!sn){e.classList.add("hidden"),e.textContent="0";return}e.classList.remove("hidden"),e.textContent=sn>99?"99+":String(sn)}}function Xi(){let e=i("notifications-menu"),t=i("btn-notifications"),n=i("topbar");if(!e||!t||!n)return;let s=t.getBoundingClientRect(),a=n.getBoundingClientRect(),o=Math.min(416,window.innerWidth-16),r=Math.max(8,Math.min(window.innerWidth-o-8,s.right-o));e.style.top=`${Math.round(a.bottom+8)}px`,e.style.left=`${Math.round(r)}px`,e.style.width=`${Math.round(o)}px`}function bs(){let e=i("notifications-menu-list"),t=i("notifications-menu-empty");if(!(!e||!t)){if(!Pe.length){e.innerHTML="",t.classList.remove("hidden"),Qi();return}t.classList.add("hidden"),e.innerHTML=Pe.map(n=>`
8
+ `)}function Ve(e,{fallback:t}={}){let{text:n,slots:s}=Ji(Xd(e));if(typeof marked>"u"){let a=t?t(n):n;return ha(a,s)}try{return ha(marked.parse(n,{breaks:!0,gfm:!0}),s)}catch{let a=t?t(n):n;return ha(a,s)}}var Yd,nn=W(()=>{tn();Yd=/(?:<|\[)\s*(?:…\s*)?truncated\s+([\d,]+)\s+bytes\s*(?:>|\])/gi});function er(e,t){let n=ma(e,t||ie.peek()||E.peek()?.path||"");if(!n)return!1;if(n.root&&(ie.value=n.root),n.isDir)re.value=null,Y.value=n.relative;else{let s=n.relative.split("/").filter(Boolean);Y.value=s.slice(0,-1).join("/"),re.value=n.relative}return X.value="files",!0}var tr=W(()=>{K();G();ce();Yo();Pn();tn();nn()});function eu({sessionId:e=c.sessionId,agent:t=c.agent||$.peek()||"claude",machineId:n=c.machineId||_.peek()||"local"}={}){return e?`session:${n||"local"}:${t||"claude"}:${e}`:null}function sn(){return!((c.role||"editor")==="viewer"||c.lock?.foreign)}function tu(){document.dispatchEvent(new CustomEvent("session-lock-changed",{detail:c.lock}))}function Hn(e){c.lock={key:null,token:null,holder:null,held:!1,foreign:!1,...e||{}},tu()}async function wt(e={}){let t=eu(e);return t?(c.role||"editor")==="viewer"?(Hn({key:t,held:!1,foreign:!0,holder:"viewer"}),{ok:!1,error:"viewers cannot take exclusive locks",code:403}):(c.lock?.key&&c.lock.key!==t&&await ba(),hs||(hs=(async()=>{try{let s={key:t,kind:"session",ttlSec:nr,exclusive:!0,...c.lock?.token&&c.lock?.key===t?{token:c.lock.token}:{}},a=await x("POST","/api/collab/locks",s,void 0,{hub:!0});return Hn({key:t,token:a.token,holder:a.holder,held:!0,foreign:!1,expiresAt:a.expiresAt,version:a.version}),su(),{ok:!0,lock:a}}catch(s){let a=String(s.message||s);return/locked|HTTP 423|423/.test(a)?(Hn({key:t,held:!1,foreign:!0,holder:"another user"}),{ok:!1,code:423,error:a}):(Hn({key:t,held:!0,foreign:!1,unmanaged:!0}),{ok:!0,skipped:!0,error:a})}finally{hs=null}})(),hs)):(Hn({foreign:!1,held:!0,unmanaged:!0}),{ok:!0,skipped:!0})}async function nu(){let{key:e,token:t,held:n}=c.lock||{};if(!(!e||!t||!n))try{let s=await x("POST","/api/collab/lock-action",{key:e,action:"heartbeat",token:t,ttlSec:nr},void 0,{hub:!0});s?.token&&(c.lock.token=s.token),s?.expiresAt&&(c.lock.expiresAt=s.expiresAt)}catch(s){let a=String(s.message||s);/token mismatch|HTTP 409|409|no lock|HTTP 404|404/.test(a)&&((await wt()).ok||sr())}}function su(){sr(),ga=setInterval(()=>{nu().catch(()=>{})},Zd)}function sr(){ga&&(clearInterval(ga),ga=null)}async function ba(){sr();let{key:e,token:t}=c.lock||{};if(Hn({held:!1,foreign:!1}),!!e)try{await x("POST","/api/collab/lock-action",{key:e,action:"release",token:t,ttlSec:nr},void 0,{hub:!0})}catch{}}async function Qi(){try{let e=await x("GET","/api/collab/me",void 0,void 0,{hub:!0});return c.role=e?.role||c.role||"editor",c.username=e?.username||c.username||null,e}catch{return c.role||(c.role="editor"),null}}var nr,Zd,ga,hs,gs=W(()=>{G();ce();nr=60,Zd=2e4,ga=null,hs=null});async function ar(){if(bs&&!(typeof navigator>"u"||!navigator.wakeLock?.request)&&document.visibilityState==="visible"&&!an)try{an=await navigator.wakeLock.request("screen"),an.addEventListener("release",()=>{an=null,bs&&document.visibilityState==="visible"&&setTimeout(()=>{ar().catch(()=>{})},500)})}catch{an=null}}async function Vi(){let e=an;if(an=null,!!e)try{await e.release()}catch{}}function va(e){bs=!!e,bs?ar().catch(()=>{}):Vi().catch(()=>{})}function or(){typeof document>"u"||document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&bs?ar().catch(()=>{}):document.visibilityState==="hidden"&&Vi().catch(()=>{})})}var an,bs,rr=W(()=>{an=null,bs=!1});function B(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 B(Number(t));let n=Date.parse(t);return Number.isNaN(n)?null:n}return null}function qn(e){let t=B(e);if(t==null)return"";let n=Date.now()-t;return n<0?new Date(t).toLocaleDateString():n<6e4?"just now":n<36e5?`${Math.floor(n/6e4)}m ago`:n<864e5?`${Math.floor(n/36e5)}h ago`:n<7*864e5?`${Math.floor(n/864e5)}d ago`:new Date(t).toLocaleDateString()}function Rn(e,t=!0){let n=e||"claude",a={claude:"bg-orange-500/15 text-orange-400",codex:"bg-emerald-500/15 text-emerald-400",grok:"bg-sky-500/15 text-sky-400",gemini:"bg-violet-500/15 text-violet-400",cursor:"bg-amber-500/15 text-amber-400"}[n]||"bg-base-300 text-base-content/50",o=t?n==="claude"?"CC":n==="codex"?"CX":n==="grok"?"GX":n==="gemini"?"GM":n==="cursor"?"CU":n.slice(0,2).toUpperCase():Z[n]||n;return`<span class="text-[9px] px-1 py-0.5 rounded font-mono font-semibold flex-shrink-0 ${a}" title="${p(Z[n]||n)}">${o}</span>`}function Bn(e){if(!e)return"";let t="",n=e.split("/").filter(Boolean);return n.length<=3?e:"\u2026/"+n.slice(-2).join("/")}var Nt=W(()=>{K();G()});function au(e){let t=B(e);if(t==null)return"";let n=new Date(t);return Number.isNaN(n.getTime())?"":n.toLocaleString()}function Yi(){let e=i("notifications-badge");if(e){if(!on){e.classList.add("hidden"),e.textContent="0";return}e.classList.remove("hidden"),e.textContent=on>99?"99+":String(on)}}function el(){let e=i("notifications-menu"),t=i("btn-notifications"),n=i("topbar");if(!e||!t||!n)return;let s=t.getBoundingClientRect(),a=n.getBoundingClientRect(),o=Math.min(416,window.innerWidth-16),r=Math.max(8,Math.min(window.innerWidth-o-8,s.right-o));e.style.top=`${Math.round(a.bottom+8)}px`,e.style.left=`${Math.round(r)}px`,e.style.width=`${Math.round(o)}px`}function vs(){let e=i("notifications-menu-list"),t=i("notifications-menu-empty");if(!(!e||!t)){if(!Pe.length){e.innerHTML="",t.classList.remove("hidden"),Yi();return}t.classList.add("hidden"),e.innerHTML=Pe.map(n=>`
9
9
  <button type="button"
10
10
  class="w-full text-left rounded-lg border px-3 py-2 transition-colors hover:bg-base-200/70 ${n.unread?"border-primary/35 bg-primary/5":"border-base-300 bg-base-100"}"
11
11
  data-notification-id="${p(n.id)}"
@@ -24,47 +24,47 @@ var $d=Object.defineProperty;var F=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(
24
24
  <div class="flex items-center gap-2 mt-1 text-[10px] text-base-content/35">
25
25
  ${n.projectName?`<span class="font-mono truncate">${p(n.projectName)}</span>`:""}
26
26
  ${n.machineId?`<span class="px-1 py-0.5 rounded bg-base-300 text-base-content/55 font-mono">${p(n.machineId)}</span>`:""}
27
- <span>${p(nu(n.createdAt))}</span>
27
+ <span>${p(au(n.createdAt))}</span>
28
28
  </div>
29
29
  </div>
30
30
  </div>
31
- </button>`).join(""),Qi()}}function an(){i("notifications-menu")?.classList.add("hidden"),i("notifications-backdrop")?.classList.add("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","false")}function su(){Xi(),i("notifications-menu")?.classList.remove("hidden"),i("notifications-backdrop")?.classList.remove("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","true")}function Zi(){let e=i("notifications-menu");e&&(e.classList.contains("hidden")?su():an())}function Vi(e){let t=new Map;for(let n of e||[])n?.id&&t.set(String(n.id),n);Pe=[...t.values()].sort((n,s)=>(O(s.createdAt)||0)-(O(n.createdAt)||0)),sn=Pe.reduce((n,s)=>n+(s.unread?1:0),0),bs()}async function va(){try{let e=await x("GET","/api/notifications?limit=80");Pe=Array.isArray(e?.notifications)?e.notifications:[],sn=Number(e?.unreadCount)||Pe.reduce((t,n)=>t+(n.unread?1:0),0),bs()}catch{Pe=[],sn=0,bs()}}async function Yi(e=null){let t=await x("POST","/api/notifications/read",e?.length?{ids:e}:{});Pe=Array.isArray(t?.notifications)?t.notifications:Pe.map(n=>!e||e.includes(n.id)?{...n,unread:!1}:n),sn=Number(t?.unreadCount)||Pe.reduce((n,s)=>n+(s.unread?1:0),0),bs()}function au(e){if(!(typeof Notification>"u")&&document.visibilityState!=="visible"&&Notification.permission==="granted")try{let t=new Notification(e.title||"Session done",{body:e.body||e.projectName||e.sessionId||"",tag:e.id});t.onclick=()=>{window.focus(),t.close()}}catch{}}function xa(e){if(!e?.id)return;if(Pe.find(n=>n.id===e.id)){Vi([e,...Pe.filter(n=>n.id!==e.id)]);return}Vi([e,...Pe]),au(e)}function el(e={}){rr=typeof e.openSession=="function"?e.openSession:null,bs(),va(),typeof Notification<"u"&&Notification.permission==="default"&&document.addEventListener("click",()=>{try{Notification.requestPermission().catch(()=>{})}catch{}},{once:!0}),b.on("click","#notifications-backdrop",t=>{t.preventDefault(),t.stopPropagation(),an()}),b.on("click","#btn-notifications-read-all",async t=>{t.preventDefault(),t.stopPropagation(),await Yi()}),b.on("click","[data-notification-id]",async(t,n)=>{let s=n.dataset.notificationId;s&&(await Yi([s]),an(),!(!rr||!n.dataset.notificationSession)&&rr(n.dataset.notificationSession,n.dataset.notificationCwd||null,null,n.dataset.notificationAgent||"claude",n.dataset.notificationMachine||null))}),document.addEventListener("click",t=>{let n=i("notifications-menu"),s=i("btn-notifications"),a=t.target;!n||n.classList.contains("hidden")||n.contains(a)||s?.contains(a)||an()}),window.addEventListener("resize",()=>{i("notifications-menu")&&!i("notifications-menu").classList.contains("hidden")&&Xi()})}var Pe,sn,rr,ya=F(()=>{G();le();_t();Pe=[],sn=0,rr=null});function vs(e,t=80){return e?e.scrollHeight-e.scrollTop-e.clientHeight<t:!0}function ou(e,t){return e<0?!1:t}function ru({force:e=!1,following:t=!0,userScrolling:n=!1}={}){return e?!0:n?!1:t}function wa(e){let t=!0,n=!1,s=0,a=()=>{t=vs(e),n=!1},o=u=>{t=ou(u.deltaY,t),u.deltaY<0&&(n=!0)},r=u=>{s=u.touches?.[0]?.clientY||0},d=u=>{(u.touches?.[0]?.clientY||0)-s>8&&(t=!1,n=!0)};return e.addEventListener("scroll",a,{passive:!0}),e.addEventListener("wheel",o,{passive:!0}),e.addEventListener("touchstart",r,{passive:!0}),e.addEventListener("touchmove",d,{passive:!0}),{stick(u=!1){ru({force:u,following:t,userScrolling:n})&&(e.scrollTop=e.scrollHeight,t=!0)},setFollowing(u){t=!!u},isFollowing(){return t},destroy(){e.removeEventListener("scroll",a),e.removeEventListener("wheel",o),e.removeEventListener("touchstart",r),e.removeEventListener("touchmove",d)}}}var ir=F(()=>{});function iu(){return Z[$.peek()]||"Assistant"}function lu(e){let t=String(e||"").trim();return/remote compact task|error decoding response body/i.test(t)?"Codex \u4F1A\u8BDD\u538B\u7F29\u5931\u8D25\uFF08\u7F51\u7EDC\u4E2D\u65AD\uFF09\u3002\u518D\u53D1\u4E00\u6761\u6D88\u606F\u91CD\u8BD5\uFF0C\u6216\u5F00\u65B0\u4F1A\u8BDD\u3002":t||"\u53D1\u9001\u5931\u8D25"}function rl(e){return e?(on&&on.el===e||(on?.destroy?.(),on=wa(e),on.el=e),on):null}function He(e,t){if(!e||e.dataset.historyPainting==="1")return;rl(e).stick(!!t)}function ja(){try{Fe.length?sessionStorage.setItem(ur,JSON.stringify(Fe.slice(-30))):sessionStorage.removeItem(ur)}catch{}}function du(){let e=$t(),t=Fe.filter(n=>n.key===e).length;t&&!sl.has(e)&&(sl.add(e),C(`\u231B Restored ${t} queued prompt${t===1?"":"s"} in this browser tab`))}function il(e=c.sessionId,t=c.agent,n=c.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function uu(e={}){let t=il(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(dr)||"{}")[t])||0}catch{return 0}}function pu(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=il(e.sessionId||c.sessionId,e.agent||c.agent,c.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(dr)||"{}")||{}}catch{}let a=Number(s[n])||0;if(t<=a)return!1;s[n]=t;let o=Object.keys(s);o.length>500&&o.sort((r,d)=>Number(s[d])-Number(s[r])).slice(500).forEach(r=>delete s[r]);try{localStorage.setItem(dr,JSON.stringify(s))}catch{}return!0}function $t({sessionId:e=c.sessionId,agent:t=c.agent,machineId:n=c.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function Un(e){let t=$t(e),n=i("chat-input");!t||!n||(n.value?rn.set(t,n.value):rn.delete(t))}function Fn(e){let t=i("chat-input");t&&(t.value=rn.get($t(e))||"",Ss(t),$s(t.value))}function Wn(e){let t=$t(e);if(!t)return;let n=Fe.filter(a=>a.key===t);if(!n.length)return;Fe=Fe.filter(a=>a.key!==t),ja();let s=rn.get(t)||"";rn.set(t,[s,...n.map(a=>a.text)].filter(Boolean).join(`
31
+ </button>`).join(""),Yi()}}function rn(){i("notifications-menu")?.classList.add("hidden"),i("notifications-backdrop")?.classList.add("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","false")}function ou(){el(),i("notifications-menu")?.classList.remove("hidden"),i("notifications-backdrop")?.classList.remove("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","true")}function tl(){let e=i("notifications-menu");e&&(e.classList.contains("hidden")?ou():rn())}function Xi(e){let t=new Map;for(let n of e||[])n?.id&&t.set(String(n.id),n);Pe=[...t.values()].sort((n,s)=>(B(s.createdAt)||0)-(B(n.createdAt)||0)),on=Pe.reduce((n,s)=>n+(s.unread?1:0),0),vs()}async function xa(){try{let e=await x("GET","/api/notifications?limit=80");Pe=Array.isArray(e?.notifications)?e.notifications:[],on=Number(e?.unreadCount)||Pe.reduce((t,n)=>t+(n.unread?1:0),0),vs()}catch{Pe=[],on=0,vs()}}async function Zi(e=null){let t=await x("POST","/api/notifications/read",e?.length?{ids:e}:{});Pe=Array.isArray(t?.notifications)?t.notifications:Pe.map(n=>!e||e.includes(n.id)?{...n,unread:!1}:n),on=Number(t?.unreadCount)||Pe.reduce((n,s)=>n+(s.unread?1:0),0),vs()}function ru(e){if(!(typeof Notification>"u")&&document.visibilityState!=="visible"&&Notification.permission==="granted")try{let t=new Notification(e.title||"Session done",{body:e.body||e.projectName||e.sessionId||"",tag:e.id});t.onclick=()=>{window.focus(),t.close()}}catch{}}function ya(e){if(!e?.id)return;if(Pe.find(n=>n.id===e.id)){Xi([e,...Pe.filter(n=>n.id!==e.id)]);return}Xi([e,...Pe]),ru(e)}function nl(e={}){ir=typeof e.openSession=="function"?e.openSession:null,vs(),xa(),typeof Notification<"u"&&Notification.permission==="default"&&document.addEventListener("click",()=>{try{Notification.requestPermission().catch(()=>{})}catch{}},{once:!0}),b.on("click","#notifications-backdrop",t=>{t.preventDefault(),t.stopPropagation(),rn()}),b.on("click","#btn-notifications-read-all",async t=>{t.preventDefault(),t.stopPropagation(),await Zi()}),b.on("click","[data-notification-id]",async(t,n)=>{let s=n.dataset.notificationId;s&&(await Zi([s]),rn(),!(!ir||!n.dataset.notificationSession)&&ir(n.dataset.notificationSession,n.dataset.notificationCwd||null,null,n.dataset.notificationAgent||"claude",n.dataset.notificationMachine||null))}),document.addEventListener("click",t=>{let n=i("notifications-menu"),s=i("btn-notifications"),a=t.target;!n||n.classList.contains("hidden")||n.contains(a)||s?.contains(a)||rn()}),window.addEventListener("resize",()=>{i("notifications-menu")&&!i("notifications-menu").classList.contains("hidden")&&el()})}var Pe,on,ir,wa=W(()=>{K();ce();Nt();Pe=[],on=0,ir=null});function xs(e,t=80){return e?e.scrollHeight-e.scrollTop-e.clientHeight<t:!0}function iu(e,t){return e<0?!1:t}function lu({force:e=!1,following:t=!0,userScrolling:n=!1}={}){return e?!0:n?!1:t}function ka(e){let t=!0,n=!1,s=0,a=()=>{t=xs(e),n=!1},o=u=>{t=iu(u.deltaY,t),u.deltaY<0&&(n=!0)},r=u=>{s=u.touches?.[0]?.clientY||0},d=u=>{(u.touches?.[0]?.clientY||0)-s>8&&(t=!1,n=!0)};return e.addEventListener("scroll",a,{passive:!0}),e.addEventListener("wheel",o,{passive:!0}),e.addEventListener("touchstart",r,{passive:!0}),e.addEventListener("touchmove",d,{passive:!0}),{stick(u=!1){lu({force:u,following:t,userScrolling:n})&&(e.scrollTop=e.scrollHeight,t=!0)},setFollowing(u){t=!!u},isFollowing(){return t},destroy(){e.removeEventListener("scroll",a),e.removeEventListener("wheel",o),e.removeEventListener("touchstart",r),e.removeEventListener("touchmove",d)}}}var lr=W(()=>{});function cu(){return Z[$.peek()]||"Assistant"}function du(e){let t=String(e||"").trim();return/remote compact task|error decoding response body/i.test(t)?"Codex \u4F1A\u8BDD\u538B\u7F29\u5931\u8D25\uFF08\u7F51\u7EDC\u4E2D\u65AD\uFF09\u3002\u518D\u53D1\u4E00\u6761\u6D88\u606F\u91CD\u8BD5\uFF0C\u6216\u5F00\u65B0\u4F1A\u8BDD\u3002":t||"\u53D1\u9001\u5931\u8D25"}function ll(e){return e?(ln&&ln.el===e||(ln?.destroy?.(),ln=ka(e),ln.el=e),ln):null}function He(e,t){if(!e||e.dataset.historyPainting==="1")return;ll(e).stick(!!t)}function Da(){try{Fe.length?sessionStorage.setItem(pr,JSON.stringify(Fe.slice(-30))):sessionStorage.removeItem(pr)}catch{}}function pu(){let e=St(),t=Fe.filter(n=>n.key===e).length;t&&!ol.has(e)&&(ol.add(e),C(`\u231B Restored ${t} queued prompt${t===1?"":"s"} in this browser tab`))}function cl(e=c.sessionId,t=c.agent,n=c.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function fu(e={}){let t=cl(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(ur)||"{}")[t])||0}catch{return 0}}function mu(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=cl(e.sessionId||c.sessionId,e.agent||c.agent,c.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(ur)||"{}")||{}}catch{}let a=Number(s[n])||0;if(t<=a)return!1;s[n]=t;let o=Object.keys(s);o.length>500&&o.sort((r,d)=>Number(s[d])-Number(s[r])).slice(500).forEach(r=>delete s[r]);try{localStorage.setItem(ur,JSON.stringify(s))}catch{}return!0}function St({sessionId:e=c.sessionId,agent:t=c.agent,machineId:n=c.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function Wn(e){let t=St(e),n=i("chat-input");!t||!n||(n.value?cn.set(t,n.value):cn.delete(t))}function Gn(e){let t=i("chat-input");t&&(t.value=cn.get(St(e))||"",Ls(t),Ss(t.value))}function Kn(e){let t=St(e);if(!t)return;let n=Fe.filter(a=>a.key===t);if(!n.length)return;Fe=Fe.filter(a=>a.key!==t),Da();let s=cn.get(t)||"";cn.set(t,[s,...n.map(a=>a.text)].filter(Boolean).join(`
32
32
 
33
- `))}function Gn(){N.peek()&&(N.value=!1,ln())}function fu(){tl||(tl=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(ut=400,Rn({probe:!0}),c.ws?.readyState===WebSocket.OPEN&&c.sessionId))try{c.ws.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}}),window.addEventListener("online",()=>{ut=400,Rn({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?Rn({force:!0}):Rn({probe:!0})}),window.addEventListener("focus",()=>Rn({probe:!0})),navigator.connection?.addEventListener?.("change",()=>{ut=400,Rn({probe:!0})}))}function $a(){let e=i("conn-dot");if(!e)return;let t=fe.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 Rn(e={}){let t=c.ws?.readyState;if(e.force){ut=400,Pt({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&kt&&Date.now()-kt>45e3)try{c.ws.close()}catch{}else if(e.probe&&c.ws.readyState===WebSocket.OPEN)try{c.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(ut=Math.min(ut,800),Pt({quiet:!0}))}function mu(){On||(fe.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",$a(),On=setTimeout(()=>{On=null,Pt({quiet:!0})},ut),ut=Math.min(Math.round(ut*1.8),15e3))}function ll(){ka&&(clearInterval(ka),ka=null)}function hu(e,t){ll(),ka=setInterval(()=>{if(!(t!==ys||e.readyState!==WebSocket.OPEN)){if(kt&&Date.now()-kt>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&kt&&Date.now()-kt>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function ln(){let e=N.peek()||!!E.peek()&&fe.peek()==="open";ba(e)}function Ia(){return(c.role||"editor")==="viewer"?"\u53EA\u8BFB\u8D26\u53F7\uFF0C\u65E0\u6CD5\u8F93\u5165":c.lock?.foreign?`\u4F1A\u8BDD\u7531 ${c.lock.holder&&c.lock.holder!=="viewer"?c.lock.holder:"\u5176\u4ED6\u7528\u6237"} \u5360\u7528\uFF08\u9501\uFF09`:"\u5F53\u524D\u65E0\u6CD5\u8F93\u5165"}function Ta(){let e=tn();c.externalSessionReadOnly=!e;let t=i("chat-input"),n=i("send-btn"),s=i("btn-attach"),a=i("session-lock-banner");t&&(t.disabled=!e,t.readOnly=!e,e?N.peek()?t.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":$s(t.value||""):t.placeholder=Ia()),n&&(n.disabled=!e),s&&(s.disabled=!e),a&&(e?(a.classList.add("hidden"),a.textContent=""):(a.classList.remove("hidden"),a.textContent=Ia()))}function Da(e){Ta()}function Pt(e={}){fu(),On&&(clearTimeout(On),On=null),e.quiet&&(cr=!0);let t=c.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);nl!==t&&(ca(),nl=t);let n=++ys;try{c.ws?.close()}catch{}fe.value="connecting",$a();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;c.token&&a.set("token",c.token),t&&a.set("machine",t),c.sessionId&&a.set("sessionId",c.sessionId),c.agent&&a.set("agent",c.agent);let o=uu();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);c.ws=r,r.addEventListener("open",()=>{if(n===ys){if(ut=1e3,kt=Date.now(),fe.value="open",$a(),c.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}la(),du(),hu(r,n),ln(),lr&&!cr&&C(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),lr=!1,cr=!1}}),r.addEventListener("message",d=>{if(n!==ys)return;let u;try{u=JSON.parse(d.data)}catch{return}if(pu(u)){if(u.type==="pong"){kt=Date.now();return}if(u.type==="ping"){if(kt=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(u.type==="run-status"){u.running?N.value=!0:(N.peek()&&(N.value=!1),pr()),ln();return}dl(u)}}),r.addEventListener("close",()=>{n===ys&&(ll(),lr=!0,fe.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",$a(),mu())}),r.addEventListener("error",()=>{})}function pr(){if(!Fe.length||N.peek())return;let e=$t(),t=Fe.findIndex(a=>a.key===e);if(t<0)return;let[n]=Fe.splice(t,1);ja();let s=i("chat-input");s&&(s.value=n.text,Ss(s)),setTimeout(()=>{if(n.key!==$t()||N.peek()){rn.set(n.key,n.text);return}Ls()},0)}function ws(){N.value=!1,ln(),pr()}function mr(){return cl}function dl(e){if(!(e?.sessionId&&c.sessionId&&e.sessionId!==c.sessionId)){if(e&&typeof e.type=="string"&&(e.type==="note.added"||e.type==="note.updated"||e.type==="note.removed"||e.type==="queue.item.added"||e.type==="queue.item.updated"||e.type==="queue.item.removed"||e.type==="queue.item.moved"||e.type==="queue.item.sending")){window.dispatchEvent(new CustomEvent("hub-ws-message",{detail:e}));let t={"note.added":"hub:note-added","note.updated":"hub:note-updated","note.removed":"hub:note-removed"}[e.type];t&&window.dispatchEvent(new CustomEvent(t,{detail:e}))}if(e._hubReplay===!0){document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)dl(t);return}if(["assistant","assistant_stream_start","assistant_delta","thought_delta","tool_use"].includes(e.type)&&cl++,e.type==="session-created"){let t=_.peek();c.sessionId=e.sessionId,e.agent&&e.agent!==$.peek()&&Ne(e.agent),se(t,e.agent||$.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-sessions-changed"){document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-session-updated"){document.dispatchEvent(new CustomEvent("sessions-changed")),document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="notification"&&e.notification){xa(e.notification);return}if(e.type==="grok-queue-status"){Tu(e);return}if(e.type==="result"){ks(),xs(),pt();let t=e.usage;if(t){let n={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};c.lastUsage=n,c.sessionId&&(c.lastUsageSessionId=c.sessionId),Bn(n)}e.is_error||C("\u2713 Done"),ws();return}if(e.type==="complete"){ks(),xs(),pt(),!e.aborted&&e.agent==="claude"?C("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?C("\u2713 Done"):e.aborted&&C("\u5DF2\u505C\u6B62")),ws();return}if(e.type==="error"){ks(),xs(),(e.code===423||/locked/i.test(String(e.message||"")))&&(c.lock={...c.lock||{},held:!1,foreign:!0,holder:e.lock?.holder||c.lock?.holder||"another user"},Ta()),Ht("error","Error",lu(e.message)),ws();return}if(e.type==="shell-start"){c.shellBubble=null;return}if(e.type==="shell-output"){c.shellBubble||(c.shellBubble=Mu(e.stream==="stderr"?"shell-err":"shell")),Au(c.shellBubble,e.data);return}if(e.type==="shell-exit"){c.shellBubble=null,C(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),ws();return}if(e.type==="assistant"){xs();for(let t of e.message?.content||[])t.type==="text"&&t.text?(pt(),Ht("assistant",iu(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&vr(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){N.peek()||(N.value=!0,ln()),ul(e.ts);return}if(e.type==="assistant_delta"){N.peek()||(N.value=!0,ln()),gu(e.data||"");return}if(e.type==="assistant_stream_end"){xs();return}if(e.type==="thought_stream_start"){pl();return}if(e.type==="thought_delta"){bu(e.data||"");return}if(e.type==="thought_stream_end"){ks();return}if(e.type==="status"){let t=i("stream-status");if(t)t.textContent=e.message||"";else{let n=i("messages");n&&e.message&&(n.insertAdjacentHTML("beforeend",`<div id="stream-status" class="text-center text-[10px] text-base-content/35 py-0.5">${p(e.message)}</div>`),He(n))}return}if(e.type==="permission_resolved"){let t=e.requestId||e.request_id;t&&i(`perm-${t}`)?.remove();return}(e.type==="permission_request"||e.request_id&&e.tool_name)&&_u(e)}}function ul(e){let t=i("messages");if(!t||(pt(),ks(),Xe&&t.contains(Xe)))return;let n=Ca(e||Date.now()),s=Ma(e||Date.now());t.insertAdjacentHTML("beforeend",`
33
+ `))}function zn(){P.peek()&&(P.value=!1,dn())}function hu(){sl||(sl=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(ut=400,On({probe:!0}),c.ws?.readyState===WebSocket.OPEN&&c.sessionId))try{c.ws.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}}),window.addEventListener("online",()=>{ut=400,On({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?On({force:!0}):On({probe:!0})}),window.addEventListener("focus",()=>On({probe:!0})),navigator.connection?.addEventListener?.("change",()=>{ut=400,On({probe:!0})}))}function Sa(){let e=i("conn-dot");if(!e)return;let t=me.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=c.ws?.readyState;if(e.force){ut=400,Ht({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&$t&&Date.now()-$t>45e3)try{c.ws.close()}catch{}else if(e.probe&&c.ws.readyState===WebSocket.OPEN)try{c.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(ut=Math.min(ut,800),Ht({quiet:!0}))}function gu(){Un||(me.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Sa(),Un=setTimeout(()=>{Un=null,Ht({quiet:!0})},ut),ut=Math.min(Math.round(ut*1.8),15e3))}function dl(){$a&&(clearInterval($a),$a=null)}function bu(e,t){dl(),$a=setInterval(()=>{if(!(t!==ws||e.readyState!==WebSocket.OPEN)){if($t&&Date.now()-$t>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&$t&&Date.now()-$t>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function dn(){let e=P.peek()||!!E.peek()&&me.peek()==="open";va(e)}function Ta(){return(c.role||"editor")==="viewer"?"\u53EA\u8BFB\u8D26\u53F7\uFF0C\u65E0\u6CD5\u8F93\u5165":c.lock?.foreign?`\u4F1A\u8BDD\u7531 ${c.lock.holder&&c.lock.holder!=="viewer"?c.lock.holder:"\u5176\u4ED6\u7528\u6237"} \u5360\u7528\uFF08\u9501\uFF09`:"\u5F53\u524D\u65E0\u6CD5\u8F93\u5165"}function Ca(){let e=sn();c.externalSessionReadOnly=!e;let t=i("chat-input"),n=i("send-btn"),s=i("btn-attach"),a=i("session-lock-banner");t&&(t.disabled=!e,t.readOnly=!e,e?P.peek()?t.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":Ss(t.value||""):t.placeholder=Ta()),n&&(n.disabled=!e),s&&(s.disabled=!e),a&&(e?(a.classList.add("hidden"),a.textContent=""):(a.classList.remove("hidden"),a.textContent=Ta()))}function _a(e){Ca()}function Ht(e={}){hu(),Un&&(clearTimeout(Un),Un=null),e.quiet&&(dr=!0);let t=c.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);al!==t&&(da(),al=t);let n=++ws;try{c.ws?.close()}catch{}me.value="connecting",Sa();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;c.token&&a.set("token",c.token),t&&a.set("machine",t),c.sessionId&&a.set("sessionId",c.sessionId),c.agent&&a.set("agent",c.agent);let o=fu();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);c.ws=r,r.addEventListener("open",()=>{if(n===ws){if(ut=1e3,$t=Date.now(),me.value="open",Sa(),c.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}ca(),pu(),bu(r,n),dn(),cr&&!dr&&C(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),cr=!1,dr=!1}}),r.addEventListener("message",d=>{if(n!==ws)return;let u;try{u=JSON.parse(d.data)}catch{return}if(mu(u)){if(u.type==="pong"){$t=Date.now();return}if(u.type==="ping"){if($t=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(u.type==="run-status"){u.running?P.value=!0:(P.peek()&&(P.value=!1),fr()),dn();return}pl(u)}}),r.addEventListener("close",()=>{n===ws&&(dl(),cr=!0,me.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Sa(),gu())}),r.addEventListener("error",()=>{})}function fr(){if(!Fe.length||P.peek())return;let e=St(),t=Fe.findIndex(a=>a.key===e);if(t<0)return;let[n]=Fe.splice(t,1);Da();let s=i("chat-input");s&&(s.value=n.text,Ls(s)),setTimeout(()=>{if(n.key!==St()||P.peek()){cn.set(n.key,n.text);return}Es()},0)}function ks(){P.value=!1,dn(),fr()}function hr(){return ul}function pl(e){if(!(e?.sessionId&&c.sessionId&&e.sessionId!==c.sessionId)){if(e&&typeof e.type=="string"&&(e.type==="note.added"||e.type==="note.updated"||e.type==="note.removed"||e.type==="queue.item.added"||e.type==="queue.item.updated"||e.type==="queue.item.removed"||e.type==="queue.item.moved"||e.type==="queue.item.sending")){window.dispatchEvent(new CustomEvent("hub-ws-message",{detail:e}));let t={"note.added":"hub:note-added","note.updated":"hub:note-updated","note.removed":"hub:note-removed"}[e.type];t&&window.dispatchEvent(new CustomEvent(t,{detail:e}))}if(e._hubReplay===!0){document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)pl(t);return}if(["assistant","assistant_stream_start","assistant_delta","thought_delta","tool_use"].includes(e.type)&&ul++,e.type==="session-created"){let t=N.peek();c.sessionId=e.sessionId,e.agent&&e.agent!==$.peek()&&Ne(e.agent),se(t,e.agent||$.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-sessions-changed"){document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-session-updated"){document.dispatchEvent(new CustomEvent("sessions-changed")),document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="notification"&&e.notification){ya(e.notification);return}if(e.type==="grok-queue-status"){Mu(e);return}if(e.type==="result"){$s(),ys(),pt();let t=e.usage;if(t){let n={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};c.lastUsage=n,c.sessionId&&(c.lastUsageSessionId=c.sessionId),Fn(n)}e.is_error||C("\u2713 Done"),ks();return}if(e.type==="complete"){$s(),ys(),pt(),!e.aborted&&e.agent==="claude"?C("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?C("\u2713 Done"):e.aborted&&C("\u5DF2\u505C\u6B62")),ks();return}if(e.type==="error"){$s(),ys(),(e.code===423||/locked/i.test(String(e.message||"")))&&(c.lock={...c.lock||{},held:!1,foreign:!0,holder:e.lock?.holder||c.lock?.holder||"another user"},Ca()),qt("error","Error",du(e.message)),ks();return}if(e.type==="shell-start"){c.shellBubble=null;return}if(e.type==="shell-output"){c.shellBubble||(c.shellBubble=ju(e.stream==="stderr"?"shell-err":"shell")),Du(c.shellBubble,e.data);return}if(e.type==="shell-exit"){c.shellBubble=null,C(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),ks();return}if(e.type==="assistant"){ys();for(let t of e.message?.content||[])t.type==="text"&&t.text?(pt(),qt("assistant",cu(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&xr(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){P.peek()||(P.value=!0,dn()),fl(e.ts);return}if(e.type==="assistant_delta"){P.peek()||(P.value=!0,dn()),vu(e.data||"");return}if(e.type==="assistant_stream_end"){ys();return}if(e.type==="thought_stream_start"){ml();return}if(e.type==="thought_delta"){xu(e.data||"");return}if(e.type==="thought_stream_end"){$s();return}if(e.type==="status"){let t=i("stream-status");if(t)t.textContent=e.message||"";else{let n=i("messages");n&&e.message&&(n.insertAdjacentHTML("beforeend",`<div id="stream-status" class="text-center text-[10px] text-base-content/35 py-0.5">${p(e.message)}</div>`),He(n))}return}if(e.type==="permission_resolved"){let t=e.requestId||e.request_id;t&&i(`perm-${t}`)?.remove();return}(e.type==="permission_request"||e.request_id&&e.tool_name)&&Pu(e)}}function fl(e){let t=i("messages");if(!t||(pt(),$s(),Xe&&t.contains(Xe)))return;let n=Ma(e||Date.now()),s=Aa(e||Date.now());t.insertAdjacentHTML("beforeend",`
34
34
  <div class="msg-row assistant px-2 live-stream" data-ts="${p(s)}">
35
35
  <div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-base-200 break-words md">
36
36
  <div class="msg-stream-body whitespace-pre-wrap"></div>
37
37
  </div>
38
38
  ${n?`<div class="msg-ts" title="${p(s)}">${p(n)}</div>`:""}
39
- </div>`),Xe=t.lastElementChild,Ue=Xe.querySelector(".msg-stream-body"),i("stream-status")?.remove(),He(t)}function gu(e){e&&(Ue||ul(Date.now()),Ue&&(Ue.textContent+=e,He(i("messages"))))}function xs(){if(!Xe||!Ue){Xe=null,Ue=null;return}let e=Ue.textContent||"";e.trim()?(Ue.classList.remove("whitespace-pre-wrap"),Ue.classList.add("md"),Ue.innerHTML=La(e),xl(Xe),bl(Xe,e)):Xe.remove(),Xe=null,Ue=null,i("stream-status")?.remove()}function pl(){let e=i("messages");e&&(Nt&&e.contains(Nt)||(e.insertAdjacentHTML("beforeend",`
39
+ </div>`),Xe=t.lastElementChild,Ue=Xe.querySelector(".msg-stream-body"),i("stream-status")?.remove(),He(t)}function vu(e){e&&(Ue||fl(Date.now()),Ue&&(Ue.textContent+=e,He(i("messages"))))}function ys(){if(!Xe||!Ue){Xe=null,Ue=null;return}let e=Ue.textContent||"";e.trim()?(Ue.classList.remove("whitespace-pre-wrap"),Ue.classList.add("md"),Ue.innerHTML=Ea(e),wl(Xe),xl(Xe,e)):Xe.remove(),Xe=null,Ue=null,i("stream-status")?.remove()}function ml(){let e=i("messages");e&&(Pt&&e.contains(Pt)||(e.insertAdjacentHTML("beforeend",`
40
40
  <div class="msg-row assistant px-2 thought-stream">
41
41
  <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">
42
42
  <div class="font-medium text-base-content/35 mb-0.5">thinking\u2026</div>
43
43
  <div class="thought-body font-mono whitespace-pre-wrap max-h-24 overflow-y-auto opacity-80"></div>
44
44
  </div>
45
- </div>`),Nt=e.lastElementChild,dt=Nt.querySelector(".thought-body"),He(e)))}function bu(e){e&&(dt||pl(),dt&&(dt.textContent+=e,dt.scrollTop=dt.scrollHeight,He(i("messages"))))}function ks(){if(Nt&&dt){let e=(dt.textContent||"").length;Nt.innerHTML=`
46
- <div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}Nt=null,dt=null}function xu(e){let[t,...n]=e.slice(1).trim().split(/\s+/),s=n.join(" ");switch(t.toLowerCase()){case"agent":{if(!s)return C(`Current agent: ${$.peek()} \xB7 agents: claude | codex | grok | gemini | cursor`),!0;let a=s.toLowerCase();return["claude","codex","grok","gemini","cursor"].includes(a)?(a!==$.peek()?(c.sessionId=null,Ne(a),se(Be(a)),document.dispatchEvent(new CustomEvent("agent-changed")),C(`Agent \u2192 ${Z[a]} \xB7 model ${_.peek()} \xB7 new session`)):C(`Agent already ${Z[a]}`),!0):(C(`Unknown agent "${s}" \xB7 valid: claude | codex | grok | gemini | cursor`),!0)}case"model":{if(!s){let d=$.peek(),u=Oe(d).map(l=>l.value).join(" | ");return C(`Current model: ${_.peek()} (${d})${u?`
47
- Available: ${u}`:""}`),!0}let a=vu[s.toLowerCase()]||s,o=$.peek()||"claude",r=Oe(o).some(d=>d.value===a);return r||Jt(o,a),se(a),C(`Model set to ${a}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let a=Qt($.peek(),_.peek());return s?a.includes(s.toLowerCase())?(te.value=s.toLowerCase(),C(`Effort set to ${s.toLowerCase()}`),!0):(C(`Unknown effort level "${s}" \xB7 valid: ${a.join(" | ")}`),!0):(C(`Current effort: ${te.peek()||"(default)"} \xB7 levels: ${a.join(" | ")}`),!0)}case"clear":return zn(),c.sessionId=null,c.lastUsage=null,C("Cleared \xB7 new session"),!0;case"usage":return yu(),!0;case"help":return C(`Available slash commands:
45
+ </div>`),Pt=e.lastElementChild,dt=Pt.querySelector(".thought-body"),He(e)))}function xu(e){e&&(dt||ml(),dt&&(dt.textContent+=e,dt.scrollTop=dt.scrollHeight,He(i("messages"))))}function $s(){if(Pt&&dt){let e=(dt.textContent||"").length;Pt.innerHTML=`
46
+ <div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}Pt=null,dt=null}function wu(e){let[t,...n]=e.slice(1).trim().split(/\s+/),s=n.join(" ");switch(t.toLowerCase()){case"agent":{if(!s)return C(`Current agent: ${$.peek()} \xB7 agents: claude | codex | grok | gemini | cursor`),!0;let a=s.toLowerCase();return["claude","codex","grok","gemini","cursor"].includes(a)?(a!==$.peek()?(c.sessionId=null,Ne(a),se(Oe(a)),document.dispatchEvent(new CustomEvent("agent-changed")),C(`Agent \u2192 ${Z[a]} \xB7 model ${N.peek()} \xB7 new session`)):C(`Agent already ${Z[a]}`),!0):(C(`Unknown agent "${s}" \xB7 valid: claude | codex | grok | gemini | cursor`),!0)}case"model":{if(!s){let d=$.peek(),u=Be(d).map(l=>l.value).join(" | ");return C(`Current model: ${N.peek()} (${d})${u?`
47
+ Available: ${u}`:""}`),!0}let a=yu[s.toLowerCase()]||s,o=$.peek()||"claude",r=Be(o).some(d=>d.value===a);return r||Vt(o,a),se(a),C(`Model set to ${a}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let a=Yt($.peek(),N.peek());return s?a.includes(s.toLowerCase())?(te.value=s.toLowerCase(),C(`Effort set to ${s.toLowerCase()}`),!0):(C(`Unknown effort level "${s}" \xB7 valid: ${a.join(" | ")}`),!0):(C(`Current effort: ${te.peek()||"(default)"} \xB7 levels: ${a.join(" | ")}`),!0)}case"clear":return Qn(),c.sessionId=null,c.lastUsage=null,C("Cleared \xB7 new session"),!0;case"usage":return ku(),!0;case"help":return C(`Available slash commands:
48
48
  /agent [claude|codex|grok|gemini|cursor]
49
49
  /model [haiku|sonnet|opus|<model-id>]
50
50
  /effort [low|medium|high|xhigh|max]
51
51
  /usage
52
52
  /clear
53
- /help`),!0;default:return!1}}function Ie(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 yu(){let e=$.peek()||"claude",t=_.peek()||"\u2014",n=c.sessionId,s=[`Agent: ${Z[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(c.lastUsage&&(!n||c.lastUsageSessionId===n)){let a=c.lastUsage;s.push(`Last turn: \u2191${Ie(a.input_tokens)} \u2193${Ie(a.output_tokens)}`+(a.cache_read_input_tokens?` \xB7 ${Ie(a.cache_read_input_tokens)} cached`:"")+(a.reasoning_tokens?` \xB7 ${Ie(a.reasoning_tokens)} reason`:"")+(a.total_tokens?` \xB7 \u03A3${Ie(a.total_tokens)}`:"")+(a.costUSD!=null?` \xB7 $${Number(a.costUSD).toFixed(4)}`:""))}if(!n){C(s.join(`
54
- `)),hr("\u25C8 /usage \xB7 no session yet");return}C("Loading usage\u2026");try{let a=new URLSearchParams({sessionId:n,agent:e}),r=(await x("GET",`/api/usage?${a}`)).context||{};if(r.model&&(s[1]=`Model: ${r.model}`),r.title&&s.push(`Title: ${r.title}`),r.tokensUsed!=null||r.windowTokens!=null||r.usagePercent!=null){let u=r.tokensUsed!=null?Ie(r.tokensUsed):"\u2014",l=r.windowTokens!=null?Ie(r.windowTokens):"\u2014",f=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";s.push(`Context window: ${u} / ${l} (${f})`)}if(r.turnCount!=null&&s.push(`Turns: ${r.turnCount}`),r.toolCallCount!=null&&s.push(`Tools: ${r.toolCallCount}`),r.sessionDurationSeconds!=null){let u=Math.floor(r.sessionDurationSeconds/60),l=Math.round(r.sessionDurationSeconds%60);s.push(`Duration: ${u}m ${l}s`)}if(r.sessionTotals){let u=r.sessionTotals;s.push(`Session totals: \u2191${Ie(u.input_tokens)} \u2193${Ie(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ie(u.cache_read_input_tokens)} cached`:"")+(u.total_tokens?` \xB7 \u03A3${Ie(u.total_tokens)}`:"")+(u.costUSD?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}if(r.lastTurn&&!c.lastUsage){let u=r.lastTurn;s.push(`Last completed turn: \u2191${Ie(u.input_tokens)} \u2193${Ie(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ie(u.cache_read_input_tokens)} cached`:"")+(u.costUSD!=null?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}r.note&&s.push(r.note);let d=i("messages");if(d){let u=[...d.children];for(let l=u.length-1;l>=0;l--)if(u[l].textContent==="Loading usage\u2026"){u[l].remove();break}}C(s.join(`
55
- `)),(r.tokensUsed!=null||r.windowTokens!=null)&&gr({tokensUsed:r.tokensUsed,windowTokens:r.windowTokens,usagePercent:r.usagePercent,model:r.model||t,turnCount:r.turnCount,toolCallCount:r.toolCallCount}),r.sessionTotals?Bn(r.sessionTotals):r.lastTurn?Bn(r.lastTurn):c.lastUsage&&Bn(c.lastUsage)}catch(a){let o=i("messages");if(o){let r=[...o.children];for(let d=r.length-1;d>=0;d--)if(r[d].textContent==="Loading usage\u2026"){r[d].remove();break}}C(`${s.join(`
53
+ /help`),!0;default:return!1}}function Ie(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 ku(){let e=$.peek()||"claude",t=N.peek()||"\u2014",n=c.sessionId,s=[`Agent: ${Z[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(c.lastUsage&&(!n||c.lastUsageSessionId===n)){let a=c.lastUsage;s.push(`Last turn: \u2191${Ie(a.input_tokens)} \u2193${Ie(a.output_tokens)}`+(a.cache_read_input_tokens?` \xB7 ${Ie(a.cache_read_input_tokens)} cached`:"")+(a.reasoning_tokens?` \xB7 ${Ie(a.reasoning_tokens)} reason`:"")+(a.total_tokens?` \xB7 \u03A3${Ie(a.total_tokens)}`:"")+(a.costUSD!=null?` \xB7 $${Number(a.costUSD).toFixed(4)}`:""))}if(!n){C(s.join(`
54
+ `)),gr("\u25C8 /usage \xB7 no session yet");return}C("Loading usage\u2026");try{let a=new URLSearchParams({sessionId:n,agent:e}),r=(await x("GET",`/api/usage?${a}`)).context||{};if(r.model&&(s[1]=`Model: ${r.model}`),r.title&&s.push(`Title: ${r.title}`),r.tokensUsed!=null||r.windowTokens!=null||r.usagePercent!=null){let u=r.tokensUsed!=null?Ie(r.tokensUsed):"\u2014",l=r.windowTokens!=null?Ie(r.windowTokens):"\u2014",f=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";s.push(`Context window: ${u} / ${l} (${f})`)}if(r.turnCount!=null&&s.push(`Turns: ${r.turnCount}`),r.toolCallCount!=null&&s.push(`Tools: ${r.toolCallCount}`),r.sessionDurationSeconds!=null){let u=Math.floor(r.sessionDurationSeconds/60),l=Math.round(r.sessionDurationSeconds%60);s.push(`Duration: ${u}m ${l}s`)}if(r.sessionTotals){let u=r.sessionTotals;s.push(`Session totals: \u2191${Ie(u.input_tokens)} \u2193${Ie(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ie(u.cache_read_input_tokens)} cached`:"")+(u.total_tokens?` \xB7 \u03A3${Ie(u.total_tokens)}`:"")+(u.costUSD?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}if(r.lastTurn&&!c.lastUsage){let u=r.lastTurn;s.push(`Last completed turn: \u2191${Ie(u.input_tokens)} \u2193${Ie(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ie(u.cache_read_input_tokens)} cached`:"")+(u.costUSD!=null?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}r.note&&s.push(r.note);let d=i("messages");if(d){let u=[...d.children];for(let l=u.length-1;l>=0;l--)if(u[l].textContent==="Loading usage\u2026"){u[l].remove();break}}C(s.join(`
55
+ `)),(r.tokensUsed!=null||r.windowTokens!=null)&&br({tokensUsed:r.tokensUsed,windowTokens:r.windowTokens,usagePercent:r.usagePercent,model:r.model||t,turnCount:r.turnCount,toolCallCount:r.toolCallCount}),r.sessionTotals?Fn(r.sessionTotals):r.lastTurn?Fn(r.lastTurn):c.lastUsage&&Fn(c.lastUsage)}catch(a){let o=i("messages");if(o){let r=[...o.children];for(let d=r.length-1;d>=0;d--)if(r[d].textContent==="Loading usage\u2026"){r[d].remove();break}}C(`${s.join(`
56
56
  `)}
57
- (usage fetch failed: ${a.message})`)}}function Ls(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(!tn()){C(Ia()),yt().then(()=>Ta()).catch(()=>{});return}if(c.sessionId&&!c.lock?.held&&!c.lock?.unmanaged){yt().then(s=>{if(!s?.ok&&!s?.skipped){Ta(),C(Ia());return}Ls()}).catch(()=>Ls());return}if(N.peek()){if($.peek()==="grok"&&c.sessionId){let s="grok",a=te.peek()||Qe(s,_.peek())||"low",o=lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:_.peek(),lockToken:c.lock?.token||void 0,effort:a,...de.peek()&&{permissionMode:de.peek()},...de.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});gl(t),e.value="",Ss(e),$s(""),Sa(),C(o?"\u5DF2\u52A0\u5165 Grok \u670D\u52A1\u7AEF\u961F\u5217\uFF0C\u5237\u65B0\u9875\u9762\u4ECD\u4F1A\u663E\u793A":"\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5C06\u5728\u91CD\u8FDE\u540E\u53D1\u9001");return}Fe.push({key:$t(),text:t}),ja(),e.value="",Ss(e),$s(""),Sa(),C(`\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="",rn.delete($t()),Ss(e),$s(""),Sa(),t.startsWith("/")&&xu(t))return;N.value=!0,ln();let n=Date.now();if(ml(t))Ht("shell","$ Shell",t.slice(1).trim(),{ts:n}),lt({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:E.peek().path})||C("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{pt(),Ht("user","You",t,{ts:n,forceStick:!0});let s=$.peek()||"claude",a=te.peek()||Qe(s,_.peek())||(s==="grok"?"low":""),o=de.peek();c.sessionId&&se(_.peek(),s,c.sessionId),lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:_.peek(),lockToken:c.lock?.token||void 0,...a&&{effort:a},...o&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||C("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function fl(){c.sessionId&&lt({type:"command",cmd:"turn.interrupt",sessionId:c.sessionId}),Fe=Fe.filter(e=>e.key!==$t()),ja(),Cu(),ws()}function $s(e){let t=ml(e),n=i("chat-input"),s=i("send-btn");if(!n||!s)return;n.classList.toggle("textarea-warning",t),n.style.fontFamily=t?"monospace":"",s.classList.toggle("btn-warning",t),s.classList.toggle("btn-primary",!t),s.textContent=t?"Run":"Send";let a=Z[$.peek()]||"agent",o=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches;t?n.placeholder=o?"Shell \u547D\u4EE4\u2026":"Shell command (without !)\u2026":n.placeholder=o?`\u95EE ${a}\u2026`:`Ask ${a}\u2026 or !cmd for shell`}function ml(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function wu(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function Ss(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,wu())+"px"}function Ca(e){let t=O(e);if(t==null)return"";let n=new Date(t);if(Number.isNaN(n.getTime()))return"";let s=new Date,a=n.toDateString()===s.toDateString(),o=n.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1});return a?o:`${n.toLocaleDateString(void 0,{month:"numeric",day:"numeric"})} ${o}`}function Ma(e){let t=O(e);return t==null?"":new Date(t).toISOString()}function Su(e,t,n){if(e==="system")return t;let s=Ca(n),a=Ma(n),o=s?`<div class="msg-ts" title="${p(a)}">${p(s)}</div>`:"";return`<div class="msg-row ${e==="user"?"user":e==="shell"||e==="shell-err"?"assistant":e} px-2" data-ts="${p(a)}">${t}${o}</div>`}function Lu(e,t,n){let s='<button class="msg-expand-btn text-[10px] text-primary/70 mt-1.5 block cursor-pointer hover:text-primary">\u25BC Show more</button>',a;switch(e){case"user":{let r=/!\[.*?\]\(.*?\)/.test(t)?La(t):null,d=t.length>ku,u=d?`<div class="msg-body">${r??p(t.trimEnd())}</div>${s}`:r??p(t.trimEnd());a=`<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${d?" msg-card":""}${r?" md":""}"${r?"":' style="white-space:pre-wrap"'}>${u}</div>`;break}case"assistant":{let o=t.length>$u,r=o?`<div class="msg-body">${La(t)}</div>${s}`:La(t);a=`<div class="msg-assistant-content 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${o?" msg-card":""}">${r}</div>`;break}case"error":a=`<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">${p(t)}</div>`;break;case"shell":case"shell-err":a=`<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">${p(t)}</div>`;break;case"system":return`<div class="text-center text-[11px] text-base-content/30 py-0.5 select-none">${p(t)}</div>`;default:a=`<div class="rounded-lg px-3 py-2 text-sm bg-base-300 break-words" style="white-space:pre-wrap">${p(t)}</div>`}return Su(e,a,n)}function Ht(e,t,n,s={}){let a=i("messages");if(!a)return;let o=O(s.ts)??(e==="system"?null:Date.now());a.insertAdjacentHTML("beforeend",Lu(e,n,o)),xl(a.lastElementChild),e==="assistant"&&bl(a.lastElementChild,n,s),He(a,!!s.forceStick)}function C(e){Ht("system","",e)}function Sa(){for(let e of Aa)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}Aa.length=0,Eu()}function Kn(){Sa()}function Eu(){let e=i("chat-attach-bar");if(e){if(!Aa.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=Aa.map((t,n)=>`
57
+ (usage fetch failed: ${a.message})`)}}function Es(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(!sn()){C(Ta()),wt().then(()=>Ca()).catch(()=>{});return}if(c.sessionId&&!c.lock?.held&&!c.lock?.unmanaged){wt().then(s=>{if(!s?.ok&&!s?.skipped){Ca(),C(Ta());return}Es()}).catch(()=>Es());return}if(P.peek()){if($.peek()==="grok"&&c.sessionId){let s="grok",a=te.peek()||Qe(s,N.peek())||"low",o=lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:N.peek(),lockToken:c.lock?.token||void 0,effort:a,...ue.peek()&&{permissionMode:ue.peek()},...ue.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});vl(t),e.value="",Ls(e),Ss(""),La(),C(o?"\u5DF2\u52A0\u5165 Grok \u670D\u52A1\u7AEF\u961F\u5217\uFF0C\u5237\u65B0\u9875\u9762\u4ECD\u4F1A\u663E\u793A":"\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5C06\u5728\u91CD\u8FDE\u540E\u53D1\u9001");return}Fe.push({key:St(),text:t}),Da(),e.value="",Ls(e),Ss(""),La(),C(`\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="",cn.delete(St()),Ls(e),Ss(""),La(),t.startsWith("/")&&wu(t))return;P.value=!0,dn();let n=Date.now();if(gl(t))qt("shell","$ Shell",t.slice(1).trim(),{ts:n}),lt({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:E.peek().path})||C("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{pt(),qt("user","You",t,{ts:n,forceStick:!0});let s=$.peek()||"claude",a=te.peek()||Qe(s,N.peek())||(s==="grok"?"low":""),o=ue.peek();c.sessionId&&se(N.peek(),s,c.sessionId),lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:N.peek(),lockToken:c.lock?.token||void 0,...a&&{effort:a},...o&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||C("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function hl(){c.sessionId&&lt({type:"command",cmd:"turn.interrupt",sessionId:c.sessionId}),Fe=Fe.filter(e=>e.key!==St()),Da(),Au(),ks()}function Ss(e){let t=gl(e),n=i("chat-input"),s=i("send-btn");if(!n||!s)return;n.classList.toggle("textarea-warning",t),n.style.fontFamily=t?"monospace":"",s.classList.toggle("btn-warning",t),s.classList.toggle("btn-primary",!t),s.textContent=t?"Run":"Send";let a=Z[$.peek()]||"agent",o=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches;t?n.placeholder=o?"Shell \u547D\u4EE4\u2026":"Shell command (without !)\u2026":n.placeholder=o?`\u95EE ${a}\u2026`:`Ask ${a}\u2026 or !cmd for shell`}function gl(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function $u(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function Ls(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,$u())+"px"}function Ma(e){let t=B(e);if(t==null)return"";let n=new Date(t);if(Number.isNaN(n.getTime()))return"";let s=new Date,a=n.toDateString()===s.toDateString(),o=n.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1});return a?o:`${n.toLocaleDateString(void 0,{month:"numeric",day:"numeric"})} ${o}`}function Aa(e){let t=B(e);return t==null?"":new Date(t).toISOString()}function Eu(e,t,n){if(e==="system")return t;let s=Ma(n),a=Aa(n),o=s?`<div class="msg-ts" title="${p(a)}">${p(s)}</div>`:"";return`<div class="msg-row ${e==="user"?"user":e==="shell"||e==="shell-err"?"assistant":e} px-2" data-ts="${p(a)}">${t}${o}</div>`}function Iu(e,t,n){let s='<button class="msg-expand-btn text-[10px] text-primary/70 mt-1.5 block cursor-pointer hover:text-primary">\u25BC Show more</button>',a;switch(e){case"user":{let r=/!\[.*?\]\(.*?\)/.test(t)?Ea(t):null,d=t.length>Su,u=d?`<div class="msg-body">${r??p(t.trimEnd())}</div>${s}`:r??p(t.trimEnd());a=`<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${d?" msg-card":""}${r?" md":""}"${r?"":' style="white-space:pre-wrap"'}>${u}</div>`;break}case"assistant":{let o=t.length>Lu,r=o?`<div class="msg-body">${Ea(t)}</div>${s}`:Ea(t);a=`<div class="msg-assistant-content 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${o?" msg-card":""}">${r}</div>`;break}case"error":a=`<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">${p(t)}</div>`;break;case"shell":case"shell-err":a=`<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">${p(t)}</div>`;break;case"system":return`<div class="text-center text-[11px] text-base-content/30 py-0.5 select-none">${p(t)}</div>`;default:a=`<div class="rounded-lg px-3 py-2 text-sm bg-base-300 break-words" style="white-space:pre-wrap">${p(t)}</div>`}return Eu(e,a,n)}function qt(e,t,n,s={}){let a=i("messages");if(!a)return;let o=B(s.ts)??(e==="system"?null:Date.now());a.insertAdjacentHTML("beforeend",Iu(e,n,o)),wl(a.lastElementChild),e==="assistant"&&xl(a.lastElementChild,n,s),He(a,!!s.forceStick)}function C(e){qt("system","",e)}function La(){for(let e of ja)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}ja.length=0,Tu()}function Jn(){La()}function Tu(){let e=i("chat-attach-bar");if(e){if(!ja.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=ja.map((t,n)=>`
58
58
  <div class="chat-thumb relative" title="${p(t.ref||t.path)}">
59
59
  ${t.previewUrl?`<img src="${t.previewUrl}" alt="${p(t.label||"img")}">`:`<span class="chat-thumb-path">${p(t.label||t.name||"file")}</span>`}
60
60
  <span class="chat-thumb-label">${p(t.label||t.kind||"")}</span>
61
61
  <button type="button" class="chat-thumb-x" data-rm-attach="${n}" aria-label="remove">\u2715</button>
62
- </div>`).join("")}}function wt(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function hr(e){let t=i("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
62
+ </div>`).join("")}}function kt(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function gr(e){let t=i("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
63
63
  <span class="token-bar-mark">\u25C8</span><span class="token-bar-text">${p(e)}</span>
64
- </div>`),He(t))}function Bn(e){if(!e)return;let t=e.input_tokens??e.inputTokens??0,n=e.output_tokens??e.outputTokens??0,s=e.total_tokens??e.totalTokens??t+n,a=e.cache_read_input_tokens??e.cachedReadTokens?` \xB7 ${wt(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${wt(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${wt(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,u=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",l=s?` \xB7 \u03A3${wt(s)}`:"";hr(`\u2191${wt(t)} \u2193${wt(n)}${a}${o}${r}${l}${u}`)}function gr(e){if(!e)return;let t=e.tokensUsed??e.contextTokensUsed,n=e.windowTokens??e.contextWindowTokens,s=e.usagePercent??e.contextWindowUsage;if(t==null&&n==null&&s==null)return;let a=[];t!=null&&n!=null?a.push(`context ${wt(t)} / ${wt(n)}`):t!=null&&a.push(`context ${wt(t)}`),s!=null&&a.push(`${s}%`),e.model&&a.push(e.model),e.turnCount!=null&&a.push(`${e.turnCount} turns`),e.toolCallCount!=null&&a.push(`${e.toolCallCount} tools`),hr(`\u25A3 ${a.join(" \xB7 ")}`)}function hl(){let e=i("messages");e&&(e.dataset.historyPainting="1",e.innerHTML="",Ye=null,fr.clear())}function br(e=null){let t=i("messages");t&&(delete t.dataset.historyPainting,e==null?He(t,!0):(t.scrollTop=Math.max(0,e),rl(t).setFollowing(vs(t))))}function zn(){let e=i("messages"),t=i("permission-requests");e&&(e.innerHTML="",delete e.dataset.historyPainting),t&&(t.innerHTML=""),c.shellBubble=null,Ye=null,Xe=Ue=null,Nt=dt=null,fr.clear(),Ea.clear()}function Iu(e,t=c.sessionId){return`${t||""}
65
- ${String(e||"")}`}function gl(e,t=c.sessionId){let n=Iu(e,t);!e||Ea.has(n)||(Ea.add(n),Ht("user","You",e,{ts:Date.now(),forceStick:!0}),i("messages")?.lastElementChild?.classList.add("queued-user-msg"))}function Tu(e){if((e.sessionId||c.sessionId)!==c.sessionId)return;let t=Array.isArray(e.items)?e.items.filter(n=>typeof n=="string"&&n.trim()):[];for(let n of t)gl(n,e.sessionId||c.sessionId);t.length&&C(`\u231B Grok queue \xB7 ${t.length} prompt${t.length===1?"":"s"} waiting`)}function Cu(){let e=i("messages");e&&(e.querySelectorAll(".queued-user-msg").forEach(t=>{t.classList.remove("queued-user-msg"),t.classList.add("cancelled-queued-user-msg")}),Ea.clear())}function bl(e,t,n={}){if(!e||!t||e.querySelector(".msg-actions"))return;let s=`a${++cu}`;fr.set(s,{text:t,historyIndex:Number.isInteger(n.historyIndex)?n.historyIndex:null,sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null});let a=!["gemini","cursor"].includes(c.agent||$.peek()||"claude"),o=document.createElement("div");o.className="msg-actions",o.innerHTML=`
64
+ </div>`),He(t))}function Fn(e){if(!e)return;let t=e.input_tokens??e.inputTokens??0,n=e.output_tokens??e.outputTokens??0,s=e.total_tokens??e.totalTokens??t+n,a=e.cache_read_input_tokens??e.cachedReadTokens?` \xB7 ${kt(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${kt(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${kt(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,u=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",l=s?` \xB7 \u03A3${kt(s)}`:"";gr(`\u2191${kt(t)} \u2193${kt(n)}${a}${o}${r}${l}${u}`)}function br(e){if(!e)return;let t=e.tokensUsed??e.contextTokensUsed,n=e.windowTokens??e.contextWindowTokens,s=e.usagePercent??e.contextWindowUsage;if(t==null&&n==null&&s==null)return;let a=[];t!=null&&n!=null?a.push(`context ${kt(t)} / ${kt(n)}`):t!=null&&a.push(`context ${kt(t)}`),s!=null&&a.push(`${s}%`),e.model&&a.push(e.model),e.turnCount!=null&&a.push(`${e.turnCount} turns`),e.toolCallCount!=null&&a.push(`${e.toolCallCount} tools`),gr(`\u25A3 ${a.join(" \xB7 ")}`)}function bl(){let e=i("messages");e&&(e.dataset.historyPainting="1",e.innerHTML="",Ye=null,mr.clear())}function vr(e=null){let t=i("messages");t&&(delete t.dataset.historyPainting,e==null?He(t,!0):(t.scrollTop=Math.max(0,e),ll(t).setFollowing(xs(t))))}function Qn(){let e=i("messages"),t=i("permission-requests");e&&(e.innerHTML="",delete e.dataset.historyPainting),t&&(t.innerHTML=""),c.shellBubble=null,Ye=null,Xe=Ue=null,Pt=dt=null,mr.clear(),Ia.clear()}function Cu(e,t=c.sessionId){return`${t||""}
65
+ ${String(e||"")}`}function vl(e,t=c.sessionId){let n=Cu(e,t);!e||Ia.has(n)||(Ia.add(n),qt("user","You",e,{ts:Date.now(),forceStick:!0}),i("messages")?.lastElementChild?.classList.add("queued-user-msg"))}function Mu(e){if((e.sessionId||c.sessionId)!==c.sessionId)return;let t=Array.isArray(e.items)?e.items.filter(n=>typeof n=="string"&&n.trim()):[];for(let n of t)vl(n,e.sessionId||c.sessionId);t.length&&C(`\u231B Grok queue \xB7 ${t.length} prompt${t.length===1?"":"s"} waiting`)}function Au(){let e=i("messages");e&&(e.querySelectorAll(".queued-user-msg").forEach(t=>{t.classList.remove("queued-user-msg"),t.classList.add("cancelled-queued-user-msg")}),Ia.clear())}function xl(e,t,n={}){if(!e||!t||e.querySelector(".msg-actions"))return;let s=`a${++uu}`;mr.set(s,{text:t,historyIndex:Number.isInteger(n.historyIndex)?n.historyIndex:null,sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null});let a=!["gemini","cursor"].includes(c.agent||$.peek()||"claude"),o=document.createElement("div");o.className="msg-actions",o.innerHTML=`
66
66
  <button type="button" class="msg-action-btn" data-copy-message="${p(s)}" title="Copy answer">Copy</button>
67
- ${a?`<button type="button" class="msg-action-btn" data-fork-message="${p(s)}" title="Start a branch from this answer">Fork</button>`:""}`;let r=e.querySelector(".msg-ts");e.insertBefore(o,r||null)}function Mu(e){let t=i("messages");if(!t)return null;let n=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${n} whitespace-pre-wrap break-words"></div>`),He(t),t.lastElementChild}function Au(e,t){e&&(e.textContent+=t,He(e.closest("#messages")))}function ju(e){let t=typeof e.input=="object"?JSON.stringify(e.input,null,2):String(e.input||""),s=((typeof e.input=="object"?Object.values(e.input).find(a=>typeof a=="string"&&a.trim()):t)||"").replace(/\n/g," ").slice(0,_e.peek()==="full"?120:80);return{inputStr:t,preview:s}}function al(e,{inBatch:t=!1}={}){let{inputStr:n,preview:s}=ju(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
67
+ ${a?`<button type="button" class="msg-action-btn" data-fork-message="${p(s)}" title="Start a branch from this answer">Fork</button>`:""}`;let r=e.querySelector(".msg-ts");e.insertBefore(o,r||null)}function ju(e){let t=i("messages");if(!t)return null;let n=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${n} whitespace-pre-wrap break-words"></div>`),He(t),t.lastElementChild}function Du(e,t){e&&(e.textContent+=t,He(e.closest("#messages")))}function _u(e){let t=typeof e.input=="object"?JSON.stringify(e.input,null,2):String(e.input||""),s=((typeof e.input=="object"?Object.values(e.input).find(a=>typeof a=="string"&&a.trim()):t)||"").replace(/\n/g," ").slice(0,_e.peek()==="full"?120:80);return{inputStr:t,preview:s}}function rl(e,{inBatch:t=!1}={}){let{inputStr:n,preview:s}=_u(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
68
68
  <div class="flex items-center gap-1.5 text-xs font-mono">
69
69
  <span class="text-warning">\u26A1</span>
70
70
  <span class="text-warning font-semibold">${p(e.name||"tool")}</span>
@@ -72,21 +72,21 @@ ${String(e||"")}`}function gl(e,t=c.sessionId){let n=Iu(e,t);!e||Ea.has(n)||(Ea.
72
72
  <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>
73
73
  </div>
74
74
  <div class="tool-detail">${p(n)}</div>
75
- </div>`}function Du(e){let t=[...new Set(e.names)],n=t.slice(0,4).join(", ")+(t.length>4?"\u2026":""),s=e.el.querySelector(".tool-batch-summary");s&&(s.innerHTML=`<span class="text-warning">\u26A1</span>
75
+ </div>`}function Nu(e){let t=[...new Set(e.names)],n=t.slice(0,4).join(", ")+(t.length>4?"\u2026":""),s=e.el.querySelector(".tool-batch-summary");s&&(s.innerHTML=`<span class="text-warning">\u26A1</span>
76
76
  <span class="font-semibold text-base-content/70">${e.count} tool${e.count===1?"":"s"}</span>
77
77
  <span class="text-base-content/40 truncate flex-1">${p(n)}</span>
78
- <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function pt(){Ye=null}function vr(e,t={}){let n=i("messages");if(!n)return;let s=_e.peek()||"normal",a=O(t.ts);if(s==="clean"){if(!Ye||!n.contains(Ye.el)){let u=Ca(a),l=Ma(a);n.insertAdjacentHTML("beforeend",`
78
+ <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function pt(){Ye=null}function xr(e,t={}){let n=i("messages");if(!n)return;let s=_e.peek()||"normal",a=B(t.ts);if(s==="clean"){if(!Ye||!n.contains(Ye.el)){let u=Ma(a),l=Aa(a);n.insertAdjacentHTML("beforeend",`
79
79
  <div class="msg-row assistant px-2" data-ts="${p(l)}">
80
80
  <div class="tool-batch w-full max-w-[96%] px-2 py-1.5">
81
81
  <div class="tool-batch-summary flex items-center gap-1.5 text-xs font-mono"></div>
82
82
  <div class="tool-batch-list"></div>
83
83
  </div>
84
84
  ${u?`<div class="msg-ts" title="${p(l)}">${p(u)}</div>`:""}
85
- </div>`),Ye={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}Ye.names.push(e.name||"tool"),Ye.count++,Ye.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",al(e,{inBatch:!0})),Du(Ye),He(n);return}Ye=null;let o=Ca(a),r=Ma(a);n.insertAdjacentHTML("beforeend",`
85
+ </div>`),Ye={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}Ye.names.push(e.name||"tool"),Ye.count++,Ye.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",rl(e,{inBatch:!0})),Nu(Ye),He(n);return}Ye=null;let o=Ma(a),r=Aa(a);n.insertAdjacentHTML("beforeend",`
86
86
  <div class="msg-row assistant px-2" data-ts="${p(r)}">
87
- <div class="w-full max-w-[96%]">${al(e)}</div>
87
+ <div class="w-full max-w-[96%]">${rl(e)}</div>
88
88
  ${o?`<div class="msg-ts" title="${p(r)}">${p(o)}</div>`:""}
89
- </div>`),He(n)}function vl(){let e=i("messages");e&&e.setAttribute("data-density",_e.peek()||"normal")}function _u(e){let t=e.request_id||e.requestId;if(!t||i(`perm-${t}`))return;let n=e.tool_input?JSON.stringify(e.tool_input).slice(0,200):"";i("permission-requests")?.insertAdjacentHTML("beforeend",`
89
+ </div>`),He(n)}function yl(){let e=i("messages");e&&e.setAttribute("data-density",_e.peek()||"normal")}function Pu(e){let t=e.request_id||e.requestId;if(!t||i(`perm-${t}`))return;let n=e.tool_input?JSON.stringify(e.tool_input).slice(0,200):"";i("permission-requests")?.insertAdjacentHTML("beforeend",`
90
90
  <div id="perm-${t}" class="perm-banner mx-3 mb-2 rounded-lg border border-warning/25 bg-warning/8 p-3">
91
91
  <div class="text-xs text-warning font-semibold mb-1">\u26A0\uFE0F Permission Required</div>
92
92
  <div class="font-mono text-xs text-base-content/60 break-all mb-2">
@@ -96,13 +96,13 @@ ${String(e||"")}`}function gl(e,t=c.sessionId){let n=Iu(e,t);!e||Ea.has(n)||(Ea.
96
96
  <button class="btn btn-success btn-xs" data-perm-id="${t}" data-perm-allow="1">Allow</button>
97
97
  <button class="btn btn-error btn-xs" data-perm-id="${t}" data-perm-allow="0">Deny</button>
98
98
  </div>
99
- </div>`),He(i("messages"))}function Nu(){if(ol||typeof marked>"u")return;let e=s=>String(s??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=(s,a)=>{let o=String(a||"").trim().split(/\s+/)[0]||"",r=o||"text",d=o?`language-${p(o)}`:"";return`<div class="code-block">
99
+ </div>`),He(i("messages"))}function Hu(){if(il||typeof marked>"u")return;let e=s=>String(s??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=(s,a)=>{let o=String(a||"").trim().split(/\s+/)[0]||"",r=o||"text",d=o?`language-${p(o)}`:"";return`<div class="code-block">
100
100
  <div class="code-block-header">
101
101
  <span class="code-block-lang">${p(r)}</span>
102
102
  <button type="button" class="code-copy" data-copy="1" title="Copy code">Copy</button>
103
103
  </div>
104
104
  <pre><code class="hljs ${d}">${e(s)}</code></pre>
105
- </div>`},n={code(s,a){return s&&typeof s=="object"&&s.text!=null?t(s.text,s.lang||a):t(s,a)},table(s,a){return s&&typeof s=="object"&&!Array.isArray(s)&&s.header?!1:`<div class="table-wrap"><table><thead>${s}</thead><tbody>${a}</tbody></table></div>`},html(s){return e(s)}};try{if(typeof marked.use=="function")marked.use({gfm:!0,breaks:!0,renderer:n});else if(typeof marked.setOptions=="function"){let s=new marked.Renderer;s.code=n.code,s.table=n.table,marked.setOptions({gfm:!0,breaks:!0,renderer:s})}}catch(s){console.warn("[md] marked setup failed",s)}ol=!0}function La(e){if(typeof marked>"u")return p(e);try{return Nu(),Ve(e,{fallback:()=>p(e)})}catch{return p(e)}}function Pu(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 xl(e){Pu(e),xt(e),vt(e)}var on,ys,On,ut,kt,ka,tl,lr,nl,cr,dr,fr,cu,Ea,ur,Fe,sl,rn,cl,Xe,Ue,Nt,dt,vu,ku,$u,Aa,Ye,ol,_a=F(()=>{G();er();W();le();hs();or();ya();_n();Zt();en();ir();_t();_t();on=null;ys=0,On=null,ut=1e3,kt=0,ka=null,tl=!1,lr=!1,nl=null,cr=!1,dr="hubStreamCursors",fr=new Map,cu=0,Ea=new Set,ur="pendingUserTexts",Fe=(()=>{try{let e=JSON.parse(sessionStorage.getItem(ur)||"[]");return Array.isArray(e)?e.filter(t=>t?.key&&t?.text).slice(-30):[]}catch{return[]}})(),sl=new Set,rn=new Map;cl=0;Xe=null,Ue=null,Nt=null,dt=null;vu={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"};ku=200,$u=500;Aa=[];Ye=null;ol=!1});function wl(e,t){yl=e,xr=t,window.addEventListener("hashchange",()=>{if(yr){yr=!1;return}$l(location.hash.slice(1)||"/")}),De(X,n=>{c.sessionId&&Es()})}function wr(e){let[t,n=""]=String(e||"").split("?",2),s=t.match(/^\/session\/([^/]+)(?:\/([^/]+))?$/);if(!s)return null;let a=new URLSearchParams(n);try{return{id:decodeURIComponent(s[1]),tab:s[2]?decodeURIComponent(s[2]):null,machineId:a.get("machine")||null,agent:a.get("agent")||null}}catch{return null}}function kl(){$l(location.hash.slice(1)||"/")}function $l(e){let t=String(e||"").split("?")[0];if(t==="/settings"){document.dispatchEvent(new CustomEvent("router:settings"));return}if(t==="/notes"){document.dispatchEvent(new CustomEvent("router:notes"));return}let n=wr(e);if(!n){document.dispatchEvent(new CustomEvent("router:home"));return}let{id:s,tab:a,machineId:o,agent:r}=n;!yl||!xr||(s!==c.sessionId?document.dispatchEvent(new CustomEvent("router:session",{detail:{id:s,tab:a,machineId:o,agent:r}})):a&&a!==X.peek()&&xr(a))}function kr(e){yr=!0,location.hash=e}function Es(){if(!c.sessionId)return;let e=new URLSearchParams;c.machineId&&e.set("machine",c.machineId),c.agent&&e.set("agent",c.agent);let t=e.size?`?${e}`:"";kr(`/session/${encodeURIComponent(c.sessionId)}/${encodeURIComponent(X.peek())}${t}`)}function Sl(){if(!c.sessionId)return null;let e=new URL(location.href),t=new URLSearchParams;c.machineId&&t.set("machine",c.machineId),c.agent&&t.set("agent",c.agent);let n=t.size?`?${t}`:"";return e.hash=`/session/${encodeURIComponent(c.sessionId)}/${encodeURIComponent(X.peek())}${n}`,e.toString()}var zm,yl,xr,yr,Na=F(()=>{G();W();zm=Si({"/":()=>{},"/session/*":()=>{},"/session/*/*":()=>{},"*":()=>{}}),yl=null,xr=null,yr=!1});async function Pa(){try{return await Jn.get("sessions")??null}catch{return null}}async function Ll(e){try{await Jn.set("sessions",e,{ttl:Hu})}catch{}}async function El(){try{return await Jn.get("workspaces")??null}catch{return null}}async function Is(e){try{await Jn.set("workspaces",e,{ttl:3600*1e3})}catch{}}async function Il(e){try{return Ts(await Jn.get(`transcript:${e}`))}catch{return null}}async function Tl(e,t){try{await Jn.set(`transcript:${e}`,Ts(t),{ttl:1440*60*1e3})}catch{}}function Ts(e){if(!e?.msgs)return e??null;let t=Math.max(0,e.msgs.length-80);return{...e,msgs:e.msgs.slice(t),meta:{...e.meta,oldestIndex:(e.meta?.oldestIndex||0)+t,truncated:t>0||!!e.meta?.truncated}}}var Jn,Hu,Cs=F(()=>{G();Jn=Li("claude-ui"),Hu=300*1e3});var Mr={};ls(Mr,{closeNotes:()=>Pl,initNotes:()=>Cr,openNotes:()=>Ra});function Ra(){Hl();let e=document.getElementById("notes-page");if(!e)return;e.hidden=!1,document.getElementById("welcome")?.classList.add("hidden");let t=document.getElementById("project-view");t&&(t.classList.add("hidden"),t.style.display="none"),document.documentElement.classList.remove("notes-open"),(location.hash||"")!=="#/notes"&&(location.hash="/notes"),un({keepList:!0})}function Pl({restore:e=!0}={}){let t=document.getElementById("notes-page");if(!t)return;t.hidden=!0,document.documentElement.classList.remove("notes-open"),Ze=null,St=!1;let n=document.getElementById("notes-add-form");if(n&&(n.hidden=!0),!!e)if(c.sessionId){let s=document.getElementById("project-view");s&&(s.classList.remove("hidden"),s.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden")}else{let s=document.getElementById("welcome");s&&(s.classList.remove("hidden"),s.style.display="")}}function Hl(){if(Dl)return;Dl=!0,(document.getElementById("main")||document.getElementById("root")).insertAdjacentHTML("beforeend",zu()),document.addEventListener("router:notes",()=>Ra()),document.getElementById("notes-page").addEventListener("click",s=>{if(s.target.closest("[data-notes-close]")){Pl(),(location.hash||"")==="#/notes"&&history.back();return}let o=s.target.closest("[data-notes-add]");if(o){s.preventDefault(),St=!St;let m=document.getElementById("notes-add-form");m&&(m.hidden=!St),o.textContent=St?"\u6536\u8D77":"+ \u65B0\u589E",St&&document.getElementById("notes-add-text")?.focus();return}if(s.target.closest("[data-notes-submit]")){s.preventDefault(),_l();return}let d=s.target.closest("[data-notes-edit]");if(d){s.preventDefault(),Ju(d.dataset.notesEdit);return}if(s.target.closest("[data-notes-save]")){s.preventDefault(),Vu();return}if(s.target.closest("[data-notes-cancel]")){if(s.preventDefault(),Ze)Qu();else{St=!1;let m=document.getElementById("notes-add-form");m&&(m.hidden=!0);let g=document.querySelector("[data-notes-add]");g&&(g.textContent="+ \u65B0\u589E")}return}let f=s.target.closest("[data-notes-remove]");if(f){s.preventDefault();let m=f.dataset.notesRemove;confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u5F55?")&&ql(m)}});let n=document.getElementById("notes-add-text");n&&n.addEventListener("keydown",s=>{(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&(s.preventDefault(),_l())})}function zu(){return`
105
+ </div>`},n={code(s,a){return s&&typeof s=="object"&&s.text!=null?t(s.text,s.lang||a):t(s,a)},table(s,a){return s&&typeof s=="object"&&!Array.isArray(s)&&s.header?!1:`<div class="table-wrap"><table><thead>${s}</thead><tbody>${a}</tbody></table></div>`},html(s){return e(s)}};try{if(typeof marked.use=="function")marked.use({gfm:!0,breaks:!0,renderer:n});else if(typeof marked.setOptions=="function"){let s=new marked.Renderer;s.code=n.code,s.table=n.table,marked.setOptions({gfm:!0,breaks:!0,renderer:s})}}catch(s){console.warn("[md] marked setup failed",s)}il=!0}function Ea(e){if(typeof marked>"u")return p(e);try{return Hu(),Ve(e,{fallback:()=>p(e)})}catch{return p(e)}}function qu(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 wl(e){qu(e),yt(e),xt(e)}var ln,ws,Un,ut,$t,$a,sl,cr,al,dr,ur,mr,uu,Ia,pr,Fe,ol,cn,ul,Xe,Ue,Pt,dt,yu,Su,Lu,ja,Ye,il,Na=W(()=>{K();tr();G();ce();gs();rr();wa();Pn();tn();nn();lr();Nt();Nt();ln=null;ws=0,Un=null,ut=1e3,$t=0,$a=null,sl=!1,cr=!1,al=null,dr=!1,ur="hubStreamCursors",mr=new Map,uu=0,Ia=new Set,pr="pendingUserTexts",Fe=(()=>{try{let e=JSON.parse(sessionStorage.getItem(pr)||"[]");return Array.isArray(e)?e.filter(t=>t?.key&&t?.text).slice(-30):[]}catch{return[]}})(),ol=new Set,cn=new Map;ul=0;Xe=null,Ue=null,Pt=null,dt=null;yu={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"};Su=200,Lu=500;ja=[];Ye=null;il=!1});function $l(e,t){kl=e,yr=t,window.addEventListener("hashchange",()=>{if(wr){wr=!1;return}Ll(location.hash.slice(1)||"/")}),De(X,n=>{c.sessionId&&Is()})}function kr(e){let[t,n=""]=String(e||"").split("?",2),s=t.match(/^\/session\/([^/]+)(?:\/([^/]+))?$/);if(!s)return null;let a=new URLSearchParams(n);try{return{id:decodeURIComponent(s[1]),tab:s[2]?decodeURIComponent(s[2]):null,machineId:a.get("machine")||null,agent:a.get("agent")||null}}catch{return null}}function Sl(){Ll(location.hash.slice(1)||"/")}function Ll(e){let t=String(e||"").split("?")[0];if(t==="/settings"){document.dispatchEvent(new CustomEvent("router:settings"));return}if(t==="/notes"){document.dispatchEvent(new CustomEvent("router:notes"));return}let n=kr(e);if(!n){document.dispatchEvent(new CustomEvent("router:home"));return}let{id:s,tab:a,machineId:o,agent:r}=n;!kl||!yr||(s!==c.sessionId?document.dispatchEvent(new CustomEvent("router:session",{detail:{id:s,tab:a,machineId:o,agent:r}})):a&&a!==X.peek()&&yr(a))}function $r(e){wr=!0,location.hash=e}function Is(){if(!c.sessionId)return;let e=new URLSearchParams;c.machineId&&e.set("machine",c.machineId),c.agent&&e.set("agent",c.agent);let t=e.size?`?${e}`:"";$r(`/session/${encodeURIComponent(c.sessionId)}/${encodeURIComponent(X.peek())}${t}`)}function El(){if(!c.sessionId)return null;let e=new URL(location.href),t=new URLSearchParams;c.machineId&&t.set("machine",c.machineId),c.agent&&t.set("agent",c.agent);let n=t.size?`?${t}`:"";return e.hash=`/session/${encodeURIComponent(c.sessionId)}/${encodeURIComponent(X.peek())}${n}`,e.toString()}var Qm,kl,yr,wr,Pa=W(()=>{K();G();Qm=Ei({"/":()=>{},"/session/*":()=>{},"/session/*/*":()=>{},"*":()=>{}}),kl=null,yr=null,wr=!1});async function qa(){try{return await ft.get("sessions")??null}catch{return null}}async function Il(e){try{await ft.set("sessions",e,{ttl:Ru})}catch{}}async function Tl(){try{return await ft.get("workspaces")??null}catch{return null}}async function Ts(e){try{await ft.set("workspaces",e,{ttl:3600*1e3})}catch{}}async function Cl(e){try{return Cs(await ft.get(`transcript:${e}`))}catch{return null}}function Ml(e,t){let n=Cs(t);return Sr=Sr.catch(()=>{}).then(async()=>{await ft.set(`transcript:${e}`,n,{ttl:1440*60*1e3});let s=`transcript:${e}`,a=await ft.get("transcript-index-v2"),o=[{key:s,at:Date.now()},...(a||[]).filter(d=>d.key!==s)].filter(d=>d.at>=Date.now()-1440*60*1e3).slice(0,24),r=new Set(o.map(d=>d.key));for(let d of await ft.keys())String(d).startsWith("transcript:")&&!r.has(d)&&await ft.delete(d);await ft.set("transcript-index-v2",o)}),Sr.catch(()=>{})}function Ha(e,t=1024*1024){if(typeof e=="string")return e.length*3+2;if(!e||typeof e!="object")return 16;let n=2;for(let[s,a]of Object.entries(e))if(n+=s.length*3+Ha(a,t-n)+4,n>t)break;return n}function Cs(e){if(!e?.msgs)return e??null;let t=e.msgs.length,n=Ha(e.context),s=n>64*1024?null:e.context;for(n=Ha(s);t>0&&e.msgs.length-t<80;){let a=Ha(e.msgs[t-1]);if(n+a>1024*1024)break;n+=a,t--}return{...e,context:s,msgs:e.msgs.slice(t),meta:{...e.meta,oldestIndex:(e.meta?.oldestIndex||0)+t,truncated:t>0||!!e.meta?.truncated}}}var ft,Ru,Sr,Ms=W(()=>{K();ft=Ii("claude-ui"),Ru=300*1e3;Sr=Promise.resolve()});var jr={};cs(jr,{closeNotes:()=>ql,initNotes:()=>Ar,openNotes:()=>Oa});function Oa(){Rl();let e=document.getElementById("notes-page");if(!e)return;e.hidden=!1,document.getElementById("welcome")?.classList.add("hidden");let t=document.getElementById("project-view");t&&(t.classList.add("hidden"),t.style.display="none"),document.documentElement.classList.remove("notes-open"),(location.hash||"")!=="#/notes"&&(location.hash="/notes"),fn({keepList:!0})}function ql({restore:e=!0}={}){let t=document.getElementById("notes-page");if(!t)return;t.hidden=!0,document.documentElement.classList.remove("notes-open"),Ze=null,Lt=!1;let n=document.getElementById("notes-add-form");if(n&&(n.hidden=!0),!!e)if(c.sessionId){let s=document.getElementById("project-view");s&&(s.classList.remove("hidden"),s.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden")}else{let s=document.getElementById("welcome");s&&(s.classList.remove("hidden"),s.style.display="")}}function Rl(){if(Nl)return;Nl=!0,(document.getElementById("main")||document.getElementById("root")).insertAdjacentHTML("beforeend",Qu()),document.addEventListener("router:notes",()=>Oa()),document.getElementById("notes-page").addEventListener("click",s=>{if(s.target.closest("[data-notes-close]")){ql(),(location.hash||"")==="#/notes"&&history.back();return}let o=s.target.closest("[data-notes-add]");if(o){s.preventDefault(),Lt=!Lt;let m=document.getElementById("notes-add-form");m&&(m.hidden=!Lt),o.textContent=Lt?"\u6536\u8D77":"+ \u65B0\u589E",Lt&&document.getElementById("notes-add-text")?.focus();return}if(s.target.closest("[data-notes-submit]")){s.preventDefault(),Pl();return}let d=s.target.closest("[data-notes-edit]");if(d){s.preventDefault(),Vu(d.dataset.notesEdit);return}if(s.target.closest("[data-notes-save]")){s.preventDefault(),Xu();return}if(s.target.closest("[data-notes-cancel]")){if(s.preventDefault(),Ze)Yu();else{Lt=!1;let m=document.getElementById("notes-add-form");m&&(m.hidden=!0);let g=document.querySelector("[data-notes-add]");g&&(g.textContent="+ \u65B0\u589E")}return}let f=s.target.closest("[data-notes-remove]");if(f){s.preventDefault();let m=f.dataset.notesRemove;confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u5F55?")&&Bl(m)}});let n=document.getElementById("notes-add-text");n&&n.addEventListener("keydown",s=>{(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&(s.preventDefault(),Pl())})}function Qu(){return`
106
106
  <section id="notes-page" class="notes-page" hidden>
107
107
  <header class="notes-header">
108
108
  <div>
@@ -124,21 +124,21 @@ ${String(e||"")}`}function gl(e,t=c.sessionId){let n=Iu(e,t);!e||Ea.has(n)||(Ea.
124
124
  <ul id="notes-list" class="notes-list">
125
125
  <li class="notes-empty">\u52A0\u8F7D\u4E2D\u2026</li>
126
126
  </ul>
127
- </section>`}async function un({keepList:e=!1}={}){let t=document.getElementById("notes-list");if(t){(!e||!dn)&&(t.innerHTML='<li class="notes-empty">\u52A0\u8F7D\u4E2D\u2026</li>');try{dn=(await x("GET","/api/notes?limit=200",void 0,void 0,{hub:!0}))?.items||[],Tr()}catch(n){t.innerHTML=`<li class="notes-empty notes-error">\u52A0\u8F7D\u5931\u8D25:${n?.message||n}</li>`}}}function Tr(){let e=document.getElementById("notes-list");if(!e)return;let t=document.getElementById("notes-count");t&&(t.textContent=dn?.length?`${dn.length} \u6761\u8BB0\u4E8B \xB7 \u591A\u7AEF\u5B9E\u65F6\u540C\u6B65`:"\u591A\u7AEF\u5B9E\u65F6\u540C\u6B65");let n=document.getElementById("notes-add-form");if(n&&(n.hidden=!St),!dn||dn.length===0){e.innerHTML='<li class="notes-empty">\u8FD8\u6CA1\u6709\u8BB0\u4E8B\u3002\u70B9\u4E0A\u9762\u7684\u300C\u65B0\u589E\u300D\uFF0C\u6216\u8005\u5728 Meta Agent \u91CC\u8F93\u5165\u300C\u8BB0: xxx\u300D</li>';return}e.innerHTML="";for(let s of dn){let a=document.createElement("li");a.className="notes-item",a.dataset.id=s.id,Ze===s.id?a.innerHTML=`
128
- <textarea class="notes-edit-text" rows="4">${Nl(s.text)}</textarea>
127
+ </section>`}async function fn({keepList:e=!1}={}){let t=document.getElementById("notes-list");if(t){(!e||!pn)&&(t.innerHTML='<li class="notes-empty">\u52A0\u8F7D\u4E2D\u2026</li>');try{pn=(await x("GET","/api/notes?limit=200",void 0,void 0,{hub:!0}))?.items||[],Mr()}catch(n){t.innerHTML=`<li class="notes-empty notes-error">\u52A0\u8F7D\u5931\u8D25:${n?.message||n}</li>`}}}function Mr(){let e=document.getElementById("notes-list");if(!e)return;let t=document.getElementById("notes-count");t&&(t.textContent=pn?.length?`${pn.length} \u6761\u8BB0\u4E8B \xB7 \u591A\u7AEF\u5B9E\u65F6\u540C\u6B65`:"\u591A\u7AEF\u5B9E\u65F6\u540C\u6B65");let n=document.getElementById("notes-add-form");if(n&&(n.hidden=!Lt),!pn||pn.length===0){e.innerHTML='<li class="notes-empty">\u8FD8\u6CA1\u6709\u8BB0\u4E8B\u3002\u70B9\u4E0A\u9762\u7684\u300C\u65B0\u589E\u300D\uFF0C\u6216\u8005\u5728 Meta Agent \u91CC\u8F93\u5165\u300C\u8BB0: xxx\u300D</li>';return}e.innerHTML="";for(let s of pn){let a=document.createElement("li");a.className="notes-item",a.dataset.id=s.id,Ze===s.id?a.innerHTML=`
128
+ <textarea class="notes-edit-text" rows="4">${Hl(s.text)}</textarea>
129
129
  <div class="notes-item-actions">
130
130
  <button class="btn btn-sm btn-primary" data-notes-save>\u4FDD\u5B58</button>
131
131
  <button class="btn btn-sm btn-ghost" data-notes-cancel>\u53D6\u6D88</button>
132
132
  </div>`:a.innerHTML=`
133
- <div class="notes-text">${Nl(s.text)}</div>
133
+ <div class="notes-text">${Hl(s.text)}</div>
134
134
  <div class="notes-item-foot">
135
- <span class="notes-meta">${Yu(s.createdAt)}</span>
135
+ <span class="notes-meta">${Zu(s.createdAt)}</span>
136
136
  <div class="notes-item-actions">
137
137
  <button class="btn btn-ghost btn-xs" data-notes-edit="${s.id}" title="\u7F16\u8F91">\u7F16\u8F91</button>
138
138
  <button class="btn btn-ghost btn-xs text-error" data-notes-remove="${s.id}" title="\u5220\u9664">\u5220\u9664</button>
139
139
  </div>
140
- </div>`,e.appendChild(a)}}function Ju(e){Ze=e,Tr()}function Qu(){Ze=null,Tr()}async function Vu(){let e=document.getElementById("notes-list");if(!e)return;let t=e.querySelector(`li[data-id="${Xu(Ze)}"]`);if(!t)return;let n=t.querySelector(".notes-edit-text");if(!n)return;let s=(n.value||"").trim();if(!s){confirm("\u6587\u672C\u4E3A\u7A7A,\u5220\u9664\u8FD9\u6761\u8BB0\u5F55?")&&await ql(Ze);return}try{await x("PATCH",`/api/notes/${Ze}`,{text:s},void 0,{hub:!0}),Ze=null,await un({keepList:!0})}catch(a){alert("\u4FDD\u5B58\u5931\u8D25:"+(a?.message||a))}}async function _l(){let e=document.getElementById("notes-add-text");if(!e)return;let t=(e.value||"").trim();if(!t){e.focus();return}try{await x("POST","/api/notes",{text:t},void 0,{hub:!0}),e.value="",St=!1;let n=document.getElementById("notes-add-form");n&&(n.hidden=!0);let s=document.querySelector("[data-notes-add]");s&&(s.textContent="+ \u65B0\u589E"),await un({keepList:!0})}catch(n){alert("\u4FDD\u5B58\u5931\u8D25:"+(n?.message||n))}}async function ql(e){try{await x("DELETE",`/api/notes/${e}`,void 0,void 0,{hub:!0}),Ze===e&&(Ze=null),await un({keepList:!0})}catch(t){alert("\u5220\u9664\u5931\u8D25:"+(t?.message||t))}}function Yu(e){if(!e)return"";let t=new Date(e),n=s=>String(s).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}function Xu(e){return typeof CSS<"u"&&CSS.escape?CSS.escape(e):String(e).replace(/[^a-zA-Z0-9_-]/g,t=>"\\"+t)}function Nl(e){return String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Cr(){Hl()}var dn,Ze,Dl,St,As=F(()=>{le();W();dn=null,Ze=null,Dl=!1,St=!1;typeof window<"u"&&(window.addEventListener("hub:note-added",()=>{document.getElementById("notes-page")?.hidden||un()}),window.addEventListener("hub:note-updated",()=>{document.getElementById("notes-page")?.hidden||un()}),window.addEventListener("hub:note-removed",()=>{document.getElementById("notes-page")?.hidden||un()}))});function Yn(e){return Ve(e,{fallback:t=>p(t).replace(/\n/g,"<br>")})}function Xn(e){e&&(typeof hljs<"u"&&e.querySelectorAll("pre code").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),xt(e),vt(e))}async function Dr(e,t,n){let s=ct({"Content-Type":"application/json"},{hub:!0}),a=await fetch(e,{method:"POST",headers:s,body:JSON.stringify(t||{})});if(!a.ok){let l=await a.json().catch(()=>({}));throw new Error(l.error||`HTTP ${a.status}`)}let o=a.body.getReader(),r=new TextDecoder,d="",u="message";for(;;){let{done:l,value:f}=await o.read();if(l)break;d+=r.decode(f,{stream:!0});let m=d.split(`
141
- `);d=m.pop()||"";for(let g of m)if(g.startsWith("event:"))u=g.slice(6).trim();else if(g.startsWith("data:")){let w=g.slice(5).trim();if(!w)continue;let y;try{y=JSON.parse(w)}catch{continue}n[u]?.(y),!n[u]&&n.tool&&(u==="tool_call"&&n.tool({name:y.name,args:y.args,id:y.callId,phase:"start"}),u==="tool_result"&&n.tool({id:y.callId,phase:y.ok===!1?"error":"done",result:y.ok===!1?y.error:y.result})),n.any?.(u,y),u="message"}else g.trim()===""&&(u="message")}}function Zu(){return`
140
+ </div>`,e.appendChild(a)}}function Vu(e){Ze=e,Mr()}function Yu(){Ze=null,Mr()}async function Xu(){let e=document.getElementById("notes-list");if(!e)return;let t=e.querySelector(`li[data-id="${ep(Ze)}"]`);if(!t)return;let n=t.querySelector(".notes-edit-text");if(!n)return;let s=(n.value||"").trim();if(!s){confirm("\u6587\u672C\u4E3A\u7A7A,\u5220\u9664\u8FD9\u6761\u8BB0\u5F55?")&&await Bl(Ze);return}try{await x("PATCH",`/api/notes/${Ze}`,{text:s},void 0,{hub:!0}),Ze=null,await fn({keepList:!0})}catch(a){alert("\u4FDD\u5B58\u5931\u8D25:"+(a?.message||a))}}async function Pl(){let e=document.getElementById("notes-add-text");if(!e)return;let t=(e.value||"").trim();if(!t){e.focus();return}try{await x("POST","/api/notes",{text:t},void 0,{hub:!0}),e.value="",Lt=!1;let n=document.getElementById("notes-add-form");n&&(n.hidden=!0);let s=document.querySelector("[data-notes-add]");s&&(s.textContent="+ \u65B0\u589E"),await fn({keepList:!0})}catch(n){alert("\u4FDD\u5B58\u5931\u8D25:"+(n?.message||n))}}async function Bl(e){try{await x("DELETE",`/api/notes/${e}`,void 0,void 0,{hub:!0}),Ze===e&&(Ze=null),await fn({keepList:!0})}catch(t){alert("\u5220\u9664\u5931\u8D25:"+(t?.message||t))}}function Zu(e){if(!e)return"";let t=new Date(e),n=s=>String(s).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}function ep(e){return typeof CSS<"u"&&CSS.escape?CSS.escape(e):String(e).replace(/[^a-zA-Z0-9_-]/g,t=>"\\"+t)}function Hl(e){return String(e??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}function Ar(){Rl()}var pn,Ze,Nl,Lt,js=W(()=>{ce();G();pn=null,Ze=null,Nl=!1,Lt=!1;typeof window<"u"&&(window.addEventListener("hub:note-added",()=>{document.getElementById("notes-page")?.hidden||fn()}),window.addEventListener("hub:note-updated",()=>{document.getElementById("notes-page")?.hidden||fn()}),window.addEventListener("hub:note-removed",()=>{document.getElementById("notes-page")?.hidden||fn()}))});function Xn(e){return Ve(e,{fallback:t=>p(t).replace(/\n/g,"<br>")})}function Zn(e){e&&(typeof hljs<"u"&&e.querySelectorAll("pre code").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),yt(e),xt(e))}async function Nr(e,t,n){let s=ct({"Content-Type":"application/json"},{hub:!0}),a=await fetch(e,{method:"POST",headers:s,body:JSON.stringify(t||{})});if(!a.ok){let l=await a.json().catch(()=>({}));throw new Error(l.error||`HTTP ${a.status}`)}let o=a.body.getReader(),r=new TextDecoder,d="",u="message";for(;;){let{done:l,value:f}=await o.read();if(l)break;d+=r.decode(f,{stream:!0});let m=d.split(`
141
+ `);d=m.pop()||"";for(let g of m)if(g.startsWith("event:"))u=g.slice(6).trim();else if(g.startsWith("data:")){let w=g.slice(5).trim();if(!w)continue;let y;try{y=JSON.parse(w)}catch{continue}n[u]?.(y),!n[u]&&n.tool&&(u==="tool_call"&&n.tool({name:y.name,args:y.args,id:y.callId,phase:"start"}),u==="tool_result"&&n.tool({id:y.callId,phase:y.ok===!1?"error":"done",result:y.ok===!1?y.error:y.result})),n.any?.(u,y),u="message"}else g.trim()===""&&(u="message")}}function tp(){return`
142
142
  <div id="meta-agent-panel" class="meta-agent-panel hidden" aria-hidden="true">
143
143
  <div class="meta-agent-backdrop" data-ma-close="1"></div>
144
144
  <div class="meta-agent-sheet">
@@ -318,39 +318,39 @@ ${String(e||"")}`}function gl(e,t=c.sessionId){let n=Iu(e,t);!e||Ea.has(n)||(Ea.
318
318
  </div>
319
319
  </div>
320
320
  </div>
321
- </div>`}function Te(e){qt=e;let t=i("ma-mode-chat"),n=i("ma-mode-history"),s=i("ma-mode-notes"),a=i("ma-mode-report"),o=i("ma-mode-config");for(let[d,u]of[[t,"chat"],[n,"history"],[s,"notes"],[a,"report"],[o,"config"]]){if(!d)continue;let l=e===u;d.classList.toggle("hidden",!l),d.classList.toggle("flex",l)}let r=(d,u)=>{let l=i(d);l&&(l.classList.toggle("border-primary/40",u),l.classList.toggle("text-primary",u))};r("ma-btn-chat",e==="chat"),r("ma-btn-history",e==="history"),r("ma-btn-notes",e==="notes"),r("ma-btn-report",e==="report"),e==="history"&&hn(),e==="notes"&&fn()}function Ds(){let e=i("ma-session-title"),t=i("ma-resume-bar"),n=i("ma-resume-text");if(!we){e&&(e.textContent="\u65B0\u5BF9\u8BDD"),t?.classList.add("hidden");return}let s=qe?.title||we.slice(0,8),a=Ga(qe?.updatedAt);if(e&&(e.textContent=a?`${s} \xB7 ${a}`:s),t&&n){t.classList.remove("hidden");let o=qe?.messageCount;n.textContent=o?`\u5DF2\u52A0\u8F7D\u5386\u53F2 \xB7 ${o} \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 _r(e="chat"){let t=i("meta-agent-panel");if(t){if(t.classList.remove("hidden"),t.setAttribute("aria-hidden","false"),Wa=!0,Te(e),e==="chat"){Lt();let n=localStorage.getItem(Rt);!we&&n?Et(n,{silent:!0}).catch(()=>{localStorage.removeItem(Rt)}):Ds()}e==="history"&&Lt().then(()=>hn()),e==="report"&&Vl(),e==="config"&&Yl(),setTimeout(()=>{qt==="chat"&&i("ma-input")?.focus(),qt==="history"&&i("ma-history-search")?.focus()},50)}}function Kl(){let e=i("meta-agent-panel");e&&(e.classList.add("hidden"),e.setAttribute("aria-hidden","true"),Wa=!1)}function zl(){Wa?Kl():_r(qt==="config"?"chat":qt)}function ee(e,t,n={}){let s=i("ma-messages");if(!s)return null;let a=document.createElement("div");return a.className=`ma-msg ma-msg-${e}`,e==="user"?a.innerHTML=`<div class="ma-bubble user">${p(t)}</div>`:e==="assistant"?(a.innerHTML=`<div class="ma-bubble assistant md">${Yn(t)}</div>`,Xn(a)):e==="reasoning"?(a.innerHTML='<details class="ma-reasoning" open><summary>\u601D\u8003\u8FC7\u7A0B</summary><pre style="white-space:pre-wrap"></pre></details>',a.querySelector("pre").textContent=t):e==="error"?a.innerHTML=`<div class="ma-bubble error">${p(t)}</div>`:e==="system"?a.innerHTML=`<div class="ma-sys">${p(t)}</div>`:e==="tool"&&(a.innerHTML=`<details class="ma-tool" data-tool-id="${p(n.id||"")}">
321
+ </div>`}function Te(e){Rt=e;let t=i("ma-mode-chat"),n=i("ma-mode-history"),s=i("ma-mode-notes"),a=i("ma-mode-report"),o=i("ma-mode-config");for(let[d,u]of[[t,"chat"],[n,"history"],[s,"notes"],[a,"report"],[o,"config"]]){if(!d)continue;let l=e===u;d.classList.toggle("hidden",!l),d.classList.toggle("flex",l)}let r=(d,u)=>{let l=i(d);l&&(l.classList.toggle("border-primary/40",u),l.classList.toggle("text-primary",u))};r("ma-btn-chat",e==="chat"),r("ma-btn-history",e==="history"),r("ma-btn-notes",e==="notes"),r("ma-btn-report",e==="report"),e==="history"&&bn(),e==="notes"&&hn()}function _s(){let e=i("ma-session-title"),t=i("ma-resume-bar"),n=i("ma-resume-text");if(!we){e&&(e.textContent="\u65B0\u5BF9\u8BDD"),t?.classList.add("hidden");return}let s=qe?.title||we.slice(0,8),a=za(qe?.updatedAt);if(e&&(e.textContent=a?`${s} \xB7 ${a}`:s),t&&n){t.classList.remove("hidden");let o=qe?.messageCount;n.textContent=o?`\u5DF2\u52A0\u8F7D\u5386\u53F2 \xB7 ${o} \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 Pr(e="chat"){let t=i("meta-agent-panel");if(t){if(t.classList.remove("hidden"),t.setAttribute("aria-hidden","false"),Ka=!0,Te(e),e==="chat"){Et();let n=localStorage.getItem(Bt);!we&&n?It(n,{silent:!0}).catch(()=>{localStorage.removeItem(Bt)}):_s()}e==="history"&&Et().then(()=>bn()),e==="report"&&Xl(),e==="config"&&Zl(),setTimeout(()=>{Rt==="chat"&&i("ma-input")?.focus(),Rt==="history"&&i("ma-history-search")?.focus()},50)}}function Jl(){let e=i("meta-agent-panel");e&&(e.classList.add("hidden"),e.setAttribute("aria-hidden","true"),Ka=!1)}function Ql(){Ka?Jl():Pr(Rt==="config"?"chat":Rt)}function ee(e,t,n={}){let s=i("ma-messages");if(!s)return null;let a=document.createElement("div");return a.className=`ma-msg ma-msg-${e}`,e==="user"?a.innerHTML=`<div class="ma-bubble user">${p(t)}</div>`:e==="assistant"?(a.innerHTML=`<div class="ma-bubble assistant md">${Xn(t)}</div>`,Zn(a)):e==="reasoning"?(a.innerHTML='<details class="ma-reasoning" open><summary>\u601D\u8003\u8FC7\u7A0B</summary><pre style="white-space:pre-wrap"></pre></details>',a.querySelector("pre").textContent=t):e==="error"?a.innerHTML=`<div class="ma-bubble error">${p(t)}</div>`:e==="system"?a.innerHTML=`<div class="ma-sys">${p(t)}</div>`:e==="tool"&&(a.innerHTML=`<details class="ma-tool" data-tool-id="${p(n.id||"")}">
322
322
  <summary><span class="ma-tool-name">${p(n.name||"tool")}</span>
323
323
  <span class="ma-tool-phase">${p(n.phase||"")}</span></summary>
324
324
  <pre class="ma-tool-args" style="white-space:pre-wrap">${p(JSON.stringify(n.args||{},null,2))}</pre>
325
- </details>`),s.appendChild(a),s.scrollTop=s.scrollHeight,a}function Ol(e,t){let n=e?.querySelector(".ma-bubble");n&&(n.innerHTML=Yn(t),Xn(n),i("ma-messages").scrollTop=i("ma-messages").scrollHeight)}function jr(e,t,n){let s=i("ma-messages");if(!s)return;let a=s.querySelector(`[data-tool-id="${CSS.escape(e)}"]`);if(!a)return;a.classList.toggle("done",t==="done"),a.classList.toggle("error",t==="error");let o=a.querySelector(".ma-tool-phase");if(o&&(o.textContent=t),n!==void 0&&t!=="start"){let r=a.querySelector(".ma-tool-result");r||(r=document.createElement("pre"),r.className="ma-tool-result",r.style.whiteSpace="pre-wrap",a.appendChild(r)),r.textContent=JSON.stringify(n,null,2)}}function ep(e){let t=i("ma-messages");if(!t)return;let n=document.createElement("div");n.className="ma-approval",n.dataset.approvalId=e.id;let s=e.args?.command??"";n.innerHTML=`
325
+ </details>`),s.appendChild(a),s.scrollTop=s.scrollHeight,a}function Ul(e,t){let n=e?.querySelector(".ma-bubble");n&&(n.innerHTML=Xn(t),Zn(n),i("ma-messages").scrollTop=i("ma-messages").scrollHeight)}function _r(e,t,n){let s=i("ma-messages");if(!s)return;let a=s.querySelector(`[data-tool-id="${CSS.escape(e)}"]`);if(!a)return;a.classList.toggle("done",t==="done"),a.classList.toggle("error",t==="error");let o=a.querySelector(".ma-tool-phase");if(o&&(o.textContent=t),n!==void 0&&t!=="start"){let r=a.querySelector(".ma-tool-result");r||(r=document.createElement("pre"),r.className="ma-tool-result",r.style.whiteSpace="pre-wrap",a.appendChild(r)),r.textContent=JSON.stringify(n,null,2)}}function np(e){let t=i("ma-messages");if(!t)return;let n=document.createElement("div");n.className="ma-approval",n.dataset.approvalId=e.id;let s=e.args?.command??"";n.innerHTML=`
326
326
  <div class="ma-approval-label">\u26A0 Agent \u60F3\u8981\u6267\u884C\u547D\u4EE4\uFF0C\u662F\u5426\u5141\u8BB8\uFF1F</div>
327
327
  <pre class="ma-approval-cmd">${p(s)}</pre>
328
328
  <div class="ma-approval-actions">
329
329
  <button type="button" class="btn btn-xs btn-error" data-approve="0">\u62D2\u7EDD</button>
330
330
  <button type="button" class="btn btn-xs btn-success" data-approve="1">\u5141\u8BB8\u6267\u884C</button>
331
- </div>`,n.querySelectorAll("[data-approve]").forEach(a=>{a.addEventListener("click",async()=>{let o=a.dataset.approve==="1";n.querySelectorAll("button").forEach(r=>{r.disabled=!0}),n.querySelector(".ma-approval-label").textContent=o?"\u2713 \u5DF2\u5141\u8BB8\uFF0C\u6B63\u5728\u6267\u884C\u2026":"\u2717 \u5DF2\u62D2\u7EDD";try{await x("POST","/api/ai/approve",{id:e.id,approved:o})}catch(r){n.querySelector(".ma-approval-label").textContent=`\u786E\u8BA4\u5931\u8D25\uFF1A${r.message}`}})}),t.appendChild(n),t.scrollTop=t.scrollHeight}function tp(){return Rl+=1,`img${Rl}`}function np(e,t){if(!e)return;let n=e.selectionStart??e.value.length,s=e.selectionEnd??e.value.length;e.value=e.value.slice(0,n)+t+e.value.slice(s),e.selectionStart=e.selectionEnd=n+t.length,e.dispatchEvent(new Event("input"))}async function Bl(e,t){let n=ct({"x-filename":t||`paste-${Date.now()}.png`},{hub:!0});delete n["Content-Type"];let s=await fetch("/api/upload-image",{method:"POST",headers:n,body:e});if(!s.ok){let l=await s.json().catch(()=>({}));throw new Error(l.error||`Upload failed: ${s.status}`)}let{path:a}=await s.json();if(!a)throw new Error("upload returned no path");let o=tp(),r=`[${o}](${a})`,d=i("ma-input");np(d,(d?.value&&!d.value.endsWith(`
331
+ </div>`,n.querySelectorAll("[data-approve]").forEach(a=>{a.addEventListener("click",async()=>{let o=a.dataset.approve==="1";n.querySelectorAll("button").forEach(r=>{r.disabled=!0}),n.querySelector(".ma-approval-label").textContent=o?"\u2713 \u5DF2\u5141\u8BB8\uFF0C\u6B63\u5728\u6267\u884C\u2026":"\u2717 \u5DF2\u62D2\u7EDD";try{await x("POST","/api/ai/approve",{id:e.id,approved:o})}catch(r){n.querySelector(".ma-approval-label").textContent=`\u786E\u8BA4\u5931\u8D25\uFF1A${r.message}`}})}),t.appendChild(n),t.scrollTop=t.scrollHeight}function sp(){return Ol+=1,`img${Ol}`}function ap(e,t){if(!e)return;let n=e.selectionStart??e.value.length,s=e.selectionEnd??e.value.length;e.value=e.value.slice(0,n)+t+e.value.slice(s),e.selectionStart=e.selectionEnd=n+t.length,e.dispatchEvent(new Event("input"))}async function Fl(e,t){let n=ct({"x-filename":t||`paste-${Date.now()}.png`},{hub:!0});delete n["Content-Type"];let s=await fetch("/api/upload-image",{method:"POST",headers:n,body:e});if(!s.ok){let l=await s.json().catch(()=>({}));throw new Error(l.error||`Upload failed: ${s.status}`)}let{path:a}=await s.json();if(!a)throw new Error("upload returned no path");let o=sp(),r=`[${o}](${a})`,d=i("ma-input");ap(d,(d?.value&&!d.value.endsWith(`
332
332
  `)&&d.value.length?`
333
333
  `:"")+r+`
334
- `);let u="";try{u=URL.createObjectURL(e)}catch{}return pn.push({path:a,previewUrl:u,label:o,ref:r}),Nr(),{path:a,ref:r,label:o}}function Nr(){let e=i("ma-attach-bar");if(e){if(!pn.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=pn.map((t,n)=>`
334
+ `);let u="";try{u=URL.createObjectURL(e)}catch{}return mn.push({path:a,previewUrl:u,label:o,ref:r}),Hr(),{path:a,ref:r,label:o}}function Hr(){let e=i("ma-attach-bar");if(e){if(!mn.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=mn.map((t,n)=>`
335
335
  <div class="ma-thumb relative" title="${p(t.ref||t.path)}">
336
336
  ${t.previewUrl?`<img src="${t.previewUrl}" alt="${p(t.label||"img")}">`:`<span class="ma-thumb-path">${p(t.label||"img")}</span>`}
337
337
  <span class="ma-thumb-label">${p(t.label||"")}</span>
338
338
  <button type="button" class="ma-thumb-x" data-rm-img="${n}">\u2715</button>
339
- </div>`).join(""),e.querySelectorAll("[data-rm-img]").forEach(t=>{t.addEventListener("click",()=>{let n=parseInt(t.dataset.rmImg,10),s=pn[n];if(s?.previewUrl)try{URL.revokeObjectURL(s.previewUrl)}catch{}let a=i("ma-input");a&&s?.ref&&(a.value=a.value.split(s.ref).join("").replace(/\n{3,}/g,`
339
+ </div>`).join(""),e.querySelectorAll("[data-rm-img]").forEach(t=>{t.addEventListener("click",()=>{let n=parseInt(t.dataset.rmImg,10),s=mn[n];if(s?.previewUrl)try{URL.revokeObjectURL(s.previewUrl)}catch{}let a=i("ma-input");a&&s?.ref&&(a.value=a.value.split(s.ref).join("").replace(/\n{3,}/g,`
340
340
 
341
- `),a.dispatchEvent(new Event("input"))),pn.splice(n,1),Nr()})})}}function Ga(e){if(!e)return"";let t=new Date(e);if(Number.isNaN(t.getTime()))return"";let n=String(t.getMonth()+1).padStart(2,"0"),s=String(t.getDate()).padStart(2,"0"),a=String(t.getHours()).padStart(2,"0"),o=String(t.getMinutes()).padStart(2,"0");return`${n}-${s} ${a}:${o}`}async function Lt(){try{Ua=(await x("GET","/api/ai/sessions")).sessions||[]}catch{Ua=[]}return Ua}function Jl(){let e=E.peek(),t=c.sessionId?`${c.agent||$.peek()||"claude"}:${c.sessionId.slice(0,8)}`:"";return{project:e?.path||"",sessionId:c.sessionId||"",agent:c.agent||$.peek()||"claude",summary:[e?.name?`\u9879\u76EE ${e.name}`:"",t?`\u4F1A\u8BDD ${t}`:""].filter(Boolean).join(" \xB7 ")}}function js(){mn=null,Gl=null,i("ma-note-title").value="",i("ma-note-content").value="",i("ma-note-pin").checked=!1,i("ma-note-link-project").checked=!!E.peek()?.path,i("ma-note-link-session").checked=!!c.sessionId,i("ma-note-status").textContent="\u65B0\u8BB0\u4E8B",i("ma-note-delete").disabled=!0,i("ma-note-links").textContent=Jl().summary||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function Ql(e){mn=e?.id||null,Gl=e||null,i("ma-note-title").value=e?.title||"",i("ma-note-content").value=e?.content||"",i("ma-note-pin").checked=!!e?.pinned,i("ma-note-link-project").checked=!!e?.cwd,i("ma-note-link-session").checked=!!e?.sessionId,i("ma-note-status").textContent=e?.updatedAt?`\u4E0A\u6B21\u66F4\u65B0 ${Ga(e.updatedAt)}`:"",i("ma-note-delete").disabled=!e?.id;let t=[];e?.cwd&&t.push(`\u9879\u76EE ${e.cwd.split("/").pop()}`),e?.sessionId&&t.push(`\u4F1A\u8BDD ${e.agent||"claude"}:${e.sessionId.slice(0,8)}`),i("ma-note-links").textContent=t.join(" \xB7 ")||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function sp(){let e=i("ma-note-title")?.value?.trim()||"",t=i("ma-note-content")?.value?.trim()||"";if(!e&&!t){i("ma-note-status").textContent="\u5148\u9009\u4E00\u6761\u8BB0\u4E8B\u6216\u8F93\u5165\u5185\u5BB9";return}let n=[];i("ma-note-link-project")?.checked&&E.peek()?.path&&n.push(`\u9879\u76EE\u8DEF\u5F84\uFF1A${E.peek().path}`),i("ma-note-link-session")?.checked&&c.sessionId&&n.push(`\u5173\u8054\u4F1A\u8BDD\uFF1A${c.agent||$.peek()||"claude"} / ${c.sessionId}`);let s=["\u57FA\u4E8E\u4E0B\u9762\u8FD9\u6761\u5DE5\u4F5C\u8BB0\u4E8B\u56DE\u7B54\uFF0C\u5E76\u7ED3\u5408\u76F8\u5173\u4F1A\u8BDD\u4E0E\u9879\u76EE\u4E0A\u4E0B\u6587\uFF1A",`\u6807\u9898\uFF1A${e||"\u672A\u547D\u540D"}`,t?`\u5185\u5BB9\uFF1A
341
+ `),a.dispatchEvent(new Event("input"))),mn.splice(n,1),Hr()})})}}function za(e){if(!e)return"";let t=new Date(e);if(Number.isNaN(t.getTime()))return"";let n=String(t.getMonth()+1).padStart(2,"0"),s=String(t.getDate()).padStart(2,"0"),a=String(t.getHours()).padStart(2,"0"),o=String(t.getMinutes()).padStart(2,"0");return`${n}-${s} ${a}:${o}`}async function Et(){try{Wa=(await x("GET","/api/ai/sessions")).sessions||[]}catch{Wa=[]}return Wa}function Vl(){let e=E.peek(),t=c.sessionId?`${c.agent||$.peek()||"claude"}:${c.sessionId.slice(0,8)}`:"";return{project:e?.path||"",sessionId:c.sessionId||"",agent:c.agent||$.peek()||"claude",summary:[e?.name?`\u9879\u76EE ${e.name}`:"",t?`\u4F1A\u8BDD ${t}`:""].filter(Boolean).join(" \xB7 ")}}function Ds(){gn=null,zl=null,i("ma-note-title").value="",i("ma-note-content").value="",i("ma-note-pin").checked=!1,i("ma-note-link-project").checked=!!E.peek()?.path,i("ma-note-link-session").checked=!!c.sessionId,i("ma-note-status").textContent="\u65B0\u8BB0\u4E8B",i("ma-note-delete").disabled=!0,i("ma-note-links").textContent=Vl().summary||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function Yl(e){gn=e?.id||null,zl=e||null,i("ma-note-title").value=e?.title||"",i("ma-note-content").value=e?.content||"",i("ma-note-pin").checked=!!e?.pinned,i("ma-note-link-project").checked=!!e?.cwd,i("ma-note-link-session").checked=!!e?.sessionId,i("ma-note-status").textContent=e?.updatedAt?`\u4E0A\u6B21\u66F4\u65B0 ${za(e.updatedAt)}`:"",i("ma-note-delete").disabled=!e?.id;let t=[];e?.cwd&&t.push(`\u9879\u76EE ${e.cwd.split("/").pop()}`),e?.sessionId&&t.push(`\u4F1A\u8BDD ${e.agent||"claude"}:${e.sessionId.slice(0,8)}`),i("ma-note-links").textContent=t.join(" \xB7 ")||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function op(){let e=i("ma-note-title")?.value?.trim()||"",t=i("ma-note-content")?.value?.trim()||"";if(!e&&!t){i("ma-note-status").textContent="\u5148\u9009\u4E00\u6761\u8BB0\u4E8B\u6216\u8F93\u5165\u5185\u5BB9";return}let n=[];i("ma-note-link-project")?.checked&&E.peek()?.path&&n.push(`\u9879\u76EE\u8DEF\u5F84\uFF1A${E.peek().path}`),i("ma-note-link-session")?.checked&&c.sessionId&&n.push(`\u5173\u8054\u4F1A\u8BDD\uFF1A${c.agent||$.peek()||"claude"} / ${c.sessionId}`);let s=["\u57FA\u4E8E\u4E0B\u9762\u8FD9\u6761\u5DE5\u4F5C\u8BB0\u4E8B\u56DE\u7B54\uFF0C\u5E76\u7ED3\u5408\u76F8\u5173\u4F1A\u8BDD\u4E0E\u9879\u76EE\u4E0A\u4E0B\u6587\uFF1A",`\u6807\u9898\uFF1A${e||"\u672A\u547D\u540D"}`,t?`\u5185\u5BB9\uFF1A
342
342
  ${t}`:"",n.length?n.join(`
343
343
  `):"","","\u8BF7\u5148\u603B\u7ED3\u8FD9\u6761\u8BB0\u4E8B\u7684\u6838\u5FC3\uFF0C\u518D\u7ED9\u51FA\u4E0B\u4E00\u6B65\u5EFA\u8BAE\u548C\u53EF\u80FD\u98CE\u9669\u3002"].filter(Boolean).join(`
344
- `);Te("chat"),i("ma-input").value=s,i("ma-input").dispatchEvent(new Event("input")),i("ma-input").focus()}async function Vn(){let e=(Wl||"").trim();return Fa=(await x("GET",`/api/ai/notes?limit=80${e?`&q=${encodeURIComponent(e)}`:""}`)).notes||[],Fa}function fn(){let e=i("ma-notes-list");if(e){if(!Fa.length){e.innerHTML='<div class="text-center text-xs text-base-content/40 py-10">\u8FD8\u6CA1\u6709\u8BB0\u4E8B\u3002</div>';return}e.innerHTML=Fa.map(t=>{let n=t.id===mn,s=[t.scope==="project"?"\u9879\u76EE":t.scope==="session"?"\u4F1A\u8BDD":"\u901A\u7528",t.pinned?"\u7F6E\u9876":""].filter(Boolean).join(" \xB7 ");return`
344
+ `);Te("chat"),i("ma-input").value=s,i("ma-input").dispatchEvent(new Event("input")),i("ma-input").focus()}async function Yn(){let e=(Kl||"").trim();return Ga=(await x("GET",`/api/ai/notes?limit=80${e?`&q=${encodeURIComponent(e)}`:""}`)).notes||[],Ga}function hn(){let e=i("ma-notes-list");if(e){if(!Ga.length){e.innerHTML='<div class="text-center text-xs text-base-content/40 py-10">\u8FD8\u6CA1\u6709\u8BB0\u4E8B\u3002</div>';return}e.innerHTML=Ga.map(t=>{let n=t.id===gn,s=[t.scope==="project"?"\u9879\u76EE":t.scope==="session"?"\u4F1A\u8BDD":"\u901A\u7528",t.pinned?"\u7F6E\u9876":""].filter(Boolean).join(" \xB7 ");return`
345
345
  <button type="button" class="ma-note-item ${n?"active":""}" data-note-id="${p(t.id)}">
346
346
  <div class="text-left">
347
347
  <div class="font-medium text-xs truncate">${p(t.title||"\u672A\u547D\u540D")}</div>
348
348
  <div class="text-[10px] text-base-content/45 mt-0.5 line-clamp-2">${p(t.content||"")}</div>
349
- <div class="text-[10px] text-base-content/35 mt-1">${p(s)}${s?" \xB7 ":""}${p(Ga(t.updatedAt)||"")}</div>
349
+ <div class="text-[10px] text-base-content/35 mt-1">${p(s)}${s?" \xB7 ":""}${p(za(t.updatedAt)||"")}</div>
350
350
  </div>
351
- </button>`}).join(""),e.querySelectorAll("[data-note-id]").forEach(t=>{t.addEventListener("click",async()=>{try{let n=await x("GET",`/api/ai/notes/${t.dataset.noteId}`);Ql(n),fn()}catch(n){i("ma-note-status").textContent=n.message}})})}}async function ap(){let e=i("ma-note-title")?.value?.trim()||"",t=i("ma-note-content")?.value?.trim()||"";if(!e||!t){i("ma-note-status").textContent="\u6807\u9898\u548C\u5185\u5BB9\u90FD\u4E0D\u80FD\u4E3A\u7A7A";return}let n=Jl(),s={id:mn||void 0,title:e,content:t,pinned:!!i("ma-note-pin")?.checked,cwd:i("ma-note-link-project")?.checked?n.project:"",sessionId:i("ma-note-link-session")?.checked?n.sessionId:"",agent:i("ma-note-link-session")?.checked?n.agent:""};i("ma-note-status").textContent="\u4FDD\u5B58\u4E2D\u2026";let a=await x("POST","/api/ai/notes",s);Ql(a),await Vn(),fn()}async function op(){if(!mn){js();return}confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u4E8B\uFF1F\u4E0D\u53EF\u6062\u590D\u3002")&&(await x("DELETE",`/api/ai/notes/${mn}`),js(),await Vn(),fn())}function hn(){let e=i("ma-history-list");if(!e)return;let t=(Fl||"").trim().toLowerCase(),n=Ua;if(t&&(n=n.filter(s=>`${s.title||""} ${s.preview||""} ${s.id||""}`.toLowerCase().includes(t))),!n.length){e.innerHTML=`<div class="text-center text-xs text-base-content/40 py-10">
351
+ </button>`}).join(""),e.querySelectorAll("[data-note-id]").forEach(t=>{t.addEventListener("click",async()=>{try{let n=await x("GET",`/api/ai/notes/${t.dataset.noteId}`);Yl(n),hn()}catch(n){i("ma-note-status").textContent=n.message}})})}}async function rp(){let e=i("ma-note-title")?.value?.trim()||"",t=i("ma-note-content")?.value?.trim()||"";if(!e||!t){i("ma-note-status").textContent="\u6807\u9898\u548C\u5185\u5BB9\u90FD\u4E0D\u80FD\u4E3A\u7A7A";return}let n=Vl(),s={id:gn||void 0,title:e,content:t,pinned:!!i("ma-note-pin")?.checked,cwd:i("ma-note-link-project")?.checked?n.project:"",sessionId:i("ma-note-link-session")?.checked?n.sessionId:"",agent:i("ma-note-link-session")?.checked?n.agent:""};i("ma-note-status").textContent="\u4FDD\u5B58\u4E2D\u2026";let a=await x("POST","/api/ai/notes",s);Yl(a),await Yn(),hn()}async function ip(){if(!gn){Ds();return}confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u4E8B\uFF1F\u4E0D\u53EF\u6062\u590D\u3002")&&(await x("DELETE",`/api/ai/notes/${gn}`),Ds(),await Yn(),hn())}function bn(){let e=i("ma-history-list");if(!e)return;let t=(Gl||"").trim().toLowerCase(),n=Wa;if(t&&(n=n.filter(s=>`${s.title||""} ${s.preview||""} ${s.id||""}`.toLowerCase().includes(t))),!n.length){e.innerHTML=`<div class="text-center text-xs text-base-content/40 py-10">
352
352
  ${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"}
353
- </div>`;return}e.innerHTML=n.map(s=>{let a=s.id===we,o=Ga(s.updatedAt)||"",r=s.messageCount||0;return`
353
+ </div>`;return}e.innerHTML=n.map(s=>{let a=s.id===we,o=za(s.updatedAt)||"",r=s.messageCount||0;return`
354
354
  <div class="ma-hist-item ${a?"active":""}" data-hist-id="${p(s.id)}">
355
355
  <div class="flex items-start gap-2">
356
356
  <button type="button" class="ma-hist-open flex-1 min-w-0 text-left" data-hist-open="${p(s.id)}">
@@ -363,61 +363,61 @@ ${t}`:"",n.length?n.join(`
363
363
  <button type="button" class="btn btn-ghost btn-xs px-1 text-error" data-hist-del="${p(s.id)}" title="\u5220\u9664">\u2715</button>
364
364
  </div>
365
365
  </div>
366
- </div>`}).join(""),e.querySelectorAll("[data-hist-open]").forEach(s=>{s.addEventListener("click",async()=>{await Et(s.dataset.histOpen),Te("chat"),i("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-resume]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation(),await Et(s.dataset.histResume),Te("chat"),i("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-del]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation();let o=s.dataset.histDel;if(confirm("\u5220\u9664\u8BE5\u5386\u53F2\u4F1A\u8BDD\uFF1F\u4E0D\u53EF\u6062\u590D\u3002"))try{await x("DELETE",`/api/ai/sessions/${o}`),we===o&&(we=null,qe=null,localStorage.removeItem(Rt),Et(null)),await Lt(),hn()}catch(r){alert(r.message)}})})}function Ul(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(`
367
- `)||"[\u2026]"}function rp(e){let t=i("ma-messages");if(t){if(t.innerHTML="",!e?.length){ee("system","\u6B64\u4F1A\u8BDD\u6682\u65E0\u6D88\u606F\u3002");return}for(let n of e){if(n.role==="user"){ee("user",Ul(n.content));continue}if(n.role==="assistant"){if(n.reasoning&&(ee("reasoning",n.reasoning).querySelector("details").open=!1),n.content&&ee("assistant",typeof n.content=="string"?n.content:Ul(n.content)),n.tool_calls?.length)for(let s of n.tool_calls){let a=s.function?.name||s.name||"tool",o={};try{o=JSON.parse(s.function?.arguments||s.arguments||"{}")}catch{}ee("tool","",{name:a,args:o,phase:"history",id:s.id||a})}continue}if(n.role==="tool"){let s=n.content;try{s=JSON.parse(n.content)}catch{}let a=n.tool_call_id||"";if(a)jr(a,typeof s=="string"&&s.startsWith("error:")?"error":"done",s);else{ee("tool","",{name:"tool_result",args:{},phase:"done",id:`tr_${Math.random().toString(36).slice(2,8)}`});let o=t.querySelectorAll(".ma-tool"),r=o[o.length-1];if(r){r.classList.add("done");let d=r.querySelector(".ma-tool-result");d||(d=document.createElement("pre"),d.className="ma-tool-result",d.style.whiteSpace="pre-wrap",r.appendChild(d)),d.textContent=typeof s=="string"?s.slice(0,500):JSON.stringify(s,null,2)}}}}t.scrollTop=t.scrollHeight}}async function ip(){if(!we){await Et(null);return}if(confirm("\u5220\u9664\u5F53\u524D Meta Agent \u4F1A\u8BDD\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"))try{await x("DELETE",`/api/ai/sessions/${we}`),we=null,qe=null,localStorage.removeItem(Rt),await Lt(),await Et(null),qt==="history"&&hn()}catch(e){ee("error",e.message)}}async function Et(e,t={}){if(!e){we=null,qe=null,localStorage.removeItem(Rt);let n=i("ma-messages");return n&&(n.innerHTML=""),ee("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"),Ds(),null}try{let n=await x("GET",`/api/ai/sessions/${e}`);return we=n.id,qe={id:n.id,title:n.title,updatedAt:n.updatedAt,messageCount:(n.messages||[]).length},localStorage.setItem(Rt,n.id),rp(n.messages||[]),t.silent||ee("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"),Ds(),qt==="history"&&hn(),n}catch(n){throw t.silent||ee("error",n.message),n}}async function Ba(){if(Qn)return;let e=i("ma-input"),t=(e?.value||"").trim();if(!t)return;Qn=!0,i("ma-send").disabled=!0,ee("user",t),e.value="",e.style.height="";for(let o of pn)if(o.previewUrl)try{URL.revokeObjectURL(o.previewUrl)}catch{}pn=[],Nr();let n=null,s="",a=null;try{await Dr("/api/ai/chat",{message:t,sessionId:we},{session:o=>{we=o.id,qe={...qe||{},id:o.id,title:o.title||qe?.title||t.slice(0,40),updatedAt:Date.now()},localStorage.setItem(Rt,o.id),Ds()},round_start:()=>{n=null,a&&(a.querySelector("details").open=!1),a=null},reasoning:o=>{a||(a=ee("reasoning","")),a.querySelector("pre").textContent=o.content||""},tool_call:o=>{ee("tool","",{name:o.name,args:o.args,phase:"\u6267\u884C\u4E2D",id:o.callId})},tool_result:o=>jr(o.callId,o.ok===!1?"error":"done",o.ok===!1?o.error:o.result),content:o=>{s=o.content||"",n||(n=ee("assistant","")),Ol(n,s)},tool:o=>{o.phase==="start"?ee("tool","",{name:o.name,args:o.args,phase:"start",id:o.id}):jr(o.id,o.phase,o.result)},approval:o=>ep(o),done:o=>{o.sessionId&&(we=o.sessionId,localStorage.setItem(Rt,o.sessionId)),(o.title||o.sessionId)&&(qe={id:we,title:o.title||qe?.title||"\u5BF9\u8BDD",updatedAt:Date.now(),messageCount:(qe?.messageCount||0)+2}),o.content&&(n||(n=ee("assistant","")),Ol(n,o.content)),a&&(a.querySelector("details").open=!1),Ds(),Lt()},error:o=>{ee("error",o.message||"error")}})}catch(o){ee("error",o.message)}finally{Qn=!1,i("ma-send").disabled=!1}}async function lp(){if(Qn)return;Qn=!0;let e=parseInt(i("ma-report-days")?.value||"1",10),t=i("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>`,i("ma-gen-report").disabled=!0;let n="",s=document.createElement("div");s.className="ma-report-tools flex flex-col gap-1 mb-3";try{await Dr("/api/ai/report",{days:e},{content:a=>{n=a.content||"",t.innerHTML="",t.appendChild(s);let o=document.createElement("div");o.className="md ma-report-md",o.innerHTML=Yn(n),Xn(o),t.appendChild(o)},tool:a=>{if(a.phase==="start"){let o=document.createElement("div");o.className="ma-tool",o.dataset.toolId=a.id||a.name,o.innerHTML=`<span class="ma-tool-name">${p(a.name)}</span> <span class="ma-tool-phase">start</span>`,s.appendChild(o)}else{let o=s.querySelector(`[data-tool-id="${CSS.escape(a.id||a.name)}"]`);o&&(o.classList.add(a.phase==="error"?"error":"done"),o.querySelector(".ma-tool-phase").textContent=a.phase)}},done:a=>{if(a.content){t.innerHTML="",t.appendChild(s);let o=document.createElement("div");o.className="md ma-report-md",o.innerHTML=Yn(a.content),Xn(o),t.appendChild(o)}},error:a=>{t.innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}})}catch(a){t.innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}finally{Qn=!1,i("ma-gen-report").disabled=!1}}async function Vl(){try{let e=new Date,t=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,n=await x("GET",`/api/ai/reports/${t}`);if(n?.markdown){let s=i("ma-report-body");s.innerHTML=`
366
+ </div>`}).join(""),e.querySelectorAll("[data-hist-open]").forEach(s=>{s.addEventListener("click",async()=>{await It(s.dataset.histOpen),Te("chat"),i("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-resume]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation(),await It(s.dataset.histResume),Te("chat"),i("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-del]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation();let o=s.dataset.histDel;if(confirm("\u5220\u9664\u8BE5\u5386\u53F2\u4F1A\u8BDD\uFF1F\u4E0D\u53EF\u6062\u590D\u3002"))try{await x("DELETE",`/api/ai/sessions/${o}`),we===o&&(we=null,qe=null,localStorage.removeItem(Bt),It(null)),await Et(),bn()}catch(r){alert(r.message)}})})}function Wl(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(`
367
+ `)||"[\u2026]"}function lp(e){let t=i("ma-messages");if(t){if(t.innerHTML="",!e?.length){ee("system","\u6B64\u4F1A\u8BDD\u6682\u65E0\u6D88\u606F\u3002");return}for(let n of e){if(n.role==="user"){ee("user",Wl(n.content));continue}if(n.role==="assistant"){if(n.reasoning&&(ee("reasoning",n.reasoning).querySelector("details").open=!1),n.content&&ee("assistant",typeof n.content=="string"?n.content:Wl(n.content)),n.tool_calls?.length)for(let s of n.tool_calls){let a=s.function?.name||s.name||"tool",o={};try{o=JSON.parse(s.function?.arguments||s.arguments||"{}")}catch{}ee("tool","",{name:a,args:o,phase:"history",id:s.id||a})}continue}if(n.role==="tool"){let s=n.content;try{s=JSON.parse(n.content)}catch{}let a=n.tool_call_id||"";if(a)_r(a,typeof s=="string"&&s.startsWith("error:")?"error":"done",s);else{ee("tool","",{name:"tool_result",args:{},phase:"done",id:`tr_${Math.random().toString(36).slice(2,8)}`});let o=t.querySelectorAll(".ma-tool"),r=o[o.length-1];if(r){r.classList.add("done");let d=r.querySelector(".ma-tool-result");d||(d=document.createElement("pre"),d.className="ma-tool-result",d.style.whiteSpace="pre-wrap",r.appendChild(d)),d.textContent=typeof s=="string"?s.slice(0,500):JSON.stringify(s,null,2)}}}}t.scrollTop=t.scrollHeight}}async function cp(){if(!we){await It(null);return}if(confirm("\u5220\u9664\u5F53\u524D Meta Agent \u4F1A\u8BDD\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"))try{await x("DELETE",`/api/ai/sessions/${we}`),we=null,qe=null,localStorage.removeItem(Bt),await Et(),await It(null),Rt==="history"&&bn()}catch(e){ee("error",e.message)}}async function It(e,t={}){if(!e){we=null,qe=null,localStorage.removeItem(Bt);let n=i("ma-messages");return n&&(n.innerHTML=""),ee("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"),_s(),null}try{let n=await x("GET",`/api/ai/sessions/${e}`);return we=n.id,qe={id:n.id,title:n.title,updatedAt:n.updatedAt,messageCount:(n.messages||[]).length},localStorage.setItem(Bt,n.id),lp(n.messages||[]),t.silent||ee("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"),_s(),Rt==="history"&&bn(),n}catch(n){throw t.silent||ee("error",n.message),n}}async function Fa(){if(Vn)return;let e=i("ma-input"),t=(e?.value||"").trim();if(!t)return;Vn=!0,i("ma-send").disabled=!0,ee("user",t),e.value="",e.style.height="";for(let o of mn)if(o.previewUrl)try{URL.revokeObjectURL(o.previewUrl)}catch{}mn=[],Hr();let n=null,s="",a=null;try{await Nr("/api/ai/chat",{message:t,sessionId:we},{session:o=>{we=o.id,qe={...qe||{},id:o.id,title:o.title||qe?.title||t.slice(0,40),updatedAt:Date.now()},localStorage.setItem(Bt,o.id),_s()},round_start:()=>{n=null,a&&(a.querySelector("details").open=!1),a=null},reasoning:o=>{a||(a=ee("reasoning","")),a.querySelector("pre").textContent=o.content||""},tool_call:o=>{ee("tool","",{name:o.name,args:o.args,phase:"\u6267\u884C\u4E2D",id:o.callId})},tool_result:o=>_r(o.callId,o.ok===!1?"error":"done",o.ok===!1?o.error:o.result),content:o=>{s=o.content||"",n||(n=ee("assistant","")),Ul(n,s)},tool:o=>{o.phase==="start"?ee("tool","",{name:o.name,args:o.args,phase:"start",id:o.id}):_r(o.id,o.phase,o.result)},approval:o=>np(o),done:o=>{o.sessionId&&(we=o.sessionId,localStorage.setItem(Bt,o.sessionId)),(o.title||o.sessionId)&&(qe={id:we,title:o.title||qe?.title||"\u5BF9\u8BDD",updatedAt:Date.now(),messageCount:(qe?.messageCount||0)+2}),o.content&&(n||(n=ee("assistant","")),Ul(n,o.content)),a&&(a.querySelector("details").open=!1),_s(),Et()},error:o=>{ee("error",o.message||"error")}})}catch(o){ee("error",o.message)}finally{Vn=!1,i("ma-send").disabled=!1}}async function dp(){if(Vn)return;Vn=!0;let e=parseInt(i("ma-report-days")?.value||"1",10),t=i("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>`,i("ma-gen-report").disabled=!0;let n="",s=document.createElement("div");s.className="ma-report-tools flex flex-col gap-1 mb-3";try{await Nr("/api/ai/report",{days:e},{content:a=>{n=a.content||"",t.innerHTML="",t.appendChild(s);let o=document.createElement("div");o.className="md ma-report-md",o.innerHTML=Xn(n),Zn(o),t.appendChild(o)},tool:a=>{if(a.phase==="start"){let o=document.createElement("div");o.className="ma-tool",o.dataset.toolId=a.id||a.name,o.innerHTML=`<span class="ma-tool-name">${p(a.name)}</span> <span class="ma-tool-phase">start</span>`,s.appendChild(o)}else{let o=s.querySelector(`[data-tool-id="${CSS.escape(a.id||a.name)}"]`);o&&(o.classList.add(a.phase==="error"?"error":"done"),o.querySelector(".ma-tool-phase").textContent=a.phase)}},done:a=>{if(a.content){t.innerHTML="",t.appendChild(s);let o=document.createElement("div");o.className="md ma-report-md",o.innerHTML=Xn(a.content),Zn(o),t.appendChild(o)}},error:a=>{t.innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}})}catch(a){t.innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}finally{Vn=!1,i("ma-gen-report").disabled=!1}}async function Xl(){try{let e=new Date,t=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,n=await x("GET",`/api/ai/reports/${t}`);if(n?.markdown){let s=i("ma-report-body");s.innerHTML=`
368
368
  <div class="text-[10px] text-base-content/40 mb-2">${p(n.title||t)} \xB7 ${p(n.generatedAt||"")}</div>
369
- <div class="md ma-report-md">${Yn(n.markdown)}</div>`,Xn(s)}}catch{}}async function cp(){let e=i("ma-report-list");try{let t=await x("GET","/api/ai/reports");e.classList.remove("hidden");let n=t.reports||[];if(!n.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=n.map(s=>`
369
+ <div class="md ma-report-md">${Xn(n.markdown)}</div>`,Zn(s)}}catch{}}async function up(){let e=i("ma-report-list");try{let t=await x("GET","/api/ai/reports");e.classList.remove("hidden");let n=t.reports||[];if(!n.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=n.map(s=>`
370
370
  <button type="button" class="ma-report-item w-full text-left px-2 py-1 rounded hover:bg-base-200 text-xs"
371
371
  data-day="${p(s.day)}">
372
372
  <span class="font-semibold">${p(s.day)}</span>
373
373
  <span class="text-base-content/45 ml-1">${p(s.title||"")}</span>
374
374
  </button>`).join(""),e.querySelectorAll("[data-day]").forEach(s=>{s.addEventListener("click",async()=>{try{let a=await x("GET",`/api/ai/reports/${s.dataset.day}`),o=i("ma-report-body");o.innerHTML=`
375
375
  <div class="text-[10px] text-base-content/40 mb-2">${p(a.title||a.day)} \xB7 ${p(a.generatedAt||"")}</div>
376
- <div class="md ma-report-md">${Yn(a.markdown)}</div>`,Xn(o)}catch(a){i("ma-report-body").innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}})})}catch(t){e.classList.remove("hidden"),e.innerHTML=`<div class="text-xs text-error px-2">${p(t.message)}</div>`}}async function Yl(){try{let e=await x("GET","/api/ai/config");i("ma-cfg-url").value=e.url||"",i("ma-cfg-model").value=e.model||"",i("ma-cfg-key").placeholder=e.hasKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"API Key",i("ma-cfg-key").value="",i("ma-cfg-vlm-url").value=e.vlm_url||"",i("ma-cfg-vlm-model").value=e.vlm_model||"",i("ma-cfg-vlm-key").value="",i("ma-cfg-vlm-key").placeholder=e.hasVlmKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"\u53EF\u9009",i("ma-cfg-system").value=e.system||"",i("ma-auto-report")&&(i("ma-auto-report").checked=!!e.auto_report),i("ma-auto-hour")&&(i("ma-auto-hour").value=String(e.auto_report_hour??18)),_s(e)}catch(e){i("ma-cfg-status").textContent=e.message}}async function dp(){let e=i("ma-cfg-status");e.textContent="\u4FDD\u5B58\u4E2D\u2026";try{let t={url:i("ma-cfg-url").value.trim(),model:i("ma-cfg-model").value.trim(),vlm_url:i("ma-cfg-vlm-url").value.trim(),vlm_model:i("ma-cfg-vlm-model").value.trim(),system:i("ma-cfg-system").value,auto_report:!!i("ma-auto-report")?.checked,auto_report_hour:parseInt(i("ma-auto-hour")?.value||"18",10)},n=i("ma-cfg-key").value.trim(),s=i("ma-cfg-vlm-key").value.trim();n&&(t.key=n),s&&(t.vlm_key=s);let a=await x("PUT","/api/ai/config",t);e.textContent=a.hasKey?"\u5DF2\u4FDD\u5B58 \u2713":"\u5DF2\u4FDD\u5B58\uFF08\u672A\u8BBE\u7F6E Key\uFF09",i("ma-cfg-key").value="",i("ma-cfg-vlm-key").value="",_s(a)}catch(t){e.textContent=t.message}}function _s(e){if(Oa&&(clearInterval(Oa),Oa=null),!e?.auto_report)return;let t=e.auto_report_hour??18;Oa=setInterval(async()=>{if(!c.token)return;let n=new Date;if(n.getHours()!==t)return;let s=`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`;if(Ar!==s&&!(n.getMinutes()>10))try{Ar=s,localStorage.setItem("ai_last_auto_report",s),await Dr("/api/ai/report",{days:e.auto_report_days||1},{done:()=>{console.info("[meta-agent] auto report saved for",s)},error:a=>console.warn("[meta-agent] auto report",a.message)})}catch(a){console.warn("[meta-agent] auto report failed",a),Ar="",localStorage.removeItem("ai_last_auto_report")}},60*1e3)}function Xl(){i("meta-agent-panel")||(document.getElementById("root")?.insertAdjacentHTML("beforeend",Zu()),document.querySelectorAll("[data-ma-close]").forEach(e=>{e.addEventListener("click",Kl)}),i("ma-btn-chat")?.addEventListener("click",()=>Te("chat")),i("ma-btn-history")?.addEventListener("click",async()=>{await Lt(),Te("history")}),i("ma-btn-notes")?.addEventListener("click",async()=>{await Vn(),mn||js(),Te("notes")}),i("ma-open-history")?.addEventListener("click",async()=>{await Lt(),Te("history")}),i("ma-btn-report")?.addEventListener("click",()=>{Te("report"),Vl()}),i("ma-btn-config")?.addEventListener("click",()=>{Te("config"),Yl()}),i("ma-send")?.addEventListener("click",Ba),i("ma-input")?.addEventListener("keydown",e=>{(e.metaKey||e.ctrlKey)&&e.key==="Enter"&&(e.preventDefault(),Ba())}),i("ma-input")?.addEventListener("input",()=>{let e=i("ma-input");e.style.height="auto",e.style.height=Math.min(e.scrollHeight,120)+"px"}),i("ma-new-chat")?.addEventListener("click",()=>{Et(null),Te("chat")}),i("ma-del-session")?.addEventListener("click",ip),i("ma-resume-focus")?.addEventListener("click",()=>{i("ma-input")?.focus()}),i("ma-history-refresh")?.addEventListener("click",async()=>{await Lt(),hn()}),i("ma-history-new")?.addEventListener("click",()=>{Et(null),Te("chat")}),i("ma-history-search")?.addEventListener("input",e=>{Fl=e.target.value||"",hn()}),i("ma-quick-today")?.addEventListener("click",()=>{Te("chat"),i("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",Ba()}),i("ma-quick-projects")?.addEventListener("click",()=>{Te("chat"),i("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",Ba()}),i("ma-gen-report")?.addEventListener("click",lp),i("ma-load-reports")?.addEventListener("click",cp),i("ma-notes-refresh")?.addEventListener("click",async()=>{await Vn(),fn()}),i("ma-notes-new")?.addEventListener("click",()=>{js(),fn(),i("ma-note-title")?.focus()}),i("ma-notes-search")?.addEventListener("input",async e=>{Wl=e.target.value||"",await Vn(),fn()}),i("ma-note-save")?.addEventListener("click",async()=>{try{await ap()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-delete")?.addEventListener("click",async()=>{try{await op()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-ask")?.addEventListener("click",sp),i("ma-cfg-save")?.addEventListener("click",dp),i("ma-auto-report")?.addEventListener("change",async()=>{try{let e=await x("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report").checked,auto_report_hour:parseInt(i("ma-auto-hour")?.value||"18",10)});_s(e)}catch{}}),i("ma-auto-hour")?.addEventListener("change",async()=>{try{let e=await x("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report")?.checked,auto_report_hour:parseInt(i("ma-auto-hour").value||"18",10)});_s(e)}catch{}}),i("ma-image-input")?.addEventListener("change",async e=>{let t=[...e.target.files||[]],n=i("ma-input");n&&(n.disabled=!0);try{for(let s of t)if(s.type.startsWith("image/")){if(s.size>12*1024*1024){ee("error",`${s.name} \u8FC7\u5927 (>12MB)`);continue}await Bl(s,s.name||`upload-${Date.now()}.png`)}}catch(s){ee("error",`\u56FE\u7247\u4E0A\u4F20\u5931\u8D25: ${s.message}`)}finally{e.target.value="",n&&(n.disabled=!1,n.focus())}}),document.addEventListener("paste",async e=>{if(!Wa||qt!=="chat")return;let t=i("ma-input"),n=i("meta-agent-panel"),s=document.activeElement;if(!n||!s||!n.contains(s))return;let o=[...e.clipboardData?.items||[]].filter(r=>r.type.startsWith("image/"));if(o.length){e.preventDefault(),t&&(t.disabled=!0);try{for(let r of o){let d=r.getAsFile();if(!d)continue;let u=(r.type.split("/")[1]||"png").replace(/[^a-z0-9]/gi,"")||"png";await Bl(d,`paste-${Date.now()}.${u}`)}}catch(r){ee("error",`\u7C98\u8D34\u56FE\u7247\u5931\u8D25: ${r.message}`)}finally{t&&(t.disabled=!1,t.focus())}}}),Et(null,{silent:!0}),js())}function Ns(){c.token&&(M.peek()&&!ps()||(Lt(),Vn().catch(()=>{}),x("GET","/api/ai/config").then(_s).catch(()=>{})))}var Wa,qt,Qn,we,qe,pn,Rl,Oa,Ar,Ua,Fl,Fa,Wl,mn,Gl,Rt,Ps=F(()=>{G();le();W();_n();en();Zt();Wa=!1,qt="chat",Qn=!1,we=null,qe=null,pn=[],Rl=0,Oa=null,Ar=localStorage.getItem("ai_last_auto_report")||"",Ua=[],Fl="",Fa=[],Wl="",mn=null,Gl=null,Rt="ma_last_session_id"});function Pr(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function bn(){let e=Pr(ne.peek()),t=D.peek();M.peek()&&t&&(e=e.filter(s=>s&&(!s.machineId||s.machineId===t)));let n=ye.peek();return n&&n!=="all"&&(e=e.filter(s=>s&&(s.agent||"claude")===n)),e}function tc(e){let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0");return`${t}-${n}-${s}`}function up(e,t){let n=[],a=new Date(e,t,1).getDay(),r=new Date(e,t+1,0).getDate(),d=new Date(e,t,0).getDate();for(let l=a-1;l>=0;l--)n.push({date:new Date(e,t-1,d-l),isCurrentMonth:!1});for(let l=1;l<=r;l++)n.push({date:new Date(e,t,l),isCurrentMonth:!0});let u=7-n.length%7;if(u<7)for(let l=1;l<=u;l++)n.push({date:new Date(e,t+1,l),isCurrentMonth:!1});return n}function nc(e,t){let n=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),s=n+1440*60*1e3;return t.filter(a=>{let o=O(a.updatedAt);return o!=null&&o>=n&&o<s})}function sc(e){return e==null||isNaN(e)?"0":e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function vn(e){let t=i("calendar-grid");if(!t)return;e=Pr(e??bn());let n=i("calendar-month-year");if(n){let f=new Date(Ka,gn,1);n.textContent=f.toLocaleDateString([],{month:"long",year:"numeric"})}let s=e.length,a=new Set(e.map(f=>f.cwd).filter(Boolean)).size,o=e.reduce((f,m)=>f+(Number(m.totalTokens)||0),0),r=i("stats-total-sessions"),d=i("stats-total-projects"),u=i("stats-total-tokens");r&&(r.textContent=String(s)),d&&(d.textContent=String(a)),u&&(u.textContent=sc(o));let l=up(Ka,gn);Hs||(Hs=tc(new Date)),t.innerHTML=l.map(f=>{let m=f.date,g=tc(m),y=nc(m,e).length,H=m.toDateString()===new Date().toDateString(),me=g===Hs,J="",ue="text-base-content/65",q="border border-transparent",Q="cursor-default",he=f.isCurrentMonth?"":"opacity-25";y>0?(Q="cursor-pointer",y<=2?(J="bg-primary/15",ue="text-primary font-bold",q="border border-primary/30"):y<=5?(J="bg-primary/30",ue="text-primary font-bold",q="border border-primary/50"):(J="bg-primary/60",ue="text-primary-content font-bold",q="border border-primary/80")):(J="bg-base-300/25",f.isCurrentMonth&&(Q="hover:bg-base-300/50")),H?q="border-2 border-primary":me&&(q="border-2 border-accent");let Ae=m.getDate()===1?`<span class="absolute top-0.5 left-1 text-[8px] opacity-60 uppercase">${m.toLocaleDateString([],{month:"short"})}</span>`:"";return`
377
- <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] ${J} ${ue} ${q} ${Q} ${he}"
376
+ <div class="md ma-report-md">${Xn(a.markdown)}</div>`,Zn(o)}catch(a){i("ma-report-body").innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}})})}catch(t){e.classList.remove("hidden"),e.innerHTML=`<div class="text-xs text-error px-2">${p(t.message)}</div>`}}async function Zl(){try{let e=await x("GET","/api/ai/config");i("ma-cfg-url").value=e.url||"",i("ma-cfg-model").value=e.model||"",i("ma-cfg-key").placeholder=e.hasKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"API Key",i("ma-cfg-key").value="",i("ma-cfg-vlm-url").value=e.vlm_url||"",i("ma-cfg-vlm-model").value=e.vlm_model||"",i("ma-cfg-vlm-key").value="",i("ma-cfg-vlm-key").placeholder=e.hasVlmKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"\u53EF\u9009",i("ma-cfg-system").value=e.system||"",i("ma-auto-report")&&(i("ma-auto-report").checked=!!e.auto_report),i("ma-auto-hour")&&(i("ma-auto-hour").value=String(e.auto_report_hour??18)),Ns(e)}catch(e){i("ma-cfg-status").textContent=e.message}}async function pp(){let e=i("ma-cfg-status");e.textContent="\u4FDD\u5B58\u4E2D\u2026";try{let t={url:i("ma-cfg-url").value.trim(),model:i("ma-cfg-model").value.trim(),vlm_url:i("ma-cfg-vlm-url").value.trim(),vlm_model:i("ma-cfg-vlm-model").value.trim(),system:i("ma-cfg-system").value,auto_report:!!i("ma-auto-report")?.checked,auto_report_hour:parseInt(i("ma-auto-hour")?.value||"18",10)},n=i("ma-cfg-key").value.trim(),s=i("ma-cfg-vlm-key").value.trim();n&&(t.key=n),s&&(t.vlm_key=s);let a=await x("PUT","/api/ai/config",t);e.textContent=a.hasKey?"\u5DF2\u4FDD\u5B58 \u2713":"\u5DF2\u4FDD\u5B58\uFF08\u672A\u8BBE\u7F6E Key\uFF09",i("ma-cfg-key").value="",i("ma-cfg-vlm-key").value="",Ns(a)}catch(t){e.textContent=t.message}}function Ns(e){if(Ua&&(clearInterval(Ua),Ua=null),!e?.auto_report)return;let t=e.auto_report_hour??18;Ua=setInterval(async()=>{if(!c.token)return;let n=new Date;if(n.getHours()!==t)return;let s=`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`;if(Dr!==s&&!(n.getMinutes()>10))try{Dr=s,localStorage.setItem("ai_last_auto_report",s),await Nr("/api/ai/report",{days:e.auto_report_days||1},{done:()=>{console.info("[meta-agent] auto report saved for",s)},error:a=>console.warn("[meta-agent] auto report",a.message)})}catch(a){console.warn("[meta-agent] auto report failed",a),Dr="",localStorage.removeItem("ai_last_auto_report")}},60*1e3)}function ec(){i("meta-agent-panel")||(document.getElementById("root")?.insertAdjacentHTML("beforeend",tp()),document.querySelectorAll("[data-ma-close]").forEach(e=>{e.addEventListener("click",Jl)}),i("ma-btn-chat")?.addEventListener("click",()=>Te("chat")),i("ma-btn-history")?.addEventListener("click",async()=>{await Et(),Te("history")}),i("ma-btn-notes")?.addEventListener("click",async()=>{await Yn(),gn||Ds(),Te("notes")}),i("ma-open-history")?.addEventListener("click",async()=>{await Et(),Te("history")}),i("ma-btn-report")?.addEventListener("click",()=>{Te("report"),Xl()}),i("ma-btn-config")?.addEventListener("click",()=>{Te("config"),Zl()}),i("ma-send")?.addEventListener("click",Fa),i("ma-input")?.addEventListener("keydown",e=>{(e.metaKey||e.ctrlKey)&&e.key==="Enter"&&(e.preventDefault(),Fa())}),i("ma-input")?.addEventListener("input",()=>{let e=i("ma-input");e.style.height="auto",e.style.height=Math.min(e.scrollHeight,120)+"px"}),i("ma-new-chat")?.addEventListener("click",()=>{It(null),Te("chat")}),i("ma-del-session")?.addEventListener("click",cp),i("ma-resume-focus")?.addEventListener("click",()=>{i("ma-input")?.focus()}),i("ma-history-refresh")?.addEventListener("click",async()=>{await Et(),bn()}),i("ma-history-new")?.addEventListener("click",()=>{It(null),Te("chat")}),i("ma-history-search")?.addEventListener("input",e=>{Gl=e.target.value||"",bn()}),i("ma-quick-today")?.addEventListener("click",()=>{Te("chat"),i("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",Fa()}),i("ma-quick-projects")?.addEventListener("click",()=>{Te("chat"),i("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",Fa()}),i("ma-gen-report")?.addEventListener("click",dp),i("ma-load-reports")?.addEventListener("click",up),i("ma-notes-refresh")?.addEventListener("click",async()=>{await Yn(),hn()}),i("ma-notes-new")?.addEventListener("click",()=>{Ds(),hn(),i("ma-note-title")?.focus()}),i("ma-notes-search")?.addEventListener("input",async e=>{Kl=e.target.value||"",await Yn(),hn()}),i("ma-note-save")?.addEventListener("click",async()=>{try{await rp()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-delete")?.addEventListener("click",async()=>{try{await ip()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-ask")?.addEventListener("click",op),i("ma-cfg-save")?.addEventListener("click",pp),i("ma-auto-report")?.addEventListener("change",async()=>{try{let e=await x("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report").checked,auto_report_hour:parseInt(i("ma-auto-hour")?.value||"18",10)});Ns(e)}catch{}}),i("ma-auto-hour")?.addEventListener("change",async()=>{try{let e=await x("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report")?.checked,auto_report_hour:parseInt(i("ma-auto-hour").value||"18",10)});Ns(e)}catch{}}),i("ma-image-input")?.addEventListener("change",async e=>{let t=[...e.target.files||[]],n=i("ma-input");n&&(n.disabled=!0);try{for(let s of t)if(s.type.startsWith("image/")){if(s.size>12*1024*1024){ee("error",`${s.name} \u8FC7\u5927 (>12MB)`);continue}await Fl(s,s.name||`upload-${Date.now()}.png`)}}catch(s){ee("error",`\u56FE\u7247\u4E0A\u4F20\u5931\u8D25: ${s.message}`)}finally{e.target.value="",n&&(n.disabled=!1,n.focus())}}),document.addEventListener("paste",async e=>{if(!Ka||Rt!=="chat")return;let t=i("ma-input"),n=i("meta-agent-panel"),s=document.activeElement;if(!n||!s||!n.contains(s))return;let o=[...e.clipboardData?.items||[]].filter(r=>r.type.startsWith("image/"));if(o.length){e.preventDefault(),t&&(t.disabled=!0);try{for(let r of o){let d=r.getAsFile();if(!d)continue;let u=(r.type.split("/")[1]||"png").replace(/[^a-z0-9]/gi,"")||"png";await Fl(d,`paste-${Date.now()}.${u}`)}}catch(r){ee("error",`\u7C98\u8D34\u56FE\u7247\u5931\u8D25: ${r.message}`)}finally{t&&(t.disabled=!1,t.focus())}}}),It(null,{silent:!0}),Ds())}function Ps(){c.token&&(M.peek()&&!fs()||(Et(),Yn().catch(()=>{}),x("GET","/api/ai/config").then(Ns).catch(()=>{})))}var Ka,Rt,Vn,we,qe,mn,Ol,Ua,Dr,Wa,Gl,Ga,Kl,gn,zl,Bt,Hs=W(()=>{K();ce();G();Pn();nn();tn();Ka=!1,Rt="chat",Vn=!1,we=null,qe=null,mn=[],Ol=0,Ua=null,Dr=localStorage.getItem("ai_last_auto_report")||"",Wa=[],Gl="",Ga=[],Kl="",gn=null,zl=null,Bt="ma_last_session_id"});function qr(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function xn(){let e=qr(ne.peek()),t=_.peek();M.peek()&&t&&(e=e.filter(s=>s&&(!s.machineId||s.machineId===t)));let n=ye.peek();return n&&n!=="all"&&(e=e.filter(s=>s&&(s.agent||"claude")===n)),e}function sc(e){let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0");return`${t}-${n}-${s}`}function fp(e,t){let n=[],a=new Date(e,t,1).getDay(),r=new Date(e,t+1,0).getDate(),d=new Date(e,t,0).getDate();for(let l=a-1;l>=0;l--)n.push({date:new Date(e,t-1,d-l),isCurrentMonth:!1});for(let l=1;l<=r;l++)n.push({date:new Date(e,t,l),isCurrentMonth:!0});let u=7-n.length%7;if(u<7)for(let l=1;l<=u;l++)n.push({date:new Date(e,t+1,l),isCurrentMonth:!1});return n}function ac(e,t){let n=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),s=n+1440*60*1e3;return t.filter(a=>{let o=B(a.updatedAt);return o!=null&&o>=n&&o<s})}function oc(e){return e==null||isNaN(e)?"0":e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function yn(e){let t=i("calendar-grid");if(!t)return;e=qr(e??xn());let n=i("calendar-month-year");if(n){let f=new Date(Ja,vn,1);n.textContent=f.toLocaleDateString([],{month:"long",year:"numeric"})}let s=e.length,a=new Set(e.map(f=>f.cwd).filter(Boolean)).size,o=e.reduce((f,m)=>f+(Number(m.totalTokens)||0),0),r=i("stats-total-sessions"),d=i("stats-total-projects"),u=i("stats-total-tokens");r&&(r.textContent=String(s)),d&&(d.textContent=String(a)),u&&(u.textContent=oc(o));let l=fp(Ja,vn);qs||(qs=sc(new Date)),t.innerHTML=l.map(f=>{let m=f.date,g=sc(m),y=ac(m,e).length,A=m.toDateString()===new Date().toDateString(),ae=g===qs,O="",pe="text-base-content/65",q="border border-transparent",Q="cursor-default",he=f.isCurrentMonth?"":"opacity-25";y>0?(Q="cursor-pointer",y<=2?(O="bg-primary/15",pe="text-primary font-bold",q="border border-primary/30"):y<=5?(O="bg-primary/30",pe="text-primary font-bold",q="border border-primary/50"):(O="bg-primary/60",pe="text-primary-content font-bold",q="border border-primary/80")):(O="bg-base-300/25",f.isCurrentMonth&&(Q="hover:bg-base-300/50")),A?q="border-2 border-primary":ae&&(q="border-2 border-accent");let Ae=m.getDate()===1?`<span class="absolute top-0.5 left-1 text-[8px] opacity-60 uppercase">${m.toLocaleDateString([],{month:"short"})}</span>`:"";return`
377
+ <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] ${O} ${pe} ${q} ${Q} ${he}"
378
378
  data-cal-date="${g}" title="${m.toDateString()}: ${y} session(s)">
379
379
  ${Ae}
380
380
  <span class="text-sm font-semibold">${m.getDate()}</span>
381
381
  ${y>0?`<span class="text-[10px] mt-0.5 opacity-80 font-medium whitespace-nowrap">${y}s</span>`:""}
382
- </div>`}).join(""),pp(e),qr()}function pp(e){let t=i("selected-day-title"),n=i("selected-day-sessions");if(!t||!n)return;let[s,a,o]=Hs.split("-").map(Number),r=new Date(s,a-1,o);t.textContent=`Activity on ${r.toLocaleDateString([],{weekday:"short",month:"short",day:"numeric",year:"numeric"})}`,e=Pr(e);let d=nc(r,e),u=d.reduce((f,m)=>f+(Number(m.totalTokens)||0),0),l=i("stats-selected-tokens");if(l&&(l.textContent=sc(u)),!d.length){n.innerHTML='<div class="text-center text-xs text-base-content/40 my-auto py-6">No sessions active on this day</div>';return}d.sort((f,m)=>(O(m.updatedAt)||0)-(O(f.updatedAt)||0)),n.innerHTML=d.map(f=>{let m=O(f.updatedAt),g=m!=null?new Date(m).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"";return`
382
+ </div>`}).join(""),mp(e),Br()}function mp(e){let t=i("selected-day-title"),n=i("selected-day-sessions");if(!t||!n)return;let[s,a,o]=qs.split("-").map(Number),r=new Date(s,a-1,o);t.textContent=`Activity on ${r.toLocaleDateString([],{weekday:"short",month:"short",day:"numeric",year:"numeric"})}`,e=qr(e);let d=ac(r,e),u=d.reduce((f,m)=>f+(Number(m.totalTokens)||0),0),l=i("stats-selected-tokens");if(l&&(l.textContent=oc(u)),!d.length){n.innerHTML='<div class="text-center text-xs text-base-content/40 my-auto py-6">No sessions active on this day</div>';return}d.sort((f,m)=>(B(m.updatedAt)||0)-(B(f.updatedAt)||0)),n.innerHTML=d.map(f=>{let m=B(f.updatedAt),g=m!=null?new Date(m).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"";return`
383
383
  <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 ${c.sessionId===f.sessionId?"border-primary bg-primary/5":""}"
384
384
  data-session-id="${p(f.sessionId)}"
385
385
  data-session-cwd="${p(f.cwd||"")}"
386
386
  data-session-config-dir="${p(f.configDir||"")}"
387
387
  data-session-agent="${p(f.agent||"claude")}"
388
388
  data-session-machine="${p(f.machineId||"")}">
389
- <div class="flex-shrink-0">${Hn(f.agent)}</div>
389
+ <div class="flex-shrink-0">${Rn(f.agent)}</div>
390
390
  <div class="flex-1 min-w-0">
391
- <div class="text-xs font-semibold truncate text-base-content/90">${p(bt(f))}</div>
392
- <div class="text-[10px] text-base-content/40 truncate mt-0.5">${p(f.projectName||qn(f.cwd)||"No workspace")}</div>
391
+ <div class="text-xs font-semibold truncate text-base-content/90">${p(vt(f))}</div>
392
+ <div class="text-[10px] text-base-content/40 truncate mt-0.5">${p(f.projectName||Bn(f.cwd)||"No workspace")}</div>
393
393
  </div>
394
394
  <div class="text-[9px] text-base-content/45 font-mono whitespace-nowrap bg-base-300 px-1.5 py-0.5 rounded">${g}</div>
395
- </div>`}).join("")}function za(e){return`${e.machineId||""}:${e.agent||"claude"}:${e.sessionId}`}function Hr(){try{let e=JSON.parse(localStorage.getItem(oc)||"[]");return Array.isArray(e)?e.filter(t=>t&&t.sessionId):[]}catch{return[]}}function rc(e){try{localStorage.setItem(oc,JSON.stringify(e))}catch{}}function ic(e){if(!e?.sessionId)return;let t=za(e),n={...e,lastOpenedAt:Date.now()},s=Hr().filter(a=>za(a)!==t);s.unshift(n),rc(s.slice(0,ac)),qr(),Or()}function lc(e){if(!e?.sessionId)return;let t=za(e);rc(Hr().filter(n=>za(n)!==t)),qr(),Or()}function cc(e){return Hr().sort((t,n)=>(O(n.lastOpenedAt)||0)-(O(t.lastOpenedAt)||0)).slice(0,e)}function qr(){let e=i("recent-sessions-list");if(!e)return;let t=cc(6);if(!t.length){e.innerHTML='<div class="col-span-full text-center text-xs text-base-content/40 py-4">No recent sessions</div>';return}e.innerHTML=t.map(n=>{let s=Pn(n.updatedAt);return`
395
+ </div>`}).join("")}function Qa(e){return`${e.machineId||""}:${e.agent||"claude"}:${e.sessionId}`}function Rr(){try{let e=JSON.parse(localStorage.getItem(ic)||"[]");return Array.isArray(e)?e.filter(t=>t&&t.sessionId):[]}catch{return[]}}function lc(e){try{localStorage.setItem(ic,JSON.stringify(e))}catch{}}function cc(e){if(!e?.sessionId)return;let t=Qa(e),n={...e,lastOpenedAt:Date.now()},s=Rr().filter(a=>Qa(a)!==t);s.unshift(n),lc(s.slice(0,rc)),Br(),Ur()}function dc(e){if(!e?.sessionId)return;let t=Qa(e);lc(Rr().filter(n=>Qa(n)!==t)),Br(),Ur()}function uc(e){return Rr().sort((t,n)=>(B(n.lastOpenedAt)||0)-(B(t.lastOpenedAt)||0)).slice(0,e)}function Br(){let e=i("recent-sessions-list");if(!e)return;let t=uc(6);if(!t.length){e.innerHTML='<div class="col-span-full text-center text-xs text-base-content/40 py-4">No recent sessions</div>';return}e.innerHTML=t.map(n=>{let s=qn(n.updatedAt);return`
396
396
  <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 ${c.sessionId===n.sessionId?"border-primary bg-primary/5":""}"
397
397
  data-session-id="${p(n.sessionId)}"
398
398
  data-session-cwd="${p(n.cwd||"")}"
399
399
  data-session-config-dir="${p(n.configDir||"")}"
400
400
  data-session-agent="${p(n.agent||"claude")}"
401
401
  data-session-machine="${p(n.machineId||"")}">
402
- <div class="flex-shrink-0">${Hn(n.agent)}</div>
402
+ <div class="flex-shrink-0">${Rn(n.agent)}</div>
403
403
  <div class="flex-1 min-w-0">
404
- <div class="text-xs font-bold truncate text-base-content/95">${p(bt(n))}</div>
405
- <div class="text-[10px] text-base-content/40 truncate mt-1">${p(n.projectName||qn(n.cwd)||"No workspace")}</div>
404
+ <div class="text-xs font-bold truncate text-base-content/95">${p(vt(n))}</div>
405
+ <div class="text-[10px] text-base-content/40 truncate mt-1">${p(n.projectName||Bn(n.cwd)||"No workspace")}</div>
406
406
  </div>
407
407
  <div class="text-[9px] text-base-content/40 whitespace-nowrap self-start mt-0.5">${s}</div>
408
- </div>`}).join("")}function xn(){let e=i("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=""),i("recent-menu-backdrop")?.classList.add("hidden")}function Rr(){let e=i("recent-menu"),t=i("topbar");if(!e||!t)return;let n=t.getBoundingClientRect(),a=Math.round(n.bottom+6),o=window.matchMedia("(max-width: 640px)").matches?8:null;if(e.style.top=`${a}px`,o!=null)e.style.left=`${o}px`,e.style.right=`${o}px`;else{let u=i("btn-recent-sessions")?.getBoundingClientRect();if(u){let l=Math.min(320,window.innerWidth-16),f=u.left;f+l>window.innerWidth-8&&(f=window.innerWidth-l-8),f<8&&(f=8),e.style.left=`${Math.round(f)}px`,e.style.right="auto",e.style.width=`${l}px`}}let r=Math.max(160,window.innerHeight-a-12);e.style.maxHeight=`${Math.min(r,Math.round(window.innerHeight*.7))}px`}function fp(){let e=i("recent-menu");e&&(Or(),e.classList.remove("hidden"),e.classList.add("recent-menu-open"),Rr(),i("recent-menu-backdrop")?.classList.remove("hidden"))}function dc(){let e=i("recent-menu");e&&(e.classList.contains("hidden")?fp():xn())}function Or(){let e=i("recent-menu-list"),t=i("recent-menu-empty"),n=i("recent-menu-count");if(!e)return;let s=cc(ac);if(n&&(n.textContent=s.length?`${s.length}`:""),!s.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=s.map(a=>{let o=Pn(a.updatedAt),r=c.sessionId===a.sessionId&&(!a.machineId||!c.machineId||a.machineId===c.machineId),d=a.machineId?`<span class="text-[9px] font-mono text-base-content/35 truncate max-w-[4.5rem]" title="${p(a.machineId)}">@${p(a.machineId)}</span>`:"";return`
408
+ </div>`}).join("")}function wn(){let e=i("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=""),i("recent-menu-backdrop")?.classList.add("hidden")}function Or(){let e=i("recent-menu"),t=i("topbar");if(!e||!t)return;let n=t.getBoundingClientRect(),a=Math.round(n.bottom+6),o=window.matchMedia("(max-width: 640px)").matches?8:null;if(e.style.top=`${a}px`,o!=null)e.style.left=`${o}px`,e.style.right=`${o}px`;else{let u=i("btn-recent-sessions")?.getBoundingClientRect();if(u){let l=Math.min(320,window.innerWidth-16),f=u.left;f+l>window.innerWidth-8&&(f=window.innerWidth-l-8),f<8&&(f=8),e.style.left=`${Math.round(f)}px`,e.style.right="auto",e.style.width=`${l}px`}}let r=Math.max(160,window.innerHeight-a-12);e.style.maxHeight=`${Math.min(r,Math.round(window.innerHeight*.7))}px`}function hp(){let e=i("recent-menu");e&&(Ur(),e.classList.remove("hidden"),e.classList.add("recent-menu-open"),Or(),i("recent-menu-backdrop")?.classList.remove("hidden"))}function pc(){let e=i("recent-menu");e&&(e.classList.contains("hidden")?hp():wn())}function Ur(){let e=i("recent-menu-list"),t=i("recent-menu-empty"),n=i("recent-menu-count");if(!e)return;let s=uc(rc);if(n&&(n.textContent=s.length?`${s.length}`:""),!s.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=s.map(a=>{let o=qn(a.updatedAt),r=c.sessionId===a.sessionId&&(!a.machineId||!c.machineId||a.machineId===c.machineId),d=a.machineId?`<span class="text-[9px] font-mono text-base-content/35 truncate max-w-[4.5rem]" title="${p(a.machineId)}">@${p(a.machineId)}</span>`:"";return`
409
409
  <div class="recent-menu-item w-full text-left px-2 py-1.5 rounded-md flex items-start gap-2
410
410
  ${r?"bg-primary/15 text-primary":"hover:bg-base-200"}">
411
- <button type="button" class="flex min-w-0 flex-1 items-start gap-2 text-left" aria-label="\u6253\u5F00 ${p(bt(a))}"
411
+ <button type="button" class="flex min-w-0 flex-1 items-start gap-2 text-left" aria-label="\u6253\u5F00 ${p(vt(a))}"
412
412
  data-session-id="${p(a.sessionId)}"
413
413
  data-session-cwd="${p(a.cwd||"")}"
414
414
  data-session-config-dir="${p(a.configDir||"")}"
415
415
  data-session-agent="${p(a.agent||"claude")}"
416
416
  data-session-machine="${p(a.machineId||"")}">
417
- <span class="flex-shrink-0 mt-0.5">${Hn(a.agent)}</span>
417
+ <span class="flex-shrink-0 mt-0.5">${Rn(a.agent)}</span>
418
418
  <span class="flex-1 min-w-0">
419
- <span class="block text-xs font-semibold truncate leading-snug">${p(bt(a))}</span>
420
- <span class="block text-[10px] text-base-content/40 truncate mt-0.5">${p(a.projectName||qn(a.cwd)||"\u2014")}</span>
419
+ <span class="block text-xs font-semibold truncate leading-snug">${p(vt(a))}</span>
420
+ <span class="block text-[10px] text-base-content/40 truncate mt-0.5">${p(a.projectName||Bn(a.cwd)||"\u2014")}</span>
421
421
  </span>
422
422
  <span class="flex flex-col items-end gap-0.5 flex-shrink-0 self-start">
423
423
  <span class="text-[9px] text-base-content/40 whitespace-nowrap">${p(o)}</span>
@@ -426,12 +426,12 @@ ${t}`:"",n.length?n.join(`
426
426
  </span>
427
427
  </button>
428
428
  <button type="button" class="recent-remove btn btn-ghost btn-xs min-h-7 h-7 w-7 px-0 flex-shrink-0 text-base-content/45 hover:text-error"
429
- title="\u4ECE\u6700\u8FD1\u4F1A\u8BDD\u79FB\u9664" aria-label="\u4ECE\u6700\u8FD1\u4F1A\u8BDD\u79FB\u9664 ${p(bt(a))}"
429
+ title="\u4ECE\u6700\u8FD1\u4F1A\u8BDD\u79FB\u9664" aria-label="\u4ECE\u6700\u8FD1\u4F1A\u8BDD\u79FB\u9664 ${p(vt(a))}"
430
430
  data-dismiss-recent-session="${p(a.sessionId)}"
431
431
  data-dismiss-recent-agent="${p(a.agent||"claude")}"
432
432
  data-dismiss-recent-machine="${p(a.machineId||"")}">\xD7</button>
433
- </div>`}).join("")}function uc(e){Hs=e}function Br(e){gn+=e,gn<0?(gn=11,Ka--):gn>11&&(gn=0,Ka++)}var Ka,gn,Hs,ac,oc,Ur=F(()=>{G();W();_t();Ka=new Date().getFullYear(),gn=new Date().getMonth(),Hs=null;ac=15,oc="recentSessionsV1"});var to={};ls(to,{loadAgentsMeta:()=>es,loadAllSessions:()=>We,loadMemoryTab:()=>eo,loadWorkspaces:()=>Zn,markActiveSessionRow:()=>mp,mdToHtml:()=>xc,openMemoryFile:()=>zr,promptCustomModel:()=>Ya,refreshEffortSelect:()=>Va,refreshModelSelect:()=>et,renderProjectGroups:()=>bc,renderSessionList:()=>Kr,renderTimeline:()=>vc,runActivitySearch:()=>Xa,scheduleActivitySearch:()=>Za,sessionItemHtml:()=>Gr,syncSidebarChrome:()=>qs});function pc(e){return!Array.isArray(e)||!e.length?"":e.map(t=>`${t.sessionId}:${t.updatedAt||0}:${t.turnCount||0}:${t.agent||""}`).join("|")}function mp(e,t){let n=t||"claude";document.querySelectorAll("#session-list .session-row").forEach(s=>{let a=s.dataset.sessionId===e&&(s.dataset.sessionAgent||"claude")===n;s.classList.toggle("border-primary",a),s.classList.toggle("bg-primary/5",a),s.classList.toggle("border-transparent",!a);let o=s.querySelector(".session-title-text");o&&(o.classList.toggle("text-primary",a),o.classList.toggle("font-medium",a),o.classList.toggle("text-base-content/85",!a))})}function fc(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function hp(e,t){return e?.parentSessionId?z(e.parentAgent||t.agent,e.parentSessionId,e.parentMachineId??t.machineId):""}function gp(e){let t=Array.isArray(e)?e:[],n=new Map(t.map(u=>[z(u.agent,u.sessionId,u.machineId),u])),s=new Map,a=[];for(let u of t){let l=T.peek()?.[z(u.agent,u.sessionId,u.machineId)]?.branch,f=hp(l,u);if(f&&n.has(f)&&f!==z(u.agent,u.sessionId,u.machineId)){let m=s.get(f)||[];m.push(u),s.set(f,m)}else a.push(u)}let o=(u,l)=>(l.updatedAt||0)-(u.updatedAt||0);a.sort(o);for(let u of s.values())u.sort(o);let r=[],d=(u,l,f=new Set)=>{let m=z(u.agent,u.sessionId,u.machineId);if(!f.has(m)){f.add(m),r.push(l?{...u,_branchDepth:l}:u);for(let g of s.get(m)||[])d(g,l+1,f)}};for(let u of a)d(u,0);return r}async function bp(){if(!Fr){Fr=!0;try{Qa++,await We()}finally{Fr=!1}}}function vp({hubIndex:e=!1,offset:t=0}={}){let n=new URLSearchParams;n.set("limit",String(Ja)),t&&n.set("offset",String(t)),(M.peek()||e)&&n.set("index","1");let s=n.toString();return s?`/api/sessions?${s}`:"/api/sessions"}async function We({waitFresh:e=!0,hubIndex:t=!1}={}){let n=D.peek()||null;n!==mc&&(mc=n,Qa=1);let s=++hc,a=fc(await Pa()).slice(0,Ja*Qa);if(a.length){let r=D.peek();if(M.peek()&&r){let d=a.filter(u=>!u.machineId||u.machineId===r);ne.value=d.length?d:a}else ne.value=a}let o=async()=>{let r=[];for(let u=0;u<Qa;u++){let l=vp({hubIndex:t,offset:u*Ja}),f=await x("GET",l,void 0,void 0,{machineId:n||void 0});if(s!==hc)return ne.peek();let m=fc(f);if(r.push(...m),Wr=m.length===Ja,!Wr)break}let d=new Map(r.map(u=>[`${u.machineId||""}:${u.agent}:${u.sessionId}`,u]));return r.splice(0,r.length,...d.values()),pc(r)!==pc(ne.peek())&&(ne.value=r,Ll(r)),r};if(e||!a.length)try{await o()}catch(r){if(!a.length){let d=i("session-list");d&&(d.innerHTML=`<div class="px-3 py-3 text-xs text-error">${p(r.message)}</div>`)}}else o().catch(()=>{})}async function Zn({waitFresh:e=!0}={}){let t=await El();t&&(pe.value=t);let n=async()=>{let s=await x("GET","/api/workspaces");pe.value=s,Is(s)};if(e||!t)try{await n()}catch{}else n().catch(()=>{})}function Gr(e,{showProject:t=!1}={}){let n=c.sessionId===e.sessionId&&(c.agent||$.peek())===(e.agent||"claude"),s=T.peek()?.[z(e.agent,e.sessionId,e.machineId)]||{},a=!!(s.title&&String(s.title).trim()),o=e.snippet&&$e.peek()?e.snippet:bt(e),r=!!s.favorite,d=!!s.hidden,u=!!(s.notes&&String(s.notes).trim()),l=s.branch?.parentSessionId?s.branch:null,f=Math.max(0,Math.min(4,Number(e._branchDepth)||0)),m=Number(e.turnCount)||0,g=m>0&&m<=Wo,w=t?`<div class="text-[10px] text-base-content/40 font-mono truncate" title="${p(e.cwd||"")}">${p(e.projectName||qn(e.cwd)||"\u2014")}</div>`:"",y=[g?`<span class="session-thin-badge" title="Only ${m} turn${m===1?"":"s"}">thin\xB7${m}</span>`:"",a?`<span class="session-renamed-badge" title="Custom name (original: ${p(e.display||"")})">renamed</span>`:"",d?'<span class="session-hidden-badge" title="Hidden">hidden</span>':"",u?`<span class="session-note-dot" title="${p(s.notes)}">\u{1F4DD}</span>`:"",l?`<span class="session-branch-badge" title="Forked from ${p(l.parentAgent||e.agent)}:${p(l.parentSessionId)}">\u2387 fork</span>`:""].filter(Boolean).join(""),H=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">${p(e.machineId)}</span>`:"",me=a?`${o}
434
- (original: ${e.display||e.sessionId})`:e.display||"",J=l?`<div class="session-branch-line" title="Forked from ${p(l.parentAgent||e.agent)} \xB7 ${p(l.parentSessionId)}">\u21B3 ${p(l.parentAgent||e.agent)} \xB7 ${p(l.parentSessionId.slice(0,8))}</div>`:"";return`<div class="session-row ${f?"session-branch":""} px-2.5 py-1.5 cursor-pointer hover:bg-base-300 border-l-2
433
+ </div>`}).join("")}function fc(e){qs=e}function Fr(e){vn+=e,vn<0?(vn=11,Ja--):vn>11&&(vn=0,Ja++)}var Ja,vn,qs,rc,ic,Wr=W(()=>{K();G();Nt();Ja=new Date().getFullYear(),vn=new Date().getMonth(),qs=null;rc=15,ic="recentSessionsV1"});var so={};cs(so,{loadAgentsMeta:()=>ts,loadAllSessions:()=>We,loadMemoryTab:()=>no,loadWorkspaces:()=>es,markActiveSessionRow:()=>gp,mdToHtml:()=>wc,openMemoryFile:()=>Qr,promptCustomModel:()=>Za,refreshEffortSelect:()=>Xa,refreshModelSelect:()=>et,renderProjectGroups:()=>xc,renderSessionList:()=>Jr,renderTimeline:()=>yc,runActivitySearch:()=>eo,scheduleActivitySearch:()=>to,sessionItemHtml:()=>zr,syncSidebarChrome:()=>Rs});function mc(e){return!Array.isArray(e)||!e.length?"":e.map(t=>`${t.sessionId}:${t.updatedAt||0}:${t.turnCount||0}:${t.agent||""}`).join("|")}function gp(e,t){let n=t||"claude";document.querySelectorAll("#session-list .session-row").forEach(s=>{let a=s.dataset.sessionId===e&&(s.dataset.sessionAgent||"claude")===n;s.classList.toggle("border-primary",a),s.classList.toggle("bg-primary/5",a),s.classList.toggle("border-transparent",!a);let o=s.querySelector(".session-title-text");o&&(o.classList.toggle("text-primary",a),o.classList.toggle("font-medium",a),o.classList.toggle("text-base-content/85",!a))})}function hc(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function bp(e,t){return e?.parentSessionId?J(e.parentAgent||t.agent,e.parentSessionId,e.parentMachineId??t.machineId):""}function vp(e){let t=Array.isArray(e)?e:[],n=new Map(t.map(u=>[J(u.agent,u.sessionId,u.machineId),u])),s=new Map,a=[];for(let u of t){let l=T.peek()?.[J(u.agent,u.sessionId,u.machineId)]?.branch,f=bp(l,u);if(f&&n.has(f)&&f!==J(u.agent,u.sessionId,u.machineId)){let m=s.get(f)||[];m.push(u),s.set(f,m)}else a.push(u)}let o=(u,l)=>(l.updatedAt||0)-(u.updatedAt||0);a.sort(o);for(let u of s.values())u.sort(o);let r=[],d=(u,l,f=new Set)=>{let m=J(u.agent,u.sessionId,u.machineId);if(!f.has(m)){f.add(m),r.push(l?{...u,_branchDepth:l}:u);for(let g of s.get(m)||[])d(g,l+1,f)}};for(let u of a)d(u,0);return r}async function xp(){if(!Gr){Gr=!0;try{Ya++,await We()}finally{Gr=!1}}}function yp({hubIndex:e=!1,offset:t=0}={}){let n=new URLSearchParams;n.set("limit",String(Va)),t&&n.set("offset",String(t)),(M.peek()||e)&&n.set("index","1");let s=n.toString();return s?`/api/sessions?${s}`:"/api/sessions"}async function We({waitFresh:e=!0,hubIndex:t=!1}={}){let n=_.peek()||null;n!==gc&&(gc=n,Ya=1);let s=++bc,a=hc(await qa()).slice(0,Va*Ya);if(a.length){let r=_.peek();if(M.peek()&&r){let d=a.filter(u=>!u.machineId||u.machineId===r);ne.value=d.length?d:a}else ne.value=a}let o=async()=>{let r=[];for(let u=0;u<Ya;u++){let l=yp({hubIndex:t,offset:u*Va}),f=await x("GET",l,void 0,void 0,{machineId:n||void 0});if(s!==bc)return ne.peek();let m=hc(f);if(r.push(...m),Kr=m.length===Va,!Kr)break}let d=new Map(r.map(u=>[`${u.machineId||""}:${u.agent}:${u.sessionId}`,u]));return r.splice(0,r.length,...d.values()),mc(r)!==mc(ne.peek())&&(ne.value=r,Il(r)),r};if(e||!a.length)try{await o()}catch(r){if(!a.length){let d=i("session-list");d&&(d.innerHTML=`<div class="px-3 py-3 text-xs text-error">${p(r.message)}</div>`)}}else o().catch(()=>{})}async function es({waitFresh:e=!0}={}){let t=await Tl();t&&(fe.value=t);let n=async()=>{let s=await x("GET","/api/workspaces");fe.value=s,Ts(s)};if(e||!t)try{await n()}catch{}else n().catch(()=>{})}function zr(e,{showProject:t=!1}={}){let n=c.sessionId===e.sessionId&&(c.agent||$.peek())===(e.agent||"claude"),s=T.peek()?.[J(e.agent,e.sessionId,e.machineId)]||{},a=!!(s.title&&String(s.title).trim()),o=e.snippet&&$e.peek()?e.snippet:vt(e),r=!!s.favorite,d=!!s.hidden,u=!!(s.notes&&String(s.notes).trim()),l=s.branch?.parentSessionId?s.branch:null,f=Math.max(0,Math.min(4,Number(e._branchDepth)||0)),m=Number(e.turnCount)||0,g=m>0&&m<=Go,w=t?`<div class="text-[10px] text-base-content/40 font-mono truncate" title="${p(e.cwd||"")}">${p(e.projectName||Bn(e.cwd)||"\u2014")}</div>`:"",y=[g?`<span class="session-thin-badge" title="Only ${m} turn${m===1?"":"s"}">thin\xB7${m}</span>`:"",a?`<span class="session-renamed-badge" title="Custom name (original: ${p(e.display||"")})">renamed</span>`:"",d?'<span class="session-hidden-badge" title="Hidden">hidden</span>':"",u?`<span class="session-note-dot" title="${p(s.notes)}">\u{1F4DD}</span>`:"",l?`<span class="session-branch-badge" title="Forked from ${p(l.parentAgent||e.agent)}:${p(l.parentSessionId)}">\u2387 fork</span>`:""].filter(Boolean).join(""),A=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">${p(e.machineId)}</span>`:"",ae=a?`${o}
434
+ (original: ${e.display||e.sessionId})`:e.display||"",O=l?`<div class="session-branch-line" title="Forked from ${p(l.parentAgent||e.agent)} \xB7 ${p(l.parentSessionId)}">\u21B3 ${p(l.parentAgent||e.agent)} \xB7 ${p(l.parentSessionId.slice(0,8))}</div>`:"";return`<div class="session-row ${f?"session-branch":""} px-2.5 py-1.5 cursor-pointer hover:bg-base-300 border-l-2
435
435
  ${n?"border-primary bg-primary/5":"border-transparent"} ${r?"session-fav":""} ${d?"session-hidden-row":""} ${g?"session-thin":""}"
436
436
  style="--branch-depth:${f}"
437
437
  data-session-id="${p(e.sessionId)}"
@@ -447,7 +447,7 @@ ${t}`:"",n.length?n.join(`
447
447
  data-fav-session-agent="${p(e.agent||"claude")}"
448
448
  data-fav-session-machine="${p(e.machineId||"")}"
449
449
  title="${r?"Unfavorite":"Favorite"}">${r?"\u2605":"\u2606"}</button>
450
- ${Hn(e.agent)}
450
+ ${Rn(e.agent)}
451
451
  <div class="min-w-0 flex-1">
452
452
  <div class="session-title-wrap flex items-center gap-1 min-w-0"
453
453
  data-rename-session-id="${p(e.sessionId)}"
@@ -455,7 +455,7 @@ ${t}`:"",n.length?n.join(`
455
455
  data-rename-session-machine="${p(e.machineId||"")}"
456
456
  data-rename-session-display="${p(e.display||"")}">
457
457
  <div class="session-title-text text-[11px] leading-snug truncate flex-1 min-w-0 ${n?"text-primary font-medium":"text-base-content/85"} ${a?"session-title-renamed":""}"
458
- title="${p(me)}">${p(o)}</div>
458
+ title="${p(ae)}">${p(o)}</div>
459
459
  <button type="button" class="session-rename-btn flex-shrink-0"
460
460
  data-rename-session="1"
461
461
  title="Rename session">\u270E</button>
@@ -467,31 +467,31 @@ ${t}`:"",n.length?n.join(`
467
467
  title="${d?"Unhide session":"Hide session"}">${d?"\u{1F441}":"\u{1F648}"}</button>
468
468
  </div>
469
469
  ${w}
470
- ${J}
471
- ${y||H?`<div class="flex items-center gap-1 mt-0.5 flex-wrap">${H}${y}</div>`:""}
470
+ ${O}
471
+ ${y||A?`<div class="flex items-center gap-1 mt-0.5 flex-wrap">${A}${y}</div>`:""}
472
472
  </div>
473
- <span class="text-[9px] text-base-content/30 flex-shrink-0 mt-0.5">${Pn(e.updatedAt)}</span>
473
+ <span class="text-[9px] text-base-content/30 flex-shrink-0 mt-0.5">${qn(e.updatedAt)}</span>
474
474
  </div>
475
- </div>`}async function es(){try{let e=await x("GET","/api/agents");return Kt.value=e,et(),e}catch(e){return console.warn("[agents] failed to load model list",e),null}}function Va(){let e=i("sel-effort");if(!e)return;let t=$.peek()||"claude",n=_.peek(),s=Qt(t,n),a=te.peek()||"";if(!a){let r=Qe(t,n);r&&s.includes(r)&&(a=r,te.value=r)}let o=['<option value="">effort: off</option>'].concat(s.map(r=>`<option value="${p(r)}" ${r===a?"selected":""}>${p(r)}</option>`));if(e.innerHTML=o.join(""),a&&!s.includes(a)){let r=Qe(t,n);r&&s.includes(r)?(te.value=r,e.value=r):(te.value="",e.value="")}else e.value=a}function et(){let e=i("sel-model");if(!e)return;let t=$.peek()||"claude",n=Oe(t),s=_.peek();if(s&&!n.some(o=>o.value===s)&&(n=[{value:s,label:`${s} \u2605`,custom:!0},...n]),e.innerHTML=n.map(o=>`<option value="${p(o.value)}" ${o.value===s?"selected":""}>${p(o.label)}</option>`).join(""),n.some(o=>o.value===s))e.value=s;else{let o=Be(t)||n[0]?.value;se(o),e.value=o,s=o}let a=i("sel-agent");a&&(a.value=t),Va()}function Ya({editCurrent:e=!1}={}){let t=$.peek()||"claude",n=e&&_.peek()||"",s=e?`Edit model id for ${t}:`:`Add model id for ${t} (saved in this browser):`,a=window.prompt(s,n);if(a==null)return;let o=a.trim();o&&(e&&n&&n!==o&&ra(t).includes(n)&&zo(t,n),Jt(t,o),se(o),et())}function bc(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
475
+ </div>`}async function ts(){try{let e=await x("GET","/api/agents");return Jt.value=e,et(),e}catch(e){return console.warn("[agents] failed to load model list",e),null}}function Xa(){let e=i("sel-effort");if(!e)return;let t=$.peek()||"claude",n=N.peek(),s=Yt(t,n),a=te.peek()||"";if(!a){let r=Qe(t,n);r&&s.includes(r)&&(a=r,te.value=r)}let o=['<option value="">effort: off</option>'].concat(s.map(r=>`<option value="${p(r)}" ${r===a?"selected":""}>${p(r)}</option>`));if(e.innerHTML=o.join(""),a&&!s.includes(a)){let r=Qe(t,n);r&&s.includes(r)?(te.value=r,e.value=r):(te.value="",e.value="")}else e.value=a}function et(){let e=i("sel-model");if(!e)return;let t=$.peek()||"claude",n=Be(t),s=N.peek();if(s&&!n.some(o=>o.value===s)&&(n=[{value:s,label:`${s} \u2605`,custom:!0},...n]),e.innerHTML=n.map(o=>`<option value="${p(o.value)}" ${o.value===s?"selected":""}>${p(o.label)}</option>`).join(""),n.some(o=>o.value===s))e.value=s;else{let o=Oe(t)||n[0]?.value;se(o),e.value=o,s=o}let a=i("sel-agent");a&&(a.value=t),Xa()}function Za({editCurrent:e=!1}={}){let t=$.peek()||"claude",n=e&&N.peek()||"",s=e?`Edit model id for ${t}:`:`Add model id for ${t} (saved in this browser):`,a=window.prompt(s,n);if(a==null)return;let o=a.trim();o&&(e&&n&&n!==o&&ia(t).includes(n)&&Jo(t,n),Vt(t,o),se(o),et())}function xc(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
476
476
  No projects in this range.<br>
477
477
  <span class="text-base-content/30">Try \u201CAll\u201D time or another agent.</span>
478
- </div>`;let t=Cn.value,n=Mn.value,s=!!$e.value.trim(),a=e[0]?.cwd||"(no path)";return e.map(o=>{let r=o.cwd||"(no path)",d=!1;n.has(r)?d=!1:t.has(r)?d=!0:d=s||r===a||e.length<=3;let u=o.machineId?`<span class="text-[9px] font-mono text-base-content/40 flex-shrink-0">@${p(o.machineId)}</span>`:"",l=`
478
+ </div>`;let t=An.value,n=jn.value,s=!!$e.value.trim(),a=e[0]?.cwd||"(no path)";return e.map(o=>{let r=o.cwd||"(no path)",d=!1;n.has(r)?d=!1:t.has(r)?d=!0:d=s||r===a||e.length<=3;let u=o.machineId?`<span class="text-[9px] font-mono text-base-content/40 flex-shrink-0">@${p(o.machineId)}</span>`:"",l=`
479
479
  <div class="project-header px-2.5 py-2 cursor-pointer hover:bg-base-300/80 select-none border-b border-base-300/40"
480
480
  data-folder="${p(r)}" data-project-cwd="${p(o.cwd||"")}" data-project-machine="${p(o.machineId||"")}">
481
481
  <div class="flex items-center gap-1.5">
482
482
  <span class="text-[10px] text-base-content/40 w-3 flex-shrink-0">${d?"\u25BE":"\u25B8"}</span>
483
483
  <span class="text-[12px] font-semibold truncate flex-1" title="${p(o.cwd||"")}">${p(o.projectName)}</span>
484
484
  ${u}
485
- <span class="text-[9px] text-base-content/30 flex-shrink-0">${Pn(o.updatedAt)}</span>
485
+ <span class="text-[9px] text-base-content/30 flex-shrink-0">${qn(o.updatedAt)}</span>
486
486
  </div>
487
- </div>`,m=gp(o.sessions).slice(0,40),g=o.sessions.length>40?`<div class="px-3 py-1 text-[10px] text-base-content/30">+${o.sessions.length-40} more</div>`:"",w=d?`<div class="pb-1 border-b border-base-300/30">${m.map(y=>Gr(y)).join("")}${g}</div>`:"";return l+w}).join("")}function vc(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
487
+ </div>`,m=vp(o.sessions).slice(0,40),g=o.sessions.length>40?`<div class="px-3 py-1 text-[10px] text-base-content/30">+${o.sessions.length-40} more</div>`:"",w=d?`<div class="pb-1 border-b border-base-300/30">${m.map(y=>zr(y)).join("")}${g}</div>`:"";return l+w}).join("")}function yc(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
488
488
  No recent activity.<br>
489
489
  <span class="text-base-content/30">Widen the time range or clear filters.</span>
490
490
  </div>`;let t=new Map;for(let n of e){let a=(n.updatedAt?new Date(n.updatedAt):new Date).toLocaleDateString(void 0,{weekday:"short",month:"short",day:"numeric"});t.has(a)||t.set(a,[]),t.get(a).push(n)}return[...t.entries()].map(([n,s])=>`
491
491
  <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]">${p(n)}</div>
492
- ${s.map(a=>Gr(a,{showProject:!0})).join("")}
493
- `).join("")}function Kr(){let e=ht.value,t=Array.isArray(Dt.value)?Dt.value:[],n=Array.isArray(Vt.value)?Vt.value:[];return(e==="timeline"?vc(t):bc(n))+(Wr?'<button class="btn btn-sm btn-ghost w-full" data-load-more-sessions>\u52A0\u8F7D\u66F4\u591A\u4F1A\u8BDD</button>':"")}function qs(){document.querySelectorAll("[data-view]").forEach(o=>{let r=o.dataset.view===ht.peek();o.classList.toggle("bg-primary/15",r),o.classList.toggle("text-primary",r),o.classList.toggle("font-medium",r),o.classList.toggle("text-base-content/50",!r)}),document.querySelectorAll("[data-agent-filter]").forEach(o=>{o.classList.toggle("active",o.dataset.agentFilter===ye.peek())});let e=i("time-range");e&&e.value!==oa.peek()&&(e.value=oa.peek());let t=i("search-status");if(!t)return;let n=rt.peek(),s=Array.isArray(n?.results)?n.results:null,a=($e.peek()||"").trim();if(gt.peek())t.classList.remove("hidden"),t.textContent="Searching content\u2026";else if(a&&s)t.classList.remove("hidden"),t.textContent=`${s.length} hit${s.length===1?"":"s"}${n.deep===!1?"":" (incl. content)"}`;else if(a)t.classList.remove("hidden"),t.textContent="Local filter only \u2014 type to deep-search";else{let o=Dt.peek(),r=Vt.peek(),d=Array.isArray(o)?o.length:0,u=Array.isArray(r)?r.length:0;t.classList.remove("hidden"),t.textContent=ht.peek()==="projects"?`${u} project${u===1?"":"s"} \xB7 ${d} session${d===1?"":"s"}`:`${d} recent session${d===1?"":"s"}`}}async function Xa(e){let t=(e||"").trim();if(!t){rt.value=null,gt.value=!1;return}gt.value=!0;try{let n=new URLSearchParams({q:t,days:"0",limit:"50",deep:"1"});ye.peek()&&ye.peek()!=="all"&&n.set("agent",ye.peek());let s=await x("GET",`/api/activity?${n}`);$e.peek().trim()===t&&(rt.value={q:t.toLowerCase(),results:s.results||[],deep:!0})}catch(n){$e.peek().trim()===t&&(rt.value={q:t.toLowerCase(),results:[],error:n.message})}finally{gt.value=!1}}function Za(e){clearTimeout(gc);let t=(e||"").trim();if(!t){rt.value=null,gt.value=!1;return}gc=setTimeout(()=>Xa(t),350)}function xc(e){if(!e)return"";if(typeof marked>"u")return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`;try{return Ve(e,{fallback:t=>`<pre class="whitespace-pre-wrap text-xs">${p(t)}</pre>`})}catch{return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`}}async function eo(){let e=i("memory-area");if(e){if(!c.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=c.agent||$.peek()||"claude",n=new URLSearchParams({agent:t}),a=(await x("GET",`/api/sessions/${c.sessionId}/memory?${n}`)).files||[];if(!a.length){e.innerHTML='<div class="p-4 text-base-content/40 text-xs">No memory files available for this agent/session.</div>';return}e.innerHTML=`<div class="p-3 text-[11px] text-base-content/45">${p(t)} \xB7 ${a.length} memory file${a.length===1?"":"s"} \xB7 click to open</div>
494
- <div class="px-3 pb-4 flex flex-col gap-1">${a.map(o=>`<button type="button" class="memory-file text-left px-3 py-2 rounded-lg border border-base-300 hover:border-primary hover:bg-primary/5" data-memory-file="${p(o.id)}" data-memory-agent="${p(t)}"><span class="font-mono text-xs">${p(o.name)}</span><span class="ml-2 text-[10px] text-base-content/40">${p(o.scope||"")}</span></button>`).join("")}<div id="memory-file-content"></div></div>`}catch(t){e.innerHTML=`<div class="p-4 text-error text-xs">${p(t?.message??String(t))}</div>`}}}async function zr(e,t){let n=i("memory-file-content");if(!(!n||!c.sessionId||!e)){n.innerHTML='<div class="p-3 text-xs text-base-content/40">Loading file\u2026</div>';try{let s=new URLSearchParams({agent:t||c.agent||$.peek()||"claude",file:e}),a=await x("GET",`/api/sessions/${c.sessionId}/memory/file?${s}`);n.innerHTML=`<div class="mt-2 border border-base-300 rounded-lg overflow-hidden"><div class="px-3 py-1.5 bg-base-300/50 text-xs font-mono">${p(a.name)}</div><div class="px-3 py-2 md">${xc(a.content)}</div></div>`}catch(s){n.innerHTML=`<div class="mt-2 p-3 text-error text-xs">${p(s?.message??String(s))}</div>`}}}var Ja,Qa,mc,hc,Wr,Fr,gc,It=F(()=>{G();W();le();Cs();_t();en();Ja=200,Qa=1,mc=null,hc=0,Wr=!1,Fr=!1;document.addEventListener("click",e=>{e.target.closest?.("[data-load-more-sessions]")&&bp().catch(console.warn)});gc=null});function yc(e,t){no=e||"",so=t||""}async function wc(e){let t=i("project-notes-bar");if(t)try{let n=await x("GET",`/api/projects/notes?root=${encodeURIComponent(e)}`);no=n.goal||"",so=n.notes||"",ts(),t.style.display="flex"}catch(n){console.error("Error fetching project notes:",n),t.style.display="none"}}function ts(){let e=i("project-notes-bar");if(!e)return;let t=no||"No goal yet \u2014 click Edit",n=so||"";e.innerHTML=`
492
+ ${s.map(a=>zr(a,{showProject:!0})).join("")}
493
+ `).join("")}function Jr(){let e=gt.value,t=Array.isArray(_t.value)?_t.value:[],n=Array.isArray(Xt.value)?Xt.value:[];return(e==="timeline"?yc(t):xc(n))+(Kr?'<button class="btn btn-sm btn-ghost w-full" data-load-more-sessions>\u52A0\u8F7D\u66F4\u591A\u4F1A\u8BDD</button>':"")}function Rs(){document.querySelectorAll("[data-view]").forEach(o=>{let r=o.dataset.view===gt.peek();o.classList.toggle("bg-primary/15",r),o.classList.toggle("text-primary",r),o.classList.toggle("font-medium",r),o.classList.toggle("text-base-content/50",!r)}),document.querySelectorAll("[data-agent-filter]").forEach(o=>{o.classList.toggle("active",o.dataset.agentFilter===ye.peek())});let e=i("time-range");e&&e.value!==ra.peek()&&(e.value=ra.peek());let t=i("search-status");if(!t)return;let n=rt.peek(),s=Array.isArray(n?.results)?n.results:null,a=($e.peek()||"").trim();if(bt.peek())t.classList.remove("hidden"),t.textContent="Searching content\u2026";else if(a&&s)t.classList.remove("hidden"),t.textContent=`${s.length} hit${s.length===1?"":"s"}${n.deep===!1?"":" (incl. content)"}`;else if(a)t.classList.remove("hidden"),t.textContent="Local filter only \u2014 type to deep-search";else{let o=_t.peek(),r=Xt.peek(),d=Array.isArray(o)?o.length:0,u=Array.isArray(r)?r.length:0;t.classList.remove("hidden"),t.textContent=gt.peek()==="projects"?`${u} project${u===1?"":"s"} \xB7 ${d} session${d===1?"":"s"}`:`${d} recent session${d===1?"":"s"}`}}async function eo(e){let t=(e||"").trim();if(!t){rt.value=null,bt.value=!1;return}bt.value=!0;try{let n=new URLSearchParams({q:t,days:"0",limit:"50",deep:"1"});ye.peek()&&ye.peek()!=="all"&&n.set("agent",ye.peek());let s=await x("GET",`/api/activity?${n}`);$e.peek().trim()===t&&(rt.value={q:t.toLowerCase(),results:s.results||[],deep:!0})}catch(n){$e.peek().trim()===t&&(rt.value={q:t.toLowerCase(),results:[],error:n.message})}finally{bt.value=!1}}function to(e){clearTimeout(vc);let t=(e||"").trim();if(!t){rt.value=null,bt.value=!1;return}vc=setTimeout(()=>eo(t),350)}function wc(e){if(!e)return"";if(typeof marked>"u")return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`;try{return Ve(e,{fallback:t=>`<pre class="whitespace-pre-wrap text-xs">${p(t)}</pre>`})}catch{return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`}}async function no(){let e=i("memory-area");if(e){if(!c.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=c.agent||$.peek()||"claude",n=new URLSearchParams({agent:t}),a=(await x("GET",`/api/sessions/${c.sessionId}/memory?${n}`)).files||[];if(!a.length){e.innerHTML='<div class="p-4 text-base-content/40 text-xs">No memory files available for this agent/session.</div>';return}e.innerHTML=`<div class="p-3 text-[11px] text-base-content/45">${p(t)} \xB7 ${a.length} memory file${a.length===1?"":"s"} \xB7 click to open</div>
494
+ <div class="px-3 pb-4 flex flex-col gap-1">${a.map(o=>`<button type="button" class="memory-file text-left px-3 py-2 rounded-lg border border-base-300 hover:border-primary hover:bg-primary/5" data-memory-file="${p(o.id)}" data-memory-agent="${p(t)}"><span class="font-mono text-xs">${p(o.name)}</span><span class="ml-2 text-[10px] text-base-content/40">${p(o.scope||"")}</span></button>`).join("")}<div id="memory-file-content"></div></div>`}catch(t){e.innerHTML=`<div class="p-4 text-error text-xs">${p(t?.message??String(t))}</div>`}}}async function Qr(e,t){let n=i("memory-file-content");if(!(!n||!c.sessionId||!e)){n.innerHTML='<div class="p-3 text-xs text-base-content/40">Loading file\u2026</div>';try{let s=new URLSearchParams({agent:t||c.agent||$.peek()||"claude",file:e}),a=await x("GET",`/api/sessions/${c.sessionId}/memory/file?${s}`);n.innerHTML=`<div class="mt-2 border border-base-300 rounded-lg overflow-hidden"><div class="px-3 py-1.5 bg-base-300/50 text-xs font-mono">${p(a.name)}</div><div class="px-3 py-2 md">${wc(a.content)}</div></div>`}catch(s){n.innerHTML=`<div class="mt-2 p-3 text-error text-xs">${p(s?.message??String(s))}</div>`}}}var Va,Ya,gc,bc,Kr,Gr,vc,Tt=W(()=>{K();G();ce();Ms();Nt();nn();Va=200,Ya=1,gc=null,bc=0,Kr=!1,Gr=!1;document.addEventListener("click",e=>{e.target.closest?.("[data-load-more-sessions]")&&xp().catch(console.warn)});vc=null});function kc(e,t){ao=e||"",oo=t||""}async function $c(e){let t=i("project-notes-bar");if(t)try{let n=await x("GET",`/api/projects/notes?root=${encodeURIComponent(e)}`);ao=n.goal||"",oo=n.notes||"",ns(),t.style.display="flex"}catch(n){console.error("Error fetching project notes:",n),t.style.display="none"}}function ns(){let e=i("project-notes-bar");if(!e)return;let t=ao||"No goal yet \u2014 click Edit",n=oo||"";e.innerHTML=`
495
495
  <div class="flex items-start gap-2 w-full">
496
496
  <div class="flex-1 min-w-0">
497
497
  <div class="truncate">
@@ -502,24 +502,24 @@ ${t}`:"",n.length?n.join(`
502
502
  </div>
503
503
  <button id="btn-edit-project-notes" class="btn btn-ghost btn-xs px-1.5 hover:bg-base-300 flex-shrink-0">Edit</button>
504
504
  </div>
505
- `}function kc(){let e=i("project-notes-bar");e&&(e.innerHTML=`
505
+ `}function Sc(){let e=i("project-notes-bar");e&&(e.innerHTML=`
506
506
  <div class="flex flex-col gap-1.5 w-full">
507
507
  <div class="flex items-center gap-2">
508
508
  <span class="text-[10px] font-bold text-base-content/40 uppercase w-12 flex-shrink-0">Goal</span>
509
509
  <input id="project-goal-input" type="text" class="input input-xs input-bordered flex-1 text-xs"
510
- placeholder="One-line project goal\u2026" value="${p(no)}">
510
+ placeholder="One-line project goal\u2026" value="${p(ao)}">
511
511
  </div>
512
512
  <div class="flex items-start gap-2">
513
513
  <span class="text-[10px] font-bold text-base-content/40 uppercase w-12 flex-shrink-0 mt-1">Notes</span>
514
514
  <textarea id="project-notes-input" rows="2" class="textarea textarea-xs textarea-bordered flex-1 text-xs leading-snug"
515
- placeholder="Longer project notes (stack, links, status\u2026)">${p(so)}</textarea>
515
+ placeholder="Longer project notes (stack, links, status\u2026)">${p(oo)}</textarea>
516
516
  </div>
517
517
  <div class="flex items-center gap-1 justify-end">
518
518
  <button id="btn-save-project-notes" class="btn btn-primary btn-xs px-2">Save</button>
519
519
  <button id="btn-cancel-project-notes" class="btn btn-ghost btn-xs px-2">Cancel</button>
520
520
  </div>
521
521
  </div>
522
- `,i("project-goal-input")?.focus())}async function Rs(){try{let e=await x("GET","/api/sessions/meta");T.value=e||{}}catch(e){console.warn("session meta load failed",e)}}function tt(){let e=i("session-notes-bar");if(!e)return;let t=c.sessionId,n=c.agent||$.peek()||"claude";if(!t){e.style.display="none",e.innerHTML="";return}if(e.querySelector(".session-rename-input"))return;let s=An(n,t),a=(s.notes||"").trim(),o=!!s.favorite,r=!!s.hidden,d=s.branch?.parentSessionId?s.branch:null,l=(s.title||"").trim()||t.slice(0,8);e.style.display="flex",e.innerHTML=`
522
+ `,i("project-goal-input")?.focus())}async function Bs(){try{let e=await x("GET","/api/sessions/meta");T.value=e||{}}catch(e){console.warn("session meta load failed",e)}}function tt(){let e=i("session-notes-bar");if(!e)return;let t=c.sessionId,n=c.agent||$.peek()||"claude";if(!t){e.style.display="none",e.innerHTML="";return}if(e.querySelector(".session-rename-input"))return;let s=Dn(n,t),a=(s.notes||"").trim(),o=!!s.favorite,r=!!s.hidden,d=s.branch?.parentSessionId?s.branch:null,l=(s.title||"").trim()||t.slice(0,8);e.style.display="flex",e.innerHTML=`
523
523
  <div class="flex-1 min-w-0 flex items-center gap-2">
524
524
  <button type="button" class="session-fav-btn ${o?"is-fav":""}" data-fav-toggle="1"
525
525
  data-fav-session-id="${p(t)}" data-fav-session-agent="${p(n)}"
@@ -545,12 +545,12 @@ ${t}`:"",n.length?n.join(`
545
545
  ${d?`<span class="session-branch-current" title="Forked from ${p(d.parentAgent||n)} \xB7 ${p(d.parentSessionId)}">\u2387 from ${p(d.parentSessionId.slice(0,8))}</span>`:""}
546
546
  </div>
547
547
  <button id="btn-edit-session-notes" class="btn btn-ghost btn-xs px-1.5">Note</button>
548
- `}function $c(){let e=i("session-notes-bar");if(!e||!c.sessionId)return;let t=c.agent||$.peek()||"claude",n=An(t,c.sessionId);e.innerHTML=`
548
+ `}function Lc(){let e=i("session-notes-bar");if(!e||!c.sessionId)return;let t=c.agent||$.peek()||"claude",n=Dn(t,c.sessionId);e.innerHTML=`
549
549
  <input id="session-notes-input" type="text" class="input input-xs input-bordered flex-1 text-xs"
550
550
  placeholder="Note for this session\u2026" value="${p(n.notes||"")}">
551
551
  <button id="btn-save-session-notes" class="btn btn-primary btn-xs px-2">Save</button>
552
552
  <button id="btn-cancel-session-notes" class="btn btn-ghost btn-xs px-2">Cancel</button>
553
- `;let s=i("session-notes-input");s?.focus(),s?.select()}function ao(){return{favorite:!1,notes:"",title:"",hidden:!1,branch:null}}function oo(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,branch:t.branch!==void 0?t.branch||null:e.branch||null,updatedAt:Date.now()}}function Sc(e){return!e?.favorite&&!e?.hidden&&!(e?.notes||"").trim()&&!(e?.title||"").trim()&&!e?.branch}async function Lc(e,t,{machineId:n}={}){let s=n||c.machineId||null,a=z(t,e,s),o=T.peek()?.[a]||ao(),r=!o.favorite;T.value={...T.peek(),[a]:{...o,favorite:r,updatedAt:Date.now()}};try{let d=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,favorite:r,machineId:s||void 0},void 0,{machineId:s||void 0});T.value={...T.peek(),[a]:oo(o,{favorite:d.favorite??r,notes:d.notes,title:d.title,hidden:d.hidden})}}catch(d){T.value={...T.peek(),[a]:o},alert(`Favorite failed: ${d.message}`)}c.sessionId===e&&tt()}async function Ec(e,t,{machineId:n}={}){if(!e)return!1;let s=n||c.machineId||null,a=z(t,e,s),o=T.peek()?.[a]||ao(),r=!o.hidden;T.value={...T.peek(),[a]:{...o,hidden:r,updatedAt:Date.now()}};try{let d=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,hidden:r,machineId:s||void 0},void 0,{machineId:s||void 0}),u=oo(o,{favorite:d.favorite,notes:d.notes,title:d.title,hidden:d.hidden??r});if(Sc(u)){let l={...T.peek()};delete l[a],T.value=l}else T.value={...T.peek(),[a]:u}}catch(d){return T.value={...T.peek(),[a]:o},alert(`Hide failed: ${d.message}`),!1}return c.sessionId===e&&tt(),!0}async function Jr(e,t,n,{machineId:s}={}){let a=s||c.machineId||null,o=z(t,e,a),r=T.peek()?.[o]||ao();try{let d=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,notes:n,machineId:a||void 0},void 0,{machineId:a||void 0});T.value={...T.peek(),[o]:oo(r,{favorite:d.favorite,notes:d.notes??n,title:d.title,hidden:d.hidden})}}catch(d){return alert(`Save note failed: ${d.message}`),!1}return!0}async function xp(e,t,n,{machineId:s}={}){if(!e)return!1;let a=s||c.machineId||null,o=z(t,e,a),r=T.peek()?.[o]||ao(),d=String(n||"").trim().slice(0,200);T.value={...T.peek(),[o]:{...r,title:d,updatedAt:Date.now()}};try{let u=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,title:d,machineId:a||void 0},void 0,{machineId:a||void 0}),l=oo(r,{favorite:u.favorite,notes:u.notes,title:u.title!==void 0?u.title:d,hidden:u.hidden});if(Sc(l)){let f={...T.peek()};delete f[o],T.value=f}else T.value={...T.peek(),[o]:l}}catch(u){return T.value={...T.peek(),[o]:r},alert(`Rename failed: ${u.message}`),!1}return c.sessionId===e&&tt(),!0}function Qr({sessionId:e,agent:t="claude",machineId:n=null,fallbackDisplay:s="",mountEl:a}={}){if(!e||!a)return;document.querySelectorAll(".session-rename-input").forEach(g=>{g.dispatchEvent(new CustomEvent("session-rename-cancel",{bubbles:!0}))});let r=(An(t,e,n).title||"").trim()||s||e.slice(0,8),d=a.innerHTML,u=a.className;a.classList.add("session-rename-active"),a.innerHTML=`<input type="text" class="session-rename-input input input-xs input-bordered w-full min-w-0 text-xs font-mono"
553
+ `;let s=i("session-notes-input");s?.focus(),s?.select()}function ro(){return{favorite:!1,notes:"",title:"",hidden:!1,branch:null}}function io(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,branch:t.branch!==void 0?t.branch||null:e.branch||null,updatedAt:Date.now()}}function Ec(e){return!e?.favorite&&!e?.hidden&&!(e?.notes||"").trim()&&!(e?.title||"").trim()&&!e?.branch}async function Ic(e,t,{machineId:n}={}){let s=n||c.machineId||null,a=J(t,e,s),o=T.peek()?.[a]||ro(),r=!o.favorite;T.value={...T.peek(),[a]:{...o,favorite:r,updatedAt:Date.now()}};try{let d=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,favorite:r,machineId:s||void 0},void 0,{machineId:s||void 0});T.value={...T.peek(),[a]:io(o,{favorite:d.favorite??r,notes:d.notes,title:d.title,hidden:d.hidden})}}catch(d){T.value={...T.peek(),[a]:o},alert(`Favorite failed: ${d.message}`)}c.sessionId===e&&tt()}async function Tc(e,t,{machineId:n}={}){if(!e)return!1;let s=n||c.machineId||null,a=J(t,e,s),o=T.peek()?.[a]||ro(),r=!o.hidden;T.value={...T.peek(),[a]:{...o,hidden:r,updatedAt:Date.now()}};try{let d=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,hidden:r,machineId:s||void 0},void 0,{machineId:s||void 0}),u=io(o,{favorite:d.favorite,notes:d.notes,title:d.title,hidden:d.hidden??r});if(Ec(u)){let l={...T.peek()};delete l[a],T.value=l}else T.value={...T.peek(),[a]:u}}catch(d){return T.value={...T.peek(),[a]:o},alert(`Hide failed: ${d.message}`),!1}return c.sessionId===e&&tt(),!0}async function Vr(e,t,n,{machineId:s}={}){let a=s||c.machineId||null,o=J(t,e,a),r=T.peek()?.[o]||ro();try{let d=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,notes:n,machineId:a||void 0},void 0,{machineId:a||void 0});T.value={...T.peek(),[o]:io(r,{favorite:d.favorite,notes:d.notes??n,title:d.title,hidden:d.hidden})}}catch(d){return alert(`Save note failed: ${d.message}`),!1}return!0}async function wp(e,t,n,{machineId:s}={}){if(!e)return!1;let a=s||c.machineId||null,o=J(t,e,a),r=T.peek()?.[o]||ro(),d=String(n||"").trim().slice(0,200);T.value={...T.peek(),[o]:{...r,title:d,updatedAt:Date.now()}};try{let u=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,title:d,machineId:a||void 0},void 0,{machineId:a||void 0}),l=io(r,{favorite:u.favorite,notes:u.notes,title:u.title!==void 0?u.title:d,hidden:u.hidden});if(Ec(l)){let f={...T.peek()};delete f[o],T.value=f}else T.value={...T.peek(),[o]:l}}catch(u){return T.value={...T.peek(),[o]:r},alert(`Rename failed: ${u.message}`),!1}return c.sessionId===e&&tt(),!0}function Yr({sessionId:e,agent:t="claude",machineId:n=null,fallbackDisplay:s="",mountEl:a}={}){if(!e||!a)return;document.querySelectorAll(".session-rename-input").forEach(g=>{g.dispatchEvent(new CustomEvent("session-rename-cancel",{bubbles:!0}))});let r=(Dn(t,e,n).title||"").trim()||s||e.slice(0,8),d=a.innerHTML,u=a.className;a.classList.add("session-rename-active"),a.innerHTML=`<input type="text" class="session-rename-input input input-xs input-bordered w-full min-w-0 text-xs font-mono"
554
554
  value="${p(r)}"
555
555
  placeholder="Session name (empty = original)"
556
556
  maxlength="200"
@@ -558,7 +558,7 @@ ${t}`:"",n.length?n.join(`
558
558
  data-rename-session-id="${p(e)}"
559
559
  data-rename-session-agent="${p(t)}"
560
560
  data-rename-session-machine="${p(n||"")}"
561
- autocomplete="off" spellcheck="false" />`;let l=a.querySelector(".session-rename-input");if(!l)return;let f=!1,m=async g=>{if(f)return;f=!0;let w=g?l.value:r;if(a.className=u,!g){a.innerHTML=d;return}await xp(e,t,w,{machineId:n}),document.querySelectorAll(".session-rename-input").forEach(y=>y.remove()),c.sessionId===e&&tt(),T.value={...T.peek()}};l.addEventListener("keydown",g=>{g.stopPropagation(),g.key==="Enter"?(g.preventDefault(),m(!0)):g.key==="Escape"&&(g.preventDefault(),m(!1))}),l.addEventListener("click",g=>g.stopPropagation()),l.addEventListener("mousedown",g=>g.stopPropagation()),l.addEventListener("session-rename-cancel",()=>m(!1)),l.addEventListener("blur",()=>{setTimeout(()=>m(!0),0)}),requestAnimationFrame(()=>{l.focus(),l.select()})}var no,so,Os=F(()=>{G();W();le();no="",so=""});var Cc={};ls(Cc,{closeMachineMenu:()=>kn,enterMachine:()=>Yr,hideMachinePicker:()=>io,refreshMachinesList:()=>yn,renderMachineMenuList:()=>Bs,renderMachinePickerList:()=>ro,showMachinePicker:()=>wn,startMachinePolling:()=>Vr,syncTopbarMachine:()=>Ot});async function yn(){try{let e=await x("GET","/api/machines");ie.value=Array.isArray(e)?e:[]}catch{try{let e=await da();e?.machines&&(ie.value=e.machines)}catch{}}return ie.peek()||[]}function ro(){let e=i("machine-picker-list"),t=i("machine-picker-empty");if(!e)return;let n=ie.peek()||[];if(!n.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=n.map(s=>{let a=s.online!==!1,o=[s.hostname,s.platform].filter(Boolean).join(" \xB7 ");return`
561
+ autocomplete="off" spellcheck="false" />`;let l=a.querySelector(".session-rename-input");if(!l)return;let f=!1,m=async g=>{if(f)return;f=!0;let w=g?l.value:r;if(a.className=u,!g){a.innerHTML=d;return}await wp(e,t,w,{machineId:n}),document.querySelectorAll(".session-rename-input").forEach(y=>y.remove()),c.sessionId===e&&tt(),T.value={...T.peek()}};l.addEventListener("keydown",g=>{g.stopPropagation(),g.key==="Enter"?(g.preventDefault(),m(!0)):g.key==="Escape"&&(g.preventDefault(),m(!1))}),l.addEventListener("click",g=>g.stopPropagation()),l.addEventListener("mousedown",g=>g.stopPropagation()),l.addEventListener("session-rename-cancel",()=>m(!1)),l.addEventListener("blur",()=>{setTimeout(()=>m(!0),0)}),requestAnimationFrame(()=>{l.focus(),l.select()})}var ao,oo,Os=W(()=>{K();G();ce();ao="",oo=""});var Ac={};cs(Ac,{closeMachineMenu:()=>Sn,enterMachine:()=>Zr,hideMachinePicker:()=>co,refreshMachinesList:()=>kn,renderMachineMenuList:()=>Us,renderMachinePickerList:()=>lo,showMachinePicker:()=>$n,startMachinePolling:()=>Xr,syncTopbarMachine:()=>Ot});async function kn(){try{let e=await x("GET","/api/machines");le.value=Array.isArray(e)?e:[]}catch{try{let e=await ua();e?.machines&&(le.value=e.machines)}catch{}}return le.peek()||[]}function lo(){let e=i("machine-picker-list"),t=i("machine-picker-empty");if(!e)return;let n=le.peek()||[];if(!n.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=n.map(s=>{let a=s.online!==!1,o=[s.hostname,s.platform].filter(Boolean).join(" \xB7 ");return`
562
562
  <button type="button" class="machine-pick-card w-full text-left px-4 py-3 rounded-xl border border-base-300
563
563
  hover:border-primary hover:bg-primary/5 transition-colors ${a?"":"opacity-50"}"
564
564
  data-pick-machine="${p(s.id)}" ${a?"":"disabled"}>
@@ -567,7 +567,7 @@ ${t}`:"",n.length?n.join(`
567
567
  <span class="font-semibold text-sm font-mono">${p(s.id)}</span>
568
568
  </div>
569
569
  ${o?`<div class="text-xs text-base-content/45 mt-1 pl-4">${p(o)}</div>`:""}
570
- </button>`}).join("")}function wn(){let e=i("machine-picker");if(!e)return;e.classList.remove("hidden"),Ee(),it.value=!1,ro();let t=i("machine-picker-status");if(t){let n=(ie.peek()||[]).filter(s=>s.online!==!1).length;t.textContent=`${n} online`}}function io(){i("machine-picker")?.classList.add("hidden"),Ee(),it.value=!0}function kn(){i("machine-menu")?.classList.add("hidden")}function Bs(){let e=i("machine-menu-list"),t=i("machine-menu-empty");if(!e)return;let n=ie.peek()||[],s=D.peek()||"";if(!n.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=n.map(a=>{let o=a.online!==!1,r=a.id===s,d=[a.hostname,a.platform].filter(Boolean).join(" \xB7 "),u=a.connectedAt?new Date(a.connectedAt).toLocaleTimeString():"";return`
570
+ </button>`}).join("")}function $n(){let e=i("machine-picker");if(!e)return;e.classList.remove("hidden"),Ee(),it.value=!1,lo();let t=i("machine-picker-status");if(t){let n=(le.peek()||[]).filter(s=>s.online!==!1).length;t.textContent=`${n} online`}}function co(){i("machine-picker")?.classList.add("hidden"),Ee(),it.value=!0}function Sn(){i("machine-menu")?.classList.add("hidden")}function Us(){let e=i("machine-menu-list"),t=i("machine-menu-empty");if(!e)return;let n=le.peek()||[],s=_.peek()||"";if(!n.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=n.map(a=>{let o=a.online!==!1,r=a.id===s,d=[a.hostname,a.platform].filter(Boolean).join(" \xB7 "),u=a.connectedAt?new Date(a.connectedAt).toLocaleTimeString():"";return`
571
571
  <button type="button"
572
572
  class="machine-menu-item w-full text-left px-2 py-1.5 rounded-md text-xs
573
573
  ${r?"bg-primary/15 text-primary":"hover:bg-base-200"}
@@ -581,8 +581,8 @@ ${t}`:"",n.length?n.join(`
581
581
  <span class="text-[9px] ${o?"text-success":"text-error"}">${o?"online":"offline"}</span>
582
582
  </div>
583
583
  ${d||u?`<div class="text-[10px] text-base-content/40 pl-3.5 mt-0.5 truncate">${p(d)}${u?" \xB7 "+p(u):""}</div>`:""}
584
- </button>`}).join("")}function Ot(){let e=i("machine-menu-wrap"),t=i("topbar-machine-label"),n=i("topbar-machine-dot");if(!M.peek()){e?.classList.add("hidden");return}e?.classList.remove("hidden");let s=D.peek()||"",o=(ie.peek()||[]).find(d=>d.id===s),r=o?o.online!==!1:!1;t&&(t.textContent=s||"\u9009\u62E9\u673A\u5668"),n&&(n.classList.toggle("bg-success",!!s&&r),n.classList.toggle("bg-warning",!!s&&!r),n.classList.toggle("bg-base-content/30",!s)),Bs()}function Vr(){Ic||(Ic=setInterval(async()=>{if(!M.peek()||!c.token)return;await yn(),Ot();let e=D.peek();if(e){let t=(ie.peek()||[]).find(n=>n.id===e);if(t&&t.online===!1){let n=i("topbar-machine-label");n&&(n.textContent=`${e} (offline)`)}}},15e3)),Tc||(Tc=setInterval(()=>{document.visibilityState!=="visible"||!M.peek()||!c.token||!D.peek()||We({waitFresh:!1,hubIndex:!0}).catch(()=>{})},2e3))}async function Yr(e,{forceReload:t=!1}={}){if(!e)return;let n=D.peek(),s=n&&n!==e;if(Le(e),io(),kn(),Ot(),s||t){try{c.ws?.close()}catch{}c.ws=null,c.sessionId=null,xe(()=>{E.value=null,ke.value=null,oe.value=null});try{let{filesRoot:o,gitRoot:r,filesPath:d}=await Promise.resolve().then(()=>(W(),Ni));o.value="",r.value="",d.value=""}catch{}if(s){let{goHome:o}=await Promise.resolve().then(()=>(ns(),Xr));o()}}let a=i("topbar-project");a&&!E.peek()&&(a.textContent=`Machine \xB7 ${e}`),Ns(),await Promise.all([We(),Zn(),Rs(),es().catch(()=>{})]),it.value=!0}var Ic,Tc,Us=F(()=>{G();W();le();It();Os();Ps();Dn();Ic=null,Tc=null});var Xr={};ls(Xr,{goHome:()=>po,openProject:()=>Zr,resumeSession:()=>nt,switchTab:()=>Tt});function uo(e){for(let t of["files-machine-hint","git-machine-hint"]){let n=i(t);n&&(e?(n.textContent=`@${e}`,n.classList.remove("hidden"),n.title=`Paths are on machine ${e}`):(n.textContent="",n.classList.add("hidden"),n.title=""))}}function Zr(e){Fs=null,ga(),Da(!1),Un(),Wn(),Kn(),Gn();let t=e?.path||"";xe(()=>{E.value=e,ke.value=t,t&&(re.value=t,Se.value=t,Y.value="",oe.value=null)}),c.sessionId=null,i("topbar-project").textContent=t||"Project";let n=i("files-root-input");n&&t&&(n.value=t);let s=i("git-root-input");s&&t&&(s.value=t),uo(e?.machineId||D.peek()||c.machineId),i("welcome").classList.add("hidden");let a=i("project-view");a.classList.remove("hidden"),a.style.display="flex",zn(),Fn({sessionId:null}),Pt(),Tt("chat")}function po(){Fs=null,ga(),Da(!1),Un(),Wn(),Kn(),Gn(),E.value=null,ke.value=null,re.value="",Se.value="",Y.value="",oe.value=null,c.sessionId=null,Fn({sessionId:null}),uo(null),document.documentElement.classList.remove("boot-restore");let e=i("topbar-project");e&&(e.textContent="Select a session"),Promise.resolve().then(()=>(As(),Mr)).then(({closeNotes:s})=>s({restore:!1})).catch(()=>{});let t=i("welcome");t&&(t.classList.remove("hidden"),t.style.display="",vn(bn()));let n=i("project-view");n&&(n.classList.add("hidden"),n.style.display="none"),kr("/")}async function nt(e,t,n,s,a,o={}){let r=o.tab&&["chat","files","git","shell","memory"].includes(o.tab)?o.tab:"chat",d=o.skipHistory??(r!=="chat"&&r!=="memory"),u=ne.peek().find(L=>L.sessionId===e&&(!a||L.machineId===a||!L.machineId)),l=Xt(),f=l?.sessionId===e?l:null,m=s||u?.agent||f?.agent||"claude",g=a||u?.machineId||f?.machineId||D.peek()||null,w=t||u?.cwd||f?.cwd||null,y=n||u?.configDir||f?.configDir||null;if(Promise.resolve().then(()=>(As(),Mr)).then(({closeNotes:L})=>L({restore:!1})).catch(()=>{}),Un(),Wn(),Kn(),Gn(),g&&g!==c.machineId){Le(g);try{c.ws?.close()}catch{}c.ws=null,Promise.resolve().then(()=>(Us(),Cc)).then(({syncTopbarMachine:L})=>L()).catch(()=>{}),Promise.resolve().then(()=>(It(),to)).then(({loadAllSessions:L})=>L()).catch(()=>{})}c.sessionId=e,Da(!1),yt({sessionId:e,agent:m,machineId:g}).catch(()=>{}),c.configDir=y,c.agent=m,Ne(m),et(),Fn({sessionId:e,agent:m,machineId:g});let H=w;Mc(H,g,e),H&&x("POST","/api/resolve-path",{path:H},void 0,{machineId:g||void 0}).then(L=>{c.sessionId!==e||!L?.path||L.path===H||(H=L.path,Mc(H,g,e),Qo({sessionId:e,cwd:H}))}).catch(()=>{}),zn(),Pt(),Tt(r),Promise.resolve().then(()=>(It(),to)).then(({markActiveSessionRow:L})=>{L(e,m)}).catch(()=>{}),Qo({sessionId:e,cwd:H||w,configDir:y,agent:m,machineId:g,tab:r}),ic({sessionId:e,cwd:H||w,configDir:y,agent:m,machineId:g,display:u?.display||f?.display||"",projectName:u?.projectName||f?.projectName||"",updatedAt:u?.updatedAt||f?.updatedAt||null});let me=Z[m]||m,J=`${c.token||""}:${g||""}:${m}:${e}`,ue=0,q=0,Q=null,he=(L,ge,be={},ae=!1)=>{if(c.sessionId!==e||c.agent!==m||(c.machineId||null)!==g)return;let Ft=++ue,h=i("messages"),v=!!h.querySelector(".msg-row"),k=h.scrollTop,S=h.scrollHeight,B=!v||h.scrollHeight-h.scrollTop-h.clientHeight<80;if(hl(),be.oldestIndex>0){let R=document.createElement("button");R.className="btn btn-sm btn-ghost",R.textContent="\u52A0\u8F7D\u66F4\u65E9\u7684\u6D88\u606F",R.onclick=async()=>{R.disabled=!0;try{let ve=new URLSearchParams({tail:"80",compact:"1",before:String(be.oldestIndex),agent:m});g&&ve.set("machine",g);let Ke=await x("GET",`/api/sessions/${e}/messages?${ve}`,void 0,void 0,{machineId:g||void 0});if(Ft!==ue||c.sessionId!==e)return;let j=[...Ke.messages,...L],ce={...be,oldestIndex:Ke.oldestIndex,truncated:Ke.oldestIndex>0};Q={msgs:j,context:ge,meta:ce},he(j,ge,ce,!0)}catch(ve){R.disabled=!1,R.textContent=`\u52A0\u8F7D\u5931\u8D25\uFF0C\u70B9\u51FB\u91CD\u8BD5 (${ve.message})`}},i("messages").appendChild(R)}if(be.stale&&C("\u5F53\u524D\u663E\u793A\u79BB\u7EBF\u7F13\u5B58\uFF0C\u6B63\u5728\u7B49\u5F85\u673A\u5668\u6062\u590D\u8FDE\u63A5"),!L.length){C(`${me} \xB7 ${e.slice(0,8)}\u2026 \u2014 no history`),br();return}pt();let U=40,A=0,V=()=>{if(c.sessionId!==e||Ft!==ue)return;let R=Math.min(A+U,L.length);for(;A<R;A++){let j=L[A],ce=O(j.ts??j.timestamp),Wt=j.type||(j.role?"text":null);if(Wt==="text"||j.role&&j.content!=null&&!j.name){(j.role==="assistant"||j.role==="user")&&pt();let Ln=typeof j.content=="string"?j.content:Array.isArray(j.content)?j.content.map(kd=>kd?.text||"").filter(Boolean).join(`
585
- `):String(j.content??"");Ln&&Ht(j.role==="user"?"user":"assistant",j.role==="user"?"You":me,Ln,{ts:ce,historyIndex:(be.oldestIndex||0)+A})}else Wt==="tool_use"||j.name?vr({name:j.name||"tool",input:j.input??j.arguments??{}},{ts:ce}):(Wt==="token_usage"||j.usage)&&(pt(),Bn(j.usage||j))}if(A<L.length){requestAnimationFrame(V);return}pt(),ge&&gr(ge);let ve=L.filter(j=>j.type==="token_usage").length||L.filter(j=>j.role==="user").length,Ke=be.truncated?` (showing last ${L.length} of ${be.total||"?"})`:"";C(`\u2500\u2500 ${me} history \xB7 ${ve} turn${ve!==1?"s":""}${Ke} \u2500\u2500`),br(ae?k+h.scrollHeight-S:B?null:k)};V()},Ae=async({preferCache:L=!0}={})=>{let ge=++q,be=co.get(J)||(L?await Il(J):null);if(!(ge!==q||c.sessionId!==e)){if(L&&be&&be.msgs?.length){let ae=Ts(be);he(ae.msgs,ae.context,ae.meta)}be?.msgs?.length||C(`Loading ${me} history\u2026`);try{let ae=g||D.peek()||c.machineId||null;if(M.peek()&&!ae)throw new Error("\u672A\u9009\u62E9\u673A\u5668\uFF0C\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2");ae&&c.machineId!==ae&&Le(ae);let Ft=async U=>{let A=new URLSearchParams({tail:"80",compact:"1"});return U&&A.set("agent",U),ae&&A.set("machine",ae),x("GET",`/api/sessions/${e}/messages?${A}`,void 0,void 0,{machineId:ae||void 0,dedupe:!1,cache:"no-store"})},h=mr(),v=await Ft(m);if(ge!==q||c.sessionId!==e)return;let k=Array.isArray(v)?v:v?.messages||[];!k.length&&m&&(v=await Ft(null),k=Array.isArray(v)?v:v?.messages||[]);let S=Array.isArray(v)?null:v?.context||null;if(ge!==q||c.sessionId!==e)return;let B=Array.isArray(v)?{}:{truncated:v?.truncated,total:v?.total,oldestIndex:v?.oldestIndex||0,stale:v?.stale};if(Q&&B.oldestIndex>Q.meta.oldestIndex&&Q.meta.oldestIndex>0){let U=B.oldestIndex-Q.meta.oldestIndex;U<=Q.msgs.length&&(k=[...Q.msgs.slice(0,U),...k],B.oldestIndex=Q.meta.oldestIndex)}if(Q={msgs:k,context:S,meta:B},k.length&&!B.stale){let U={msgs:k,context:S,meta:B,at:Date.now()};co.set(J,Ts(U)),Tl(J,U).catch(()=>{})}else co.delete(J);if(h!==mr()||i("messages")?.querySelector(".live-stream"))return;he(k,S,B)}catch(ae){if(c.sessionId!==e||ge!==q)return;co.delete(J),C(`${me} \xB7 ${e.slice(0,8)}\u2026 (history unavailable: ${ae.message})`)}}};Fs={sessionId:e,agent:m,refresh:()=>Ae({preferCache:!1}).catch(()=>{})},d?Ae().catch(()=>{}):(await new Promise(L=>requestAnimationFrame(L)),Ae().catch(()=>{})),Es(),tt()}function Mc(e,t,n){if(e){let s=e.split("/").filter(Boolean).pop()||e;xe(()=>{E.value={id:s,name:s,path:e,machineId:t},ke.value=e,re.value=e,Se.value=e,Y.value="",oe.value=null}),i("topbar-project").textContent=t?`${e} @${t}`:e;let a=i("files-root-input");a&&(a.value=e);let o=i("git-root-input");o&&(o.value=e),uo(t),i("welcome")?.classList.add("hidden");let r=i("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{i("welcome")?.classList.add("hidden");let s=i("project-view");s&&(s.classList.remove("hidden"),s.style.display="flex",s.style.flexDirection="column",s.style.flex="1",s.style.minHeight="0"),uo(t)}}function Tt(e){X.value=e}var Fs,lo,co,ns=F(()=>{G();W();le();Cs();pa();_a();hs();Na();It();Os();Ur();Fs=null,lo=null;document.addEventListener("external-session-updated",({detail:e})=>{let t=Fs;!t||!e||e.sessionId!==t.sessionId||e.agent&&t.agent&&e.agent!==t.agent||(lo&&clearTimeout(lo),lo=setTimeout(()=>{lo=null,Fs?.refresh()},140))});co=new Map});W();W();G();var Vf=aa({cache:!1,dedupe:!0,retry:0});async function Pi(){try{let e=await fetch("/api/hub");if(!e.ok)return M.value=!1,!1;let t=await e.json();if(t?.hub)return M.value=!0,t}catch{}return M.value=!1,!1}G();W();le();var ua=null;async function qi(){if(!ua)return!1;ua.prompt();let e=await ua.userChoice.catch(()=>null);return ua=null,document.getElementById("btn-pwa-install")?.classList.add("hidden"),e?.outcome==="accepted"}Dn();pa();_a();Na();G();le();W();Cs();var Lr=["ANTHROPIC_BASE_URL","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL","CLAUDE_CODE_SUBAGENT_MODEL","CLAUDE_CODE_EFFORT_LEVEL"],cn="claude";function Al(){document.getElementById("root").insertAdjacentHTML("beforeend",qu()),Ru()}function qu(){return`
584
+ </button>`}).join("")}function Ot(){let e=i("machine-menu-wrap"),t=i("topbar-machine-label"),n=i("topbar-machine-dot");if(!M.peek()){e?.classList.add("hidden");return}e?.classList.remove("hidden");let s=_.peek()||"",o=(le.peek()||[]).find(d=>d.id===s),r=o?o.online!==!1:!1;t&&(t.textContent=s||"\u9009\u62E9\u673A\u5668"),n&&(n.classList.toggle("bg-success",!!s&&r),n.classList.toggle("bg-warning",!!s&&!r),n.classList.toggle("bg-base-content/30",!s)),Us()}function Xr(){Cc||(Cc=setInterval(async()=>{if(!M.peek()||!c.token)return;await kn(),Ot();let e=_.peek();if(e){let t=(le.peek()||[]).find(n=>n.id===e);if(t&&t.online===!1){let n=i("topbar-machine-label");n&&(n.textContent=`${e} (offline)`)}}},15e3)),Mc||(Mc=setInterval(()=>{document.visibilityState!=="visible"||!M.peek()||!c.token||!_.peek()||We({waitFresh:!1,hubIndex:!0}).catch(()=>{})},2e3))}async function Zr(e,{forceReload:t=!1}={}){if(!e)return;let n=_.peek(),s=n&&n!==e;if(Le(e),co(),Sn(),Ot(),s||t){try{c.ws?.close()}catch{}c.ws=null,c.sessionId=null,xe(()=>{E.value=null,ke.value=null,re.value=null});try{let{filesRoot:o,gitRoot:r,filesPath:d}=await Promise.resolve().then(()=>(G(),Hi));o.value="",r.value="",d.value=""}catch{}if(s){let{goHome:o}=await Promise.resolve().then(()=>(ss(),ei));o()}}let a=i("topbar-project");a&&!E.peek()&&(a.textContent=`Machine \xB7 ${e}`),Ps(),await Promise.all([We(),es(),Bs(),ts().catch(()=>{})]),it.value=!0}var Cc,Mc,Fs=W(()=>{K();G();ce();Tt();Os();Hs();Nn();Cc=null,Mc=null});var ei={};cs(ei,{goHome:()=>fo,openProject:()=>ti,resumeSession:()=>nt,switchTab:()=>Ct});function po(e){for(let t of["files-machine-hint","git-machine-hint"]){let n=i(t);n&&(e?(n.textContent=`@${e}`,n.classList.remove("hidden"),n.title=`Paths are on machine ${e}`):(n.textContent="",n.classList.add("hidden"),n.title=""))}}function ti(e){Ws=null,ba(),_a(!1),Wn(),Kn(),Jn(),zn();let t=e?.path||"";xe(()=>{E.value=e,ke.value=t,t&&(ie.value=t,Se.value=t,Y.value="",re.value=null)}),c.sessionId=null,i("topbar-project").textContent=t||"Project";let n=i("files-root-input");n&&t&&(n.value=t);let s=i("git-root-input");s&&t&&(s.value=t),po(e?.machineId||_.peek()||c.machineId),i("welcome").classList.add("hidden");let a=i("project-view");a.classList.remove("hidden"),a.style.display="flex",Qn(),Gn({sessionId:null}),Ht(),Ct("chat")}function fo(){Ws=null,ba(),_a(!1),Wn(),Kn(),Jn(),zn(),E.value=null,ke.value=null,ie.value="",Se.value="",Y.value="",re.value=null,c.sessionId=null,Gn({sessionId:null}),po(null),document.documentElement.classList.remove("boot-restore");let e=i("topbar-project");e&&(e.textContent="Select a session"),Promise.resolve().then(()=>(js(),jr)).then(({closeNotes:s})=>s({restore:!1})).catch(()=>{});let t=i("welcome");t&&(t.classList.remove("hidden"),t.style.display="",yn(xn()));let n=i("project-view");n&&(n.classList.add("hidden"),n.style.display="none"),$r("/")}async function nt(e,t,n,s,a,o={}){let r=o.tab&&["chat","files","git","shell","memory"].includes(o.tab)?o.tab:"chat",d=o.skipHistory??(r!=="chat"&&r!=="memory"),u=ne.peek().find(L=>L.sessionId===e&&(!a||L.machineId===a||!L.machineId)),l=en(),f=l?.sessionId===e?l:null,m=s||u?.agent||f?.agent||"claude",g=a||u?.machineId||f?.machineId||_.peek()||null,w=t||u?.cwd||f?.cwd||null,y=n||u?.configDir||f?.configDir||null;if(Promise.resolve().then(()=>(js(),jr)).then(({closeNotes:L})=>L({restore:!1})).catch(()=>{}),Wn(),Kn(),Jn(),zn(),g&&g!==c.machineId){Le(g);try{c.ws?.close()}catch{}c.ws=null,Promise.resolve().then(()=>(Fs(),Ac)).then(({syncTopbarMachine:L})=>L()).catch(()=>{}),Promise.resolve().then(()=>(Tt(),so)).then(({loadAllSessions:L})=>L()).catch(()=>{})}c.sessionId=e,_a(!1),wt({sessionId:e,agent:m,machineId:g}).catch(()=>{}),c.configDir=y,c.agent=m,Ne(m),et(),Gn({sessionId:e,agent:m,machineId:g});let A=w;jc(A,g,e),A&&x("POST","/api/resolve-path",{path:A},void 0,{machineId:g||void 0}).then(L=>{c.sessionId!==e||!L?.path||L.path===A||(A=L.path,jc(A,g,e),Vo({sessionId:e,cwd:A}))}).catch(()=>{}),Qn(),Ht(),Ct(r),Promise.resolve().then(()=>(Tt(),so)).then(({markActiveSessionRow:L})=>{L(e,m)}).catch(()=>{}),Vo({sessionId:e,cwd:A||w,configDir:y,agent:m,machineId:g,tab:r}),cc({sessionId:e,cwd:A||w,configDir:y,agent:m,machineId:g,display:u?.display||f?.display||"",projectName:u?.projectName||f?.projectName||"",updatedAt:u?.updatedAt||f?.updatedAt||null});let ae=Z[m]||m,O=`${c.token||""}:${g||""}:${m}:${e}`,pe=0,q=0,Q=null,he=(L,ge,be={},oe=!1)=>{if(c.sessionId!==e||c.agent!==m||(c.machineId||null)!==g)return;let Gt=++pe,h=i("messages"),v=!!h.querySelector(".msg-row"),k=h.scrollTop,S=h.scrollHeight,U=!v||h.scrollHeight-h.scrollTop-h.clientHeight<80;if(bl(),be.oldestIndex>0){let R=document.createElement("button");R.className="btn btn-sm btn-ghost",R.textContent="\u52A0\u8F7D\u66F4\u65E9\u7684\u6D88\u606F",R.onclick=async()=>{R.disabled=!0;try{let ve=new URLSearchParams({tail:"80",compact:"1",before:String(be.oldestIndex),agent:m});g&&ve.set("machine",g);let Ke=await x("GET",`/api/sessions/${e}/messages?${ve}`,void 0,void 0,{machineId:g||void 0});if(Gt!==pe||c.sessionId!==e)return;let D=[...Ke.messages,...L],de={...be,oldestIndex:Ke.oldestIndex,truncated:Ke.oldestIndex>0};Q={msgs:D,context:ge,meta:de},he(D,ge,de,!0)}catch(ve){R.disabled=!1,R.textContent=`\u52A0\u8F7D\u5931\u8D25\uFF0C\u70B9\u51FB\u91CD\u8BD5 (${ve.message})`}},i("messages").appendChild(R)}if(be.stale&&C("\u5F53\u524D\u663E\u793A\u79BB\u7EBF\u7F13\u5B58\uFF0C\u6B63\u5728\u7B49\u5F85\u673A\u5668\u6062\u590D\u8FDE\u63A5"),!L.length){C(`${ae} \xB7 ${e.slice(0,8)}\u2026 \u2014 no history`),vr();return}pt();let F=40,j=0,V=()=>{if(c.sessionId!==e||Gt!==pe)return;let R=Math.min(j+F,L.length);for(;j<R;j++){let D=L[j],de=B(D.ts??D.timestamp),Kt=D.type||(D.role?"text":null);if(Kt==="text"||D.role&&D.content!=null&&!D.name){(D.role==="assistant"||D.role==="user")&&pt();let In=typeof D.content=="string"?D.content:Array.isArray(D.content)?D.content.map(Sd=>Sd?.text||"").filter(Boolean).join(`
585
+ `):String(D.content??"");In&&qt(D.role==="user"?"user":"assistant",D.role==="user"?"You":ae,In,{ts:de,historyIndex:(be.oldestIndex||0)+j})}else Kt==="tool_use"||D.name?xr({name:D.name||"tool",input:D.input??D.arguments??{}},{ts:de}):(Kt==="token_usage"||D.usage)&&(pt(),Fn(D.usage||D))}if(j<L.length){requestAnimationFrame(V);return}pt(),ge&&br(ge);let ve=L.filter(D=>D.type==="token_usage").length||L.filter(D=>D.role==="user").length,Ke=be.truncated?` (showing last ${L.length} of ${be.total||"?"})`:"";C(`\u2500\u2500 ${ae} history \xB7 ${ve} turn${ve!==1?"s":""}${Ke} \u2500\u2500`),vr(oe?k+h.scrollHeight-S:U?null:k)};V()},Ae=async({preferCache:L=!0}={})=>{let ge=++q,be=Ut.get(O)||(L?await Cl(O):null);if(!(ge!==q||c.sessionId!==e)){if(L&&be&&be.msgs?.length){let oe=Cs(be);he(oe.msgs,oe.context,oe.meta)}be?.msgs?.length||C(`Loading ${ae} history\u2026`);try{let oe=g||_.peek()||c.machineId||null;if(M.peek()&&!oe)throw new Error("\u672A\u9009\u62E9\u673A\u5668\uFF0C\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2");oe&&c.machineId!==oe&&Le(oe);let Gt=async F=>{let j=new URLSearchParams({tail:"80",compact:"1"});return F&&j.set("agent",F),oe&&j.set("machine",oe),x("GET",`/api/sessions/${e}/messages?${j}`,void 0,void 0,{machineId:oe||void 0,dedupe:!1,cache:"no-store"})},h=hr(),v=await Gt(m);if(ge!==q||c.sessionId!==e)return;let k=Array.isArray(v)?v:v?.messages||[];!k.length&&m&&(v=await Gt(null),k=Array.isArray(v)?v:v?.messages||[]);let S=Array.isArray(v)?null:v?.context||null;if(ge!==q||c.sessionId!==e)return;let U=Array.isArray(v)?{}:{truncated:v?.truncated,total:v?.total,oldestIndex:v?.oldestIndex||0,stale:v?.stale};if(Q&&U.oldestIndex>Q.meta.oldestIndex&&Q.meta.oldestIndex>0){let F=U.oldestIndex-Q.meta.oldestIndex;F<=Q.msgs.length&&(k=[...Q.msgs.slice(0,F),...k],U.oldestIndex=Q.meta.oldestIndex)}if(Q={msgs:k,context:S,meta:U},k.length&&!U.stale){let F={msgs:k,context:S,meta:U,at:Date.now()};for(Ut.delete(O),Ut.set(O,Cs(F));Ut.size>24;)Ut.delete(Ut.keys().next().value);Ml(O,F).catch(()=>{})}else Ut.delete(O);if(h!==hr()||i("messages")?.querySelector(".live-stream"))return;he(k,S,U)}catch(oe){if(c.sessionId!==e||ge!==q)return;Ut.delete(O),C(`${ae} \xB7 ${e.slice(0,8)}\u2026 (history unavailable: ${oe.message})`)}}};Ws={sessionId:e,agent:m,refresh:()=>Ae({preferCache:!1}).catch(()=>{})},d?Ae().catch(()=>{}):(await new Promise(L=>requestAnimationFrame(L)),Ae().catch(()=>{})),Is(),tt()}function jc(e,t,n){if(e){let s=e.split("/").filter(Boolean).pop()||e;xe(()=>{E.value={id:s,name:s,path:e,machineId:t},ke.value=e,ie.value=e,Se.value=e,Y.value="",re.value=null}),i("topbar-project").textContent=t?`${e} @${t}`:e;let a=i("files-root-input");a&&(a.value=e);let o=i("git-root-input");o&&(o.value=e),po(t),i("welcome")?.classList.add("hidden");let r=i("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{i("welcome")?.classList.add("hidden");let s=i("project-view");s&&(s.classList.remove("hidden"),s.style.display="flex",s.style.flexDirection="column",s.style.flex="1",s.style.minHeight="0"),po(t)}}function Ct(e){X.value=e}var Ws,uo,Ut,ss=W(()=>{K();G();ce();Ms();fa();Na();gs();Pa();Tt();Os();Wr();Ws=null,uo=null;document.addEventListener("external-session-updated",({detail:e})=>{let t=Ws;!t||!e||e.sessionId!==t.sessionId||e.agent&&t.agent&&e.agent!==t.agent||(uo&&clearTimeout(uo),uo=setTimeout(()=>{uo=null,Ws?.refresh()},140))});Ut=new Map});G();G();K();var Xf=oa({cache:!1,dedupe:!0,retry:0});async function qi(){try{let e=await fetch("/api/hub");if(!e.ok)return M.value=!1,!1;let t=await e.json();if(t?.hub)return M.value=!0,t}catch{}return M.value=!1,!1}K();G();ce();var pa=null;async function Bi(){if(!pa)return!1;pa.prompt();let e=await pa.userChoice.catch(()=>null);return pa=null,document.getElementById("btn-pwa-install")?.classList.add("hidden"),e?.outcome==="accepted"}Nn();fa();Na();Pa();K();ce();G();Ms();var Ir=["ANTHROPIC_BASE_URL","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL","CLAUDE_CODE_SUBAGENT_MODEL","CLAUDE_CODE_EFFORT_LEVEL"],un="claude";function Dl(){document.getElementById("root").insertAdjacentHTML("beforeend",Bu()),Ou()}function Bu(){return`
586
586
  <div id="settings-page" class="set-page" hidden>
587
587
  <header class="set-island">
588
588
  <button type="button" id="set-back" class="btn btn-ghost btn-sm px-2" aria-label="\u8FD4\u56DE">\u2190</button>
@@ -612,7 +612,7 @@ ${t}`:"",n.length?n.join(`
612
612
  <div class="label py-1"><span class="label-text text-xs uppercase tracking-wide">Profile</span></div>
613
613
  <select id="ae-profile" class="select select-bordered select-sm"></select>
614
614
  </label>
615
- <div class="set-fields">${Lr.map(t=>`<label class="form-control"><div class="label py-1"><span class="label-text text-xs font-mono">${p(t)}</span></div><input id="ae-${t}" class="input input-bordered input-sm font-mono text-xs" autocomplete="off" spellcheck="false"></label>`).join("")}</div>
615
+ <div class="set-fields">${Ir.map(t=>`<label class="form-control"><div class="label py-1"><span class="label-text text-xs font-mono">${p(t)}</span></div><input id="ae-${t}" class="input input-bordered input-sm font-mono text-xs" autocomplete="off" spellcheck="false"></label>`).join("")}</div>
616
616
  <p id="claude-env-error" class="text-error text-xs mt-2 hidden"></p>
617
617
  <button type="button" id="claude-env-save" class="btn btn-primary btn-sm mt-4">Save profile</button>
618
618
  </section>
@@ -682,20 +682,20 @@ ${t}`:"",n.length?n.join(`
682
682
  </section>
683
683
  </div>
684
684
  </div>
685
- </div>`}function Ru(){i("quota-refresh")?.addEventListener("click",Sr),i("quota-profile")?.addEventListener("change",Sr),i("set-back")?.addEventListener("click",Ml),document.querySelectorAll("[data-set-sec]").forEach(e=>{e.addEventListener("click",()=>Ha(e.dataset.setSec))}),i("ws-add-btn")?.addEventListener("click",$r),i("ws-new-name")?.addEventListener("keydown",e=>{e.key==="Enter"&&$r()}),i("ws-new-dir")?.addEventListener("keydown",e=>{e.key==="Enter"&&$r()}),i("mcp-token-generate")?.addEventListener("click",Gu),i("mcp-token-copy")?.addEventListener("click",Ku),i("claude-env-save")?.addEventListener("click",Uu),i("ae-profile")?.addEventListener("change",()=>{Ms()}),i("user-add-btn")?.addEventListener("click",Fu),i("pw-save")?.addEventListener("click",Wu),document.addEventListener("router:settings",()=>qa()),document.addEventListener("router:home",()=>{Ou()&&Ml()})}function Ha(e){cn=e||"claude",document.querySelectorAll("[data-set-sec]").forEach(t=>t.classList.toggle("is-on",t.dataset.setSec===cn)),document.querySelectorAll("[data-set-panel]").forEach(t=>{t.hidden=t.dataset.setPanel!==cn}),cn==="quota"&&Sr()}var Cl=0;async function Sr(){let e=++Cl,t=i("quota-list");if(!t)return;t.textContent="\u6B63\u5728\u8BFB\u53D6\u5F53\u524D\u673A\u5668\u7684\u989D\u5EA6\u2026";let n=D.peek(),s=i("quota-profile"),a=s?.value||"";if(s&&(s.innerHTML='<option value="">Claude \u9ED8\u8BA4\u8D26\u53F7</option>'+(pe.peek()||[]).map(r=>`<option value="${p(r.configDir)}">${p(r.name||r.configDir)}</option>`).join(""),s.value=a),M.peek()&&!n){t.textContent="\u8BF7\u5148\u9009\u62E9\u673A\u5668";return}let o=await Promise.all(["claude","grok","codex"].map(async r=>{let d=new URLSearchParams({agent:r});r==="claude"&&s?.value&&d.set("configDir",s.value);try{return await x("GET",`/api/agents/quota?${d}`,void 0,void 0,{machineId:n||void 0})}catch(u){return{agent:r,meters:[],message:u.message}}}));e!==Cl||n!==D.peek()||(t.innerHTML=o.map(r=>`<div class="border border-base-300 rounded-lg p-4 mb-3">
685
+ </div>`}function Ou(){i("quota-refresh")?.addEventListener("click",Er),i("quota-profile")?.addEventListener("change",Er),i("set-back")?.addEventListener("click",jl),document.querySelectorAll("[data-set-sec]").forEach(e=>{e.addEventListener("click",()=>Ra(e.dataset.setSec))}),i("ws-add-btn")?.addEventListener("click",Lr),i("ws-new-name")?.addEventListener("keydown",e=>{e.key==="Enter"&&Lr()}),i("ws-new-dir")?.addEventListener("keydown",e=>{e.key==="Enter"&&Lr()}),i("mcp-token-generate")?.addEventListener("click",zu),i("mcp-token-copy")?.addEventListener("click",Ju),i("claude-env-save")?.addEventListener("click",Wu),i("ae-profile")?.addEventListener("change",()=>{As()}),i("user-add-btn")?.addEventListener("click",Gu),i("pw-save")?.addEventListener("click",Ku),document.addEventListener("router:settings",()=>Ba()),document.addEventListener("router:home",()=>{Uu()&&jl()})}function Ra(e){un=e||"claude",document.querySelectorAll("[data-set-sec]").forEach(t=>t.classList.toggle("is-on",t.dataset.setSec===un)),document.querySelectorAll("[data-set-panel]").forEach(t=>{t.hidden=t.dataset.setPanel!==un}),un==="quota"&&Er()}var Al=0;async function Er(){let e=++Al,t=i("quota-list");if(!t)return;t.textContent="\u6B63\u5728\u8BFB\u53D6\u5F53\u524D\u673A\u5668\u7684\u989D\u5EA6\u2026";let n=_.peek(),s=i("quota-profile"),a=s?.value||"";if(s&&(s.innerHTML='<option value="">Claude \u9ED8\u8BA4\u8D26\u53F7</option>'+(fe.peek()||[]).map(r=>`<option value="${p(r.configDir)}">${p(r.name||r.configDir)}</option>`).join(""),s.value=a),M.peek()&&!n){t.textContent="\u8BF7\u5148\u9009\u62E9\u673A\u5668";return}let o=await Promise.all(["claude","grok","codex"].map(async r=>{let d=new URLSearchParams({agent:r});r==="claude"&&s?.value&&d.set("configDir",s.value);try{return await x("GET",`/api/agents/quota?${d}`,void 0,void 0,{machineId:n||void 0})}catch(u){return{agent:r,meters:[],message:u.message}}}));e!==Al||n!==_.peek()||(t.innerHTML=o.map(r=>`<div class="border border-base-300 rounded-lg p-4 mb-3">
686
686
  <h3 class="font-semibold">${p(r.agent)} ${p(r.plan||"")}</h3>
687
687
  ${(r.meters||[]).map(d=>`<div class="mt-3"><div class="text-sm">${p(d.label)} \xB7 \u5DF2\u7528 ${p(d.usedPercent)}% \xB7 \u5269\u4F59 ${p(d.remainingPercent)}%</div>
688
688
  <progress class="progress progress-primary w-full" max="100" value="${Number(d.usedPercent)}"></progress>
689
689
  ${d.resetsAt?`<div class="text-xs opacity-60">\u91CD\u7F6E\uFF1A${p(new Date(d.resetsAt).toLocaleString())}</div>`:""}</div>`).join("")||`<p class="text-sm opacity-60 mt-2">${p(r.message||"\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u989D\u5EA6")}</p>`}
690
690
  ${r.fetchedAt?`<div class="text-xs opacity-50 mt-2">\u66F4\u65B0\u4E8E ${p(new Date(r.fetchedAt).toLocaleString())}</div>`:""}
691
- </div>`).join(""))}function qa(e){let t=i("settings-page");if(!t)return;t.hidden=!1,document.documentElement.classList.add("settings-open"),Ha(e||cn||"claude"),Er(),Ir(),Ms(),jl(),(i("mcp-token-settings")||document.querySelector('[data-set-panel="mcp"]'))&&!M.peek()&&document.querySelector('[data-set-sec="mcp"]')?.classList.add("hidden"),(location.hash||"")!=="#/settings"&&(location.hash="/settings")}function Ml(){let e=i("settings-page");e&&(e.hidden=!0),document.documentElement.classList.remove("settings-open"),(location.hash||"")==="#/settings"&&(location.hash="")}function Ou(){return!i("settings-page")?.hidden}function Er(){let e=i("ws-list");if(!e)return;let t=pe.peek()||[];if(!t.length){e.innerHTML='<div class="text-xs text-base-content/40">\u8FD8\u6CA1\u6709 workspace</div>';return}e.innerHTML=t.map((n,s)=>`
691
+ </div>`).join(""))}function Ba(e){let t=i("settings-page");if(!t)return;t.hidden=!1,document.documentElement.classList.add("settings-open"),Ra(e||un||"claude"),Tr(),Cr(),As(),_l(),(i("mcp-token-settings")||document.querySelector('[data-set-panel="mcp"]'))&&!M.peek()&&document.querySelector('[data-set-sec="mcp"]')?.classList.add("hidden"),(location.hash||"")!=="#/settings"&&(location.hash="/settings")}function jl(){let e=i("settings-page");e&&(e.hidden=!0),document.documentElement.classList.remove("settings-open"),(location.hash||"")==="#/settings"&&(location.hash="")}function Uu(){return!i("settings-page")?.hidden}function Tr(){let e=i("ws-list");if(!e)return;let t=fe.peek()||[];if(!t.length){e.innerHTML='<div class="text-xs text-base-content/40">\u8FD8\u6CA1\u6709 workspace</div>';return}e.innerHTML=t.map((n,s)=>`
692
692
  <div class="set-row" style="--index:${s}">
693
693
  <div class="set-row-body">
694
694
  <div class="text-sm font-medium">${p(n.name)}</div>
695
695
  <div class="text-xs font-mono text-base-content/50">${p(n.configDir)}</div>
696
696
  </div>
697
697
  ${t.length>1?`<button type="button" class="btn btn-ghost btn-xs" data-ws-delete="${p(n.id)}">Remove</button>`:'<span class="text-xs text-base-content/40">default</span>'}
698
- </div>`).join(""),e.querySelectorAll("[data-ws-delete]").forEach(n=>{n.addEventListener("click",()=>Bu(n.dataset.wsDelete))})}function Ir(e){let t=i("ae-profile");if(!t)return;let n=e??t.value,s=pe.peek()||[],a=[...new Set(s.map(o=>o.name).filter(Boolean))];t.innerHTML='<option value="">Default</option>'+a.map(o=>`<option value="${p(o)}">${p(o)}</option>`).join(""),[...t.options].some(o=>o.value===n)?t.value=n:t.value=""}async function $r(){let e=i("ws-new-name").value.trim(),t=i("ws-new-dir").value.trim(),n=i("ws-error");if(n.classList.add("hidden"),!e||!t){n.textContent="\u9700\u8981 name \u548C\u8DEF\u5F84",n.classList.remove("hidden");return}try{let s=await x("POST","/api/workspaces",{name:e,configDir:t}),a=[...(pe.peek()||[]).filter(o=>o.id!==s.id),s];pe.value=a,Is(a),i("ws-new-name").value="",i("ws-new-dir").value="",Er(),Ir(s.name),await Ms(),Ha("claude")}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}async function Bu(e){try{await x("DELETE",`/api/workspaces/${e}`);let t=(pe.peek()||[]).filter(n=>n.id!==e);pe.value=t,Is(t),Er(),Ir(""),await Ms()}catch(t){let n=i("ws-error");n&&(n.textContent=t.message,n.classList.remove("hidden"))}}async function Ms(){try{let e=i("ae-profile")?.value||"",t=e?`?name=${encodeURIComponent(e)}`:"",n=await x("GET",`/api/agent-env${t}`),s=n.env||{},a=e?{}:n.process||{};for(let o of Lr){let r=i(`ae-${o}`);if(!r)continue;let d=s[o]??a[o];d&&typeof d=="object"&&d.set?(r.placeholder=`saved ${d.preview||"\u2022\u2022\u2022\u2022"}`,r.value="",r.dataset.keep="1"):(r.value=typeof d=="string"?d:"",r.placeholder=o,r.dataset.keep="")}}catch{}}async function Uu(){let e=i("claude-env-error");e?.classList.add("hidden");let t={};for(let n of Lr){let s=i(`ae-${n}`);if(!s)continue;let a=s.value.trim();a?t[n]=a:s.dataset.keep==="1"?t[n]={set:!0}:t[n]=""}try{let n=i("ae-profile")?.value||"";await x("PUT","/api/agent-env",{name:n,env:t}),await Ms()}catch(n){e&&(e.textContent=n.message,e.classList.remove("hidden"))}}async function jl(){let e=i("set-nav-users"),t=document.querySelector('[data-set-panel="users"]');try{let n=await x("GET","/api/collab/me"),s=n.role==="admin"||n.role==="owner";if(e?.classList.toggle("hidden",!s),t&&(t.hidden=!s||cn!=="users"),!s){cn==="users"&&Ha("claude");return}let a=await x("GET","/api/collab/users"),o=i("users-list"),r=Array.isArray(a)?a:[];o.innerHTML=r.map(d=>`<div class="set-row"><div class="text-sm font-medium flex-1">${p(d.username)}</div><div class="text-xs text-base-content/50">${p(d.role||"")}</div></div>`).join("")||'<div class="text-xs text-base-content/40">\u8FD8\u6CA1\u6709\u5176\u4ED6\u7528\u6237</div>'}catch{e?.classList.add("hidden")}}async function Fu(){let e=i("users-error");e?.classList.add("hidden");let t=i("user-new-name")?.value.trim(),n=i("user-new-pass")?.value||"",s=i("user-new-role")?.value||"editor";if(!t||!n){e&&(e.textContent="\u9700\u8981\u7528\u6237\u540D\u548C\u5BC6\u7801",e.classList.remove("hidden"));return}try{await x("POST","/api/collab/users",{username:t,password:n,role:s}),i("user-new-name").value="",i("user-new-pass").value="",await jl()}catch(a){e&&(e.textContent=a.message,e.classList.remove("hidden"))}}async function Wu(){let e=i("pw-error");e?.classList.add("hidden");let t=i("pw-current")?.value||"",n=i("pw-next")?.value||"",s=i("pw-next2")?.value||"";if(n!==s){e&&(e.textContent="\u4E24\u6B21\u65B0\u5BC6\u7801\u4E0D\u4E00\u81F4",e.classList.remove("hidden"));return}try{await x("POST","/api/auth/password",{current:t,next:n}),i("pw-current").value="",i("pw-next").value="",i("pw-next2").value=""}catch(a){e&&(e.textContent=a.message,e.classList.remove("hidden"))}}async function Gu(){let e=i("mcp-token-result"),t=i("mcp-token-error");e?.classList.add("hidden"),t?.classList.add("hidden");let n=D.peek();if(!n){t.textContent="\u8BF7\u5148\u5728\u4E3B\u754C\u9762\u9009\u4E00\u53F0\u5728\u7EBF\u673A\u5668\u3002",t.classList.remove("hidden");return}try{let s=Number(i("mcp-token-expiry").value),a=await x("POST",`/api/mcp/tokens?machine=${encodeURIComponent(n)}`,{expiresInSeconds:s});i("mcp-token-value").value=a.token||"";let o=i("mcp-token-url");o&&(o.textContent=`${location.origin}/mcp`),e.classList.remove("hidden")}catch(s){t.textContent=s.message,t.classList.remove("hidden")}}async function Ku(){let e=i("mcp-token-value")?.value;if(e)try{await navigator.clipboard.writeText(e)}catch{i("mcp-token-value")?.select(),document.execCommand("copy")}}As();Ps();ya();W();var Zl=()=>`
698
+ </div>`).join(""),e.querySelectorAll("[data-ws-delete]").forEach(n=>{n.addEventListener("click",()=>Fu(n.dataset.wsDelete))})}function Cr(e){let t=i("ae-profile");if(!t)return;let n=e??t.value,s=fe.peek()||[],a=[...new Set(s.map(o=>o.name).filter(Boolean))];t.innerHTML='<option value="">Default</option>'+a.map(o=>`<option value="${p(o)}">${p(o)}</option>`).join(""),[...t.options].some(o=>o.value===n)?t.value=n:t.value=""}async function Lr(){let e=i("ws-new-name").value.trim(),t=i("ws-new-dir").value.trim(),n=i("ws-error");if(n.classList.add("hidden"),!e||!t){n.textContent="\u9700\u8981 name \u548C\u8DEF\u5F84",n.classList.remove("hidden");return}try{let s=await x("POST","/api/workspaces",{name:e,configDir:t}),a=[...(fe.peek()||[]).filter(o=>o.id!==s.id),s];fe.value=a,Ts(a),i("ws-new-name").value="",i("ws-new-dir").value="",Tr(),Cr(s.name),await As(),Ra("claude")}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}async function Fu(e){try{await x("DELETE",`/api/workspaces/${e}`);let t=(fe.peek()||[]).filter(n=>n.id!==e);fe.value=t,Ts(t),Tr(),Cr(""),await As()}catch(t){let n=i("ws-error");n&&(n.textContent=t.message,n.classList.remove("hidden"))}}async function As(){try{let e=i("ae-profile")?.value||"",t=e?`?name=${encodeURIComponent(e)}`:"",n=await x("GET",`/api/agent-env${t}`),s=n.env||{},a=e?{}:n.process||{};for(let o of Ir){let r=i(`ae-${o}`);if(!r)continue;let d=s[o]??a[o];d&&typeof d=="object"&&d.set?(r.placeholder=`saved ${d.preview||"\u2022\u2022\u2022\u2022"}`,r.value="",r.dataset.keep="1"):(r.value=typeof d=="string"?d:"",r.placeholder=o,r.dataset.keep="")}}catch{}}async function Wu(){let e=i("claude-env-error");e?.classList.add("hidden");let t={};for(let n of Ir){let s=i(`ae-${n}`);if(!s)continue;let a=s.value.trim();a?t[n]=a:s.dataset.keep==="1"?t[n]={set:!0}:t[n]=""}try{let n=i("ae-profile")?.value||"";await x("PUT","/api/agent-env",{name:n,env:t}),await As()}catch(n){e&&(e.textContent=n.message,e.classList.remove("hidden"))}}async function _l(){let e=i("set-nav-users"),t=document.querySelector('[data-set-panel="users"]');try{let n=await x("GET","/api/collab/me"),s=n.role==="admin"||n.role==="owner";if(e?.classList.toggle("hidden",!s),t&&(t.hidden=!s||un!=="users"),!s){un==="users"&&Ra("claude");return}let a=await x("GET","/api/collab/users"),o=i("users-list"),r=Array.isArray(a)?a:[];o.innerHTML=r.map(d=>`<div class="set-row"><div class="text-sm font-medium flex-1">${p(d.username)}</div><div class="text-xs text-base-content/50">${p(d.role||"")}</div></div>`).join("")||'<div class="text-xs text-base-content/40">\u8FD8\u6CA1\u6709\u5176\u4ED6\u7528\u6237</div>'}catch{e?.classList.add("hidden")}}async function Gu(){let e=i("users-error");e?.classList.add("hidden");let t=i("user-new-name")?.value.trim(),n=i("user-new-pass")?.value||"",s=i("user-new-role")?.value||"editor";if(!t||!n){e&&(e.textContent="\u9700\u8981\u7528\u6237\u540D\u548C\u5BC6\u7801",e.classList.remove("hidden"));return}try{await x("POST","/api/collab/users",{username:t,password:n,role:s}),i("user-new-name").value="",i("user-new-pass").value="",await _l()}catch(a){e&&(e.textContent=a.message,e.classList.remove("hidden"))}}async function Ku(){let e=i("pw-error");e?.classList.add("hidden");let t=i("pw-current")?.value||"",n=i("pw-next")?.value||"",s=i("pw-next2")?.value||"";if(n!==s){e&&(e.textContent="\u4E24\u6B21\u65B0\u5BC6\u7801\u4E0D\u4E00\u81F4",e.classList.remove("hidden"));return}try{await x("POST","/api/auth/password",{current:t,next:n}),i("pw-current").value="",i("pw-next").value="",i("pw-next2").value=""}catch(a){e&&(e.textContent=a.message,e.classList.remove("hidden"))}}async function zu(){let e=i("mcp-token-result"),t=i("mcp-token-error");e?.classList.add("hidden"),t?.classList.add("hidden");let n=_.peek();if(!n){t.textContent="\u8BF7\u5148\u5728\u4E3B\u754C\u9762\u9009\u4E00\u53F0\u5728\u7EBF\u673A\u5668\u3002",t.classList.remove("hidden");return}try{let s=Number(i("mcp-token-expiry").value),a=await x("POST",`/api/mcp/tokens?machine=${encodeURIComponent(n)}`,{expiresInSeconds:s});i("mcp-token-value").value=a.token||"";let o=i("mcp-token-url");o&&(o.textContent=`${location.origin}/mcp`),e.classList.remove("hidden")}catch(s){t.textContent=s.message,t.classList.remove("hidden")}}async function Ju(){let e=i("mcp-token-value")?.value;if(e)try{await navigator.clipboard.writeText(e)}catch{i("mcp-token-value")?.select(),document.execCommand("copy")}}js();Hs();wa();G();var tc=()=>`
699
699
  <div id="auth-screen" class="${c.token?"hidden":""} flex items-center justify-center h-full p-4" ${c.token?'style="display:none"':""}>
700
700
  <div class="card bg-base-200 border border-base-300 w-full max-w-sm shadow-xl">
701
701
  <div class="card-body gap-3 p-8">
@@ -716,7 +716,7 @@ ${t}`:"",n.length?n.join(`
716
716
  <div id="auth-error" class="alert alert-error text-xs py-2 hidden"></div>
717
717
  </div>
718
718
  </div>
719
- </div>`,ec=(e={})=>{let t=!!e.restoreSession,n=c.token?"":"hidden",s=c.token?"display:flex":"display:none";return`
719
+ </div>`,nc=(e={})=>{let t=!!e.restoreSession,n=c.token?"":"hidden",s=c.token?"display:flex":"display:none";return`
720
720
  <div id="sidebar-overlay" class="hidden fixed inset-0 bg-black/50 z-[9]" aria-hidden="true"></div>
721
721
  <div id="app" class="${n} flex-col flex-1 overflow-hidden" style="${s}">
722
722
  <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">
@@ -1120,7 +1120,7 @@ ${t}`:"",n.length?n.join(`
1120
1120
  </div>
1121
1121
  </div>
1122
1122
  <form method="dialog" class="modal-backdrop"><button>close</button></form>
1123
- </dialog>`};Ur();It();ns();G();W();le();hs();Cs();pa();It();Os();Ps();ns();Us();Dn();async function fo(e={}){i("auth-screen").style.display="none";let t=i("app");t.classList.remove("hidden"),t.style.display="flex",queueMicrotask(Ee),zi().catch(()=>{});let n=e.hub;n===void 0?n=await da():n?(M.value=!0,n.machines&&(ie.value=n.machines)):M.value=!1;let s=e.deepLink||null,a=Xt();if(!!(s?.id||(location.hash||"").startsWith("#/session/"))){let d=i("welcome");d&&(d.classList.add("hidden"),d.style.display="none");let u=i("project-view");u&&(u.classList.remove("hidden"),u.style.display="flex",u.style.flexDirection="column",u.style.flex="1",u.style.minHeight="0")}if(M.peek()){let d=localStorage.getItem("machineId")||a?.machineId||"";d&&(Le(d),io(),it.value=!0,Ns());let u=yn().then(m=>(Ot(),d&&!m.some(w=>w.id===d&&w.online!==!1)&&m.length&&(m.some(y=>y.id===d)||(Le(null),wn())),m));Vr(),Ot();let l=Promise.all([We({waitFresh:!1}),Zn({waitFresh:!1}),Rs().catch(()=>{}),es().catch(()=>{})]);if(s?.id){let m=ne.peek().find(g=>g.sessionId===s.id)||(a?.sessionId===s.id?a:null);await nt(s.id,m?.cwd||null,m?.configDir||null,s.agent||m?.agent||null,s.machineId||m?.machineId||d||null,{tab:s.tab||"chat"}),u.catch(()=>{}),l.catch(()=>{});return}if(!d){if(await u,!(ie.peek()||[]).length){wn(),l.catch(()=>{});return}wn(),l.catch(()=>{});return}await l;let f=i("topbar-project");f&&f.textContent==="Select a session"&&(f.textContent=`Machine \xB7 ${d}`);return}Ns();let r=Promise.all([We({waitFresh:!1}),Zn({waitFresh:!1}),Rs().catch(()=>{}),es().catch(()=>{})]);if(s?.id){await Pa().then(u=>{Array.isArray(u)?ne.value=u:u&&Array.isArray(u.sessions)&&(ne.value=u.sessions)}).catch(()=>{});let d=ne.peek().find(u=>u.sessionId===s.id)||(a?.sessionId===s.id?a:null);await nt(s.id,d?.cwd||null,d?.configDir||null,s.agent||d?.agent||null,null,{tab:s.tab||"chat"}),r.catch(()=>{});return}await r}Os();Us();G();W();le();_a();It();ns();Us();Dn();function Ac(){let e=i("sidebar");e&&(e.classList.add("open"),i("sidebar-overlay").classList.remove("hidden"),i("hamburger")?.setAttribute("aria-expanded","true"),Ee(),setTimeout(()=>i("session-search")?.focus({preventScroll:!0}),180))}function Ws(){let e=i("sidebar");e&&(e.classList.remove("open"),i("sidebar-overlay").classList.add("hidden"),i("hamburger")?.setAttribute("aria-expanded","false"),Ee(),i("hamburger")?.focus({preventScroll:!0}))}function jc(){window.innerWidth<=640&&Ws()}function Dc(){let e=i("sidebar-toggle"),t=i("sidebar");if(!e||!t)return;let n=localStorage.getItem("sidebarCollapsed")==="1",s=localStorage.getItem("sidebarWidth")||t.style.width||"280px",a=()=>{t.classList.toggle("desktop-collapsed",n),n?(t.style.width="0",t.style.minWidth="0",t.style.overflow="hidden"):(t.style.width=s,t.style.minWidth="",t.style.overflow=""),e.textContent=n?"\u25B6":"\u25C0",e.title=n?"\u5C55\u5F00\u4FA7\u680F":"\u6536\u8D77\u4FA7\u680F",e.setAttribute("aria-label",e.title),e.setAttribute("aria-expanded",n?"false":"true")};a(),e.addEventListener("click",()=>{n=!n,n&&(s=t.style.width||s),localStorage.setItem("sidebarCollapsed",n?"1":"0"),a()})}function _c(){let e=i("sidebar-resize"),t=i("sidebar"),n=!1;e.addEventListener("mousedown",s=>{n=!0,document.body.style.userSelect="none",document.body.style.cursor="col-resize",s.preventDefault()}),document.addEventListener("mousemove",s=>{if(!n)return;let a=Math.min(Math.max(s.clientX,160),520);t.style.width=a+"px",t.style.minWidth=""}),document.addEventListener("mouseup",()=>{if(!n)return;n=!1,document.body.style.userSelect="",document.body.style.cursor="";let s=Math.round(t.getBoundingClientRect().width);s>=160&&localStorage.setItem("sidebarWidth",`${s}px`)})}function ei(e){document.documentElement.setAttribute("data-theme",e),localStorage.setItem("theme",e);let t=i("btn-theme"),n=e==="dark"||e==="night"||e==="black"?"\u{1F319}":"\u2600\uFE0F";t&&(t.textContent=n),document.querySelectorAll('[data-sidebar-action="theme"]').forEach(a=>{a.textContent=n});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="/vendor/highlight-dark.min.css"}}function ti(){let e=document.documentElement.getAttribute("data-theme")||"dark";ei(e==="dark"?"light":"dark")}function ni(){let e=i("new-session-agent");e&&(e.value=$.peek()||"claude");let t=i("new-session-workspace");if(t){let a=pe.peek();t.innerHTML=a.map(o=>`<option value="${p(o.configDir)}">${p(o.name)} \u2014 ${p(o.configDir)}</option>`).join(""),c.configDir&&(t.value=c.configDir)}let n=i("new-session-machine-wrap"),s=i("new-session-machine");if(n&&s)if(M.peek()){n.style.display="";let a=ie.peek()||[],o=D.peek()||"";s.innerHTML=a.length?a.map(r=>`<option value="${p(r.id)}">${p(r.id)}${r.hostname?" \u2014 "+p(r.hostname):""}</option>`).join(""):'<option value="">(no machines online)</option>',o&&(s.value=o),s.disabled=!0}else n.style.display="none",s&&(s.disabled=!1);si(),i("new-session-path").value=E.peek()?.path||"",i("new-session-error").classList.add("hidden"),i("modal-new-session").showModal(),setTimeout(()=>i("new-session-path").focus(),50)}function si(){let e=i("new-session-agent")?.value||"claude",t=i("new-session-ws-wrap");t&&(t.style.display=e==="claude"?"":"none")}async function ai(){let e=i("new-session-path").value.trim(),t=i("new-session-agent")?.value||"claude",n=t==="claude"?i("new-session-workspace").value:null,s=i("new-session-error");if(s.classList.add("hidden"),!e){s.textContent="Working directory is required",s.classList.remove("hidden");return}if(M.peek()){let a=D.peek()||i("new-session-machine")?.value||ie.peek()?.[0]?.id;if(!a){s.textContent="\u8BF7\u5148\u9009\u62E9\u4E00\u53F0\u673A\u5668",s.classList.remove("hidden"),wn();return}Le(a)}try{let a=await x("POST","/api/resolve-path",{path:e});if(!a.isDir)throw new Error("Path is not a directory");i("modal-new-session").close();let o=a.path.split("/").filter(Boolean).pop()||a.path;Un(),Wn(),Kn(),Gn(),c.sessionId=null,c.configDir=n||null,c.agent=t,Ne(t),se(Be(t)||_.peek()),et(),xe(()=>{E.value={id:o,name:o,path:a.path,machineId:D.peek()||c.machineId},ke.value=a.path,re.value=a.path,Se.value=a.path,Y.value="",oe.value=null}),i("topbar-project").textContent=a.path;let r=i("files-root-input");r&&(r.value=a.path);let d=i("git-root-input");d&&(d.value=a.path),i("welcome").classList.add("hidden");let u=i("project-view");u.classList.remove("hidden"),u.style.display="flex",zn(),Fn({sessionId:null}),Pt(),Tt("chat"),C(`New ${Z[t]||t} session \xB7 ${a.path}`)}catch(a){s.textContent=a.message,s.classList.remove("hidden")}}function yp(){let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1,t=/Android/i.test(navigator.userAgent),n;e?n=`<ol class="list-decimal pl-4 space-y-2 text-sm text-base-content/80">
1123
+ </dialog>`};Wr();Tt();ss();K();G();ce();gs();Ms();fa();Tt();Os();Hs();ss();Fs();Nn();async function mo(e={}){i("auth-screen").style.display="none";let t=i("app");t.classList.remove("hidden"),t.style.display="flex",queueMicrotask(Ee),Qi().catch(()=>{});let n=e.hub;n===void 0?n=await ua():n?(M.value=!0,n.machines&&(le.value=n.machines)):M.value=!1;let s=e.deepLink||null,a=en();if(!!(s?.id||(location.hash||"").startsWith("#/session/"))){let d=i("welcome");d&&(d.classList.add("hidden"),d.style.display="none");let u=i("project-view");u&&(u.classList.remove("hidden"),u.style.display="flex",u.style.flexDirection="column",u.style.flex="1",u.style.minHeight="0")}if(M.peek()){let d=localStorage.getItem("machineId")||a?.machineId||"";d&&(Le(d),co(),it.value=!0,Ps());let u=kn().then(m=>(Ot(),d&&!m.some(w=>w.id===d&&w.online!==!1)&&m.length&&(m.some(y=>y.id===d)||(Le(null),$n())),m));Xr(),Ot();let l=Promise.all([We({waitFresh:!1}),es({waitFresh:!1}),Bs().catch(()=>{}),ts().catch(()=>{})]);if(s?.id){let m=ne.peek().find(g=>g.sessionId===s.id)||(a?.sessionId===s.id?a:null);await nt(s.id,m?.cwd||null,m?.configDir||null,s.agent||m?.agent||null,s.machineId||m?.machineId||d||null,{tab:s.tab||"chat"}),u.catch(()=>{}),l.catch(()=>{});return}if(!d){if(await u,!(le.peek()||[]).length){$n(),l.catch(()=>{});return}$n(),l.catch(()=>{});return}await l;let f=i("topbar-project");f&&f.textContent==="Select a session"&&(f.textContent=`Machine \xB7 ${d}`);return}Ps();let r=Promise.all([We({waitFresh:!1}),es({waitFresh:!1}),Bs().catch(()=>{}),ts().catch(()=>{})]);if(s?.id){await qa().then(u=>{Array.isArray(u)?ne.value=u:u&&Array.isArray(u.sessions)&&(ne.value=u.sessions)}).catch(()=>{});let d=ne.peek().find(u=>u.sessionId===s.id)||(a?.sessionId===s.id?a:null);await nt(s.id,d?.cwd||null,d?.configDir||null,s.agent||d?.agent||null,null,{tab:s.tab||"chat"}),r.catch(()=>{});return}await r}Os();Fs();K();G();ce();Na();Tt();ss();Fs();Nn();function Dc(){let e=i("sidebar");e&&(e.classList.add("open"),i("sidebar-overlay").classList.remove("hidden"),i("hamburger")?.setAttribute("aria-expanded","true"),Ee(),setTimeout(()=>i("session-search")?.focus({preventScroll:!0}),180))}function Gs(){let e=i("sidebar");e&&(e.classList.remove("open"),i("sidebar-overlay").classList.add("hidden"),i("hamburger")?.setAttribute("aria-expanded","false"),Ee(),i("hamburger")?.focus({preventScroll:!0}))}function _c(){window.innerWidth<=640&&Gs()}function Nc(){let e=i("sidebar-toggle"),t=i("sidebar");if(!e||!t)return;let n=localStorage.getItem("sidebarCollapsed")==="1",s=localStorage.getItem("sidebarWidth")||t.style.width||"280px",a=()=>{t.classList.toggle("desktop-collapsed",n),n?(t.style.width="0",t.style.minWidth="0",t.style.overflow="hidden"):(t.style.width=s,t.style.minWidth="",t.style.overflow=""),e.textContent=n?"\u25B6":"\u25C0",e.title=n?"\u5C55\u5F00\u4FA7\u680F":"\u6536\u8D77\u4FA7\u680F",e.setAttribute("aria-label",e.title),e.setAttribute("aria-expanded",n?"false":"true")};a(),e.addEventListener("click",()=>{n=!n,n&&(s=t.style.width||s),localStorage.setItem("sidebarCollapsed",n?"1":"0"),a()})}function Pc(){let e=i("sidebar-resize"),t=i("sidebar"),n=!1;e.addEventListener("mousedown",s=>{n=!0,document.body.style.userSelect="none",document.body.style.cursor="col-resize",s.preventDefault()}),document.addEventListener("mousemove",s=>{if(!n)return;let a=Math.min(Math.max(s.clientX,160),520);t.style.width=a+"px",t.style.minWidth=""}),document.addEventListener("mouseup",()=>{if(!n)return;n=!1,document.body.style.userSelect="",document.body.style.cursor="";let s=Math.round(t.getBoundingClientRect().width);s>=160&&localStorage.setItem("sidebarWidth",`${s}px`)})}function ni(e){document.documentElement.setAttribute("data-theme",e),localStorage.setItem("theme",e);let t=i("btn-theme"),n=e==="dark"||e==="night"||e==="black"?"\u{1F319}":"\u2600\uFE0F";t&&(t.textContent=n),document.querySelectorAll('[data-sidebar-action="theme"]').forEach(a=>{a.textContent=n});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="/vendor/highlight-dark.min.css"}}function si(){let e=document.documentElement.getAttribute("data-theme")||"dark";ni(e==="dark"?"light":"dark")}function ai(){let e=i("new-session-agent");e&&(e.value=$.peek()||"claude");let t=i("new-session-workspace");if(t){let a=fe.peek();t.innerHTML=a.map(o=>`<option value="${p(o.configDir)}">${p(o.name)} \u2014 ${p(o.configDir)}</option>`).join(""),c.configDir&&(t.value=c.configDir)}let n=i("new-session-machine-wrap"),s=i("new-session-machine");if(n&&s)if(M.peek()){n.style.display="";let a=le.peek()||[],o=_.peek()||"";s.innerHTML=a.length?a.map(r=>`<option value="${p(r.id)}">${p(r.id)}${r.hostname?" \u2014 "+p(r.hostname):""}</option>`).join(""):'<option value="">(no machines online)</option>',o&&(s.value=o),s.disabled=!0}else n.style.display="none",s&&(s.disabled=!1);oi(),i("new-session-path").value=E.peek()?.path||"",i("new-session-error").classList.add("hidden"),i("modal-new-session").showModal(),setTimeout(()=>i("new-session-path").focus(),50)}function oi(){let e=i("new-session-agent")?.value||"claude",t=i("new-session-ws-wrap");t&&(t.style.display=e==="claude"?"":"none")}async function ri(){let e=i("new-session-path").value.trim(),t=i("new-session-agent")?.value||"claude",n=t==="claude"?i("new-session-workspace").value:null,s=i("new-session-error");if(s.classList.add("hidden"),!e){s.textContent="Working directory is required",s.classList.remove("hidden");return}if(M.peek()){let a=_.peek()||i("new-session-machine")?.value||le.peek()?.[0]?.id;if(!a){s.textContent="\u8BF7\u5148\u9009\u62E9\u4E00\u53F0\u673A\u5668",s.classList.remove("hidden"),$n();return}Le(a)}try{let a=await x("POST","/api/resolve-path",{path:e});if(!a.isDir)throw new Error("Path is not a directory");i("modal-new-session").close();let o=a.path.split("/").filter(Boolean).pop()||a.path;Wn(),Kn(),Jn(),zn(),c.sessionId=null,c.configDir=n||null,c.agent=t,Ne(t),se(Oe(t)||N.peek()),et(),xe(()=>{E.value={id:o,name:o,path:a.path,machineId:_.peek()||c.machineId},ke.value=a.path,ie.value=a.path,Se.value=a.path,Y.value="",re.value=null}),i("topbar-project").textContent=a.path;let r=i("files-root-input");r&&(r.value=a.path);let d=i("git-root-input");d&&(d.value=a.path),i("welcome").classList.add("hidden");let u=i("project-view");u.classList.remove("hidden"),u.style.display="flex",Qn(),Gn({sessionId:null}),Ht(),Ct("chat"),C(`New ${Z[t]||t} session \xB7 ${a.path}`)}catch(a){s.textContent=a.message,s.classList.remove("hidden")}}function kp(){let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1,t=/Android/i.test(navigator.userAgent),n;e?n=`<ol class="list-decimal pl-4 space-y-2 text-sm text-base-content/80">
1124
1124
  <li>\u70B9\u5E95\u90E8\u5206\u4EAB\u6309\u94AE <strong>\u5206\u4EAB</strong>\uFF08\u65B9\u6846+\u5411\u4E0A\u7BAD\u5934\uFF09</li>
1125
1125
  <li>\u4E0B\u6ED1\u627E\u5230\u5E76\u70B9 <strong>\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55</strong></li>
1126
1126
  <li>\u786E\u8BA4\u540D\u79F0\u540E\u70B9 <strong>\u6DFB\u52A0</strong></li>
@@ -1140,48 +1140,48 @@ ${t}`:"",n.length?n.join(`
1140
1140
  <form method="dialog"><button class="btn btn-sm">\u77E5\u9053\u4E86</button></form>
1141
1141
  </div>
1142
1142
  </div>
1143
- <form method="dialog" class="modal-backdrop"><button>close</button></form>`,s.showModal()}async function ri(){let e=i("auth-screen");e&&(e.classList.remove("hidden"),e.style.display="flex");let t=i("app");t&&(t.classList.add("hidden"),t.style.display="none");let n=i("auth-btn"),s,a=new AbortController,o=setTimeout(()=>a.abort(),8e3);try{s=await x("GET","/api/auth/status",void 0,a.signal)}catch(r){console.warn("[auth status]",r);let d=i("auth-error");d&&(d.textContent="\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u5668\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u670D\u52A1\u5730\u5740\u540E\u91CD\u8BD5\u3002",d.classList.remove("hidden")),n&&(n.dataset.mode="login");return}finally{clearTimeout(o)}s.needsSetup?(i("auth-subtitle").textContent="Create your account to get started",n.textContent="Create Account",n.dataset.mode="register"):n.dataset.mode="login"}async function oi(){let e=i("auth-username").value.trim(),t=i("auth-password").value,n=i("auth-error");n.classList.add("hidden");try{let s=await x("POST",`/api/auth/${i("auth-btn").dataset.mode||"login"}`,{username:e,password:t});c.token=s.token,localStorage.setItem("token",s.token),fo()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}function ii(){return c.token?/^#\/session\//.test(location.hash||""):!1}function Nc(e={}){if(ei(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??ii(),n=document.getElementById("root");if(n.style.cssText="display:flex;flex-direction:column;flex:1;height:100%",n.innerHTML=Zl()+ec({restoreSession:t}),t){let l=i("session-list");l&&(l.innerHTML='<div class="px-3 py-3 text-[10px] text-base-content/35">Loading sessions\u2026</div>')}je(()=>{let l=pe.value,f=i("ws-tabs");if(!f)return;if(l.length<=1){f.innerHTML="";return}let m=ke.peek();f.innerHTML=[{id:null,name:"All"},...l].map(g=>`<button class="px-3 py-1.5 text-[11px] flex-shrink-0 border-b-2 whitespace-nowrap
1143
+ <form method="dialog" class="modal-backdrop"><button>close</button></form>`,s.showModal()}async function li(){let e=i("auth-screen");e&&(e.classList.remove("hidden"),e.style.display="flex");let t=i("app");t&&(t.classList.add("hidden"),t.style.display="none");let n=i("auth-btn"),s,a=new AbortController,o=setTimeout(()=>a.abort(),8e3);try{s=await x("GET","/api/auth/status",void 0,a.signal)}catch(r){console.warn("[auth status]",r);let d=i("auth-error");d&&(d.textContent="\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u5668\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u670D\u52A1\u5730\u5740\u540E\u91CD\u8BD5\u3002",d.classList.remove("hidden")),n&&(n.dataset.mode="login");return}finally{clearTimeout(o)}s.needsSetup?(i("auth-subtitle").textContent="Create your account to get started",n.textContent="Create Account",n.dataset.mode="register"):n.dataset.mode="login"}async function ii(){let e=i("auth-username").value.trim(),t=i("auth-password").value,n=i("auth-error");n.classList.add("hidden");try{let s=await x("POST",`/api/auth/${i("auth-btn").dataset.mode||"login"}`,{username:e,password:t});c.token=s.token,localStorage.setItem("token",s.token),mo()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}function ci(){return c.token?/^#\/session\//.test(location.hash||""):!1}function Hc(e={}){if(ni(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??ci(),n=document.getElementById("root");if(n.style.cssText="display:flex;flex-direction:column;flex:1;height:100%",n.innerHTML=tc()+nc({restoreSession:t}),t){let l=i("session-list");l&&(l.innerHTML='<div class="px-3 py-3 text-[10px] text-base-content/35">Loading sessions\u2026</div>')}je(()=>{let l=fe.value,f=i("ws-tabs");if(!f)return;if(l.length<=1){f.innerHTML="";return}let m=ke.peek();f.innerHTML=[{id:null,name:"All"},...l].map(g=>`<button class="px-3 py-1.5 text-[11px] flex-shrink-0 border-b-2 whitespace-nowrap
1144
1144
  ${(g.id===null?!m:m===g.configDir)?"border-primary text-primary":"border-transparent text-base-content/50 hover:text-base-content"}"
1145
1145
  data-ws-tab="${p(g.configDir||"")}">
1146
1146
  ${p(g.name)}
1147
- </button>`).join("")}),je(()=>{Dt.value,Vt.value,ht.value,rt.value,T.value;let l=i("session-list");if(!l||l.querySelector(".session-rename-input"))return;let f=Kr();if(l._lastHtml===f){qs();return}let m=l.scrollTop;l.innerHTML=f,l._lastHtml=f,l.scrollTop=m,qs()}),je(()=>{gt.value,qs()}),je(()=>{ne.value,ye.value,D.value,M.value;let l=i("welcome");l&&(document.documentElement.classList.contains("boot-restore")||document.documentElement.classList.contains("boot-pending")||l.classList.contains("hidden")||l.style.display==="none"||vn())}),De(ke,l=>{let f=i("session-filter-badge");f&&(f.style.display=l?"inline":"none",f.title=l||"")}),je(()=>{let l=E.value;if(l&&l.path)wc(l.path);else{let f=i("project-notes-bar");f&&(f.style.display="none")}}),De(X,l=>{document.querySelectorAll("[data-tab]").forEach(m=>{let g=m.dataset.tab===l;m.classList.toggle("text-primary",g),m.classList.toggle("border-primary",g),m.classList.toggle("text-base-content/50",!g),m.classList.toggle("border-transparent",!g)});let f=i("project-view");f&&!f.classList.contains("hidden")&&(f.style.display="flex",f.style.flexDirection="column",f.style.minHeight="0",f.style.flex="1"),["chat","files","git","shell","memory"].forEach(m=>{let g=i(`tab-${m}`);if(!g)return;let w=m===l;g.classList.toggle("hidden",!w),w?(g.style.display="flex",g.style.flexDirection="column",g.style.flex="1 1 0",g.style.minHeight="0",g.style.overflow="hidden"):g.style.display="none"}),l==="memory"&&eo(),l==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))}),Ee()}),_c(),Dc(),el({openSession:nt});let s=l=>{i("app")?.classList.toggle("chat-chrome-collapsed",l),i("btn-expand-chat-chrome")?.classList.toggle("hidden",!l),localStorage.setItem("chatChromeCollapsed",l?"1":"0")};s(localStorage.getItem("chatChromeCollapsed")==="1");let a=null;document.addEventListener("sessions-changed",()=>{a&&clearTimeout(a),a=setTimeout(()=>{a=null,We({waitFresh:!1})},1200)}),document.addEventListener("router:home",po),document.addEventListener("router:session",async({detail:{id:l,tab:f,machineId:m,agent:g}})=>{let w=ne.peek().find(H=>H.sessionId===l),y=Xt();await nt(l,w?.cwd||(y?.sessionId===l?y.cwd:null)||null,w?.configDir||(y?.sessionId===l?y.configDir:null)||null,g||w?.agent||(y?.sessionId===l?y.agent:null)||null,m||w?.machineId||(y?.sessionId===l?y.machineId:null)||null,{tab:f||"chat"})}),b.on("click","#btn-home",po),b.on("click","#btn-share-session, #btn-share-session-current",async(l,f)=>{let m=Sl();if(m)try{await navigator.clipboard.writeText(m),f.classList.add("is-copied"),f.title="\u5DF2\u590D\u5236\u5206\u4EAB\u94FE\u63A5",setTimeout(()=>{f.classList.remove("is-copied"),f.title="\u590D\u5236\u5F53\u524D\u4F1A\u8BDD\u5206\u4EAB\u94FE\u63A5"},1400)}catch{window.prompt("\u590D\u5236\u4F1A\u8BDD\u94FE\u63A5\uFF1A",m)}}),b.on("click","#auth-btn",oi),b.on("submit","#auth-form",l=>{l.preventDefault(),oi()}),b.on("keydown","#auth-username, #auth-password",l=>{l.key==="Enter"&&oi()}),b.on("click","#hamburger",()=>i("sidebar").classList.contains("open")?Ws():Ac()),b.on("click","#sidebar-overlay",Ws),document.addEventListener("keydown",l=>{l.key==="Escape"&&window.innerWidth<=640&&i("sidebar")?.classList.contains("open")&&(l.preventDefault(),Ws())}),b.on("input","#session-search",(l,f)=>{$e.value=f.value,Za(f.value)}),b.on("click","#sidebar-filter-toggle",()=>{let l=i("sidebar-filter-menu");if(!l)return;let f=l.classList.toggle("hidden");i("sidebar-filter-toggle")?.setAttribute("aria-expanded",String(!f))}),b.on("change","[data-agent-option]",(l,f)=>{let m=new Set(zt.peek());f.checked?m.add(f.dataset.agentOption):m.delete(f.dataset.agentOption);let g=[...m];zt.value=g,localStorage.setItem("agentFilters",JSON.stringify(g)),ye.value=g.length===1?g[0]:"all"}),b.on("change","#filter-favorites",(l,f)=>{ze.value=f.checked,localStorage.setItem("favoritesOnly",f.checked?"1":"0")}),b.on("change","#filter-hidden",(l,f)=>{Je.value=f.checked,localStorage.setItem("showHiddenOnly",f.checked?"1":"0")}),b.on("click","#filter-clear",()=>{zt.value=[],ye.value="all",ze.value=!1,Je.value=!1,localStorage.setItem("agentFilters","[]"),localStorage.setItem("favoritesOnly","0"),localStorage.setItem("showHiddenOnly","0"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=!1}),i("filter-favorites")&&(i("filter-favorites").checked=!1),i("filter-hidden")&&(i("filter-hidden").checked=!1)}),b.on("click","#session-filter-badge",()=>{ke.value=null}),b.on("click","[data-ws-tab]",(l,f)=>{ke.value=f.dataset.wsTab||null}),b.on("click","#sidebar-refresh",()=>{We(),$e.peek().trim()&&Xa($e.peek())}),b.on("click","[data-view]",(l,f)=>{ht.value=f.dataset.view,localStorage.setItem("sidebarView",f.dataset.view)}),b.on("click","[data-agent-filter]",(l,f)=>{ye.value=f.dataset.agentFilter,localStorage.setItem("agentFilter",f.dataset.agentFilter),$e.peek().trim()&&Za($e.peek())}),b.on("dblclick","[data-project-cwd]",(l,f)=>{let m=f.dataset.projectCwd;if(!m)return;let g=m.split("/").filter(Boolean).pop()||m;Zr({id:g,name:g,path:m}),C(`Project \xB7 ${m}`)}),b.on("click","#btn-pwa-install",async()=>{await qi()||yp()}),document.addEventListener("pwa-installable",()=>{document.getElementById("btn-pwa-install")?.classList.remove("hidden")}),b.on("click","#btn-settings",qa),b.on("click","#btn-notes",()=>Ra()),b.on("click","#btn-collapse-chat-chrome",()=>s(!0)),b.on("click","#btn-expand-chat-chrome",()=>s(!1)),b.on("click","#btn-meta-agent",()=>zl()),b.on("click","#btn-meta-agent-welcome",()=>_r("chat")),b.on("click","#btn-theme",ti),b.on("click","[data-sidebar-action]",(l,f)=>{let m=f.dataset.sidebarAction;m==="new"&&ni(),m==="theme"&&ti(),m==="settings"&&qa(),m==="logout"&&(c.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload())}),b.on("click","#btn-cal-prev",()=>{Br(-1),vn(bn())}),b.on("click","#btn-cal-next",()=>{Br(1),vn(bn())}),b.on("click","[data-cal-date]",(l,f)=>{uc(f.dataset.calDate),vn(bn())}),b.on("click","[data-session-id]",(l,f)=>{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")||(nt(f.dataset.sessionId,f.dataset.sessionCwd||null,f.dataset.sessionConfigDir||null,f.dataset.sessionAgent||"claude",f.dataset.sessionMachine||null),jc())}),b.on("click","[data-rename-session]",(l,f)=>{l.preventDefault(),l.stopPropagation();let m=f.closest(".session-title-wrap")||f,g=m.dataset.renameSessionId||m.dataset.sessionId;g&&Qr({sessionId:g,agent:m.dataset.renameSessionAgent||"claude",machineId:m.dataset.renameSessionMachine||null,fallbackDisplay:m.dataset.renameSessionDisplay||"",mountEl:m})}),b.on("click","[data-rename-bar]",(l,f)=>{if(l.preventDefault(),l.stopPropagation(),!c.sessionId)return;let m=document.getElementById("session-title-display")||f;Qr({sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null,mountEl:m})}),b.on("click","[data-folder]",(l,f)=>{let m=f.dataset.folder,w=f.querySelector("span")?.textContent.trim()==="\u25BE",y=new Set(Cn.peek()),H=new Set(Mn.peek());w?(y.delete(m),H.add(m)):(y.add(m),H.delete(m)),xe(()=>{Cn.value=y,Mn.value=H})}),b.on("click","#memory-refresh",eo),b.on("click","[data-memory-file]",l=>zr(l.dataset.memoryFile,l.dataset.memoryAgent)),b.on("click","[data-tab]",(l,f)=>Tt(f.dataset.tab));let o=async(l,f)=>{let m=i(l),g=m?.value.trim();if(!g){f.value="";return}try{let w=await x("POST","/api/resolve-path",{path:g});if(w.isDir===!1)throw new Error("Path is not a directory on the target machine");f.value=w.path,m.value=w.path;let y=E.peek();y&&(E.value={...y,path:w.path})}catch(w){m.style.color="oklch(var(--er))",m.title=w.message,setTimeout(()=>{m.style.color="",m.title=""},2e3)}};b.on("click","#files-root-btn",()=>o("files-root-input",re)),b.on("click","#git-root-btn",()=>o("git-root-input",Se)),b.on("keydown","#files-root-input",l=>{l.key==="Enter"&&o("files-root-input",re)}),b.on("keydown","#git-root-input",l=>{l.key==="Enter"&&o("git-root-input",Se)}),b.on("click","#btn-opts",()=>{i("chat-opts").classList.toggle("hidden"),Ee()}),b.on("change","#sel-agent",(l,f)=>{let m=$.peek(),g=f.value;m!==g&&(c.sessionId=null,Ne(g),se(Be(g)||_.peek()),i("sel-permission").value=de.peek(),et(),C(`Agent \u2192 ${Z[g]||g} \xB7 model ${_.peek()} \xB7 new session`))}),b.on("change","#sel-convert-agent",async(l,f)=>{let m=f.value;if(!m)return;let g=c.sessionId;if(!g){alert("No active session to convert."),f.value="";return}let w=c.agent||$.peek()||"claude";if(w===m){alert("Cannot convert to the same agent."),f.value="";return}f.disabled=!0,C(`Converting session ${g.slice(0,8)} from ${w} to ${m}...`);try{let y=await x("POST",`/api/sessions/${g}/convert`,{targetAgent:m,sourceAgent:w});y&&y.success?(C(`\u2713 Converted successfully. New session: ${y.targetSessionId.slice(0,8)}`),await We(),await nt(y.targetSessionId,E.peek()?.path||null,null,y.targetAgent),Es()):C("Failed to convert session.")}catch(y){C(`Error converting session: ${y.message}`),alert(`Error converting session: ${y.message}`)}finally{f.disabled=!1,f.value=""}}),b.on("change","#sel-model",(l,f)=>{se(f.value),Va()}),b.on("click","#btn-model-add",()=>Ya({editCurrent:!1})),b.on("click","#btn-model-edit",()=>Ya({editCurrent:!0})),b.on("change","#sel-effort",(l,f)=>{te.value=f.value}),b.on("change","#sel-permission",(l,f)=>{de.value=f.value}),b.on("change","#sel-density",(l,f)=>{Go(f.value),C(`Density \u2192 ${f.value} (applies to new tool calls; reload session to re-group history)`)}),document.addEventListener("agent-changed",et),b.on("click","#btn-new-session, #btn-new-session-current, #btn-new-session-welcome",ni),b.on("click","#new-session-cancel",()=>i("modal-new-session").close()),b.on("click","#new-session-start",ai),b.on("change","#new-session-agent",si),b.on("keydown","#new-session-path",l=>{l.key==="Enter"&&ai()}),b.on("click","#send-btn",Ls),b.on("click","#stop-btn",fl),b.on("click","#btn-logout",()=>{c.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload()}),b.on("click","[data-pick-machine]",async(l,f)=>{let m=f.dataset.pickMachine;if(!m||m===D.peek()){kn();return}await Yr(m,{forceReload:!0}),va()});let r=async()=>{let l=i("machine-picker-status");if(l&&(l.textContent="\u5237\u65B0\u4E2D\u2026"),await yn(),ro(),Bs(),Ot(),l){let f=(ie.peek()||[]).filter(m=>m.online!==!1).length;l.textContent=`${f} online`}};b.on("click","#btn-refresh-machines",r),b.on("click","#btn-refresh-machines-menu",async l=>{l.stopPropagation(),await r()}),b.on("click","#btn-machine-menu",async l=>{l.stopPropagation(),xn(),an();let f=i("machine-menu");f&&(f.classList.contains("hidden")?(await yn(),Bs(),f.classList.remove("hidden")):f.classList.add("hidden"))}),b.on("click","#btn-recent-sessions",l=>{l.preventDefault(),l.stopPropagation(),kn(),an(),dc();let f=!i("recent-menu")?.classList.contains("hidden"),m=i("btn-recent-sessions");m&&m.setAttribute("aria-expanded",f?"true":"false")}),b.on("click","#recent-menu-backdrop",l=>{l.preventDefault(),l.stopPropagation(),xn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",l=>{let f=i("machine-menu-wrap");f&&!f.contains(l.target)&&kn();let m=i("recent-menu"),g=i("btn-recent-sessions"),w=l.target;if(m&&!m.classList.contains("hidden")){if(m.contains(w)||g?.contains(w))return;xn(),g?.setAttribute("aria-expanded","false")}}),b.on("click","#btn-notifications",l=>{l.preventDefault(),l.stopPropagation(),kn(),xn(),Zi()}),window.addEventListener("resize",()=>{i("recent-menu")&&!i("recent-menu").classList.contains("hidden")&&Rr()}),b.on("click","#recent-menu [data-session-id]",()=>{xn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),b.on("click","[data-dismiss-recent-session]",(l,f)=>{l.preventDefault(),l.stopPropagation(),lc({sessionId:f.dataset.dismissRecentSession,agent:f.dataset.dismissRecentAgent||"claude",machineId:f.dataset.dismissRecentMachine||null})}),b.on("click","#btn-edit-project-notes, #project-goal-text, #project-notes-text",()=>{kc()}),b.on("click","#btn-cancel-project-notes",()=>{ts()});let d=async()=>{let l=i("project-goal-input")?.value?.trim()??"",f=i("project-notes-input")?.value?.trim()??"",m=E.peek();if(!(!m||!m.path))try{let g=await x("POST","/api/projects/notes",{root:m.path,goal:l,notes:f});yc(g.goal||"",g.notes||""),ts()}catch(g){alert(`Error saving project notes: ${g.message}`)}};b.on("click","#btn-save-project-notes",d),b.on("keydown","#project-goal-input",l=>{l.key==="Enter"&&d(),l.key==="Escape"&&ts()}),b.on("keydown","#project-notes-input",l=>{l.key==="Escape"&&ts()}),b.on("click","[data-fav-toggle]",(l,f)=>{l.stopPropagation(),l.preventDefault();let m=f.dataset.favSessionMachine||c.machineId;m&&(c.machineId=m,localStorage.setItem("machineId",m)),Lc(f.dataset.favSessionId,f.dataset.favSessionAgent||"claude",{machineId:m||null})}),b.on("click","[data-hide-toggle]",(l,f)=>{l.stopPropagation(),l.preventDefault();let m=f.dataset.hideSessionMachine||c.machineId;m&&(c.machineId=m,localStorage.setItem("machineId",m)),Ec(f.dataset.hideSessionId,f.dataset.hideSessionAgent||"claude",{machineId:m||null})}),b.on("click","#btn-edit-session-notes, #session-notes-text",()=>{$c()}),b.on("click","#btn-cancel-session-notes",()=>tt()),b.on("click","#btn-save-session-notes",async()=>{let l=i("session-notes-input")?.value?.trim()||"";if(!c.sessionId)return;let f=c.agent||$.peek()||"claude";await Jr(c.sessionId,f,l)&&tt()}),b.on("keydown","#session-notes-input",async l=>{if(l.key==="Escape"&&tt(),l.key==="Enter"){let f=l.target.value.trim();if(!c.sessionId)return;let m=c.agent||$.peek()||"claude";await Jr(c.sessionId,m,f)&&tt()}}),b.on("click","#btn-fav-filter",()=>{let l=!ze.peek();ze.value=l,localStorage.setItem("favoritesOnly",l?"1":"0"),i("btn-fav-filter")?.classList.toggle("active",l),l&&Je.peek()&&(Je.value=!1,localStorage.setItem("showHiddenOnly","0"),i("btn-hidden-filter")?.classList.remove("active"))}),b.on("click","#btn-hidden-filter",()=>{let l=!Je.peek();Je.value=l,localStorage.setItem("showHiddenOnly",l?"1":"0"),i("btn-hidden-filter")?.classList.toggle("active",l),l&&ze.peek()&&(ze.value=!1,localStorage.setItem("favoritesOnly","0"),i("btn-fav-filter")?.classList.remove("active"))}),et(),je(()=>{M.value,D.value,c.token&&va()}),i("sel-permission").value=de.peek(),vl();let u=i("sel-density");u&&(u.value=_e.peek()||"normal"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=zt.peek().includes(l.dataset.agentOption)}),i("filter-favorites")&&(i("filter-favorites").checked=ze.peek()),i("filter-hidden")&&(i("filter-hidden").checked=Je.peek()),document.querySelectorAll("[data-agent-filter]").forEach(l=>{l.classList.toggle("active",l.dataset.agentFilter===ye.peek())}),i("btn-fav-filter")?.classList.toggle("active",ze.peek()),i("btn-hidden-filter")?.classList.toggle("active",Je.peek()),document.querySelectorAll("[data-view]").forEach(l=>{let f=l.dataset.view===ht.peek();l.classList.toggle("bg-primary/15",f),l.classList.toggle("text-primary",f),l.classList.toggle("font-medium",f),l.classList.toggle("text-base-content/50",!f)})}G();er();W();le();hs();or();ya();_n();Zt();en();ir();_t();_t();function wp(){return Z[$.peek()]||"Assistant"}function kp(e){let t=String(e||"").trim();return/remote compact task|error decoding response body/i.test(t)?"Codex \u4F1A\u8BDD\u538B\u7F29\u5931\u8D25\uFF08\u7F51\u7EDC\u4E2D\u65AD\uFF09\u3002\u518D\u53D1\u4E00\u6761\u6D88\u606F\u91CD\u8BD5\uFF0C\u6216\u5F00\u65B0\u4F1A\u8BDD\u3002":t||"\u53D1\u9001\u5931\u8D25"}var $n=null;function $p(e){return vs(e)}function Fc(e){return e?($n&&$n.el===e||($n?.destroy?.(),$n=wa(e),$n.el=e),$n):null}function Re(e,t){if(!e||e.dataset.historyPainting==="1")return;Fc(e).stick(!!t)}var Ks=0,At=null,at=1e3,Mt=0,go=null,Pc=!1,bo=!1,Hc=null,vo=!1,ci="hubStreamCursors",Eo=new Map,Sp=0,di=new Set,ui="pendingUserTexts",Sn=(()=>{try{let e=JSON.parse(sessionStorage.getItem(ui)||"[]");return Array.isArray(e)?e.filter(t=>t?.key&&t?.text).slice(-30):[]}catch{return[]}})(),qc=new Set,Wc=new Map;function Gc(){try{Sn.length?sessionStorage.setItem(ui,JSON.stringify(Sn.slice(-30))):sessionStorage.removeItem(ui)}catch{}}function Lp(){let e=Ys(),t=Sn.filter(n=>n.key===e).length;t&&!qc.has(e)&&(qc.add(e),P(`\u231B Restored ${t} queued prompt${t===1?"":"s"} in this browser tab`))}function Kc(e=c.sessionId,t=c.agent,n=c.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function Ep(e={}){let t=Kc(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(ci)||"{}")[t])||0}catch{return 0}}function Ip(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=Kc(e.sessionId||c.sessionId,e.agent||c.agent,c.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(ci)||"{}")||{}}catch{}let a=Number(s[n])||0;if(t<=a)return!1;s[n]=t;let o=Object.keys(s);o.length>500&&o.sort((r,d)=>Number(s[d])-Number(s[r])).slice(500).forEach(r=>delete s[r]);try{localStorage.setItem(ci,JSON.stringify(s))}catch{}return!0}function Ys({sessionId:e=c.sessionId,agent:t=c.agent,machineId:n=c.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function Tp(){Pc||(Pc=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(at=400,ss({probe:!0}),c.ws?.readyState===WebSocket.OPEN&&c.sessionId))try{c.ws.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}}),window.addEventListener("online",()=>{at=400,ss({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?ss({force:!0}):ss({probe:!0})}),window.addEventListener("focus",()=>ss({probe:!0})),navigator.connection?.addEventListener?.("change",()=>{at=400,ss({probe:!0})}))}function Js(){let e=i("conn-dot");if(!e)return;let t=fe.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 ss(e={}){let t=c.ws?.readyState;if(e.force){at=400,ko({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&Mt&&Date.now()-Mt>45e3)try{c.ws.close()}catch{}else if(e.probe&&c.ws.readyState===WebSocket.OPEN)try{c.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(at=Math.min(at,800),ko({quiet:!0}))}function Cp(){At||(fe.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Js(),At=setTimeout(()=>{At=null,ko({quiet:!0})},at),at=Math.min(Math.round(at*1.8),15e3))}function zc(){go&&(clearInterval(go),go=null)}function Mp(e,t){zc(),go=setInterval(()=>{if(!(t!==Ks||e.readyState!==WebSocket.OPEN)){if(Mt&&Date.now()-Mt>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&Mt&&Date.now()-Mt>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function jt(){let e=N.peek()||!!E.peek()&&fe.peek()==="open";ba(e)}function wo(){return(c.role||"editor")==="viewer"?"\u53EA\u8BFB\u8D26\u53F7\uFF0C\u65E0\u6CD5\u8F93\u5165":c.lock?.foreign?`\u4F1A\u8BDD\u7531 ${c.lock.holder&&c.lock.holder!=="viewer"?c.lock.holder:"\u5176\u4ED6\u7528\u6237"} \u5360\u7528\uFF08\u9501\uFF09`:"\u5F53\u524D\u65E0\u6CD5\u8F93\u5165"}function as(){let e=tn();c.externalSessionReadOnly=!e;let t=i("chat-input"),n=i("send-btn"),s=i("btn-attach"),a=i("session-lock-banner");t&&(t.disabled=!e,t.readOnly=!e,e?N.peek()?t.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":Qs(t.value||""):t.placeholder=wo()),n&&(n.disabled=!e),s&&(s.disabled=!e),a&&(e?(a.classList.add("hidden"),a.textContent=""):(a.classList.remove("hidden"),a.textContent=wo()))}function Ap(){at=400,At&&(clearTimeout(At),At=null),vo=!1;let e=c.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{c.ws?.close()}catch{}ko({quiet:!1}),P("\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65\u2026")}function ko(e={}){Tp(),At&&(clearTimeout(At),At=null),e.quiet&&(vo=!0);let t=c.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);Hc!==t&&(ca(),Hc=t);let n=++Ks;try{c.ws?.close()}catch{}fe.value="connecting",Js();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;c.token&&a.set("token",c.token),t&&a.set("machine",t),c.sessionId&&a.set("sessionId",c.sessionId),c.agent&&a.set("agent",c.agent);let o=Ep();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);c.ws=r,r.addEventListener("open",()=>{if(n===Ks){if(at=1e3,Mt=Date.now(),fe.value="open",Js(),c.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}la(),Lp(),Mp(r,n),jt(),bo&&!vo&&P(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),bo=!1,vo=!1}}),r.addEventListener("message",d=>{if(n!==Ks)return;let u;try{u=JSON.parse(d.data)}catch{return}if(Ip(u)){if(u.type==="pong"){Mt=Date.now();return}if(u.type==="ping"){if(Mt=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(u.type==="run-status"){u.running?N.value=!0:(N.peek()&&(N.value=!1),pi()),jt();return}Jc(u)}}),r.addEventListener("close",()=>{n===Ks&&(zc(),bo=!0,fe.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Js(),Cp())}),r.addEventListener("error",()=>{})}function pi(){if(!Sn.length||N.peek())return;let e=Ys(),t=Sn.findIndex(a=>a.key===e);if(t<0)return;let[n]=Sn.splice(t,1);Gc();let s=i("chat-input");s&&(s.value=n.text,Vs(s)),setTimeout(()=>{if(n.key!==Ys()||N.peek()){Wc.set(n.key,n.text);return}Xs()},0)}function mo(){N.value=!1,jt(),pi()}var jp=0;function Jc(e){if(!(e?.sessionId&&c.sessionId&&e.sessionId!==c.sessionId)){if(e&&typeof e.type=="string"&&(e.type==="note.added"||e.type==="note.updated"||e.type==="note.removed"||e.type==="queue.item.added"||e.type==="queue.item.updated"||e.type==="queue.item.removed"||e.type==="queue.item.moved"||e.type==="queue.item.sending")){window.dispatchEvent(new CustomEvent("hub-ws-message",{detail:e}));let t={"note.added":"hub:note-added","note.updated":"hub:note-updated","note.removed":"hub:note-removed"}[e.type];t&&window.dispatchEvent(new CustomEvent(t,{detail:e}))}if(e._hubReplay===!0){document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)Jc(t);return}if(["assistant","assistant_stream_start","assistant_delta","thought_delta","tool_use"].includes(e.type)&&jp++,e.type==="session-created"){let t=_.peek();c.sessionId=e.sessionId,e.agent&&e.agent!==$.peek()&&Ne(e.agent),se(t,e.agent||$.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-sessions-changed"){document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-session-updated"){document.dispatchEvent(new CustomEvent("sessions-changed")),document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="notification"&&e.notification){xa(e.notification);return}if(e.type==="grok-queue-status"){Xp(e);return}if(e.type==="result"){zs(),Gs(),os();let t=e.usage;if(t){let n={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};c.lastUsage=n,c.sessionId&&(c.lastUsageSessionId=c.sessionId),xo(n)}e.is_error||P("\u2713 Done"),mo();return}if(e.type==="complete"){zs(),Gs(),os(),!e.aborted&&e.agent==="claude"?P("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?P("\u2713 Done"):e.aborted&&P("\u5DF2\u505C\u6B62")),mo();return}if(e.type==="error"){zs(),Gs(),(e.code===423||/locked/i.test(String(e.message||"")))&&(c.lock={...c.lock||{},held:!1,foreign:!0,holder:e.lock?.holder||c.lock?.holder||"another user"},as()),rs("error","Error",kp(e.message)),mo();return}if(e.type==="shell-start"){c.shellBubble=null;return}if(e.type==="shell-output"){c.shellBubble||(c.shellBubble=tf(e.stream==="stderr"?"shell-err":"shell")),nf(c.shellBubble,e.data);return}if(e.type==="shell-exit"){c.shellBubble=null,P(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),mo();return}if(e.type==="assistant"){Gs();for(let t of e.message?.content||[])t.type==="text"&&t.text?(os(),rs("assistant",wp(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&of(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){N.peek()||(N.value=!0,jt()),Qc(e.ts);return}if(e.type==="assistant_delta"){N.peek()||(N.value=!0,jt()),Dp(e.data||"");return}if(e.type==="assistant_stream_end"){Gs();return}if(e.type==="thought_stream_start"){Vc();return}if(e.type==="thought_delta"){_p(e.data||"");return}if(e.type==="thought_stream_end"){zs();return}if(e.type==="status"){let t=i("stream-status");if(t)t.textContent=e.message||"";else{let n=i("messages");n&&e.message&&(n.insertAdjacentHTML("beforeend",`<div id="stream-status" class="text-center text-[10px] text-base-content/35 py-0.5">${p(e.message)}</div>`),Re(n))}return}if(e.type==="permission_resolved"){let t=e.requestId||e.request_id;t&&i(`perm-${t}`)?.remove();return}(e.type==="permission_request"||e.request_id&&e.tool_name)&&rf(e)}}var st=null,Ge=null,Bt=null,mt=null;function Qc(e){let t=i("messages");if(!t||(os(),zs(),st&&t.contains(st)))return;let n=$o(e||Date.now()),s=So(e||Date.now());t.insertAdjacentHTML("beforeend",`
1147
+ </button>`).join("")}),je(()=>{_t.value,Xt.value,gt.value,rt.value,T.value;let l=i("session-list");if(!l||l.querySelector(".session-rename-input"))return;let f=Jr();if(l._lastHtml===f){Rs();return}let m=l.scrollTop;l.innerHTML=f,l._lastHtml=f,l.scrollTop=m,Rs()}),je(()=>{bt.value,Rs()}),je(()=>{ne.value,ye.value,_.value,M.value;let l=i("welcome");l&&(document.documentElement.classList.contains("boot-restore")||document.documentElement.classList.contains("boot-pending")||l.classList.contains("hidden")||l.style.display==="none"||yn())}),De(ke,l=>{let f=i("session-filter-badge");f&&(f.style.display=l?"inline":"none",f.title=l||"")}),je(()=>{let l=E.value;if(l&&l.path)$c(l.path);else{let f=i("project-notes-bar");f&&(f.style.display="none")}}),De(X,l=>{document.querySelectorAll("[data-tab]").forEach(m=>{let g=m.dataset.tab===l;m.classList.toggle("text-primary",g),m.classList.toggle("border-primary",g),m.classList.toggle("text-base-content/50",!g),m.classList.toggle("border-transparent",!g)});let f=i("project-view");f&&!f.classList.contains("hidden")&&(f.style.display="flex",f.style.flexDirection="column",f.style.minHeight="0",f.style.flex="1"),["chat","files","git","shell","memory"].forEach(m=>{let g=i(`tab-${m}`);if(!g)return;let w=m===l;g.classList.toggle("hidden",!w),w?(g.style.display="flex",g.style.flexDirection="column",g.style.flex="1 1 0",g.style.minHeight="0",g.style.overflow="hidden"):g.style.display="none"}),l==="memory"&&no(),l==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))}),Ee()}),Pc(),Nc(),nl({openSession:nt});let s=l=>{i("app")?.classList.toggle("chat-chrome-collapsed",l),i("btn-expand-chat-chrome")?.classList.toggle("hidden",!l),localStorage.setItem("chatChromeCollapsed",l?"1":"0")};s(localStorage.getItem("chatChromeCollapsed")==="1");let a=null;document.addEventListener("sessions-changed",()=>{a&&clearTimeout(a),a=setTimeout(()=>{a=null,We({waitFresh:!1})},1200)}),document.addEventListener("router:home",fo),document.addEventListener("router:session",async({detail:{id:l,tab:f,machineId:m,agent:g}})=>{let w=ne.peek().find(A=>A.sessionId===l),y=en();await nt(l,w?.cwd||(y?.sessionId===l?y.cwd:null)||null,w?.configDir||(y?.sessionId===l?y.configDir:null)||null,g||w?.agent||(y?.sessionId===l?y.agent:null)||null,m||w?.machineId||(y?.sessionId===l?y.machineId:null)||null,{tab:f||"chat"})}),b.on("click","#btn-home",fo),b.on("click","#btn-share-session, #btn-share-session-current",async(l,f)=>{let m=El();if(m)try{await navigator.clipboard.writeText(m),f.classList.add("is-copied"),f.title="\u5DF2\u590D\u5236\u5206\u4EAB\u94FE\u63A5",setTimeout(()=>{f.classList.remove("is-copied"),f.title="\u590D\u5236\u5F53\u524D\u4F1A\u8BDD\u5206\u4EAB\u94FE\u63A5"},1400)}catch{window.prompt("\u590D\u5236\u4F1A\u8BDD\u94FE\u63A5\uFF1A",m)}}),b.on("click","#auth-btn",ii),b.on("submit","#auth-form",l=>{l.preventDefault(),ii()}),b.on("keydown","#auth-username, #auth-password",l=>{l.key==="Enter"&&ii()}),b.on("click","#hamburger",()=>i("sidebar").classList.contains("open")?Gs():Dc()),b.on("click","#sidebar-overlay",Gs),document.addEventListener("keydown",l=>{l.key==="Escape"&&window.innerWidth<=640&&i("sidebar")?.classList.contains("open")&&(l.preventDefault(),Gs())}),b.on("input","#session-search",(l,f)=>{$e.value=f.value,to(f.value)}),b.on("click","#sidebar-filter-toggle",()=>{let l=i("sidebar-filter-menu");if(!l)return;let f=l.classList.toggle("hidden");i("sidebar-filter-toggle")?.setAttribute("aria-expanded",String(!f))}),b.on("change","[data-agent-option]",(l,f)=>{let m=new Set(Qt.peek());f.checked?m.add(f.dataset.agentOption):m.delete(f.dataset.agentOption);let g=[...m];Qt.value=g,localStorage.setItem("agentFilters",JSON.stringify(g)),ye.value=g.length===1?g[0]:"all"}),b.on("change","#filter-favorites",(l,f)=>{ze.value=f.checked,localStorage.setItem("favoritesOnly",f.checked?"1":"0")}),b.on("change","#filter-hidden",(l,f)=>{Je.value=f.checked,localStorage.setItem("showHiddenOnly",f.checked?"1":"0")}),b.on("click","#filter-clear",()=>{Qt.value=[],ye.value="all",ze.value=!1,Je.value=!1,localStorage.setItem("agentFilters","[]"),localStorage.setItem("favoritesOnly","0"),localStorage.setItem("showHiddenOnly","0"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=!1}),i("filter-favorites")&&(i("filter-favorites").checked=!1),i("filter-hidden")&&(i("filter-hidden").checked=!1)}),b.on("click","#session-filter-badge",()=>{ke.value=null}),b.on("click","[data-ws-tab]",(l,f)=>{ke.value=f.dataset.wsTab||null}),b.on("click","#sidebar-refresh",()=>{We(),$e.peek().trim()&&eo($e.peek())}),b.on("click","[data-view]",(l,f)=>{gt.value=f.dataset.view,localStorage.setItem("sidebarView",f.dataset.view)}),b.on("click","[data-agent-filter]",(l,f)=>{ye.value=f.dataset.agentFilter,localStorage.setItem("agentFilter",f.dataset.agentFilter),$e.peek().trim()&&to($e.peek())}),b.on("dblclick","[data-project-cwd]",(l,f)=>{let m=f.dataset.projectCwd;if(!m)return;let g=m.split("/").filter(Boolean).pop()||m;ti({id:g,name:g,path:m}),C(`Project \xB7 ${m}`)}),b.on("click","#btn-pwa-install",async()=>{await Bi()||kp()}),document.addEventListener("pwa-installable",()=>{document.getElementById("btn-pwa-install")?.classList.remove("hidden")}),b.on("click","#btn-settings",Ba),b.on("click","#btn-notes",()=>Oa()),b.on("click","#btn-collapse-chat-chrome",()=>s(!0)),b.on("click","#btn-expand-chat-chrome",()=>s(!1)),b.on("click","#btn-meta-agent",()=>Ql()),b.on("click","#btn-meta-agent-welcome",()=>Pr("chat")),b.on("click","#btn-theme",si),b.on("click","[data-sidebar-action]",(l,f)=>{let m=f.dataset.sidebarAction;m==="new"&&ai(),m==="theme"&&si(),m==="settings"&&Ba(),m==="logout"&&(c.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload())}),b.on("click","#btn-cal-prev",()=>{Fr(-1),yn(xn())}),b.on("click","#btn-cal-next",()=>{Fr(1),yn(xn())}),b.on("click","[data-cal-date]",(l,f)=>{fc(f.dataset.calDate),yn(xn())}),b.on("click","[data-session-id]",(l,f)=>{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")||(nt(f.dataset.sessionId,f.dataset.sessionCwd||null,f.dataset.sessionConfigDir||null,f.dataset.sessionAgent||"claude",f.dataset.sessionMachine||null),_c())}),b.on("click","[data-rename-session]",(l,f)=>{l.preventDefault(),l.stopPropagation();let m=f.closest(".session-title-wrap")||f,g=m.dataset.renameSessionId||m.dataset.sessionId;g&&Yr({sessionId:g,agent:m.dataset.renameSessionAgent||"claude",machineId:m.dataset.renameSessionMachine||null,fallbackDisplay:m.dataset.renameSessionDisplay||"",mountEl:m})}),b.on("click","[data-rename-bar]",(l,f)=>{if(l.preventDefault(),l.stopPropagation(),!c.sessionId)return;let m=document.getElementById("session-title-display")||f;Yr({sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null,mountEl:m})}),b.on("click","[data-folder]",(l,f)=>{let m=f.dataset.folder,w=f.querySelector("span")?.textContent.trim()==="\u25BE",y=new Set(An.peek()),A=new Set(jn.peek());w?(y.delete(m),A.add(m)):(y.add(m),A.delete(m)),xe(()=>{An.value=y,jn.value=A})}),b.on("click","#memory-refresh",no),b.on("click","[data-memory-file]",l=>Qr(l.dataset.memoryFile,l.dataset.memoryAgent)),b.on("click","[data-tab]",(l,f)=>Ct(f.dataset.tab));let o=async(l,f)=>{let m=i(l),g=m?.value.trim();if(!g){f.value="";return}try{let w=await x("POST","/api/resolve-path",{path:g});if(w.isDir===!1)throw new Error("Path is not a directory on the target machine");f.value=w.path,m.value=w.path;let y=E.peek();y&&(E.value={...y,path:w.path})}catch(w){m.style.color="oklch(var(--er))",m.title=w.message,setTimeout(()=>{m.style.color="",m.title=""},2e3)}};b.on("click","#files-root-btn",()=>o("files-root-input",ie)),b.on("click","#git-root-btn",()=>o("git-root-input",Se)),b.on("keydown","#files-root-input",l=>{l.key==="Enter"&&o("files-root-input",ie)}),b.on("keydown","#git-root-input",l=>{l.key==="Enter"&&o("git-root-input",Se)}),b.on("click","#btn-opts",()=>{i("chat-opts").classList.toggle("hidden"),Ee()}),b.on("change","#sel-agent",(l,f)=>{let m=$.peek(),g=f.value;m!==g&&(c.sessionId=null,Ne(g),se(Oe(g)||N.peek()),i("sel-permission").value=ue.peek(),et(),C(`Agent \u2192 ${Z[g]||g} \xB7 model ${N.peek()} \xB7 new session`))}),b.on("change","#sel-convert-agent",async(l,f)=>{let m=f.value;if(!m)return;let g=c.sessionId;if(!g){alert("No active session to convert."),f.value="";return}let w=c.agent||$.peek()||"claude";if(w===m){alert("Cannot convert to the same agent."),f.value="";return}f.disabled=!0,C(`Converting session ${g.slice(0,8)} from ${w} to ${m}...`);try{let y=await x("POST",`/api/sessions/${g}/convert`,{targetAgent:m,sourceAgent:w});y&&y.success?(C(`\u2713 Converted successfully. New session: ${y.targetSessionId.slice(0,8)}`),await We(),await nt(y.targetSessionId,E.peek()?.path||null,null,y.targetAgent),Is()):C("Failed to convert session.")}catch(y){C(`Error converting session: ${y.message}`),alert(`Error converting session: ${y.message}`)}finally{f.disabled=!1,f.value=""}}),b.on("change","#sel-model",(l,f)=>{se(f.value),Xa()}),b.on("click","#btn-model-add",()=>Za({editCurrent:!1})),b.on("click","#btn-model-edit",()=>Za({editCurrent:!0})),b.on("change","#sel-effort",(l,f)=>{te.value=f.value}),b.on("change","#sel-permission",(l,f)=>{ue.value=f.value}),b.on("change","#sel-density",(l,f)=>{Ko(f.value),C(`Density \u2192 ${f.value} (applies to new tool calls; reload session to re-group history)`)}),document.addEventListener("agent-changed",et),b.on("click","#btn-new-session, #btn-new-session-current, #btn-new-session-welcome",ai),b.on("click","#new-session-cancel",()=>i("modal-new-session").close()),b.on("click","#new-session-start",ri),b.on("change","#new-session-agent",oi),b.on("keydown","#new-session-path",l=>{l.key==="Enter"&&ri()}),b.on("click","#send-btn",Es),b.on("click","#stop-btn",hl),b.on("click","#btn-logout",()=>{c.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload()}),b.on("click","[data-pick-machine]",async(l,f)=>{let m=f.dataset.pickMachine;if(!m||m===_.peek()){Sn();return}await Zr(m,{forceReload:!0}),xa()});let r=async()=>{let l=i("machine-picker-status");if(l&&(l.textContent="\u5237\u65B0\u4E2D\u2026"),await kn(),lo(),Us(),Ot(),l){let f=(le.peek()||[]).filter(m=>m.online!==!1).length;l.textContent=`${f} online`}};b.on("click","#btn-refresh-machines",r),b.on("click","#btn-refresh-machines-menu",async l=>{l.stopPropagation(),await r()}),b.on("click","#btn-machine-menu",async l=>{l.stopPropagation(),wn(),rn();let f=i("machine-menu");f&&(f.classList.contains("hidden")?(await kn(),Us(),f.classList.remove("hidden")):f.classList.add("hidden"))}),b.on("click","#btn-recent-sessions",l=>{l.preventDefault(),l.stopPropagation(),Sn(),rn(),pc();let f=!i("recent-menu")?.classList.contains("hidden"),m=i("btn-recent-sessions");m&&m.setAttribute("aria-expanded",f?"true":"false")}),b.on("click","#recent-menu-backdrop",l=>{l.preventDefault(),l.stopPropagation(),wn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",l=>{let f=i("machine-menu-wrap");f&&!f.contains(l.target)&&Sn();let m=i("recent-menu"),g=i("btn-recent-sessions"),w=l.target;if(m&&!m.classList.contains("hidden")){if(m.contains(w)||g?.contains(w))return;wn(),g?.setAttribute("aria-expanded","false")}}),b.on("click","#btn-notifications",l=>{l.preventDefault(),l.stopPropagation(),Sn(),wn(),tl()}),window.addEventListener("resize",()=>{i("recent-menu")&&!i("recent-menu").classList.contains("hidden")&&Or()}),b.on("click","#recent-menu [data-session-id]",()=>{wn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),b.on("click","[data-dismiss-recent-session]",(l,f)=>{l.preventDefault(),l.stopPropagation(),dc({sessionId:f.dataset.dismissRecentSession,agent:f.dataset.dismissRecentAgent||"claude",machineId:f.dataset.dismissRecentMachine||null})}),b.on("click","#btn-edit-project-notes, #project-goal-text, #project-notes-text",()=>{Sc()}),b.on("click","#btn-cancel-project-notes",()=>{ns()});let d=async()=>{let l=i("project-goal-input")?.value?.trim()??"",f=i("project-notes-input")?.value?.trim()??"",m=E.peek();if(!(!m||!m.path))try{let g=await x("POST","/api/projects/notes",{root:m.path,goal:l,notes:f});kc(g.goal||"",g.notes||""),ns()}catch(g){alert(`Error saving project notes: ${g.message}`)}};b.on("click","#btn-save-project-notes",d),b.on("keydown","#project-goal-input",l=>{l.key==="Enter"&&d(),l.key==="Escape"&&ns()}),b.on("keydown","#project-notes-input",l=>{l.key==="Escape"&&ns()}),b.on("click","[data-fav-toggle]",(l,f)=>{l.stopPropagation(),l.preventDefault();let m=f.dataset.favSessionMachine||c.machineId;m&&(c.machineId=m,localStorage.setItem("machineId",m)),Ic(f.dataset.favSessionId,f.dataset.favSessionAgent||"claude",{machineId:m||null})}),b.on("click","[data-hide-toggle]",(l,f)=>{l.stopPropagation(),l.preventDefault();let m=f.dataset.hideSessionMachine||c.machineId;m&&(c.machineId=m,localStorage.setItem("machineId",m)),Tc(f.dataset.hideSessionId,f.dataset.hideSessionAgent||"claude",{machineId:m||null})}),b.on("click","#btn-edit-session-notes, #session-notes-text",()=>{Lc()}),b.on("click","#btn-cancel-session-notes",()=>tt()),b.on("click","#btn-save-session-notes",async()=>{let l=i("session-notes-input")?.value?.trim()||"";if(!c.sessionId)return;let f=c.agent||$.peek()||"claude";await Vr(c.sessionId,f,l)&&tt()}),b.on("keydown","#session-notes-input",async l=>{if(l.key==="Escape"&&tt(),l.key==="Enter"){let f=l.target.value.trim();if(!c.sessionId)return;let m=c.agent||$.peek()||"claude";await Vr(c.sessionId,m,f)&&tt()}}),b.on("click","#btn-fav-filter",()=>{let l=!ze.peek();ze.value=l,localStorage.setItem("favoritesOnly",l?"1":"0"),i("btn-fav-filter")?.classList.toggle("active",l),l&&Je.peek()&&(Je.value=!1,localStorage.setItem("showHiddenOnly","0"),i("btn-hidden-filter")?.classList.remove("active"))}),b.on("click","#btn-hidden-filter",()=>{let l=!Je.peek();Je.value=l,localStorage.setItem("showHiddenOnly",l?"1":"0"),i("btn-hidden-filter")?.classList.toggle("active",l),l&&ze.peek()&&(ze.value=!1,localStorage.setItem("favoritesOnly","0"),i("btn-fav-filter")?.classList.remove("active"))}),et(),je(()=>{M.value,_.value,c.token&&xa()}),i("sel-permission").value=ue.peek(),yl();let u=i("sel-density");u&&(u.value=_e.peek()||"normal"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=Qt.peek().includes(l.dataset.agentOption)}),i("filter-favorites")&&(i("filter-favorites").checked=ze.peek()),i("filter-hidden")&&(i("filter-hidden").checked=Je.peek()),document.querySelectorAll("[data-agent-filter]").forEach(l=>{l.classList.toggle("active",l.dataset.agentFilter===ye.peek())}),i("btn-fav-filter")?.classList.toggle("active",ze.peek()),i("btn-hidden-filter")?.classList.toggle("active",Je.peek()),document.querySelectorAll("[data-view]").forEach(l=>{let f=l.dataset.view===gt.peek();l.classList.toggle("bg-primary/15",f),l.classList.toggle("text-primary",f),l.classList.toggle("font-medium",f),l.classList.toggle("text-base-content/50",!f)})}K();tr();G();ce();gs();rr();wa();Pn();tn();nn();lr();Nt();Nt();function $p(){return Z[$.peek()]||"Assistant"}function Sp(e){let t=String(e||"").trim();return/remote compact task|error decoding response body/i.test(t)?"Codex \u4F1A\u8BDD\u538B\u7F29\u5931\u8D25\uFF08\u7F51\u7EDC\u4E2D\u65AD\uFF09\u3002\u518D\u53D1\u4E00\u6761\u6D88\u606F\u91CD\u8BD5\uFF0C\u6216\u5F00\u65B0\u4F1A\u8BDD\u3002":t||"\u53D1\u9001\u5931\u8D25"}var Ln=null;function Lp(e){return xs(e)}function Gc(e){return e?(Ln&&Ln.el===e||(Ln?.destroy?.(),Ln=ka(e),Ln.el=e),Ln):null}function Re(e,t){if(!e||e.dataset.historyPainting==="1")return;Gc(e).stick(!!t)}var zs=0,jt=null,at=1e3,At=0,bo=null,qc=!1,vo=!1,Rc=null,xo=!1,ui="hubStreamCursors",Io=new Map,Ep=0,pi=new Set,fi="pendingUserTexts",En=(()=>{try{let e=JSON.parse(sessionStorage.getItem(fi)||"[]");return Array.isArray(e)?e.filter(t=>t?.key&&t?.text).slice(-30):[]}catch{return[]}})(),Bc=new Set,Kc=new Map;function zc(){try{En.length?sessionStorage.setItem(fi,JSON.stringify(En.slice(-30))):sessionStorage.removeItem(fi)}catch{}}function Ip(){let e=Xs(),t=En.filter(n=>n.key===e).length;t&&!Bc.has(e)&&(Bc.add(e),H(`\u231B Restored ${t} queued prompt${t===1?"":"s"} in this browser tab`))}function Jc(e=c.sessionId,t=c.agent,n=c.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function Tp(e={}){let t=Jc(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(ui)||"{}")[t])||0}catch{return 0}}function Cp(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=Jc(e.sessionId||c.sessionId,e.agent||c.agent,c.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(ui)||"{}")||{}}catch{}let a=Number(s[n])||0;if(t<=a)return!1;s[n]=t;let o=Object.keys(s);o.length>500&&o.sort((r,d)=>Number(s[d])-Number(s[r])).slice(500).forEach(r=>delete s[r]);try{localStorage.setItem(ui,JSON.stringify(s))}catch{}return!0}function Xs({sessionId:e=c.sessionId,agent:t=c.agent,machineId:n=c.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function Mp(){qc||(qc=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(at=400,as({probe:!0}),c.ws?.readyState===WebSocket.OPEN&&c.sessionId))try{c.ws.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}}),window.addEventListener("online",()=>{at=400,as({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?as({force:!0}):as({probe:!0})}),window.addEventListener("focus",()=>as({probe:!0})),navigator.connection?.addEventListener?.("change",()=>{at=400,as({probe:!0})}))}function Qs(){let e=i("conn-dot");if(!e)return;let t=me.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 as(e={}){let t=c.ws?.readyState;if(e.force){at=400,$o({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&At&&Date.now()-At>45e3)try{c.ws.close()}catch{}else if(e.probe&&c.ws.readyState===WebSocket.OPEN)try{c.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(at=Math.min(at,800),$o({quiet:!0}))}function Ap(){jt||(me.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Qs(),jt=setTimeout(()=>{jt=null,$o({quiet:!0})},at),at=Math.min(Math.round(at*1.8),15e3))}function Qc(){bo&&(clearInterval(bo),bo=null)}function jp(e,t){Qc(),bo=setInterval(()=>{if(!(t!==zs||e.readyState!==WebSocket.OPEN)){if(At&&Date.now()-At>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&At&&Date.now()-At>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function Dt(){let e=P.peek()||!!E.peek()&&me.peek()==="open";va(e)}function ko(){return(c.role||"editor")==="viewer"?"\u53EA\u8BFB\u8D26\u53F7\uFF0C\u65E0\u6CD5\u8F93\u5165":c.lock?.foreign?`\u4F1A\u8BDD\u7531 ${c.lock.holder&&c.lock.holder!=="viewer"?c.lock.holder:"\u5176\u4ED6\u7528\u6237"} \u5360\u7528\uFF08\u9501\uFF09`:"\u5F53\u524D\u65E0\u6CD5\u8F93\u5165"}function os(){let e=sn();c.externalSessionReadOnly=!e;let t=i("chat-input"),n=i("send-btn"),s=i("btn-attach"),a=i("session-lock-banner");t&&(t.disabled=!e,t.readOnly=!e,e?P.peek()?t.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":Vs(t.value||""):t.placeholder=ko()),n&&(n.disabled=!e),s&&(s.disabled=!e),a&&(e?(a.classList.add("hidden"),a.textContent=""):(a.classList.remove("hidden"),a.textContent=ko()))}function Dp(){at=400,jt&&(clearTimeout(jt),jt=null),xo=!1;let e=c.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{c.ws?.close()}catch{}$o({quiet:!1}),H("\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65\u2026")}function $o(e={}){Mp(),jt&&(clearTimeout(jt),jt=null),e.quiet&&(xo=!0);let t=c.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);Rc!==t&&(da(),Rc=t);let n=++zs;try{c.ws?.close()}catch{}me.value="connecting",Qs();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;c.token&&a.set("token",c.token),t&&a.set("machine",t),c.sessionId&&a.set("sessionId",c.sessionId),c.agent&&a.set("agent",c.agent);let o=Tp();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);c.ws=r,r.addEventListener("open",()=>{if(n===zs){if(at=1e3,At=Date.now(),me.value="open",Qs(),c.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}ca(),Ip(),jp(r,n),Dt(),vo&&!xo&&H(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),vo=!1,xo=!1}}),r.addEventListener("message",d=>{if(n!==zs)return;let u;try{u=JSON.parse(d.data)}catch{return}if(Cp(u)){if(u.type==="pong"){At=Date.now();return}if(u.type==="ping"){if(At=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(u.type==="run-status"){u.running?P.value=!0:(P.peek()&&(P.value=!1),mi()),Dt();return}Vc(u)}}),r.addEventListener("close",()=>{n===zs&&(Qc(),vo=!0,me.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Qs(),Ap())}),r.addEventListener("error",()=>{})}function mi(){if(!En.length||P.peek())return;let e=Xs(),t=En.findIndex(a=>a.key===e);if(t<0)return;let[n]=En.splice(t,1);zc();let s=i("chat-input");s&&(s.value=n.text,Ys(s)),setTimeout(()=>{if(n.key!==Xs()||P.peek()){Kc.set(n.key,n.text);return}Zs()},0)}function ho(){P.value=!1,Dt(),mi()}var _p=0;function Vc(e){if(!(e?.sessionId&&c.sessionId&&e.sessionId!==c.sessionId)){if(e&&typeof e.type=="string"&&(e.type==="note.added"||e.type==="note.updated"||e.type==="note.removed"||e.type==="queue.item.added"||e.type==="queue.item.updated"||e.type==="queue.item.removed"||e.type==="queue.item.moved"||e.type==="queue.item.sending")){window.dispatchEvent(new CustomEvent("hub-ws-message",{detail:e}));let t={"note.added":"hub:note-added","note.updated":"hub:note-updated","note.removed":"hub:note-removed"}[e.type];t&&window.dispatchEvent(new CustomEvent(t,{detail:e}))}if(e._hubReplay===!0){document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)Vc(t);return}if(["assistant","assistant_stream_start","assistant_delta","thought_delta","tool_use"].includes(e.type)&&_p++,e.type==="session-created"){let t=N.peek();c.sessionId=e.sessionId,e.agent&&e.agent!==$.peek()&&Ne(e.agent),se(t,e.agent||$.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-sessions-changed"){document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-session-updated"){document.dispatchEvent(new CustomEvent("sessions-changed")),document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="notification"&&e.notification){ya(e.notification);return}if(e.type==="grok-queue-status"){ef(e);return}if(e.type==="result"){Js(),Ks(),rs();let t=e.usage;if(t){let n={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};c.lastUsage=n,c.sessionId&&(c.lastUsageSessionId=c.sessionId),yo(n)}e.is_error||H("\u2713 Done"),ho();return}if(e.type==="complete"){Js(),Ks(),rs(),!e.aborted&&e.agent==="claude"?H("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?H("\u2713 Done"):e.aborted&&H("\u5DF2\u505C\u6B62")),ho();return}if(e.type==="error"){Js(),Ks(),(e.code===423||/locked/i.test(String(e.message||"")))&&(c.lock={...c.lock||{},held:!1,foreign:!0,holder:e.lock?.holder||c.lock?.holder||"another user"},os()),is("error","Error",Sp(e.message)),ho();return}if(e.type==="shell-start"){c.shellBubble=null;return}if(e.type==="shell-output"){c.shellBubble||(c.shellBubble=sf(e.stream==="stderr"?"shell-err":"shell")),af(c.shellBubble,e.data);return}if(e.type==="shell-exit"){c.shellBubble=null,H(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),ho();return}if(e.type==="assistant"){Ks();for(let t of e.message?.content||[])t.type==="text"&&t.text?(rs(),is("assistant",$p(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&lf(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){P.peek()||(P.value=!0,Dt()),Yc(e.ts);return}if(e.type==="assistant_delta"){P.peek()||(P.value=!0,Dt()),Np(e.data||"");return}if(e.type==="assistant_stream_end"){Ks();return}if(e.type==="thought_stream_start"){Xc();return}if(e.type==="thought_delta"){Pp(e.data||"");return}if(e.type==="thought_stream_end"){Js();return}if(e.type==="status"){let t=i("stream-status");if(t)t.textContent=e.message||"";else{let n=i("messages");n&&e.message&&(n.insertAdjacentHTML("beforeend",`<div id="stream-status" class="text-center text-[10px] text-base-content/35 py-0.5">${p(e.message)}</div>`),Re(n))}return}if(e.type==="permission_resolved"){let t=e.requestId||e.request_id;t&&i(`perm-${t}`)?.remove();return}(e.type==="permission_request"||e.request_id&&e.tool_name)&&cf(e)}}var st=null,Ge=null,Ft=null,ht=null;function Yc(e){let t=i("messages");if(!t||(rs(),Js(),st&&t.contains(st)))return;let n=So(e||Date.now()),s=Lo(e||Date.now());t.insertAdjacentHTML("beforeend",`
1148
1148
  <div class="msg-row assistant px-2 live-stream" data-ts="${p(s)}">
1149
1149
  <div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-base-200 break-words md">
1150
1150
  <div class="msg-stream-body whitespace-pre-wrap"></div>
1151
1151
  </div>
1152
1152
  ${n?`<div class="msg-ts" title="${p(s)}">${p(n)}</div>`:""}
1153
- </div>`),st=t.lastElementChild,Ge=st.querySelector(".msg-stream-body"),i("stream-status")?.remove(),Re(t)}function Dp(e){e&&(Ge||Qc(Date.now()),Ge&&(Ge.textContent+=e,Re(i("messages"))))}function Gs(){if(!st||!Ge){st=null,Ge=null;return}let e=Ge.textContent||"";e.trim()?(Ge.classList.remove("whitespace-pre-wrap"),Ge.classList.add("md"),Ge.innerHTML=yo(e),nd(st),td(st,e)):st.remove(),st=null,Ge=null,i("stream-status")?.remove()}function Vc(){let e=i("messages");e&&(Bt&&e.contains(Bt)||(e.insertAdjacentHTML("beforeend",`
1153
+ </div>`),st=t.lastElementChild,Ge=st.querySelector(".msg-stream-body"),i("stream-status")?.remove(),Re(t)}function Np(e){e&&(Ge||Yc(Date.now()),Ge&&(Ge.textContent+=e,Re(i("messages"))))}function Ks(){if(!st||!Ge){st=null,Ge=null;return}let e=Ge.textContent||"";e.trim()?(Ge.classList.remove("whitespace-pre-wrap"),Ge.classList.add("md"),Ge.innerHTML=wo(e),ad(st),sd(st,e)):st.remove(),st=null,Ge=null,i("stream-status")?.remove()}function Xc(){let e=i("messages");e&&(Ft&&e.contains(Ft)||(e.insertAdjacentHTML("beforeend",`
1154
1154
  <div class="msg-row assistant px-2 thought-stream">
1155
1155
  <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">
1156
1156
  <div class="font-medium text-base-content/35 mb-0.5">thinking\u2026</div>
1157
1157
  <div class="thought-body font-mono whitespace-pre-wrap max-h-24 overflow-y-auto opacity-80"></div>
1158
1158
  </div>
1159
- </div>`),Bt=e.lastElementChild,mt=Bt.querySelector(".thought-body"),Re(e)))}function _p(e){e&&(mt||Vc(),mt&&(mt.textContent+=e,mt.scrollTop=mt.scrollHeight,Re(i("messages"))))}function zs(){if(Bt&&mt){let e=(mt.textContent||"").length;Bt.innerHTML=`
1160
- <div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}Bt=null,mt=null}var Np={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"};function Pp(e){let[t,...n]=e.slice(1).trim().split(/\s+/),s=n.join(" ");switch(t.toLowerCase()){case"agent":{if(!s)return P(`Current agent: ${$.peek()} \xB7 agents: claude | codex | grok | gemini | cursor`),!0;let a=s.toLowerCase();return["claude","codex","grok","gemini","cursor"].includes(a)?(a!==$.peek()?(c.sessionId=null,Ne(a),se(Be(a)),document.dispatchEvent(new CustomEvent("agent-changed")),P(`Agent \u2192 ${Z[a]} \xB7 model ${_.peek()} \xB7 new session`)):P(`Agent already ${Z[a]}`),!0):(P(`Unknown agent "${s}" \xB7 valid: claude | codex | grok | gemini | cursor`),!0)}case"model":{if(!s){let d=$.peek(),u=Oe(d).map(l=>l.value).join(" | ");return P(`Current model: ${_.peek()} (${d})${u?`
1161
- Available: ${u}`:""}`),!0}let a=Np[s.toLowerCase()]||s,o=$.peek()||"claude",r=Oe(o).some(d=>d.value===a);return r||Jt(o,a),se(a),P(`Model set to ${a}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let a=Qt($.peek(),_.peek());return s?a.includes(s.toLowerCase())?(te.value=s.toLowerCase(),P(`Effort set to ${s.toLowerCase()}`),!0):(P(`Unknown effort level "${s}" \xB7 valid: ${a.join(" | ")}`),!0):(P(`Current effort: ${te.peek()||"(default)"} \xB7 levels: ${a.join(" | ")}`),!0)}case"clear":return Vp(),c.sessionId=null,c.lastUsage=null,P("Cleared \xB7 new session"),!0;case"usage":return Hp(),!0;case"help":return P(`Available slash commands:
1159
+ </div>`),Ft=e.lastElementChild,ht=Ft.querySelector(".thought-body"),Re(e)))}function Pp(e){e&&(ht||Xc(),ht&&(ht.textContent+=e,ht.scrollTop=ht.scrollHeight,Re(i("messages"))))}function Js(){if(Ft&&ht){let e=(ht.textContent||"").length;Ft.innerHTML=`
1160
+ <div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}Ft=null,ht=null}var Hp={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"};function qp(e){let[t,...n]=e.slice(1).trim().split(/\s+/),s=n.join(" ");switch(t.toLowerCase()){case"agent":{if(!s)return H(`Current agent: ${$.peek()} \xB7 agents: claude | codex | grok | gemini | cursor`),!0;let a=s.toLowerCase();return["claude","codex","grok","gemini","cursor"].includes(a)?(a!==$.peek()?(c.sessionId=null,Ne(a),se(Oe(a)),document.dispatchEvent(new CustomEvent("agent-changed")),H(`Agent \u2192 ${Z[a]} \xB7 model ${N.peek()} \xB7 new session`)):H(`Agent already ${Z[a]}`),!0):(H(`Unknown agent "${s}" \xB7 valid: claude | codex | grok | gemini | cursor`),!0)}case"model":{if(!s){let d=$.peek(),u=Be(d).map(l=>l.value).join(" | ");return H(`Current model: ${N.peek()} (${d})${u?`
1161
+ Available: ${u}`:""}`),!0}let a=Hp[s.toLowerCase()]||s,o=$.peek()||"claude",r=Be(o).some(d=>d.value===a);return r||Vt(o,a),se(a),H(`Model set to ${a}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let a=Yt($.peek(),N.peek());return s?a.includes(s.toLowerCase())?(te.value=s.toLowerCase(),H(`Effort set to ${s.toLowerCase()}`),!0):(H(`Unknown effort level "${s}" \xB7 valid: ${a.join(" | ")}`),!0):(H(`Current effort: ${te.peek()||"(default)"} \xB7 levels: ${a.join(" | ")}`),!0)}case"clear":return Xp(),c.sessionId=null,c.lastUsage=null,H("Cleared \xB7 new session"),!0;case"usage":return Rp(),!0;case"help":return H(`Available slash commands:
1162
1162
  /agent [claude|codex|grok|gemini|cursor]
1163
1163
  /model [haiku|sonnet|opus|<model-id>]
1164
1164
  /effort [low|medium|high|xhigh|max]
1165
1165
  /usage
1166
1166
  /clear
1167
- /help`),!0;default:return!1}}function Ce(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 Hp(){let e=$.peek()||"claude",t=_.peek()||"\u2014",n=c.sessionId,s=[`Agent: ${Z[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(c.lastUsage&&(!n||c.lastUsageSessionId===n)){let a=c.lastUsage;s.push(`Last turn: \u2191${Ce(a.input_tokens)} \u2193${Ce(a.output_tokens)}`+(a.cache_read_input_tokens?` \xB7 ${Ce(a.cache_read_input_tokens)} cached`:"")+(a.reasoning_tokens?` \xB7 ${Ce(a.reasoning_tokens)} reason`:"")+(a.total_tokens?` \xB7 \u03A3${Ce(a.total_tokens)}`:"")+(a.costUSD!=null?` \xB7 $${Number(a.costUSD).toFixed(4)}`:""))}if(!n){P(s.join(`
1168
- `)),hi("\u25C8 /usage \xB7 no session yet");return}P("Loading usage\u2026");try{let a=new URLSearchParams({sessionId:n,agent:e}),r=(await x("GET",`/api/usage?${a}`)).context||{};if(r.model&&(s[1]=`Model: ${r.model}`),r.title&&s.push(`Title: ${r.title}`),r.tokensUsed!=null||r.windowTokens!=null||r.usagePercent!=null){let u=r.tokensUsed!=null?Ce(r.tokensUsed):"\u2014",l=r.windowTokens!=null?Ce(r.windowTokens):"\u2014",f=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";s.push(`Context window: ${u} / ${l} (${f})`)}if(r.turnCount!=null&&s.push(`Turns: ${r.turnCount}`),r.toolCallCount!=null&&s.push(`Tools: ${r.toolCallCount}`),r.sessionDurationSeconds!=null){let u=Math.floor(r.sessionDurationSeconds/60),l=Math.round(r.sessionDurationSeconds%60);s.push(`Duration: ${u}m ${l}s`)}if(r.sessionTotals){let u=r.sessionTotals;s.push(`Session totals: \u2191${Ce(u.input_tokens)} \u2193${Ce(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ce(u.cache_read_input_tokens)} cached`:"")+(u.total_tokens?` \xB7 \u03A3${Ce(u.total_tokens)}`:"")+(u.costUSD?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}if(r.lastTurn&&!c.lastUsage){let u=r.lastTurn;s.push(`Last completed turn: \u2191${Ce(u.input_tokens)} \u2193${Ce(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ce(u.cache_read_input_tokens)} cached`:"")+(u.costUSD!=null?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}r.note&&s.push(r.note);let d=i("messages");if(d){let u=[...d.children];for(let l=u.length-1;l>=0;l--)if(u[l].textContent==="Loading usage\u2026"){u[l].remove();break}}P(s.join(`
1169
- `)),(r.tokensUsed!=null||r.windowTokens!=null)&&Qp({tokensUsed:r.tokensUsed,windowTokens:r.windowTokens,usagePercent:r.usagePercent,model:r.model||t,turnCount:r.turnCount,toolCallCount:r.toolCallCount}),r.sessionTotals?xo(r.sessionTotals):r.lastTurn?xo(r.lastTurn):c.lastUsage&&xo(c.lastUsage)}catch(a){let o=i("messages");if(o){let r=[...o.children];for(let d=r.length-1;d>=0;d--)if(r[d].textContent==="Loading usage\u2026"){r[d].remove();break}}P(`${s.join(`
1167
+ /help`),!0;default:return!1}}function Ce(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 Rp(){let e=$.peek()||"claude",t=N.peek()||"\u2014",n=c.sessionId,s=[`Agent: ${Z[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(c.lastUsage&&(!n||c.lastUsageSessionId===n)){let a=c.lastUsage;s.push(`Last turn: \u2191${Ce(a.input_tokens)} \u2193${Ce(a.output_tokens)}`+(a.cache_read_input_tokens?` \xB7 ${Ce(a.cache_read_input_tokens)} cached`:"")+(a.reasoning_tokens?` \xB7 ${Ce(a.reasoning_tokens)} reason`:"")+(a.total_tokens?` \xB7 \u03A3${Ce(a.total_tokens)}`:"")+(a.costUSD!=null?` \xB7 $${Number(a.costUSD).toFixed(4)}`:""))}if(!n){H(s.join(`
1168
+ `)),bi("\u25C8 /usage \xB7 no session yet");return}H("Loading usage\u2026");try{let a=new URLSearchParams({sessionId:n,agent:e}),r=(await x("GET",`/api/usage?${a}`)).context||{};if(r.model&&(s[1]=`Model: ${r.model}`),r.title&&s.push(`Title: ${r.title}`),r.tokensUsed!=null||r.windowTokens!=null||r.usagePercent!=null){let u=r.tokensUsed!=null?Ce(r.tokensUsed):"\u2014",l=r.windowTokens!=null?Ce(r.windowTokens):"\u2014",f=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";s.push(`Context window: ${u} / ${l} (${f})`)}if(r.turnCount!=null&&s.push(`Turns: ${r.turnCount}`),r.toolCallCount!=null&&s.push(`Tools: ${r.toolCallCount}`),r.sessionDurationSeconds!=null){let u=Math.floor(r.sessionDurationSeconds/60),l=Math.round(r.sessionDurationSeconds%60);s.push(`Duration: ${u}m ${l}s`)}if(r.sessionTotals){let u=r.sessionTotals;s.push(`Session totals: \u2191${Ce(u.input_tokens)} \u2193${Ce(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ce(u.cache_read_input_tokens)} cached`:"")+(u.total_tokens?` \xB7 \u03A3${Ce(u.total_tokens)}`:"")+(u.costUSD?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}if(r.lastTurn&&!c.lastUsage){let u=r.lastTurn;s.push(`Last completed turn: \u2191${Ce(u.input_tokens)} \u2193${Ce(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ce(u.cache_read_input_tokens)} cached`:"")+(u.costUSD!=null?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}r.note&&s.push(r.note);let d=i("messages");if(d){let u=[...d.children];for(let l=u.length-1;l>=0;l--)if(u[l].textContent==="Loading usage\u2026"){u[l].remove();break}}H(s.join(`
1169
+ `)),(r.tokensUsed!=null||r.windowTokens!=null)&&Yp({tokensUsed:r.tokensUsed,windowTokens:r.windowTokens,usagePercent:r.usagePercent,model:r.model||t,turnCount:r.turnCount,toolCallCount:r.toolCallCount}),r.sessionTotals?yo(r.sessionTotals):r.lastTurn?yo(r.lastTurn):c.lastUsage&&yo(c.lastUsage)}catch(a){let o=i("messages");if(o){let r=[...o.children];for(let d=r.length-1;d>=0;d--)if(r[d].textContent==="Loading usage\u2026"){r[d].remove();break}}H(`${s.join(`
1170
1170
  `)}
1171
- (usage fetch failed: ${a.message})`)}}function Xs(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(!tn()){P(wo()),yt().then(()=>as()).catch(()=>{});return}if(c.sessionId&&!c.lock?.held&&!c.lock?.unmanaged){yt().then(s=>{if(!s?.ok&&!s?.skipped){as(),P(wo());return}Xs()}).catch(()=>Xs());return}if(N.peek()){if($.peek()==="grok"&&c.sessionId){let s="grok",a=te.peek()||Qe(s,_.peek())||"low",o=lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:_.peek(),lockToken:c.lock?.token||void 0,effort:a,...de.peek()&&{permissionMode:de.peek()},...de.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});ed(t),e.value="",Vs(e),Qs(""),li(),P(o?"\u5DF2\u52A0\u5165 Grok \u670D\u52A1\u7AEF\u961F\u5217\uFF0C\u5237\u65B0\u9875\u9762\u4ECD\u4F1A\u663E\u793A":"\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5C06\u5728\u91CD\u8FDE\u540E\u53D1\u9001");return}Sn.push({key:Ys(),text:t}),Gc(),e.value="",Vs(e),Qs(""),li(),P(`\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="",Wc.delete(Ys()),Vs(e),Qs(""),li(),t.startsWith("/")&&Pp(t))return;N.value=!0,jt();let n=Date.now();if(Yc(t))rs("shell","$ Shell",t.slice(1).trim(),{ts:n}),lt({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:E.peek().path})||P("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{os(),rs("user","You",t,{ts:n,forceStick:!0});let s=$.peek()||"claude",a=te.peek()||Qe(s,_.peek())||(s==="grok"?"low":""),o=de.peek();c.sessionId&&se(_.peek(),s,c.sessionId),lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:_.peek(),lockToken:c.lock?.token||void 0,...a&&{effort:a},...o&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||P("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function Qs(e){let t=Yc(e),n=i("chat-input"),s=i("send-btn");if(!n||!s)return;n.classList.toggle("textarea-warning",t),n.style.fontFamily=t?"monospace":"",s.classList.toggle("btn-warning",t),s.classList.toggle("btn-primary",!t),s.textContent=t?"Run":"Send";let a=Z[$.peek()]||"agent",o=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches;t?n.placeholder=o?"Shell \u547D\u4EE4\u2026":"Shell command (without !)\u2026":n.placeholder=o?`\u95EE ${a}\u2026`:`Ask ${a}\u2026 or !cmd for shell`}function Yc(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function qp(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function Vs(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,qp())+"px"}var Rp=200,Op=500;function $o(e){let t=O(e);if(t==null)return"";let n=new Date(t);if(Number.isNaN(n.getTime()))return"";let s=new Date,a=n.toDateString()===s.toDateString(),o=n.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1});return a?o:`${n.toLocaleDateString(void 0,{month:"numeric",day:"numeric"})} ${o}`}function So(e){let t=O(e);return t==null?"":new Date(t).toISOString()}function Bp(e,t,n){if(e==="system")return t;let s=$o(n),a=So(n),o=s?`<div class="msg-ts" title="${p(a)}">${p(s)}</div>`:"";return`<div class="msg-row ${e==="user"?"user":e==="shell"||e==="shell-err"?"assistant":e} px-2" data-ts="${p(a)}">${t}${o}</div>`}function Up(e,t,n){let s='<button class="msg-expand-btn text-[10px] text-primary/70 mt-1.5 block cursor-pointer hover:text-primary">\u25BC Show more</button>',a;switch(e){case"user":{let r=/!\[.*?\]\(.*?\)/.test(t)?yo(t):null,d=t.length>Rp,u=d?`<div class="msg-body">${r??p(t.trimEnd())}</div>${s}`:r??p(t.trimEnd());a=`<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${d?" msg-card":""}${r?" md":""}"${r?"":' style="white-space:pre-wrap"'}>${u}</div>`;break}case"assistant":{let o=t.length>Op,r=o?`<div class="msg-body">${yo(t)}</div>${s}`:yo(t);a=`<div class="msg-assistant-content 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${o?" msg-card":""}">${r}</div>`;break}case"error":a=`<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">${p(t)}</div>`;break;case"shell":case"shell-err":a=`<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">${p(t)}</div>`;break;case"system":return`<div class="text-center text-[11px] text-base-content/30 py-0.5 select-none">${p(t)}</div>`;default:a=`<div class="rounded-lg px-3 py-2 text-sm bg-base-300 break-words" style="white-space:pre-wrap">${p(t)}</div>`}return Bp(e,a,n)}function rs(e,t,n,s={}){let a=i("messages");if(!a)return;let o=O(s.ts)??(e==="system"?null:Date.now());a.insertAdjacentHTML("beforeend",Up(e,n,o)),nd(a.lastElementChild),e==="assistant"&&td(a.lastElementChild,n,s),Re(a,!!s.forceStick)}function P(e){rs("system","",e)}var Ut=[],ho=0,Rc=!1;async function Fp(e,t){let n=t||`upload-${Date.now()}`,s=await Xc(e,n),a=ct({"x-filename":n});delete a["Content-Type"],s?.type&&!a["Content-Type"]&&!a["content-type"]&&(a["Content-Type"]=s.type);let o=await fetch("/api/upload-image",{method:"POST",headers:a,body:s});if(!o.ok){let d=await o.json().catch(()=>({}));throw new Error(d.error||`Upload failed: ${o.status}`)}let r=await o.json();if(!r?.path)throw new Error("upload returned no path");return r.path}function Wp(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 Xc(e,t){if(!e||!fi({type:e.type,name:t}))return e;let n;try{n=(await e.slice(0,80).text()).trim()}catch{return e}if(!/^(?:data:image\/[a-z0-9.+-]+;base64,|iVBORw0KGgo|\/9j\/|R0lGOD|UklGR)/i.test(n))return e;let s;try{s=(await e.text()).trim()}catch{return e}let o=/^data:image\/[a-z0-9.+-]+;base64,([a-z0-9+/=\s]+)$/i.exec(s)?.[1]||s;if(!o||!/^[a-z0-9+/=\s]+$/i.test(o)||o.length%4===1)return e;try{let r=atob(o.replace(/\s/g,"")),d=Uint8Array.from(r,f=>f.charCodeAt(0)),u=Wp(d,e.type);return u===(e.type||"image/png")&&!/^(image\/png|image\/jpeg|image\/gif|image\/webp)$/.test(u)?e:d.length>=3&&(d[0]===137&&d[1]===80&&d[2]===78||d[0]===255&&d[1]===216&&d[2]===255||String.fromCharCode(...d.slice(0,6))==="GIF87a"||String.fromCharCode(...d.slice(8,12))==="WEBP")?new Blob([d],{type:u}):e}catch{return e}}function Gp(e,t){if(!e)return;let n=e.selectionStart??e.value.length,s=e.selectionEnd??e.value.length,o=(n>0&&e.value[n-1]!==`
1171
+ (usage fetch failed: ${a.message})`)}}function Zs(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(!sn()){H(ko()),wt().then(()=>os()).catch(()=>{});return}if(c.sessionId&&!c.lock?.held&&!c.lock?.unmanaged){wt().then(s=>{if(!s?.ok&&!s?.skipped){os(),H(ko());return}Zs()}).catch(()=>Zs());return}if(P.peek()){if($.peek()==="grok"&&c.sessionId){let s="grok",a=te.peek()||Qe(s,N.peek())||"low",o=lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:N.peek(),lockToken:c.lock?.token||void 0,effort:a,...ue.peek()&&{permissionMode:ue.peek()},...ue.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});nd(t),e.value="",Ys(e),Vs(""),di(),H(o?"\u5DF2\u52A0\u5165 Grok \u670D\u52A1\u7AEF\u961F\u5217\uFF0C\u5237\u65B0\u9875\u9762\u4ECD\u4F1A\u663E\u793A":"\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5C06\u5728\u91CD\u8FDE\u540E\u53D1\u9001");return}En.push({key:Xs(),text:t}),zc(),e.value="",Ys(e),Vs(""),di(),H(`\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="",Kc.delete(Xs()),Ys(e),Vs(""),di(),t.startsWith("/")&&qp(t))return;P.value=!0,Dt();let n=Date.now();if(Zc(t))is("shell","$ Shell",t.slice(1).trim(),{ts:n}),lt({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:E.peek().path})||H("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{rs(),is("user","You",t,{ts:n,forceStick:!0});let s=$.peek()||"claude",a=te.peek()||Qe(s,N.peek())||(s==="grok"?"low":""),o=ue.peek();c.sessionId&&se(N.peek(),s,c.sessionId),lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:N.peek(),lockToken:c.lock?.token||void 0,...a&&{effort:a},...o&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||H("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function Vs(e){let t=Zc(e),n=i("chat-input"),s=i("send-btn");if(!n||!s)return;n.classList.toggle("textarea-warning",t),n.style.fontFamily=t?"monospace":"",s.classList.toggle("btn-warning",t),s.classList.toggle("btn-primary",!t),s.textContent=t?"Run":"Send";let a=Z[$.peek()]||"agent",o=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches;t?n.placeholder=o?"Shell \u547D\u4EE4\u2026":"Shell command (without !)\u2026":n.placeholder=o?`\u95EE ${a}\u2026`:`Ask ${a}\u2026 or !cmd for shell`}function Zc(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function Bp(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function Ys(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,Bp())+"px"}var Op=200,Up=500;function So(e){let t=B(e);if(t==null)return"";let n=new Date(t);if(Number.isNaN(n.getTime()))return"";let s=new Date,a=n.toDateString()===s.toDateString(),o=n.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1});return a?o:`${n.toLocaleDateString(void 0,{month:"numeric",day:"numeric"})} ${o}`}function Lo(e){let t=B(e);return t==null?"":new Date(t).toISOString()}function Fp(e,t,n){if(e==="system")return t;let s=So(n),a=Lo(n),o=s?`<div class="msg-ts" title="${p(a)}">${p(s)}</div>`:"";return`<div class="msg-row ${e==="user"?"user":e==="shell"||e==="shell-err"?"assistant":e} px-2" data-ts="${p(a)}">${t}${o}</div>`}function Wp(e,t,n){let s='<button class="msg-expand-btn text-[10px] text-primary/70 mt-1.5 block cursor-pointer hover:text-primary">\u25BC Show more</button>',a;switch(e){case"user":{let r=/!\[.*?\]\(.*?\)/.test(t)?wo(t):null,d=t.length>Op,u=d?`<div class="msg-body">${r??p(t.trimEnd())}</div>${s}`:r??p(t.trimEnd());a=`<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${d?" msg-card":""}${r?" md":""}"${r?"":' style="white-space:pre-wrap"'}>${u}</div>`;break}case"assistant":{let o=t.length>Up,r=o?`<div class="msg-body">${wo(t)}</div>${s}`:wo(t);a=`<div class="msg-assistant-content 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${o?" msg-card":""}">${r}</div>`;break}case"error":a=`<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">${p(t)}</div>`;break;case"shell":case"shell-err":a=`<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">${p(t)}</div>`;break;case"system":return`<div class="text-center text-[11px] text-base-content/30 py-0.5 select-none">${p(t)}</div>`;default:a=`<div class="rounded-lg px-3 py-2 text-sm bg-base-300 break-words" style="white-space:pre-wrap">${p(t)}</div>`}return Fp(e,a,n)}function is(e,t,n,s={}){let a=i("messages");if(!a)return;let o=B(s.ts)??(e==="system"?null:Date.now());a.insertAdjacentHTML("beforeend",Wp(e,n,o)),ad(a.lastElementChild),e==="assistant"&&sd(a.lastElementChild,n,s),Re(a,!!s.forceStick)}function H(e){is("system","",e)}var Wt=[],go=0,Oc=!1;async function Gp(e,t){let n=t||`upload-${Date.now()}`,s=await ed(e,n),a=ct({"x-filename":n});delete a["Content-Type"],s?.type&&!a["Content-Type"]&&!a["content-type"]&&(a["Content-Type"]=s.type);let o=await fetch("/api/upload-image",{method:"POST",headers:a,body:s});if(!o.ok){let d=await o.json().catch(()=>({}));throw new Error(d.error||`Upload failed: ${o.status}`)}let r=await o.json();if(!r?.path)throw new Error("upload returned no path");return r.path}function Kp(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 ed(e,t){if(!e||!hi({type:e.type,name:t}))return e;let n;try{n=(await e.slice(0,80).text()).trim()}catch{return e}if(!/^(?:data:image\/[a-z0-9.+-]+;base64,|iVBORw0KGgo|\/9j\/|R0lGOD|UklGR)/i.test(n))return e;let s;try{s=(await e.text()).trim()}catch{return e}let o=/^data:image\/[a-z0-9.+-]+;base64,([a-z0-9+/=\s]+)$/i.exec(s)?.[1]||s;if(!o||!/^[a-z0-9+/=\s]+$/i.test(o)||o.length%4===1)return e;try{let r=atob(o.replace(/\s/g,"")),d=Uint8Array.from(r,f=>f.charCodeAt(0)),u=Kp(d,e.type);return u===(e.type||"image/png")&&!/^(image\/png|image\/jpeg|image\/gif|image\/webp)$/.test(u)?e:d.length>=3&&(d[0]===137&&d[1]===80&&d[2]===78||d[0]===255&&d[1]===216&&d[2]===255||String.fromCharCode(...d.slice(0,6))==="GIF87a"||String.fromCharCode(...d.slice(8,12))==="WEBP")?new Blob([d],{type:u}):e}catch{return e}}function zp(e,t){if(!e)return;let n=e.selectionStart??e.value.length,s=e.selectionEnd??e.value.length,o=(n>0&&e.value[n-1]!==`
1172
1172
  `?`
1173
1173
  `:"")+t+`
1174
- `;e.value=e.value.slice(0,n)+o+e.value.slice(s),e.selectionStart=e.selectionEnd=n+o.length,e.dispatchEvent(new Event("input"))}function fi(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 Kp(e,t){let n=e?.name||t.split("/").pop()||"file";if(fi(e)){ho+=1;let a=`img${ho}`;return{ref:`![${a}](${t})`,label:a,kind:"image"}}ho+=1;let s=`file${ho}`;return{ref:`[${s}](${t})`,label:s,kind:"file"}}function li(){for(let e of Ut)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}Ut.length=0,mi()}function mi(){let e=i("chat-attach-bar");if(e){if(!Ut.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=Ut.map((t,n)=>`
1174
+ `;e.value=e.value.slice(0,n)+o+e.value.slice(s),e.selectionStart=e.selectionEnd=n+o.length,e.dispatchEvent(new Event("input"))}function hi(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 Jp(e,t){let n=e?.name||t.split("/").pop()||"file";if(hi(e)){go+=1;let a=`img${go}`;return{ref:`![${a}](${t})`,label:a,kind:"image"}}go+=1;let s=`file${go}`;return{ref:`[${s}](${t})`,label:s,kind:"file"}}function di(){for(let e of Wt)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}Wt.length=0,gi()}function gi(){let e=i("chat-attach-bar");if(e){if(!Wt.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=Wt.map((t,n)=>`
1175
1175
  <div class="chat-thumb relative" title="${p(t.ref||t.path)}">
1176
1176
  ${t.previewUrl?`<img src="${t.previewUrl}" alt="${p(t.label||"img")}">`:`<span class="chat-thumb-path">${p(t.label||t.name||"file")}</span>`}
1177
1177
  <span class="chat-thumb-label">${p(t.label||t.kind||"")}</span>
1178
1178
  <button type="button" class="chat-thumb-x" data-rm-attach="${n}" aria-label="remove">\u2715</button>
1179
- </div>`).join("")}}async function zp(e){if(!e)return;let t=e.name||`upload-${Date.now()}`,n=await Xc(e,t),s=await Fp(n,t),{ref:a,label:o,kind:r}=Kp(e,s),d="";if(r==="image")try{d=URL.createObjectURL(n)}catch{}return Ut.push({path:s,ref:a,label:o,kind:r,name:t,previewUrl:d}),mi(),Gp(i("chat-input"),a),s}async function Lo(e){let t=[...e||[]].filter(Boolean);if(!t.length)return;let n=i("chat-input");n&&(n.disabled=!0);try{for(let s of t)try{await zp(s)}catch(a){P(`\u4E0A\u4F20\u5931\u8D25 ${s.name||"file"}: ${a.message}`)}}finally{n&&(n.disabled=!1,n.focus())}}function Jp(){let e=i("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",()=>Lo(t.files)),t.click()}function Zc(){document.addEventListener("paste",async e=>{let t=i("chat-input");if(!t)return;let n=i("chat-composer");if(!(n&&(n.contains(document.activeElement)||document.activeElement===t))&&document.activeElement!==t)return;let a=[...e.clipboardData?.items||[]],o=[];for(let u of a)if(u.kind==="file"){let l=u.getAsFile();l&&o.push(l)}let r=o.filter(u=>fi(u)),d=r.length?r:o;d.length&&(e.preventDefault(),await Lo(d))}),!Rc&&(Rc=!0,document.addEventListener("dragover",e=>{let t=i("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=i("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=i("chat-composer");if(!t||(t.classList.remove("chat-drop-active"),!t.contains(e.target)&&e.target!==t))return;let n=[...e.dataTransfer?.files||[]];n.length&&(e.preventDefault(),await Lo(n))}))}function Ct(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function hi(e){let t=i("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
1179
+ </div>`).join("")}}async function Qp(e){if(!e)return;let t=e.name||`upload-${Date.now()}`,n=await ed(e,t),s=await Gp(n,t),{ref:a,label:o,kind:r}=Jp(e,s),d="";if(r==="image")try{d=URL.createObjectURL(n)}catch{}return Wt.push({path:s,ref:a,label:o,kind:r,name:t,previewUrl:d}),gi(),zp(i("chat-input"),a),s}async function Eo(e){let t=[...e||[]].filter(Boolean);if(!t.length)return;let n=i("chat-input");n&&(n.disabled=!0);try{for(let s of t)try{await Qp(s)}catch(a){H(`\u4E0A\u4F20\u5931\u8D25 ${s.name||"file"}: ${a.message}`)}}finally{n&&(n.disabled=!1,n.focus())}}function Vp(){let e=i("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",()=>Eo(t.files)),t.click()}function td(){document.addEventListener("paste",async e=>{let t=i("chat-input");if(!t)return;let n=i("chat-composer");if(!(n&&(n.contains(document.activeElement)||document.activeElement===t))&&document.activeElement!==t)return;let a=[...e.clipboardData?.items||[]],o=[];for(let u of a)if(u.kind==="file"){let l=u.getAsFile();l&&o.push(l)}let r=o.filter(u=>hi(u)),d=r.length?r:o;d.length&&(e.preventDefault(),await Eo(d))}),!Oc&&(Oc=!0,document.addEventListener("dragover",e=>{let t=i("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=i("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=i("chat-composer");if(!t||(t.classList.remove("chat-drop-active"),!t.contains(e.target)&&e.target!==t))return;let n=[...e.dataTransfer?.files||[]];n.length&&(e.preventDefault(),await Eo(n))}))}function Mt(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function bi(e){let t=i("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
1180
1180
  <span class="token-bar-mark">\u25C8</span><span class="token-bar-text">${p(e)}</span>
1181
- </div>`),Re(t))}function xo(e){if(!e)return;let t=e.input_tokens??e.inputTokens??0,n=e.output_tokens??e.outputTokens??0,s=e.total_tokens??e.totalTokens??t+n,a=e.cache_read_input_tokens??e.cachedReadTokens?` \xB7 ${Ct(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${Ct(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${Ct(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,u=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",l=s?` \xB7 \u03A3${Ct(s)}`:"";hi(`\u2191${Ct(t)} \u2193${Ct(n)}${a}${o}${r}${l}${u}`)}function Qp(e){if(!e)return;let t=e.tokensUsed??e.contextTokensUsed,n=e.windowTokens??e.contextWindowTokens,s=e.usagePercent??e.contextWindowUsage;if(t==null&&n==null&&s==null)return;let a=[];t!=null&&n!=null?a.push(`context ${Ct(t)} / ${Ct(n)}`):t!=null&&a.push(`context ${Ct(t)}`),s!=null&&a.push(`${s}%`),e.model&&a.push(e.model),e.turnCount!=null&&a.push(`${e.turnCount} turns`),e.toolCallCount!=null&&a.push(`${e.toolCallCount} tools`),hi(`\u25A3 ${a.join(" \xB7 ")}`)}function Vp(){let e=i("messages"),t=i("permission-requests");e&&(e.innerHTML="",delete e.dataset.historyPainting),t&&(t.innerHTML=""),c.shellBubble=null,ft=null,st=Ge=null,Bt=mt=null,Eo.clear(),di.clear()}function Yp(e,t=c.sessionId){return`${t||""}
1182
- ${String(e||"")}`}function ed(e,t=c.sessionId){let n=Yp(e,t);!e||di.has(n)||(di.add(n),rs("user","You",e,{ts:Date.now(),forceStick:!0}),i("messages")?.lastElementChild?.classList.add("queued-user-msg"))}function Xp(e){if((e.sessionId||c.sessionId)!==c.sessionId)return;let t=Array.isArray(e.items)?e.items.filter(n=>typeof n=="string"&&n.trim()):[];for(let n of t)ed(n,e.sessionId||c.sessionId);t.length&&P(`\u231B Grok queue \xB7 ${t.length} prompt${t.length===1?"":"s"} waiting`)}function td(e,t,n={}){if(!e||!t||e.querySelector(".msg-actions"))return;let s=`a${++Sp}`;Eo.set(s,{text:t,historyIndex:Number.isInteger(n.historyIndex)?n.historyIndex:null,sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null});let a=!["gemini","cursor"].includes(c.agent||$.peek()||"claude"),o=document.createElement("div");o.className="msg-actions",o.innerHTML=`
1181
+ </div>`),Re(t))}function yo(e){if(!e)return;let t=e.input_tokens??e.inputTokens??0,n=e.output_tokens??e.outputTokens??0,s=e.total_tokens??e.totalTokens??t+n,a=e.cache_read_input_tokens??e.cachedReadTokens?` \xB7 ${Mt(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${Mt(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${Mt(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,u=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",l=s?` \xB7 \u03A3${Mt(s)}`:"";bi(`\u2191${Mt(t)} \u2193${Mt(n)}${a}${o}${r}${l}${u}`)}function Yp(e){if(!e)return;let t=e.tokensUsed??e.contextTokensUsed,n=e.windowTokens??e.contextWindowTokens,s=e.usagePercent??e.contextWindowUsage;if(t==null&&n==null&&s==null)return;let a=[];t!=null&&n!=null?a.push(`context ${Mt(t)} / ${Mt(n)}`):t!=null&&a.push(`context ${Mt(t)}`),s!=null&&a.push(`${s}%`),e.model&&a.push(e.model),e.turnCount!=null&&a.push(`${e.turnCount} turns`),e.toolCallCount!=null&&a.push(`${e.toolCallCount} tools`),bi(`\u25A3 ${a.join(" \xB7 ")}`)}function Xp(){let e=i("messages"),t=i("permission-requests");e&&(e.innerHTML="",delete e.dataset.historyPainting),t&&(t.innerHTML=""),c.shellBubble=null,mt=null,st=Ge=null,Ft=ht=null,Io.clear(),pi.clear()}function Zp(e,t=c.sessionId){return`${t||""}
1182
+ ${String(e||"")}`}function nd(e,t=c.sessionId){let n=Zp(e,t);!e||pi.has(n)||(pi.add(n),is("user","You",e,{ts:Date.now(),forceStick:!0}),i("messages")?.lastElementChild?.classList.add("queued-user-msg"))}function ef(e){if((e.sessionId||c.sessionId)!==c.sessionId)return;let t=Array.isArray(e.items)?e.items.filter(n=>typeof n=="string"&&n.trim()):[];for(let n of t)nd(n,e.sessionId||c.sessionId);t.length&&H(`\u231B Grok queue \xB7 ${t.length} prompt${t.length===1?"":"s"} waiting`)}function sd(e,t,n={}){if(!e||!t||e.querySelector(".msg-actions"))return;let s=`a${++Ep}`;Io.set(s,{text:t,historyIndex:Number.isInteger(n.historyIndex)?n.historyIndex:null,sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null});let a=!["gemini","cursor"].includes(c.agent||$.peek()||"claude"),o=document.createElement("div");o.className="msg-actions",o.innerHTML=`
1183
1183
  <button type="button" class="msg-action-btn" data-copy-message="${p(s)}" title="Copy answer">Copy</button>
1184
- ${a?`<button type="button" class="msg-action-btn" data-fork-message="${p(s)}" title="Start a branch from this answer">Fork</button>`:""}`;let r=e.querySelector(".msg-ts");e.insertBefore(o,r||null)}async function Zp(e){let t=Eo.get(e.dataset.copyMessage||"");if(t){try{await navigator.clipboard.writeText(t.text),e.textContent="Copied"}catch{e.textContent="Failed"}setTimeout(()=>{e.textContent="Copy"},1300)}}async function ef(e){let t=Eo.get(e.dataset.forkMessage||"");if(!(!t||!t.sessionId||t.sessionId!==c.sessionId)){e.disabled=!0,e.textContent="Forking\u2026";try{let n=await x("POST",`/api/sessions/${encodeURIComponent(t.sessionId)}/fork`,{sourceAgent:t.agent,...t.historyIndex!=null?{upTo:t.historyIndex}:{},assistantText:t.text},void 0,{machineId:t.machineId||void 0});if(!n?.success||!n.targetSessionId)throw new Error("Fork did not create a session");let s={parentSessionId:t.sessionId,parentAgent:t.agent,parentMachineId:t.machineId,forkMessageIndex:Number.isInteger(n.forkMessageIndex)?n.forkMessageIndex:t.historyIndex,forkedAt:Date.now()},a=await x("PUT","/api/sessions/meta",{sessionId:n.targetSessionId,agent:n.targetAgent||t.agent,branch:s,machineId:t.machineId||void 0},void 0,{machineId:t.machineId||void 0}),o=z(n.targetAgent||t.agent,n.targetSessionId,t.machineId);T.value={...T.peek(),[o]:{favorite:!!a?.favorite,notes:a?.notes||"",title:a?.title||"",hidden:!!a?.hidden,branch:a?.branch||s,updatedAt:a?.updatedAt||Date.now()}};let[{loadAllSessions:r},{resumeSession:d}]=await Promise.all([Promise.resolve().then(()=>(It(),to)),Promise.resolve().then(()=>(ns(),Xr))]);await r({waitFresh:!0}),await d(n.targetSessionId,E.peek()?.path||null,c.configDir||null,n.targetAgent||t.agent,t.machineId||null),P("Fork created \u2014 this branch can now continue independently.")}catch(n){e.textContent="Fork failed",P(`Fork failed: ${n.message}`),setTimeout(()=>{e.textContent="Fork"},1800)}finally{e.disabled=!1,e.textContent==="Forking\u2026"&&(e.textContent="Fork")}}}function tf(e){let t=i("messages");if(!t)return null;let n=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${n} whitespace-pre-wrap break-words"></div>`),Re(t),t.lastElementChild}function nf(e,t){e&&(e.textContent+=t,Re(e.closest("#messages")))}var ft=null;function sf(e){let t=typeof e.input=="object"?JSON.stringify(e.input,null,2):String(e.input||""),s=((typeof e.input=="object"?Object.values(e.input).find(a=>typeof a=="string"&&a.trim()):t)||"").replace(/\n/g," ").slice(0,_e.peek()==="full"?120:80);return{inputStr:t,preview:s}}function Oc(e,{inBatch:t=!1}={}){let{inputStr:n,preview:s}=sf(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
1184
+ ${a?`<button type="button" class="msg-action-btn" data-fork-message="${p(s)}" title="Start a branch from this answer">Fork</button>`:""}`;let r=e.querySelector(".msg-ts");e.insertBefore(o,r||null)}async function tf(e){let t=Io.get(e.dataset.copyMessage||"");if(t){try{await navigator.clipboard.writeText(t.text),e.textContent="Copied"}catch{e.textContent="Failed"}setTimeout(()=>{e.textContent="Copy"},1300)}}async function nf(e){let t=Io.get(e.dataset.forkMessage||"");if(!(!t||!t.sessionId||t.sessionId!==c.sessionId)){e.disabled=!0,e.textContent="Forking\u2026";try{let n=await x("POST",`/api/sessions/${encodeURIComponent(t.sessionId)}/fork`,{sourceAgent:t.agent,...t.historyIndex!=null?{upTo:t.historyIndex}:{},assistantText:t.text},void 0,{machineId:t.machineId||void 0});if(!n?.success||!n.targetSessionId)throw new Error("Fork did not create a session");let s={parentSessionId:t.sessionId,parentAgent:t.agent,parentMachineId:t.machineId,forkMessageIndex:Number.isInteger(n.forkMessageIndex)?n.forkMessageIndex:t.historyIndex,forkedAt:Date.now()},a=await x("PUT","/api/sessions/meta",{sessionId:n.targetSessionId,agent:n.targetAgent||t.agent,branch:s,machineId:t.machineId||void 0},void 0,{machineId:t.machineId||void 0}),o=J(n.targetAgent||t.agent,n.targetSessionId,t.machineId);T.value={...T.peek(),[o]:{favorite:!!a?.favorite,notes:a?.notes||"",title:a?.title||"",hidden:!!a?.hidden,branch:a?.branch||s,updatedAt:a?.updatedAt||Date.now()}};let[{loadAllSessions:r},{resumeSession:d}]=await Promise.all([Promise.resolve().then(()=>(Tt(),so)),Promise.resolve().then(()=>(ss(),ei))]);await r({waitFresh:!0}),await d(n.targetSessionId,E.peek()?.path||null,c.configDir||null,n.targetAgent||t.agent,t.machineId||null),H("Fork created \u2014 this branch can now continue independently.")}catch(n){e.textContent="Fork failed",H(`Fork failed: ${n.message}`),setTimeout(()=>{e.textContent="Fork"},1800)}finally{e.disabled=!1,e.textContent==="Forking\u2026"&&(e.textContent="Fork")}}}function sf(e){let t=i("messages");if(!t)return null;let n=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${n} whitespace-pre-wrap break-words"></div>`),Re(t),t.lastElementChild}function af(e,t){e&&(e.textContent+=t,Re(e.closest("#messages")))}var mt=null;function of(e){let t=typeof e.input=="object"?JSON.stringify(e.input,null,2):String(e.input||""),s=((typeof e.input=="object"?Object.values(e.input).find(a=>typeof a=="string"&&a.trim()):t)||"").replace(/\n/g," ").slice(0,_e.peek()==="full"?120:80);return{inputStr:t,preview:s}}function Uc(e,{inBatch:t=!1}={}){let{inputStr:n,preview:s}=of(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
1185
1185
  <div class="flex items-center gap-1.5 text-xs font-mono">
1186
1186
  <span class="text-warning">\u26A1</span>
1187
1187
  <span class="text-warning font-semibold">${p(e.name||"tool")}</span>
@@ -1189,21 +1189,21 @@ ${String(e||"")}`}function ed(e,t=c.sessionId){let n=Yp(e,t);!e||di.has(n)||(di.
1189
1189
  <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>
1190
1190
  </div>
1191
1191
  <div class="tool-detail">${p(n)}</div>
1192
- </div>`}function af(e){let t=[...new Set(e.names)],n=t.slice(0,4).join(", ")+(t.length>4?"\u2026":""),s=e.el.querySelector(".tool-batch-summary");s&&(s.innerHTML=`<span class="text-warning">\u26A1</span>
1192
+ </div>`}function rf(e){let t=[...new Set(e.names)],n=t.slice(0,4).join(", ")+(t.length>4?"\u2026":""),s=e.el.querySelector(".tool-batch-summary");s&&(s.innerHTML=`<span class="text-warning">\u26A1</span>
1193
1193
  <span class="font-semibold text-base-content/70">${e.count} tool${e.count===1?"":"s"}</span>
1194
1194
  <span class="text-base-content/40 truncate flex-1">${p(n)}</span>
1195
- <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function os(){ft=null}function of(e,t={}){let n=i("messages");if(!n)return;let s=_e.peek()||"normal",a=O(t.ts);if(s==="clean"){if(!ft||!n.contains(ft.el)){let u=$o(a),l=So(a);n.insertAdjacentHTML("beforeend",`
1195
+ <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function rs(){mt=null}function lf(e,t={}){let n=i("messages");if(!n)return;let s=_e.peek()||"normal",a=B(t.ts);if(s==="clean"){if(!mt||!n.contains(mt.el)){let u=So(a),l=Lo(a);n.insertAdjacentHTML("beforeend",`
1196
1196
  <div class="msg-row assistant px-2" data-ts="${p(l)}">
1197
1197
  <div class="tool-batch w-full max-w-[96%] px-2 py-1.5">
1198
1198
  <div class="tool-batch-summary flex items-center gap-1.5 text-xs font-mono"></div>
1199
1199
  <div class="tool-batch-list"></div>
1200
1200
  </div>
1201
1201
  ${u?`<div class="msg-ts" title="${p(l)}">${p(u)}</div>`:""}
1202
- </div>`),ft={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}ft.names.push(e.name||"tool"),ft.count++,ft.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",Oc(e,{inBatch:!0})),af(ft),Re(n);return}ft=null;let o=$o(a),r=So(a);n.insertAdjacentHTML("beforeend",`
1202
+ </div>`),mt={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}mt.names.push(e.name||"tool"),mt.count++,mt.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",Uc(e,{inBatch:!0})),rf(mt),Re(n);return}mt=null;let o=So(a),r=Lo(a);n.insertAdjacentHTML("beforeend",`
1203
1203
  <div class="msg-row assistant px-2" data-ts="${p(r)}">
1204
- <div class="w-full max-w-[96%]">${Oc(e)}</div>
1204
+ <div class="w-full max-w-[96%]">${Uc(e)}</div>
1205
1205
  ${o?`<div class="msg-ts" title="${p(r)}">${p(o)}</div>`:""}
1206
- </div>`),Re(n)}function Bc(){let e=i("messages");e&&e.setAttribute("data-density",_e.peek()||"normal")}function rf(e){let t=e.request_id||e.requestId;if(!t||i(`perm-${t}`))return;let n=e.tool_input?JSON.stringify(e.tool_input).slice(0,200):"";i("permission-requests")?.insertAdjacentHTML("beforeend",`
1206
+ </div>`),Re(n)}function Fc(){let e=i("messages");e&&e.setAttribute("data-density",_e.peek()||"normal")}function cf(e){let t=e.request_id||e.requestId;if(!t||i(`perm-${t}`))return;let n=e.tool_input?JSON.stringify(e.tool_input).slice(0,200):"";i("permission-requests")?.insertAdjacentHTML("beforeend",`
1207
1207
  <div id="perm-${t}" class="perm-banner mx-3 mb-2 rounded-lg border border-warning/25 bg-warning/8 p-3">
1208
1208
  <div class="text-xs text-warning font-semibold mb-1">\u26A0\uFE0F Permission Required</div>
1209
1209
  <div class="font-mono text-xs text-base-content/60 break-all mb-2">
@@ -1213,39 +1213,39 @@ ${String(e||"")}`}function ed(e,t=c.sessionId){let n=Yp(e,t);!e||di.has(n)||(di.
1213
1213
  <button class="btn btn-success btn-xs" data-perm-id="${t}" data-perm-allow="1">Allow</button>
1214
1214
  <button class="btn btn-error btn-xs" data-perm-id="${t}" data-perm-allow="0">Deny</button>
1215
1215
  </div>
1216
- </div>`),Re(i("messages"))}var Uc=!1;function lf(){if(Uc||typeof marked>"u")return;let e=s=>String(s??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=(s,a)=>{let o=String(a||"").trim().split(/\s+/)[0]||"",r=o||"text",d=o?`language-${p(o)}`:"";return`<div class="code-block">
1216
+ </div>`),Re(i("messages"))}var Wc=!1;function df(){if(Wc||typeof marked>"u")return;let e=s=>String(s??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=(s,a)=>{let o=String(a||"").trim().split(/\s+/)[0]||"",r=o||"text",d=o?`language-${p(o)}`:"";return`<div class="code-block">
1217
1217
  <div class="code-block-header">
1218
1218
  <span class="code-block-lang">${p(r)}</span>
1219
1219
  <button type="button" class="code-copy" data-copy="1" title="Copy code">Copy</button>
1220
1220
  </div>
1221
1221
  <pre><code class="hljs ${d}">${e(s)}</code></pre>
1222
- </div>`},n={code(s,a){return s&&typeof s=="object"&&s.text!=null?t(s.text,s.lang||a):t(s,a)},table(s,a){return s&&typeof s=="object"&&!Array.isArray(s)&&s.header?!1:`<div class="table-wrap"><table><thead>${s}</thead><tbody>${a}</tbody></table></div>`},html(s){return e(s)}};try{if(typeof marked.use=="function")marked.use({gfm:!0,breaks:!0,renderer:n});else if(typeof marked.setOptions=="function"){let s=new marked.Renderer;s.code=n.code,s.table=n.table,marked.setOptions({gfm:!0,breaks:!0,renderer:s})}}catch(s){console.warn("[md] marked setup failed",s)}Uc=!0}function yo(e){if(typeof marked>"u")return p(e);try{return lf(),Ve(e,{fallback:()=>p(e)})}catch{return p(e)}}function cf(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 nd(e){cf(e),xt(e),vt(e)}function sd(){Bc(),ar(),De(fe,s=>{Js(),jt();let a=i("ws-banner"),o=i("ws-banner-text");if(!a)return;if(s==="open"||s==="idle"){a.classList.add("hidden"),o&&(o.textContent="");return}if(s==="connecting"&&!bo){a.classList.add("hidden");return}a.classList.remove("hidden");let r=s==="offline"?"\u7F51\u7EDC\u5DF2\u65AD\u5F00\uFF0C\u6062\u590D\u540E\u4F1A\u81EA\u52A8\u91CD\u8FDE":s==="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";o?o.textContent=r:a.textContent=r}),De(E,()=>jt()),b.on("click","#messages a, #chat-log a, .md-body a",(s,a)=>{let o=a.getAttribute("href")||"",r=E.peek()?.path||"";Zo(o,r)&&(s.preventDefault(),s.stopPropagation())}),b.on("click","#ws-banner-retry",s=>{s.preventDefault(),Ap()}),De(N,s=>{i("send-btn")?.classList.toggle("hidden",s),i("stop-btn")?.classList.toggle("hidden",!s),as(),s||i("send-btn")?.toggleAttribute("disabled",!tn());let a=i("messages");if(!a)return;let o=i("typing-indicator");s&&!o?(a.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>'),Re(a)):s||(o?.remove(),os()),jt()}),De(_e,()=>Bc()),document.addEventListener("session-lock-changed",()=>as()),as(),b.on("keydown","#chat-input",s=>{if(s.key!=="Enter")return;let a=s.metaKey||s.ctrlKey,o=window.matchMedia("(max-width: 640px)").matches&&!s.shiftKey&&!a;(a||o)&&(s.preventDefault(),Xs())}),b.on("submit","#chat-form",s=>{s.preventDefault(),Xs()}),b.on("input","#chat-input",(s,a)=>{Vs(a),Qs(a.value)}),b.on("click","#btn-attach",s=>{s.preventDefault(),Jp()}),b.on("change","#chat-file-input",(s,a)=>{let o=a?.files;o?.length&&Lo(o),a&&(a.value="")}),b.on("click","[data-rm-attach]",(s,a)=>{s.preventDefault(),s.stopPropagation();let o=parseInt(a.dataset.rmAttach,10);if(Number.isNaN(o)||o<0||o>=Ut.length)return;let r=Ut[o];if(r?.previewUrl)try{URL.revokeObjectURL(r.previewUrl)}catch{}let d=i("chat-input");d&&r?.ref&&(d.value=d.value.split(r.ref).join("").replace(/\n{3,}/g,`
1222
+ </div>`},n={code(s,a){return s&&typeof s=="object"&&s.text!=null?t(s.text,s.lang||a):t(s,a)},table(s,a){return s&&typeof s=="object"&&!Array.isArray(s)&&s.header?!1:`<div class="table-wrap"><table><thead>${s}</thead><tbody>${a}</tbody></table></div>`},html(s){return e(s)}};try{if(typeof marked.use=="function")marked.use({gfm:!0,breaks:!0,renderer:n});else if(typeof marked.setOptions=="function"){let s=new marked.Renderer;s.code=n.code,s.table=n.table,marked.setOptions({gfm:!0,breaks:!0,renderer:s})}}catch(s){console.warn("[md] marked setup failed",s)}Wc=!0}function wo(e){if(typeof marked>"u")return p(e);try{return df(),Ve(e,{fallback:()=>p(e)})}catch{return p(e)}}function uf(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 ad(e){uf(e),yt(e),xt(e)}function od(){Fc(),or(),De(me,s=>{Qs(),Dt();let a=i("ws-banner"),o=i("ws-banner-text");if(!a)return;if(s==="open"||s==="idle"){a.classList.add("hidden"),o&&(o.textContent="");return}if(s==="connecting"&&!vo){a.classList.add("hidden");return}a.classList.remove("hidden");let r=s==="offline"?"\u7F51\u7EDC\u5DF2\u65AD\u5F00\uFF0C\u6062\u590D\u540E\u4F1A\u81EA\u52A8\u91CD\u8FDE":s==="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";o?o.textContent=r:a.textContent=r}),De(E,()=>Dt()),b.on("click","#messages a, #chat-log a, .md-body a",(s,a)=>{let o=a.getAttribute("href")||"",r=E.peek()?.path||"";er(o,r)&&(s.preventDefault(),s.stopPropagation())}),b.on("click","#ws-banner-retry",s=>{s.preventDefault(),Dp()}),De(P,s=>{i("send-btn")?.classList.toggle("hidden",s),i("stop-btn")?.classList.toggle("hidden",!s),os(),s||i("send-btn")?.toggleAttribute("disabled",!sn());let a=i("messages");if(!a)return;let o=i("typing-indicator");s&&!o?(a.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>'),Re(a)):s||(o?.remove(),rs()),Dt()}),De(_e,()=>Fc()),document.addEventListener("session-lock-changed",()=>os()),os(),b.on("keydown","#chat-input",s=>{if(s.key!=="Enter")return;let a=s.metaKey||s.ctrlKey,o=window.matchMedia("(max-width: 640px)").matches&&!s.shiftKey&&!a;(a||o)&&(s.preventDefault(),Zs())}),b.on("submit","#chat-form",s=>{s.preventDefault(),Zs()}),b.on("input","#chat-input",(s,a)=>{Ys(a),Vs(a.value)}),b.on("click","#btn-attach",s=>{s.preventDefault(),Vp()}),b.on("change","#chat-file-input",(s,a)=>{let o=a?.files;o?.length&&Eo(o),a&&(a.value="")}),b.on("click","[data-rm-attach]",(s,a)=>{s.preventDefault(),s.stopPropagation();let o=parseInt(a.dataset.rmAttach,10);if(Number.isNaN(o)||o<0||o>=Wt.length)return;let r=Wt[o];if(r?.previewUrl)try{URL.revokeObjectURL(r.previewUrl)}catch{}let d=i("chat-input");d&&r?.ref&&(d.value=d.value.split(r.ref).join("").replace(/\n{3,}/g,`
1223
1223
 
1224
- `),d.dispatchEvent(new Event("input"))),Ut.splice(o,1),mi()}),b.on("click","[data-perm-id]",(s,a)=>{lt({type:"command",cmd:"approval.respond",requestId:a.dataset.permId,allow:a.dataset.permAllow==="1",sessionId:c.sessionId}),a.closest(".perm-banner")?.remove()}),b.on("click",".tool-card",(s,a)=>{let o=a.closest(".tool-batch");if(o&&!o.classList.contains("open")&&!a.classList.contains("tool-batch-item"))return;s.stopPropagation();let r=i("messages"),d=a.getBoundingClientRect().top;if(a.classList.toggle("open"),r){let u=a.getBoundingClientRect().top;r.scrollTop+=u-d}}),b.on("click",".tool-batch",(s,a)=>{if(s.target.closest(".tool-card")&&a.classList.contains("open"))return;let o=i("messages"),r=a.getBoundingClientRect().top;if(a.classList.toggle("open"),o){let d=a.getBoundingClientRect().top;o.scrollTop+=d-r}});let e=i("messages"),t=i("scroll-top-btn"),n=i("scroll-bottom-btn");if(e&&t&&n){let s=()=>{let a=e.scrollHeight-e.clientHeight>200;t.classList.toggle("hidden",!a||e.scrollTop<200),n.classList.toggle("hidden",!a||$p(e))};e.addEventListener("scroll",s,{passive:!0}),new ResizeObserver(s).observe(e),new MutationObserver(s).observe(e,{childList:!0,subtree:!0}),t.addEventListener("click",()=>e.scrollTo({top:0,behavior:"smooth"})),n.addEventListener("click",()=>{Fc(e)?.setFollowing(!0),e.scrollTo({top:e.scrollHeight,behavior:"smooth"})}),s()}b.on("click",".msg-expand-btn",(s,a)=>{s.stopPropagation();let r=a.closest(".msg-card").classList.toggle("open");a.textContent=r?"\u25B2 Show less":"\u25BC Show more"}),b.on("click","[data-copy-message]",(s,a)=>{s.preventDefault(),s.stopPropagation(),Zp(a)}),b.on("click","[data-fork-message]",(s,a)=>{s.preventDefault(),s.stopPropagation(),ef(a)}),b.on("click",".code-copy",async(s,a)=>{s.preventDefault(),s.stopPropagation();let d=a.closest(".code-block")?.querySelector("pre code")?.textContent??"";try{await navigator.clipboard.writeText(d),a.textContent="Copied",a.classList.add("copied"),setTimeout(()=>{a.textContent="Copy",a.classList.remove("copied")},1400)}catch{a.textContent="Failed",setTimeout(()=>{a.textContent="Copy"},1400)}})}G();W();le();Vo();_n();Zt();en();function df(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 ad(e){let t=(e||"").split("/").pop()||"",n=t.lastIndexOf(".");return n>=0?t.slice(n+1).toLowerCase():""}function od(e){let t=ad(e);return t==="docx"||t==="pptx"||t==="xlsx"||t==="pdf"?t:null}function rd(e){let t=ad(e);return t==="md"||t==="markdown"||t==="mdx"}function uf(e){return e==null?"":e>1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function pf(e){let t=atob(e),n=new Uint8Array(t.length);for(let s=0;s<t.length;s++)n[s]=t.charCodeAt(s);return n.buffer}var gi=new Map;function Io(e){if(gi.has(e))return gi.get(e);let t=new Promise((n,s)=>{let a=document.querySelector(`script[data-src="${e}"]`);if(a){if(a.dataset.loaded==="1")return n();a.addEventListener("load",()=>n()),a.addEventListener("error",()=>s(new Error(`Failed to load ${e}`)));return}let o=document.createElement("script");o.src=e,o.async=!0,o.dataset.src=e,o.onload=()=>{o.dataset.loaded="1",n()},o.onerror=()=>s(new Error(`Failed to load ${e}`)),document.head.appendChild(o)});return gi.set(e,t),t}function ff(e){let n=((e||"").split("/").pop()||"").toLowerCase(),s={dockerfile:"dockerfile",makefile:"makefile",gemfile:"ruby",rakefile:"ruby",procfile:"yaml","cmakelists.txt":"cmake"};if(s[n])return s[n];let a=n.includes(".")?n.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"}[a]||""}function mf(e){!e||typeof hljs>"u"||e.querySelectorAll("pre code.file-preview-code").forEach(t=>{try{delete t.dataset.highlighted,hljs.highlightElement(t)}catch{}})}function is(e,t,n){let s=uf(t);return`
1224
+ `),d.dispatchEvent(new Event("input"))),Wt.splice(o,1),gi()}),b.on("click","[data-perm-id]",(s,a)=>{lt({type:"command",cmd:"approval.respond",requestId:a.dataset.permId,allow:a.dataset.permAllow==="1",sessionId:c.sessionId}),a.closest(".perm-banner")?.remove()}),b.on("click",".tool-card",(s,a)=>{let o=a.closest(".tool-batch");if(o&&!o.classList.contains("open")&&!a.classList.contains("tool-batch-item"))return;s.stopPropagation();let r=i("messages"),d=a.getBoundingClientRect().top;if(a.classList.toggle("open"),r){let u=a.getBoundingClientRect().top;r.scrollTop+=u-d}}),b.on("click",".tool-batch",(s,a)=>{if(s.target.closest(".tool-card")&&a.classList.contains("open"))return;let o=i("messages"),r=a.getBoundingClientRect().top;if(a.classList.toggle("open"),o){let d=a.getBoundingClientRect().top;o.scrollTop+=d-r}});let e=i("messages"),t=i("scroll-top-btn"),n=i("scroll-bottom-btn");if(e&&t&&n){let s=()=>{let a=e.scrollHeight-e.clientHeight>200;t.classList.toggle("hidden",!a||e.scrollTop<200),n.classList.toggle("hidden",!a||Lp(e))};e.addEventListener("scroll",s,{passive:!0}),new ResizeObserver(s).observe(e),new MutationObserver(s).observe(e,{childList:!0,subtree:!0}),t.addEventListener("click",()=>e.scrollTo({top:0,behavior:"smooth"})),n.addEventListener("click",()=>{Gc(e)?.setFollowing(!0),e.scrollTo({top:e.scrollHeight,behavior:"smooth"})}),s()}b.on("click",".msg-expand-btn",(s,a)=>{s.stopPropagation();let r=a.closest(".msg-card").classList.toggle("open");a.textContent=r?"\u25B2 Show less":"\u25BC Show more"}),b.on("click","[data-copy-message]",(s,a)=>{s.preventDefault(),s.stopPropagation(),tf(a)}),b.on("click","[data-fork-message]",(s,a)=>{s.preventDefault(),s.stopPropagation(),nf(a)}),b.on("click",".code-copy",async(s,a)=>{s.preventDefault(),s.stopPropagation();let d=a.closest(".code-block")?.querySelector("pre code")?.textContent??"";try{await navigator.clipboard.writeText(d),a.textContent="Copied",a.classList.add("copied"),setTimeout(()=>{a.textContent="Copy",a.classList.remove("copied")},1400)}catch{a.textContent="Failed",setTimeout(()=>{a.textContent="Copy"},1400)}})}K();G();ce();Yo();Pn();tn();nn();function pf(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 rd(e){let t=(e||"").split("/").pop()||"",n=t.lastIndexOf(".");return n>=0?t.slice(n+1).toLowerCase():""}function id(e){let t=rd(e);return t==="docx"||t==="pptx"||t==="xlsx"||t==="pdf"?t:null}function ld(e){let t=rd(e);return t==="md"||t==="markdown"||t==="mdx"}function ff(e){return e==null?"":e>1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function mf(e){let t=atob(e),n=new Uint8Array(t.length);for(let s=0;s<t.length;s++)n[s]=t.charCodeAt(s);return n.buffer}var vi=new Map;function To(e){if(vi.has(e))return vi.get(e);let t=new Promise((n,s)=>{let a=document.querySelector(`script[data-src="${e}"]`);if(a){if(a.dataset.loaded==="1")return n();a.addEventListener("load",()=>n()),a.addEventListener("error",()=>s(new Error(`Failed to load ${e}`)));return}let o=document.createElement("script");o.src=e,o.async=!0,o.dataset.src=e,o.onload=()=>{o.dataset.loaded="1",n()},o.onerror=()=>s(new Error(`Failed to load ${e}`)),document.head.appendChild(o)});return vi.set(e,t),t}function hf(e){let n=((e||"").split("/").pop()||"").toLowerCase(),s={dockerfile:"dockerfile",makefile:"makefile",gemfile:"ruby",rakefile:"ruby",procfile:"yaml","cmakelists.txt":"cmake"};if(s[n])return s[n];let a=n.includes(".")?n.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"}[a]||""}function gf(e){!e||typeof hljs>"u"||e.querySelectorAll("pre code.file-preview-code").forEach(t=>{try{delete t.dataset.highlighted,hljs.highlightElement(t)}catch{}})}function ls(e,t,n){let s=ff(t);return`
1225
1225
  <div class="flex items-center gap-2 px-4 py-1.5 border-b border-base-300 flex-shrink-0 bg-base-200">
1226
1226
  <span class="text-xs text-base-content/40 flex-1 truncate">${p(e)} \xB7 ${p(s)}${n?` \xB7 <span class="text-primary/70">${p(n)}</span>`:""}</span>
1227
1227
  <button type="button" class="btn btn-ghost btn-xs" data-download-path="${p(e)}">\u2193 Download</button>
1228
- </div>`}function hf(e){return!Array.isArray(e)||!e.length?'<div class="p-4 text-xs text-base-content/40">Empty directory</div>':(e.sort((t,n)=>n.isDir-t.isDir||t.name.localeCompare(n.name)),e.map(t=>`
1228
+ </div>`}function bf(e){return!Array.isArray(e)||!e.length?'<div class="p-4 text-xs text-base-content/40">Empty directory</div>':(e.sort((t,n)=>n.isDir-t.isDir||t.name.localeCompare(n.name)),e.map(t=>`
1229
1229
  <div class="flex items-center gap-2 px-4 py-1.5 hover:bg-base-300 group"
1230
1230
  ${t.isDir?`data-dir-path="${p(t.path)}"`:`data-file-path="${p(t.path)}"`}>
1231
- <span class="cursor-pointer flex-shrink-0">${t.isDir?"\u{1F4C1}":df(t.name)}</span>
1231
+ <span class="cursor-pointer flex-shrink-0">${t.isDir?"\u{1F4C1}":pf(t.name)}</span>
1232
1232
  <span class="text-sm flex-1 truncate cursor-pointer ${t.isDir?"text-primary":""}">${p(t.name)}</span>
1233
1233
  ${t.isDir?"":`
1234
1234
  <button type="button" class="file-row-action btn btn-ghost btn-xs px-1.5 text-base-content/50 hover:text-base-content"
1235
1235
  data-download-path="${p(t.path)}" title="Download" aria-label="Download">\u2193</button>
1236
1236
  <button type="button" class="file-row-action btn btn-ghost btn-xs px-1.5 text-error/60 hover:text-error"
1237
1237
  data-delete-path="${p(t.path)}" title="Delete" aria-label="Delete">\u2715</button>`}
1238
- </div>`).join(""))}function gf(e,t,n){let s=/[\x00-\x08\x0e-\x1f]/.test(t.slice(0,512));if(!s&&rd(e))return vf(e,t,n);let a=ff(e),o=a?`language-${p(a)}`:"",r=s?`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${p(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 ${o}">${p(t)}</code></pre>`;return is(e,n,s?"binary":a||"text")+r}function bf(e){return Ve(e,{fallback:t=>p(t).replace(/\n/g,"<br>")})}function vf(e,t,n){return is(e,n,"Markdown")+`
1238
+ </div>`).join(""))}function vf(e,t,n){let s=/[\x00-\x08\x0e-\x1f]/.test(t.slice(0,512));if(!s&&ld(e))return yf(e,t,n);let a=hf(e),o=a?`language-${p(a)}`:"",r=s?`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${p(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 ${o}">${p(t)}</code></pre>`;return ls(e,n,s?"binary":a||"text")+r}function xf(e){return Ve(e,{fallback:t=>p(t).replace(/\n/g,"<br>")})}function yf(e,t,n){return ls(e,n,"Markdown")+`
1239
1239
  <div class="file-markdown-toolbar" role="group" aria-label="Markdown view">
1240
1240
  <button type="button" class="file-markdown-mode active" data-file-render-mode="preview">Preview</button>
1241
1241
  <button type="button" class="file-markdown-mode" data-file-render-mode="code">Code</button>
1242
1242
  </div>
1243
- <div class="file-markdown-preview md p-4 overflow-auto flex-1">${bf(t)}</div>
1244
- <pre class="file-markdown-code file-preview p-4 font-mono text-xs leading-relaxed overflow-auto flex-1 m-0 hidden"><code class="file-preview-code language-markdown">${p(t)}</code></pre>`}function xf(e){let t=e?.querySelector(".file-markdown-preview");t&&(typeof hljs<"u"&&t.querySelectorAll("pre code:not(.hljs)").forEach(n=>{try{hljs.highlightElement(n)}catch{}}),xt(t),vt(t))}async function yf(e){if(await Io("/vendor/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 wf(e){if(await Io("/vendor/xlsx.full.min.js"),typeof XLSX>"u")throw new Error("SheetJS failed to load");let t=XLSX.read(new Uint8Array(e),{type:"array"}),n=t.SheetNames||[];if(!n.length)return'<div class="p-4 text-xs text-base-content/40">Empty workbook</div>';let s=n.map((o,r)=>`<button type="button" class="office-sheet-tab${r===0?" active":""}" data-sheet-idx="${r}">${p(o)}</button>`).join(""),a=n.map((o,r)=>{let d=t.Sheets[o],u;try{u=XLSX.utils.sheet_to_html(d,{id:`xlsx-sheet-${r}`,editable:!1})}catch{u='<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}">${u}</div>`}).join("");return`
1243
+ <div class="file-markdown-preview md p-4 overflow-auto flex-1">${xf(t)}</div>
1244
+ <pre class="file-markdown-code file-preview p-4 font-mono text-xs leading-relaxed overflow-auto flex-1 m-0 hidden"><code class="file-preview-code language-markdown">${p(t)}</code></pre>`}function wf(e){let t=e?.querySelector(".file-markdown-preview");t&&(typeof hljs<"u"&&t.querySelectorAll("pre code:not(.hljs)").forEach(n=>{try{hljs.highlightElement(n)}catch{}}),yt(t),xt(t))}async function kf(e){if(await To("/vendor/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 $f(e){if(await To("/vendor/xlsx.full.min.js"),typeof XLSX>"u")throw new Error("SheetJS failed to load");let t=XLSX.read(new Uint8Array(e),{type:"array"}),n=t.SheetNames||[];if(!n.length)return'<div class="p-4 text-xs text-base-content/40">Empty workbook</div>';let s=n.map((o,r)=>`<button type="button" class="office-sheet-tab${r===0?" active":""}" data-sheet-idx="${r}">${p(o)}</button>`).join(""),a=n.map((o,r)=>{let d=t.Sheets[o],u;try{u=XLSX.utils.sheet_to_html(d,{id:`xlsx-sheet-${r}`,editable:!1})}catch{u='<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}">${u}</div>`}).join("");return`
1245
1245
  <div class="office-preview office-xlsx flex flex-col flex-1 min-h-0 overflow-hidden">
1246
1246
  <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">${s}</div>
1247
1247
  <div class="office-sheet-body flex-1 overflow-auto p-2">${a}</div>
1248
- </div>`}function kf(e){let t=[],n=/<a:p[\s>][\s\S]*?<\/a:p>/g,s=/<a:t(?:\s[^>]*)?>([\s\S]*?)<\/a:t>/g,a,o=e.match(n)||[e];for(let r of o){let d=[];for(s.lastIndex=0;(a=s.exec(r))!==null;){let u=a[1].replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&quot;/g,'"').replace(/&apos;/g,"'");u&&d.push(u)}d.length&&t.push(d.join(""))}return t}async function $f(e){if(await Io("/vendor/jszip.min.js"),typeof JSZip>"u")throw new Error("JSZip failed to load");let t=await JSZip.loadAsync(e),n=Object.keys(t.files).filter(a=>/^ppt\/slides\/slide\d+\.xml$/i.test(a)).sort((a,o)=>{let r=parseInt(a.match(/slide(\d+)/i)?.[1]||"0",10),d=parseInt(o.match(/slide(\d+)/i)?.[1]||"0",10);return r-d});if(!n.length)return'<div class="p-4 text-xs text-base-content/40">No slides found in this presentation</div>';let s=[];for(let a=0;a<n.length;a++){let o=await t.files[n[a]].async("string"),r=kf(o),d=r.length?r.map(u=>`<p>${p(u)}</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>';s.push(`
1248
+ </div>`}function Sf(e){let t=[],n=/<a:p[\s>][\s\S]*?<\/a:p>/g,s=/<a:t(?:\s[^>]*)?>([\s\S]*?)<\/a:t>/g,a,o=e.match(n)||[e];for(let r of o){let d=[];for(s.lastIndex=0;(a=s.exec(r))!==null;){let u=a[1].replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&quot;/g,'"').replace(/&apos;/g,"'");u&&d.push(u)}d.length&&t.push(d.join(""))}return t}async function Lf(e){if(await To("/vendor/jszip.min.js"),typeof JSZip>"u")throw new Error("JSZip failed to load");let t=await JSZip.loadAsync(e),n=Object.keys(t.files).filter(a=>/^ppt\/slides\/slide\d+\.xml$/i.test(a)).sort((a,o)=>{let r=parseInt(a.match(/slide(\d+)/i)?.[1]||"0",10),d=parseInt(o.match(/slide(\d+)/i)?.[1]||"0",10);return r-d});if(!n.length)return'<div class="p-4 text-xs text-base-content/40">No slides found in this presentation</div>';let s=[];for(let a=0;a<n.length;a++){let o=await t.files[n[a]].async("string"),r=Sf(o),d=r.length?r.map(u=>`<p>${p(u)}</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>';s.push(`
1249
1249
  <article class="office-slide-card">
1250
1250
  <header class="office-slide-num">Slide ${a+1}</header>
1251
1251
  <div class="office-slide-body">${d}</div>
@@ -1253,7 +1253,7 @@ ${String(e||"")}`}function ed(e,t=c.sessionId){let n=Yp(e,t);!e||di.has(n)||(di.
1253
1253
  <div class="office-preview office-pptx overflow-auto flex-1 p-3 space-y-3">
1254
1254
  <p class="text-xs text-base-content/50 px-1">\u6587\u672C\u9884\u89C8\uFF08\u7248\u5F0F/\u56FE\u7247\u4E0D\u8FD8\u539F\uFF09\xB7 ${n.length} slide(s)</p>
1255
1255
  ${s.join("")}
1256
- </div>`}async function Sf(){if(await Io("/vendor/pdf.min.js"),typeof pdfjsLib>"u")throw new Error("pdf.js failed to load");return pdfjsLib.GlobalWorkerOptions.workerSrc="/vendor/pdf.worker.min.js",pdfjsLib}async function Lf(e){let n=await(await Sf()).getDocument({data:e}).promise,s=n.numPages,a=Math.min(s,40),o=[];for(let d=1;d<=a;d++){let u=await n.getPage(d),l=u.getViewport({scale:1}),f=Math.min(1.5,820/l.width),m=u.getViewport({scale:f}),g=document.createElement("canvas");g.width=Math.floor(m.width),g.height=Math.floor(m.height),g.className="office-pdf-page",g.dataset.page=String(d),await u.render({canvasContext:g.getContext("2d"),viewport:m}).promise,o.push(`
1256
+ </div>`}async function Ef(){if(await To("/vendor/pdf.min.js"),typeof pdfjsLib>"u")throw new Error("pdf.js failed to load");return pdfjsLib.GlobalWorkerOptions.workerSrc="/vendor/pdf.worker.min.js",pdfjsLib}async function If(e){let n=await(await Ef()).getDocument({data:e}).promise,s=n.numPages,a=Math.min(s,40),o=[];for(let d=1;d<=a;d++){let u=await n.getPage(d),l=u.getViewport({scale:1}),f=Math.min(1.5,820/l.width),m=u.getViewport({scale:f}),g=document.createElement("canvas");g.width=Math.floor(m.width),g.height=Math.floor(m.height),g.className="office-pdf-page",g.dataset.page=String(d),await u.render({canvasContext:g.getContext("2d"),viewport:m}).promise,o.push(`
1257
1257
  <figure class="office-pdf-figure">
1258
1258
  <figcaption class="office-pdf-cap">Page ${d} / ${s}</figcaption>
1259
1259
  ${g.outerHTML}
@@ -1262,12 +1262,12 @@ ${String(e||"")}`}function ed(e,t=c.sessionId){let n=Yp(e,t);!e||di.has(n)||(di.
1262
1262
  <p class="text-xs text-base-content/50 px-1">PDF preview \xB7 ${s} page(s)</p>
1263
1263
  ${r}
1264
1264
  ${o.join("")}
1265
- </div>`}async function Ef(e,t,n){let s=od(e),a={docx:"Word",pptx:"PowerPoint",xlsx:"Excel",pdf:"PDF"},o=pf(t),r;if(s==="docx")r=await yf(o);else if(s==="xlsx")r=await wf(o);else if(s==="pptx")r=await $f(o);else if(s==="pdf")r=await Lf(o);else throw new Error("Unsupported office type");return is(e,n,a[s]||s)+r}function If(e,t){let n=e?e.split("/"):[],s=t?n.slice(0,-1):n,a='<span class="cursor-pointer text-primary hover:underline" data-dir-path="">root</span>',o="";for(let r of s)o=o?`${o}/${r}`:r,a+=` <span class="text-base-content/40">/</span> <span class="cursor-pointer text-primary hover:underline" data-dir-path="${p(o)}">${p(r)}</span>`;return t&&(a+=` <span class="text-base-content/40">/</span> <span>${p(n.at(-1))}</span>`),a}function Tf(){let e=E.peek(),t=re.peek()||e?.path;if(!t)return;let n=document.createElement("input");n.type="file",n.multiple=!0,n.addEventListener("change",async()=>{let s=Y.peek(),a="_",o=[...n.files],r=!1;for(let d of o){let u=s?`${s}/${d.name}`:d.name,l=`/api/projects/${a}/file?root=${encodeURIComponent(t)}&path=${encodeURIComponent(u)}`;try{let f=await fetch(l,{method:"POST",headers:ct(),body:d,duplex:"half"});if(!f.ok){let m=await f.json().catch(()=>({}));throw new Error(m.error||`HTTP ${f.status}`)}}catch(f){alert(`Upload failed (${d.name}): ${f.message}`),r=!0;break}}if(!r){let d=Y.peek();Y.value=d+"\0",Y.value=d}}),n.click()}async function Cf(e,t){let n=re.peek()||e?.path||"";if(!n){alert("No path selected \u2014 set root first");return}let s="_",a=(t||"").split("/").pop()||"download",o=new URLSearchParams({root:n,path:t,download:"true"}),r=`/api/projects/${s}/file?${o}`;try{let d=await fetch(r,{headers:ct(),credentials:"same-origin"});if(!d.ok){let m=await d.json().catch(()=>({}));throw new Error(m.error||`HTTP ${d.status}`)}let u=await d.blob(),l=URL.createObjectURL(u),f=document.createElement("a");f.href=l,f.download=a,f.rel="noopener",f.style.display="none",document.body.appendChild(f),f.click(),f.remove(),setTimeout(()=>URL.revokeObjectURL(l),6e4)}catch(d){try{let u=`/api/projects/${s}/file?${Jo({root:n,path:t,download:"true"})}`,l=document.createElement("a");l.href=u,l.download=a,l.rel="noopener",l.target="_blank",document.body.appendChild(l),l.click(),l.remove()}catch{alert(`Download failed: ${d.message}`)}}}async function Mf(e,t){if(!confirm(`Delete "${t.split("/").pop()}"?`))return;let n=re.peek()||e?.path||"",s="_";try{await x("DELETE",`/api/projects/${s}/file?root=${encodeURIComponent(n)}&path=${encodeURIComponent(t)}`),Y.value=Y.peek()+" ",Y.value=Y.peek().trimEnd()}catch(a){alert(`Delete failed: ${a.message}`)}}async function Af(e,t,n,s){let a=n.size??(typeof n.content=="string"?n.content.length:0),o=od(t);if(o&&n.encoding==="base64"){e.innerHTML=is(t,a,o)+`<div class="p-4 text-xs text-base-content/40">Parsing ${o.toUpperCase()}\u2026</div>`;try{let r=await Ef(t,n.content,a);if(s.aborted)return;e.innerHTML=r}catch(r){if(s.aborted)return;e.innerHTML=is(t,a,o)+`<div class="p-4 text-xs text-error">Preview failed: ${p(r.message)} \u2014 <button class="text-primary hover:underline" data-download-path="${p(t)}">Download</button></div>`}return}if(n.encoding==="base64"){e.innerHTML=is(t,a,"binary")+`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${p(t)}">Download</button></div>`;return}e.innerHTML=gf(t,n.content||"",a),mf(e),rd(t)&&xf(e)}function id(){je(()=>{let e=i("files-breadcrumb");if(!e)return;let t=oe.value!==null;e.innerHTML=`
1266
- ${If(oe.value??Y.value,t)}
1265
+ </div>`}async function Tf(e,t,n){let s=id(e),a={docx:"Word",pptx:"PowerPoint",xlsx:"Excel",pdf:"PDF"},o=mf(t),r;if(s==="docx")r=await kf(o);else if(s==="xlsx")r=await $f(o);else if(s==="pptx")r=await Lf(o);else if(s==="pdf")r=await If(o);else throw new Error("Unsupported office type");return ls(e,n,a[s]||s)+r}function Cf(e,t){let n=e?e.split("/"):[],s=t?n.slice(0,-1):n,a='<span class="cursor-pointer text-primary hover:underline" data-dir-path="">root</span>',o="";for(let r of s)o=o?`${o}/${r}`:r,a+=` <span class="text-base-content/40">/</span> <span class="cursor-pointer text-primary hover:underline" data-dir-path="${p(o)}">${p(r)}</span>`;return t&&(a+=` <span class="text-base-content/40">/</span> <span>${p(n.at(-1))}</span>`),a}function Mf(){let e=E.peek(),t=ie.peek()||e?.path;if(!t)return;let n=document.createElement("input");n.type="file",n.multiple=!0,n.addEventListener("change",async()=>{let s=Y.peek(),a="_",o=[...n.files],r=!1;for(let d of o){let u=s?`${s}/${d.name}`:d.name,l=`/api/projects/${a}/file?root=${encodeURIComponent(t)}&path=${encodeURIComponent(u)}`;try{let f=await fetch(l,{method:"POST",headers:ct(),body:d,duplex:"half"});if(!f.ok){let m=await f.json().catch(()=>({}));throw new Error(m.error||`HTTP ${f.status}`)}}catch(f){alert(`Upload failed (${d.name}): ${f.message}`),r=!0;break}}if(!r){let d=Y.peek();Y.value=d+"\0",Y.value=d}}),n.click()}async function Af(e,t){let n=ie.peek()||e?.path||"";if(!n){alert("No path selected \u2014 set root first");return}let s="_",a=(t||"").split("/").pop()||"download",o=new URLSearchParams({root:n,path:t,download:"true"}),r=`/api/projects/${s}/file?${o}`;try{let d=typeof window.showSaveFilePicker=="function"?await window.showSaveFilePicker({suggestedName:a}):null,u=await fetch(r,{headers:ct(),credentials:"same-origin"});if(!u.ok){let ae=await u.json().catch(()=>({}));throw new Error(ae.error||`HTTP ${u.status}`)}if(d&&u.body){await u.body.pipeTo(await d.createWritable());return}let l=16*1024*1024;if(Number(u.headers.get("content-length"))>l)throw await u.body?.cancel(),new Error("Use native download");let f=u.body.getReader(),m=[],g=0;for(;;){let{done:ae,value:O}=await f.read();if(ae)break;if(g+=O.byteLength,g>l)throw await f.cancel(),new Error("Use native download");m.push(O)}let w=new Blob(m,{type:u.headers.get("content-type")||"application/octet-stream"}),y=URL.createObjectURL(w),A=document.createElement("a");A.href=y,A.download=a,A.rel="noopener",A.style.display="none",document.body.appendChild(A),A.click(),A.remove(),setTimeout(()=>URL.revokeObjectURL(y),6e4)}catch(d){if(d.name==="AbortError")return;try{let u=`/api/projects/${s}/file?${Qo({root:n,path:t,download:"true"})}`,l=document.createElement("a");l.href=u,l.download=a,l.rel="noopener",l.target="_blank",document.body.appendChild(l),l.click(),l.remove()}catch{alert(`Download failed: ${d.message}`)}}}async function jf(e,t){if(!confirm(`Delete "${t.split("/").pop()}"?`))return;let n=ie.peek()||e?.path||"",s="_";try{await x("DELETE",`/api/projects/${s}/file?root=${encodeURIComponent(n)}&path=${encodeURIComponent(t)}`),Y.value=Y.peek()+" ",Y.value=Y.peek().trimEnd()}catch(a){alert(`Delete failed: ${a.message}`)}}async function Df(e,t,n,s){let a=n.size??(typeof n.content=="string"?n.content.length:0),o=id(t);if(o&&n.encoding==="base64"){e.innerHTML=ls(t,a,o)+`<div class="p-4 text-xs text-base-content/40">Parsing ${o.toUpperCase()}\u2026</div>`;try{let r=await Tf(t,n.content,a);if(s.aborted)return;e.innerHTML=r}catch(r){if(s.aborted)return;e.innerHTML=ls(t,a,o)+`<div class="p-4 text-xs text-error">Preview failed: ${p(r.message)} \u2014 <button class="text-primary hover:underline" data-download-path="${p(t)}">Download</button></div>`}return}if(n.encoding==="base64"){e.innerHTML=ls(t,a,"binary")+`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${p(t)}">Download</button></div>`;return}e.innerHTML=vf(t,n.content||"",a),gf(e),ld(t)&&wf(e)}function cd(){je(()=>{let e=i("files-breadcrumb");if(!e)return;let t=re.value!==null;e.innerHTML=`
1266
+ ${Cf(re.value??Y.value,t)}
1267
1267
  <div class="flex-1"></div>
1268
- ${t?"":'<button id="btn-upload" class="btn btn-ghost btn-xs text-base-content/50 hover:text-base-content">\u2191 Upload</button>'}`}),Tn(async e=>{let t=X.value,n=E.value,s=(re.value||n?.path||"").trim(),a=oe.value,o=Y.value,r=i("files-area");if(!r||t!=="files")return;if(!s){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 d="_";r.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{if(a!==null){let f=await x("GET",`/api/projects/${d}/file?root=${encodeURIComponent(s)}&path=${encodeURIComponent(a)}`,void 0,e);e.aborted||await Af(r,a,f,e);return}let u=await x("GET",`/api/projects/${d}/files?root=${encodeURIComponent(s)}&path=${encodeURIComponent(o)}`,void 0,e);if(e.aborted)return;let l=Array.isArray(u)?u:Array.isArray(u?.files)?u.files:null;if(!l){r.innerHTML=`<div class="p-4 text-xs text-error">${p(u?.error||"Invalid directory listing")}</div>`;return}r.innerHTML=hf(l)}catch(u){!e.aborted&&u?.name!=="AbortError"&&(r.innerHTML=`<div class="p-4 text-xs text-error">${p(u.message)}</div>`)}}),b.on("click","[data-dir-path]",(e,t)=>{oe.value=null,Y.value=t.dataset.dirPath}),b.on("click","[data-file-path]",(e,t)=>{oe.value=t.dataset.filePath}),b.on("click","#btn-upload",()=>Tf()),b.on("click","[data-download-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.downloadPath;n&&Cf(E.peek(),n)}),b.on("click","[data-delete-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.deletePath;n&&Mf(E.peek(),n)}),b.on("click","[data-file-render-mode]",(e,t)=>{let n=t.closest("#files-area");if(!n)return;let s=t.dataset.fileRenderMode==="code";n.querySelector(".file-markdown-preview")?.classList.toggle("hidden",s),n.querySelector(".file-markdown-code")?.classList.toggle("hidden",!s),n.querySelectorAll("[data-file-render-mode]").forEach(a=>{a.classList.toggle("active",a===t)})}),b.on("click",".office-sheet-tab",(e,t)=>{let n=t.closest(".office-xlsx");if(!n)return;let s=t.dataset.sheetIdx;n.querySelectorAll(".office-sheet-tab").forEach(a=>a.classList.toggle("active",a===t)),n.querySelectorAll(".office-sheet-pane").forEach(a=>{a.classList.toggle("hidden",a.dataset.sheetPane!==s)})})}G();W();le();var ld=I(!1);function jf(e){return e?e.split(`
1268
+ ${t?"":'<button id="btn-upload" class="btn btn-ghost btn-xs text-base-content/50 hover:text-base-content">\u2191 Upload</button>'}`}),Mn(async e=>{let t=X.value,n=E.value,s=(ie.value||n?.path||"").trim(),a=re.value,o=Y.value,r=i("files-area");if(!r||t!=="files")return;if(!s){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 d="_";r.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{if(a!==null){let f=await x("GET",`/api/projects/${d}/file?root=${encodeURIComponent(s)}&path=${encodeURIComponent(a)}`,void 0,e);e.aborted||await Df(r,a,f,e);return}let u=await x("GET",`/api/projects/${d}/files?root=${encodeURIComponent(s)}&path=${encodeURIComponent(o)}`,void 0,e);if(e.aborted)return;let l=Array.isArray(u)?u:Array.isArray(u?.files)?u.files:null;if(!l){r.innerHTML=`<div class="p-4 text-xs text-error">${p(u?.error||"Invalid directory listing")}</div>`;return}r.innerHTML=bf(l)}catch(u){!e.aborted&&u?.name!=="AbortError"&&(r.innerHTML=`<div class="p-4 text-xs text-error">${p(u.message)}</div>`)}}),b.on("click","[data-dir-path]",(e,t)=>{re.value=null,Y.value=t.dataset.dirPath}),b.on("click","[data-file-path]",(e,t)=>{re.value=t.dataset.filePath}),b.on("click","#btn-upload",()=>Mf()),b.on("click","[data-download-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.downloadPath;n&&Af(E.peek(),n)}),b.on("click","[data-delete-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.deletePath;n&&jf(E.peek(),n)}),b.on("click","[data-file-render-mode]",(e,t)=>{let n=t.closest("#files-area");if(!n)return;let s=t.dataset.fileRenderMode==="code";n.querySelector(".file-markdown-preview")?.classList.toggle("hidden",s),n.querySelector(".file-markdown-code")?.classList.toggle("hidden",!s),n.querySelectorAll("[data-file-render-mode]").forEach(a=>{a.classList.toggle("active",a===t)})}),b.on("click",".office-sheet-tab",(e,t)=>{let n=t.closest(".office-xlsx");if(!n)return;let s=t.dataset.sheetIdx;n.querySelectorAll(".office-sheet-tab").forEach(a=>a.classList.toggle("active",a===t)),n.querySelectorAll(".office-sheet-pane").forEach(a=>{a.classList.toggle("hidden",a.dataset.sheetPane!==s)})})}K();G();ce();var dd=I(!1);function _f(e){return e?e.split(`
1269
1269
  `).map(t=>p(t).replace(/\b([0-9a-f]{7})\b/,'<span class="gh">$1</span>').replace(/\(([^)]*)\)/,'<span style="color:oklch(var(--wa))">($1)</span>')).join(`
1270
- `):'<span class="text-base-content/40">No commits</span>'}function Df(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`
1270
+ `):'<span class="text-base-content/40">No commits</span>'}function Nf(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`
1271
1271
  <div class="px-4 py-2 text-xs text-base-content/50 border-b border-base-300">
1272
1272
  Branch: <span class="text-success font-semibold">${p(e.branch)}</span>
1273
1273
  </div>
@@ -1293,16 +1293,16 @@ ${String(e||"")}`}function ed(e,t=c.sessionId){let n=Yp(e,t);!e||di.has(n)||(di.
1293
1293
  <span class="text-base-content/40">Loading\u2026</span>
1294
1294
  </div>
1295
1295
  </div>
1296
- </div>`}function _f(e){return e.split(`
1296
+ </div>`}function Pf(e){return e.split(`
1297
1297
  `).map(t=>t.startsWith("+")&&!t.startsWith("+++")?`<span class="diff-add">${p(t)}</span>`:t.startsWith("-")&&!t.startsWith("---")?`<span class="diff-del">${p(t)}</span>`:t.startsWith("@@")?`<span class="diff-hunk">${p(t)}</span>`:/^(diff |index |---|[+]{3})/.test(t)?`<span class="diff-head">${p(t)}</span>`:`<span>${p(t)}</span>`).join(`
1298
- `)}function cd(){Tn(async e=>{let t=X.value,n=E.value,s=Se.value||n?.path,a=i("git-area");if(!a||t!=="git")return;if(!s){a.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 o="_";a.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let r=await x("GET",`/api/projects/${o}/git/status?root=${encodeURIComponent(s)}`,void 0,e);e.aborted||(a.innerHTML=Df(r))}catch(r){!e.aborted&&r?.name!=="AbortError"&&(a.innerHTML=`<div class="p-4 text-xs text-error">${p(r?.message??String(r))}</div>`)}}),Tn(async e=>{let t=E.value,n=Se.value||t?.path,s=ld.value,a=i("diff-content");if(!a||!n)return;let o=t?.id||"_";try{let r=await x("GET",`/api/projects/${o}/git/diff?root=${encodeURIComponent(n)}${s?"&staged=true":""}`,void 0,e);e.aborted||(a.innerHTML=r?.diff?_f(r.diff):'<span class="text-base-content/40">No changes</span>')}catch(r){!e.aborted&&r?.name!=="AbortError"&&(a.innerHTML=`<span class="text-error">${p(r?.message??String(r))}</span>`)}}),b.on("click","#diff-unstaged, #diff-staged",(e,t)=>{let n=t.id==="diff-staged";ld.value=n,i("diff-unstaged").className=`cursor-pointer ${n?"text-base-content/50":"text-primary"}`,i("diff-staged").className=`cursor-pointer ${n?"text-primary":"text-base-content/50"}`}),b.on("click","#git-graph-toggle",()=>{let e=i("git-graph-panel"),t=i("git-graph-chevron"),n=e.classList.toggle("hidden");t.textContent=n?"\u25B6":"\u25BC",n||Nf()})}function Nf(){let e=E.peek(),t=Se.peek()||e?.path,n=i("git-graph-content");if(!t||!n)return;let s="_";n.innerHTML='<span class="text-base-content/40">Loading\u2026</span>',x("GET",`/api/projects/${s}/git/log?root=${encodeURIComponent(t)}`).then(a=>{n.innerHTML=a.graph?jf(a.graph):'<span class="text-base-content/40">No commits</span>'}).catch(a=>{n.innerHTML=`<span class="text-error">${p(a.message)}</span>`})}As();G();W();var Me=null,K=null,Co=null,ta=!1,Mo=null,fd=null,Zs=0,ea=null,bi=!1,dd=!1,ud={"ctrl-c":"",escape:"\x1B",tab:" ",up:"\x1B[A",down:"\x1B[B",left:"\x1B[D",right:"\x1B[C"};function vi(e){Me&&Me.readyState===WebSocket.OPEN&&Me.send(JSON.stringify({type:"input",data:e}))}function Pf(){return window.matchMedia("(max-width: 640px), (hover: none) and (pointer: coarse)").matches}function Ao(){if(Pf()){document.getElementById("term-mobile-input")?.focus({preventScroll:!0});return}K?.focus();let e=document.querySelector("#terminal-container .xterm-helper-textarea");e&&(e.focus({preventScroll:!0}),requestAnimationFrame(()=>e.focus({preventScroll:!0})))}function md(){if(K)return;let e=i("terminal-container");if(!e)return;if(typeof Terminal>"u"){setTimeout(md,100);return}K=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"&&(Co=new FitAddon.FitAddon,K.loadAddon(Co)),K.open(e),To(),K.onData(n=>{vi(n)}),e.addEventListener("pointerdown",()=>Ao(),{passive:!0}),e.addEventListener("touchend",()=>Ao(),{passive:!0}),window.addEventListener("resize",()=>{To(),jo()});let t=window.visualViewport;if(t){let n=0,s=()=>{n&&cancelAnimationFrame(n),n=requestAnimationFrame(()=>{n=0,X.peek()==="shell"&&(To(),jo())})};t.addEventListener("resize",s),t.addEventListener("scroll",s)}}function To(){try{Co&&K&&Co.fit()}catch{}}function jo(){Me&&Me.readyState===WebSocket.OPEN&&K&&Me.send(JSON.stringify({type:"resize",cols:K.cols,rows:K.rows}))}function hd(){return c.machineId||D.peek()||null}function Do(e){ea&&(clearTimeout(ea),ea=null),bi=!0;let t=++Zs;if(Me){try{Me.close()}catch{}Me=null}ta=!1;let n=location.protocol==="https:"?"wss":"ws",s=K?K.cols:80,a=K?K.rows:24,o=new URLSearchParams;c.token&&o.set("token",c.token),e&&o.set("cwd",e),o.set("cols",String(s)),o.set("rows",String(a));let r=hd();M.peek()&&r&&o.set("machine",r),Mo=e||null,fd=r,Me=new WebSocket(`${n}://${location.host}/ws/shell?${o}`),Me.addEventListener("open",()=>{t===Zs&&(ta=!0,K?.write(`\x1B[32mConnected to interactive terminal\x1B[0m\r
1299
- `),jo())}),Me.addEventListener("message",d=>{if(t!==Zs)return;let u;try{u=JSON.parse(d.data)}catch{return}u.type==="output"?K?.write(u.data):u.type==="exit"?K?.write(`\r
1298
+ `)}function ud(){Mn(async e=>{let t=X.value,n=E.value,s=Se.value||n?.path,a=i("git-area");if(!a||t!=="git")return;if(!s){a.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 o="_";a.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let r=await x("GET",`/api/projects/${o}/git/status?root=${encodeURIComponent(s)}`,void 0,e);e.aborted||(a.innerHTML=Nf(r))}catch(r){!e.aborted&&r?.name!=="AbortError"&&(a.innerHTML=`<div class="p-4 text-xs text-error">${p(r?.message??String(r))}</div>`)}}),Mn(async e=>{let t=E.value,n=Se.value||t?.path,s=dd.value,a=i("diff-content");if(!a||!n)return;let o=t?.id||"_";try{let r=await x("GET",`/api/projects/${o}/git/diff?root=${encodeURIComponent(n)}${s?"&staged=true":""}`,void 0,e);e.aborted||(a.innerHTML=r?.diff?Pf(r.diff):'<span class="text-base-content/40">No changes</span>')}catch(r){!e.aborted&&r?.name!=="AbortError"&&(a.innerHTML=`<span class="text-error">${p(r?.message??String(r))}</span>`)}}),b.on("click","#diff-unstaged, #diff-staged",(e,t)=>{let n=t.id==="diff-staged";dd.value=n,i("diff-unstaged").className=`cursor-pointer ${n?"text-base-content/50":"text-primary"}`,i("diff-staged").className=`cursor-pointer ${n?"text-primary":"text-base-content/50"}`}),b.on("click","#git-graph-toggle",()=>{let e=i("git-graph-panel"),t=i("git-graph-chevron"),n=e.classList.toggle("hidden");t.textContent=n?"\u25B6":"\u25BC",n||Hf()})}function Hf(){let e=E.peek(),t=Se.peek()||e?.path,n=i("git-graph-content");if(!t||!n)return;let s="_";n.innerHTML='<span class="text-base-content/40">Loading\u2026</span>',x("GET",`/api/projects/${s}/git/log?root=${encodeURIComponent(t)}`).then(a=>{n.innerHTML=a.graph?_f(a.graph):'<span class="text-base-content/40">No commits</span>'}).catch(a=>{n.innerHTML=`<span class="text-error">${p(a.message)}</span>`})}js();K();G();var Me=null,z=null,Mo=null,na=!1,Ao=null,hd=null,ea=0,ta=null,xi=!1,pd=!1,fd={"ctrl-c":"",escape:"\x1B",tab:" ",up:"\x1B[A",down:"\x1B[B",left:"\x1B[D",right:"\x1B[C"};function yi(e){Me&&Me.readyState===WebSocket.OPEN&&Me.send(JSON.stringify({type:"input",data:e}))}function qf(){return window.matchMedia("(max-width: 640px), (hover: none) and (pointer: coarse)").matches}function jo(){if(qf()){document.getElementById("term-mobile-input")?.focus({preventScroll:!0});return}z?.focus();let e=document.querySelector("#terminal-container .xterm-helper-textarea");e&&(e.focus({preventScroll:!0}),requestAnimationFrame(()=>e.focus({preventScroll:!0})))}function gd(){if(z)return;let e=i("terminal-container");if(!e)return;if(typeof Terminal>"u"){setTimeout(gd,100);return}z=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"&&(Mo=new FitAddon.FitAddon,z.loadAddon(Mo)),z.open(e),Co(),z.onData(n=>{yi(n)}),e.addEventListener("pointerdown",()=>jo(),{passive:!0}),e.addEventListener("touchend",()=>jo(),{passive:!0}),window.addEventListener("resize",()=>{Co(),Do()});let t=window.visualViewport;if(t){let n=0,s=()=>{n&&cancelAnimationFrame(n),n=requestAnimationFrame(()=>{n=0,X.peek()==="shell"&&(Co(),Do())})};t.addEventListener("resize",s),t.addEventListener("scroll",s)}}function Co(){try{Mo&&z&&Mo.fit()}catch{}}function Do(){Me&&Me.readyState===WebSocket.OPEN&&z&&Me.send(JSON.stringify({type:"resize",cols:z.cols,rows:z.rows}))}function bd(){return c.machineId||_.peek()||null}function _o(e){ta&&(clearTimeout(ta),ta=null),xi=!0;let t=++ea;if(Me){try{Me.close()}catch{}Me=null}na=!1;let n=location.protocol==="https:"?"wss":"ws",s=z?z.cols:80,a=z?z.rows:24,o=new URLSearchParams;c.token&&o.set("token",c.token),e&&o.set("cwd",e),o.set("cols",String(s)),o.set("rows",String(a));let r=bd();M.peek()&&r&&o.set("machine",r),Ao=e||null,hd=r,Me=new WebSocket(`${n}://${location.host}/ws/shell?${o}`),Me.addEventListener("open",()=>{t===ea&&(na=!0,z?.write(`\x1B[32mConnected to interactive terminal\x1B[0m\r
1299
+ `),Do())}),Me.addEventListener("message",d=>{if(t!==ea)return;let u;try{u=JSON.parse(d.data)}catch{return}u.type==="output"?z?.write(u.data):u.type==="exit"?z?.write(`\r
1300
1300
  \x1B[33m[process exited: ${u.code}]\x1B[0m\r
1301
- `):u.type==="error"&&K?.write(`\r
1301
+ `):u.type==="error"&&z?.write(`\r
1302
1302
  \x1B[31m[error: ${u.data||u.message||""}]\x1B[0m\r
1303
- `)}),Me.addEventListener("close",()=>{t===Zs&&(ta=!1,K?.write(`\r
1303
+ `)}),Me.addEventListener("close",()=>{t===ea&&(na=!1,z?.write(`\r
1304
1304
  \x1B[33m[disconnected]\x1B[0m\r
1305
- `),!(!bi||X.peek()!=="shell")&&(K?.write(`\x1B[33m[reconnecting\u2026]\x1B[0m\r
1306
- `),ea=setTimeout(()=>{ea=null,Do(Mo)},1500)))}),Me.addEventListener("error",()=>{t===Zs&&K?.write(`\r
1305
+ `),!(!xi||X.peek()!=="shell")&&(z?.write(`\x1B[33m[reconnecting\u2026]\x1B[0m\r
1306
+ `),ta=setTimeout(()=>{ta=null,_o(Ao)},1500)))}),Me.addEventListener("error",()=>{t===ea&&z?.write(`\r
1307
1307
  \x1B[31m[WebSocket error]\x1B[0m\r
1308
- `)})}function pd(){let e=E.peek()?.path,t=i("term-cwd");t&&(t.textContent=e||"~"),K||md(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{To();let n=hd();!ta||Mo!==(e||null)||fd!==n?(K?.clear(),Do(e)):jo()})})}function gd(){dd||(dd=!0,document.getElementById("term-keyboard")?.addEventListener("click",Ao),document.getElementById("term-mobile-composer")?.addEventListener("submit",e=>{e.preventDefault();let t=document.getElementById("term-mobile-input");t&&(vi(`${t.value}\r`),t.value="",t.focus({preventScroll:!0}))}),document.getElementById("term-mobile-keys")?.addEventListener("pointerdown",e=>{e.target.closest("[data-term-key]")&&e.preventDefault()}),document.getElementById("term-mobile-keys")?.addEventListener("click",e=>{let t=e.target.closest("[data-term-key]")?.dataset.termKey;!t||!ud[t]||(vi(ud[t]),Ao())})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(X.peek()!=="shell"||!bi||ta||Do(Mo))}),De(X,e=>{e==="shell"&&pd()}),document.addEventListener("shell-tab-shown",()=>{X.peek()==="shell"&&pd()}),document.getElementById("term-reconnect")?.addEventListener("click",()=>{K?.clear(),Do(E.peek()?.path)})}Ps();Na();var bd=null;function vd(){return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone===!0||document.referrer.includes("android-app://")}function Hf(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 qf(){if(!("serviceWorker"in navigator)||!window.isSecureContext)return!1;let e=location.hostname;return e==="localhost"||e==="127.0.0.1"||e==="::1"?!0:Hf(e)?!1:location.protocol==="https:"}function xd(){document.getElementById("btn-pwa-install")?.classList.remove("hidden")}function yd(){vd()&&document.documentElement.classList.add("pwa-standalone"),window.addEventListener("beforeinstallprompt",n=>{n.preventDefault(),bd=n,document.dispatchEvent(new CustomEvent("pwa-installable")),xd()}),window.addEventListener("appinstalled",()=>{bd=null,document.getElementById("btn-pwa-install")?.classList.add("hidden")});let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1;if(!vd()&&(e||/Android/i.test(navigator.userAgent))&&requestAnimationFrame(()=>xd()),!qf()){"serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{});return}let t=()=>{navigator.serviceWorker.register("/sw.js?v=33",{scope:"/"}).then(n=>{n.addEventListener("updatefound",()=>{let s=n.installing;s&&s.addEventListener("statechange",()=>{s.state==="installed"&&navigator.serviceWorker.controller&&console.info("[pwa] New version ready \u2014 reload to apply")})})}).catch(()=>{navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{})})};document.readyState==="complete"?setTimeout(t,0):window.addEventListener("load",()=>setTimeout(t,0))}Dn();function xi(){let e=document.documentElement;e.classList.add("boot-ready"),e.classList.remove("boot-pending")}function _o(){document.documentElement.classList.remove("boot-restore")}var yi=wr(location.hash.slice(1)||"/"),wd=ii()||!!(c.token&&yi?.id);Nc({restoreSession:wd});Ri();sd();id();cd();Al();Cr();gd();Zc();Xl();wl(nt,Tt);(async()=>{let e=Pi();if(c.token)try{let t=document.getElementById("auth-screen"),n=document.getElementById("app");if(t&&(t.style.display="none",t.classList.add("hidden")),n&&(n.style.display="flex",n.classList.remove("hidden")),wd){document.documentElement.classList.add("boot-restore");let a=document.getElementById("welcome"),o=document.getElementById("project-view");a&&(a.classList.add("hidden"),a.style.display="none"),o&&(o.classList.remove("hidden"),o.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden")}let s=await e;await fo({hub:s,deepLink:yi}),yi?.id||(kl(),(location.hash||"").startsWith("#/session/")||_o()),requestAnimationFrame(()=>{requestAnimationFrame(xi)})}catch(t){console.error("[boot]",t),c.token=null,localStorage.removeItem("token"),_o(),await ri(),xi()}else{_o();try{await ri()}catch(t){console.error("[boot auth]",t)}finally{xi()}}})();document.addEventListener("router:home",()=>{_o()});yd();
1308
+ `)})}function md(){let e=E.peek()?.path,t=i("term-cwd");t&&(t.textContent=e||"~"),z||gd(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{Co();let n=bd();!na||Ao!==(e||null)||hd!==n?(z?.clear(),_o(e)):Do()})})}function vd(){pd||(pd=!0,document.getElementById("term-keyboard")?.addEventListener("click",jo),document.getElementById("term-mobile-composer")?.addEventListener("submit",e=>{e.preventDefault();let t=document.getElementById("term-mobile-input");t&&(yi(`${t.value}\r`),t.value="",t.focus({preventScroll:!0}))}),document.getElementById("term-mobile-keys")?.addEventListener("pointerdown",e=>{e.target.closest("[data-term-key]")&&e.preventDefault()}),document.getElementById("term-mobile-keys")?.addEventListener("click",e=>{let t=e.target.closest("[data-term-key]")?.dataset.termKey;!t||!fd[t]||(yi(fd[t]),jo())})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(X.peek()!=="shell"||!xi||na||_o(Ao))}),De(X,e=>{e==="shell"&&md()}),document.addEventListener("shell-tab-shown",()=>{X.peek()==="shell"&&md()}),document.getElementById("term-reconnect")?.addEventListener("click",()=>{z?.clear(),_o(E.peek()?.path)})}Hs();Pa();var xd=null;function yd(){return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone===!0||document.referrer.includes("android-app://")}function Rf(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 Bf(){if(!("serviceWorker"in navigator)||!window.isSecureContext)return!1;let e=location.hostname;return e==="localhost"||e==="127.0.0.1"||e==="::1"?!0:Rf(e)?!1:location.protocol==="https:"}function wd(){document.getElementById("btn-pwa-install")?.classList.remove("hidden")}function kd(){yd()&&document.documentElement.classList.add("pwa-standalone"),window.addEventListener("beforeinstallprompt",n=>{n.preventDefault(),xd=n,document.dispatchEvent(new CustomEvent("pwa-installable")),wd()}),window.addEventListener("appinstalled",()=>{xd=null,document.getElementById("btn-pwa-install")?.classList.add("hidden")});let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1;if(!yd()&&(e||/Android/i.test(navigator.userAgent))&&requestAnimationFrame(()=>wd()),!Bf()){"serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{});return}let t=()=>{navigator.serviceWorker.register("/sw.js?v=33",{scope:"/"}).then(n=>{n.addEventListener("updatefound",()=>{let s=n.installing;s&&s.addEventListener("statechange",()=>{s.state==="installed"&&navigator.serviceWorker.controller&&console.info("[pwa] New version ready \u2014 reload to apply")})})}).catch(()=>{navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{})})};document.readyState==="complete"?setTimeout(t,0):window.addEventListener("load",()=>setTimeout(t,0))}Nn();function wi(){let e=document.documentElement;e.classList.add("boot-ready"),e.classList.remove("boot-pending")}function No(){document.documentElement.classList.remove("boot-restore")}var ki=kr(location.hash.slice(1)||"/"),$d=ci()||!!(c.token&&ki?.id);Hc({restoreSession:$d});Oi();od();cd();ud();Dl();Ar();vd();td();ec();$l(nt,Ct);(async()=>{let e=qi();if(c.token)try{let t=document.getElementById("auth-screen"),n=document.getElementById("app");if(t&&(t.style.display="none",t.classList.add("hidden")),n&&(n.style.display="flex",n.classList.remove("hidden")),$d){document.documentElement.classList.add("boot-restore");let a=document.getElementById("welcome"),o=document.getElementById("project-view");a&&(a.classList.add("hidden"),a.style.display="none"),o&&(o.classList.remove("hidden"),o.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden")}let s=await e;await mo({hub:s,deepLink:ki}),ki?.id||(Sl(),(location.hash||"").startsWith("#/session/")||No()),requestAnimationFrame(()=>{requestAnimationFrame(wi)})}catch(t){console.error("[boot]",t),c.token=null,localStorage.removeItem("token"),No(),await li(),wi()}else{No();try{await li()}catch(t){console.error("[boot auth]",t)}finally{wi()}}})();document.addEventListener("router:home",()=>{No()});kd();