claude-simple 0.2.32 → 0.2.33

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 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]===`
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 ds=(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?Cn:Mn).add(t);Bo>0||aa||(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=[Jt,fs,Po];[Jt,fs,Po]=[t,n,s];try{return e()}catch(r){for(let d of a)d._subs.add(t),n.add(d);throw r}finally{[Jt,fs,Po]=o}}var Jt,fs,Bo,Po,Cn,Mn,aa,us,Ho,Ed,qo,Oo,Si,I,Uo,je,xe,De,An,Td,p,b,Ei,i,Ro,Cd,ot,ps,Md,oa,Ad,Uf,ra,Ff,Wf,Ii,Ti=W(()=>{Jt=null,fs=null,Bo=0,Po=null,Cn=new Set,Mn=new Set,aa=!1,us=1e4,Ho={flushes:0,runs:0,lastFlushRuns:0},Ed="sync",qo=!1;Oo=()=>{if(aa)return;aa=!0;let e=0;Ho.flushes++;try{for(;Cn.size||Mn.size;){for(;Cn.size;){let t=Cn.values().next().value;if(Cn.delete(t),++e>us)throw new Error(`mini-react: reactive update loop exceeded ${us} runs`);t()}if(Mn.size){let t=Mn.values().next().value;if(Mn.delete(t),++e>us)throw new Error(`mini-react: reactive update loop exceeded ${us} runs`);t()}}}finally{Ho.runs+=e,Ho.lastFlushRuns=e,e>us&&(Cn.clear(),Mn.clear()),aa=!1}};Si=class{constructor(e,t){this._v=e,this._subs=new Set,this._eq=t??((n,s)=>n===s)}get value(){return Jt&&(this._subs.add(Jt),fs?.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 c=Li(e,r,n,null),f=c!==t._v;f&&(t._v=c),f&&u&&$i(t._subs)}catch(c){s=!0,console.error("[computed]",c)}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 Jt&&(t._subs.add(Jt),fs?.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})},An=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=(c,f)=>{if(!t)return f();if(o.has(c))return o.get(c);let m=f();return o.set(c,m),m},d=I(void 0),u=je(()=>{let c=n.value;for(let[f,m]of Object.entries(e)){if(f==="*")continue;let g=new RegExp("^"+f.replace(/:\w+/g,"([^/]+)")+"$"),w=c.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:c=>{s||(location.hash=c)},match:c=>{let f=n.value.match(new RegExp("^"+c.replace(/:\w+/g,"([^/]+)")+"$"));return f?f.slice(1):null},invalidate:c=>{if(o){if(c===void 0){o.clear();return}for(let f of[...o.keys()])(f===c||f.startsWith(`${c}|`))&&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(",")}}`,ps=(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}},oa=(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)=>oa(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]=oa(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,c=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:oa(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=>ps(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:oa(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}),c&&c.postMessage({type:"invalidate",hash:S.hash}),F},invalidateQueries(h){for(let v of r.values())ps(v,h)&&y(v);return m({type:"invalidate",filter:h}),c&&c.postMessage({type:"invalidate",filter:h}),Ae(h)},cancelQueries(h){for(let v of r.values())ps(v,h)&&v.ctrl?.abort()},removeQueries(h){for(let v of[...r.values()])ps(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 zt=L.getQueryData(de.queryKey);R.push([de.queryKey,zt]),L.setQueryData(de.queryKey,Tn=>de.updater(Tn))}),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[zt,Tn]of R)L.setQueryData(zt,Tn);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"?()=>{}:(c?.close(),c=new BroadcastChannel(h),c.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())ps(S,k)&&y(S);Ae(k)},()=>{c?.close(),c=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);c?.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 Kt=L.destroy;return L.destroy=()=>{f||(typeof window<"u"&&(window.removeEventListener("focus",be),window.removeEventListener("online",oe)),Kt())},L},Uf=Ad(),ra=({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,c=(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=c(m,y);return q!==void 0?Promise.resolve(q):pe(O())}return pe(Promise.resolve(c(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,c)=>{let f=d.transaction(t,o),m=r(f.objectStore(t));m.onsuccess=()=>u(m.result),m.onerror=()=>c(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={};ds(Hi,{AGENT_DEFAULT_MODEL:()=>_i,AGENT_LABELS:()=>Z,AGENT_MODELS:()=>Fo,LOW_TURN_THRESHOLD:()=>Go,activityHits:()=>rt,activityLoading:()=>bt,addCustomModel:()=>Yt,agentFilter:()=>ye,agentFilters:()=>Vt,agentsMeta:()=>Qt,chatDensity:()=>_e,collapsedFolders:()=>Dn,ctx:()=>l,currentAgent:()=>$,currentEffort:()=>te,currentModel:()=>N,currentPermission:()=>ue,currentProject:()=>E,currentTab:()=>X,expandedFolders:()=>jn,favoritesOnly:()=>ze,filesPath:()=>Y,filesRoot:()=>ie,filteredSessions:()=>_t,getCustomModels:()=>la,getDefaultEffort:()=>Qe,getDefaultModel:()=>Oe,getEffortsForModel:()=>Xt,getModelsForAgent:()=>Be,getSavedModel:()=>Di,getSessionMeta:()=>_n,gitRoot:()=>Se,hubMachineReady:()=>it,hubMode:()=>M,isProcessing:()=>P,machinesList:()=>le,metaKey:()=>J,projectGroups:()=>Zt,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:()=>ia,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=l.sessionId,n=l.machineId){if(!t)return"";let s=(e||"claude").toLowerCase();return`${n||""}:${s}:${t}`}function Di(e,t=l.sessionId,n=l.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=l.sessionId,s=l.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,l.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function J(e,t,n){let s=`${e||"claude"}:${t}`;return n||l?.machineId?`${n||l.machineId}:${s}`:s}function _n(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=(_n(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 la(e){let t=(e||"claude").toLowerCase(),n=zo()[t];return Array.isArray(n)?n.filter(Boolean).map(String):[]}function Yt(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=Qt.peek()?.defaults?.[t],s=n?.models?.length?n.models.map(Dd).filter(Boolean):(Fo[t]||Fo.claude).map(r=>({...r})),a=la(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=Qt.peek()?.defaults?.[t];return n?.model?String(n.model):_i[t]||Be(t)[0]?.value||"sonnet"}function Xt(e,t){let s=Be(e).find(o=>o.value===t);if(s?.efforts?.length)return s.efforts;let a=Qt.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=Qt.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,jn,Dn,Y,re,E,X,P,me,Mi,jd,$,N,te,ue,ie,Se,Qt,gt,ye,Vt,ia,rt,bt,T,ze,Je,Go,_e,M,le,_,it,l,Z,Fo,_i,Ni,_t,Zt,G=W(()=>{K();ne=I([]),fe=I([]),ke=I(null),$e=I(""),Ci=I("time"),jn=I(new Set),Dn=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(""),Qt=I(null),gt=I(localStorage.getItem("sidebarView")||"projects"),ye=I(localStorage.getItem("agentFilter")||"all"),Vt=I((()=>{try{let e=JSON.parse(localStorage.getItem("agentFilters")||"[]");return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}})()),ia=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),l={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=Vt.value,a=ze.value,o=Je.value,r=T.value,d=rt.value,u=d?.results?.length&&e?Wo(d.results):Wo(ne.value),c=_.value;return M.value&&c&&(u=u.filter(f=>f&&(!f.machineId||f.machineId===c))),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}),Zt=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 ms(e={}){return e.machineId!==void 0?e.machineId:l.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:ms(a),r={"Content-Type":"application/json",...l.token?{Authorization:`Bearer ${l.token}`}:{}};!a.hub&&M.peek()&&o&&!qd(t)&&(r["X-Machine-Id"]=o),e.toUpperCase()!=="GET"&&e.toUpperCase()!=="HEAD"&&l.lock?.token&&l.lock?.key&&!String(t).startsWith("/api/collab/")&&(r["X-Lock-Token"]=l.lock.token,r["X-Lock-Key"]=l.lock.key);let u=a.etag===!0?`${l.token||""}:${o||""}:${t}`:a.etag||null;if(e.toUpperCase()==="GET"&&u){let m=Ri.get(u);m&&(r["If-None-Match"]=m)}let c=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 c();let f=`${l.token||""}:${o||""}:${t}`;return Pd.get(f,c)}function lt(e){return l.ws?.readyState===WebSocket.OPEN?(l.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||ca.push(e),!1)}function da(){for(;ca.length&&l.ws?.readyState===WebSocket.OPEN;)l.ws.send(JSON.stringify(ca.shift()))}function ua(){ca.length=0}function Qo(e={}){let t=new URLSearchParams(e);l.token&&t.set("token",l.token);let n=ms();return M.peek()&&n&&t.set("machine",n),t.toString()}function ct(e={},t={}){let n={...e};l.token&&(n.Authorization=`Bearer ${l.token}`);let s=ms();return!t.hub&&M.peek()&&s&&(n["X-Machine-Id"]=s),n}async function pa(){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,ca,ce=W(()=>{G();K();Pd=ra({cache:!1,dedupe:!0,retry:0}),Ri=new Map,Hd=Symbol("not-modified");ca=[]});function en(e,t){e&&(t?e.setAttribute("inert",""):e.removeAttribute("inert"))}function Nn(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");en(t,!s)}en(document.getElementById("welcome"),Nn(document.getElementById("welcome"))),en(document.getElementById("auth-screen"),Nn(document.getElementById("auth-screen"))),en(document.getElementById("chat-opts"),Nn(document.getElementById("chat-opts"))),en(document.getElementById("machine-picker"),Nn(document.getElementById("machine-picker")));for(let s of["files","git","shell","memory"]){let a=document.getElementById(`tab-${s}`);en(a,Nn(a))}let n=document.getElementById("tab-chat");n&&en(n,Nn(n))}function hs(){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(),hs();let e=window.visualViewport;e&&(e.addEventListener("resize",hs),e.addEventListener("scroll",hs)),window.addEventListener("resize",()=>{hs(),Ee()}),window.addEventListener("orientationchange",()=>{setTimeout(()=>{hs(),Ee()},250)})}var Pn=W(()=>{});function tn(){try{let e=localStorage.getItem(Ui);return e?JSON.parse(e):null}catch{return null}}function Vo(e){try{let n={...tn()||{},...e,updatedAt:Date.now()};localStorage.setItem(Ui,JSON.stringify(n))}catch{}}var Ui,ma=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 ha(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 c=a.split("/"),f=c.pop()||"",m=c.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 c=d.join("/")||"/";return ha(c,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",c=>{c.target.closest("a")||Ki(o)}),o.addEventListener("keydown",c=>{(c.key==="Enter"||c.key===" ")&&(c.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,Hn=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
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)=>`
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 ga(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,nn=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}=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=>`
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 ga(a,s)}try{return ga(marked.parse(n,{breaks:!0,gfm:!0}),s)}catch{let a=t?t(n):n;return ga(a,s)}}var Yd,sn=W(()=>{nn();Yd=/(?:<|\[)\s*(?:…\s*)?truncated\s+([\d,]+)\s+bytes\s*(?:>|\])/gi});function er(e,t){let n=ha(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();Hn();nn();sn()});function eu({sessionId:e=l.sessionId,agent:t=l.agent||$.peek()||"claude",machineId:n=l.machineId||_.peek()||"local"}={}){return e?`session:${n||"local"}:${t||"claude"}:${e}`:null}function an(){return!((l.role||"editor")==="viewer"||l.lock?.foreign)}function tu(){document.dispatchEvent(new CustomEvent("session-lock-changed",{detail:l.lock}))}function qn(e){l.lock={key:null,token:null,holder:null,held:!1,foreign:!1,...e||{}},tu()}async function wt(e={}){let t=eu(e);return t?(l.role||"editor")==="viewer"?(qn({key:t,held:!1,foreign:!0,holder:"viewer"}),{ok:!1,error:"viewers cannot take exclusive locks",code:403}):(l.lock?.key&&l.lock.key!==t&&await va(),gs||(gs=(async()=>{try{let s={key:t,kind:"session",ttlSec:nr,exclusive:!0,...l.lock?.token&&l.lock?.key===t?{token:l.lock.token}:{}},a=await x("POST","/api/collab/locks",s,void 0,{hub:!0});return qn({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)?(qn({key:t,held:!1,foreign:!0,holder:"another user"}),{ok:!1,code:423,error:a}):(qn({key:t,held:!0,foreign:!1,unmanaged:!0}),{ok:!0,skipped:!0,error:a})}finally{gs=null}})(),gs)):(qn({foreign:!1,held:!0,unmanaged:!0}),{ok:!0,skipped:!0})}async function nu(){let{key:e,token:t,held:n}=l.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&&(l.lock.token=s.token),s?.expiresAt&&(l.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(),ba=setInterval(()=>{nu().catch(()=>{})},Zd)}function sr(){ba&&(clearInterval(ba),ba=null)}async function va(){sr();let{key:e,token:t}=l.lock||{};if(qn({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 l.role=e?.role||l.role||"editor",l.username=e?.username||l.username||null,e}catch{return l.role||(l.role="editor"),null}}var nr,Zd,ba,gs,bs=W(()=>{G();ce();nr=60,Zd=2e4,ba=null,gs=null});async function ar(){if(vs&&!(typeof navigator>"u"||!navigator.wakeLock?.request)&&document.visibilityState==="visible"&&!on)try{on=await navigator.wakeLock.request("screen"),on.addEventListener("release",()=>{on=null,vs&&document.visibilityState==="visible"&&setTimeout(()=>{ar().catch(()=>{})},500)})}catch{on=null}}async function Vi(){let e=on;if(on=null,!!e)try{await e.release()}catch{}}function xa(e){vs=!!e,vs?ar().catch(()=>{}):Vi().catch(()=>{})}function or(){typeof document>"u"||document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&vs?ar().catch(()=>{}):document.visibilityState==="hidden"&&Vi().catch(()=>{})})}var on,vs,rr=W(()=>{on=null,vs=!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 Rn(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 Bn(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 On(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(!rn){e.classList.add("hidden"),e.textContent="0";return}e.classList.remove("hidden"),e.textContent=rn>99?"99+":String(rn)}}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 xs(){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)}"
@@ -28,41 +28,41 @@ var Ld=Object.defineProperty;var W=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(
28
28
  </div>
29
29
  </div>
30
30
  </div>
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(`
31
+ </button>`).join(""),Yi()}}function ln(){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():ln())}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)),rn=Pe.reduce((n,s)=>n+(s.unread?1:0),0),xs()}async function ya(){try{let e=await x("GET","/api/notifications?limit=80");Pe=Array.isArray(e?.notifications)?e.notifications:[],rn=Number(e?.unreadCount)||Pe.reduce((t,n)=>t+(n.unread?1:0),0),xs()}catch{Pe=[],rn=0,xs()}}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),rn=Number(t?.unreadCount)||Pe.reduce((n,s)=>n+(s.unread?1:0),0),xs()}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 wa(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,xs(),ya(),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(),ln()}),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]),ln(),!(!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)||ln()}),window.addEventListener("resize",()=>{i("notifications-menu")&&!i("notifications-menu").classList.contains("hidden")&&el()})}var Pe,rn,ir,ka=W(()=>{K();ce();Nt();Pe=[],rn=0,ir=null});function ys(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 $a(e){let t=!0,n=!1,s=0,a=()=>{t=ys(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?(cn&&cn.el===e||(cn?.destroy?.(),cn=$a(e),cn.el=e),cn):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=l.sessionId,t=l.agent,n=l.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||l.sessionId,e.agent||l.agent,l.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=l.sessionId,agent:t=l.agent,machineId:n=l.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function Kn(e){let t=St(e),n=i("chat-input");!t||!n||(n.value?dn.set(t,n.value):dn.delete(t))}function zn(e){let t=i("chat-input");t&&(t.value=dn.get(St(e))||"",Es(t),Ls(t.value))}function Jn(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=dn.get(t)||"";dn.set(t,[s,...n.map(a=>a.text)].filter(Boolean).join(`
32
32
 
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",`
33
+ `))}function Qn(){P.peek()&&(P.value=!1,un())}function hu(){sl||(sl=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(ut=400,Un({probe:!0}),l.ws?.readyState===WebSocket.OPEN&&l.sessionId))try{l.ws.send(JSON.stringify({type:"subscribe",sessionId:l.sessionId,agent:l.agent}))}catch{}}),window.addEventListener("online",()=>{ut=400,Un({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?Un({force:!0}):Un({probe:!0})}),window.addEventListener("focus",()=>Un({probe:!0})),navigator.connection?.addEventListener?.("change",()=>{ut=400,Un({probe:!0})}))}function La(){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 Un(e={}){let t=l.ws?.readyState;if(e.force){ut=400,Ht({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&$t&&Date.now()-$t>45e3)try{l.ws.close()}catch{}else if(e.probe&&l.ws.readyState===WebSocket.OPEN)try{l.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(ut=Math.min(ut,800),Ht({quiet:!0}))}function gu(){Fn||(me.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",La(),Fn=setTimeout(()=>{Fn=null,Ht({quiet:!0})},ut),ut=Math.min(Math.round(ut*1.8),15e3))}function dl(){Sa&&(clearInterval(Sa),Sa=null)}function bu(e,t){dl(),Sa=setInterval(()=>{if(!(t!==ks||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 un(){let e=P.peek()||!!E.peek()&&me.peek()==="open";xa(e)}function Ca(){return(l.role||"editor")==="viewer"?"\u53EA\u8BFB\u8D26\u53F7\uFF0C\u65E0\u6CD5\u8F93\u5165":l.lock?.foreign?`\u4F1A\u8BDD\u7531 ${l.lock.holder&&l.lock.holder!=="viewer"?l.lock.holder:"\u5176\u4ED6\u7528\u6237"} \u5360\u7528\uFF08\u9501\uFF09`:"\u5F53\u524D\u65E0\u6CD5\u8F93\u5165"}function Gn(){let e=an();l.externalSessionReadOnly=!e;let t=i("chat-input"),n=i("send-btn"),s=i("btn-attach"),a=i("session-lock-banner");if(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":Ls(t.value||""):t.placeholder=Ca()),n&&(n.disabled=!e),s&&(s.disabled=!e),a)if(!e)a.classList.remove("hidden"),a.textContent=Ca();else{let o=l.nativeRunNotice?.sessionId===l.sessionId?l.nativeRunNotice.message:"";a.classList.toggle("hidden",!o),a.textContent=o}}function _a(e){Gn()}function Ht(e={}){hu(),Fn&&(clearTimeout(Fn),Fn=null),e.quiet&&(dr=!0);let t=l.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);al!==t&&(ua(),al=t);let n=++ks;try{l.ws?.close()}catch{}me.value="connecting",La();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;l.token&&a.set("token",l.token),t&&a.set("machine",t),l.sessionId&&a.set("sessionId",l.sessionId),l.agent&&a.set("agent",l.agent);let o=fu();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);l.ws=r,r.addEventListener("open",()=>{if(n===ks){if(ut=1e3,$t=Date.now(),me.value="open",La(),l.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:l.sessionId,agent:l.agent}))}catch{}da(),pu(),bu(r,n),un(),cr&&!dr&&C(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),cr=!1,dr=!1}}),r.addEventListener("message",d=>{if(n!==ks)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"){if(u.sessionId&&u.sessionId!==l.sessionId)return;if(typeof u.running!="boolean"){l.nativeRunNotice={sessionId:l.sessionId,message:u.message||"\u7EC8\u7AEF\u4F1A\u8BDD\u672A\u786E\u8BA4\u7ED3\u675F"},Gn();return}l.nativeRunNotice=null,Gn(),u.running?P.value=!0:(P.peek()&&(P.value=!1),fr()),un();return}pl(u)}}),r.addEventListener("close",()=>{n===ks&&(dl(),cr=!0,me.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",La(),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,Es(s)),setTimeout(()=>{if(n.key!==St()||P.peek()){dn.set(n.key,n.text);return}Is()},0)}function $s(){P.value=!1,un(),fr()}function hr(){return ul}function pl(e){if(!(e?.sessionId&&l.sessionId&&e.sessionId!==l.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();l.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){wa(e.notification);return}if(e.type==="grok-queue-status"){Mu(e);return}if(e.type==="result"){Ss(),ws(),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};l.lastUsage=n,l.sessionId&&(l.lastUsageSessionId=l.sessionId),Wn(n)}e.is_error||C("\u2713 Done"),$s();return}if(e.type==="complete"){Ss(),ws(),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")),$s();return}if(e.type==="error"){Ss(),ws(),(e.code===423||/locked/i.test(String(e.message||"")))&&(l.lock={...l.lock||{},held:!1,foreign:!0,holder:e.lock?.holder||l.lock?.holder||"another user"},Gn()),qt("error","Error",du(e.message)),$s();return}if(e.type==="shell-start"){l.shellBubble=null;return}if(e.type==="shell-output"){l.shellBubble||(l.shellBubble=ju(e.stream==="stderr"?"shell-err":"shell")),Du(l.shellBubble,e.data);return}if(e.type==="shell-exit"){l.shellBubble=null,C(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),$s();return}if(e.type==="assistant"){ws();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,un()),fl(e.ts);return}if(e.type==="assistant_delta"){P.peek()||(P.value=!0,un()),vu(e.data||"");return}if(e.type==="assistant_stream_end"){ws();return}if(e.type==="thought_stream_start"){ml();return}if(e.type==="thought_delta"){xu(e.data||"");return}if(e.type==="thought_stream_end"){Ss();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(),Ss(),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 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",`
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 ws(){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=Ia(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>`),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:
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 Ss(){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()?(l.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(c=>c.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||Yt(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=Xt($.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 Yn(),l.sessionId=null,l.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 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(`
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=l.sessionId,s=[`Agent: ${Z[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(l.lastUsage&&(!n||l.lastUsageSessionId===n)){let a=l.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",c=r.windowTokens!=null?Ie(r.windowTokens):"\u2014",f=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";s.push(`Context window: ${u} / ${c} (${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),c=Math.round(r.sessionDurationSeconds%60);s.push(`Duration: ${u}m ${c}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&&!l.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 c=u.length-1;c>=0;c--)if(u[c].textContent==="Loading usage\u2026"){u[c].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?Wn(r.sessionTotals):r.lastTurn?Wn(r.lastTurn):l.lastUsage&&Wn(l.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 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)=>`
57
+ (usage fetch failed: ${a.message})`)}}function Is(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(!an()){C(Ca()),wt().then(()=>Gn()).catch(()=>{});return}if(l.sessionId&&!l.lock?.held&&!l.lock?.unmanaged){wt().then(s=>{if(!s?.ok&&!s?.skipped){Gn(),C(Ca());return}Is()}).catch(()=>Is());return}if(P.peek()){if($.peek()==="grok"&&l.sessionId){let s="grok",a=te.peek()||Qe(s,N.peek())||"low",o=lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:l.sessionId,lockToken:l.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:l.sessionId,configDir:l.configDir,model:N.peek(),lockToken:l.lock?.token||void 0,effort:a,...ue.peek()&&{permissionMode:ue.peek()},...ue.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});vl(t),e.value="",Es(e),Ls(""),Ea(),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="",Es(e),Ls(""),Ea(),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="",dn.delete(St()),Es(e),Ls(""),Ea(),t.startsWith("/")&&wu(t))return;P.value=!0,un();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();l.sessionId&&se(N.peek(),s,l.sessionId),lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:l.sessionId,lockToken:l.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:l.sessionId,configDir:l.configDir,model:N.peek(),lockToken:l.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(){l.sessionId&&lt({type:"command",cmd:"turn.interrupt",sessionId:l.sessionId}),Fe=Fe.filter(e=>e.key!==St()),Da(),Au(),$s()}function Ls(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 Es(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)?Ia(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">${Ia(t)}</div>${s}`:Ia(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 Ea(){for(let e of ja)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}ja.length=0,Tu()}function Vn(){Ea()}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
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 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=`
64
+ </div>`),He(t))}function Wn(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)}`:"",c=s?` \xB7 \u03A3${kt(s)}`:"";gr(`\u2191${kt(t)} \u2193${kt(n)}${a}${o}${r}${c}${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(ys(t))))}function Yn(){let e=i("messages"),t=i("permission-requests");e&&(e.innerHTML="",delete e.dataset.historyPainting),t&&(t.innerHTML=""),l.shellBubble=null,Ye=null,Xe=Ue=null,Pt=dt=null,mr.clear(),Ta.clear()}function Cu(e,t=l.sessionId){return`${t||""}
65
+ ${String(e||"")}`}function vl(e,t=l.sessionId){let n=Cu(e,t);!e||Ta.has(n)||(Ta.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||l.sessionId)!==l.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||l.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")}),Ta.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:l.sessionId,agent:l.agent||$.peek()||"claude",machineId:l.machineId||null});let a=!["gemini","cursor"].includes(l.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
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">
@@ -75,13 +75,13 @@ ${String(e||"")}`}function vl(e,t=c.sessionId){let n=Cu(e,t);!e||Ia.has(n)||(Ia.
75
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 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
- <div class="msg-row assistant px-2" data-ts="${p(l)}">
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),c=Aa(a);n.insertAdjacentHTML("beforeend",`
79
+ <div class="msg-row assistant px-2" data-ts="${p(c)}">
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
- ${u?`<div class="msg-ts" title="${p(l)}">${p(u)}</div>`:""}
84
+ ${u?`<div class="msg-ts" title="${p(c)}">${p(u)}</div>`:""}
85
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
87
  <div class="w-full max-w-[96%]">${rl(e)}</div>
@@ -102,7 +102,7 @@ ${String(e||"")}`}function vl(e,t=c.sessionId){let n=Cu(e,t);!e||Ia.has(n)||(Ia.
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)}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`
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 Ia(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 cn,ks,Fn,ut,$t,Sa,sl,cr,al,dr,ur,mr,uu,Ta,pr,Fe,ol,dn,ul,Xe,Ue,Pt,dt,yu,Su,Lu,ja,Ye,il,Na=W(()=>{K();tr();G();ce();bs();rr();ka();Hn();nn();sn();lr();Nt();Nt();cn=null;ks=0,Fn=null,ut=1e3,$t=0,Sa=null,sl=!1,cr=!1,al=null,dr=!1,ur="hubStreamCursors",mr=new Map,uu=0,Ta=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,dn=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=>{l.sessionId&&Ts()})}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!==l.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 Ts(){if(!l.sessionId)return;let e=new URLSearchParams;l.machineId&&e.set("machine",l.machineId),l.agent&&e.set("agent",l.agent);let t=e.size?`?${e}`:"";$r(`/session/${encodeURIComponent(l.sessionId)}/${encodeURIComponent(X.peek())}${t}`)}function El(){if(!l.sessionId)return null;let e=new URL(location.href),t=new URLSearchParams;l.machineId&&t.set("machine",l.machineId),l.agent&&t.set("agent",l.agent);let n=t.size?`?${t}`:"";return e.hash=`/session/${encodeURIComponent(l.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 Cs(e){try{await ft.set("workspaces",e,{ttl:3600*1e3})}catch{}}async function Cl(e){try{return Ms(await ft.get(`transcript:${e}`))}catch{return null}}function Ml(e,t){let n=Ms(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 Ms(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,As=W(()=>{K();ft=Ii("claude-ui"),Ru=300*1e3;Sr=Promise.resolve()});var jr={};ds(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"),mn({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(l.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,7 +124,7 @@ ${String(e||"")}`}function vl(e,t=c.sessionId){let n=Cu(e,t);!e||Ia.has(n)||(Ia.
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 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=`
127
+ </section>`}async function mn({keepList:e=!1}={}){let t=document.getElementById("notes-list");if(t){(!e||!fn)&&(t.innerHTML='<li class="notes-empty">\u52A0\u8F7D\u4E2D\u2026</li>');try{fn=(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=fn?.length?`${fn.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),!fn||fn.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 fn){let a=document.createElement("li");a.className="notes-item",a.dataset.id=s.id,Ze===s.id?a.innerHTML=`
128
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>
@@ -137,7 +137,7 @@ ${String(e||"")}`}function vl(e,t=c.sessionId){let n=Cu(e,t);!e||Ia.has(n)||(Ia.
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 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(`
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 mn({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 mn({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 mn({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 fn,Ze,Nl,Lt,Ds=W(()=>{ce();G();fn=null,Ze=null,Nl=!1,Lt=!1;typeof window<"u"&&(window.addEventListener("hub:note-added",()=>{document.getElementById("notes-page")?.hidden||mn()}),window.addEventListener("hub:note-updated",()=>{document.getElementById("notes-page")?.hidden||mn()}),window.addEventListener("hub:note-removed",()=>{document.getElementById("notes-page")?.hidden||mn()}))});function es(e){return Ve(e,{fallback:t=>p(t).replace(/\n/g,"<br>")})}function ts(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 c=await a.json().catch(()=>({}));throw new Error(c.error||`HTTP ${a.status}`)}let o=a.body.getReader(),r=new TextDecoder,d="",u="message";for(;;){let{done:c,value:f}=await o.read();if(c)break;d+=r.decode(f,{stream:!0});let m=d.split(`
141
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>
@@ -318,37 +318,37 @@ ${String(e||"")}`}function vl(e,t=c.sessionId){let n=Cu(e,t);!e||Ia.has(n)||(Ia.
318
318
  </div>
319
319
  </div>
320
320
  </div>
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||"")}">
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 c=e===u;d.classList.toggle("hidden",!c),d.classList.toggle("flex",c)}let r=(d,u)=>{let c=i(d);c&&(c.classList.toggle("border-primary/40",u),c.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"&&vn(),e==="notes"&&gn()}function Ns(){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)}):Ns()}e==="history"&&Et().then(()=>vn()),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">${es(t)}</div>`,ts(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 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=`
325
+ </details>`),s.appendChild(a),s.scrollTop=s.scrollHeight,a}function Ul(e,t){let n=e?.querySelector(".ma-bubble");n&&(n.innerHTML=es(t),ts(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 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(`
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 c=await s.json().catch(()=>({}));throw new Error(c.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 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)=>`
334
+ `);let u="";try{u=URL.createObjectURL(e)}catch{}return hn.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(!hn.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=hn.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=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,`
339
+ </div>`).join(""),e.querySelectorAll("[data-rm-img]").forEach(t=>{t.addEventListener("click",()=>{let n=parseInt(t.dataset.rmImg,10),s=hn[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"))),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
341
+ `),a.dispatchEvent(new Event("input"))),hn.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=l.sessionId?`${l.agent||$.peek()||"claude"}:${l.sessionId.slice(0,8)}`:"";return{project:e?.path||"",sessionId:l.sessionId||"",agent:l.agent||$.peek()||"claude",summary:[e?.name?`\u9879\u76EE ${e.name}`:"",t?`\u4F1A\u8BDD ${t}`:""].filter(Boolean).join(" \xB7 ")}}function _s(){bn=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=!!l.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){bn=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&&l.sessionId&&n.push(`\u5173\u8054\u4F1A\u8BDD\uFF1A${l.agent||$.peek()||"claude"} / ${l.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 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`
344
+ `);Te("chat"),i("ma-input").value=s,i("ma-input").dispatchEvent(new Event("input")),i("ma-input").focus()}async function Zn(){let e=(Kl||"").trim();return Ga=(await x("GET",`/api/ai/notes?limit=80${e?`&q=${encodeURIComponent(e)}`:""}`)).notes||[],Ga}function gn(){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===bn,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
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}`);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">
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),gn()}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:bn||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 Zn(),gn()}async function ip(){if(!bn){_s();return}confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u4E8B\uFF1F\u4E0D\u53EF\u6062\u590D\u3002")&&(await x("DELETE",`/api/ai/notes/${bn}`),_s(),await Zn(),gn())}function vn(){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
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)}">
@@ -363,49 +363,49 @@ ${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 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=`
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(),vn()}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"&&vn()}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"),Ns(),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"),Ns(),Rt==="history"&&vn(),n}catch(n){throw t.silent||ee("error",n.message),n}}async function Fa(){if(Xn)return;let e=i("ma-input"),t=(e?.value||"").trim();if(!t)return;Xn=!0,i("ma-send").disabled=!0,ee("user",t),e.value="",e.style.height="";for(let o of hn)if(o.previewUrl)try{URL.revokeObjectURL(o.previewUrl)}catch{}hn=[],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),Ns()},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),Ns(),Et()},error:o=>{ee("error",o.message||"error")}})}catch(o){ee("error",o.message)}finally{Xn=!1,i("ma-send").disabled=!1}}async function dp(){if(Xn)return;Xn=!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=es(n),ts(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=es(a.content),ts(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{Xn=!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">${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=>`
369
+ <div class="md ma-report-md">${es(n.markdown)}</div>`,ts(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">${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`
376
+ <div class="md ma-report-md">${es(a.markdown)}</div>`,ts(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)),Ps(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="",Ps(a)}catch(t){e.textContent=t.message}}function Ps(e){if(Ua&&(clearInterval(Ua),Ua=null),!e?.auto_report)return;let t=e.auto_report_hour??18;Ua=setInterval(async()=>{if(!l.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 Zn(),bn||_s(),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(),vn()}),i("ma-history-new")?.addEventListener("click",()=>{It(null),Te("chat")}),i("ma-history-search")?.addEventListener("input",e=>{Gl=e.target.value||"",vn()}),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 Zn(),gn()}),i("ma-notes-new")?.addEventListener("click",()=>{_s(),gn(),i("ma-note-title")?.focus()}),i("ma-notes-search")?.addEventListener("input",async e=>{Kl=e.target.value||"",await Zn(),gn()}),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)});Ps(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)});Ps(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}),_s())}function Hs(){l.token&&(M.peek()&&!ms()||(Et(),Zn().catch(()=>{}),x("GET","/api/ai/config").then(Ps).catch(()=>{})))}var Ka,Rt,Xn,we,qe,hn,Ol,Ua,Dr,Wa,Gl,Ga,Kl,bn,zl,Bt,qs=W(()=>{K();ce();G();Hn();sn();nn();Ka=!1,Rt="chat",Xn=!1,we=null,qe=null,hn=[],Ol=0,Ua=null,Dr=localStorage.getItem("ai_last_auto_report")||"",Wa=[],Gl="",Ga=[],Kl="",bn=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 yn(){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 c=a-1;c>=0;c--)n.push({date:new Date(e,t-1,d-c),isCurrentMonth:!1});for(let c=1;c<=r;c++)n.push({date:new Date(e,t,c),isCurrentMonth:!0});let u=7-n.length%7;if(u<7)for(let c=1;c<=u;c++)n.push({date:new Date(e,t+1,c),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 wn(e){let t=i("calendar-grid");if(!t)return;e=qr(e??yn());let n=i("calendar-month-year");if(n){let f=new Date(Ja,xn,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 c=fp(Ja,xn);Rs||(Rs=sc(new Date)),t.innerHTML=c.map(f=>{let m=f.date,g=sc(m),y=ac(m,e).length,A=m.toDateString()===new Date().toDateString(),ae=g===Rs,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
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(""),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
- <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":""}"
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]=Rs.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),c=i("stats-selected-tokens");if(c&&(c.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
+ <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 ${l.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">${Rn(f.agent)}</div>
389
+ <div class="flex-shrink-0">${Bn(f.agent)}</div>
390
390
  <div class="flex-1 min-w-0">
391
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>
392
+ <div class="text-[10px] text-base-content/40 truncate mt-0.5">${p(f.projectName||On(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 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
- <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":""}"
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=Rn(n.updatedAt);return`
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 ${l.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">${Rn(n.agent)}</div>
402
+ <div class="flex-shrink-0">${Bn(n.agent)}</div>
403
403
  <div class="flex-1 min-w-0">
404
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>
405
+ <div class="text-[10px] text-base-content/40 truncate mt-1">${p(n.projectName||On(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 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`
408
+ </div>`}).join("")}function kn(){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 c=Math.min(320,window.innerWidth-16),f=u.left;f+c>window.innerWidth-8&&(f=window.innerWidth-c-8),f<8&&(f=8),e.style.left=`${Math.round(f)}px`,e.style.right="auto",e.style.width=`${c}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():kn())}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=Rn(a.updatedAt),r=l.sessionId===a.sessionId&&(!a.machineId||!l.machineId||a.machineId===l.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
411
  <button type="button" class="flex min-w-0 flex-1 items-start gap-2 text-left" aria-label="\u6253\u5F00 ${p(vt(a))}"
@@ -414,10 +414,10 @@ ${t}`:"",n.length?n.join(`
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">${Rn(a.agent)}</span>
417
+ <span class="flex-shrink-0 mt-0.5">${Bn(a.agent)}</span>
418
418
  <span class="flex-1 min-w-0">
419
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>
420
+ <span class="block text-[10px] text-base-content/40 truncate mt-0.5">${p(a.projectName||On(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>
@@ -430,8 +430,8 @@ ${t}`:"",n.length?n.join(`
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 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
433
+ </div>`}).join("")}function fc(e){Rs=e}function Fr(e){xn+=e,xn<0?(xn=11,Ja--):xn>11&&(xn=0,Ja++)}var Ja,xn,Rs,rc,ic,Wr=W(()=>{K();G();Nt();Ja=new Date().getFullYear(),xn=new Date().getMonth(),Rs=null;rc=15,ic="recentSessionsV1"});var so={};ds(so,{loadAgentsMeta:()=>ss,loadAllSessions:()=>We,loadMemoryTab:()=>no,loadWorkspaces:()=>ns,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:()=>Bs});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 c=T.peek()?.[J(u.agent,u.sessionId,u.machineId)]?.branch,f=bp(c,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,c)=>(c.updatedAt||0)-(u.updatedAt||0);a.sort(o);for(let u of s.values())u.sort(o);let r=[],d=(u,c,f=new Set)=>{let m=J(u.agent,u.sessionId,u.machineId);if(!f.has(m)){f.add(m),r.push(c?{...u,_branchDepth:c}:u);for(let g of s.get(m)||[])d(g,c+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 c=yp({hubIndex:t,offset:u*Va}),f=await x("GET",c,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 ns({waitFresh:e=!0}={}){let t=await Tl();t&&(fe.value=t);let n=async()=>{let s=await x("GET","/api/workspaces");fe.value=s,Cs(s)};if(e||!t)try{await n()}catch{}else n().catch(()=>{})}function zr(e,{showProject:t=!1}={}){let n=l.sessionId===e.sessionId&&(l.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()),c=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||On(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>`:"",c?`<span class="session-branch-badge" title="Forked from ${p(c.parentAgent||e.agent)}:${p(c.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=c?`<div class="session-branch-line" title="Forked from ${p(c.parentAgent||e.agent)} \xB7 ${p(c.parentSessionId)}">\u21B3 ${p(c.parentAgent||e.agent)} \xB7 ${p(c.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
- ${Rn(e.agent)}
450
+ ${Bn(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)}"
@@ -470,28 +470,28 @@ ${t}`:"",n.length?n.join(`
470
470
  ${O}
471
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">${qn(e.updatedAt)}</span>
473
+ <span class="text-[9px] text-base-content/30 flex-shrink-0 mt-0.5">${Rn(e.updatedAt)}</span>
474
474
  </div>
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">
475
+ </div>`}async function ss(){try{let e=await x("GET","/api/agents");return Qt.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=Xt(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&&la(t).includes(n)&&Jo(t,n),Yt(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=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=`
478
+ </div>`;let t=jn.value,n=Dn.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>`:"",c=`
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">${qn(o.updatedAt)}</span>
485
+ <span class="text-[9px] text-base-content/30 flex-shrink-0">${Rn(o.updatedAt)}</span>
486
486
  </div>
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">
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 c+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
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=`
493
+ `).join("")}function Jr(){let e=gt.value,t=Array.isArray(_t.value)?_t.value:[],n=Array.isArray(Zt.value)?Zt.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 Bs(){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!==ia.peek()&&(e.value=ia.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=Zt.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(!l.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=l.agent||$.peek()||"claude",n=new URLSearchParams({agent:t}),a=(await x("GET",`/api/sessions/${l.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||!l.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||l.agent||$.peek()||"claude",file:e}),a=await x("GET",`/api/sessions/${l.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();As();Nt();sn();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||"",as(),t.style.display="flex"}catch(n){console.error("Error fetching project notes:",n),t.style.display="none"}}function as(){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">
@@ -519,14 +519,14 @@ ${t}`:"",n.length?n.join(`
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 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=`
522
+ `,i("project-goal-input")?.focus())}async function Os(){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=l.sessionId,n=l.agent||$.peek()||"claude";if(!t){e.style.display="none",e.innerHTML="";return}if(e.querySelector(".session-rename-input"))return;let s=_n(n,t),a=(s.notes||"").trim(),o=!!s.favorite,r=!!s.hidden,d=s.branch?.parentSessionId?s.branch:null,c=(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)}"
526
526
  title="${o?"Unfavorite":"Favorite"}">${o?"\u2605":"\u2606"}</button>
527
527
  <span id="session-title-display"
528
528
  class="session-title-inline max-w-[40%] truncate font-semibold text-base-content/85"
529
- title="${p(l)}">${p(l)}</span>
529
+ title="${p(c)}">${p(c)}</span>
530
530
  <button type="button" class="session-rename-btn flex-shrink-0 opacity-70 hover:opacity-100"
531
531
  data-rename-bar="1" title="Rename session">\u270E</button>
532
532
  <div class="session-title-actions flex items-center gap-0.5 flex-shrink-0">
@@ -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 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=`
548
+ `}function Lc(){let e=i("session-notes-bar");if(!e||!l.sessionId)return;let t=l.agent||$.peek()||"claude",n=_n(t,l.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 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"
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||l.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}`)}l.sessionId===e&&tt()}async function Tc(e,t,{machineId:n}={}){if(!e)return!1;let s=n||l.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 c={...T.peek()};delete c[a],T.value=c}else T.value={...T.peek(),[a]:u}}catch(d){return T.value={...T.peek(),[a]:o},alert(`Hide failed: ${d.message}`),!1}return l.sessionId===e&&tt(),!0}async function Vr(e,t,n,{machineId:s}={}){let a=s||l.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||l.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}),c=io(r,{favorite:u.favorite,notes:u.notes,title:u.title!==void 0?u.title:d,hidden:u.hidden});if(Ec(c)){let f={...T.peek()};delete f[o],T.value=f}else T.value={...T.peek(),[o]:c}}catch(u){return T.value={...T.peek(),[o]:r},alert(`Rename failed: ${u.message}`),!1}return l.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=(_n(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 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`
561
+ autocomplete="off" spellcheck="false" />`;let c=a.querySelector(".session-rename-input");if(!c)return;let f=!1,m=async g=>{if(f)return;f=!0;let w=g?c.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()),l.sessionId===e&&tt(),T.value={...T.peek()}};c.addEventListener("keydown",g=>{g.stopPropagation(),g.key==="Enter"?(g.preventDefault(),m(!0)):g.key==="Escape"&&(g.preventDefault(),m(!1))}),c.addEventListener("click",g=>g.stopPropagation()),c.addEventListener("mousedown",g=>g.stopPropagation()),c.addEventListener("session-rename-cancel",()=>m(!1)),c.addEventListener("blur",()=>{setTimeout(()=>m(!0),0)}),requestAnimationFrame(()=>{c.focus(),c.select()})}var ao,oo,Us=W(()=>{K();G();ce();ao="",oo=""});var Ac={};ds(Ac,{closeMachineMenu:()=>Ln,enterMachine:()=>Zr,hideMachinePicker:()=>co,refreshMachinesList:()=>$n,renderMachineMenuList:()=>Fs,renderMachinePickerList:()=>lo,showMachinePicker:()=>Sn,startMachinePolling:()=>Xr,syncTopbarMachine:()=>Ot});async function $n(){try{let e=await x("GET","/api/machines");le.value=Array.isArray(e)?e:[]}catch{try{let e=await pa();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 $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`
570
+ </button>`}).join("")}function Sn(){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 Ln(){i("machine-menu")?.classList.add("hidden")}function Fs(){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=_.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`
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)),Fs()}function Xr(){Cc||(Cc=setInterval(async()=>{if(!M.peek()||!l.token)return;await $n(),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()||!l.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(),Ln(),Ot(),s||t){try{l.ws?.close()}catch{}l.ws=null,l.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(()=>(os(),ei));o()}}let a=i("topbar-project");a&&!E.peek()&&(a.textContent=`Machine \xB7 ${e}`),Hs(),await Promise.all([We(),ns(),Os(),ss().catch(()=>{})]),it.value=!0}var Cc,Mc,Ws=W(()=>{K();G();ce();Tt();Us();qs();Pn();Cc=null,Mc=null});var ei={};ds(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){Gs=null,va(),_a(!1),Kn(),Jn(),Vn(),Qn();let t=e?.path||"";xe(()=>{E.value=e,ke.value=t,t&&(ie.value=t,Se.value=t,Y.value="",re.value=null)}),l.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()||l.machineId),i("welcome").classList.add("hidden");let a=i("project-view");a.classList.remove("hidden"),a.style.display="flex",Yn(),zn({sessionId:null}),Ht(),Ct("chat")}function fo(){Gs=null,va(),_a(!1),Kn(),Jn(),Vn(),Qn(),E.value=null,ke.value=null,ie.value="",Se.value="",Y.value="",re.value=null,l.sessionId=null,zn({sessionId:null}),po(null),document.documentElement.classList.remove("boot-restore");let e=i("topbar-project");e&&(e.textContent="Select a session"),Promise.resolve().then(()=>(Ds(),jr)).then(({closeNotes:s})=>s({restore:!1})).catch(()=>{});let t=i("welcome");t&&(t.classList.remove("hidden"),t.style.display="",wn(yn()));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)),c=tn(),f=c?.sessionId===e?c: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(()=>(Ds(),jr)).then(({closeNotes:L})=>L({restore:!1})).catch(()=>{}),Kn(),Jn(),Vn(),Qn(),g&&g!==l.machineId){Le(g);try{l.ws?.close()}catch{}l.ws=null,Promise.resolve().then(()=>(Ws(),Ac)).then(({syncTopbarMachine:L})=>L()).catch(()=>{}),Promise.resolve().then(()=>(Tt(),so)).then(({loadAllSessions:L})=>L()).catch(()=>{})}l.sessionId=e,_a(!1),wt({sessionId:e,agent:m,machineId:g}).catch(()=>{}),l.configDir=y,l.agent=m,Ne(m),et(),zn({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=>{l.sessionId!==e||!L?.path||L.path===A||(A=L.path,jc(A,g,e),Vo({sessionId:e,cwd:A}))}).catch(()=>{}),Yn(),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=`${l.token||""}:${g||""}:${m}:${e}`,pe=0,q=0,Q=null,he=(L,ge,be={},oe=!1)=>{if(l.sessionId!==e||l.agent!==m||(l.machineId||null)!==g)return;let Kt=++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(Kt!==pe||l.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(l.sessionId!==e||Kt!==pe)return;let R=Math.min(j+F,L.length);for(;j<R;j++){let D=L[j],de=B(D.ts??D.timestamp),zt=D.type||(D.role?"text":null);if(zt==="text"||D.role&&D.content!=null&&!D.name){(D.role==="assistant"||D.role==="user")&&pt();let Tn=typeof D.content=="string"?D.content:Array.isArray(D.content)?D.content.map(Sd=>Sd?.text||"").filter(Boolean).join(`
585
+ `):String(D.content??"");Tn&&qt(D.role==="user"?"user":"assistant",D.role==="user"?"You":ae,Tn,{ts:de,historyIndex:(be.oldestIndex||0)+j})}else zt==="tool_use"||D.name?xr({name:D.name||"tool",input:D.input??D.arguments??{}},{ts:de}):(zt==="token_usage"||D.usage)&&(pt(),Wn(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||l.sessionId!==e)){if(L&&be&&be.msgs?.length){let oe=Ms(be);he(oe.msgs,oe.context,oe.meta)}be?.msgs?.length||C(`Loading ${ae} history\u2026`);try{let oe=g||_.peek()||l.machineId||null;if(M.peek()&&!oe)throw new Error("\u672A\u9009\u62E9\u673A\u5668\uFF0C\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2");oe&&l.machineId!==oe&&Le(oe);let Kt=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 Kt(m);if(ge!==q||l.sessionId!==e)return;let k=Array.isArray(v)?v:v?.messages||[];!k.length&&m&&(v=await Kt(null),k=Array.isArray(v)?v:v?.messages||[]);let S=Array.isArray(v)?null:v?.context||null;if(ge!==q||l.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,Ms(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(l.sessionId!==e||ge!==q)return;Ut.delete(O),C(`${ae} \xB7 ${e.slice(0,8)}\u2026 (history unavailable: ${oe.message})`)}}};Gs={sessionId:e,agent:m,refresh:()=>Ae({preferCache:!1}).catch(()=>{})},d?Ae().catch(()=>{}):(await new Promise(L=>requestAnimationFrame(L)),Ae().catch(()=>{})),Ts(),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 Gs,uo,Ut,os=W(()=>{K();G();ce();As();ma();Na();bs();Pa();Tt();Us();Wr();Gs=null,uo=null;document.addEventListener("external-session-updated",({detail:e})=>{let t=Gs;!t||!e||e.sessionId!==t.sessionId||e.agent&&t.agent&&e.agent!==t.agent||(uo&&clearTimeout(uo),uo=setTimeout(()=>{uo=null,Gs?.refresh()},140))});Ut=new Map});G();G();K();var Xf=ra({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 fa=null;async function Bi(){if(!fa)return!1;fa.prompt();let e=await fa.userChoice.catch(()=>null);return fa=null,document.getElementById("btn-pwa-install")?.classList.add("hidden"),e?.outcome==="accepted"}Pn();ma();Na();Pa();K();ce();G();As();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"],pn="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>
@@ -682,21 +682,21 @@ ${t}`:"",n.length?n.join(`
682
682
  </section>
683
683
  </div>
684
684
  </div>
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">
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",()=>{js()}),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){pn=e||"claude",document.querySelectorAll("[data-set-sec]").forEach(t=>t.classList.toggle("is-on",t.dataset.setSec===pn)),document.querySelectorAll("[data-set-panel]").forEach(t=>{t.hidden=t.dataset.setPanel!==pn}),pn==="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 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)=>`
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||pn||"claude"),Tr(),Cr(),js(),_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",()=>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
- <div id="auth-screen" class="${c.token?"hidden":""} flex items-center justify-center h-full p-4" ${c.token?'style="display:none"':""}>
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,Cs(a),i("ws-new-name").value="",i("ws-new-dir").value="",Tr(),Cr(s.name),await js(),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,Cs(t),Tr(),Cr(""),await js()}catch(t){let n=i("ws-error");n&&(n.textContent=t.message,n.classList.remove("hidden"))}}async function js(){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 js()}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||pn!=="users"),!s){pn==="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")}}Ds();qs();ka();G();var tc=()=>`
699
+ <div id="auth-screen" class="${l.token?"hidden":""} flex items-center justify-center h-full p-4" ${l.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">
702
702
  <h1 class="text-xl font-bold">\u{1F916} Agent UI</h1>
@@ -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>`,nc=(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=l.token?"":"hidden",s=l.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>`};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">
1123
+ </dialog>`};Wr();Tt();os();K();G();ce();bs();As();ma();Tt();Us();qs();os();Ws();Pn();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 pa():n?(M.value=!0,n.machines&&(le.value=n.machines)):M.value=!1;let s=e.deepLink||null,a=tn();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,Hs());let u=$n().then(m=>(Ot(),d&&!m.some(w=>w.id===d&&w.online!==!1)&&m.length&&(m.some(y=>y.id===d)||(Le(null),Sn())),m));Xr(),Ot();let c=Promise.all([We({waitFresh:!1}),ns({waitFresh:!1}),Os().catch(()=>{}),ss().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(()=>{}),c.catch(()=>{});return}if(!d){if(await u,!(le.peek()||[]).length){Sn(),c.catch(()=>{});return}Sn(),c.catch(()=>{});return}await c;let f=i("topbar-project");f&&f.textContent==="Select a session"&&(f.textContent=`Machine \xB7 ${d}`);return}Hs();let r=Promise.all([We({waitFresh:!1}),ns({waitFresh:!1}),Os().catch(()=>{}),ss().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}Us();Ws();K();G();ce();Na();Tt();os();Ws();Pn();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 Ks(){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&&Ks()}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(""),l.configDir&&(t.value=l.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"),Sn();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;Kn(),Jn(),Vn(),Qn(),l.sessionId=null,l.configDir=n||null,l.agent=t,Ne(t),se(Oe(t)||N.peek()),et(),xe(()=>{E.value={id:o,name:o,path:a.path,machineId:_.peek()||l.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",Yn(),zn({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 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
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});l.token=s.token,localStorage.setItem("token",s.token),mo()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}function ci(){return l.token?/^#\/session\//.test(location.hash||""):!1}function Hc(e={}){if(ni(localStorage.getItem("theme")||"dark"),!document.getElementById("xterm-css")){let c=document.createElement("link");c.id="xterm-css",c.rel="stylesheet",c.href="/xterm.min.css",document.head.appendChild(c)}if(!document.getElementById("xterm-js")){let c=document.createElement("script");c.id="xterm-js",c.src="/xterm.min.js",document.head.appendChild(c)}if(!document.getElementById("xterm-fit-js")){let c=document.createElement("script");c.id="xterm-fit-js",c.src="/addon-fit.min.js",document.head.appendChild(c)}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 c=i("session-list");c&&(c.innerHTML='<div class="px-3 py-3 text-[10px] text-base-content/35">Loading sessions\u2026</div>')}je(()=>{let c=fe.value,f=i("ws-tabs");if(!f)return;if(c.length<=1){f.innerHTML="";return}let m=ke.peek();f.innerHTML=[{id:null,name:"All"},...c].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(()=>{_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",`
1147
+ </button>`).join("")}),je(()=>{_t.value,Zt.value,gt.value,rt.value,T.value;let c=i("session-list");if(!c||c.querySelector(".session-rename-input"))return;let f=Jr();if(c._lastHtml===f){Bs();return}let m=c.scrollTop;c.innerHTML=f,c._lastHtml=f,c.scrollTop=m,Bs()}),je(()=>{bt.value,Bs()}),je(()=>{ne.value,ye.value,_.value,M.value;let c=i("welcome");c&&(document.documentElement.classList.contains("boot-restore")||document.documentElement.classList.contains("boot-pending")||c.classList.contains("hidden")||c.style.display==="none"||wn())}),De(ke,c=>{let f=i("session-filter-badge");f&&(f.style.display=c?"inline":"none",f.title=c||"")}),je(()=>{let c=E.value;if(c&&c.path)$c(c.path);else{let f=i("project-notes-bar");f&&(f.style.display="none")}}),De(X,c=>{document.querySelectorAll("[data-tab]").forEach(m=>{let g=m.dataset.tab===c;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===c;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"}),c==="memory"&&no(),c==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))}),Ee()}),Pc(),Nc(),nl({openSession:nt});let s=c=>{i("app")?.classList.toggle("chat-chrome-collapsed",c),i("btn-expand-chat-chrome")?.classList.toggle("hidden",!c),localStorage.setItem("chatChromeCollapsed",c?"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:c,tab:f,machineId:m,agent:g}})=>{let w=ne.peek().find(A=>A.sessionId===c),y=tn();await nt(c,w?.cwd||(y?.sessionId===c?y.cwd:null)||null,w?.configDir||(y?.sessionId===c?y.configDir:null)||null,g||w?.agent||(y?.sessionId===c?y.agent:null)||null,m||w?.machineId||(y?.sessionId===c?y.machineId:null)||null,{tab:f||"chat"})}),b.on("click","#btn-home",fo),b.on("click","#btn-share-session, #btn-share-session-current",async(c,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",c=>{c.preventDefault(),ii()}),b.on("keydown","#auth-username, #auth-password",c=>{c.key==="Enter"&&ii()}),b.on("click","#hamburger",()=>i("sidebar").classList.contains("open")?Ks():Dc()),b.on("click","#sidebar-overlay",Ks),document.addEventListener("keydown",c=>{c.key==="Escape"&&window.innerWidth<=640&&i("sidebar")?.classList.contains("open")&&(c.preventDefault(),Ks())}),b.on("input","#session-search",(c,f)=>{$e.value=f.value,to(f.value)}),b.on("click","#sidebar-filter-toggle",()=>{let c=i("sidebar-filter-menu");if(!c)return;let f=c.classList.toggle("hidden");i("sidebar-filter-toggle")?.setAttribute("aria-expanded",String(!f))}),b.on("change","[data-agent-option]",(c,f)=>{let m=new Set(Vt.peek());f.checked?m.add(f.dataset.agentOption):m.delete(f.dataset.agentOption);let g=[...m];Vt.value=g,localStorage.setItem("agentFilters",JSON.stringify(g)),ye.value=g.length===1?g[0]:"all"}),b.on("change","#filter-favorites",(c,f)=>{ze.value=f.checked,localStorage.setItem("favoritesOnly",f.checked?"1":"0")}),b.on("change","#filter-hidden",(c,f)=>{Je.value=f.checked,localStorage.setItem("showHiddenOnly",f.checked?"1":"0")}),b.on("click","#filter-clear",()=>{Vt.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(c=>{c.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]",(c,f)=>{ke.value=f.dataset.wsTab||null}),b.on("click","#sidebar-refresh",()=>{We(),$e.peek().trim()&&eo($e.peek())}),b.on("click","[data-view]",(c,f)=>{gt.value=f.dataset.view,localStorage.setItem("sidebarView",f.dataset.view)}),b.on("click","[data-agent-filter]",(c,f)=>{ye.value=f.dataset.agentFilter,localStorage.setItem("agentFilter",f.dataset.agentFilter),$e.peek().trim()&&to($e.peek())}),b.on("dblclick","[data-project-cwd]",(c,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]",(c,f)=>{let m=f.dataset.sidebarAction;m==="new"&&ai(),m==="theme"&&si(),m==="settings"&&Ba(),m==="logout"&&(l.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload())}),b.on("click","#btn-cal-prev",()=>{Fr(-1),wn(yn())}),b.on("click","#btn-cal-next",()=>{Fr(1),wn(yn())}),b.on("click","[data-cal-date]",(c,f)=>{fc(f.dataset.calDate),wn(yn())}),b.on("click","[data-session-id]",(c,f)=>{c.target.closest("[data-fav-toggle]")||c.target.closest("[data-hide-toggle]")||c.target.closest("[data-rename-session]")||c.target.closest(".session-rename-input")||c.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]",(c,f)=>{c.preventDefault(),c.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]",(c,f)=>{if(c.preventDefault(),c.stopPropagation(),!l.sessionId)return;let m=document.getElementById("session-title-display")||f;Yr({sessionId:l.sessionId,agent:l.agent||$.peek()||"claude",machineId:l.machineId||null,mountEl:m})}),b.on("click","[data-folder]",(c,f)=>{let m=f.dataset.folder,w=f.querySelector("span")?.textContent.trim()==="\u25BE",y=new Set(jn.peek()),A=new Set(Dn.peek());w?(y.delete(m),A.add(m)):(y.add(m),A.delete(m)),xe(()=>{jn.value=y,Dn.value=A})}),b.on("click","#memory-refresh",no),b.on("click","[data-memory-file]",c=>Qr(c.dataset.memoryFile,c.dataset.memoryAgent)),b.on("click","[data-tab]",(c,f)=>Ct(f.dataset.tab));let o=async(c,f)=>{let m=i(c),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",c=>{c.key==="Enter"&&o("files-root-input",ie)}),b.on("keydown","#git-root-input",c=>{c.key==="Enter"&&o("git-root-input",Se)}),b.on("click","#btn-opts",()=>{i("chat-opts").classList.toggle("hidden"),Ee()}),b.on("change","#sel-agent",(c,f)=>{let m=$.peek(),g=f.value;m!==g&&(l.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(c,f)=>{let m=f.value;if(!m)return;let g=l.sessionId;if(!g){alert("No active session to convert."),f.value="";return}let w=l.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),Ts()):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",(c,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",(c,f)=>{te.value=f.value}),b.on("change","#sel-permission",(c,f)=>{ue.value=f.value}),b.on("change","#sel-density",(c,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",c=>{c.key==="Enter"&&ri()}),b.on("click","#send-btn",Is),b.on("click","#stop-btn",hl),b.on("click","#btn-logout",()=>{l.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload()}),b.on("click","[data-pick-machine]",async(c,f)=>{let m=f.dataset.pickMachine;if(!m||m===_.peek()){Ln();return}await Zr(m,{forceReload:!0}),ya()});let r=async()=>{let c=i("machine-picker-status");if(c&&(c.textContent="\u5237\u65B0\u4E2D\u2026"),await $n(),lo(),Fs(),Ot(),c){let f=(le.peek()||[]).filter(m=>m.online!==!1).length;c.textContent=`${f} online`}};b.on("click","#btn-refresh-machines",r),b.on("click","#btn-refresh-machines-menu",async c=>{c.stopPropagation(),await r()}),b.on("click","#btn-machine-menu",async c=>{c.stopPropagation(),kn(),ln();let f=i("machine-menu");f&&(f.classList.contains("hidden")?(await $n(),Fs(),f.classList.remove("hidden")):f.classList.add("hidden"))}),b.on("click","#btn-recent-sessions",c=>{c.preventDefault(),c.stopPropagation(),Ln(),ln(),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",c=>{c.preventDefault(),c.stopPropagation(),kn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",c=>{let f=i("machine-menu-wrap");f&&!f.contains(c.target)&&Ln();let m=i("recent-menu"),g=i("btn-recent-sessions"),w=c.target;if(m&&!m.classList.contains("hidden")){if(m.contains(w)||g?.contains(w))return;kn(),g?.setAttribute("aria-expanded","false")}}),b.on("click","#btn-notifications",c=>{c.preventDefault(),c.stopPropagation(),Ln(),kn(),tl()}),window.addEventListener("resize",()=>{i("recent-menu")&&!i("recent-menu").classList.contains("hidden")&&Or()}),b.on("click","#recent-menu [data-session-id]",()=>{kn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),b.on("click","[data-dismiss-recent-session]",(c,f)=>{c.preventDefault(),c.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",()=>{as()});let d=async()=>{let c=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:c,notes:f});kc(g.goal||"",g.notes||""),as()}catch(g){alert(`Error saving project notes: ${g.message}`)}};b.on("click","#btn-save-project-notes",d),b.on("keydown","#project-goal-input",c=>{c.key==="Enter"&&d(),c.key==="Escape"&&as()}),b.on("keydown","#project-notes-input",c=>{c.key==="Escape"&&as()}),b.on("click","[data-fav-toggle]",(c,f)=>{c.stopPropagation(),c.preventDefault();let m=f.dataset.favSessionMachine||l.machineId;m&&(l.machineId=m,localStorage.setItem("machineId",m)),Ic(f.dataset.favSessionId,f.dataset.favSessionAgent||"claude",{machineId:m||null})}),b.on("click","[data-hide-toggle]",(c,f)=>{c.stopPropagation(),c.preventDefault();let m=f.dataset.hideSessionMachine||l.machineId;m&&(l.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 c=i("session-notes-input")?.value?.trim()||"";if(!l.sessionId)return;let f=l.agent||$.peek()||"claude";await Vr(l.sessionId,f,c)&&tt()}),b.on("keydown","#session-notes-input",async c=>{if(c.key==="Escape"&&tt(),c.key==="Enter"){let f=c.target.value.trim();if(!l.sessionId)return;let m=l.agent||$.peek()||"claude";await Vr(l.sessionId,m,f)&&tt()}}),b.on("click","#btn-fav-filter",()=>{let c=!ze.peek();ze.value=c,localStorage.setItem("favoritesOnly",c?"1":"0"),i("btn-fav-filter")?.classList.toggle("active",c),c&&Je.peek()&&(Je.value=!1,localStorage.setItem("showHiddenOnly","0"),i("btn-hidden-filter")?.classList.remove("active"))}),b.on("click","#btn-hidden-filter",()=>{let c=!Je.peek();Je.value=c,localStorage.setItem("showHiddenOnly",c?"1":"0"),i("btn-hidden-filter")?.classList.toggle("active",c),c&&ze.peek()&&(ze.value=!1,localStorage.setItem("favoritesOnly","0"),i("btn-fav-filter")?.classList.remove("active"))}),et(),je(()=>{M.value,_.value,l.token&&ya()}),i("sel-permission").value=ue.peek(),yl();let u=i("sel-density");u&&(u.value=_e.peek()||"normal"),document.querySelectorAll("[data-agent-option]").forEach(c=>{c.checked=Vt.peek().includes(c.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(c=>{c.classList.toggle("active",c.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(c=>{let f=c.dataset.view===gt.peek();c.classList.toggle("bg-primary/15",f),c.classList.toggle("text-primary",f),c.classList.toggle("font-medium",f),c.classList.toggle("text-base-content/50",!f)})}K();tr();G();ce();bs();rr();ka();Hn();nn();sn();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 En=null;function Lp(e){return ys(e)}function Gc(e){return e?(En&&En.el===e||(En?.destroy?.(),En=$a(e),En.el=e),En):null}function Re(e,t){if(!e||e.dataset.historyPainting==="1")return;Gc(e).stick(!!t)}var Js=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",In=(()=>{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{In.length?sessionStorage.setItem(fi,JSON.stringify(In.slice(-30))):sessionStorage.removeItem(fi)}catch{}}function Ip(){let e=Zs(),t=In.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=l.sessionId,t=l.agent,n=l.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||l.sessionId,e.agent||l.agent,l.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 Zs({sessionId:e=l.sessionId,agent:t=l.agent,machineId:n=l.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function Mp(){qc||(qc=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(at=400,rs({probe:!0}),l.ws?.readyState===WebSocket.OPEN&&l.sessionId))try{l.ws.send(JSON.stringify({type:"subscribe",sessionId:l.sessionId,agent:l.agent}))}catch{}}),window.addEventListener("online",()=>{at=400,rs({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?rs({force:!0}):rs({probe:!0})}),window.addEventListener("focus",()=>rs({probe:!0})),navigator.connection?.addEventListener?.("change",()=>{at=400,rs({probe:!0})}))}function Vs(){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 rs(e={}){let t=l.ws?.readyState;if(e.force){at=400,$o({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&At&&Date.now()-At>45e3)try{l.ws.close()}catch{}else if(e.probe&&l.ws.readyState===WebSocket.OPEN)try{l.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",Vs(),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!==Js||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";xa(e)}function ko(){return(l.role||"editor")==="viewer"?"\u53EA\u8BFB\u8D26\u53F7\uFF0C\u65E0\u6CD5\u8F93\u5165":l.lock?.foreign?`\u4F1A\u8BDD\u7531 ${l.lock.holder&&l.lock.holder!=="viewer"?l.lock.holder:"\u5176\u4ED6\u7528\u6237"} \u5360\u7528\uFF08\u9501\uFF09`:"\u5F53\u524D\u65E0\u6CD5\u8F93\u5165"}function Wt(){let e=an();l.externalSessionReadOnly=!e;let t=i("chat-input"),n=i("send-btn"),s=i("btn-attach"),a=i("session-lock-banner");if(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":Ys(t.value||""):t.placeholder=ko()),n&&(n.disabled=!e),s&&(s.disabled=!e),a)if(!e)a.classList.remove("hidden"),a.textContent=ko();else{let o=l.nativeRunNotice?.sessionId===l.sessionId?l.nativeRunNotice.message:"";a.classList.toggle("hidden",!o),a.textContent=o}}function Dp(){at=400,jt&&(clearTimeout(jt),jt=null),xo=!1;let e=l.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{l.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=l.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);Rc!==t&&(ua(),Rc=t);let n=++Js;try{l.ws?.close()}catch{}me.value="connecting",Vs();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;l.token&&a.set("token",l.token),t&&a.set("machine",t),l.sessionId&&a.set("sessionId",l.sessionId),l.agent&&a.set("agent",l.agent);let o=Tp();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);l.ws=r,r.addEventListener("open",()=>{if(n===Js){if(at=1e3,At=Date.now(),me.value="open",Vs(),l.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:l.sessionId,agent:l.agent}))}catch{}da(),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!==Js)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"){if(u.sessionId&&u.sessionId!==l.sessionId)return;if(typeof u.running!="boolean"){l.nativeRunNotice={sessionId:l.sessionId,message:u.message||"\u7EC8\u7AEF\u4F1A\u8BDD\u672A\u786E\u8BA4\u7ED3\u675F"},Wt();return}l.nativeRunNotice=null,Wt(),u.running?P.value=!0:(P.peek()&&(P.value=!1),mi()),Dt();return}Vc(u)}}),r.addEventListener("close",()=>{n===Js&&(Qc(),vo=!0,me.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Vs(),Ap())}),r.addEventListener("error",()=>{})}function mi(){if(!In.length||P.peek())return;let e=Zs(),t=In.findIndex(a=>a.key===e);if(t<0)return;let[n]=In.splice(t,1);zc();let s=i("chat-input");s&&(s.value=n.text,Xs(s)),setTimeout(()=>{if(n.key!==Zs()||P.peek()){Kc.set(n.key,n.text);return}ea()},0)}function ho(){P.value=!1,Dt(),mi()}var _p=0;function Vc(e){if(!(e?.sessionId&&l.sessionId&&e.sessionId!==l.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();l.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){wa(e.notification);return}if(e.type==="grok-queue-status"){ef(e);return}if(e.type==="result"){Qs(),zs(),is();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};l.lastUsage=n,l.sessionId&&(l.lastUsageSessionId=l.sessionId),yo(n)}e.is_error||H("\u2713 Done"),ho();return}if(e.type==="complete"){Qs(),zs(),is(),!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"){Qs(),zs(),(e.code===423||/locked/i.test(String(e.message||"")))&&(l.lock={...l.lock||{},held:!1,foreign:!0,holder:e.lock?.holder||l.lock?.holder||"another user"},Wt()),ls("error","Error",Sp(e.message)),ho();return}if(e.type==="shell-start"){l.shellBubble=null;return}if(e.type==="shell-output"){l.shellBubble||(l.shellBubble=sf(e.stream==="stderr"?"shell-err":"shell")),af(l.shellBubble,e.data);return}if(e.type==="shell-exit"){l.shellBubble=null,H(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),ho();return}if(e.type==="assistant"){zs();for(let t of e.message?.content||[])t.type==="text"&&t.text?(is(),ls("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"){zs();return}if(e.type==="thought_stream_start"){Xc();return}if(e.type==="thought_delta"){Pp(e.data||"");return}if(e.type==="thought_stream_end"){Qs();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||(is(),Qs(),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 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",`
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 zs(){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>`),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:
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 Qs(){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()?(l.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(c=>c.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||Yt(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=Xt($.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(),l.sessionId=null,l.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 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(`
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=l.sessionId,s=[`Agent: ${Z[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(l.lastUsage&&(!n||l.lastUsageSessionId===n)){let a=l.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",c=r.windowTokens!=null?Ce(r.windowTokens):"\u2014",f=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";s.push(`Context window: ${u} / ${c} (${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),c=Math.round(r.sessionDurationSeconds%60);s.push(`Duration: ${u}m ${c}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&&!l.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 c=u.length-1;c>=0;c--)if(u[c].textContent==="Loading usage\u2026"){u[c].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):l.lastUsage&&yo(l.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 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]!==`
1171
+ (usage fetch failed: ${a.message})`)}}function ea(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(!an()){H(ko()),wt().then(()=>Wt()).catch(()=>{});return}if(l.sessionId&&!l.lock?.held&&!l.lock?.unmanaged){wt().then(s=>{if(!s?.ok&&!s?.skipped){Wt(),H(ko());return}ea()}).catch(()=>ea());return}if(P.peek()){if($.peek()==="grok"&&l.sessionId){let s="grok",a=te.peek()||Qe(s,N.peek())||"low",o=lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:l.sessionId,lockToken:l.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:l.sessionId,configDir:l.configDir,model:N.peek(),lockToken:l.lock?.token||void 0,effort:a,...ue.peek()&&{permissionMode:ue.peek()},...ue.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});nd(t),e.value="",Xs(e),Ys(""),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}In.push({key:Zs(),text:t}),zc(),e.value="",Xs(e),Ys(""),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(Zs()),Xs(e),Ys(""),di(),t.startsWith("/")&&qp(t))return;P.value=!0,Dt();let n=Date.now();if(Zc(t))ls("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{is(),ls("user","You",t,{ts:n,forceStick:!0});let s=$.peek()||"claude",a=te.peek()||Qe(s,N.peek())||(s==="grok"?"low":""),o=ue.peek();l.sessionId&&se(N.peek(),s,l.sessionId),lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:l.sessionId,lockToken:l.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:l.sessionId,configDir:l.configDir,model:N.peek(),lockToken:l.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 Ys(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 Xs(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 ls(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){ls("system","",e)}var Gt=[],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 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)=>`
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 Gt)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}Gt.length=0,gi()}function gi(){let e=i("chat-attach-bar");if(e){if(!Gt.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=Gt.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 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">
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 Gt.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 c=u.getAsFile();c&&o.push(c)}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 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=`
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)}`:"",c=s?` \xB7 \u03A3${Mt(s)}`:"";bi(`\u2191${Mt(t)} \u2193${Mt(n)}${a}${o}${r}${c}${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=""),l.shellBubble=null,mt=null,st=Ge=null,Ft=ht=null,Io.clear(),pi.clear()}function Zp(e,t=l.sessionId){return`${t||""}
1182
+ ${String(e||"")}`}function nd(e,t=l.sessionId){let n=Zp(e,t);!e||pi.has(n)||(pi.add(n),ls("user","You",e,{ts:Date.now(),forceStick:!0}),i("messages")?.lastElementChild?.classList.add("queued-user-msg"))}function ef(e){if((e.sessionId||l.sessionId)!==l.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||l.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:l.sessionId,agent:l.agent||$.peek()||"claude",machineId:l.machineId||null});let a=!["gemini","cursor"].includes(l.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 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">
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!==l.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(()=>(os(),ei))]);await r({waitFresh:!0}),await d(n.targetSessionId,E.peek()?.path||null,l.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>
@@ -1192,13 +1192,13 @@ ${String(e||"")}`}function nd(e,t=c.sessionId){let n=Zp(e,t);!e||pi.has(n)||(pi.
1192
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 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
- <div class="msg-row assistant px-2" data-ts="${p(l)}">
1195
+ <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function is(){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),c=Lo(a);n.insertAdjacentHTML("beforeend",`
1196
+ <div class="msg-row assistant px-2" data-ts="${p(c)}">
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
- ${u?`<div class="msg-ts" title="${p(l)}">${p(u)}</div>`:""}
1201
+ ${u?`<div class="msg-ts" title="${p(c)}">${p(u)}</div>`:""}
1202
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
1204
  <div class="w-full max-w-[96%]">${Uc(e)}</div>
@@ -1219,9 +1219,9 @@ ${String(e||"")}`}function nd(e,t=c.sessionId){let n=Zp(e,t);!e||pi.has(n)||(pi.
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)}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,`
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=>{Vs(),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),Wt(),s||i("send-btn")?.toggleAttribute("disabled",!an());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(),is()),Dt()}),De(_e,()=>Fc()),document.addEventListener("session-lock-changed",()=>Wt()),Wt(),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(),ea())}),b.on("submit","#chat-form",s=>{s.preventDefault(),ea()}),b.on("input","#chat-input",(s,a)=>{Xs(a),Ys(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>=Gt.length)return;let r=Gt[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"))),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`
1224
+ `),d.dispatchEvent(new Event("input"))),Gt.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:l.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();Hn();nn();sn();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 cs(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>
@@ -1235,7 +1235,7 @@ ${String(e||"")}`}function nd(e,t=c.sessionId){let n=Zp(e,t);!e||pi.has(n)||(pi.
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 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")+`
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 cs(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 cs(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>
@@ -1253,7 +1253,7 @@ ${String(e||"")}`}function nd(e,t=c.sessionId){let n=Zp(e,t);!e||pi.has(n)||(pi.
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 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(`
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),c=u.getViewport({scale:1}),f=Math.min(1.5,820/c.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,10 +1262,10 @@ ${String(e||"")}`}function nd(e,t=c.sessionId){let n=Zp(e,t);!e||pi.has(n)||(pi.
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 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=`
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 cs(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,c=`/api/projects/${a}/file?root=${encodeURIComponent(t)}&path=${encodeURIComponent(u)}`;try{let f=await fetch(c,{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 c=16*1024*1024;if(Number(u.headers.get("content-length"))>c)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>c)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"})}`,c=document.createElement("a");c.href=u,c.download=a,c.rel="noopener",c.target="_blank",document.body.appendChild(c),c.click(),c.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=cs(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=cs(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=cs(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
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>'}`}),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(`
1268
+ ${t?"":'<button id="btn-upload" class="btn btn-ghost btn-xs text-base-content/50 hover:text-base-content">\u2191 Upload</button>'}`}),An(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 c=Array.isArray(u)?u:Array.isArray(u?.files)?u.files:null;if(!c){r.innerHTML=`<div class="p-4 text-xs text-error">${p(u?.error||"Invalid directory listing")}</div>`;return}r.innerHTML=bf(c)}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
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">
@@ -1295,14 +1295,14 @@ ${String(e||"")}`}function nd(e,t=c.sessionId){let n=Zp(e,t);!e||pi.has(n)||(pi.
1295
1295
  </div>
1296
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 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
1298
+ `)}function ud(){An(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>`)}}),An(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>`})}Ds();K();G();var Me=null,z=null,Mo=null,sa=!1,Ao=null,hd=null,ta=0,na=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 l.machineId||_.peek()||null}function _o(e){na&&(clearTimeout(na),na=null),xi=!0;let t=++ta;if(Me){try{Me.close()}catch{}Me=null}sa=!1;let n=location.protocol==="https:"?"wss":"ws",s=z?z.cols:80,a=z?z.rows:24,o=new URLSearchParams;l.token&&o.set("token",l.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===ta&&(sa=!0,z?.write(`\x1B[32mConnected to interactive terminal\x1B[0m\r
1299
+ `),Do())}),Me.addEventListener("message",d=>{if(t!==ta)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
1301
  `):u.type==="error"&&z?.write(`\r
1302
1302
  \x1B[31m[error: ${u.data||u.message||""}]\x1B[0m\r
1303
- `)}),Me.addEventListener("close",()=>{t===ea&&(na=!1,z?.write(`\r
1303
+ `)}),Me.addEventListener("close",()=>{t===ta&&(sa=!1,z?.write(`\r
1304
1304
  \x1B[33m[disconnected]\x1B[0m\r
1305
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
1306
+ `),na=setTimeout(()=>{na=null,_o(Ao)},1500)))}),Me.addEventListener("error",()=>{t===ta&&z?.write(`\r
1307
1307
  \x1B[31m[WebSocket error]\x1B[0m\r
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();
1308
+ `)})}function md(){let e=E.peek()?.path,t=i("term-cwd");t&&(t.textContent=e||"~"),z||gd(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{Co();let n=bd();!sa||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||sa||_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)})}qs();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))}Pn();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()||!!(l.token&&ki?.id);Hc({restoreSession:$d});Oi();od();cd();ud();Dl();Ar();vd();td();ec();$l(nt,Ct);(async()=>{let e=qi();if(l.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),l.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();