claude-simple 0.2.18 → 0.2.19

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,4 +1,4 @@
1
- var Hr=Object.defineProperty;var K=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(s){throw n=[s],s}};var as=(e,t)=>{for(var n in t)Hr(e,n,{get:t[n],enumerable:!0})};function Or(){da||(da=!0,queueMicrotask(()=>{da=!1,fa()}))}function vo(e){for(let t of e)(t._isComputed?Gt:Kt).add(t);pa>0||os||(Rr==="microtask"?Or():fa())}function wo(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=[wt,En,la];[wt,En,la]=[t,n,s];try{return e()}catch(r){for(let d of a)d._subs.add(t),n.add(d);throw r}finally{[wt,En,la]=o}}var wt,En,pa,la,Gt,Kt,os,Sn,ca,Rr,da,fa,yo,$,ma,Ce,ae,Le,Tn,Br,p,g,ko,i,ua,qr,He,Ln,Fr,is,Ur,Ic,$o,Cc,Ac,So,Lo=K(()=>{wt=null,En=null,pa=0,la=null,Gt=new Set,Kt=new Set,os=!1,Sn=1e4,ca={flushes:0,runs:0,lastFlushRuns:0},Rr="sync",da=!1;fa=()=>{if(os)return;os=!0;let e=0;ca.flushes++;try{for(;Gt.size||Kt.size;){for(;Gt.size;){let t=Gt.values().next().value;if(Gt.delete(t),++e>Sn)throw new Error(`mini-react: reactive update loop exceeded ${Sn} runs`);t()}if(Kt.size){let t=Kt.values().next().value;if(Kt.delete(t),++e>Sn)throw new Error(`mini-react: reactive update loop exceeded ${Sn} runs`);t()}}}finally{ca.runs+=e,ca.lastFlushRuns=e,e>Sn&&(Gt.clear(),Kt.clear()),os=!1}};yo=class{constructor(e,t){this._v=e,this._subs=new Set,this._eq=t??((n,s)=>n===s)}get value(){return wt&&(this._subs.add(wt),En?.add(this)),this._v}set value(e){this._eq(e,this._v)||(this._v=e,vo(this._subs))}peek(){return this._v}},$=(e,{equals:t}={})=>new yo(e,t);ma=e=>{let t=new yo(void 0),n=new Set,s=!0,a=!1,o=l=>{if(!s||a)return t._v;s=!1;try{let c=wo(e,r,n,null),u=c!==t._v;u&&(t._v=c),u&&l&&vo(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 wt&&(t._subs.add(wt),En?.add(t)),d()},set(){throw new TypeError("Cannot assign to a computed signal")}}),t.dispose=()=>{if(!a){a=!0;for(let l of n)l._subs.delete(r);n.clear()}},t},Ce=e=>{let t=new Set,n=[],s=()=>{try{let a=wo(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)}},ae=e=>{pa++;try{e()}finally{--pa===0&&fa()}},Le=(e,t)=>{let n=e.peek(),s=!1;return Ce(()=>{let a=e.value;s&&t(a,n),s=!0,n=a})},Tn=e=>Ce(()=>{let t=new AbortController;return Promise.resolve(e(t.signal)).catch(n=>{n?.name!=="AbortError"&&console.error("[asyncEffect]",n)}),()=>t.abort()}),Br={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"},p=e=>String(e??"").replace(/[&<>"]/g,t=>Br[t]),g=(()=>{let e=new Map,t=n=>{e.has(n)||(e.set(n,[]),document.addEventListener(n,s=>{ae(()=>{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))}}})(),ko=(e,{keepAlive:t=!1}={})=>{let n=$(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,u)=>{if(!t)return u();if(o.has(c))return o.get(c);let h=u();return o.set(c,h),h},d=$(void 0),l=Ce(()=>{let c=n.value;for(let[u,h]of Object.entries(e)){if(u==="*")continue;let x=new RegExp("^"+u.replace(/:\w+/g,"([^/]+)")+"$"),v=c.match(x);if(v){let C=v.slice(1);d.value=typeof h=="function"?r(`${u}|${C.join("/")}`,()=>h(...C)):h;return}}if(e["*"]){let u=e["*"];d.value=typeof u=="function"?r("*",u):u;return}d.value=null});return{current:n,route:d,navigate:c=>{s||(location.hash=c)},match:c=>{let u=n.value.match(new RegExp("^"+c.replace(/:\w+/g,"([^/]+)")+"$"));return u?u.slice(1):null},invalidate:c=>{if(o){if(c===void 0){o.clear();return}for(let u of[...o.keys()])(u===c||u.startsWith(`${c}|`))&&o.delete(u)}},dispose:()=>{s||(s=!0,window.removeEventListener("hashchange",a),l(),o?.clear())}}},i=e=>document.getElementById(e),ua=()=>typeof navigator>"u"||navigator.onLine!==!1,qr=e=>new Promise(t=>setTimeout(t,e)),He=e=>e===void 0?"undefined":e===null||typeof e!="object"?JSON.stringify(e):e instanceof Date?`Date(${e.toJSON()})`:Array.isArray(e)?`[${e.map(He).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${He(e[t])}`).join(",")}}`,Ln=(e,t)=>{if(!t)return!0;if(typeof t=="function")return t(e);if(t.queryKey){let n=He(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))},Fr=e=>{try{return JSON.stringify(e),!0}catch{return!1}},is=(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)=>is(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]=is(e[a],t[a])}return n.every(a=>s[a]===e[a])?e:s},Ur=({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,l=new Map,c=null,u=!1,h=m=>{for(let b of d)b(m)},x=m=>m.state,v=m=>!m.invalidated&&Date.now()-m.state.updatedAt.peek()<m.options.staleTime,C=m=>{m.invalidated=!0,m.state.isStale.value=!0},F=m=>{m.gcTimer&&clearTimeout(m.gcTimer),m.gcTimer=null},ke=m=>{F(m),!m.observers&&Number.isFinite(m.options.gcTime)&&(m.gcTimer=setTimeout(()=>{!m.observers&&!m.promise&&(r.delete(m.hash),h({type:"gc",key:m.key}))},m.options.gcTime))},J=m=>{m.pollTimer&&clearTimeout(m.pollTimer),m.pollTimer=null},ne=m=>{J(m);let b=typeof m.options.refetchInterval=="function"?m.options.refetchInterval(m):m.options.refetchInterval;m.observers&&Number.isFinite(b)&&b>0&&(m.pollTimer=setTimeout(async()=>{ua()&&await _(m,{force:!0}).catch(()=>{}),ne(m)},b))},N=(m,b=He(m.queryKey))=>{let w={staleTime:e,gcTime:t,retry:n,retryDelay:s,...m},k={hash:b,key:m.queryKey,queryFn:m.queryFn,options:w,tags:new Set(m.tags??[]),observers:0,invalidated:!0,promise:null,ctrl:null,version:0,gcTimer:null,pollTimer:null,state:{data:$(m.initialData),error:$(null),status:$(m.initialData===void 0?"idle":"success"),fetchStatus:$("idle"),updatedAt:$(m.initialData===void 0?0:Date.now()),isStale:$(!0)}};return r.set(b,k),k},S=m=>{if(!m?.queryKey)throw new TypeError("query: queryKey is required");let b=He(m.queryKey),w=r.get(b)??N(m,b);m.queryFn&&(w.queryFn=m.queryFn),w.options={...w.options,...m};for(let k of m.tags??[])w.tags.add(k);return w},_=(m,{force:b=!1}={})=>{if(!m.queryFn)return Promise.reject(new TypeError(`query ${m.hash} has no queryFn`));if(!b&&v(m))return Promise.resolve(m.state.data.peek());if(m.promise)return m.promise;if(!ua())return m.state.fetchStatus.value="paused",Promise.reject(new Error("Query paused while offline"));F(m);let w=++m.version,k=new AbortController;m.ctrl=k,ae(()=>{m.state.data.peek()===void 0&&(m.state.status.value="pending"),m.state.fetchStatus.value="fetching",m.state.error.value=null}),h({type:"fetch",key:m.key});let W=async(D,G)=>{try{return await m.queryFn({queryKey:m.key,signal:k.signal,meta:m.options.meta})}catch(X){if(k.signal.aborted||X?.name==="AbortError"||D<=0||m.options.retry===!1)throw X;return await qr(typeof G=="function"?G(D,X):G),W(D-1,typeof G=="number"?G*2:G)}},Y=W(m.options.retry??n,m.options.retryDelay??s).then(D=>(m.version===w&&!k.signal.aborted&&ae(()=>{m.state.data.value=m.options.structuralSharing===!1?D:is(m.state.data.peek(),D),m.state.status.value="success",m.state.fetchStatus.value="idle",m.state.updatedAt.value=Date.now(),m.state.isStale.value=!1,m.invalidated=!1}),h({type:"success",key:m.key}),D)).catch(D=>{throw m.version===w&&!k.signal.aborted&&ae(()=>{m.state.error.value=D,m.state.status.value=m.state.data.peek()===void 0?"error":"success",m.state.fetchStatus.value="idle"}),k.signal.aborted||h({type:"error",key:m.key,error:D}),D}).finally(()=>{m.promise===Y&&(m.promise=null,m.ctrl=null,ke(m))});return m.promise=Y,Y},se=m=>Promise.all([...r.values()].filter(b=>Ln(b,m)&&b.observers).map(b=>_(b,{force:!0}).catch(()=>{}))),M={query(m){let b=S(m);b.observers++,F(b),ne(b),m.enabled!==!1&&(!v(b)||m.refetchOnMount)&&_(b).catch(()=>{});let w=()=>{b.observers=Math.max(0,b.observers-1),ke(b),ne(b)};return[x(b),{refetch:()=>_(b,{force:!0}),invalidate:()=>M.invalidateQueries({queryKey:b.key,exact:!0}),setData:k=>M.setQueryData(b.key,k),cancel:()=>M.cancelQueries({queryKey:b.key,exact:!0}),dispose:w}]},prefetchQuery(m){let b=S(m);return _(b)},fetchQuery(m){let b=S(m);return _(b)},getQueryData(m){return r.get(He(m))?.state.data.peek()},getQueryState(m){let b=r.get(He(m));return b&&x(b)},setQueryData(m,b,{tags:w}={}){let k=r.get(He(m))??S({queryKey:m,tags:w}),W=typeof b=="function"?b(k.state.data.peek()):b,Y=k.options.structuralSharing===!1?W:is(k.state.data.peek(),W);ae(()=>{k.state.data.value=Y,k.state.status.value="success",k.state.error.value=null,k.state.updatedAt.value=Date.now(),k.state.isStale.value=!1}),k.invalidated=!1;for(let D of w??[])k.tags.add(D);return h({type:"set",key:k.key}),c&&c.postMessage({type:"invalidate",hash:k.hash}),Y},invalidateQueries(m){for(let b of r.values())Ln(b,m)&&C(b);return h({type:"invalidate",filter:m}),c&&c.postMessage({type:"invalidate",filter:m}),se(m)},cancelQueries(m){for(let b of r.values())Ln(b,m)&&b.ctrl?.abort()},removeQueries(m){for(let b of[...r.values()])Ln(b,m)&&(b.ctrl?.abort(),F(b),J(b),r.delete(b.hash))},mutate({mutationFn:m,variables:b,optimistic:w,invalidate:k,onMutate:W,onSuccess:Y,onError:D,networkMode:G="online"}={}){if(typeof m!="function")return Promise.reject(new TypeError("mutate: mutationFn is required"));let X=[],yt=Wt=>(Array.isArray(Wt)?Wt:[Wt]).filter(Boolean).forEach(Ie=>{let ia=M.getQueryData(Ie.queryKey);X.push([Ie.queryKey,ia]),M.setQueryData(Ie.queryKey,ra=>Ie.updater(ra))}),$n=async()=>{let Wt=await W?.(b,{client:M});w&&yt(typeof w=="function"?w(b):w);try{let Ie=await m(b);return await Y?.(Ie,b,Wt),k&&await M.invalidateQueries(k),h({type:"mutation-success"}),Ie}catch(Ie){for(let[ia,ra]of X)M.setQueryData(ia,ra);throw await D?.(Ie,b,Wt),h({type:"mutation-error",error:Ie}),Ie}};return!ua()&&G==="offlineFirst"?(V.push($n),h({type:"mutation-queued"}),Promise.resolve({queued:!0})):$n()},infiniteQuery({queryKey:m,queryFn:b,initialPageParam:w=0,getNextPageParam:k,...W}){let[Y,D]=M.query({queryKey:m,...W,queryFn:async G=>({pages:[await b({...G,pageParam:w})],pageParams:[w]})});return[Y,{...D,fetchNextPage:async()=>{let G=Y.data.peek()??{pages:[],pageParams:[]},X=k?.(G.pages.at(-1),G.pages);if(X==null)return;let yt=await b({queryKey:m,pageParam:X,signal:new AbortController().signal});return M.setQueryData(m,{pages:[...G.pages,yt],pageParams:[...G.pageParams,X]}),yt}}]},dehydrate({shouldDehydrate:m=w=>w.state.status.peek()==="success",version:b=1}={}){return{version:b,timestamp:Date.now(),queries:[...r.values()].filter(m).filter(w=>Fr(w.state.data.peek())).map(w=>({key:w.key,data:w.state.data.peek(),updatedAt:w.state.updatedAt.peek(),staleTime:w.options.staleTime,tags:[...w.tags]}))}},hydrate(m,{version:b=1}={}){if(!m||m.version!==b||!Array.isArray(m.queries))return!1;for(let w of m.queries){let k=r.get(He(w.key))??S({queryKey:w.key,staleTime:w.staleTime,tags:w.tags});ae(()=>{k.state.data.value=w.data,k.state.status.value="success",k.state.updatedAt.value=w.updatedAt,k.state.isStale.value=Date.now()-w.updatedAt>=k.options.staleTime}),k.invalidated=k.state.isStale.peek()}return h({type:"hydrate"}),!0},persist({storage:m=typeof localStorage>"u"?null:localStorage,key:b="mini-react-query",version:w=1}={}){if(!m)throw new Error("persist: a storage adapter is required");let k=!1,W=async()=>{let D=JSON.stringify(M.dehydrate({version:w}));return m.set?m.set(b,D):m.setItem(b,D)},Y=M.subscribe(()=>{k||(k=!0,queueMicrotask(()=>{k=!1,W().catch(()=>{})}))});return{restore:async()=>{let D=await(m.get?m.get(b):m.getItem(b));return D?M.hydrate(JSON.parse(D),{version:w}):!1},save:W,dispose:Y}},sync(m="mini-react-query"){return typeof BroadcastChannel>"u"?()=>{}:(c?.close(),c=new BroadcastChannel(m),c.onmessage=b=>{if(b.data?.type!=="invalidate")return;let w=b.data.hash?k=>k.hash===b.data.hash:b.data.filter;for(let k of r.values())Ln(k,w)&&C(k);se(w)},()=>{c?.close(),c=null})},subscribe(m){return d.add(m),()=>d.delete(m)},getDebugSnapshot(){return[...r.values()].map(m=>({key:m.key,observers:m.observers,status:m.state.status.peek(),fetchStatus:m.state.fetchStatus.peek(),updatedAt:m.state.updatedAt.peek(),stale:m.state.isStale.peek(),tags:[...m.tags]}))},async fetchJSON(m,b={},{queryKey:w=["GET",m,b.body??null],...k}={}){let W=He(w);return M.fetchQuery({queryKey:w,...k,queryFn:async({signal:Y})=>{let D=new Headers(b.headers),G=l.get(W);G?.etag&&D.set("If-None-Match",G.etag);let X=await fetch(m,{...b,headers:D,signal:Y});if(X.status===304&&G)return M.getQueryData(w);if(!X.ok)throw new Error(`HTTP ${X.status}`);let yt=X.headers.get("cache-control")?.match(/max-age=(\d+)/)?.[1];if(yt){let $n=r.get(W);$n&&($n.options.staleTime=Number(yt)*1e3)}return l.set(W,{etag:X.headers.get("etag")}),X.json()}})},destroy(){u=!0;for(let m of r.values())m.ctrl?.abort(),F(m),J(m);c?.close(),d.clear()}},V=[],rt=()=>{a&&se()},xt=()=>{for(o&&se();V.length;)V.shift()().catch(()=>{})};typeof window<"u"&&(window.addEventListener("focus",rt),window.addEventListener("online",xt));let vt=M.destroy;return M.destroy=()=>{u||(typeof window<"u"&&(window.removeEventListener("focus",rt),window.removeEventListener("online",xt)),vt())},M},Ic=Ur(),$o=({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,l=new Map,c=(h,x)=>{if(a)return a.get(h);let v=r.get(h);return v&&Date.now()-v.ts<x?v.data:void 0},u=async(h,x,v)=>{if(a)return a.set(h,x,{ttl:v});r.set(h,{data:x,ts:Date.now()})};return{get:(h,x,v={})=>{let C=v.ttl??t,F=e&&v.cache!==!1&&C!==0,ke=v.dedupe??o;if(ke&&d.has(h))return d.get(h);let J=()=>{let N=l.get(h)??0,S=(_,se)=>Promise.resolve(x()).then(async M=>(F&&(l.get(h)??0)===N&&await u(h,M,C),M)).catch(M=>{if(_>0&&M?.name!=="AbortError")return new Promise(V=>setTimeout(V,se)).then(()=>S(_-1,se*2));throw M});return S(v.retry??n,s)},ne=N=>(ke&&(d.set(h,N),N.finally(()=>{d.get(h)===N&&d.delete(h)}).catch(()=>{})),N);if(!F)return ne(J());if(!a){let N=c(h,C);return N!==void 0?Promise.resolve(N):ne(J())}return ne(Promise.resolve(c(h,C)).then(N=>N!==void 0?N:J()))},invalidate:h=>{if(h!==void 0)l.set(h,(l.get(h)??0)+1);else{for(let x of r.keys())l.set(x,(l.get(x)??0)+1);for(let x of d.keys())l.set(x,(l.get(x)??0)+1)}if(a)return h===void 0?a.clear():a.delete(h);h===void 0?r.clear():r.delete(h)}}},Cc=new TextEncoder,Ac=new TextDecoder,So=(e,t="kv")=>{let n=null,s=()=>n?Promise.resolve(n):new Promise((o,r)=>{let d=indexedDB.open(e,1);d.onupgradeneeded=l=>l.target.result.createObjectStore(t),d.onsuccess=l=>{n=l.target.result,o(n)},d.onerror=l=>r(l.target.error)}),a=async(o,r)=>{let d=await s();return new Promise((l,c)=>{let u=d.transaction(t,o),h=r(u.objectStore(t));h.onsuccess=()=>l(h.result),h.onerror=()=>c(h.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",l=>l.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 R=K(()=>{Lo()});var No={};as(No,{AGENT_DEFAULT_MODEL:()=>Ao,AGENT_LABELS:()=>te,AGENT_MODELS:()=>ha,LOW_TURN_THRESHOLD:()=>ga,activityHits:()=>Re,activityLoading:()=>Qe,addCustomModel:()=>Mn,agentFilter:()=>de,agentFilters:()=>$t,agentsMeta:()=>kt,chatDensity:()=>Ve,collapsedFolders:()=>Jt,ctx:()=>f,currentAgent:()=>I,currentEffort:()=>ie,currentModel:()=>P,currentPermission:()=>Ee,currentProject:()=>E,currentTab:()=>U,expandedFolders:()=>zt,favoritesOnly:()=>Ae,filesPath:()=>z,filesRoot:()=>ce,filteredSessions:()=>ct,getCustomModels:()=>ls,getDefaultEffort:()=>lt,getDefaultModel:()=>Be,getEffortsForModel:()=>In,getModelsForAgent:()=>Xe,getSavedModel:()=>Co,getSessionMeta:()=>Qt,gitRoot:()=>be,hubMachineReady:()=>Oe,hubMode:()=>A,isProcessing:()=>he,machinesList:()=>Q,metaKey:()=>oe,projectGroups:()=>St,removeCustomModel:()=>ya,selectedMachineId:()=>j,sessionDisplayTitle:()=>Ye,sessionFilter:()=>fe,sessionMetaMap:()=>T,sessionSearch:()=>me,sessionSort:()=>Eo,sessionsData:()=>O,setAgent:()=>qe,setChatDensity:()=>xa,setCurrentModel:()=>le,setSelectedMachine:()=>ge,showHiddenOnly:()=>je,sidebarView:()=>Je,timeRange:()=>rs,viewingFile:()=>re,workspacesData:()=>ee,wsStatus:()=>ze});function Mo(){try{let e=JSON.parse(localStorage.getItem(To)||"{}");return e&&typeof e=="object"?e:{}}catch{return{}}}function Io(e,t=f.sessionId,n=f.machineId){if(!t)return"";let s=(e||"claude").toLowerCase();return`${n||""}:${s}:${t}`}function Co(e,t=f.sessionId,n=f.machineId){let s=Io(e,t,n);if(!s)return null;let a=Mo()[s];return typeof a=="string"&&a.trim()?a:null}function le(e,t=I.peek(),n=f.sessionId,s=f.machineId){let a=String(e||"").trim();if(!a)return;let o=Io(t,n,s);if(o){let r=Mo();r[o]=a,localStorage.setItem(To,JSON.stringify(r))}P.value=a}function ge(e){let t=e||null;j.value=t,f.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function oe(e,t,n){let s=`${e||"claude"}:${t}`;return n||f?.machineId?`${n||f.machineId}:${s}`:s}function Qt(e,t,n){return T.peek()?.[oe(e,t,n)]||{favorite:!1,notes:"",title:"",hidden:!1}}function Ye(e,{preferSnippet:t=!1}={}){if(!e)return"Session";if(t&&e.snippet)return e.snippet;let s=(Qt(e.agent,e.sessionId,e.machineId).title||"").trim();return s||e.display||e.sessionId?.slice(0,8)||"Session"}function xa(e){let t=["clean","normal","full"].includes(e)?e:"normal";Ve.value=t,localStorage.setItem("chatDensity",t),document.getElementById("messages")?.setAttribute("data-density",t)}function Gr(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 va(){try{let e=localStorage.getItem(jo);if(!e)return{};let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function Do(e){localStorage.setItem(jo,JSON.stringify(e))}function ls(e){let t=(e||"claude").toLowerCase(),n=va()[t];return Array.isArray(n)?n.filter(Boolean).map(String):[]}function Mn(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim();if(!s)return!1;let a=va(),o=Array.isArray(a[n])?[...a[n]]:[];return o.includes(s)||o.push(s),a[n]=o,Do(a),!0}function ya(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim(),a=va(),o=Array.isArray(a[n])?a[n].filter(r=>r!==s):[];return a[n]=o,Do(a),!0}function Xe(e){let t=(e||"claude").toLowerCase(),n=kt.peek()?.defaults?.[t],s=n?.models?.length?n.models.map(Gr).filter(Boolean):(ha[t]||ha.claude).map(r=>({...r})),a=ls(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 l=String(d.label||d.value);return{...d,custom:!0,label:l.includes("\u2605")?l:`${l} \u2605`}});continue}o.add(r),s.push({value:r,label:`${r} \u2605`,custom:!0})}return s}function Be(e){let t=(e||"claude").toLowerCase(),n=kt.peek()?.defaults?.[t];return n?.model?String(n.model):Ao[t]||Xe(t)[0]?.value||"claude-sonnet-4-5"}function In(e,t){let s=Xe(e).find(o=>o.value===t);if(s?.efforts?.length)return s.efforts;let a=kt.peek()?.defaults?.[(e||"claude").toLowerCase()];return a?.efforts?.length?a.efforts.map(String):["low","medium","high","xhigh","max"]}function lt(e,t){let n=(e||"claude").toLowerCase(),s=kt.peek()?.defaults?.[n];if(s?.effortDefault)return String(s.effortDefault);let o=Xe(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 qe(e){let t=(e||"claude").toLowerCase();I.value=t,localStorage.setItem("agent",t),Ee.value="bypassPermissions";let n=typeof document>"u"?null:document.getElementById("sel-permission");n&&(n.value=Ee.peek());let s=Co(t);s?P.value=s:le(Be(t),t);let a=lt(t,P.peek());a?ie.value=a:t!=="grok"&&t!=="gemini"&&(ie.value="")}function Kr(e,t){return!t||t==="all"?!0:(e.agent||"claude")===t}function zr(e,t){if(!t)return!0;let n=T.value?.[oe(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 ba(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}var O,ee,fe,me,Eo,zt,Jt,z,re,E,U,he,ze,To,Wr,I,P,ie,Ee,ce,be,kt,Je,de,$t,rs,Re,Qe,T,Ae,je,ga,Ve,A,Q,j,Oe,f,te,ha,Ao,jo,ct,St,B=K(()=>{R();O=$([]),ee=$([]),fe=$(null),me=$(""),Eo=$("time"),zt=$(new Set),Jt=$(new Set),z=$(""),re=$(null),E=$(null),U=$("chat"),he=$(!1),ze=$("idle"),To="modelBySession",Wr=localStorage.getItem("agent")||"claude";I=$(Wr),P=$("claude-sonnet-4-5"),ie=$(""),Ee=$("bypassPermissions"),ce=$(""),be=$(""),kt=$(null),Je=$(localStorage.getItem("sidebarView")||"projects"),de=$(localStorage.getItem("agentFilter")||"all"),$t=$((()=>{try{let e=JSON.parse(localStorage.getItem("agentFilters")||"[]");return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}})()),rs=$(localStorage.getItem("timeRange")||"14"),Re=$(null),Qe=$(!1),T=$({}),Ae=$(localStorage.getItem("favoritesOnly")==="1"),je=$(localStorage.getItem("showHiddenOnly")==="1"),ga=2,Ve=$(localStorage.getItem("chatDensity")||"normal"),A=$(!1),Q=$([]),j=$(null),Oe=$(!1),f={token:localStorage.getItem("token"),sessionId:null,agent:null,machineId:null,ws:null,shellBubble:null,configDir:null};te={claude:"Claude",codex:"Codex",grok:"Grok",gemini:"Gemini",cursor:"Cursor"},ha={claude:[{value:"claude-sonnet-4-5",label:"sonnet-4-5"},{value:"claude-sonnet-4-6",label:"sonnet-4-6"},{value:"claude-opus-4-5",label:"opus-4-5"},{value:"claude-haiku-4-5",label:"haiku-4-5"}],codex:[{value:"gpt-5.4",label:"gpt-5.4"},{value:"gpt-5.3",label:"gpt-5.3"},{value:"gpt-5.2",label:"gpt-5.2"},{value:"o3",label:"o3"},{value:"o4-mini",label:"o4-mini"},{value:"codex-mini-latest",label:"codex-mini"}],grok:[{value:"grok-4.5",label:"grok-4.5"},{value:"grok-4",label:"grok-4"},{value:"grok-3",label:"grok-3"},{value:"grok-3-mini",label:"grok-3-mini"}],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"}]},Ao={claude:"claude-sonnet-4-5",codex:"gpt-5.4",grok:"grok-4.5",gemini:"gemini-3.7-flash-high",cursor:"auto"};jo="customModelsByAgent";ct=ma(()=>{let e=me.value.toLowerCase().trim(),t=Eo.value,n=de.value,s=$t.value,a=Ae.value,o=je.value,r=T.value,d=Re.value,l=d?.results?.length&&e?ba(d.results):ba(O.value),c=j.value;return A.value&&c&&(l=l.filter(u=>u&&(!u.machineId||u.machineId===c))),l=l.filter(u=>u&&(s.length?s.includes(u.agent||"claude"):Kr(u,n))),o?l=l.filter(u=>u&&r?.[oe(u.agent,u.sessionId,u.machineId)]?.hidden):l=l.filter(u=>u&&!r?.[oe(u.agent,u.sessionId,u.machineId)]?.hidden),a&&(l=l.filter(u=>u&&r?.[oe(u.agent,u.sessionId,u.machineId)]?.favorite)),e&&!(d?.results&&d.q===e)&&(l=l.filter(u=>u&&zr(u,e))),l=[...l].sort((u,h)=>{let x=r?.[oe(u.agent,u.sessionId,u.machineId)]?.favorite?1:0,v=r?.[oe(h.agent,h.sessionId,h.machineId)]?.favorite?1:0;return x!==v?v-x:t==="project"&&(u.cwd||"").localeCompare(h.cwd||"")||h.updatedAt-u.updatedAt}),!e&&!a?l.slice(0,120):l}),St=ma(()=>{let e=ba(ct.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 Cn(e={}){return e.machineId!==void 0?e.machineId:f.machineId||j.peek()||null}function Qr(e){let t=e.split("?")[0];return t==="/api/hub"||t==="/api/machines"||t==="/api/notifications"||t==="/api/notifications/read"||t==="/api/ai/notes"||t.startsWith("/api/ai/notes/")||t.startsWith("/api/auth/")}async function y(e,t,n,s,a={}){let o=Cn(a),r={"Content-Type":"application/json",...f.token?{Authorization:`Bearer ${f.token}`}:{}};A.peek()&&o&&!Qr(t)&&(r["X-Machine-Id"]=o);let d=a.etag===!0?`${f.token||""}:${o||""}:${t}`:a.etag||null;if(e.toUpperCase()==="GET"&&d){let u=_o.get(d);u&&(r["If-None-Match"]=u)}let l=async()=>{let u=await fetch(t,{method:e,signal:s,headers:r,...n!==void 0?{body:JSON.stringify(n)}:{}});if(u.status===304)return wa;let h=await u.json().catch(()=>({}));if(!u.ok)throw new Error(h.error||`HTTP ${u.status}`);if(d){let x=u.headers.get("ETag");x&&_o.set(d,x)}return h};if(e.toUpperCase()!=="GET"||s||a.dedupe===!1)return l();let c=`${f.token||""}:${o||""}:${t}`;return Jr.get(c,l)}function Vt(e){return f.ws?.readyState===WebSocket.OPEN?(f.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||cs.push(e),!1)}function Po(){for(;cs.length&&f.ws?.readyState===WebSocket.OPEN;)f.ws.send(JSON.stringify(cs.shift()))}function Ho(){cs.length=0}function Ro(e={}){let t=new URLSearchParams(e);f.token&&t.set("token",f.token);let n=Cn();return A.peek()&&n&&t.set("machine",n),t.toString()}function dt(e={}){let t={...e};f.token&&(t.Authorization=`Bearer ${f.token}`);let n=Cn();return A.peek()&&n&&(t["X-Machine-Id"]=n),t}async function Yt(){try{let e=await fetch("/api/hub");if(!e.ok)return A.value=!1,!1;let t=await e.json();if(t?.hub)return A.value=!0,t}catch{}return A.value=!1,!1}var Jr,_o,wa,cs,ue=K(()=>{B();R();Jr=$o({cache:!1,dedupe:!0,retry:0}),_o=new Map,wa=Symbol("not-modified");cs=[]});function Lt(e,t){e&&(t?e.setAttribute("inert",""):e.removeAttribute("inert"))}function Zt(e){return!e||e.classList.contains("hidden")?!0:e.style.display==="none"}function xe(){let e=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,t=document.getElementById("sidebar");if(t){let s=!e||t.classList.contains("open");Lt(t,!s)}Lt(document.getElementById("welcome"),Zt(document.getElementById("welcome"))),Lt(document.getElementById("auth-screen"),Zt(document.getElementById("auth-screen"))),Lt(document.getElementById("chat-opts"),Zt(document.getElementById("chat-opts"))),Lt(document.getElementById("machine-picker"),Zt(document.getElementById("machine-picker")));for(let s of["files","git","shell","memory"]){let a=document.getElementById(`tab-${s}`);Lt(a,Zt(a))}let n=document.getElementById("tab-chat");n&&Lt(n,Zt(n))}function An(){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 Uo(){xe(),An();let e=window.visualViewport;e&&(e.addEventListener("resize",An),e.addEventListener("scroll",An)),window.addEventListener("resize",()=>{An(),xe()}),window.addEventListener("orientationchange",()=>{setTimeout(()=>{An(),xe()},250)})}var en=K(()=>{});function Et(){try{let e=localStorage.getItem(Wo);return e?JSON.parse(e):null}catch{return null}}function ka(e){try{let n={...Et()||{},...e,updatedAt:Date.now()};localStorage.setItem(Wo,JSON.stringify(n))}catch{}}var Wo,ds=K(()=>{Wo="lastSessionContext"});async function $a(){if(jn&&!(typeof navigator>"u"||!navigator.wakeLock?.request)&&document.visibilityState==="visible"&&!Tt)try{Tt=await navigator.wakeLock.request("screen"),Tt.addEventListener("release",()=>{Tt=null,jn&&document.visibilityState==="visible"&&setTimeout(()=>{$a().catch(()=>{})},500)})}catch{Tt=null}}async function Go(){let e=Tt;if(Tt=null,!!e)try{await e.release()}catch{}}function Ko(e){jn=!!e,jn?$a().catch(()=>{}):Go().catch(()=>{})}function zo(){typeof document>"u"||document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&jn?$a().catch(()=>{}):document.visibilityState==="hidden"&&Go().catch(()=>{})})}var Tt,jn,Jo=K(()=>{Tt=null,jn=!1});function q(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 q(Number(t));let n=Date.parse(t);return Number.isNaN(n)?null:n}return null}function tn(e){let t=q(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 nn(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():te[n]||n;return`<span class="text-[9px] px-1 py-0.5 rounded font-mono font-semibold flex-shrink-0 ${a}" title="${p(te[n]||n)}">${o}</span>`}function sn(e){if(!e)return"";let t="",n=e.split("/").filter(Boolean);return n.length<=3?e:"\u2026/"+n.slice(-2).join("/")}var an=K(()=>{R();B()});function Xr(e){let t=q(e);if(t==null)return"";let n=new Date(t);return Number.isNaN(n.getTime())?"":n.toLocaleString()}function Qo(){let e=i("notifications-badge");if(e){if(!Mt){e.classList.add("hidden"),e.textContent="0";return}e.classList.remove("hidden"),e.textContent=Mt>99?"99+":String(Mt)}}function Xo(){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 Dn(){let e=i("notifications-menu-list"),t=i("notifications-menu-empty");if(!(!e||!t)){if(!$e.length){e.innerHTML="",t.classList.remove("hidden"),Qo();return}t.classList.add("hidden"),e.innerHTML=$e.map(n=>`
1
+ var Rr=Object.defineProperty;var K=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(s){throw n=[s],s}};var as=(e,t)=>{for(var n in t)Rr(e,n,{get:t[n],enumerable:!0})};function Br(){da||(da=!0,queueMicrotask(()=>{da=!1,fa()}))}function vo(e){for(let t of e)(t._isComputed?Gt:Kt).add(t);pa>0||os||(Or==="microtask"?Br():fa())}function wo(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=[wt,En,la];[wt,En,la]=[t,n,s];try{return e()}catch(r){for(let d of a)d._subs.add(t),n.add(d);throw r}finally{[wt,En,la]=o}}var wt,En,pa,la,Gt,Kt,os,Sn,ca,Or,da,fa,yo,$,ma,Ce,ae,Le,Tn,qr,p,g,ko,i,ua,Fr,Re,Ln,Ur,is,Wr,Cc,$o,Ac,jc,So,Lo=K(()=>{wt=null,En=null,pa=0,la=null,Gt=new Set,Kt=new Set,os=!1,Sn=1e4,ca={flushes:0,runs:0,lastFlushRuns:0},Or="sync",da=!1;fa=()=>{if(os)return;os=!0;let e=0;ca.flushes++;try{for(;Gt.size||Kt.size;){for(;Gt.size;){let t=Gt.values().next().value;if(Gt.delete(t),++e>Sn)throw new Error(`mini-react: reactive update loop exceeded ${Sn} runs`);t()}if(Kt.size){let t=Kt.values().next().value;if(Kt.delete(t),++e>Sn)throw new Error(`mini-react: reactive update loop exceeded ${Sn} runs`);t()}}}finally{ca.runs+=e,ca.lastFlushRuns=e,e>Sn&&(Gt.clear(),Kt.clear()),os=!1}};yo=class{constructor(e,t){this._v=e,this._subs=new Set,this._eq=t??((n,s)=>n===s)}get value(){return wt&&(this._subs.add(wt),En?.add(this)),this._v}set value(e){this._eq(e,this._v)||(this._v=e,vo(this._subs))}peek(){return this._v}},$=(e,{equals:t}={})=>new yo(e,t);ma=e=>{let t=new yo(void 0),n=new Set,s=!0,a=!1,o=l=>{if(!s||a)return t._v;s=!1;try{let c=wo(e,r,n,null),u=c!==t._v;u&&(t._v=c),u&&l&&vo(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 wt&&(t._subs.add(wt),En?.add(t)),d()},set(){throw new TypeError("Cannot assign to a computed signal")}}),t.dispose=()=>{if(!a){a=!0;for(let l of n)l._subs.delete(r);n.clear()}},t},Ce=e=>{let t=new Set,n=[],s=()=>{try{let a=wo(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)}},ae=e=>{pa++;try{e()}finally{--pa===0&&fa()}},Le=(e,t)=>{let n=e.peek(),s=!1;return Ce(()=>{let a=e.value;s&&t(a,n),s=!0,n=a})},Tn=e=>Ce(()=>{let t=new AbortController;return Promise.resolve(e(t.signal)).catch(n=>{n?.name!=="AbortError"&&console.error("[asyncEffect]",n)}),()=>t.abort()}),qr={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"},p=e=>String(e??"").replace(/[&<>"]/g,t=>qr[t]),g=(()=>{let e=new Map,t=n=>{e.has(n)||(e.set(n,[]),document.addEventListener(n,s=>{ae(()=>{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))}}})(),ko=(e,{keepAlive:t=!1}={})=>{let n=$(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,u)=>{if(!t)return u();if(o.has(c))return o.get(c);let h=u();return o.set(c,h),h},d=$(void 0),l=Ce(()=>{let c=n.value;for(let[u,h]of Object.entries(e)){if(u==="*")continue;let x=new RegExp("^"+u.replace(/:\w+/g,"([^/]+)")+"$"),v=c.match(x);if(v){let C=v.slice(1);d.value=typeof h=="function"?r(`${u}|${C.join("/")}`,()=>h(...C)):h;return}}if(e["*"]){let u=e["*"];d.value=typeof u=="function"?r("*",u):u;return}d.value=null});return{current:n,route:d,navigate:c=>{s||(location.hash=c)},match:c=>{let u=n.value.match(new RegExp("^"+c.replace(/:\w+/g,"([^/]+)")+"$"));return u?u.slice(1):null},invalidate:c=>{if(o){if(c===void 0){o.clear();return}for(let u of[...o.keys()])(u===c||u.startsWith(`${c}|`))&&o.delete(u)}},dispose:()=>{s||(s=!0,window.removeEventListener("hashchange",a),l(),o?.clear())}}},i=e=>document.getElementById(e),ua=()=>typeof navigator>"u"||navigator.onLine!==!1,Fr=e=>new Promise(t=>setTimeout(t,e)),Re=e=>e===void 0?"undefined":e===null||typeof e!="object"?JSON.stringify(e):e instanceof Date?`Date(${e.toJSON()})`:Array.isArray(e)?`[${e.map(Re).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Re(e[t])}`).join(",")}}`,Ln=(e,t)=>{if(!t)return!0;if(typeof t=="function")return t(e);if(t.queryKey){let n=Re(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))},Ur=e=>{try{return JSON.stringify(e),!0}catch{return!1}},is=(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)=>is(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]=is(e[a],t[a])}return n.every(a=>s[a]===e[a])?e:s},Wr=({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,l=new Map,c=null,u=!1,h=m=>{for(let b of d)b(m)},x=m=>m.state,v=m=>!m.invalidated&&Date.now()-m.state.updatedAt.peek()<m.options.staleTime,C=m=>{m.invalidated=!0,m.state.isStale.value=!0},F=m=>{m.gcTimer&&clearTimeout(m.gcTimer),m.gcTimer=null},ke=m=>{F(m),!m.observers&&Number.isFinite(m.options.gcTime)&&(m.gcTimer=setTimeout(()=>{!m.observers&&!m.promise&&(r.delete(m.hash),h({type:"gc",key:m.key}))},m.options.gcTime))},J=m=>{m.pollTimer&&clearTimeout(m.pollTimer),m.pollTimer=null},ne=m=>{J(m);let b=typeof m.options.refetchInterval=="function"?m.options.refetchInterval(m):m.options.refetchInterval;m.observers&&Number.isFinite(b)&&b>0&&(m.pollTimer=setTimeout(async()=>{ua()&&await _(m,{force:!0}).catch(()=>{}),ne(m)},b))},N=(m,b=Re(m.queryKey))=>{let w={staleTime:e,gcTime:t,retry:n,retryDelay:s,...m},k={hash:b,key:m.queryKey,queryFn:m.queryFn,options:w,tags:new Set(m.tags??[]),observers:0,invalidated:!0,promise:null,ctrl:null,version:0,gcTimer:null,pollTimer:null,state:{data:$(m.initialData),error:$(null),status:$(m.initialData===void 0?"idle":"success"),fetchStatus:$("idle"),updatedAt:$(m.initialData===void 0?0:Date.now()),isStale:$(!0)}};return r.set(b,k),k},S=m=>{if(!m?.queryKey)throw new TypeError("query: queryKey is required");let b=Re(m.queryKey),w=r.get(b)??N(m,b);m.queryFn&&(w.queryFn=m.queryFn),w.options={...w.options,...m};for(let k of m.tags??[])w.tags.add(k);return w},_=(m,{force:b=!1}={})=>{if(!m.queryFn)return Promise.reject(new TypeError(`query ${m.hash} has no queryFn`));if(!b&&v(m))return Promise.resolve(m.state.data.peek());if(m.promise)return m.promise;if(!ua())return m.state.fetchStatus.value="paused",Promise.reject(new Error("Query paused while offline"));F(m);let w=++m.version,k=new AbortController;m.ctrl=k,ae(()=>{m.state.data.peek()===void 0&&(m.state.status.value="pending"),m.state.fetchStatus.value="fetching",m.state.error.value=null}),h({type:"fetch",key:m.key});let W=async(D,G)=>{try{return await m.queryFn({queryKey:m.key,signal:k.signal,meta:m.options.meta})}catch(X){if(k.signal.aborted||X?.name==="AbortError"||D<=0||m.options.retry===!1)throw X;return await Fr(typeof G=="function"?G(D,X):G),W(D-1,typeof G=="number"?G*2:G)}},Y=W(m.options.retry??n,m.options.retryDelay??s).then(D=>(m.version===w&&!k.signal.aborted&&ae(()=>{m.state.data.value=m.options.structuralSharing===!1?D:is(m.state.data.peek(),D),m.state.status.value="success",m.state.fetchStatus.value="idle",m.state.updatedAt.value=Date.now(),m.state.isStale.value=!1,m.invalidated=!1}),h({type:"success",key:m.key}),D)).catch(D=>{throw m.version===w&&!k.signal.aborted&&ae(()=>{m.state.error.value=D,m.state.status.value=m.state.data.peek()===void 0?"error":"success",m.state.fetchStatus.value="idle"}),k.signal.aborted||h({type:"error",key:m.key,error:D}),D}).finally(()=>{m.promise===Y&&(m.promise=null,m.ctrl=null,ke(m))});return m.promise=Y,Y},se=m=>Promise.all([...r.values()].filter(b=>Ln(b,m)&&b.observers).map(b=>_(b,{force:!0}).catch(()=>{}))),M={query(m){let b=S(m);b.observers++,F(b),ne(b),m.enabled!==!1&&(!v(b)||m.refetchOnMount)&&_(b).catch(()=>{});let w=()=>{b.observers=Math.max(0,b.observers-1),ke(b),ne(b)};return[x(b),{refetch:()=>_(b,{force:!0}),invalidate:()=>M.invalidateQueries({queryKey:b.key,exact:!0}),setData:k=>M.setQueryData(b.key,k),cancel:()=>M.cancelQueries({queryKey:b.key,exact:!0}),dispose:w}]},prefetchQuery(m){let b=S(m);return _(b)},fetchQuery(m){let b=S(m);return _(b)},getQueryData(m){return r.get(Re(m))?.state.data.peek()},getQueryState(m){let b=r.get(Re(m));return b&&x(b)},setQueryData(m,b,{tags:w}={}){let k=r.get(Re(m))??S({queryKey:m,tags:w}),W=typeof b=="function"?b(k.state.data.peek()):b,Y=k.options.structuralSharing===!1?W:is(k.state.data.peek(),W);ae(()=>{k.state.data.value=Y,k.state.status.value="success",k.state.error.value=null,k.state.updatedAt.value=Date.now(),k.state.isStale.value=!1}),k.invalidated=!1;for(let D of w??[])k.tags.add(D);return h({type:"set",key:k.key}),c&&c.postMessage({type:"invalidate",hash:k.hash}),Y},invalidateQueries(m){for(let b of r.values())Ln(b,m)&&C(b);return h({type:"invalidate",filter:m}),c&&c.postMessage({type:"invalidate",filter:m}),se(m)},cancelQueries(m){for(let b of r.values())Ln(b,m)&&b.ctrl?.abort()},removeQueries(m){for(let b of[...r.values()])Ln(b,m)&&(b.ctrl?.abort(),F(b),J(b),r.delete(b.hash))},mutate({mutationFn:m,variables:b,optimistic:w,invalidate:k,onMutate:W,onSuccess:Y,onError:D,networkMode:G="online"}={}){if(typeof m!="function")return Promise.reject(new TypeError("mutate: mutationFn is required"));let X=[],yt=Wt=>(Array.isArray(Wt)?Wt:[Wt]).filter(Boolean).forEach(Ie=>{let ia=M.getQueryData(Ie.queryKey);X.push([Ie.queryKey,ia]),M.setQueryData(Ie.queryKey,ra=>Ie.updater(ra))}),$n=async()=>{let Wt=await W?.(b,{client:M});w&&yt(typeof w=="function"?w(b):w);try{let Ie=await m(b);return await Y?.(Ie,b,Wt),k&&await M.invalidateQueries(k),h({type:"mutation-success"}),Ie}catch(Ie){for(let[ia,ra]of X)M.setQueryData(ia,ra);throw await D?.(Ie,b,Wt),h({type:"mutation-error",error:Ie}),Ie}};return!ua()&&G==="offlineFirst"?(V.push($n),h({type:"mutation-queued"}),Promise.resolve({queued:!0})):$n()},infiniteQuery({queryKey:m,queryFn:b,initialPageParam:w=0,getNextPageParam:k,...W}){let[Y,D]=M.query({queryKey:m,...W,queryFn:async G=>({pages:[await b({...G,pageParam:w})],pageParams:[w]})});return[Y,{...D,fetchNextPage:async()=>{let G=Y.data.peek()??{pages:[],pageParams:[]},X=k?.(G.pages.at(-1),G.pages);if(X==null)return;let yt=await b({queryKey:m,pageParam:X,signal:new AbortController().signal});return M.setQueryData(m,{pages:[...G.pages,yt],pageParams:[...G.pageParams,X]}),yt}}]},dehydrate({shouldDehydrate:m=w=>w.state.status.peek()==="success",version:b=1}={}){return{version:b,timestamp:Date.now(),queries:[...r.values()].filter(m).filter(w=>Ur(w.state.data.peek())).map(w=>({key:w.key,data:w.state.data.peek(),updatedAt:w.state.updatedAt.peek(),staleTime:w.options.staleTime,tags:[...w.tags]}))}},hydrate(m,{version:b=1}={}){if(!m||m.version!==b||!Array.isArray(m.queries))return!1;for(let w of m.queries){let k=r.get(Re(w.key))??S({queryKey:w.key,staleTime:w.staleTime,tags:w.tags});ae(()=>{k.state.data.value=w.data,k.state.status.value="success",k.state.updatedAt.value=w.updatedAt,k.state.isStale.value=Date.now()-w.updatedAt>=k.options.staleTime}),k.invalidated=k.state.isStale.peek()}return h({type:"hydrate"}),!0},persist({storage:m=typeof localStorage>"u"?null:localStorage,key:b="mini-react-query",version:w=1}={}){if(!m)throw new Error("persist: a storage adapter is required");let k=!1,W=async()=>{let D=JSON.stringify(M.dehydrate({version:w}));return m.set?m.set(b,D):m.setItem(b,D)},Y=M.subscribe(()=>{k||(k=!0,queueMicrotask(()=>{k=!1,W().catch(()=>{})}))});return{restore:async()=>{let D=await(m.get?m.get(b):m.getItem(b));return D?M.hydrate(JSON.parse(D),{version:w}):!1},save:W,dispose:Y}},sync(m="mini-react-query"){return typeof BroadcastChannel>"u"?()=>{}:(c?.close(),c=new BroadcastChannel(m),c.onmessage=b=>{if(b.data?.type!=="invalidate")return;let w=b.data.hash?k=>k.hash===b.data.hash:b.data.filter;for(let k of r.values())Ln(k,w)&&C(k);se(w)},()=>{c?.close(),c=null})},subscribe(m){return d.add(m),()=>d.delete(m)},getDebugSnapshot(){return[...r.values()].map(m=>({key:m.key,observers:m.observers,status:m.state.status.peek(),fetchStatus:m.state.fetchStatus.peek(),updatedAt:m.state.updatedAt.peek(),stale:m.state.isStale.peek(),tags:[...m.tags]}))},async fetchJSON(m,b={},{queryKey:w=["GET",m,b.body??null],...k}={}){let W=Re(w);return M.fetchQuery({queryKey:w,...k,queryFn:async({signal:Y})=>{let D=new Headers(b.headers),G=l.get(W);G?.etag&&D.set("If-None-Match",G.etag);let X=await fetch(m,{...b,headers:D,signal:Y});if(X.status===304&&G)return M.getQueryData(w);if(!X.ok)throw new Error(`HTTP ${X.status}`);let yt=X.headers.get("cache-control")?.match(/max-age=(\d+)/)?.[1];if(yt){let $n=r.get(W);$n&&($n.options.staleTime=Number(yt)*1e3)}return l.set(W,{etag:X.headers.get("etag")}),X.json()}})},destroy(){u=!0;for(let m of r.values())m.ctrl?.abort(),F(m),J(m);c?.close(),d.clear()}},V=[],rt=()=>{a&&se()},xt=()=>{for(o&&se();V.length;)V.shift()().catch(()=>{})};typeof window<"u"&&(window.addEventListener("focus",rt),window.addEventListener("online",xt));let vt=M.destroy;return M.destroy=()=>{u||(typeof window<"u"&&(window.removeEventListener("focus",rt),window.removeEventListener("online",xt)),vt())},M},Cc=Wr(),$o=({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,l=new Map,c=(h,x)=>{if(a)return a.get(h);let v=r.get(h);return v&&Date.now()-v.ts<x?v.data:void 0},u=async(h,x,v)=>{if(a)return a.set(h,x,{ttl:v});r.set(h,{data:x,ts:Date.now()})};return{get:(h,x,v={})=>{let C=v.ttl??t,F=e&&v.cache!==!1&&C!==0,ke=v.dedupe??o;if(ke&&d.has(h))return d.get(h);let J=()=>{let N=l.get(h)??0,S=(_,se)=>Promise.resolve(x()).then(async M=>(F&&(l.get(h)??0)===N&&await u(h,M,C),M)).catch(M=>{if(_>0&&M?.name!=="AbortError")return new Promise(V=>setTimeout(V,se)).then(()=>S(_-1,se*2));throw M});return S(v.retry??n,s)},ne=N=>(ke&&(d.set(h,N),N.finally(()=>{d.get(h)===N&&d.delete(h)}).catch(()=>{})),N);if(!F)return ne(J());if(!a){let N=c(h,C);return N!==void 0?Promise.resolve(N):ne(J())}return ne(Promise.resolve(c(h,C)).then(N=>N!==void 0?N:J()))},invalidate:h=>{if(h!==void 0)l.set(h,(l.get(h)??0)+1);else{for(let x of r.keys())l.set(x,(l.get(x)??0)+1);for(let x of d.keys())l.set(x,(l.get(x)??0)+1)}if(a)return h===void 0?a.clear():a.delete(h);h===void 0?r.clear():r.delete(h)}}},Ac=new TextEncoder,jc=new TextDecoder,So=(e,t="kv")=>{let n=null,s=()=>n?Promise.resolve(n):new Promise((o,r)=>{let d=indexedDB.open(e,1);d.onupgradeneeded=l=>l.target.result.createObjectStore(t),d.onsuccess=l=>{n=l.target.result,o(n)},d.onerror=l=>r(l.target.error)}),a=async(o,r)=>{let d=await s();return new Promise((l,c)=>{let u=d.transaction(t,o),h=r(u.objectStore(t));h.onsuccess=()=>l(h.result),h.onerror=()=>c(h.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",l=>l.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 R=K(()=>{Lo()});var No={};as(No,{AGENT_DEFAULT_MODEL:()=>Ao,AGENT_LABELS:()=>te,AGENT_MODELS:()=>ha,LOW_TURN_THRESHOLD:()=>ga,activityHits:()=>Oe,activityLoading:()=>Qe,addCustomModel:()=>Mn,agentFilter:()=>de,agentFilters:()=>$t,agentsMeta:()=>kt,chatDensity:()=>Ve,collapsedFolders:()=>Jt,ctx:()=>f,currentAgent:()=>I,currentEffort:()=>ie,currentModel:()=>P,currentPermission:()=>Ee,currentProject:()=>E,currentTab:()=>U,expandedFolders:()=>zt,favoritesOnly:()=>Ae,filesPath:()=>z,filesRoot:()=>ce,filteredSessions:()=>ct,getCustomModels:()=>ls,getDefaultEffort:()=>lt,getDefaultModel:()=>qe,getEffortsForModel:()=>In,getModelsForAgent:()=>Xe,getSavedModel:()=>Co,getSessionMeta:()=>Qt,gitRoot:()=>be,hubMachineReady:()=>Be,hubMode:()=>A,isProcessing:()=>he,machinesList:()=>Q,metaKey:()=>oe,projectGroups:()=>St,removeCustomModel:()=>ya,selectedMachineId:()=>j,sessionDisplayTitle:()=>Ye,sessionFilter:()=>fe,sessionMetaMap:()=>T,sessionSearch:()=>me,sessionSort:()=>Eo,sessionsData:()=>O,setAgent:()=>Fe,setChatDensity:()=>xa,setCurrentModel:()=>le,setSelectedMachine:()=>ge,showHiddenOnly:()=>je,sidebarView:()=>Je,timeRange:()=>rs,viewingFile:()=>re,workspacesData:()=>ee,wsStatus:()=>ze});function Mo(){try{let e=JSON.parse(localStorage.getItem(To)||"{}");return e&&typeof e=="object"?e:{}}catch{return{}}}function Io(e,t=f.sessionId,n=f.machineId){if(!t)return"";let s=(e||"claude").toLowerCase();return`${n||""}:${s}:${t}`}function Co(e,t=f.sessionId,n=f.machineId){let s=Io(e,t,n);if(!s)return null;let a=Mo()[s];return typeof a=="string"&&a.trim()?a:null}function le(e,t=I.peek(),n=f.sessionId,s=f.machineId){let a=String(e||"").trim();if(!a)return;let o=Io(t,n,s);if(o){let r=Mo();r[o]=a,localStorage.setItem(To,JSON.stringify(r))}P.value=a}function ge(e){let t=e||null;j.value=t,f.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function oe(e,t,n){let s=`${e||"claude"}:${t}`;return n||f?.machineId?`${n||f.machineId}:${s}`:s}function Qt(e,t,n){return T.peek()?.[oe(e,t,n)]||{favorite:!1,notes:"",title:"",hidden:!1}}function Ye(e,{preferSnippet:t=!1}={}){if(!e)return"Session";if(t&&e.snippet)return e.snippet;let s=(Qt(e.agent,e.sessionId,e.machineId).title||"").trim();return s||e.display||e.sessionId?.slice(0,8)||"Session"}function xa(e){let t=["clean","normal","full"].includes(e)?e:"normal";Ve.value=t,localStorage.setItem("chatDensity",t),document.getElementById("messages")?.setAttribute("data-density",t)}function Kr(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 va(){try{let e=localStorage.getItem(jo);if(!e)return{};let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function Do(e){localStorage.setItem(jo,JSON.stringify(e))}function ls(e){let t=(e||"claude").toLowerCase(),n=va()[t];return Array.isArray(n)?n.filter(Boolean).map(String):[]}function Mn(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim();if(!s)return!1;let a=va(),o=Array.isArray(a[n])?[...a[n]]:[];return o.includes(s)||o.push(s),a[n]=o,Do(a),!0}function ya(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim(),a=va(),o=Array.isArray(a[n])?a[n].filter(r=>r!==s):[];return a[n]=o,Do(a),!0}function Xe(e){let t=(e||"claude").toLowerCase(),n=kt.peek()?.defaults?.[t],s=n?.models?.length?n.models.map(Kr).filter(Boolean):(ha[t]||ha.claude).map(r=>({...r})),a=ls(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 l=String(d.label||d.value);return{...d,custom:!0,label:l.includes("\u2605")?l:`${l} \u2605`}});continue}o.add(r),s.push({value:r,label:`${r} \u2605`,custom:!0})}return s}function qe(e){let t=(e||"claude").toLowerCase(),n=kt.peek()?.defaults?.[t];return n?.model?String(n.model):Ao[t]||Xe(t)[0]?.value||"claude-sonnet-4-5"}function In(e,t){let s=Xe(e).find(o=>o.value===t);if(s?.efforts?.length)return s.efforts;let a=kt.peek()?.defaults?.[(e||"claude").toLowerCase()];return a?.efforts?.length?a.efforts.map(String):["low","medium","high","xhigh","max"]}function lt(e,t){let n=(e||"claude").toLowerCase(),s=kt.peek()?.defaults?.[n];if(s?.effortDefault)return String(s.effortDefault);let o=Xe(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 Fe(e){let t=(e||"claude").toLowerCase();I.value=t,localStorage.setItem("agent",t),Ee.value="bypassPermissions";let n=typeof document>"u"?null:document.getElementById("sel-permission");n&&(n.value=Ee.peek());let s=Co(t);s?P.value=s:le(qe(t),t);let a=lt(t,P.peek());a?ie.value=a:t!=="grok"&&t!=="gemini"&&(ie.value="")}function zr(e,t){return!t||t==="all"?!0:(e.agent||"claude")===t}function Jr(e,t){if(!t)return!0;let n=T.value?.[oe(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 ba(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}var O,ee,fe,me,Eo,zt,Jt,z,re,E,U,he,ze,To,Gr,I,P,ie,Ee,ce,be,kt,Je,de,$t,rs,Oe,Qe,T,Ae,je,ga,Ve,A,Q,j,Be,f,te,ha,Ao,jo,ct,St,B=K(()=>{R();O=$([]),ee=$([]),fe=$(null),me=$(""),Eo=$("time"),zt=$(new Set),Jt=$(new Set),z=$(""),re=$(null),E=$(null),U=$("chat"),he=$(!1),ze=$("idle"),To="modelBySession",Gr=localStorage.getItem("agent")||"claude";I=$(Gr),P=$("claude-sonnet-4-5"),ie=$(""),Ee=$("bypassPermissions"),ce=$(""),be=$(""),kt=$(null),Je=$(localStorage.getItem("sidebarView")||"projects"),de=$(localStorage.getItem("agentFilter")||"all"),$t=$((()=>{try{let e=JSON.parse(localStorage.getItem("agentFilters")||"[]");return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}})()),rs=$(localStorage.getItem("timeRange")||"14"),Oe=$(null),Qe=$(!1),T=$({}),Ae=$(localStorage.getItem("favoritesOnly")==="1"),je=$(localStorage.getItem("showHiddenOnly")==="1"),ga=2,Ve=$(localStorage.getItem("chatDensity")||"normal"),A=$(!1),Q=$([]),j=$(null),Be=$(!1),f={token:localStorage.getItem("token"),sessionId:null,agent:null,machineId:null,ws:null,shellBubble:null,configDir:null};te={claude:"Claude",codex:"Codex",grok:"Grok",gemini:"Gemini",cursor:"Cursor"},ha={claude:[{value:"claude-sonnet-4-5",label:"sonnet-4-5"},{value:"claude-sonnet-4-6",label:"sonnet-4-6"},{value:"claude-opus-4-5",label:"opus-4-5"},{value:"claude-haiku-4-5",label:"haiku-4-5"}],codex:[{value:"gpt-5.4",label:"gpt-5.4"},{value:"gpt-5.3",label:"gpt-5.3"},{value:"gpt-5.2",label:"gpt-5.2"},{value:"o3",label:"o3"},{value:"o4-mini",label:"o4-mini"},{value:"codex-mini-latest",label:"codex-mini"}],grok:[{value:"grok-4.5",label:"grok-4.5"},{value:"grok-4",label:"grok-4"},{value:"grok-3",label:"grok-3"},{value:"grok-3-mini",label:"grok-3-mini"}],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"}]},Ao={claude:"claude-sonnet-4-5",codex:"gpt-5.4",grok:"grok-4.5",gemini:"gemini-3.7-flash-high",cursor:"auto"};jo="customModelsByAgent";ct=ma(()=>{let e=me.value.toLowerCase().trim(),t=Eo.value,n=de.value,s=$t.value,a=Ae.value,o=je.value,r=T.value,d=Oe.value,l=d?.results?.length&&e?ba(d.results):ba(O.value),c=j.value;return A.value&&c&&(l=l.filter(u=>u&&(!u.machineId||u.machineId===c))),l=l.filter(u=>u&&(s.length?s.includes(u.agent||"claude"):zr(u,n))),o?l=l.filter(u=>u&&r?.[oe(u.agent,u.sessionId,u.machineId)]?.hidden):l=l.filter(u=>u&&!r?.[oe(u.agent,u.sessionId,u.machineId)]?.hidden),a&&(l=l.filter(u=>u&&r?.[oe(u.agent,u.sessionId,u.machineId)]?.favorite)),e&&!(d?.results&&d.q===e)&&(l=l.filter(u=>u&&Jr(u,e))),l=[...l].sort((u,h)=>{let x=r?.[oe(u.agent,u.sessionId,u.machineId)]?.favorite?1:0,v=r?.[oe(h.agent,h.sessionId,h.machineId)]?.favorite?1:0;return x!==v?v-x:t==="project"&&(u.cwd||"").localeCompare(h.cwd||"")||h.updatedAt-u.updatedAt}),!e&&!a?l.slice(0,120):l}),St=ma(()=>{let e=ba(ct.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 Cn(e={}){return e.machineId!==void 0?e.machineId:f.machineId||j.peek()||null}function Vr(e){let t=e.split("?")[0];return t==="/api/hub"||t==="/api/machines"||t==="/api/notifications"||t==="/api/notifications/read"||t==="/api/ai/notes"||t.startsWith("/api/ai/notes/")||t.startsWith("/api/auth/")}async function y(e,t,n,s,a={}){let o=Cn(a),r={"Content-Type":"application/json",...f.token?{Authorization:`Bearer ${f.token}`}:{}};A.peek()&&o&&!Vr(t)&&(r["X-Machine-Id"]=o);let d=a.etag===!0?`${f.token||""}:${o||""}:${t}`:a.etag||null;if(e.toUpperCase()==="GET"&&d){let u=_o.get(d);u&&(r["If-None-Match"]=u)}let l=async()=>{let u=await fetch(t,{method:e,signal:s,headers:r,...n!==void 0?{body:JSON.stringify(n)}:{}});if(u.status===304)return wa;let h=await u.json().catch(()=>({}));if(!u.ok)throw new Error(h.error||`HTTP ${u.status}`);if(d){let x=u.headers.get("ETag");x&&_o.set(d,x)}return h};if(e.toUpperCase()!=="GET"||s||a.dedupe===!1)return l();let c=`${f.token||""}:${o||""}:${t}`;return Qr.get(c,l)}function Vt(e){return f.ws?.readyState===WebSocket.OPEN?(f.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||cs.push(e),!1)}function Po(){for(;cs.length&&f.ws?.readyState===WebSocket.OPEN;)f.ws.send(JSON.stringify(cs.shift()))}function Ho(){cs.length=0}function Ro(e={}){let t=new URLSearchParams(e);f.token&&t.set("token",f.token);let n=Cn();return A.peek()&&n&&t.set("machine",n),t.toString()}function dt(e={}){let t={...e};f.token&&(t.Authorization=`Bearer ${f.token}`);let n=Cn();return A.peek()&&n&&(t["X-Machine-Id"]=n),t}async function Yt(){try{let e=await fetch("/api/hub");if(!e.ok)return A.value=!1,!1;let t=await e.json();if(t?.hub)return A.value=!0,t}catch{}return A.value=!1,!1}var Qr,_o,wa,cs,ue=K(()=>{B();R();Qr=$o({cache:!1,dedupe:!0,retry:0}),_o=new Map,wa=Symbol("not-modified");cs=[]});function Lt(e,t){e&&(t?e.setAttribute("inert",""):e.removeAttribute("inert"))}function Zt(e){return!e||e.classList.contains("hidden")?!0:e.style.display==="none"}function xe(){let e=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,t=document.getElementById("sidebar");if(t){let s=!e||t.classList.contains("open");Lt(t,!s)}Lt(document.getElementById("welcome"),Zt(document.getElementById("welcome"))),Lt(document.getElementById("auth-screen"),Zt(document.getElementById("auth-screen"))),Lt(document.getElementById("chat-opts"),Zt(document.getElementById("chat-opts"))),Lt(document.getElementById("machine-picker"),Zt(document.getElementById("machine-picker")));for(let s of["files","git","shell","memory"]){let a=document.getElementById(`tab-${s}`);Lt(a,Zt(a))}let n=document.getElementById("tab-chat");n&&Lt(n,Zt(n))}function An(){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 Uo(){xe(),An();let e=window.visualViewport;e&&(e.addEventListener("resize",An),e.addEventListener("scroll",An)),window.addEventListener("resize",()=>{An(),xe()}),window.addEventListener("orientationchange",()=>{setTimeout(()=>{An(),xe()},250)})}var en=K(()=>{});function Et(){try{let e=localStorage.getItem(Wo);return e?JSON.parse(e):null}catch{return null}}function ka(e){try{let n={...Et()||{},...e,updatedAt:Date.now()};localStorage.setItem(Wo,JSON.stringify(n))}catch{}}var Wo,ds=K(()=>{Wo="lastSessionContext"});async function $a(){if(jn&&!(typeof navigator>"u"||!navigator.wakeLock?.request)&&document.visibilityState==="visible"&&!Tt)try{Tt=await navigator.wakeLock.request("screen"),Tt.addEventListener("release",()=>{Tt=null,jn&&document.visibilityState==="visible"&&setTimeout(()=>{$a().catch(()=>{})},500)})}catch{Tt=null}}async function Go(){let e=Tt;if(Tt=null,!!e)try{await e.release()}catch{}}function Ko(e){jn=!!e,jn?$a().catch(()=>{}):Go().catch(()=>{})}function zo(){typeof document>"u"||document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&jn?$a().catch(()=>{}):document.visibilityState==="hidden"&&Go().catch(()=>{})})}var Tt,jn,Jo=K(()=>{Tt=null,jn=!1});function q(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 q(Number(t));let n=Date.parse(t);return Number.isNaN(n)?null:n}return null}function tn(e){let t=q(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 nn(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():te[n]||n;return`<span class="text-[9px] px-1 py-0.5 rounded font-mono font-semibold flex-shrink-0 ${a}" title="${p(te[n]||n)}">${o}</span>`}function sn(e){if(!e)return"";let t="",n=e.split("/").filter(Boolean);return n.length<=3?e:"\u2026/"+n.slice(-2).join("/")}var an=K(()=>{R();B()});function Zr(e){let t=q(e);if(t==null)return"";let n=new Date(t);return Number.isNaN(n.getTime())?"":n.toLocaleString()}function Qo(){let e=i("notifications-badge");if(e){if(!Mt){e.classList.add("hidden"),e.textContent="0";return}e.classList.remove("hidden"),e.textContent=Mt>99?"99+":String(Mt)}}function Xo(){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 Dn(){let e=i("notifications-menu-list"),t=i("notifications-menu-empty");if(!(!e||!t)){if(!$e.length){e.innerHTML="",t.classList.remove("hidden"),Qo();return}t.classList.add("hidden"),e.innerHTML=$e.map(n=>`
2
2
  <button type="button"
3
3
  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"}"
4
4
  data-notification-id="${p(n.id)}"
@@ -17,48 +17,48 @@ var Hr=Object.defineProperty;var K=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(
17
17
  <div class="flex items-center gap-2 mt-1 text-[10px] text-base-content/35">
18
18
  ${n.projectName?`<span class="font-mono truncate">${p(n.projectName)}</span>`:""}
19
19
  ${n.machineId?`<span class="px-1 py-0.5 rounded bg-base-300 text-base-content/55 font-mono">${p(n.machineId)}</span>`:""}
20
- <span>${p(Xr(n.createdAt))}</span>
20
+ <span>${p(Zr(n.createdAt))}</span>
21
21
  </div>
22
22
  </div>
23
23
  </div>
24
- </button>`).join(""),Qo()}}function It(){i("notifications-menu")?.classList.add("hidden"),i("notifications-backdrop")?.classList.add("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","false")}function Zr(){Xo(),i("notifications-menu")?.classList.remove("hidden"),i("notifications-backdrop")?.classList.remove("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","true")}function Zo(){let e=i("notifications-menu");e&&(e.classList.contains("hidden")?Zr():It())}function Vo(e){let t=new Map;for(let n of e||[])n?.id&&t.set(String(n.id),n);$e=[...t.values()].sort((n,s)=>(q(s.createdAt)||0)-(q(n.createdAt)||0)),Mt=$e.reduce((n,s)=>n+(s.unread?1:0),0),Dn()}async function us(){try{let e=await y("GET","/api/notifications?limit=80");$e=Array.isArray(e?.notifications)?e.notifications:[],Mt=Number(e?.unreadCount)||$e.reduce((t,n)=>t+(n.unread?1:0),0),Dn()}catch{$e=[],Mt=0,Dn()}}async function Yo(e=null){let t=await y("POST","/api/notifications/read",e?.length?{ids:e}:{});$e=Array.isArray(t?.notifications)?t.notifications:$e.map(n=>!e||e.includes(n.id)?{...n,unread:!1}:n),Mt=Number(t?.unreadCount)||$e.reduce((n,s)=>n+(s.unread?1:0),0),Dn()}function el(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 ei(e){if(!e?.id)return;if($e.find(n=>n.id===e.id)){Vo([e,...$e.filter(n=>n.id!==e.id)]);return}Vo([e,...$e]),el(e)}function ti(e={}){Sa=typeof e.openSession=="function"?e.openSession:null,Dn(),us(),typeof Notification<"u"&&Notification.permission==="default"&&document.addEventListener("click",()=>{try{Notification.requestPermission().catch(()=>{})}catch{}},{once:!0}),g.on("click","#notifications-backdrop",t=>{t.preventDefault(),t.stopPropagation(),It()}),g.on("click","#btn-notifications-read-all",async t=>{t.preventDefault(),t.stopPropagation(),await Yo()}),g.on("click","[data-notification-id]",async(t,n)=>{let s=n.dataset.notificationId;s&&(await Yo([s]),It(),!(!Sa||!n.dataset.notificationSession)&&Sa(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)||It()}),window.addEventListener("resize",()=>{i("notifications-menu")&&!i("notifications-menu").classList.contains("hidden")&&Xo()})}var $e,Mt,Sa,La=K(()=>{R();ue();an();$e=[],Mt=0,Sa=null});function nl(){let e=globalThis.mermaid;return!e||ni||(e.initialize({startOnLoad:!1,securityLevel:"strict",theme:document.documentElement.dataset.theme==="dark"?"dark":"default",flowchart:{htmlLabels:!1}}),ni=!0),e}function sl(e){let t=String(e||"").replace(/\r\n?/g,`
25
- `).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 ps(e){let t=nl();!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=sl(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-${++tl}`;Promise.resolve(t.parse(a)).then(()=>t.render(r,a)).then(({svg:d,bindFunctions:l})=>{o.innerHTML=d,l?.(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 ni,tl,Ea=K(()=>{ni=!1,tl=0});function al(){return te[I.peek()]||"Assistant"}function li(e){return e.scrollHeight-e.scrollTop-e.clientHeight<80}function Me(e,t){e&&(t||li(e))&&(e.scrollTop=e.scrollHeight)}function ci(e=f.sessionId,t=f.agent,n=f.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function ol(e={}){let t=ci(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(Ta)||"{}")[t])||0}catch{return 0}}function il(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=ci(e.sessionId||f.sessionId,e.agent||f.agent,f.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(Ta)||"{}")||{}}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(Ta,JSON.stringify(s))}catch{}return!0}function mt({sessionId:e=f.sessionId,agent:t=f.agent,machineId:n=f.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function cn(e){let t=mt(e),n=i("chat-input");!t||!n||(n.value?Ct.set(t,n.value):Ct.delete(t))}function dn(e){let t=i("chat-input");t&&(t.value=Ct.get(mt(e))||"",rn(t),on(t.value))}function un(e){let t=mt(e);if(!t)return;let n=nt.filter(a=>a.key===t);if(!n.length)return;nt=nt.filter(a=>a.key!==t);let s=Ct.get(t)||"";Ct.set(t,[s,...n.map(a=>a.text)].filter(Boolean).join(`
24
+ </button>`).join(""),Qo()}}function It(){i("notifications-menu")?.classList.add("hidden"),i("notifications-backdrop")?.classList.add("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","false")}function el(){Xo(),i("notifications-menu")?.classList.remove("hidden"),i("notifications-backdrop")?.classList.remove("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","true")}function Zo(){let e=i("notifications-menu");e&&(e.classList.contains("hidden")?el():It())}function Vo(e){let t=new Map;for(let n of e||[])n?.id&&t.set(String(n.id),n);$e=[...t.values()].sort((n,s)=>(q(s.createdAt)||0)-(q(n.createdAt)||0)),Mt=$e.reduce((n,s)=>n+(s.unread?1:0),0),Dn()}async function us(){try{let e=await y("GET","/api/notifications?limit=80");$e=Array.isArray(e?.notifications)?e.notifications:[],Mt=Number(e?.unreadCount)||$e.reduce((t,n)=>t+(n.unread?1:0),0),Dn()}catch{$e=[],Mt=0,Dn()}}async function Yo(e=null){let t=await y("POST","/api/notifications/read",e?.length?{ids:e}:{});$e=Array.isArray(t?.notifications)?t.notifications:$e.map(n=>!e||e.includes(n.id)?{...n,unread:!1}:n),Mt=Number(t?.unreadCount)||$e.reduce((n,s)=>n+(s.unread?1:0),0),Dn()}function tl(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 ei(e){if(!e?.id)return;if($e.find(n=>n.id===e.id)){Vo([e,...$e.filter(n=>n.id!==e.id)]);return}Vo([e,...$e]),tl(e)}function ti(e={}){Sa=typeof e.openSession=="function"?e.openSession:null,Dn(),us(),typeof Notification<"u"&&Notification.permission==="default"&&document.addEventListener("click",()=>{try{Notification.requestPermission().catch(()=>{})}catch{}},{once:!0}),g.on("click","#notifications-backdrop",t=>{t.preventDefault(),t.stopPropagation(),It()}),g.on("click","#btn-notifications-read-all",async t=>{t.preventDefault(),t.stopPropagation(),await Yo()}),g.on("click","[data-notification-id]",async(t,n)=>{let s=n.dataset.notificationId;s&&(await Yo([s]),It(),!(!Sa||!n.dataset.notificationSession)&&Sa(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)||It()}),window.addEventListener("resize",()=>{i("notifications-menu")&&!i("notifications-menu").classList.contains("hidden")&&Xo()})}var $e,Mt,Sa,La=K(()=>{R();ue();an();$e=[],Mt=0,Sa=null});function sl(){let e=globalThis.mermaid;return!e||ni||(e.initialize({startOnLoad:!1,securityLevel:"strict",theme:document.documentElement.dataset.theme==="dark"?"dark":"default",flowchart:{htmlLabels:!1}}),ni=!0),e}function al(e){let t=String(e||"").replace(/\r\n?/g,`
25
+ `).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 ps(e){let t=sl();!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=al(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-${++nl}`;Promise.resolve(t.parse(a)).then(()=>t.render(r,a)).then(({svg:d,bindFunctions:l})=>{o.innerHTML=d,l?.(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 ni,nl,Ea=K(()=>{ni=!1,nl=0});function ol(){return te[I.peek()]||"Assistant"}function li(e){return e.scrollHeight-e.scrollTop-e.clientHeight<80}function Me(e,t){e&&(t||li(e))&&(e.scrollTop=e.scrollHeight)}function ci(e=f.sessionId,t=f.agent,n=f.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function il(e={}){let t=ci(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(Ta)||"{}")[t])||0}catch{return 0}}function rl(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=ci(e.sessionId||f.sessionId,e.agent||f.agent,f.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(Ta)||"{}")||{}}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(Ta,JSON.stringify(s))}catch{}return!0}function mt({sessionId:e=f.sessionId,agent:t=f.agent,machineId:n=f.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function cn(e){let t=mt(e),n=i("chat-input");!t||!n||(n.value?Ct.set(t,n.value):Ct.delete(t))}function dn(e){let t=i("chat-input");t&&(t.value=Ct.get(mt(e))||"",rn(t),on(t.value))}function un(e){let t=mt(e);if(!t)return;let n=nt.filter(a=>a.key===t);if(!n.length)return;nt=nt.filter(a=>a.key!==t);let s=Ct.get(t)||"";Ct.set(t,[s,...n.map(a=>a.text)].filter(Boolean).join(`
26
26
 
27
- `))}function pn(){he.peek()&&(he.value=!1,pt())}function rl(){si||(si=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(Ge=400,fs({probe:!0}),f.ws?.readyState===WebSocket.OPEN&&f.sessionId))try{f.ws.send(JSON.stringify({type:"subscribe",sessionId:f.sessionId}))}catch{}}),window.addEventListener("online",()=>{Ge=400,fs({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?fs({force:!0}):fs({probe:!0})}))}function Rn(){let e=i("conn-dot");if(!e)return;let t=ze.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 fs(e={}){let t=f.ws?.readyState;if(e.force){Ge=400,st({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&et&&Date.now()-et>45e3)try{f.ws.close()}catch{}else if(e.probe&&f.ws.readyState===WebSocket.OPEN)try{f.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(Ge=Math.min(Ge,800),st({quiet:!0}))}function ll(){tt||(ze.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Rn(),tt=setTimeout(()=>{tt=null,st({quiet:!0})},Ge),Ge=Math.min(Math.round(Ge*1.8),15e3))}function di(){hs&&(clearInterval(hs),hs=null)}function cl(e,t){di(),hs=setInterval(()=>{if(!(t!==_n||e.readyState!==WebSocket.OPEN)){if(et&&Date.now()-et>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&et&&Date.now()-et>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function pt(){let e=he.peek()||!!E.peek()&&ze.peek()==="open";Ko(e)}function dl(){Ge=400,tt&&(clearTimeout(tt),tt=null),gs=!1;let e=f.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{f.ws?.close()}catch{}st({quiet:!1}),L("\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65\u2026")}function st(e={}){rl(),tt&&(clearTimeout(tt),tt=null),e.quiet&&(gs=!0);let t=f.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);ai!==t&&(Ho(),ai=t);let n=++_n;try{f.ws?.close()}catch{}ze.value="connecting",Rn();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;f.token&&a.set("token",f.token),t&&a.set("machine",t),f.sessionId&&a.set("sessionId",f.sessionId),f.agent&&a.set("agent",f.agent);let o=ol();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);f.ws=r,r.addEventListener("open",()=>{if(n===_n){if(Ge=1e3,et=Date.now(),ze.value="open",Rn(),f.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:f.sessionId}))}catch{}Po(),cl(r,n),pt(),bs&&!gs&&L(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),bs=!1,gs=!1}}),r.addEventListener("message",d=>{if(n!==_n)return;let l;try{l=JSON.parse(d.data)}catch{return}if(il(l)){if(l.type==="pong"){et=Date.now();return}if(l.type==="ping"){if(et=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(l.type==="run-status"){l.running?he.value=!0:he.peek()&&(he.value=!1,ui()),pt();return}pi(l)}}),r.addEventListener("close",()=>{n===_n&&(di(),bs=!0,ze.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Rn(),ll())}),r.addEventListener("error",()=>{})}function ui(){if(!nt.length||he.peek())return;let e=mt(),t=nt.findIndex(a=>a.key===e);if(t<0)return;let[n]=nt.splice(t,1),s=i("chat-input");s&&(s.value=n.text,rn(s)),setTimeout(()=>{if(n.key!==mt()||he.peek()){Ct.set(n.key,n.text);return}On()},0)}function Pn(){he.value=!1,pt(),ui()}function pi(e){if(!(e?.sessionId&&f.sessionId&&e.sessionId!==f.sessionId)){if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)pi(t);return}if(e.type==="session-created"){let t=P.peek();f.sessionId=e.sessionId,e.agent&&e.agent!==I.peek()&&qe(e.agent),le(t,e.agent||I.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="notification"&&e.notification){ei(e.notification);return}if(e.type==="result"){Hn(),Nn(),De();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};f.lastUsage=n,f.sessionId&&(f.lastUsageSessionId=f.sessionId),ln(n)}e.is_error||L("\u2713 Done"),Pn();return}if(e.type==="complete"){Hn(),Nn(),De(),!e.aborted&&e.agent==="claude"?L("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?L("\u2713 Done"):e.aborted&&L("\u5DF2\u505C\u6B62")),Pn();return}if(e.type==="error"){Hn(),Nn(),At("error","Error",e.message),Pn();return}if(e.type==="shell-start"){f.shellBubble=null;return}if(e.type==="shell-output"){f.shellBubble||(f.shellBubble=Tl(e.stream==="stderr"?"shell-err":"shell")),Ml(f.shellBubble,e.data);return}if(e.type==="shell-exit"){f.shellBubble=null,L(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),Pn();return}if(e.type==="assistant"){Nn();for(let t of e.message?.content||[])t.type==="text"&&t.text?(De(),At("assistant",al(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&ja(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){fi(e.ts);return}if(e.type==="assistant_delta"){ul(e.data||"");return}if(e.type==="assistant_stream_end"){Nn();return}if(e.type==="thought_stream_start"){mi();return}if(e.type==="thought_delta"){pl(e.data||"");return}if(e.type==="thought_stream_end"){Hn();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>`),Me(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)&&Al(e)}}function fi(e){let t=i("messages");if(!t||(De(),Hn(),Ue&&t.contains(Ue)))return;let n=ys(e||Date.now()),s=ws(e||Date.now());t.insertAdjacentHTML("beforeend",`
27
+ `))}function pn(){he.peek()&&(he.value=!1,pt())}function ll(){si||(si=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(Ke=400,fs({probe:!0}),f.ws?.readyState===WebSocket.OPEN&&f.sessionId))try{f.ws.send(JSON.stringify({type:"subscribe",sessionId:f.sessionId}))}catch{}}),window.addEventListener("online",()=>{Ke=400,fs({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?fs({force:!0}):fs({probe:!0})}))}function Rn(){let e=i("conn-dot");if(!e)return;let t=ze.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 fs(e={}){let t=f.ws?.readyState;if(e.force){Ke=400,st({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&et&&Date.now()-et>45e3)try{f.ws.close()}catch{}else if(e.probe&&f.ws.readyState===WebSocket.OPEN)try{f.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(Ke=Math.min(Ke,800),st({quiet:!0}))}function cl(){tt||(ze.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Rn(),tt=setTimeout(()=>{tt=null,st({quiet:!0})},Ke),Ke=Math.min(Math.round(Ke*1.8),15e3))}function di(){hs&&(clearInterval(hs),hs=null)}function dl(e,t){di(),hs=setInterval(()=>{if(!(t!==_n||e.readyState!==WebSocket.OPEN)){if(et&&Date.now()-et>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&et&&Date.now()-et>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function pt(){let e=he.peek()||!!E.peek()&&ze.peek()==="open";Ko(e)}function ul(){Ke=400,tt&&(clearTimeout(tt),tt=null),gs=!1;let e=f.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{f.ws?.close()}catch{}st({quiet:!1}),L("\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65\u2026")}function st(e={}){ll(),tt&&(clearTimeout(tt),tt=null),e.quiet&&(gs=!0);let t=f.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);ai!==t&&(Ho(),ai=t);let n=++_n;try{f.ws?.close()}catch{}ze.value="connecting",Rn();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;f.token&&a.set("token",f.token),t&&a.set("machine",t),f.sessionId&&a.set("sessionId",f.sessionId),f.agent&&a.set("agent",f.agent);let o=il();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);f.ws=r,r.addEventListener("open",()=>{if(n===_n){if(Ke=1e3,et=Date.now(),ze.value="open",Rn(),f.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:f.sessionId}))}catch{}Po(),dl(r,n),pt(),bs&&!gs&&L(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),bs=!1,gs=!1}}),r.addEventListener("message",d=>{if(n!==_n)return;let l;try{l=JSON.parse(d.data)}catch{return}if(rl(l)){if(l.type==="pong"){et=Date.now();return}if(l.type==="ping"){if(et=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(l.type==="run-status"){l.running?he.value=!0:he.peek()&&(he.value=!1,ui()),pt();return}pi(l)}}),r.addEventListener("close",()=>{n===_n&&(di(),bs=!0,ze.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Rn(),cl())}),r.addEventListener("error",()=>{})}function ui(){if(!nt.length||he.peek())return;let e=mt(),t=nt.findIndex(a=>a.key===e);if(t<0)return;let[n]=nt.splice(t,1),s=i("chat-input");s&&(s.value=n.text,rn(s)),setTimeout(()=>{if(n.key!==mt()||he.peek()){Ct.set(n.key,n.text);return}On()},0)}function Pn(){he.value=!1,pt(),ui()}function pi(e){if(!(e?.sessionId&&f.sessionId&&e.sessionId!==f.sessionId)){if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)pi(t);return}if(e.type==="session-created"){let t=P.peek();f.sessionId=e.sessionId,e.agent&&e.agent!==I.peek()&&Fe(e.agent),le(t,e.agent||I.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="notification"&&e.notification){ei(e.notification);return}if(e.type==="result"){Hn(),Nn(),De();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};f.lastUsage=n,f.sessionId&&(f.lastUsageSessionId=f.sessionId),ln(n)}e.is_error||L("\u2713 Done"),Pn();return}if(e.type==="complete"){Hn(),Nn(),De(),!e.aborted&&e.agent==="claude"?L("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?L("\u2713 Done"):e.aborted&&L("\u5DF2\u505C\u6B62")),Pn();return}if(e.type==="error"){Hn(),Nn(),At("error","Error",e.message),Pn();return}if(e.type==="shell-start"){f.shellBubble=null;return}if(e.type==="shell-output"){f.shellBubble||(f.shellBubble=Ml(e.stream==="stderr"?"shell-err":"shell")),Il(f.shellBubble,e.data);return}if(e.type==="shell-exit"){f.shellBubble=null,L(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),Pn();return}if(e.type==="assistant"){Nn();for(let t of e.message?.content||[])t.type==="text"&&t.text?(De(),At("assistant",ol(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&ja(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){fi(e.ts);return}if(e.type==="assistant_delta"){pl(e.data||"");return}if(e.type==="assistant_stream_end"){Nn();return}if(e.type==="thought_stream_start"){mi();return}if(e.type==="thought_delta"){fl(e.data||"");return}if(e.type==="thought_stream_end"){Hn();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>`),Me(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)&&jl(e)}}function fi(e){let t=i("messages");if(!t||(De(),Hn(),We&&t.contains(We)))return;let n=ys(e||Date.now()),s=ws(e||Date.now());t.insertAdjacentHTML("beforeend",`
28
28
  <div class="msg-row assistant px-2 live-stream" data-ts="${p(s)}">
29
29
  <div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-base-200 break-words md">
30
30
  <div class="msg-stream-body whitespace-pre-wrap"></div>
31
31
  </div>
32
32
  ${n?`<div class="msg-ts" title="${p(s)}">${p(n)}</div>`:""}
33
- </div>`),Ue=t.lastElementChild,Te=Ue.querySelector(".msg-stream-body"),i("stream-status")?.remove(),Me(t,!0)}function ul(e){e&&(Te||fi(Date.now()),Te&&(Te.textContent+=e,Me(i("messages"),!0)))}function Nn(){if(!Ue||!Te){Ue=null,Te=null;return}let e=Te.textContent||"";e.trim()?(Te.classList.remove("whitespace-pre-wrap"),Te.classList.add("md"),Te.innerHTML=vs(e),vi(Ue)):Ue.remove(),Ue=null,Te=null,i("stream-status")?.remove()}function mi(){let e=i("messages");e&&(ut&&e.contains(ut)||(e.insertAdjacentHTML("beforeend",`
33
+ </div>`),We=t.lastElementChild,Te=We.querySelector(".msg-stream-body"),i("stream-status")?.remove(),Me(t,!0)}function pl(e){e&&(Te||fi(Date.now()),Te&&(Te.textContent+=e,Me(i("messages"),!0)))}function Nn(){if(!We||!Te){We=null,Te=null;return}let e=Te.textContent||"";e.trim()?(Te.classList.remove("whitespace-pre-wrap"),Te.classList.add("md"),Te.innerHTML=vs(e),vi(We)):We.remove(),We=null,Te=null,i("stream-status")?.remove()}function mi(){let e=i("messages");e&&(ut&&e.contains(ut)||(e.insertAdjacentHTML("beforeend",`
34
34
  <div class="msg-row assistant px-2 thought-stream">
35
35
  <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">
36
36
  <div class="font-medium text-base-content/35 mb-0.5">thinking\u2026</div>
37
37
  <div class="thought-body font-mono whitespace-pre-wrap max-h-24 overflow-y-auto opacity-80"></div>
38
38
  </div>
39
- </div>`),ut=e.lastElementChild,We=ut.querySelector(".thought-body"),Me(e,!0)))}function pl(e){e&&(We||mi(),We&&(We.textContent+=e,We.scrollTop=We.scrollHeight,Me(i("messages"),!0)))}function Hn(){if(ut&&We){let e=(We.textContent||"").length;ut.innerHTML=`
40
- <div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}ut=null,We=null}function ml(e){let[t,...n]=e.slice(1).trim().split(/\s+/),s=n.join(" ");switch(t.toLowerCase()){case"agent":{if(!s)return L(`Current agent: ${I.peek()} \xB7 agents: claude | codex | grok | gemini | cursor`),!0;let a=s.toLowerCase();return["claude","codex","grok","gemini","cursor"].includes(a)?(a!==I.peek()?(f.sessionId=null,qe(a),le(Be(a)),document.dispatchEvent(new CustomEvent("agent-changed")),L(`Agent \u2192 ${te[a]} \xB7 model ${P.peek()} \xB7 new session`)):L(`Agent already ${te[a]}`),!0):(L(`Unknown agent "${s}" \xB7 valid: claude | codex | grok | gemini | cursor`),!0)}case"model":{if(!s){let d=I.peek(),l=Xe(d).map(c=>c.value).join(" | ");return L(`Current model: ${P.peek()} (${d})${l?`
41
- Available: ${l}`:""}`),!0}let a=fl[s.toLowerCase()]||s,o=I.peek()||"claude",r=Xe(o).some(d=>d.value===a);return r||Mn(o,a),le(a),L(`Model set to ${a}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let a=In(I.peek(),P.peek());return s?a.includes(s.toLowerCase())?(ie.value=s.toLowerCase(),L(`Effort set to ${s.toLowerCase()}`),!0):(L(`Unknown effort level "${s}" \xB7 valid: ${a.join(" | ")}`),!0):(L(`Current effort: ${ie.peek()||"(default)"} \xB7 levels: ${a.join(" | ")}`),!0)}case"clear":return mn(),f.sessionId=null,f.lastUsage=null,L("Cleared \xB7 new session"),!0;case"usage":return hl(),!0;case"help":return L(`Available slash commands:
39
+ </div>`),ut=e.lastElementChild,Ge=ut.querySelector(".thought-body"),Me(e,!0)))}function fl(e){e&&(Ge||mi(),Ge&&(Ge.textContent+=e,Ge.scrollTop=Ge.scrollHeight,Me(i("messages"),!0)))}function Hn(){if(ut&&Ge){let e=(Ge.textContent||"").length;ut.innerHTML=`
40
+ <div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}ut=null,Ge=null}function hl(e){let[t,...n]=e.slice(1).trim().split(/\s+/),s=n.join(" ");switch(t.toLowerCase()){case"agent":{if(!s)return L(`Current agent: ${I.peek()} \xB7 agents: claude | codex | grok | gemini | cursor`),!0;let a=s.toLowerCase();return["claude","codex","grok","gemini","cursor"].includes(a)?(a!==I.peek()?(f.sessionId=null,Fe(a),le(qe(a)),document.dispatchEvent(new CustomEvent("agent-changed")),L(`Agent \u2192 ${te[a]} \xB7 model ${P.peek()} \xB7 new session`)):L(`Agent already ${te[a]}`),!0):(L(`Unknown agent "${s}" \xB7 valid: claude | codex | grok | gemini | cursor`),!0)}case"model":{if(!s){let d=I.peek(),l=Xe(d).map(c=>c.value).join(" | ");return L(`Current model: ${P.peek()} (${d})${l?`
41
+ Available: ${l}`:""}`),!0}let a=ml[s.toLowerCase()]||s,o=I.peek()||"claude",r=Xe(o).some(d=>d.value===a);return r||Mn(o,a),le(a),L(`Model set to ${a}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let a=In(I.peek(),P.peek());return s?a.includes(s.toLowerCase())?(ie.value=s.toLowerCase(),L(`Effort set to ${s.toLowerCase()}`),!0):(L(`Unknown effort level "${s}" \xB7 valid: ${a.join(" | ")}`),!0):(L(`Current effort: ${ie.peek()||"(default)"} \xB7 levels: ${a.join(" | ")}`),!0)}case"clear":return mn(),f.sessionId=null,f.lastUsage=null,L("Cleared \xB7 new session"),!0;case"usage":return bl(),!0;case"help":return L(`Available slash commands:
42
42
  /agent [claude|codex|grok|gemini|cursor]
43
43
  /model [haiku|sonnet|opus|<model-id>]
44
44
  /effort [low|medium|high|xhigh|max]
45
45
  /usage
46
46
  /clear
47
- /help`),!0;default:return!1}}function ve(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 hl(){let e=I.peek()||"claude",t=P.peek()||"\u2014",n=f.sessionId,s=[`Agent: ${te[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(f.lastUsage&&(!n||f.lastUsageSessionId===n)){let a=f.lastUsage;s.push(`Last turn: \u2191${ve(a.input_tokens)} \u2193${ve(a.output_tokens)}`+(a.cache_read_input_tokens?` \xB7 ${ve(a.cache_read_input_tokens)} cached`:"")+(a.reasoning_tokens?` \xB7 ${ve(a.reasoning_tokens)} reason`:"")+(a.total_tokens?` \xB7 \u03A3${ve(a.total_tokens)}`:"")+(a.costUSD!=null?` \xB7 $${Number(a.costUSD).toFixed(4)}`:""))}if(!n){L(s.join(`
47
+ /help`),!0;default:return!1}}function ve(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 bl(){let e=I.peek()||"claude",t=P.peek()||"\u2014",n=f.sessionId,s=[`Agent: ${te[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(f.lastUsage&&(!n||f.lastUsageSessionId===n)){let a=f.lastUsage;s.push(`Last turn: \u2191${ve(a.input_tokens)} \u2193${ve(a.output_tokens)}`+(a.cache_read_input_tokens?` \xB7 ${ve(a.cache_read_input_tokens)} cached`:"")+(a.reasoning_tokens?` \xB7 ${ve(a.reasoning_tokens)} reason`:"")+(a.total_tokens?` \xB7 \u03A3${ve(a.total_tokens)}`:"")+(a.costUSD!=null?` \xB7 $${Number(a.costUSD).toFixed(4)}`:""))}if(!n){L(s.join(`
48
48
  `)),Ca("\u25C8 /usage \xB7 no session yet");return}L("Loading usage\u2026");try{let a=new URLSearchParams({sessionId:n,agent:e}),r=(await y("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 l=r.tokensUsed!=null?ve(r.tokensUsed):"\u2014",c=r.windowTokens!=null?ve(r.windowTokens):"\u2014",u=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";s.push(`Context window: ${l} / ${c} (${u})`)}if(r.turnCount!=null&&s.push(`Turns: ${r.turnCount}`),r.toolCallCount!=null&&s.push(`Tools: ${r.toolCallCount}`),r.sessionDurationSeconds!=null){let l=Math.floor(r.sessionDurationSeconds/60),c=Math.round(r.sessionDurationSeconds%60);s.push(`Duration: ${l}m ${c}s`)}if(r.sessionTotals){let l=r.sessionTotals;s.push(`Session totals: \u2191${ve(l.input_tokens)} \u2193${ve(l.output_tokens)}`+(l.cache_read_input_tokens?` \xB7 ${ve(l.cache_read_input_tokens)} cached`:"")+(l.total_tokens?` \xB7 \u03A3${ve(l.total_tokens)}`:"")+(l.costUSD?` \xB7 $${Number(l.costUSD).toFixed(4)}`:""))}if(r.lastTurn&&!f.lastUsage){let l=r.lastTurn;s.push(`Last completed turn: \u2191${ve(l.input_tokens)} \u2193${ve(l.output_tokens)}`+(l.cache_read_input_tokens?` \xB7 ${ve(l.cache_read_input_tokens)} cached`:"")+(l.costUSD!=null?` \xB7 $${Number(l.costUSD).toFixed(4)}`:""))}r.note&&s.push(r.note);let d=i("messages");if(d){let l=[...d.children];for(let c=l.length-1;c>=0;c--)if(l[c].textContent==="Loading usage\u2026"){l[c].remove();break}}L(s.join(`
49
49
  `)),(r.tokensUsed!=null||r.windowTokens!=null)&&Aa({tokensUsed:r.tokensUsed,windowTokens:r.windowTokens,usagePercent:r.usagePercent,model:r.model||t,turnCount:r.turnCount,toolCallCount:r.toolCallCount}),r.sessionTotals?ln(r.sessionTotals):r.lastTurn?ln(r.lastTurn):f.lastUsage&&ln(f.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}}L(`${s.join(`
50
50
  `)}
51
- (usage fetch failed: ${a.message})`)}}function On(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(he.peek()){if(I.peek()==="grok"&&f.sessionId){let s="grok",a=ie.peek()||lt(s,P.peek())||"low",o=Vt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:f.sessionId,options:{agent:s,cwd:E.peek().path,sessionId:f.sessionId,configDir:f.configDir,model:P.peek(),effort:a,...Ee.peek()&&{permissionMode:Ee.peek()},...Ee.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});e.value="",rn(e),on(""),xs(),L(o?"\u5DF2\u52A0\u5165 Grok \u670D\u52A1\u7AEF\u961F\u5217\uFF0C\u5237\u65B0\u9875\u9762\u4E0D\u4F1A\u4E22\u5931":"\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5C06\u5728\u91CD\u8FDE\u540E\u53D1\u9001");return}nt.push({key:mt(),text:t}),e.value="",rn(e),on(""),xs(),L(`\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="",Ct.delete(mt()),rn(e),on(""),xs(),t.startsWith("/")&&ml(t))return;he.value=!0,pt();let n=Date.now();if(bi(t))At("shell","$ Shell",t.slice(1).trim(),{ts:n}),Vt({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:E.peek().path})||L("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{De(),At("user","You",t,{ts:n});let s=I.peek()||"claude",a=ie.peek()||lt(s,P.peek())||(s==="grok"?"low":""),o=Ee.peek();f.sessionId&&le(P.peek(),s,f.sessionId),Vt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:f.sessionId,options:{agent:s,cwd:E.peek().path,sessionId:f.sessionId,configDir:f.configDir,model:P.peek(),...a&&{effort:a},...o&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||L("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function hi(){f.sessionId&&Vt({type:"command",cmd:"turn.interrupt",sessionId:f.sessionId}),nt=nt.filter(e=>e.key!==mt()),Pn()}function on(e){let t=bi(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=te[I.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 bi(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function bl(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function rn(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,bl())+"px"}function ys(e){let t=q(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 ws(e){let t=q(e);return t==null?"":new Date(t).toISOString()}function vl(e,t,n){if(e==="system")return t;let s=ys(n),a=ws(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 yl(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)?vs(t):null,d=t.length>gl,l=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"'}>${l}</div>`;break}case"assistant":{let o=t.length>xl,r=o?`<div class="msg-body">${vs(t)}</div>${s}`:vs(t);a=`<div class="max-w-[min(92%,52rem)] rounded-2xl rounded-tl-sm px-3.5 py-2.5 text-sm bg-base-200 border border-base-300/40 break-words md leading-relaxed${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 vl(e,a,n)}function At(e,t,n,s={}){let a=i("messages");if(!a)return;let o=q(s.ts)??(e==="system"?null:Date.now());a.insertAdjacentHTML("beforeend",yl(e,n,o)),vi(a.lastElementChild),Me(a,e==="user")}function L(e){At("system","",e)}async function wl(e,t){let n=t||`upload-${Date.now()}`,s=await gi(e,n),a=dt({"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 kl(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 gi(e,t){if(!e||!Ma({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,u=>u.charCodeAt(0)),l=kl(d,e.type);return l===(e.type||"image/png")&&!/^(image\/png|image\/jpeg|image\/gif|image\/webp)$/.test(l)?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:l}):e}catch{return e}}function $l(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]!==`
51
+ (usage fetch failed: ${a.message})`)}}function On(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(he.peek()){if(I.peek()==="grok"&&f.sessionId){let s="grok",a=ie.peek()||lt(s,P.peek())||"low",o=Vt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:f.sessionId,options:{agent:s,cwd:E.peek().path,sessionId:f.sessionId,configDir:f.configDir,model:P.peek(),effort:a,...Ee.peek()&&{permissionMode:Ee.peek()},...Ee.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});e.value="",rn(e),on(""),xs(),L(o?"\u5DF2\u52A0\u5165 Grok \u670D\u52A1\u7AEF\u961F\u5217\uFF0C\u5237\u65B0\u9875\u9762\u4E0D\u4F1A\u4E22\u5931":"\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5C06\u5728\u91CD\u8FDE\u540E\u53D1\u9001");return}nt.push({key:mt(),text:t}),e.value="",rn(e),on(""),xs(),L(`\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="",Ct.delete(mt()),rn(e),on(""),xs(),t.startsWith("/")&&hl(t))return;he.value=!0,pt();let n=Date.now();if(bi(t))At("shell","$ Shell",t.slice(1).trim(),{ts:n}),Vt({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:E.peek().path})||L("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{De(),At("user","You",t,{ts:n});let s=I.peek()||"claude",a=ie.peek()||lt(s,P.peek())||(s==="grok"?"low":""),o=Ee.peek();f.sessionId&&le(P.peek(),s,f.sessionId),Vt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:f.sessionId,options:{agent:s,cwd:E.peek().path,sessionId:f.sessionId,configDir:f.configDir,model:P.peek(),...a&&{effort:a},...o&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||L("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function hi(){f.sessionId&&Vt({type:"command",cmd:"turn.interrupt",sessionId:f.sessionId}),nt=nt.filter(e=>e.key!==mt()),Pn()}function on(e){let t=bi(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=te[I.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 bi(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function gl(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function rn(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,gl())+"px"}function ys(e){let t=q(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 ws(e){let t=q(e);return t==null?"":new Date(t).toISOString()}function yl(e,t,n){if(e==="system")return t;let s=ys(n),a=ws(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 wl(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)?vs(t):null,d=t.length>xl,l=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"'}>${l}</div>`;break}case"assistant":{let o=t.length>vl,r=o?`<div class="msg-body">${vs(t)}</div>${s}`:vs(t);a=`<div class="max-w-[min(92%,52rem)] rounded-2xl rounded-tl-sm px-3.5 py-2.5 text-sm bg-base-200 border border-base-300/40 break-words md leading-relaxed${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 yl(e,a,n)}function At(e,t,n,s={}){let a=i("messages");if(!a)return;let o=q(s.ts)??(e==="system"?null:Date.now());a.insertAdjacentHTML("beforeend",wl(e,n,o)),vi(a.lastElementChild),Me(a,e==="user")}function L(e){At("system","",e)}async function kl(e,t){let n=t||`upload-${Date.now()}`,s=await gi(e,n),a=dt({"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 $l(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 gi(e,t){if(!e||!Ma({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,u=>u.charCodeAt(0)),l=$l(d,e.type);return l===(e.type||"image/png")&&!/^(image\/png|image\/jpeg|image\/gif|image\/webp)$/.test(l)?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:l}):e}catch{return e}}function Sl(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]!==`
52
52
  `?`
53
53
  `:"")+t+`
54
- `;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 Ma(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 Sl(e,t){let n=e?.name||t.split("/").pop()||"file";if(Ma(e)){ms+=1;let a=`img${ms}`;return{ref:`![${a}](${t})`,label:a,kind:"image"}}ms+=1;let s=`file${ms}`;return{ref:`[${s}](${t})`,label:s,kind:"file"}}function xs(){for(let e of ft)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}ft.length=0,Ia()}function fn(){xs()}function Ia(){let e=i("chat-attach-bar");if(e){if(!ft.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=ft.map((t,n)=>`
54
+ `;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 Ma(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 Ll(e,t){let n=e?.name||t.split("/").pop()||"file";if(Ma(e)){ms+=1;let a=`img${ms}`;return{ref:`![${a}](${t})`,label:a,kind:"image"}}ms+=1;let s=`file${ms}`;return{ref:`[${s}](${t})`,label:s,kind:"file"}}function xs(){for(let e of ft)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}ft.length=0,Ia()}function fn(){xs()}function Ia(){let e=i("chat-attach-bar");if(e){if(!ft.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=ft.map((t,n)=>`
55
55
  <div class="chat-thumb relative" title="${p(t.ref||t.path)}">
56
56
  ${t.previewUrl?`<img src="${t.previewUrl}" alt="${p(t.label||"img")}">`:`<span class="chat-thumb-path">${p(t.label||t.name||"file")}</span>`}
57
57
  <span class="chat-thumb-label">${p(t.label||t.kind||"")}</span>
58
58
  <button type="button" class="chat-thumb-x" data-rm-attach="${n}" aria-label="remove">\u2715</button>
59
- </div>`).join("")}}async function Ll(e){if(!e)return;let t=e.name||`upload-${Date.now()}`,n=await gi(e,t),s=await wl(n,t),{ref:a,label:o,kind:r}=Sl(e,s),d="";if(r==="image")try{d=URL.createObjectURL(n)}catch{}return ft.push({path:s,ref:a,label:o,kind:r,name:t,previewUrl:d}),Ia(),$l(i("chat-input"),a),s}async function ks(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 Ll(s)}catch(a){L(`\u4E0A\u4F20\u5931\u8D25 ${s.name||"file"}: ${a.message}`)}}finally{n&&(n.disabled=!1,n.focus())}}function El(){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",()=>ks(t.files)),t.click()}function xi(){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 l of a)if(l.kind==="file"){let c=l.getAsFile();c&&o.push(c)}let r=o.filter(l=>Ma(l)),d=r.length?r:o;d.length&&(e.preventDefault(),await ks(d))}),!oi&&(oi=!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 ks(n))}))}function Ze(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function Ca(e){let t=i("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
59
+ </div>`).join("")}}async function El(e){if(!e)return;let t=e.name||`upload-${Date.now()}`,n=await gi(e,t),s=await kl(n,t),{ref:a,label:o,kind:r}=Ll(e,s),d="";if(r==="image")try{d=URL.createObjectURL(n)}catch{}return ft.push({path:s,ref:a,label:o,kind:r,name:t,previewUrl:d}),Ia(),Sl(i("chat-input"),a),s}async function ks(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 El(s)}catch(a){L(`\u4E0A\u4F20\u5931\u8D25 ${s.name||"file"}: ${a.message}`)}}finally{n&&(n.disabled=!1,n.focus())}}function Tl(){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",()=>ks(t.files)),t.click()}function xi(){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 l of a)if(l.kind==="file"){let c=l.getAsFile();c&&o.push(c)}let r=o.filter(l=>Ma(l)),d=r.length?r:o;d.length&&(e.preventDefault(),await ks(d))}),!oi&&(oi=!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 ks(n))}))}function Ze(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function Ca(e){let t=i("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
60
60
  <span class="token-bar-mark">\u25C8</span><span class="token-bar-text">${p(e)}</span>
61
- </div>`),Me(t))}function ln(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 ${Ze(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${Ze(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${Ze(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,l=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",c=s?` \xB7 \u03A3${Ze(s)}`:"";Ca(`\u2191${Ze(t)} \u2193${Ze(n)}${a}${o}${r}${c}${l}`)}function Aa(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 ${Ze(t)} / ${Ze(n)}`):t!=null&&a.push(`context ${Ze(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`),Ca(`\u25A3 ${a.join(" \xB7 ")}`)}function mn(){let e=i("messages"),t=i("permission-requests");e&&(e.innerHTML=""),t&&(t.innerHTML=""),f.shellBubble=null,Fe=null,Ue=Te=null,ut=We=null}function Tl(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>`),Me(t),t.lastElementChild}function Ml(e,t){e&&(e.textContent+=t,Me(e.closest("#messages")))}function Il(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,Ve.peek()==="full"?120:80);return{inputStr:t,preview:s}}function ii(e,{inBatch:t=!1}={}){let{inputStr:n,preview:s}=Il(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
61
+ </div>`),Me(t))}function ln(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 ${Ze(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${Ze(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${Ze(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,l=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",c=s?` \xB7 \u03A3${Ze(s)}`:"";Ca(`\u2191${Ze(t)} \u2193${Ze(n)}${a}${o}${r}${c}${l}`)}function Aa(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 ${Ze(t)} / ${Ze(n)}`):t!=null&&a.push(`context ${Ze(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`),Ca(`\u25A3 ${a.join(" \xB7 ")}`)}function mn(){let e=i("messages"),t=i("permission-requests");e&&(e.innerHTML=""),t&&(t.innerHTML=""),f.shellBubble=null,Ue=null,We=Te=null,ut=Ge=null}function Ml(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>`),Me(t),t.lastElementChild}function Il(e,t){e&&(e.textContent+=t,Me(e.closest("#messages")))}function Cl(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,Ve.peek()==="full"?120:80);return{inputStr:t,preview:s}}function ii(e,{inBatch:t=!1}={}){let{inputStr:n,preview:s}=Cl(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
62
62
  <div class="flex items-center gap-1.5 text-xs font-mono">
63
63
  <span class="text-warning">\u26A1</span>
64
64
  <span class="text-warning font-semibold">${p(e.name||"tool")}</span>
@@ -66,21 +66,21 @@ Available: ${l}`:""}`),!0}let a=fl[s.toLowerCase()]||s,o=I.peek()||"claude",r=Xe
66
66
  <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>
67
67
  </div>
68
68
  <div class="tool-detail">${p(n)}</div>
69
- </div>`}function Cl(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>
69
+ </div>`}function Al(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>
70
70
  <span class="font-semibold text-base-content/70">${e.count} tool${e.count===1?"":"s"}</span>
71
71
  <span class="text-base-content/40 truncate flex-1">${p(n)}</span>
72
- <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function De(){Fe=null}function ja(e,t={}){let n=i("messages");if(!n)return;let s=Ve.peek()||"normal",a=q(t.ts);if(s==="clean"){if(!Fe||!n.contains(Fe.el)){let l=ys(a),c=ws(a);n.insertAdjacentHTML("beforeend",`
72
+ <span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function De(){Ue=null}function ja(e,t={}){let n=i("messages");if(!n)return;let s=Ve.peek()||"normal",a=q(t.ts);if(s==="clean"){if(!Ue||!n.contains(Ue.el)){let l=ys(a),c=ws(a);n.insertAdjacentHTML("beforeend",`
73
73
  <div class="msg-row assistant px-2" data-ts="${p(c)}">
74
74
  <div class="tool-batch w-full max-w-[96%] px-2 py-1.5">
75
75
  <div class="tool-batch-summary flex items-center gap-1.5 text-xs font-mono"></div>
76
76
  <div class="tool-batch-list"></div>
77
77
  </div>
78
78
  ${l?`<div class="msg-ts" title="${p(c)}">${p(l)}</div>`:""}
79
- </div>`),Fe={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}Fe.names.push(e.name||"tool"),Fe.count++,Fe.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",ii(e,{inBatch:!0})),Cl(Fe),Me(n);return}Fe=null;let o=ys(a),r=ws(a);n.insertAdjacentHTML("beforeend",`
79
+ </div>`),Ue={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}Ue.names.push(e.name||"tool"),Ue.count++,Ue.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",ii(e,{inBatch:!0})),Al(Ue),Me(n);return}Ue=null;let o=ys(a),r=ws(a);n.insertAdjacentHTML("beforeend",`
80
80
  <div class="msg-row assistant px-2" data-ts="${p(r)}">
81
81
  <div class="w-full max-w-[96%]">${ii(e)}</div>
82
82
  ${o?`<div class="msg-ts" title="${p(r)}">${p(o)}</div>`:""}
83
- </div>`),Me(n)}function $s(){let e=i("messages");e&&e.setAttribute("data-density",Ve.peek()||"normal")}function Al(e){let t=e.request_id||e.requestId;if(!t||i(`perm-${t}`))return;let n=e.tool_input?JSON.stringify(e.tool_input).slice(0,200):"";i("permission-requests")?.insertAdjacentHTML("beforeend",`
83
+ </div>`),Me(n)}function $s(){let e=i("messages");e&&e.setAttribute("data-density",Ve.peek()||"normal")}function jl(e){let t=e.request_id||e.requestId;if(!t||i(`perm-${t}`))return;let n=e.tool_input?JSON.stringify(e.tool_input).slice(0,200):"";i("permission-requests")?.insertAdjacentHTML("beforeend",`
84
84
  <div id="perm-${t}" class="perm-banner mx-3 mb-2 rounded-lg border border-warning/25 bg-warning/8 p-3">
85
85
  <div class="text-xs text-warning font-semibold mb-1">\u26A0\uFE0F Permission Required</div>
86
86
  <div class="font-mono text-xs text-base-content/60 break-all mb-2">
@@ -90,16 +90,16 @@ Available: ${l}`:""}`),!0}let a=fl[s.toLowerCase()]||s,o=I.peek()||"claude",r=Xe
90
90
  <button class="btn btn-success btn-xs" data-perm-id="${t}" data-perm-allow="1">Allow</button>
91
91
  <button class="btn btn-error btn-xs" data-perm-id="${t}" data-perm-allow="0">Deny</button>
92
92
  </div>
93
- </div>`),i("messages").scrollTop=999999}function jl(){if(ri||typeof marked>"u")return;let e=s=>String(s??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=(s,a)=>{let o=String(a||"").trim().split(/\s+/)[0]||"",r=o||"text",d=o?`language-${p(o)}`:"";return`<div class="code-block">
93
+ </div>`),i("messages").scrollTop=999999}function Dl(){if(ri||typeof marked>"u")return;let e=s=>String(s??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;"),t=(s,a)=>{let o=String(a||"").trim().split(/\s+/)[0]||"",r=o||"text",d=o?`language-${p(o)}`:"";return`<div class="code-block">
94
94
  <div class="code-block-header">
95
95
  <span class="code-block-lang">${p(r)}</span>
96
96
  <button type="button" class="code-copy" data-copy="1" title="Copy code">Copy</button>
97
97
  </div>
98
98
  <pre><code class="hljs ${d}">${e(s)}</code></pre>
99
- </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>`}};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)}ri=!0}function vs(e){if(typeof marked>"u")return p(e);try{return jl(),marked.parse(String(e??""),{breaks:!0,gfm:!0})}catch{return p(e)}}function Dl(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 vi(e){Dl(e),ps(e)}function yi(){$s(),zo(),Le(ze,s=>{Rn(),pt();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"&&!bs){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}),Le(E,()=>pt()),g.on("click","#btn-refresh-conn, #ws-banner-retry",s=>{s.preventDefault(),dl()}),Le(he,s=>{i("send-btn")?.classList.toggle("hidden",s),i("stop-btn")?.classList.toggle("hidden",!s);let a=i("chat-input");a&&(a.disabled=!1,s?a.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":on(a.value||""));let o=i("messages");if(!o)return;let r=i("typing-indicator");s&&!r?(o.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>'),Me(o)):s||(r?.remove(),De()),pt()}),Le(Ve,()=>$s()),g.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(),On())}),g.on("submit","#chat-form",s=>{s.preventDefault(),On()}),g.on("input","#chat-input",(s,a)=>{rn(a),on(a.value)}),g.on("click","#btn-attach",s=>{s.preventDefault(),El()}),g.on("change","#chat-file-input",(s,a)=>{let o=a?.files;o?.length&&ks(o),a&&(a.value="")}),g.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>=ft.length)return;let r=ft[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,`
99
+ </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>`}};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)}ri=!0}function vs(e){if(typeof marked>"u")return p(e);try{return Dl(),marked.parse(String(e??""),{breaks:!0,gfm:!0})}catch{return p(e)}}function Nl(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 vi(e){Nl(e),ps(e)}function yi(){$s(),zo(),Le(ze,s=>{Rn(),pt();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"&&!bs){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}),Le(E,()=>pt()),g.on("click","#btn-refresh-conn, #ws-banner-retry",s=>{s.preventDefault(),ul()}),Le(he,s=>{i("send-btn")?.classList.toggle("hidden",s),i("stop-btn")?.classList.toggle("hidden",!s);let a=i("chat-input");a&&(a.disabled=!1,s?a.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":on(a.value||""));let o=i("messages");if(!o)return;let r=i("typing-indicator");s&&!r?(o.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>'),Me(o)):s||(r?.remove(),De()),pt()}),Le(Ve,()=>$s()),g.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(),On())}),g.on("submit","#chat-form",s=>{s.preventDefault(),On()}),g.on("input","#chat-input",(s,a)=>{rn(a),on(a.value)}),g.on("click","#btn-attach",s=>{s.preventDefault(),Tl()}),g.on("change","#chat-file-input",(s,a)=>{let o=a?.files;o?.length&&ks(o),a&&(a.value="")}),g.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>=ft.length)return;let r=ft[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,`
100
100
 
101
- `),d.dispatchEvent(new Event("input"))),ft.splice(o,1),Ia()}),g.on("click","[data-perm-id]",(s,a)=>{Vt({type:"command",cmd:"approval.respond",requestId:a.dataset.permId,allow:a.dataset.permAllow==="1",sessionId:f.sessionId}),a.closest(".perm-banner")?.remove()}),g.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 l=a.getBoundingClientRect().top;r.scrollTop+=l-d}}),g.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||li(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",()=>e.scrollTo({top:e.scrollHeight,behavior:"smooth"})),s()}g.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"}),g.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)}})}var _n,tt,Ge,et,hs,si,bs,ai,gs,Ta,nt,Ct,Ue,Te,ut,We,fl,gl,xl,ft,ms,oi,Fe,ri,hn=K(()=>{R();B();ue();Jo();La();Ea();an();an();_n=0,tt=null,Ge=1e3,et=0,hs=null,si=!1,bs=!1,ai=null,gs=!1,Ta="hubStreamCursors",nt=[],Ct=new Map;Ue=null,Te=null,ut=null,We=null;fl={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"};gl=200,xl=500;ft=[],ms=0,oi=!1;Fe=null;ri=!1});function ki(e,t){wi=e,Da=t,window.addEventListener("hashchange",()=>{if(Na){Na=!1;return}Si(location.hash.slice(1)||"/")}),Le(U,n=>{f.sessionId&&Bn()})}function _a(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 $i(){Si(location.hash.slice(1)||"/")}function Si(e){let t=_a(e);if(!t){document.dispatchEvent(new CustomEvent("router:home"));return}let{id:n,tab:s,machineId:a,agent:o}=t;!wi||!Da||(n!==f.sessionId?document.dispatchEvent(new CustomEvent("router:session",{detail:{id:n,tab:s,machineId:a,agent:o}})):s&&s!==U.peek()&&Da(s))}function Pa(e){Na=!0,location.hash=e}function Bn(){if(!f.sessionId)return;let e=new URLSearchParams;f.machineId&&e.set("machine",f.machineId),f.agent&&e.set("agent",f.agent);let t=e.size?`?${e}`:"";Pa(`/session/${encodeURIComponent(f.sessionId)}/${encodeURIComponent(U.peek())}${t}`)}function Li(){if(!f.sessionId)return null;let e=new URL(location.href),t=new URLSearchParams;f.machineId&&t.set("machine",f.machineId),f.agent&&t.set("agent",f.agent);let n=t.size?`?${t}`:"";return e.hash=`/session/${encodeURIComponent(f.sessionId)}/${encodeURIComponent(U.peek())}${n}`,e.toString()}var dd,wi,Da,Na,Ss=K(()=>{R();B();dd=ko({"/":()=>{},"/session/*":()=>{},"/session/*/*":()=>{},"*":()=>{}}),wi=null,Da=null,Na=!1});async function Es(){try{return await Ls.get("sessions")??null}catch{return null}}async function Ei(e){try{await Ls.set("sessions",e,{ttl:Nl})}catch{}}async function Ti(){try{return await Ls.get("workspaces")??null}catch{return null}}async function qn(e){try{await Ls.set("workspaces",e,{ttl:3600*1e3})}catch{}}var Ls,Nl,Ts=K(()=>{R();Ls=So("claude-ui"),Nl=300*1e3});function xn(e){if(typeof marked<"u")try{return marked.parse(String(e??""),{breaks:!0,gfm:!0})}catch{}return p(e).replace(/\n/g,"<br>")}function vn(e){e&&(typeof hljs<"u"&&e.querySelectorAll("pre code").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),ps(e))}async function Ba(e,t,n){let s=dt({"Content-Type":"application/json"}),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="",l="message";for(;;){let{done:c,value:u}=await o.read();if(c)break;d+=r.decode(u,{stream:!0});let h=d.split(`
102
- `);d=h.pop()||"";for(let x of h)if(x.startsWith("event:"))l=x.slice(6).trim();else if(x.startsWith("data:")){let v=x.slice(5).trim();if(!v)continue;let C;try{C=JSON.parse(v)}catch{continue}n[l]?.(C),n.any?.(l,C),l="message"}else x.trim()===""&&(l="message")}}function Rl(){return`
101
+ `),d.dispatchEvent(new Event("input"))),ft.splice(o,1),Ia()}),g.on("click","[data-perm-id]",(s,a)=>{Vt({type:"command",cmd:"approval.respond",requestId:a.dataset.permId,allow:a.dataset.permAllow==="1",sessionId:f.sessionId}),a.closest(".perm-banner")?.remove()}),g.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 l=a.getBoundingClientRect().top;r.scrollTop+=l-d}}),g.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||li(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",()=>e.scrollTo({top:e.scrollHeight,behavior:"smooth"})),s()}g.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"}),g.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)}})}var _n,tt,Ke,et,hs,si,bs,ai,gs,Ta,nt,Ct,We,Te,ut,Ge,ml,xl,vl,ft,ms,oi,Ue,ri,hn=K(()=>{R();B();ue();Jo();La();Ea();an();an();_n=0,tt=null,Ke=1e3,et=0,hs=null,si=!1,bs=!1,ai=null,gs=!1,Ta="hubStreamCursors",nt=[],Ct=new Map;We=null,Te=null,ut=null,Ge=null;ml={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"};xl=200,vl=500;ft=[],ms=0,oi=!1;Ue=null;ri=!1});function ki(e,t){wi=e,Da=t,window.addEventListener("hashchange",()=>{if(Na){Na=!1;return}Si(location.hash.slice(1)||"/")}),Le(U,n=>{f.sessionId&&Bn()})}function _a(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 $i(){Si(location.hash.slice(1)||"/")}function Si(e){let t=_a(e);if(!t){document.dispatchEvent(new CustomEvent("router:home"));return}let{id:n,tab:s,machineId:a,agent:o}=t;!wi||!Da||(n!==f.sessionId?document.dispatchEvent(new CustomEvent("router:session",{detail:{id:n,tab:s,machineId:a,agent:o}})):s&&s!==U.peek()&&Da(s))}function Pa(e){Na=!0,location.hash=e}function Bn(){if(!f.sessionId)return;let e=new URLSearchParams;f.machineId&&e.set("machine",f.machineId),f.agent&&e.set("agent",f.agent);let t=e.size?`?${e}`:"";Pa(`/session/${encodeURIComponent(f.sessionId)}/${encodeURIComponent(U.peek())}${t}`)}function Li(){if(!f.sessionId)return null;let e=new URL(location.href),t=new URLSearchParams;f.machineId&&t.set("machine",f.machineId),f.agent&&t.set("agent",f.agent);let n=t.size?`?${t}`:"";return e.hash=`/session/${encodeURIComponent(f.sessionId)}/${encodeURIComponent(U.peek())}${n}`,e.toString()}var ud,wi,Da,Na,Ss=K(()=>{R();B();ud=ko({"/":()=>{},"/session/*":()=>{},"/session/*/*":()=>{},"*":()=>{}}),wi=null,Da=null,Na=!1});async function Es(){try{return await Ls.get("sessions")??null}catch{return null}}async function Ei(e){try{await Ls.set("sessions",e,{ttl:_l})}catch{}}async function Ti(){try{return await Ls.get("workspaces")??null}catch{return null}}async function qn(e){try{await Ls.set("workspaces",e,{ttl:3600*1e3})}catch{}}var Ls,_l,Ts=K(()=>{R();Ls=So("claude-ui"),_l=300*1e3});function xn(e){if(typeof marked<"u")try{return marked.parse(String(e??""),{breaks:!0,gfm:!0})}catch{}return p(e).replace(/\n/g,"<br>")}function vn(e){e&&(typeof hljs<"u"&&e.querySelectorAll("pre code").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),ps(e))}async function Ba(e,t,n){let s=dt({"Content-Type":"application/json"}),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="",l="message";for(;;){let{done:c,value:u}=await o.read();if(c)break;d+=r.decode(u,{stream:!0});let h=d.split(`
102
+ `);d=h.pop()||"";for(let x of h)if(x.startsWith("event:"))l=x.slice(6).trim();else if(x.startsWith("data:")){let v=x.slice(5).trim();if(!v)continue;let C;try{C=JSON.parse(v)}catch{continue}n[l]?.(C),n.any?.(l,C),l="message"}else x.trim()===""&&(l="message")}}function Ol(){return`
103
103
  <div id="meta-agent-panel" class="meta-agent-panel hidden" aria-hidden="true">
104
104
  <div class="meta-agent-backdrop" data-ma-close="1"></div>
105
105
  <div class="meta-agent-sheet">
@@ -283,13 +283,13 @@ Available: ${l}`:""}`),!0}let a=fl[s.toLowerCase()]||s,o=I.peek()||"claude",r=Xe
283
283
  <span class="ma-tool-name">${p(n.name||"tool")}</span>
284
284
  <span class="ma-tool-phase">${p(n.phase||"")}</span>
285
285
  <pre class="ma-tool-args">${p(JSON.stringify(n.args||{},null,0).slice(0,200))}</pre>
286
- </div>`),s.appendChild(a),s.scrollTop=s.scrollHeight,a}function Ci(e,t){let n=e?.querySelector(".ma-bubble");n&&(n.innerHTML=xn(t),vn(n),i("ma-messages").scrollTop=i("ma-messages").scrollHeight)}function Ri(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&&t!=="start"){let r=a.querySelector(".ma-tool-result");r||(r=document.createElement("pre"),r.className="ma-tool-result",a.appendChild(r)),r.textContent=JSON.stringify(n,null,0).slice(0,500)}}function Ol(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=`
286
+ </div>`),s.appendChild(a),s.scrollTop=s.scrollHeight,a}function Ci(e,t){let n=e?.querySelector(".ma-bubble");n&&(n.innerHTML=xn(t),vn(n),i("ma-messages").scrollTop=i("ma-messages").scrollHeight)}function Ri(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&&t!=="start"){let r=a.querySelector(".ma-tool-result");r||(r=document.createElement("pre"),r.className="ma-tool-result",a.appendChild(r)),r.textContent=JSON.stringify(n,null,0).slice(0,500)}}function Bl(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=`
287
287
  <div class="ma-approval-label">\u26A0 Agent \u60F3\u8981\u6267\u884C\u547D\u4EE4\uFF0C\u662F\u5426\u5141\u8BB8\uFF1F</div>
288
288
  <pre class="ma-approval-cmd">${p(s)}</pre>
289
289
  <div class="ma-approval-actions">
290
290
  <button type="button" class="btn btn-xs btn-error" data-approve="0">\u62D2\u7EDD</button>
291
291
  <button type="button" class="btn btn-xs btn-success" data-approve="1">\u5141\u8BB8\u6267\u884C</button>
292
- </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 y("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 Bl(){return Ii+=1,`img${Ii}`}function ql(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 Ai(e,t){let n=dt({"x-filename":t||`paste-${Date.now()}.png`});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=Bl(),r=`[${o}](${a})`,d=i("ma-input");ql(d,(d?.value&&!d.value.endsWith(`
292
+ </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 y("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 ql(){return Ii+=1,`img${Ii}`}function Fl(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 Ai(e,t){let n=dt({"x-filename":t||`paste-${Date.now()}.png`});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=ql(),r=`[${o}](${a})`,d=i("ma-input");Fl(d,(d?.value&&!d.value.endsWith(`
293
293
  `)&&d.value.length?`
294
294
  `:"")+r+`
295
295
  `);let l="";try{l=URL.createObjectURL(e)}catch{}return jt.push({path:a,previewUrl:l,label:o,ref:r}),Fa(),{path:a,ref:r,label:o}}function Fa(){let e=i("ma-attach-bar");if(e){if(!jt.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=jt.map((t,n)=>`
@@ -299,7 +299,7 @@ Available: ${l}`:""}`),!0}let a=fl[s.toLowerCase()]||s,o=I.peek()||"claude",r=Xe
299
299
  <button type="button" class="ma-thumb-x" data-rm-img="${n}">\u2715</button>
300
300
  </div>`).join(""),e.querySelectorAll("[data-rm-img]").forEach(t=>{t.addEventListener("click",()=>{let n=parseInt(t.dataset.rmImg,10),s=jt[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,`
301
301
 
302
- `),a.dispatchEvent(new Event("input"))),jt.splice(n,1),Fa()})})}}function Ns(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 at(){try{As=(await y("GET","/api/ai/sessions")).sessions||[]}catch{As=[]}return As}function Oi(){let e=E.peek(),t=f.sessionId?`${f.agent||I.peek()||"claude"}:${f.sessionId.slice(0,8)}`:"";return{project:e?.path||"",sessionId:f.sessionId||"",agent:f.agent||I.peek()||"claude",summary:[e?.name?`\u9879\u76EE ${e.name}`:"",t?`\u4F1A\u8BDD ${t}`:""].filter(Boolean).join(" \xB7 ")}}function Fn(){Nt=null,_i=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=!!f.sessionId,i("ma-note-status").textContent="\u65B0\u8BB0\u4E8B",i("ma-note-delete").disabled=!0,i("ma-note-links").textContent=Oi().summary||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function Bi(e){Nt=e?.id||null,_i=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 ${Ns(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 Fl(){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&&f.sessionId&&n.push(`\u5173\u8054\u4F1A\u8BDD\uFF1A${f.agent||I.peek()||"claude"} / ${f.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
302
+ `),a.dispatchEvent(new Event("input"))),jt.splice(n,1),Fa()})})}}function Ns(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 at(){try{As=(await y("GET","/api/ai/sessions")).sessions||[]}catch{As=[]}return As}function Oi(){let e=E.peek(),t=f.sessionId?`${f.agent||I.peek()||"claude"}:${f.sessionId.slice(0,8)}`:"";return{project:e?.path||"",sessionId:f.sessionId||"",agent:f.agent||I.peek()||"claude",summary:[e?.name?`\u9879\u76EE ${e.name}`:"",t?`\u4F1A\u8BDD ${t}`:""].filter(Boolean).join(" \xB7 ")}}function Fn(){Nt=null,_i=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=!!f.sessionId,i("ma-note-status").textContent="\u65B0\u8BB0\u4E8B",i("ma-note-delete").disabled=!0,i("ma-note-links").textContent=Oi().summary||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function Bi(e){Nt=e?.id||null,_i=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 ${Ns(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 Ul(){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&&f.sessionId&&n.push(`\u5173\u8054\u4F1A\u8BDD\uFF1A${f.agent||I.peek()||"claude"} / ${f.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
303
303
  ${t}`:"",n.length?n.join(`
304
304
  `):"","","\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(`
305
305
  `);ye("chat"),i("ma-input").value=s,i("ma-input").dispatchEvent(new Event("input")),i("ma-input").focus()}async function gn(){let e=(Ni||"").trim();return js=(await y("GET",`/api/ai/notes?limit=80${e?`&q=${encodeURIComponent(e)}`:""}`)).notes||[],js}function Dt(){let e=i("ma-notes-list");if(e){if(!js.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=js.map(t=>{let n=t.id===Nt,s=[t.scope==="project"?"\u9879\u76EE":t.scope==="session"?"\u4F1A\u8BDD":"\u901A\u7528",t.pinned?"\u7F6E\u9876":""].filter(Boolean).join(" \xB7 ");return`
@@ -309,7 +309,7 @@ ${t}`:"",n.length?n.join(`
309
309
  <div class="text-[10px] text-base-content/45 mt-0.5 line-clamp-2">${p(t.content||"")}</div>
310
310
  <div class="text-[10px] text-base-content/35 mt-1">${p(s)}${s?" \xB7 ":""}${p(Ns(t.updatedAt)||"")}</div>
311
311
  </div>
312
- </button>`}).join(""),e.querySelectorAll("[data-note-id]").forEach(t=>{t.addEventListener("click",async()=>{try{let n=await y("GET",`/api/ai/notes/${t.dataset.noteId}`);Bi(n),Dt()}catch(n){i("ma-note-status").textContent=n.message}})})}}async function Ul(){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=Oi(),s={id:Nt||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 y("POST","/api/ai/notes",s);Bi(a),await gn(),Dt()}async function Wl(){if(!Nt){Fn();return}confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u4E8B\uFF1F\u4E0D\u53EF\u6062\u590D\u3002")&&(await y("DELETE",`/api/ai/notes/${Nt}`),Fn(),await gn(),Dt())}function _t(){let e=i("ma-history-list");if(!e)return;let t=(Di||"").trim().toLowerCase(),n=As;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">
312
+ </button>`}).join(""),e.querySelectorAll("[data-note-id]").forEach(t=>{t.addEventListener("click",async()=>{try{let n=await y("GET",`/api/ai/notes/${t.dataset.noteId}`);Bi(n),Dt()}catch(n){i("ma-note-status").textContent=n.message}})})}}async function Wl(){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=Oi(),s={id:Nt||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 y("POST","/api/ai/notes",s);Bi(a),await gn(),Dt()}async function Gl(){if(!Nt){Fn();return}confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u4E8B\uFF1F\u4E0D\u53EF\u6062\u590D\u3002")&&(await y("DELETE",`/api/ai/notes/${Nt}`),Fn(),await gn(),Dt())}function _t(){let e=i("ma-history-list");if(!e)return;let t=(Di||"").trim().toLowerCase(),n=As;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">
313
313
  ${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"}
314
314
  </div>`;return}e.innerHTML=n.map(s=>{let a=s.id===pe,o=Ns(s.updatedAt)||"",r=s.messageCount||0;return`
315
315
  <div class="ma-hist-item ${a?"active":""}" data-hist-id="${p(s.id)}">
@@ -325,22 +325,22 @@ ${t}`:"",n.length?n.join(`
325
325
  </div>
326
326
  </div>
327
327
  </div>`}).join(""),e.querySelectorAll("[data-hist-open]").forEach(s=>{s.addEventListener("click",async()=>{await ot(s.dataset.histOpen),ye("chat"),i("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-resume]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation(),await ot(s.dataset.histResume),ye("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 y("DELETE",`/api/ai/sessions/${o}`),pe===o&&(pe=null,Se=null,localStorage.removeItem(bt),ot(null)),await at(),_t()}catch(r){alert(r.message)}})})}function ji(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(`
328
- `)||"[\u2026]"}function Gl(e){let t=i("ma-messages");if(t){if(t.innerHTML="",!e?.length){Z("system","\u6B64\u4F1A\u8BDD\u6682\u65E0\u6D88\u606F\u3002");return}for(let n of e){if(n.role==="user"){Z("user",ji(n.content));continue}if(n.role==="assistant"){if(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{}Z("tool","",{name:a,args:o,phase:"history",id:s.id||a})}n.content&&Z("assistant",typeof n.content=="string"?n.content:ji(n.content));continue}if(n.role==="tool"){let s=n.content;try{s=JSON.parse(n.content)}catch{}let a=n.tool_call_id||"";if(a)Ri(a,"done",s);else{Z("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",r.appendChild(d)),d.textContent=typeof s=="string"?s.slice(0,500):JSON.stringify(s,null,0).slice(0,500)}}}}t.scrollTop=t.scrollHeight}}async function Kl(){if(!pe){await ot(null);return}if(confirm("\u5220\u9664\u5F53\u524D Meta Agent \u4F1A\u8BDD\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"))try{await y("DELETE",`/api/ai/sessions/${pe}`),pe=null,Se=null,localStorage.removeItem(bt),await at(),await ot(null),ht==="history"&&_t()}catch(e){Z("error",e.message)}}async function ot(e,t={}){if(!e){pe=null,Se=null,localStorage.removeItem(bt);let n=i("ma-messages");return n&&(n.innerHTML=""),Z("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"),Un(),null}try{let n=await y("GET",`/api/ai/sessions/${e}`);return pe=n.id,Se={id:n.id,title:n.title,updatedAt:n.updatedAt,messageCount:(n.messages||[]).length},localStorage.setItem(bt,n.id),Gl(n.messages||[]),t.silent||Z("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"),Un(),ht==="history"&&_t(),n}catch(n){throw t.silent||Z("error",n.message),n}}async function Cs(){if(bn)return;let e=i("ma-input"),t=(e?.value||"").trim();if(!t)return;bn=!0,i("ma-send").disabled=!0,Z("user",t),e.value="",e.style.height="";for(let a of jt)if(a.previewUrl)try{URL.revokeObjectURL(a.previewUrl)}catch{}jt=[],Fa();let n=null,s="";try{await Ba("/api/ai/chat",{message:t,sessionId:pe},{session:a=>{pe=a.id,Se={...Se||{},id:a.id,title:a.title||Se?.title||t.slice(0,40),updatedAt:Date.now()},localStorage.setItem(bt,a.id),Un()},content:a=>{s=a.content||"",n||(n=Z("assistant","")),Ci(n,s)},tool:a=>{a.phase==="start"?Z("tool","",{name:a.name,args:a.args,phase:"start",id:a.id}):Ri(a.id,a.phase,a.result)},approval:a=>Ol(a),done:a=>{a.sessionId&&(pe=a.sessionId,localStorage.setItem(bt,a.sessionId)),(a.title||a.sessionId)&&(Se={id:pe,title:a.title||Se?.title||"\u5BF9\u8BDD",updatedAt:Date.now(),messageCount:(Se?.messageCount||0)+2}),a.content&&n&&Ci(n,a.content),Un(),at()},error:a=>{Z("error",a.message||"error")}})}catch(a){Z("error",a.message)}finally{bn=!1,i("ma-send").disabled=!1}}async function zl(){if(bn)return;bn=!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 Ba("/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),vn(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),vn(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{bn=!1,i("ma-gen-report").disabled=!1}}async function qi(){try{let e=new Date,t=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,n=await y("GET",`/api/ai/reports/${t}`);if(n?.markdown){let s=i("ma-report-body");s.innerHTML=`
328
+ `)||"[\u2026]"}function Kl(e){let t=i("ma-messages");if(t){if(t.innerHTML="",!e?.length){Z("system","\u6B64\u4F1A\u8BDD\u6682\u65E0\u6D88\u606F\u3002");return}for(let n of e){if(n.role==="user"){Z("user",ji(n.content));continue}if(n.role==="assistant"){if(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{}Z("tool","",{name:a,args:o,phase:"history",id:s.id||a})}n.content&&Z("assistant",typeof n.content=="string"?n.content:ji(n.content));continue}if(n.role==="tool"){let s=n.content;try{s=JSON.parse(n.content)}catch{}let a=n.tool_call_id||"";if(a)Ri(a,"done",s);else{Z("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",r.appendChild(d)),d.textContent=typeof s=="string"?s.slice(0,500):JSON.stringify(s,null,0).slice(0,500)}}}}t.scrollTop=t.scrollHeight}}async function zl(){if(!pe){await ot(null);return}if(confirm("\u5220\u9664\u5F53\u524D Meta Agent \u4F1A\u8BDD\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"))try{await y("DELETE",`/api/ai/sessions/${pe}`),pe=null,Se=null,localStorage.removeItem(bt),await at(),await ot(null),ht==="history"&&_t()}catch(e){Z("error",e.message)}}async function ot(e,t={}){if(!e){pe=null,Se=null,localStorage.removeItem(bt);let n=i("ma-messages");return n&&(n.innerHTML=""),Z("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"),Un(),null}try{let n=await y("GET",`/api/ai/sessions/${e}`);return pe=n.id,Se={id:n.id,title:n.title,updatedAt:n.updatedAt,messageCount:(n.messages||[]).length},localStorage.setItem(bt,n.id),Kl(n.messages||[]),t.silent||Z("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"),Un(),ht==="history"&&_t(),n}catch(n){throw t.silent||Z("error",n.message),n}}async function Cs(){if(bn)return;let e=i("ma-input"),t=(e?.value||"").trim();if(!t)return;bn=!0,i("ma-send").disabled=!0,Z("user",t),e.value="",e.style.height="";for(let a of jt)if(a.previewUrl)try{URL.revokeObjectURL(a.previewUrl)}catch{}jt=[],Fa();let n=null,s="";try{await Ba("/api/ai/chat",{message:t,sessionId:pe},{session:a=>{pe=a.id,Se={...Se||{},id:a.id,title:a.title||Se?.title||t.slice(0,40),updatedAt:Date.now()},localStorage.setItem(bt,a.id),Un()},content:a=>{s=a.content||"",n||(n=Z("assistant","")),Ci(n,s)},tool:a=>{a.phase==="start"?Z("tool","",{name:a.name,args:a.args,phase:"start",id:a.id}):Ri(a.id,a.phase,a.result)},approval:a=>Bl(a),done:a=>{a.sessionId&&(pe=a.sessionId,localStorage.setItem(bt,a.sessionId)),(a.title||a.sessionId)&&(Se={id:pe,title:a.title||Se?.title||"\u5BF9\u8BDD",updatedAt:Date.now(),messageCount:(Se?.messageCount||0)+2}),a.content&&n&&Ci(n,a.content),Un(),at()},error:a=>{Z("error",a.message||"error")}})}catch(a){Z("error",a.message)}finally{bn=!1,i("ma-send").disabled=!1}}async function Jl(){if(bn)return;bn=!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 Ba("/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),vn(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),vn(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{bn=!1,i("ma-gen-report").disabled=!1}}async function qi(){try{let e=new Date,t=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,n=await y("GET",`/api/ai/reports/${t}`);if(n?.markdown){let s=i("ma-report-body");s.innerHTML=`
329
329
  <div class="text-[10px] text-base-content/40 mb-2">${p(n.title||t)} \xB7 ${p(n.generatedAt||"")}</div>
330
- <div class="md ma-report-md">${xn(n.markdown)}</div>`,vn(s)}}catch{}}async function Jl(){let e=i("ma-report-list");try{let t=await y("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=>`
330
+ <div class="md ma-report-md">${xn(n.markdown)}</div>`,vn(s)}}catch{}}async function Ql(){let e=i("ma-report-list");try{let t=await y("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=>`
331
331
  <button type="button" class="ma-report-item w-full text-left px-2 py-1 rounded hover:bg-base-200 text-xs"
332
332
  data-day="${p(s.day)}">
333
333
  <span class="font-semibold">${p(s.day)}</span>
334
334
  <span class="text-base-content/45 ml-1">${p(s.title||"")}</span>
335
335
  </button>`).join(""),e.querySelectorAll("[data-day]").forEach(s=>{s.addEventListener("click",async()=>{try{let a=await y("GET",`/api/ai/reports/${s.dataset.day}`),o=i("ma-report-body");o.innerHTML=`
336
336
  <div class="text-[10px] text-base-content/40 mb-2">${p(a.title||a.day)} \xB7 ${p(a.generatedAt||"")}</div>
337
- <div class="md ma-report-md">${xn(a.markdown)}</div>`,vn(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 Fi(){try{let e=await y("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)),Wn(e)}catch(e){i("ma-cfg-status").textContent=e.message}}async function Ql(){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 y("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="",Wn(a)}catch(t){e.textContent=t.message}}function Wn(e){if(Is&&(clearInterval(Is),Is=null),!e?.auto_report)return;let t=e.auto_report_hour??18;Is=setInterval(async()=>{if(!f.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(Oa!==s&&!(n.getMinutes()>10))try{Oa=s,localStorage.setItem("ai_last_auto_report",s),await Ba("/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),Oa="",localStorage.removeItem("ai_last_auto_report")}},60*1e3)}function Ui(){i("meta-agent-panel")||(document.getElementById("root")?.insertAdjacentHTML("beforeend",Rl()),document.querySelectorAll("[data-ma-close]").forEach(e=>{e.addEventListener("click",Pi)}),i("ma-btn-chat")?.addEventListener("click",()=>ye("chat")),i("ma-btn-history")?.addEventListener("click",async()=>{await at(),ye("history")}),i("ma-btn-notes")?.addEventListener("click",async()=>{await gn(),Nt||Fn(),ye("notes")}),i("ma-open-history")?.addEventListener("click",async()=>{await at(),ye("history")}),i("ma-btn-report")?.addEventListener("click",()=>{ye("report"),qi()}),i("ma-btn-config")?.addEventListener("click",()=>{ye("config"),Fi()}),i("ma-send")?.addEventListener("click",Cs),i("ma-input")?.addEventListener("keydown",e=>{(e.metaKey||e.ctrlKey)&&e.key==="Enter"&&(e.preventDefault(),Cs())}),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",()=>{ot(null),ye("chat")}),i("ma-del-session")?.addEventListener("click",Kl),i("ma-resume-focus")?.addEventListener("click",()=>{i("ma-input")?.focus()}),i("ma-history-refresh")?.addEventListener("click",async()=>{await at(),_t()}),i("ma-history-new")?.addEventListener("click",()=>{ot(null),ye("chat")}),i("ma-history-search")?.addEventListener("input",e=>{Di=e.target.value||"",_t()}),i("ma-quick-today")?.addEventListener("click",()=>{ye("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",Cs()}),i("ma-quick-projects")?.addEventListener("click",()=>{ye("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",Cs()}),i("ma-gen-report")?.addEventListener("click",zl),i("ma-load-reports")?.addEventListener("click",Jl),i("ma-notes-refresh")?.addEventListener("click",async()=>{await gn(),Dt()}),i("ma-notes-new")?.addEventListener("click",()=>{Fn(),Dt(),i("ma-note-title")?.focus()}),i("ma-notes-search")?.addEventListener("input",async e=>{Ni=e.target.value||"",await gn(),Dt()}),i("ma-note-save")?.addEventListener("click",async()=>{try{await Ul()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-delete")?.addEventListener("click",async()=>{try{await Wl()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-ask")?.addEventListener("click",Fl),i("ma-cfg-save")?.addEventListener("click",Ql),i("ma-auto-report")?.addEventListener("change",async()=>{try{let e=await y("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report").checked,auto_report_hour:parseInt(i("ma-auto-hour")?.value||"18",10)});Wn(e)}catch{}}),i("ma-auto-hour")?.addEventListener("change",async()=>{try{let e=await y("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report")?.checked,auto_report_hour:parseInt(i("ma-auto-hour").value||"18",10)});Wn(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){Z("error",`${s.name} \u8FC7\u5927 (>12MB)`);continue}await Ai(s,s.name||`upload-${Date.now()}.png`)}}catch(s){Z("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(!Ds||ht!=="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 l=(r.type.split("/")[1]||"png").replace(/[^a-z0-9]/gi,"")||"png";await Ai(d,`paste-${Date.now()}.${l}`)}}catch(r){Z("error",`\u7C98\u8D34\u56FE\u7247\u5931\u8D25: ${r.message}`)}finally{t&&(t.disabled=!1,t.focus())}}}),ot(null,{silent:!0}),Fn())}function Gn(){f.token&&(A.peek()&&!Cn()||(at(),gn().catch(()=>{}),y("GET","/api/ai/config").then(Wn).catch(()=>{})))}var Ds,ht,bn,pe,Se,jt,Ii,Is,Oa,As,Di,js,Ni,Nt,_i,bt,Kn=K(()=>{R();ue();B();Ea();Ds=!1,ht="chat",bn=!1,pe=null,Se=null,jt=[],Ii=0,Is=null,Oa=localStorage.getItem("ai_last_auto_report")||"",As=[],Di="",js=[],Ni="",Nt=null,_i=null,bt="ma_last_session_id"});function Ua(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function Ht(){let e=Ua(O.peek()),t=j.peek();A.peek()&&t&&(e=e.filter(s=>s&&(!s.machineId||s.machineId===t)));let n=de.peek();return n&&n!=="all"&&(e=e.filter(s=>s&&(s.agent||"claude")===n)),e}function Ki(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 Vl(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 l=7-n.length%7;if(l<7)for(let c=1;c<=l;c++)n.push({date:new Date(e,t+1,c),isCurrentMonth:!1});return n}function zi(e,t){let n=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),s=n+1440*60*1e3;return t.filter(a=>{let o=q(a.updatedAt);return o!=null&&o>=n&&o<s})}function Ji(e){return e==null||isNaN(e)?"0":e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function Rt(e){let t=i("calendar-grid");if(!t)return;e=Ua(e??Ht());let n=i("calendar-month-year");if(n){let u=new Date(_s,Pt,1);n.textContent=u.toLocaleDateString([],{month:"long",year:"numeric"})}let s=e.length,a=new Set(e.map(u=>u.cwd).filter(Boolean)).size,o=e.reduce((u,h)=>u+(Number(h.totalTokens)||0),0),r=i("stats-total-sessions"),d=i("stats-total-projects"),l=i("stats-total-tokens");r&&(r.textContent=String(s)),d&&(d.textContent=String(a)),l&&(l.textContent=Ji(o));let c=Vl(_s,Pt);zn||(zn=Ki(new Date)),t.innerHTML=c.map(u=>{let h=u.date,x=Ki(h),C=zi(h,e).length,F=h.toDateString()===new Date().toDateString(),ke=x===zn,J="",ne="text-base-content/65",N="border border-transparent",S="cursor-default",_=u.isCurrentMonth?"":"opacity-25";C>0?(S="cursor-pointer",C<=2?(J="bg-primary/15",ne="text-primary font-bold",N="border border-primary/30"):C<=5?(J="bg-primary/30",ne="text-primary font-bold",N="border border-primary/50"):(J="bg-primary/60",ne="text-primary-content font-bold",N="border border-primary/80")):(J="bg-base-300/25",u.isCurrentMonth&&(S="hover:bg-base-300/50")),F?N="border-2 border-primary":ke&&(N="border-2 border-accent");let se=h.getDate()===1?`<span class="absolute top-0.5 left-1 text-[8px] opacity-60 uppercase">${h.toLocaleDateString([],{month:"short"})}</span>`:"";return`
337
+ <div class="md ma-report-md">${xn(a.markdown)}</div>`,vn(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 Fi(){try{let e=await y("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)),Wn(e)}catch(e){i("ma-cfg-status").textContent=e.message}}async function Vl(){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 y("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="",Wn(a)}catch(t){e.textContent=t.message}}function Wn(e){if(Is&&(clearInterval(Is),Is=null),!e?.auto_report)return;let t=e.auto_report_hour??18;Is=setInterval(async()=>{if(!f.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(Oa!==s&&!(n.getMinutes()>10))try{Oa=s,localStorage.setItem("ai_last_auto_report",s),await Ba("/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),Oa="",localStorage.removeItem("ai_last_auto_report")}},60*1e3)}function Ui(){i("meta-agent-panel")||(document.getElementById("root")?.insertAdjacentHTML("beforeend",Ol()),document.querySelectorAll("[data-ma-close]").forEach(e=>{e.addEventListener("click",Pi)}),i("ma-btn-chat")?.addEventListener("click",()=>ye("chat")),i("ma-btn-history")?.addEventListener("click",async()=>{await at(),ye("history")}),i("ma-btn-notes")?.addEventListener("click",async()=>{await gn(),Nt||Fn(),ye("notes")}),i("ma-open-history")?.addEventListener("click",async()=>{await at(),ye("history")}),i("ma-btn-report")?.addEventListener("click",()=>{ye("report"),qi()}),i("ma-btn-config")?.addEventListener("click",()=>{ye("config"),Fi()}),i("ma-send")?.addEventListener("click",Cs),i("ma-input")?.addEventListener("keydown",e=>{(e.metaKey||e.ctrlKey)&&e.key==="Enter"&&(e.preventDefault(),Cs())}),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",()=>{ot(null),ye("chat")}),i("ma-del-session")?.addEventListener("click",zl),i("ma-resume-focus")?.addEventListener("click",()=>{i("ma-input")?.focus()}),i("ma-history-refresh")?.addEventListener("click",async()=>{await at(),_t()}),i("ma-history-new")?.addEventListener("click",()=>{ot(null),ye("chat")}),i("ma-history-search")?.addEventListener("input",e=>{Di=e.target.value||"",_t()}),i("ma-quick-today")?.addEventListener("click",()=>{ye("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",Cs()}),i("ma-quick-projects")?.addEventListener("click",()=>{ye("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",Cs()}),i("ma-gen-report")?.addEventListener("click",Jl),i("ma-load-reports")?.addEventListener("click",Ql),i("ma-notes-refresh")?.addEventListener("click",async()=>{await gn(),Dt()}),i("ma-notes-new")?.addEventListener("click",()=>{Fn(),Dt(),i("ma-note-title")?.focus()}),i("ma-notes-search")?.addEventListener("input",async e=>{Ni=e.target.value||"",await gn(),Dt()}),i("ma-note-save")?.addEventListener("click",async()=>{try{await Wl()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-delete")?.addEventListener("click",async()=>{try{await Gl()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-ask")?.addEventListener("click",Ul),i("ma-cfg-save")?.addEventListener("click",Vl),i("ma-auto-report")?.addEventListener("change",async()=>{try{let e=await y("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report").checked,auto_report_hour:parseInt(i("ma-auto-hour")?.value||"18",10)});Wn(e)}catch{}}),i("ma-auto-hour")?.addEventListener("change",async()=>{try{let e=await y("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report")?.checked,auto_report_hour:parseInt(i("ma-auto-hour").value||"18",10)});Wn(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){Z("error",`${s.name} \u8FC7\u5927 (>12MB)`);continue}await Ai(s,s.name||`upload-${Date.now()}.png`)}}catch(s){Z("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(!Ds||ht!=="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 l=(r.type.split("/")[1]||"png").replace(/[^a-z0-9]/gi,"")||"png";await Ai(d,`paste-${Date.now()}.${l}`)}}catch(r){Z("error",`\u7C98\u8D34\u56FE\u7247\u5931\u8D25: ${r.message}`)}finally{t&&(t.disabled=!1,t.focus())}}}),ot(null,{silent:!0}),Fn())}function Gn(){f.token&&(A.peek()&&!Cn()||(at(),gn().catch(()=>{}),y("GET","/api/ai/config").then(Wn).catch(()=>{})))}var Ds,ht,bn,pe,Se,jt,Ii,Is,Oa,As,Di,js,Ni,Nt,_i,bt,Kn=K(()=>{R();ue();B();Ea();Ds=!1,ht="chat",bn=!1,pe=null,Se=null,jt=[],Ii=0,Is=null,Oa=localStorage.getItem("ai_last_auto_report")||"",As=[],Di="",js=[],Ni="",Nt=null,_i=null,bt="ma_last_session_id"});function Ua(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function Ht(){let e=Ua(O.peek()),t=j.peek();A.peek()&&t&&(e=e.filter(s=>s&&(!s.machineId||s.machineId===t)));let n=de.peek();return n&&n!=="all"&&(e=e.filter(s=>s&&(s.agent||"claude")===n)),e}function Ki(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 Yl(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 l=7-n.length%7;if(l<7)for(let c=1;c<=l;c++)n.push({date:new Date(e,t+1,c),isCurrentMonth:!1});return n}function zi(e,t){let n=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),s=n+1440*60*1e3;return t.filter(a=>{let o=q(a.updatedAt);return o!=null&&o>=n&&o<s})}function Ji(e){return e==null||isNaN(e)?"0":e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function Rt(e){let t=i("calendar-grid");if(!t)return;e=Ua(e??Ht());let n=i("calendar-month-year");if(n){let u=new Date(_s,Pt,1);n.textContent=u.toLocaleDateString([],{month:"long",year:"numeric"})}let s=e.length,a=new Set(e.map(u=>u.cwd).filter(Boolean)).size,o=e.reduce((u,h)=>u+(Number(h.totalTokens)||0),0),r=i("stats-total-sessions"),d=i("stats-total-projects"),l=i("stats-total-tokens");r&&(r.textContent=String(s)),d&&(d.textContent=String(a)),l&&(l.textContent=Ji(o));let c=Yl(_s,Pt);zn||(zn=Ki(new Date)),t.innerHTML=c.map(u=>{let h=u.date,x=Ki(h),C=zi(h,e).length,F=h.toDateString()===new Date().toDateString(),ke=x===zn,J="",ne="text-base-content/65",N="border border-transparent",S="cursor-default",_=u.isCurrentMonth?"":"opacity-25";C>0?(S="cursor-pointer",C<=2?(J="bg-primary/15",ne="text-primary font-bold",N="border border-primary/30"):C<=5?(J="bg-primary/30",ne="text-primary font-bold",N="border border-primary/50"):(J="bg-primary/60",ne="text-primary-content font-bold",N="border border-primary/80")):(J="bg-base-300/25",u.isCurrentMonth&&(S="hover:bg-base-300/50")),F?N="border-2 border-primary":ke&&(N="border-2 border-accent");let se=h.getDate()===1?`<span class="absolute top-0.5 left-1 text-[8px] opacity-60 uppercase">${h.toLocaleDateString([],{month:"short"})}</span>`:"";return`
338
338
  <div class="aspect-square rounded-xl flex flex-col items-center justify-center p-2 relative transition-all min-h-[50px] md:min-h-[60px] ${J} ${ne} ${N} ${S} ${_}"
339
339
  data-cal-date="${x}" title="${h.toDateString()}: ${C} session(s)">
340
340
  ${se}
341
341
  <span class="text-sm font-semibold">${h.getDate()}</span>
342
342
  ${C>0?`<span class="text-[10px] mt-0.5 opacity-80 font-medium whitespace-nowrap">${C}s</span>`:""}
343
- </div>`}).join(""),Yl(e),Ga()}function Yl(e){let t=i("selected-day-title"),n=i("selected-day-sessions");if(!t||!n)return;let[s,a,o]=zn.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=Ua(e);let d=zi(r,e),l=d.reduce((u,h)=>u+(Number(h.totalTokens)||0),0),c=i("stats-selected-tokens");if(c&&(c.textContent=Ji(l)),!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((u,h)=>(q(h.updatedAt)||0)-(q(u.updatedAt)||0)),n.innerHTML=d.map(u=>{let h=q(u.updatedAt),x=h!=null?new Date(h).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"";return`
343
+ </div>`}).join(""),Xl(e),Ga()}function Xl(e){let t=i("selected-day-title"),n=i("selected-day-sessions");if(!t||!n)return;let[s,a,o]=zn.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=Ua(e);let d=zi(r,e),l=d.reduce((u,h)=>u+(Number(h.totalTokens)||0),0),c=i("stats-selected-tokens");if(c&&(c.textContent=Ji(l)),!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((u,h)=>(q(h.updatedAt)||0)-(q(u.updatedAt)||0)),n.innerHTML=d.map(u=>{let h=q(u.updatedAt),x=h!=null?new Date(h).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"";return`
344
344
  <div class="flex items-center gap-2.5 p-2.5 rounded-lg bg-base-300/40 hover:bg-base-300 border border-base-300/50 cursor-pointer text-left transition-all ${f.sessionId===u.sessionId?"border-primary bg-primary/5":""}"
345
345
  data-session-id="${p(u.sessionId)}"
346
346
  data-session-cwd="${p(u.cwd||"")}"
@@ -366,7 +366,7 @@ ${t}`:"",n.length?n.join(`
366
366
  <div class="text-[10px] text-base-content/40 truncate mt-1">${p(n.projectName||sn(n.cwd)||"No workspace")}</div>
367
367
  </div>
368
368
  <div class="text-[9px] text-base-content/40 whitespace-nowrap self-start mt-0.5">${s}</div>
369
- </div>`}).join("")}function Ot(){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 Ka(){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 l=i("btn-recent-sessions")?.getBoundingClientRect();if(l){let c=Math.min(320,window.innerWidth-16),u=l.left;u+c>window.innerWidth-8&&(u=window.innerWidth-c-8),u<8&&(u=8),e.style.left=`${Math.round(u)}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 Xl(){let e=i("recent-menu");e&&(za(),e.classList.remove("hidden"),e.classList.add("recent-menu-open"),Ka(),i("recent-menu-backdrop")?.classList.remove("hidden"))}function tr(){let e=i("recent-menu");e&&(e.classList.contains("hidden")?Xl():Ot())}function za(){let e=i("recent-menu-list"),t=i("recent-menu-empty"),n=i("recent-menu-count");if(!e)return;let s=er(Qi);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=tn(a.updatedAt),r=f.sessionId===a.sessionId&&(!a.machineId||!f.machineId||a.machineId===f.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`
369
+ </div>`}).join("")}function Ot(){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 Ka(){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 l=i("btn-recent-sessions")?.getBoundingClientRect();if(l){let c=Math.min(320,window.innerWidth-16),u=l.left;u+c>window.innerWidth-8&&(u=window.innerWidth-c-8),u<8&&(u=8),e.style.left=`${Math.round(u)}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 Zl(){let e=i("recent-menu");e&&(za(),e.classList.remove("hidden"),e.classList.add("recent-menu-open"),Ka(),i("recent-menu-backdrop")?.classList.remove("hidden"))}function tr(){let e=i("recent-menu");e&&(e.classList.contains("hidden")?Zl():Ot())}function za(){let e=i("recent-menu-list"),t=i("recent-menu-empty"),n=i("recent-menu-count");if(!e)return;let s=er(Qi);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=tn(a.updatedAt),r=f.sessionId===a.sessionId&&(!a.machineId||!f.machineId||a.machineId===f.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`
370
370
  <div class="recent-menu-item w-full text-left px-2 py-1.5 rounded-md flex items-start gap-2
371
371
  ${r?"bg-primary/15 text-primary":"hover:bg-base-200"}">
372
372
  <button type="button" class="flex min-w-0 flex-1 items-start gap-2 text-left" aria-label="\u6253\u5F00 ${p(Ye(a))}"
@@ -391,7 +391,7 @@ ${t}`:"",n.length?n.join(`
391
391
  data-dismiss-recent-session="${p(a.sessionId)}"
392
392
  data-dismiss-recent-agent="${p(a.agent||"claude")}"
393
393
  data-dismiss-recent-machine="${p(a.machineId||"")}">\xD7</button>
394
- </div>`}).join("")}function nr(e){zn=e}function Ja(e){Pt+=e,Pt<0?(Pt=11,_s--):Pt>11&&(Pt=0,_s++)}var _s,Pt,zn,Qi,Vi,Qa=K(()=>{R();B();an();_s=new Date().getFullYear(),Pt=new Date().getMonth(),zn=null;Qi=15,Vi="recentSessionsV1"});var lr={};as(lr,{loadAgentsMeta:()=>wn,loadAllSessions:()=>Ke,loadMemoryTab:()=>qs,loadWorkspaces:()=>yn,mdToHtml:()=>rr,openMemoryFile:()=>Za,promptCustomModel:()=>Rs,refreshEffortSelect:()=>Hs,refreshModelSelect:()=>Ne,renderProjectGroups:()=>or,renderSessionList:()=>Ya,renderTimeline:()=>ir,runActivitySearch:()=>Os,scheduleActivitySearch:()=>Bs,sessionItemHtml:()=>Va,syncSidebarChrome:()=>Xa});function sr(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function Zl(){let e=new URLSearchParams;e.set("limit","2000");let t=e.toString();return t?`/api/sessions?${t}`:"/api/sessions"}async function Ke({waitFresh:e=!0}={}){let t=sr(await Es());if(t.length){let s=j.peek();if(A.peek()&&s){let a=t.filter(o=>!o.machineId||o.machineId===s);O.value=a.length?a:t}else O.value=t}let n=async()=>{let s=Zl(),a=await y("GET",s,void 0,void 0,{etag:!0});if(a===wa)return O.peek();let o=sr(a);return O.value=o,Ei(o),o};if(e||!t.length)try{await n()}catch(s){if(!t.length){let a=i("session-list");a&&(a.innerHTML=`<div class="px-3 py-3 text-xs text-error">${p(s.message)}</div>`)}}else n().catch(()=>{})}async function yn({waitFresh:e=!0}={}){let t=await Ti();t&&(ee.value=t);let n=async()=>{let s=await y("GET","/api/workspaces");ee.value=s,qn(s)};if(e||!t)try{await n()}catch{}else n().catch(()=>{})}function Va(e,{showProject:t=!1}={}){let n=f.sessionId===e.sessionId&&(f.agent||I.peek())===(e.agent||"claude"),s=T.peek()?.[oe(e.agent,e.sessionId,e.machineId)]||{},a=!!(s.title&&String(s.title).trim()),o=e.snippet&&me.peek()?e.snippet:Ye(e),r=!!s.favorite,d=!!s.hidden,l=!!(s.notes&&String(s.notes).trim()),c=Number(e.turnCount)||0,u=c>0&&c<=ga,h=t?`<div class="text-[10px] text-base-content/40 font-mono truncate" title="${p(e.cwd||"")}">${p(e.projectName||sn(e.cwd)||"\u2014")}</div>`:"",x=[u?`<span class="session-thin-badge" title="Only ${c} turn${c===1?"":"s"}">thin\xB7${c}</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>':"",l?`<span class="session-note-dot" title="${p(s.notes)}">\u{1F4DD}</span>`:""].filter(Boolean).join(""),v=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>`:"",C=a?`${o}
394
+ </div>`}).join("")}function nr(e){zn=e}function Ja(e){Pt+=e,Pt<0?(Pt=11,_s--):Pt>11&&(Pt=0,_s++)}var _s,Pt,zn,Qi,Vi,Qa=K(()=>{R();B();an();_s=new Date().getFullYear(),Pt=new Date().getMonth(),zn=null;Qi=15,Vi="recentSessionsV1"});var lr={};as(lr,{loadAgentsMeta:()=>wn,loadAllSessions:()=>Ne,loadMemoryTab:()=>qs,loadWorkspaces:()=>yn,mdToHtml:()=>rr,openMemoryFile:()=>Za,promptCustomModel:()=>Rs,refreshEffortSelect:()=>Hs,refreshModelSelect:()=>_e,renderProjectGroups:()=>or,renderSessionList:()=>Ya,renderTimeline:()=>ir,runActivitySearch:()=>Os,scheduleActivitySearch:()=>Bs,sessionItemHtml:()=>Va,syncSidebarChrome:()=>Xa});function sr(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function ec({hubIndex:e=!1}={}){let t=new URLSearchParams;t.set("limit","2000"),e&&A.peek()&&t.set("index","1");let n=t.toString();return n?`/api/sessions?${n}`:"/api/sessions"}async function Ne({waitFresh:e=!0,hubIndex:t=!1}={}){let n=sr(await Es());if(n.length){let a=j.peek();if(A.peek()&&a){let o=n.filter(r=>!r.machineId||r.machineId===a);O.value=o.length?o:n}else O.value=n}let s=async()=>{let a=ec({hubIndex:t}),o=await y("GET",a,void 0,void 0,{etag:!0});if(o===wa)return O.peek();let r=sr(o);return O.value=r,Ei(r),r};if(e||!n.length)try{await s()}catch(a){if(!n.length){let o=i("session-list");o&&(o.innerHTML=`<div class="px-3 py-3 text-xs text-error">${p(a.message)}</div>`)}}else s().catch(()=>{})}async function yn({waitFresh:e=!0}={}){let t=await Ti();t&&(ee.value=t);let n=async()=>{let s=await y("GET","/api/workspaces");ee.value=s,qn(s)};if(e||!t)try{await n()}catch{}else n().catch(()=>{})}function Va(e,{showProject:t=!1}={}){let n=f.sessionId===e.sessionId&&(f.agent||I.peek())===(e.agent||"claude"),s=T.peek()?.[oe(e.agent,e.sessionId,e.machineId)]||{},a=!!(s.title&&String(s.title).trim()),o=e.snippet&&me.peek()?e.snippet:Ye(e),r=!!s.favorite,d=!!s.hidden,l=!!(s.notes&&String(s.notes).trim()),c=Number(e.turnCount)||0,u=c>0&&c<=ga,h=t?`<div class="text-[10px] text-base-content/40 font-mono truncate" title="${p(e.cwd||"")}">${p(e.projectName||sn(e.cwd)||"\u2014")}</div>`:"",x=[u?`<span class="session-thin-badge" title="Only ${c} turn${c===1?"":"s"}">thin\xB7${c}</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>':"",l?`<span class="session-note-dot" title="${p(s.notes)}">\u{1F4DD}</span>`:""].filter(Boolean).join(""),v=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>`:"",C=a?`${o}
395
395
  (original: ${e.display||e.sessionId})`:e.display||"";return`<div class="session-row px-2.5 py-1.5 cursor-pointer hover:bg-base-300 border-l-2
396
396
  ${n?"border-primary bg-primary/5":"border-transparent"} ${r?"session-fav":""} ${d?"session-hidden-row":""} ${u?"session-thin":""}"
397
397
  data-session-id="${p(e.sessionId)}"
@@ -431,7 +431,7 @@ ${t}`:"",n.length?n.join(`
431
431
  </div>
432
432
  <span class="text-[9px] text-base-content/30 flex-shrink-0 mt-0.5">${tn(e.updatedAt)}</span>
433
433
  </div>
434
- </div>`}async function wn(){try{let e=await y("GET","/api/agents");return kt.value=e,Ne(),e}catch(e){return console.warn("[agents] failed to load model list",e),null}}function Hs(){let e=i("sel-effort");if(!e)return;let t=I.peek()||"claude",n=P.peek(),s=In(t,n),a=ie.peek()||"";if(!a){let r=lt(t,n);r&&s.includes(r)&&(a=r,ie.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=lt(t,n);r&&s.includes(r)?(ie.value=r,e.value=r):(ie.value="",e.value="")}else e.value=a}function Ne(){let e=i("sel-model");if(!e)return;let t=I.peek()||"claude",n=Xe(t),s=P.peek();if(s&&!n.some(o=>o.value===s)&&(n=[{value:s,label:`${s} \u2605`,custom:!0},...n]),e.innerHTML=n.map(o=>`<option value="${p(o.value)}" ${o.value===s?"selected":""}>${p(o.label)}</option>`).join(""),n.some(o=>o.value===s))e.value=s;else{let o=Be(t)||n[0]?.value;le(o),e.value=o,s=o}let a=i("sel-agent");a&&(a.value=t),Hs()}function Rs({editCurrent:e=!1}={}){let t=I.peek()||"claude",n=e&&P.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&&ls(t).includes(n)&&ya(t,n),Mn(t,o),le(o),Ne())}function or(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
434
+ </div>`}async function wn(){try{let e=await y("GET","/api/agents");return kt.value=e,_e(),e}catch(e){return console.warn("[agents] failed to load model list",e),null}}function Hs(){let e=i("sel-effort");if(!e)return;let t=I.peek()||"claude",n=P.peek(),s=In(t,n),a=ie.peek()||"";if(!a){let r=lt(t,n);r&&s.includes(r)&&(a=r,ie.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=lt(t,n);r&&s.includes(r)?(ie.value=r,e.value=r):(ie.value="",e.value="")}else e.value=a}function _e(){let e=i("sel-model");if(!e)return;let t=I.peek()||"claude",n=Xe(t),s=P.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=qe(t)||n[0]?.value;le(o),e.value=o,s=o}let a=i("sel-agent");a&&(a.value=t),Hs()}function Rs({editCurrent:e=!1}={}){let t=I.peek()||"claude",n=e&&P.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&&ls(t).includes(n)&&ya(t,n),Mn(t,o),le(o),_e())}function or(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
435
435
  No projects in this range.<br>
436
436
  <span class="text-base-content/30">Try \u201CAll\u201D time or another agent.</span>
437
437
  </div>`;let t=zt.value,n=Jt.value,s=!!me.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 l=o.machineId?`<span class="text-[9px] font-mono text-base-content/40 flex-shrink-0">@${p(o.machineId)}</span>`:"",c=`
@@ -449,7 +449,7 @@ ${t}`:"",n.length?n.join(`
449
449
  </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])=>`
450
450
  <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>
451
451
  ${s.map(a=>Va(a,{showProject:!0})).join("")}
452
- `).join("")}function Ya(){let e=Je.value,t=Array.isArray(ct.value)?ct.value:[],n=Array.isArray(St.value)?St.value:[];return e==="timeline"?ir(t):or(n)}function Xa(){document.querySelectorAll("[data-view]").forEach(o=>{let r=o.dataset.view===Je.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===de.peek())});let e=i("time-range");e&&e.value!==rs.peek()&&(e.value=rs.peek());let t=i("search-status");if(!t)return;let n=Re.peek(),s=Array.isArray(n?.results)?n.results:null,a=(me.peek()||"").trim();if(Qe.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=ct.peek(),r=St.peek(),d=Array.isArray(o)?o.length:0,l=Array.isArray(r)?r.length:0;t.classList.remove("hidden"),t.textContent=Je.peek()==="projects"?`${l} project${l===1?"":"s"} \xB7 ${d} session${d===1?"":"s"}`:`${d} recent session${d===1?"":"s"}`}}async function Os(e){let t=(e||"").trim();if(!t){Re.value=null,Qe.value=!1;return}Qe.value=!0;try{let n=new URLSearchParams({q:t,days:"0",limit:"50",deep:"1"});de.peek()&&de.peek()!=="all"&&n.set("agent",de.peek());let s=await y("GET",`/api/activity?${n}`);me.peek().trim()===t&&(Re.value={q:t.toLowerCase(),results:s.results||[],deep:!0})}catch(n){me.peek().trim()===t&&(Re.value={q:t.toLowerCase(),results:[],error:n.message})}finally{Qe.value=!1}}function Bs(e){clearTimeout(ar);let t=(e||"").trim();if(!t){Re.value=null,Qe.value=!1;return}ar=setTimeout(()=>Os(t),350)}function rr(e){if(!e)return"";if(typeof marked>"u")return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`;try{return marked.parse(String(e),{breaks:!0,gfm:!0})}catch{return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`}}async function qs(){let e=i("memory-area");if(e){if(!f.sessionId){e.innerHTML='<div class="p-4 text-xs text-base-content/40">Open or resume a session to view its memory.</div>';return}e.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let t=f.agent||I.peek()||"claude",n=new URLSearchParams({agent:t}),a=(await y("GET",`/api/sessions/${f.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>
452
+ `).join("")}function Ya(){let e=Je.value,t=Array.isArray(ct.value)?ct.value:[],n=Array.isArray(St.value)?St.value:[];return e==="timeline"?ir(t):or(n)}function Xa(){document.querySelectorAll("[data-view]").forEach(o=>{let r=o.dataset.view===Je.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===de.peek())});let e=i("time-range");e&&e.value!==rs.peek()&&(e.value=rs.peek());let t=i("search-status");if(!t)return;let n=Oe.peek(),s=Array.isArray(n?.results)?n.results:null,a=(me.peek()||"").trim();if(Qe.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=ct.peek(),r=St.peek(),d=Array.isArray(o)?o.length:0,l=Array.isArray(r)?r.length:0;t.classList.remove("hidden"),t.textContent=Je.peek()==="projects"?`${l} project${l===1?"":"s"} \xB7 ${d} session${d===1?"":"s"}`:`${d} recent session${d===1?"":"s"}`}}async function Os(e){let t=(e||"").trim();if(!t){Oe.value=null,Qe.value=!1;return}Qe.value=!0;try{let n=new URLSearchParams({q:t,days:"0",limit:"50",deep:"1"});de.peek()&&de.peek()!=="all"&&n.set("agent",de.peek());let s=await y("GET",`/api/activity?${n}`);me.peek().trim()===t&&(Oe.value={q:t.toLowerCase(),results:s.results||[],deep:!0})}catch(n){me.peek().trim()===t&&(Oe.value={q:t.toLowerCase(),results:[],error:n.message})}finally{Qe.value=!1}}function Bs(e){clearTimeout(ar);let t=(e||"").trim();if(!t){Oe.value=null,Qe.value=!1;return}ar=setTimeout(()=>Os(t),350)}function rr(e){if(!e)return"";if(typeof marked>"u")return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`;try{return marked.parse(String(e),{breaks:!0,gfm:!0})}catch{return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`}}async function qs(){let e=i("memory-area");if(e){if(!f.sessionId){e.innerHTML='<div class="p-4 text-xs text-base-content/40">Open or resume a session to view its memory.</div>';return}e.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let t=f.agent||I.peek()||"claude",n=new URLSearchParams({agent:t}),a=(await y("GET",`/api/sessions/${f.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>
453
453
  <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 Za(e,t){let n=i("memory-file-content");if(!(!n||!f.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||f.agent||I.peek()||"claude",file:e}),a=await y("GET",`/api/sessions/${f.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">${rr(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 ar,Bt=K(()=>{R();B();ue();Ts();an();ar=null});function cr(e,t){Fs=e||"",Us=t||""}async function dr(e){let t=i("project-notes-bar");if(t)try{let n=await y("GET",`/api/projects/notes?root=${encodeURIComponent(e)}`);Fs=n.goal||"",Us=n.notes||"",kn(),t.style.display="flex"}catch(n){console.error("Error fetching project notes:",n),t.style.display="none"}}function kn(){let e=i("project-notes-bar");if(!e)return;let t=Fs||"No goal yet \u2014 click Edit",n=Us||"";e.innerHTML=`
454
454
  <div class="flex items-start gap-2 w-full">
455
455
  <div class="flex-1 min-w-0">
@@ -478,7 +478,7 @@ ${t}`:"",n.length?n.join(`
478
478
  <button id="btn-cancel-project-notes" class="btn btn-ghost btn-xs px-2">Cancel</button>
479
479
  </div>
480
480
  </div>
481
- `,i("project-goal-input")?.focus())}async function Jn(){try{let e=await y("GET","/api/sessions/meta");T.value=e||{}}catch(e){console.warn("session meta load failed",e)}}function _e(){let e=i("session-notes-bar");if(!e)return;let t=f.sessionId,n=f.agent||I.peek()||"claude";if(!t){e.style.display="none",e.innerHTML="";return}if(e.querySelector(".session-rename-input"))return;let s=Qt(n,t),a=(s.notes||"").trim(),o=!!s.favorite,r=!!s.hidden,l=(s.title||"").trim()||t.slice(0,8);e.style.display="flex",e.innerHTML=`
481
+ `,i("project-goal-input")?.focus())}async function Jn(){try{let e=await y("GET","/api/sessions/meta");T.value=e||{}}catch(e){console.warn("session meta load failed",e)}}function Pe(){let e=i("session-notes-bar");if(!e)return;let t=f.sessionId,n=f.agent||I.peek()||"claude";if(!t){e.style.display="none",e.innerHTML="";return}if(e.querySelector(".session-rename-input"))return;let s=Qt(n,t),a=(s.notes||"").trim(),o=!!s.favorite,r=!!s.hidden,l=(s.title||"").trim()||t.slice(0,8);e.style.display="flex",e.innerHTML=`
482
482
  <div class="flex-1 min-w-0 flex items-center gap-2">
483
483
  <button type="button" class="session-fav-btn ${o?"is-fav":""}" data-fav-toggle="1"
484
484
  data-fav-session-id="${p(t)}" data-fav-session-agent="${p(n)}"
@@ -503,7 +503,7 @@ ${t}`:"",n.length?n.join(`
503
503
  placeholder="Note for this session\u2026" value="${p(n.notes||"")}">
504
504
  <button id="btn-save-session-notes" class="btn btn-primary btn-xs px-2">Save</button>
505
505
  <button id="btn-cancel-session-notes" class="btn btn-ghost btn-xs px-2">Cancel</button>
506
- `;let s=i("session-notes-input");s?.focus(),s?.select()}function Ws(){return{favorite:!1,notes:"",title:"",hidden:!1}}function Gs(e,t){return{favorite:t.favorite!==void 0?!!t.favorite:!!e.favorite,notes:t.notes!==void 0?String(t.notes||""):String(e.notes||""),title:t.title!==void 0?String(t.title||"").trim():String(e.title||"").trim(),hidden:t.hidden!==void 0?!!t.hidden:!!e.hidden,updatedAt:Date.now()}}function fr(e){return!e?.favorite&&!e?.hidden&&!(e?.notes||"").trim()&&!(e?.title||"").trim()}async function mr(e,t,{machineId:n}={}){let s=n||f.machineId||null,a=oe(t,e,s),o=T.peek()?.[a]||Ws(),r=!o.favorite;T.value={...T.peek(),[a]:{...o,favorite:r,updatedAt:Date.now()}};try{let d=await y("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]:Gs(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}`)}f.sessionId===e&&_e()}async function hr(e,t,{machineId:n}={}){if(!e)return!1;let s=n||f.machineId||null,a=oe(t,e,s),o=T.peek()?.[a]||Ws(),r=!o.hidden;T.value={...T.peek(),[a]:{...o,hidden:r,updatedAt:Date.now()}};try{let d=await y("PUT","/api/sessions/meta",{sessionId:e,agent:t,hidden:r,machineId:s||void 0},void 0,{machineId:s||void 0}),l=Gs(o,{favorite:d.favorite,notes:d.notes,title:d.title,hidden:d.hidden??r});if(fr(l)){let c={...T.peek()};delete c[a],T.value=c}else T.value={...T.peek(),[a]:l}}catch(d){return T.value={...T.peek(),[a]:o},alert(`Hide failed: ${d.message}`),!1}return f.sessionId===e&&_e(),!0}async function eo(e,t,n,{machineId:s}={}){let a=s||f.machineId||null,o=oe(t,e,a),r=T.peek()?.[o]||Ws();try{let d=await y("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]:Gs(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 ec(e,t,n,{machineId:s}={}){if(!e)return!1;let a=s||f.machineId||null,o=oe(t,e,a),r=T.peek()?.[o]||Ws(),d=String(n||"").trim().slice(0,200);T.value={...T.peek(),[o]:{...r,title:d,updatedAt:Date.now()}};try{let l=await y("PUT","/api/sessions/meta",{sessionId:e,agent:t,title:d,machineId:a||void 0},void 0,{machineId:a||void 0}),c=Gs(r,{favorite:l.favorite,notes:l.notes,title:l.title!==void 0?l.title:d,hidden:l.hidden});if(fr(c)){let u={...T.peek()};delete u[o],T.value=u}else T.value={...T.peek(),[o]:c}}catch(l){return T.value={...T.peek(),[o]:r},alert(`Rename failed: ${l.message}`),!1}return f.sessionId===e&&_e(),!0}function to({sessionId:e,agent:t="claude",machineId:n=null,fallbackDisplay:s="",mountEl:a}={}){if(!e||!a)return;document.querySelectorAll(".session-rename-input").forEach(x=>{x.dispatchEvent(new CustomEvent("session-rename-cancel",{bubbles:!0}))});let r=(Qt(t,e,n).title||"").trim()||s||e.slice(0,8),d=a.innerHTML,l=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"
506
+ `;let s=i("session-notes-input");s?.focus(),s?.select()}function Ws(){return{favorite:!1,notes:"",title:"",hidden:!1}}function Gs(e,t){return{favorite:t.favorite!==void 0?!!t.favorite:!!e.favorite,notes:t.notes!==void 0?String(t.notes||""):String(e.notes||""),title:t.title!==void 0?String(t.title||"").trim():String(e.title||"").trim(),hidden:t.hidden!==void 0?!!t.hidden:!!e.hidden,updatedAt:Date.now()}}function fr(e){return!e?.favorite&&!e?.hidden&&!(e?.notes||"").trim()&&!(e?.title||"").trim()}async function mr(e,t,{machineId:n}={}){let s=n||f.machineId||null,a=oe(t,e,s),o=T.peek()?.[a]||Ws(),r=!o.favorite;T.value={...T.peek(),[a]:{...o,favorite:r,updatedAt:Date.now()}};try{let d=await y("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]:Gs(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}`)}f.sessionId===e&&Pe()}async function hr(e,t,{machineId:n}={}){if(!e)return!1;let s=n||f.machineId||null,a=oe(t,e,s),o=T.peek()?.[a]||Ws(),r=!o.hidden;T.value={...T.peek(),[a]:{...o,hidden:r,updatedAt:Date.now()}};try{let d=await y("PUT","/api/sessions/meta",{sessionId:e,agent:t,hidden:r,machineId:s||void 0},void 0,{machineId:s||void 0}),l=Gs(o,{favorite:d.favorite,notes:d.notes,title:d.title,hidden:d.hidden??r});if(fr(l)){let c={...T.peek()};delete c[a],T.value=c}else T.value={...T.peek(),[a]:l}}catch(d){return T.value={...T.peek(),[a]:o},alert(`Hide failed: ${d.message}`),!1}return f.sessionId===e&&Pe(),!0}async function eo(e,t,n,{machineId:s}={}){let a=s||f.machineId||null,o=oe(t,e,a),r=T.peek()?.[o]||Ws();try{let d=await y("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]:Gs(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 tc(e,t,n,{machineId:s}={}){if(!e)return!1;let a=s||f.machineId||null,o=oe(t,e,a),r=T.peek()?.[o]||Ws(),d=String(n||"").trim().slice(0,200);T.value={...T.peek(),[o]:{...r,title:d,updatedAt:Date.now()}};try{let l=await y("PUT","/api/sessions/meta",{sessionId:e,agent:t,title:d,machineId:a||void 0},void 0,{machineId:a||void 0}),c=Gs(r,{favorite:l.favorite,notes:l.notes,title:l.title!==void 0?l.title:d,hidden:l.hidden});if(fr(c)){let u={...T.peek()};delete u[o],T.value=u}else T.value={...T.peek(),[o]:c}}catch(l){return T.value={...T.peek(),[o]:r},alert(`Rename failed: ${l.message}`),!1}return f.sessionId===e&&Pe(),!0}function to({sessionId:e,agent:t="claude",machineId:n=null,fallbackDisplay:s="",mountEl:a}={}){if(!e||!a)return;document.querySelectorAll(".session-rename-input").forEach(x=>{x.dispatchEvent(new CustomEvent("session-rename-cancel",{bubbles:!0}))});let r=(Qt(t,e,n).title||"").trim()||s||e.slice(0,8),d=a.innerHTML,l=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"
507
507
  value="${p(r)}"
508
508
  placeholder="Session name (empty = original)"
509
509
  maxlength="200"
@@ -511,7 +511,7 @@ ${t}`:"",n.length?n.join(`
511
511
  data-rename-session-id="${p(e)}"
512
512
  data-rename-session-agent="${p(t)}"
513
513
  data-rename-session-machine="${p(n||"")}"
514
- autocomplete="off" spellcheck="false" />`;let c=a.querySelector(".session-rename-input");if(!c)return;let u=!1,h=async x=>{if(u)return;u=!0;let v=x?c.value:r;if(a.className=l,!x){a.innerHTML=d;return}await ec(e,t,v,{machineId:n}),document.querySelectorAll(".session-rename-input").forEach(C=>C.remove()),f.sessionId===e&&_e(),T.value={...T.peek()}};c.addEventListener("keydown",x=>{x.stopPropagation(),x.key==="Enter"?(x.preventDefault(),h(!0)):x.key==="Escape"&&(x.preventDefault(),h(!1))}),c.addEventListener("click",x=>x.stopPropagation()),c.addEventListener("mousedown",x=>x.stopPropagation()),c.addEventListener("session-rename-cancel",()=>h(!1)),c.addEventListener("blur",()=>{setTimeout(()=>h(!0),0)}),requestAnimationFrame(()=>{c.focus(),c.select()})}var Fs,Us,Qn=K(()=>{R();B();ue();Fs="",Us=""});var gr={};as(gr,{closeMachineMenu:()=>Ut,enterMachine:()=>so,hideMachinePicker:()=>zs,refreshMachinesList:()=>qt,renderMachineMenuList:()=>Vn,renderMachinePickerList:()=>Ks,showMachinePicker:()=>Ft,startMachinePolling:()=>no,syncTopbarMachine:()=>gt});async function qt(){try{let e=await y("GET","/api/machines");Q.value=Array.isArray(e)?e:[]}catch{try{let e=await Yt();e?.machines&&(Q.value=e.machines)}catch{}}return Q.peek()||[]}function Ks(){let e=i("machine-picker-list"),t=i("machine-picker-empty");if(!e)return;let n=Q.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`
514
+ autocomplete="off" spellcheck="false" />`;let c=a.querySelector(".session-rename-input");if(!c)return;let u=!1,h=async x=>{if(u)return;u=!0;let v=x?c.value:r;if(a.className=l,!x){a.innerHTML=d;return}await tc(e,t,v,{machineId:n}),document.querySelectorAll(".session-rename-input").forEach(C=>C.remove()),f.sessionId===e&&Pe(),T.value={...T.peek()}};c.addEventListener("keydown",x=>{x.stopPropagation(),x.key==="Enter"?(x.preventDefault(),h(!0)):x.key==="Escape"&&(x.preventDefault(),h(!1))}),c.addEventListener("click",x=>x.stopPropagation()),c.addEventListener("mousedown",x=>x.stopPropagation()),c.addEventListener("session-rename-cancel",()=>h(!1)),c.addEventListener("blur",()=>{setTimeout(()=>h(!0),0)}),requestAnimationFrame(()=>{c.focus(),c.select()})}var Fs,Us,Qn=K(()=>{R();B();ue();Fs="",Us=""});var xr={};as(xr,{closeMachineMenu:()=>Ut,enterMachine:()=>so,hideMachinePicker:()=>zs,refreshMachinesList:()=>qt,renderMachineMenuList:()=>Vn,renderMachinePickerList:()=>Ks,showMachinePicker:()=>Ft,startMachinePolling:()=>no,syncTopbarMachine:()=>gt});async function qt(){try{let e=await y("GET","/api/machines");Q.value=Array.isArray(e)?e:[]}catch{try{let e=await Yt();e?.machines&&(Q.value=e.machines)}catch{}}return Q.peek()||[]}function Ks(){let e=i("machine-picker-list"),t=i("machine-picker-empty");if(!e)return;let n=Q.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`
515
515
  <button type="button" class="machine-pick-card w-full text-left px-4 py-3 rounded-xl border border-base-300
516
516
  hover:border-primary hover:bg-primary/5 transition-colors ${a?"":"opacity-50"}"
517
517
  data-pick-machine="${p(s.id)}" ${a?"":"disabled"}>
@@ -520,7 +520,7 @@ ${t}`:"",n.length?n.join(`
520
520
  <span class="font-semibold text-sm font-mono">${p(s.id)}</span>
521
521
  </div>
522
522
  ${o?`<div class="text-xs text-base-content/45 mt-1 pl-4">${p(o)}</div>`:""}
523
- </button>`}).join("")}function Ft(){let e=i("machine-picker");if(!e)return;e.classList.remove("hidden"),xe(),Oe.value=!1,Ks();let t=i("machine-picker-status");if(t){let n=(Q.peek()||[]).filter(s=>s.online!==!1).length;t.textContent=`${n} online`}}function zs(){i("machine-picker")?.classList.add("hidden"),xe(),Oe.value=!0}function Ut(){i("machine-menu")?.classList.add("hidden")}function Vn(){let e=i("machine-menu-list"),t=i("machine-menu-empty");if(!e)return;let n=Q.peek()||[],s=j.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 "),l=a.connectedAt?new Date(a.connectedAt).toLocaleTimeString():"";return`
523
+ </button>`}).join("")}function Ft(){let e=i("machine-picker");if(!e)return;e.classList.remove("hidden"),xe(),Be.value=!1,Ks();let t=i("machine-picker-status");if(t){let n=(Q.peek()||[]).filter(s=>s.online!==!1).length;t.textContent=`${n} online`}}function zs(){i("machine-picker")?.classList.add("hidden"),xe(),Be.value=!0}function Ut(){i("machine-menu")?.classList.add("hidden")}function Vn(){let e=i("machine-menu-list"),t=i("machine-menu-empty");if(!e)return;let n=Q.peek()||[],s=j.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 "),l=a.connectedAt?new Date(a.connectedAt).toLocaleTimeString():"";return`
524
524
  <button type="button"
525
525
  class="machine-menu-item w-full text-left px-2 py-1.5 rounded-md text-xs
526
526
  ${r?"bg-primary/15 text-primary":"hover:bg-base-200"}
@@ -534,8 +534,8 @@ ${t}`:"",n.length?n.join(`
534
534
  <span class="text-[9px] ${o?"text-success":"text-error"}">${o?"online":"offline"}</span>
535
535
  </div>
536
536
  ${d||l?`<div class="text-[10px] text-base-content/40 pl-3.5 mt-0.5 truncate">${p(d)}${l?" \xB7 "+p(l):""}</div>`:""}
537
- </button>`}).join("")}function gt(){let e=i("machine-menu-wrap"),t=i("topbar-machine-label"),n=i("topbar-machine-dot");if(!A.peek()){e?.classList.add("hidden");return}e?.classList.remove("hidden");let s=j.peek()||"",o=(Q.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)),Vn()}function no(){br||(br=setInterval(async()=>{if(!A.peek()||!f.token)return;await qt(),gt();let e=j.peek();if(e){let t=(Q.peek()||[]).find(n=>n.id===e);if(t&&t.online===!1){let n=i("topbar-machine-label");n&&(n.textContent=`${e} (offline)`)}}},15e3))}async function so(e,{forceReload:t=!1}={}){if(!e)return;let n=j.peek(),s=n&&n!==e;if(ge(e),zs(),Ut(),gt(),s||t){try{f.ws?.close()}catch{}f.ws=null,f.sessionId=null,ae(()=>{E.value=null,fe.value=null,re.value=null});try{let{filesRoot:o,gitRoot:r,filesPath:d}=await Promise.resolve().then(()=>(B(),No));o.value="",r.value="",d.value=""}catch{}if(s){let{goHome:o}=await Promise.resolve().then(()=>(Xn(),xr));o()}}let a=i("topbar-project");a&&!E.peek()&&(a.textContent=`Machine \xB7 ${e}`),Gn(),await Promise.all([Ke(),yn(),Jn(),wn().catch(()=>{})]),Oe.value=!0}var br,Yn=K(()=>{R();B();ue();Bt();Qn();Kn();en();br=null});var xr={};as(xr,{goHome:()=>Vs,openProject:()=>ao,resumeSession:()=>Pe,switchTab:()=>it});function Qs(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 ao(e){cn(),un(),fn(),pn();let t=e?.path||"";ae(()=>{E.value=e,fe.value=t,t&&(ce.value=t,be.value=t,z.value="",re.value=null)}),f.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),Qs(e?.machineId||j.peek()||f.machineId),i("welcome").classList.add("hidden");let a=i("project-view");a.classList.remove("hidden"),a.style.display="flex",mn(),dn({sessionId:null}),st(),it("chat")}function Vs(){cn(),un(),fn(),pn(),E.value=null,fe.value=null,ce.value="",be.value="",z.value="",re.value=null,f.sessionId=null,dn({sessionId:null}),Qs(null),document.documentElement.classList.remove("boot-restore");let e=i("topbar-project");e&&(e.textContent="Select a session");let t=i("welcome");t&&(t.classList.remove("hidden"),t.style.display="",Rt(Ht()));let n=i("project-view");n&&(n.classList.add("hidden"),n.style.display="none"),Pa("/")}async function Pe(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"),l=O.peek().find(S=>S.sessionId===e&&(!a||S.machineId===a||!S.machineId)),c=Et(),u=c?.sessionId===e?c:null,h=s||l?.agent||u?.agent||"claude",x=a||l?.machineId||u?.machineId||j.peek()||null,v=t||l?.cwd||u?.cwd||null,C=n||l?.configDir||u?.configDir||null;if(cn(),un(),fn(),pn(),x&&x!==f.machineId){ge(x);try{f.ws?.close()}catch{}f.ws=null,Promise.resolve().then(()=>(Yn(),gr)).then(({syncTopbarMachine:S})=>S()).catch(()=>{}),Promise.resolve().then(()=>(Bt(),lr)).then(({loadAllSessions:S})=>S()).catch(()=>{})}f.sessionId=e,f.configDir=C,f.agent=h,qe(h),Ne(),dn({sessionId:e,agent:h,machineId:x});let F=v;vr(F,x,e),st(),F&&y("POST","/api/resolve-path",{path:F},void 0,{machineId:x||void 0}).then(S=>{f.sessionId!==e||!S?.path||S.path===F||(F=S.path,vr(F,x,e),ka({sessionId:e,cwd:F}))}).catch(()=>{}),mn(),it(r);{let S=O.peek();O.value=Array.isArray(S)?[...S]:[]}ka({sessionId:e,cwd:F||v,configDir:C,agent:h,machineId:x,tab:r}),Xi({sessionId:e,cwd:F||v,configDir:C,agent:h,machineId:x,display:l?.display||u?.display||"",projectName:l?.projectName||u?.projectName||"",updatedAt:l?.updatedAt||u?.updatedAt||null});let ke=te[h]||h,J=`${x||""}:${h}:${e}`,ne=(S,_,se={})=>{if(f.sessionId!==e)return;if(i("messages").innerHTML="",!S.length){L(`${ke} \xB7 ${e.slice(0,8)}\u2026 \u2014 no history`);return}De();let M=40,V=0,rt=()=>{if(f.sessionId!==e)return;let xt=Math.min(V+M,S.length);for(;V<xt;V++){let b=S[V],w=q(b.ts??b.timestamp),k=b.type||(b.role?"text":null);if(k==="text"||b.role&&b.content!=null&&!b.name){(b.role==="assistant"||b.role==="user")&&De();let W=typeof b.content=="string"?b.content:Array.isArray(b.content)?b.content.map(Y=>Y?.text||"").filter(Boolean).join(`
538
- `):String(b.content??"");W&&At(b.role==="user"?"user":"assistant",b.role==="user"?"You":ke,W,{ts:w})}else k==="tool_use"||b.name?ja({name:b.name||"tool",input:b.input??b.arguments??{}},{ts:w}):(k==="token_usage"||b.usage)&&(De(),ln(b.usage||b))}if(V<S.length){requestAnimationFrame(rt);return}De(),_&&Aa(_);let vt=S.filter(b=>b.type==="token_usage").length||S.filter(b=>b.role==="user").length,m=se.truncated?` (showing last ${S.length} of ${se.total||"?"})`:"";L(`\u2500\u2500 ${ke} history \xB7 ${vt} turn${vt!==1?"s":""}${m} \u2500\u2500`)};rt()},N=async()=>{let S=Js.get(J);if(S&&S.msgs?.length&&Date.now()-S.at<tc){ne(S.msgs,S.context,S.meta);return}L(`Loading ${ke} history\u2026`);try{let _=x||j.peek()||f.machineId||null;if(A.peek()&&!_)throw new Error("\u672A\u9009\u62E9\u673A\u5668\uFF0C\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2");_&&f.machineId!==_&&ge(_);let se=async vt=>{let m=new URLSearchParams({tail:"0",compact:"1",cache:"prefer"});return vt&&m.set("agent",vt),_&&m.set("machine",_),y("GET",`/api/sessions/${e}/messages?${m}`,void 0,void 0,{machineId:_||void 0,dedupe:!1})},M=await se(h),V=Array.isArray(M)?M:M?.messages||[];!V.length&&h&&(M=await se(null),V=Array.isArray(M)?M:M?.messages||[]);let rt=Array.isArray(M)?null:M?.context||null,xt=Array.isArray(M)?{}:{truncated:M?.truncated,total:M?.total};V.length?Js.set(J,{msgs:V,context:rt,meta:xt,at:Date.now()}):Js.delete(J),ne(V,rt,xt)}catch(_){if(f.sessionId!==e)return;Js.delete(J),i("messages").innerHTML="",L(`${ke} \xB7 ${e.slice(0,8)}\u2026 (history unavailable: ${_.message})`)}};d?N().catch(()=>{}):(await new Promise(S=>requestAnimationFrame(S)),N().catch(()=>{})),Bn(),_e()}function vr(e,t,n){if(e){let s=e.split("/").filter(Boolean).pop()||e;ae(()=>{E.value={id:s,name:s,path:e,machineId:t},fe.value=e,ce.value=e,be.value=e,z.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),Qs(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"),Qs(t)}}function it(e){U.value=e}var Js,tc,Xn=K(()=>{R();B();ue();ds();hn();Ss();Bt();Qn();Qa();Js=new Map,tc=180*1e3});B();ue();R();B();ue();var Xt=null;function Oo(){return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone===!0||document.referrer.includes("android-app://")}function Vr(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 Yr(){if(!("serviceWorker"in navigator)||!window.isSecureContext)return!1;let e=location.hostname;return e==="localhost"||e==="127.0.0.1"||e==="::1"?!0:Vr(e)?!1:location.protocol==="https:"}function Bo(){document.getElementById("btn-pwa-install")?.classList.remove("hidden")}function qo(){Oo()&&document.documentElement.classList.add("pwa-standalone"),window.addEventListener("beforeinstallprompt",n=>{n.preventDefault(),Xt=n,document.dispatchEvent(new CustomEvent("pwa-installable")),Bo()}),window.addEventListener("appinstalled",()=>{Xt=null,document.getElementById("btn-pwa-install")?.classList.add("hidden")});let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1;if(!Oo()&&(e||/Android/i.test(navigator.userAgent))&&requestAnimationFrame(()=>Bo()),!Yr()){"serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{});return}let t=()=>{navigator.serviceWorker.register("/sw.js",{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))}async function Fo(){if(!Xt)return!1;Xt.prompt();let e=await Xt.userChoice.catch(()=>null);return Xt=null,document.getElementById("btn-pwa-install")?.classList.add("hidden"),e?.outcome==="accepted"}en();ds();hn();Ss();R();ue();B();Ts();function Mi(){document.getElementById("root").insertAdjacentHTML("beforeend",`
537
+ </button>`}).join("")}function gt(){let e=i("machine-menu-wrap"),t=i("topbar-machine-label"),n=i("topbar-machine-dot");if(!A.peek()){e?.classList.add("hidden");return}e?.classList.remove("hidden");let s=j.peek()||"",o=(Q.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)),Vn()}function no(){br||(br=setInterval(async()=>{if(!A.peek()||!f.token)return;await qt(),gt();let e=j.peek();if(e){let t=(Q.peek()||[]).find(n=>n.id===e);if(t&&t.online===!1){let n=i("topbar-machine-label");n&&(n.textContent=`${e} (offline)`)}}},15e3)),gr||(gr=setInterval(()=>{document.visibilityState!=="visible"||!A.peek()||!f.token||!j.peek()||Ne({waitFresh:!1,hubIndex:!0}).catch(()=>{})},2e3))}async function so(e,{forceReload:t=!1}={}){if(!e)return;let n=j.peek(),s=n&&n!==e;if(ge(e),zs(),Ut(),gt(),s||t){try{f.ws?.close()}catch{}f.ws=null,f.sessionId=null,ae(()=>{E.value=null,fe.value=null,re.value=null});try{let{filesRoot:o,gitRoot:r,filesPath:d}=await Promise.resolve().then(()=>(B(),No));o.value="",r.value="",d.value=""}catch{}if(s){let{goHome:o}=await Promise.resolve().then(()=>(Xn(),vr));o()}}let a=i("topbar-project");a&&!E.peek()&&(a.textContent=`Machine \xB7 ${e}`),Gn(),await Promise.all([Ne(),yn(),Jn(),wn().catch(()=>{})]),Be.value=!0}var br,gr,Yn=K(()=>{R();B();ue();Bt();Qn();Kn();en();br=null,gr=null});var vr={};as(vr,{goHome:()=>Vs,openProject:()=>ao,resumeSession:()=>He,switchTab:()=>it});function Qs(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 ao(e){cn(),un(),fn(),pn();let t=e?.path||"";ae(()=>{E.value=e,fe.value=t,t&&(ce.value=t,be.value=t,z.value="",re.value=null)}),f.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),Qs(e?.machineId||j.peek()||f.machineId),i("welcome").classList.add("hidden");let a=i("project-view");a.classList.remove("hidden"),a.style.display="flex",mn(),dn({sessionId:null}),st(),it("chat")}function Vs(){cn(),un(),fn(),pn(),E.value=null,fe.value=null,ce.value="",be.value="",z.value="",re.value=null,f.sessionId=null,dn({sessionId:null}),Qs(null),document.documentElement.classList.remove("boot-restore");let e=i("topbar-project");e&&(e.textContent="Select a session");let t=i("welcome");t&&(t.classList.remove("hidden"),t.style.display="",Rt(Ht()));let n=i("project-view");n&&(n.classList.add("hidden"),n.style.display="none"),Pa("/")}async function He(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"),l=O.peek().find(S=>S.sessionId===e&&(!a||S.machineId===a||!S.machineId)),c=Et(),u=c?.sessionId===e?c:null,h=s||l?.agent||u?.agent||"claude",x=a||l?.machineId||u?.machineId||j.peek()||null,v=t||l?.cwd||u?.cwd||null,C=n||l?.configDir||u?.configDir||null;if(cn(),un(),fn(),pn(),x&&x!==f.machineId){ge(x);try{f.ws?.close()}catch{}f.ws=null,Promise.resolve().then(()=>(Yn(),xr)).then(({syncTopbarMachine:S})=>S()).catch(()=>{}),Promise.resolve().then(()=>(Bt(),lr)).then(({loadAllSessions:S})=>S()).catch(()=>{})}f.sessionId=e,f.configDir=C,f.agent=h,Fe(h),_e(),dn({sessionId:e,agent:h,machineId:x});let F=v;yr(F,x,e),st(),F&&y("POST","/api/resolve-path",{path:F},void 0,{machineId:x||void 0}).then(S=>{f.sessionId!==e||!S?.path||S.path===F||(F=S.path,yr(F,x,e),ka({sessionId:e,cwd:F}))}).catch(()=>{}),mn(),it(r);{let S=O.peek();O.value=Array.isArray(S)?[...S]:[]}ka({sessionId:e,cwd:F||v,configDir:C,agent:h,machineId:x,tab:r}),Xi({sessionId:e,cwd:F||v,configDir:C,agent:h,machineId:x,display:l?.display||u?.display||"",projectName:l?.projectName||u?.projectName||"",updatedAt:l?.updatedAt||u?.updatedAt||null});let ke=te[h]||h,J=`${x||""}:${h}:${e}`,ne=(S,_,se={})=>{if(f.sessionId!==e)return;if(i("messages").innerHTML="",!S.length){L(`${ke} \xB7 ${e.slice(0,8)}\u2026 \u2014 no history`);return}De();let M=40,V=0,rt=()=>{if(f.sessionId!==e)return;let xt=Math.min(V+M,S.length);for(;V<xt;V++){let b=S[V],w=q(b.ts??b.timestamp),k=b.type||(b.role?"text":null);if(k==="text"||b.role&&b.content!=null&&!b.name){(b.role==="assistant"||b.role==="user")&&De();let W=typeof b.content=="string"?b.content:Array.isArray(b.content)?b.content.map(Y=>Y?.text||"").filter(Boolean).join(`
538
+ `):String(b.content??"");W&&At(b.role==="user"?"user":"assistant",b.role==="user"?"You":ke,W,{ts:w})}else k==="tool_use"||b.name?ja({name:b.name||"tool",input:b.input??b.arguments??{}},{ts:w}):(k==="token_usage"||b.usage)&&(De(),ln(b.usage||b))}if(V<S.length){requestAnimationFrame(rt);return}De(),_&&Aa(_);let vt=S.filter(b=>b.type==="token_usage").length||S.filter(b=>b.role==="user").length,m=se.truncated?` (showing last ${S.length} of ${se.total||"?"})`:"";L(`\u2500\u2500 ${ke} history \xB7 ${vt} turn${vt!==1?"s":""}${m} \u2500\u2500`)};rt()},N=async()=>{let S=Js.get(J);if(S&&S.msgs?.length&&Date.now()-S.at<nc){ne(S.msgs,S.context,S.meta);return}L(`Loading ${ke} history\u2026`);try{let _=x||j.peek()||f.machineId||null;if(A.peek()&&!_)throw new Error("\u672A\u9009\u62E9\u673A\u5668\uFF0C\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2");_&&f.machineId!==_&&ge(_);let se=async vt=>{let m=new URLSearchParams({tail:"0",compact:"1",cache:"prefer"});return vt&&m.set("agent",vt),_&&m.set("machine",_),y("GET",`/api/sessions/${e}/messages?${m}`,void 0,void 0,{machineId:_||void 0,dedupe:!1})},M=await se(h),V=Array.isArray(M)?M:M?.messages||[];!V.length&&h&&(M=await se(null),V=Array.isArray(M)?M:M?.messages||[]);let rt=Array.isArray(M)?null:M?.context||null,xt=Array.isArray(M)?{}:{truncated:M?.truncated,total:M?.total};V.length?Js.set(J,{msgs:V,context:rt,meta:xt,at:Date.now()}):Js.delete(J),ne(V,rt,xt)}catch(_){if(f.sessionId!==e)return;Js.delete(J),i("messages").innerHTML="",L(`${ke} \xB7 ${e.slice(0,8)}\u2026 (history unavailable: ${_.message})`)}};d?N().catch(()=>{}):(await new Promise(S=>requestAnimationFrame(S)),N().catch(()=>{})),Bn(),Pe()}function yr(e,t,n){if(e){let s=e.split("/").filter(Boolean).pop()||e;ae(()=>{E.value={id:s,name:s,path:e,machineId:t},fe.value=e,ce.value=e,be.value=e,z.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),Qs(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"),Qs(t)}}function it(e){U.value=e}var Js,nc,Xn=K(()=>{R();B();ue();ds();hn();Ss();Bt();Qn();Qa();Js=new Map,nc=180*1e3});B();ue();R();B();ue();var Xt=null;function Oo(){return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone===!0||document.referrer.includes("android-app://")}function Yr(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 Xr(){if(!("serviceWorker"in navigator)||!window.isSecureContext)return!1;let e=location.hostname;return e==="localhost"||e==="127.0.0.1"||e==="::1"?!0:Yr(e)?!1:location.protocol==="https:"}function Bo(){document.getElementById("btn-pwa-install")?.classList.remove("hidden")}function qo(){Oo()&&document.documentElement.classList.add("pwa-standalone"),window.addEventListener("beforeinstallprompt",n=>{n.preventDefault(),Xt=n,document.dispatchEvent(new CustomEvent("pwa-installable")),Bo()}),window.addEventListener("appinstalled",()=>{Xt=null,document.getElementById("btn-pwa-install")?.classList.add("hidden")});let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1;if(!Oo()&&(e||/Android/i.test(navigator.userAgent))&&requestAnimationFrame(()=>Bo()),!Xr()){"serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{});return}let t=()=>{navigator.serviceWorker.register("/sw.js",{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))}async function Fo(){if(!Xt)return!1;Xt.prompt();let e=await Xt.userChoice.catch(()=>null);return Xt=null,document.getElementById("btn-pwa-install")?.classList.add("hidden"),e?.outcome==="accepted"}en();ds();hn();Ss();R();ue();B();Ts();function Mi(){document.getElementById("root").insertAdjacentHTML("beforeend",`
539
539
  <dialog id="modal-settings" class="modal">
540
540
  <div class="modal-box max-w-lg">
541
541
  <h3 class="font-bold text-base mb-4">Settings</h3>
@@ -573,14 +573,14 @@ ${t}`:"",n.length?n.join(`
573
573
  </div>
574
574
  </div>
575
575
  <form method="dialog" class="modal-backdrop"><button>close</button></form>
576
- </dialog>`),Ms(),document.getElementById("ws-add-btn").addEventListener("click",Ha),document.getElementById("ws-new-name").addEventListener("keydown",e=>{e.key==="Enter"&&Ha()}),document.getElementById("ws-new-dir").addEventListener("keydown",e=>{e.key==="Enter"&&Ha()}),document.getElementById("mcp-token-generate").addEventListener("click",Pl),document.getElementById("mcp-token-copy").addEventListener("click",Hl)}function Ms(){let e=i("ws-list");if(!e)return;let t=ee.peek();if(!t.length){e.innerHTML='<div class="text-xs text-base-content/40">No workspaces configured</div>';return}e.innerHTML=t.map(n=>`
576
+ </dialog>`),Ms(),document.getElementById("ws-add-btn").addEventListener("click",Ha),document.getElementById("ws-new-name").addEventListener("keydown",e=>{e.key==="Enter"&&Ha()}),document.getElementById("ws-new-dir").addEventListener("keydown",e=>{e.key==="Enter"&&Ha()}),document.getElementById("mcp-token-generate").addEventListener("click",Hl),document.getElementById("mcp-token-copy").addEventListener("click",Rl)}function Ms(){let e=i("ws-list");if(!e)return;let t=ee.peek();if(!t.length){e.innerHTML='<div class="text-xs text-base-content/40">No workspaces configured</div>';return}e.innerHTML=t.map(n=>`
577
577
  <div class="flex items-center gap-2 px-3 py-2 bg-base-200 rounded-lg">
578
578
  <div class="flex-1 min-w-0">
579
579
  <div class="text-sm font-medium">${p(n.name)}</div>
580
580
  <div class="text-xs font-mono text-base-content/50 truncate">${p(n.configDir)}</div>
581
581
  </div>
582
582
  ${t.length>1?`<button class="btn btn-ghost btn-xs text-error" data-ws-delete="${p(n.id)}">\u2715</button>`:'<span class="text-[10px] text-base-content/30">default</span>'}
583
- </div>`).join(""),e.querySelectorAll("[data-ws-delete]").forEach(n=>{n.addEventListener("click",()=>_l(n.dataset.wsDelete))})}async function Ha(){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="Name and path are required",n.classList.remove("hidden");return}try{let s=await y("POST","/api/workspaces",{name:e,configDir:t});ee.value=[...ee.peek(),s],qn(ee.peek()),i("ws-new-name").value="",i("ws-new-dir").value="",Ms()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}async function _l(e){try{await y("DELETE",`/api/workspaces/${e}`),ee.value=ee.peek().filter(t=>t.id!==e),qn(ee.peek()),Ms()}catch(t){alert(t.message)}}function Ra(){Ms();let e=i("mcp-token-settings");e&&(e.style.display=A.peek()?"":"none"),i("modal-settings")?.showModal()}async function Pl(){let e=i("mcp-token-result"),t=i("mcp-token-error");e?.classList.add("hidden"),t?.classList.add("hidden");let n=j.peek();if(!n){t.textContent="\u8BF7\u9009\u62E9\u4E00\u53F0\u5728\u7EBF\u673A\u5668\u540E\u518D\u751F\u6210 Token\u3002",t.classList.remove("hidden");return}try{let s=Number(i("mcp-token-expiry").value),a=await y("POST",`/api/mcp/tokens?machine=${encodeURIComponent(n)}`,{expiresInSeconds:s});i("mcp-token-value").value=a.token||"",e.classList.remove("hidden")}catch(s){t.textContent=s.message,t.classList.remove("hidden")}}async function Hl(){let e=i("mcp-token-value")?.value;if(e)try{await navigator.clipboard.writeText(e)}catch{i("mcp-token-value")?.select(),document.execCommand("copy")}}Kn();La();B();var Wi=()=>`
583
+ </div>`).join(""),e.querySelectorAll("[data-ws-delete]").forEach(n=>{n.addEventListener("click",()=>Pl(n.dataset.wsDelete))})}async function Ha(){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="Name and path are required",n.classList.remove("hidden");return}try{let s=await y("POST","/api/workspaces",{name:e,configDir:t});ee.value=[...ee.peek(),s],qn(ee.peek()),i("ws-new-name").value="",i("ws-new-dir").value="",Ms()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}async function Pl(e){try{await y("DELETE",`/api/workspaces/${e}`),ee.value=ee.peek().filter(t=>t.id!==e),qn(ee.peek()),Ms()}catch(t){alert(t.message)}}function Ra(){Ms();let e=i("mcp-token-settings");e&&(e.style.display=A.peek()?"":"none"),i("modal-settings")?.showModal()}async function Hl(){let e=i("mcp-token-result"),t=i("mcp-token-error");e?.classList.add("hidden"),t?.classList.add("hidden");let n=j.peek();if(!n){t.textContent="\u8BF7\u9009\u62E9\u4E00\u53F0\u5728\u7EBF\u673A\u5668\u540E\u518D\u751F\u6210 Token\u3002",t.classList.remove("hidden");return}try{let s=Number(i("mcp-token-expiry").value),a=await y("POST",`/api/mcp/tokens?machine=${encodeURIComponent(n)}`,{expiresInSeconds:s});i("mcp-token-value").value=a.token||"",e.classList.remove("hidden")}catch(s){t.textContent=s.message,t.classList.remove("hidden")}}async function Rl(){let e=i("mcp-token-value")?.value;if(e)try{await navigator.clipboard.writeText(e)}catch{i("mcp-token-value")?.select(),document.execCommand("copy")}}Kn();La();B();var Wi=()=>`
584
584
  <div id="auth-screen" class="${f.token?"hidden":""} flex items-center justify-center h-full p-4" ${f.token?'style="display:none"':""}>
585
585
  <div class="card bg-base-200 border border-base-300 w-full max-w-sm shadow-xl">
586
586
  <div class="card-body gap-3 p-8">
@@ -997,7 +997,7 @@ ${t}`:"",n.length?n.join(`
997
997
  </div>
998
998
  </div>
999
999
  <form method="dialog" class="modal-backdrop"><button>close</button></form>
1000
- </dialog>`};Qa();Bt();Xn();R();B();ue();Ts();ds();Bt();Qn();Kn();Xn();Yn();en();async function Ys(e={}){i("auth-screen").style.display="none";let t=i("app");t.classList.remove("hidden"),t.style.display="flex",queueMicrotask(xe);let n=e.hub;n===void 0?n=await Yt():n?(A.value=!0,n.machines&&(Q.value=n.machines)):A.value=!1;let s=e.deepLink||null,a=Et();if(!!(s?.id||(location.hash||"").startsWith("#/session/"))){let d=i("welcome");d&&(d.classList.add("hidden"),d.style.display="none");let l=i("project-view");l&&(l.classList.remove("hidden"),l.style.display="flex",l.style.flexDirection="column",l.style.flex="1",l.style.minHeight="0")}if(A.peek()){let d=localStorage.getItem("machineId")||a?.machineId||"";d&&(ge(d),zs(),Oe.value=!0,Gn());let l=qt().then(h=>(gt(),d&&!h.some(v=>v.id===d&&v.online!==!1)&&h.length&&(h.some(C=>C.id===d)||(ge(null),Ft())),h));no(),gt();let c=Promise.all([Ke({waitFresh:!1}),yn({waitFresh:!1}),Jn().catch(()=>{}),wn().catch(()=>{})]);if(s?.id){let h=O.peek().find(x=>x.sessionId===s.id)||(a?.sessionId===s.id?a:null);await Pe(s.id,h?.cwd||null,h?.configDir||null,s.agent||h?.agent||null,s.machineId||h?.machineId||d||null,{tab:s.tab||"chat"}),l.catch(()=>{}),c.catch(()=>{});return}if(!d){if(await l,!(Q.peek()||[]).length){Ft(),c.catch(()=>{});return}Ft(),c.catch(()=>{});return}await c;let u=i("topbar-project");u&&u.textContent==="Select a session"&&(u.textContent=`Machine \xB7 ${d}`);return}Gn();let r=Promise.all([Ke({waitFresh:!1}),yn({waitFresh:!1}),Jn().catch(()=>{}),wn().catch(()=>{})]);if(s?.id){await Es().then(l=>{Array.isArray(l)?O.value=l:l&&Array.isArray(l.sessions)&&(O.value=l.sessions)}).catch(()=>{});let d=O.peek().find(l=>l.sessionId===s.id)||(a?.sessionId===s.id?a:null);await Pe(s.id,d?.cwd||null,d?.configDir||null,s.agent||d?.agent||null,null,{tab:s.tab||"chat"}),r.catch(()=>{});return}await r}Qn();Yn();R();B();ue();hn();Bt();Xn();Yn();en();function yr(){let e=i("sidebar");e&&(e.classList.add("open"),i("sidebar-overlay").classList.remove("hidden"),i("hamburger")?.setAttribute("aria-expanded","true"),xe(),setTimeout(()=>i("session-search")?.focus({preventScroll:!0}),180))}function Zn(){let e=i("sidebar");e&&(e.classList.remove("open"),i("sidebar-overlay").classList.add("hidden"),i("hamburger")?.setAttribute("aria-expanded","false"),xe(),i("hamburger")?.focus({preventScroll:!0}))}function wr(){window.innerWidth<=640&&Zn()}function kr(){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 $r(){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 oo(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 io(){let e=document.documentElement.getAttribute("data-theme")||"dark";oo(e==="dark"?"light":"dark")}function ro(){let e=i("new-session-agent");e&&(e.value=I.peek()||"claude");let t=i("new-session-workspace");if(t){let a=ee.peek();t.innerHTML=a.map(o=>`<option value="${p(o.configDir)}">${p(o.name)} \u2014 ${p(o.configDir)}</option>`).join(""),f.configDir&&(t.value=f.configDir)}let n=i("new-session-machine-wrap"),s=i("new-session-machine");if(n&&s)if(A.peek()){n.style.display="";let a=Q.peek()||[],o=j.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);lo(),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 lo(){let e=i("new-session-agent")?.value||"claude",t=i("new-session-ws-wrap");t&&(t.style.display=e==="claude"?"":"none")}async function co(){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(A.peek()){let a=j.peek()||i("new-session-machine")?.value||Q.peek()?.[0]?.id;if(!a){s.textContent="\u8BF7\u5148\u9009\u62E9\u4E00\u53F0\u673A\u5668",s.classList.remove("hidden"),Ft();return}ge(a)}try{let a=await y("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;cn(),un(),fn(),pn(),f.sessionId=null,f.configDir=n||null,f.agent=t,qe(t),le(Be(t)||P.peek()),Ne(),ae(()=>{E.value={id:o,name:o,path:a.path,machineId:j.peek()||f.machineId},fe.value=a.path,ce.value=a.path,be.value=a.path,z.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 l=i("project-view");l.classList.remove("hidden"),l.style.display="flex",mn(),dn({sessionId:null}),st(),it("chat"),L(`New ${te[t]||t} session \xB7 ${a.path}`)}catch(a){s.textContent=a.message,s.classList.remove("hidden")}}function nc(){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">
1000
+ </dialog>`};Qa();Bt();Xn();R();B();ue();Ts();ds();Bt();Qn();Kn();Xn();Yn();en();async function Ys(e={}){i("auth-screen").style.display="none";let t=i("app");t.classList.remove("hidden"),t.style.display="flex",queueMicrotask(xe);let n=e.hub;n===void 0?n=await Yt():n?(A.value=!0,n.machines&&(Q.value=n.machines)):A.value=!1;let s=e.deepLink||null,a=Et();if(!!(s?.id||(location.hash||"").startsWith("#/session/"))){let d=i("welcome");d&&(d.classList.add("hidden"),d.style.display="none");let l=i("project-view");l&&(l.classList.remove("hidden"),l.style.display="flex",l.style.flexDirection="column",l.style.flex="1",l.style.minHeight="0")}if(A.peek()){let d=localStorage.getItem("machineId")||a?.machineId||"";d&&(ge(d),zs(),Be.value=!0,Gn());let l=qt().then(h=>(gt(),d&&!h.some(v=>v.id===d&&v.online!==!1)&&h.length&&(h.some(C=>C.id===d)||(ge(null),Ft())),h));no(),gt();let c=Promise.all([Ne({waitFresh:!1}),yn({waitFresh:!1}),Jn().catch(()=>{}),wn().catch(()=>{})]);if(s?.id){let h=O.peek().find(x=>x.sessionId===s.id)||(a?.sessionId===s.id?a:null);await He(s.id,h?.cwd||null,h?.configDir||null,s.agent||h?.agent||null,s.machineId||h?.machineId||d||null,{tab:s.tab||"chat"}),l.catch(()=>{}),c.catch(()=>{});return}if(!d){if(await l,!(Q.peek()||[]).length){Ft(),c.catch(()=>{});return}Ft(),c.catch(()=>{});return}await c;let u=i("topbar-project");u&&u.textContent==="Select a session"&&(u.textContent=`Machine \xB7 ${d}`);return}Gn();let r=Promise.all([Ne({waitFresh:!1}),yn({waitFresh:!1}),Jn().catch(()=>{}),wn().catch(()=>{})]);if(s?.id){await Es().then(l=>{Array.isArray(l)?O.value=l:l&&Array.isArray(l.sessions)&&(O.value=l.sessions)}).catch(()=>{});let d=O.peek().find(l=>l.sessionId===s.id)||(a?.sessionId===s.id?a:null);await He(s.id,d?.cwd||null,d?.configDir||null,s.agent||d?.agent||null,null,{tab:s.tab||"chat"}),r.catch(()=>{});return}await r}Qn();Yn();R();B();ue();hn();Bt();Xn();Yn();en();function wr(){let e=i("sidebar");e&&(e.classList.add("open"),i("sidebar-overlay").classList.remove("hidden"),i("hamburger")?.setAttribute("aria-expanded","true"),xe(),setTimeout(()=>i("session-search")?.focus({preventScroll:!0}),180))}function Zn(){let e=i("sidebar");e&&(e.classList.remove("open"),i("sidebar-overlay").classList.add("hidden"),i("hamburger")?.setAttribute("aria-expanded","false"),xe(),i("hamburger")?.focus({preventScroll:!0}))}function kr(){window.innerWidth<=640&&Zn()}function $r(){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 Sr(){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 oo(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 io(){let e=document.documentElement.getAttribute("data-theme")||"dark";oo(e==="dark"?"light":"dark")}function ro(){let e=i("new-session-agent");e&&(e.value=I.peek()||"claude");let t=i("new-session-workspace");if(t){let a=ee.peek();t.innerHTML=a.map(o=>`<option value="${p(o.configDir)}">${p(o.name)} \u2014 ${p(o.configDir)}</option>`).join(""),f.configDir&&(t.value=f.configDir)}let n=i("new-session-machine-wrap"),s=i("new-session-machine");if(n&&s)if(A.peek()){n.style.display="";let a=Q.peek()||[],o=j.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);lo(),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 lo(){let e=i("new-session-agent")?.value||"claude",t=i("new-session-ws-wrap");t&&(t.style.display=e==="claude"?"":"none")}async function co(){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(A.peek()){let a=j.peek()||i("new-session-machine")?.value||Q.peek()?.[0]?.id;if(!a){s.textContent="\u8BF7\u5148\u9009\u62E9\u4E00\u53F0\u673A\u5668",s.classList.remove("hidden"),Ft();return}ge(a)}try{let a=await y("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;cn(),un(),fn(),pn(),f.sessionId=null,f.configDir=n||null,f.agent=t,Fe(t),le(qe(t)||P.peek()),_e(),ae(()=>{E.value={id:o,name:o,path:a.path,machineId:j.peek()||f.machineId},fe.value=a.path,ce.value=a.path,be.value=a.path,z.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 l=i("project-view");l.classList.remove("hidden"),l.style.display="flex",mn(),dn({sessionId:null}),st(),it("chat"),L(`New ${te[t]||t} session \xB7 ${a.path}`)}catch(a){s.textContent=a.message,s.classList.remove("hidden")}}function sc(){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">
1001
1001
  <li>\u70B9\u5E95\u90E8\u5206\u4EAB\u6309\u94AE <strong>\u5206\u4EAB</strong>\uFF08\u65B9\u6846+\u5411\u4E0A\u7BAD\u5934\uFF09</li>
1002
1002
  <li>\u4E0B\u6ED1\u627E\u5230\u5E76\u70B9 <strong>\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55</strong></li>
1003
1003
  <li>\u786E\u8BA4\u540D\u79F0\u540E\u70B9 <strong>\u6DFB\u52A0</strong></li>
@@ -1016,29 +1016,29 @@ ${t}`:"",n.length?n.join(`
1016
1016
  <form method="dialog"><button class="btn btn-sm">\u77E5\u9053\u4E86</button></form>
1017
1017
  </div>
1018
1018
  </div>
1019
- <form method="dialog" class="modal-backdrop"><button>close</button></form>`,s.showModal()}async function po(){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 y("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 uo(){let e=i("auth-username").value.trim(),t=i("auth-password").value,n=i("auth-error");n.classList.add("hidden");try{let s=await y("POST",`/api/auth/${i("auth-btn").dataset.mode||"login"}`,{username:e,password:t});f.token=s.token,localStorage.setItem("token",s.token),Ys()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}function fo(){return f.token?/^#\/session\//.test(location.hash||""):!1}function Sr(e={}){if(oo(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??fo(),n=document.getElementById("root");if(n.style.cssText="display:flex;flex-direction:column;flex:1;height:100%",n.innerHTML=Wi()+Gi({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>')}Ce(()=>{let l=ee.value,c=i("ws-tabs");if(!c)return;if(l.length<=1){c.innerHTML="";return}let u=fe.peek();c.innerHTML=[{id:null,name:"All"},...l].map(h=>`<button class="px-3 py-1.5 text-[11px] flex-shrink-0 border-b-2 whitespace-nowrap
1019
+ <form method="dialog" class="modal-backdrop"><button>close</button></form>`,s.showModal()}async function po(){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 y("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 uo(){let e=i("auth-username").value.trim(),t=i("auth-password").value,n=i("auth-error");n.classList.add("hidden");try{let s=await y("POST",`/api/auth/${i("auth-btn").dataset.mode||"login"}`,{username:e,password:t});f.token=s.token,localStorage.setItem("token",s.token),Ys()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}function fo(){return f.token?/^#\/session\//.test(location.hash||""):!1}function Lr(e={}){if(oo(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??fo(),n=document.getElementById("root");if(n.style.cssText="display:flex;flex-direction:column;flex:1;height:100%",n.innerHTML=Wi()+Gi({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>')}Ce(()=>{let l=ee.value,c=i("ws-tabs");if(!c)return;if(l.length<=1){c.innerHTML="";return}let u=fe.peek();c.innerHTML=[{id:null,name:"All"},...l].map(h=>`<button class="px-3 py-1.5 text-[11px] flex-shrink-0 border-b-2 whitespace-nowrap
1020
1020
  ${(h.id===null?!u:u===h.configDir)?"border-primary text-primary":"border-transparent text-base-content/50 hover:text-base-content"}"
1021
1021
  data-ws-tab="${p(h.configDir||"")}">
1022
1022
  ${p(h.name)}
1023
- </button>`).join("")}),Ce(()=>{ct.value,St.value,Je.value,Qe.value,Re.value,T.value;let l=i("session-list");l&&(l.querySelector(".session-rename-input")||(l.innerHTML=Ya(),Xa()))}),Ce(()=>{O.value,de.value,j.value,A.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"||Rt())}),Le(fe,l=>{let c=i("session-filter-badge");c&&(c.style.display=l?"inline":"none",c.title=l||"")}),Ce(()=>{let l=E.value;if(l&&l.path)dr(l.path);else{let c=i("project-notes-bar");c&&(c.style.display="none")}}),Le(U,l=>{document.querySelectorAll("[data-tab]").forEach(u=>{let h=u.dataset.tab===l;u.classList.toggle("text-primary",h),u.classList.toggle("border-primary",h),u.classList.toggle("text-base-content/50",!h),u.classList.toggle("border-transparent",!h)});let c=i("project-view");c&&!c.classList.contains("hidden")&&(c.style.display="flex",c.style.flexDirection="column",c.style.minHeight="0",c.style.flex="1"),["chat","files","git","shell","memory"].forEach(u=>{let h=i(`tab-${u}`);if(!h)return;let x=u===l;h.classList.toggle("hidden",!x),x?(h.style.display="flex",h.style.flexDirection="column",h.style.flex="1 1 0",h.style.minHeight="0",h.style.overflow="hidden"):h.style.display="none"}),l==="memory"&&qs(),l==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))}),xe()}),$r(),kr(),ti({openSession:Pe});let s=null;document.addEventListener("sessions-changed",()=>{s&&clearTimeout(s),s=setTimeout(()=>{s=null,Ke({waitFresh:!1})},1200)}),document.addEventListener("router:home",Vs),document.addEventListener("router:session",async({detail:{id:l,tab:c,machineId:u,agent:h}})=>{let x=O.peek().find(C=>C.sessionId===l),v=Et();await Pe(l,x?.cwd||(v?.sessionId===l?v.cwd:null)||null,x?.configDir||(v?.sessionId===l?v.configDir:null)||null,h||x?.agent||(v?.sessionId===l?v.agent:null)||null,u||x?.machineId||(v?.sessionId===l?v.machineId:null)||null,{tab:c||"chat"})}),g.on("click","#btn-home",Vs),g.on("click","#btn-share-session",async(l,c)=>{let u=Li();if(u)try{await navigator.clipboard.writeText(u),c.textContent="\u5DF2\u590D\u5236",setTimeout(()=>{c.textContent="\u5206\u4EAB"},1400)}catch{window.prompt("\u590D\u5236\u4F1A\u8BDD\u94FE\u63A5\uFF1A",u)}}),g.on("click","#auth-btn",uo),g.on("submit","#auth-form",l=>{l.preventDefault(),uo()}),g.on("keydown","#auth-username, #auth-password",l=>{l.key==="Enter"&&uo()}),g.on("click","#hamburger",()=>i("sidebar").classList.contains("open")?Zn():yr()),g.on("click","#sidebar-overlay",Zn),document.addEventListener("keydown",l=>{l.key==="Escape"&&window.innerWidth<=640&&i("sidebar")?.classList.contains("open")&&(l.preventDefault(),Zn())}),g.on("input","#session-search",(l,c)=>{me.value=c.value,Bs(c.value)}),g.on("click","#sidebar-filter-toggle",()=>{let l=i("sidebar-filter-menu");if(!l)return;let c=l.classList.toggle("hidden");i("sidebar-filter-toggle")?.setAttribute("aria-expanded",String(!c))}),g.on("change","[data-agent-option]",(l,c)=>{let u=new Set($t.peek());c.checked?u.add(c.dataset.agentOption):u.delete(c.dataset.agentOption);let h=[...u];$t.value=h,localStorage.setItem("agentFilters",JSON.stringify(h)),de.value=h.length===1?h[0]:"all"}),g.on("change","#filter-favorites",(l,c)=>{Ae.value=c.checked,localStorage.setItem("favoritesOnly",c.checked?"1":"0")}),g.on("change","#filter-hidden",(l,c)=>{je.value=c.checked,localStorage.setItem("showHiddenOnly",c.checked?"1":"0")}),g.on("click","#filter-clear",()=>{$t.value=[],de.value="all",Ae.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)}),g.on("click","#session-filter-badge",()=>{fe.value=null}),g.on("click","[data-ws-tab]",(l,c)=>{fe.value=c.dataset.wsTab||null}),g.on("click","#sidebar-refresh",()=>{Ke(),me.peek().trim()&&Os(me.peek())}),g.on("click","[data-view]",(l,c)=>{Je.value=c.dataset.view,localStorage.setItem("sidebarView",c.dataset.view)}),g.on("click","[data-agent-filter]",(l,c)=>{de.value=c.dataset.agentFilter,localStorage.setItem("agentFilter",c.dataset.agentFilter),me.peek().trim()&&Bs(me.peek())}),g.on("dblclick","[data-project-cwd]",(l,c)=>{let u=c.dataset.projectCwd;if(!u)return;let h=u.split("/").filter(Boolean).pop()||u;ao({id:h,name:h,path:u}),L(`Project \xB7 ${u}`)}),g.on("click","#btn-pwa-install",async()=>{await Fo()||nc()}),document.addEventListener("pwa-installable",()=>{document.getElementById("btn-pwa-install")?.classList.remove("hidden")}),g.on("click","#btn-settings",Ra),g.on("click","#btn-meta-agent",()=>Hi()),g.on("click","#btn-meta-agent-welcome",()=>qa("chat")),g.on("click","#btn-theme",io),g.on("click","[data-sidebar-action]",(l,c)=>{let u=c.dataset.sidebarAction;u==="new"&&ro(),u==="theme"&&io(),u==="settings"&&Ra(),u==="logout"&&(f.token=null,localStorage.removeItem("token"),ge(null),Oe.value=!1,location.reload())}),g.on("click","#btn-cal-prev",()=>{Ja(-1),Rt(Ht())}),g.on("click","#btn-cal-next",()=>{Ja(1),Rt(Ht())}),g.on("click","[data-cal-date]",(l,c)=>{nr(c.dataset.calDate),Rt(Ht())}),g.on("click","[data-session-id]",(l,c)=>{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")||(Pe(c.dataset.sessionId,c.dataset.sessionCwd||null,c.dataset.sessionConfigDir||null,c.dataset.sessionAgent||"claude",c.dataset.sessionMachine||null),wr())}),g.on("click","[data-rename-session]",(l,c)=>{l.preventDefault(),l.stopPropagation();let u=c.closest(".session-title-wrap")||c,h=u.dataset.renameSessionId||u.dataset.sessionId;h&&to({sessionId:h,agent:u.dataset.renameSessionAgent||"claude",machineId:u.dataset.renameSessionMachine||null,fallbackDisplay:u.dataset.renameSessionDisplay||"",mountEl:u})}),g.on("click","[data-rename-bar]",(l,c)=>{if(l.preventDefault(),l.stopPropagation(),!f.sessionId)return;let u=document.getElementById("session-title-display")||c;to({sessionId:f.sessionId,agent:f.agent||I.peek()||"claude",machineId:f.machineId||null,mountEl:u})}),g.on("click","[data-folder]",(l,c)=>{let u=c.dataset.folder,x=c.querySelector("span")?.textContent.trim()==="\u25BE",v=new Set(zt.peek()),C=new Set(Jt.peek());x?(v.delete(u),C.add(u)):(v.add(u),C.delete(u)),ae(()=>{zt.value=v,Jt.value=C})}),g.on("click","#memory-refresh",qs),g.on("click","[data-memory-file]",l=>Za(l.dataset.memoryFile,l.dataset.memoryAgent)),g.on("click","[data-tab]",(l,c)=>it(c.dataset.tab));let a=async(l,c)=>{let u=i(l),h=u?.value.trim();if(!h){c.value="";return}try{let x=await y("POST","/api/resolve-path",{path:h});if(x.isDir===!1)throw new Error("Path is not a directory on the target machine");c.value=x.path,u.value=x.path;let v=E.peek();v&&(E.value={...v,path:x.path})}catch(x){u.style.color="oklch(var(--er))",u.title=x.message,setTimeout(()=>{u.style.color="",u.title=""},2e3)}};g.on("click","#files-root-btn",()=>a("files-root-input",ce)),g.on("click","#git-root-btn",()=>a("git-root-input",be)),g.on("keydown","#files-root-input",l=>{l.key==="Enter"&&a("files-root-input",ce)}),g.on("keydown","#git-root-input",l=>{l.key==="Enter"&&a("git-root-input",be)}),g.on("click","#btn-opts",()=>{i("chat-opts").classList.toggle("hidden"),xe()}),g.on("change","#sel-agent",(l,c)=>{let u=I.peek(),h=c.value;u!==h&&(f.sessionId=null,qe(h),le(Be(h)||P.peek()),i("sel-permission").value=Ee.peek(),Ne(),L(`Agent \u2192 ${te[h]||h} \xB7 model ${P.peek()} \xB7 new session`))}),g.on("change","#sel-convert-agent",async(l,c)=>{let u=c.value;if(!u)return;let h=f.sessionId;if(!h){alert("No active session to convert."),c.value="";return}let x=f.agent||I.peek()||"claude";if(x===u){alert("Cannot convert to the same agent."),c.value="";return}c.disabled=!0,L(`Converting session ${h.slice(0,8)} from ${x} to ${u}...`);try{let v=await y("POST",`/api/sessions/${h}/convert`,{targetAgent:u,sourceAgent:x});v&&v.success?(L(`\u2713 Converted successfully. New session: ${v.targetSessionId.slice(0,8)}`),await Ke(),await Pe(v.targetSessionId,E.peek()?.path||null,null,v.targetAgent),Bn()):L("Failed to convert session.")}catch(v){L(`Error converting session: ${v.message}`),alert(`Error converting session: ${v.message}`)}finally{c.disabled=!1,c.value=""}}),g.on("change","#sel-model",(l,c)=>{le(c.value),Hs()}),g.on("click","#btn-model-add",()=>Rs({editCurrent:!1})),g.on("click","#btn-model-edit",()=>Rs({editCurrent:!0})),g.on("change","#sel-effort",(l,c)=>{ie.value=c.value}),g.on("change","#sel-permission",(l,c)=>{Ee.value=c.value}),g.on("change","#sel-density",(l,c)=>{xa(c.value),L(`Density \u2192 ${c.value} (applies to new tool calls; reload session to re-group history)`)}),document.addEventListener("agent-changed",Ne),g.on("click","#btn-new-session, #btn-new-session-welcome",ro),g.on("click","#new-session-cancel",()=>i("modal-new-session").close()),g.on("click","#new-session-start",co),g.on("change","#new-session-agent",lo),g.on("keydown","#new-session-path",l=>{l.key==="Enter"&&co()}),g.on("click","#send-btn",On),g.on("click","#stop-btn",hi),g.on("click","#btn-logout",()=>{f.token=null,localStorage.removeItem("token"),ge(null),Oe.value=!1,location.reload()}),g.on("click","[data-pick-machine]",async(l,c)=>{let u=c.dataset.pickMachine;if(!u||u===j.peek()){Ut();return}await so(u,{forceReload:!0}),us()});let o=async()=>{let l=i("machine-picker-status");if(l&&(l.textContent="\u5237\u65B0\u4E2D\u2026"),await qt(),Ks(),Vn(),gt(),l){let c=(Q.peek()||[]).filter(u=>u.online!==!1).length;l.textContent=`${c} online`}};g.on("click","#btn-refresh-machines",o),g.on("click","#btn-refresh-machines-menu",async l=>{l.stopPropagation(),await o()}),g.on("click","#btn-machine-menu",async l=>{l.stopPropagation(),Ot(),It();let c=i("machine-menu");c&&(c.classList.contains("hidden")?(await qt(),Vn(),c.classList.remove("hidden")):c.classList.add("hidden"))}),g.on("click","#btn-recent-sessions",l=>{l.preventDefault(),l.stopPropagation(),Ut(),It(),tr();let c=!i("recent-menu")?.classList.contains("hidden"),u=i("btn-recent-sessions");u&&u.setAttribute("aria-expanded",c?"true":"false")}),g.on("click","#recent-menu-backdrop",l=>{l.preventDefault(),l.stopPropagation(),Ot(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",l=>{let c=i("machine-menu-wrap");c&&!c.contains(l.target)&&Ut();let u=i("recent-menu"),h=i("btn-recent-sessions"),x=l.target;if(u&&!u.classList.contains("hidden")){if(u.contains(x)||h?.contains(x))return;Ot(),h?.setAttribute("aria-expanded","false")}}),g.on("click","#btn-notifications",l=>{l.preventDefault(),l.stopPropagation(),Ut(),Ot(),Zo()}),window.addEventListener("resize",()=>{i("recent-menu")&&!i("recent-menu").classList.contains("hidden")&&Ka()}),g.on("click","#recent-menu [data-session-id]",()=>{Ot(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),g.on("click","[data-dismiss-recent-session]",(l,c)=>{l.preventDefault(),l.stopPropagation(),Zi({sessionId:c.dataset.dismissRecentSession,agent:c.dataset.dismissRecentAgent||"claude",machineId:c.dataset.dismissRecentMachine||null})}),g.on("click","#btn-edit-project-notes, #project-goal-text, #project-notes-text",()=>{ur()}),g.on("click","#btn-cancel-project-notes",()=>{kn()});let r=async()=>{let l=i("project-goal-input")?.value?.trim()??"",c=i("project-notes-input")?.value?.trim()??"",u=E.peek();if(!(!u||!u.path))try{let h=await y("POST","/api/projects/notes",{root:u.path,goal:l,notes:c});cr(h.goal||"",h.notes||""),kn()}catch(h){alert(`Error saving project notes: ${h.message}`)}};g.on("click","#btn-save-project-notes",r),g.on("keydown","#project-goal-input",l=>{l.key==="Enter"&&r(),l.key==="Escape"&&kn()}),g.on("keydown","#project-notes-input",l=>{l.key==="Escape"&&kn()}),g.on("click","[data-fav-toggle]",(l,c)=>{l.stopPropagation(),l.preventDefault();let u=c.dataset.favSessionMachine||f.machineId;u&&(f.machineId=u,localStorage.setItem("machineId",u)),mr(c.dataset.favSessionId,c.dataset.favSessionAgent||"claude",{machineId:u||null})}),g.on("click","[data-hide-toggle]",(l,c)=>{l.stopPropagation(),l.preventDefault();let u=c.dataset.hideSessionMachine||f.machineId;u&&(f.machineId=u,localStorage.setItem("machineId",u)),hr(c.dataset.hideSessionId,c.dataset.hideSessionAgent||"claude",{machineId:u||null})}),g.on("click","#btn-edit-session-notes, #session-notes-text",()=>{pr()}),g.on("click","#btn-cancel-session-notes",()=>_e()),g.on("click","#btn-save-session-notes",async()=>{let l=i("session-notes-input")?.value?.trim()||"";if(!f.sessionId)return;let c=f.agent||I.peek()||"claude";await eo(f.sessionId,c,l)&&_e()}),g.on("keydown","#session-notes-input",async l=>{if(l.key==="Escape"&&_e(),l.key==="Enter"){let c=l.target.value.trim();if(!f.sessionId)return;let u=f.agent||I.peek()||"claude";await eo(f.sessionId,u,c)&&_e()}}),g.on("click","#btn-fav-filter",()=>{let l=!Ae.peek();Ae.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"))}),g.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&&Ae.peek()&&(Ae.value=!1,localStorage.setItem("favoritesOnly","0"),i("btn-fav-filter")?.classList.remove("active"))}),Ne(),Ce(()=>{A.value,j.value,f.token&&us()}),i("sel-permission").value=Ee.peek(),$s();let d=i("sel-density");d&&(d.value=Ve.peek()||"normal"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=$t.peek().includes(l.dataset.agentOption)}),i("filter-favorites")&&(i("filter-favorites").checked=Ae.peek()),i("filter-hidden")&&(i("filter-hidden").checked=je.peek()),document.querySelectorAll("[data-agent-filter]").forEach(l=>{l.classList.toggle("active",l.dataset.agentFilter===de.peek())}),i("btn-fav-filter")?.classList.toggle("active",Ae.peek()),i("btn-hidden-filter")?.classList.toggle("active",je.peek()),document.querySelectorAll("[data-view]").forEach(l=>{let c=l.dataset.view===Je.peek();l.classList.toggle("bg-primary/15",c),l.classList.toggle("text-primary",c),l.classList.toggle("font-medium",c),l.classList.toggle("text-base-content/50",!c)})}hn();R();B();ue();function sc(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 ac(e){let t=(e||"").split("/").pop()||"",n=t.lastIndexOf(".");return n>=0?t.slice(n+1).toLowerCase():""}function Lr(e){let t=ac(e);return t==="docx"||t==="pptx"||t==="xlsx"||t==="pdf"?t:null}function oc(e){return e==null?"":e>1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function ic(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 mo=new Map;function Xs(e){if(mo.has(e))return mo.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 mo.set(e,t),t}function rc(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 lc(e){!e||typeof hljs>"u"||e.querySelectorAll("pre code.file-preview-code").forEach(t=>{try{delete t.dataset.highlighted,hljs.highlightElement(t)}catch{}})}function es(e,t,n){let s=oc(t);return`
1023
+ </button>`).join("")}),Ce(()=>{ct.value,St.value,Je.value,Qe.value,Oe.value,T.value;let l=i("session-list");l&&(l.querySelector(".session-rename-input")||(l.innerHTML=Ya(),Xa()))}),Ce(()=>{O.value,de.value,j.value,A.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"||Rt())}),Le(fe,l=>{let c=i("session-filter-badge");c&&(c.style.display=l?"inline":"none",c.title=l||"")}),Ce(()=>{let l=E.value;if(l&&l.path)dr(l.path);else{let c=i("project-notes-bar");c&&(c.style.display="none")}}),Le(U,l=>{document.querySelectorAll("[data-tab]").forEach(u=>{let h=u.dataset.tab===l;u.classList.toggle("text-primary",h),u.classList.toggle("border-primary",h),u.classList.toggle("text-base-content/50",!h),u.classList.toggle("border-transparent",!h)});let c=i("project-view");c&&!c.classList.contains("hidden")&&(c.style.display="flex",c.style.flexDirection="column",c.style.minHeight="0",c.style.flex="1"),["chat","files","git","shell","memory"].forEach(u=>{let h=i(`tab-${u}`);if(!h)return;let x=u===l;h.classList.toggle("hidden",!x),x?(h.style.display="flex",h.style.flexDirection="column",h.style.flex="1 1 0",h.style.minHeight="0",h.style.overflow="hidden"):h.style.display="none"}),l==="memory"&&qs(),l==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))}),xe()}),Sr(),$r(),ti({openSession:He});let s=null;document.addEventListener("sessions-changed",()=>{s&&clearTimeout(s),s=setTimeout(()=>{s=null,Ne({waitFresh:!1})},1200)}),document.addEventListener("router:home",Vs),document.addEventListener("router:session",async({detail:{id:l,tab:c,machineId:u,agent:h}})=>{let x=O.peek().find(C=>C.sessionId===l),v=Et();await He(l,x?.cwd||(v?.sessionId===l?v.cwd:null)||null,x?.configDir||(v?.sessionId===l?v.configDir:null)||null,h||x?.agent||(v?.sessionId===l?v.agent:null)||null,u||x?.machineId||(v?.sessionId===l?v.machineId:null)||null,{tab:c||"chat"})}),g.on("click","#btn-home",Vs),g.on("click","#btn-share-session",async(l,c)=>{let u=Li();if(u)try{await navigator.clipboard.writeText(u),c.textContent="\u5DF2\u590D\u5236",setTimeout(()=>{c.textContent="\u5206\u4EAB"},1400)}catch{window.prompt("\u590D\u5236\u4F1A\u8BDD\u94FE\u63A5\uFF1A",u)}}),g.on("click","#auth-btn",uo),g.on("submit","#auth-form",l=>{l.preventDefault(),uo()}),g.on("keydown","#auth-username, #auth-password",l=>{l.key==="Enter"&&uo()}),g.on("click","#hamburger",()=>i("sidebar").classList.contains("open")?Zn():wr()),g.on("click","#sidebar-overlay",Zn),document.addEventListener("keydown",l=>{l.key==="Escape"&&window.innerWidth<=640&&i("sidebar")?.classList.contains("open")&&(l.preventDefault(),Zn())}),g.on("input","#session-search",(l,c)=>{me.value=c.value,Bs(c.value)}),g.on("click","#sidebar-filter-toggle",()=>{let l=i("sidebar-filter-menu");if(!l)return;let c=l.classList.toggle("hidden");i("sidebar-filter-toggle")?.setAttribute("aria-expanded",String(!c))}),g.on("change","[data-agent-option]",(l,c)=>{let u=new Set($t.peek());c.checked?u.add(c.dataset.agentOption):u.delete(c.dataset.agentOption);let h=[...u];$t.value=h,localStorage.setItem("agentFilters",JSON.stringify(h)),de.value=h.length===1?h[0]:"all"}),g.on("change","#filter-favorites",(l,c)=>{Ae.value=c.checked,localStorage.setItem("favoritesOnly",c.checked?"1":"0")}),g.on("change","#filter-hidden",(l,c)=>{je.value=c.checked,localStorage.setItem("showHiddenOnly",c.checked?"1":"0")}),g.on("click","#filter-clear",()=>{$t.value=[],de.value="all",Ae.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)}),g.on("click","#session-filter-badge",()=>{fe.value=null}),g.on("click","[data-ws-tab]",(l,c)=>{fe.value=c.dataset.wsTab||null}),g.on("click","#sidebar-refresh",()=>{Ne(),me.peek().trim()&&Os(me.peek())}),g.on("click","[data-view]",(l,c)=>{Je.value=c.dataset.view,localStorage.setItem("sidebarView",c.dataset.view)}),g.on("click","[data-agent-filter]",(l,c)=>{de.value=c.dataset.agentFilter,localStorage.setItem("agentFilter",c.dataset.agentFilter),me.peek().trim()&&Bs(me.peek())}),g.on("dblclick","[data-project-cwd]",(l,c)=>{let u=c.dataset.projectCwd;if(!u)return;let h=u.split("/").filter(Boolean).pop()||u;ao({id:h,name:h,path:u}),L(`Project \xB7 ${u}`)}),g.on("click","#btn-pwa-install",async()=>{await Fo()||sc()}),document.addEventListener("pwa-installable",()=>{document.getElementById("btn-pwa-install")?.classList.remove("hidden")}),g.on("click","#btn-settings",Ra),g.on("click","#btn-meta-agent",()=>Hi()),g.on("click","#btn-meta-agent-welcome",()=>qa("chat")),g.on("click","#btn-theme",io),g.on("click","[data-sidebar-action]",(l,c)=>{let u=c.dataset.sidebarAction;u==="new"&&ro(),u==="theme"&&io(),u==="settings"&&Ra(),u==="logout"&&(f.token=null,localStorage.removeItem("token"),ge(null),Be.value=!1,location.reload())}),g.on("click","#btn-cal-prev",()=>{Ja(-1),Rt(Ht())}),g.on("click","#btn-cal-next",()=>{Ja(1),Rt(Ht())}),g.on("click","[data-cal-date]",(l,c)=>{nr(c.dataset.calDate),Rt(Ht())}),g.on("click","[data-session-id]",(l,c)=>{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")||(He(c.dataset.sessionId,c.dataset.sessionCwd||null,c.dataset.sessionConfigDir||null,c.dataset.sessionAgent||"claude",c.dataset.sessionMachine||null),kr())}),g.on("click","[data-rename-session]",(l,c)=>{l.preventDefault(),l.stopPropagation();let u=c.closest(".session-title-wrap")||c,h=u.dataset.renameSessionId||u.dataset.sessionId;h&&to({sessionId:h,agent:u.dataset.renameSessionAgent||"claude",machineId:u.dataset.renameSessionMachine||null,fallbackDisplay:u.dataset.renameSessionDisplay||"",mountEl:u})}),g.on("click","[data-rename-bar]",(l,c)=>{if(l.preventDefault(),l.stopPropagation(),!f.sessionId)return;let u=document.getElementById("session-title-display")||c;to({sessionId:f.sessionId,agent:f.agent||I.peek()||"claude",machineId:f.machineId||null,mountEl:u})}),g.on("click","[data-folder]",(l,c)=>{let u=c.dataset.folder,x=c.querySelector("span")?.textContent.trim()==="\u25BE",v=new Set(zt.peek()),C=new Set(Jt.peek());x?(v.delete(u),C.add(u)):(v.add(u),C.delete(u)),ae(()=>{zt.value=v,Jt.value=C})}),g.on("click","#memory-refresh",qs),g.on("click","[data-memory-file]",l=>Za(l.dataset.memoryFile,l.dataset.memoryAgent)),g.on("click","[data-tab]",(l,c)=>it(c.dataset.tab));let a=async(l,c)=>{let u=i(l),h=u?.value.trim();if(!h){c.value="";return}try{let x=await y("POST","/api/resolve-path",{path:h});if(x.isDir===!1)throw new Error("Path is not a directory on the target machine");c.value=x.path,u.value=x.path;let v=E.peek();v&&(E.value={...v,path:x.path})}catch(x){u.style.color="oklch(var(--er))",u.title=x.message,setTimeout(()=>{u.style.color="",u.title=""},2e3)}};g.on("click","#files-root-btn",()=>a("files-root-input",ce)),g.on("click","#git-root-btn",()=>a("git-root-input",be)),g.on("keydown","#files-root-input",l=>{l.key==="Enter"&&a("files-root-input",ce)}),g.on("keydown","#git-root-input",l=>{l.key==="Enter"&&a("git-root-input",be)}),g.on("click","#btn-opts",()=>{i("chat-opts").classList.toggle("hidden"),xe()}),g.on("change","#sel-agent",(l,c)=>{let u=I.peek(),h=c.value;u!==h&&(f.sessionId=null,Fe(h),le(qe(h)||P.peek()),i("sel-permission").value=Ee.peek(),_e(),L(`Agent \u2192 ${te[h]||h} \xB7 model ${P.peek()} \xB7 new session`))}),g.on("change","#sel-convert-agent",async(l,c)=>{let u=c.value;if(!u)return;let h=f.sessionId;if(!h){alert("No active session to convert."),c.value="";return}let x=f.agent||I.peek()||"claude";if(x===u){alert("Cannot convert to the same agent."),c.value="";return}c.disabled=!0,L(`Converting session ${h.slice(0,8)} from ${x} to ${u}...`);try{let v=await y("POST",`/api/sessions/${h}/convert`,{targetAgent:u,sourceAgent:x});v&&v.success?(L(`\u2713 Converted successfully. New session: ${v.targetSessionId.slice(0,8)}`),await Ne(),await He(v.targetSessionId,E.peek()?.path||null,null,v.targetAgent),Bn()):L("Failed to convert session.")}catch(v){L(`Error converting session: ${v.message}`),alert(`Error converting session: ${v.message}`)}finally{c.disabled=!1,c.value=""}}),g.on("change","#sel-model",(l,c)=>{le(c.value),Hs()}),g.on("click","#btn-model-add",()=>Rs({editCurrent:!1})),g.on("click","#btn-model-edit",()=>Rs({editCurrent:!0})),g.on("change","#sel-effort",(l,c)=>{ie.value=c.value}),g.on("change","#sel-permission",(l,c)=>{Ee.value=c.value}),g.on("change","#sel-density",(l,c)=>{xa(c.value),L(`Density \u2192 ${c.value} (applies to new tool calls; reload session to re-group history)`)}),document.addEventListener("agent-changed",_e),g.on("click","#btn-new-session, #btn-new-session-welcome",ro),g.on("click","#new-session-cancel",()=>i("modal-new-session").close()),g.on("click","#new-session-start",co),g.on("change","#new-session-agent",lo),g.on("keydown","#new-session-path",l=>{l.key==="Enter"&&co()}),g.on("click","#send-btn",On),g.on("click","#stop-btn",hi),g.on("click","#btn-logout",()=>{f.token=null,localStorage.removeItem("token"),ge(null),Be.value=!1,location.reload()}),g.on("click","[data-pick-machine]",async(l,c)=>{let u=c.dataset.pickMachine;if(!u||u===j.peek()){Ut();return}await so(u,{forceReload:!0}),us()});let o=async()=>{let l=i("machine-picker-status");if(l&&(l.textContent="\u5237\u65B0\u4E2D\u2026"),await qt(),Ks(),Vn(),gt(),l){let c=(Q.peek()||[]).filter(u=>u.online!==!1).length;l.textContent=`${c} online`}};g.on("click","#btn-refresh-machines",o),g.on("click","#btn-refresh-machines-menu",async l=>{l.stopPropagation(),await o()}),g.on("click","#btn-machine-menu",async l=>{l.stopPropagation(),Ot(),It();let c=i("machine-menu");c&&(c.classList.contains("hidden")?(await qt(),Vn(),c.classList.remove("hidden")):c.classList.add("hidden"))}),g.on("click","#btn-recent-sessions",l=>{l.preventDefault(),l.stopPropagation(),Ut(),It(),tr();let c=!i("recent-menu")?.classList.contains("hidden"),u=i("btn-recent-sessions");u&&u.setAttribute("aria-expanded",c?"true":"false")}),g.on("click","#recent-menu-backdrop",l=>{l.preventDefault(),l.stopPropagation(),Ot(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",l=>{let c=i("machine-menu-wrap");c&&!c.contains(l.target)&&Ut();let u=i("recent-menu"),h=i("btn-recent-sessions"),x=l.target;if(u&&!u.classList.contains("hidden")){if(u.contains(x)||h?.contains(x))return;Ot(),h?.setAttribute("aria-expanded","false")}}),g.on("click","#btn-notifications",l=>{l.preventDefault(),l.stopPropagation(),Ut(),Ot(),Zo()}),window.addEventListener("resize",()=>{i("recent-menu")&&!i("recent-menu").classList.contains("hidden")&&Ka()}),g.on("click","#recent-menu [data-session-id]",()=>{Ot(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),g.on("click","[data-dismiss-recent-session]",(l,c)=>{l.preventDefault(),l.stopPropagation(),Zi({sessionId:c.dataset.dismissRecentSession,agent:c.dataset.dismissRecentAgent||"claude",machineId:c.dataset.dismissRecentMachine||null})}),g.on("click","#btn-edit-project-notes, #project-goal-text, #project-notes-text",()=>{ur()}),g.on("click","#btn-cancel-project-notes",()=>{kn()});let r=async()=>{let l=i("project-goal-input")?.value?.trim()??"",c=i("project-notes-input")?.value?.trim()??"",u=E.peek();if(!(!u||!u.path))try{let h=await y("POST","/api/projects/notes",{root:u.path,goal:l,notes:c});cr(h.goal||"",h.notes||""),kn()}catch(h){alert(`Error saving project notes: ${h.message}`)}};g.on("click","#btn-save-project-notes",r),g.on("keydown","#project-goal-input",l=>{l.key==="Enter"&&r(),l.key==="Escape"&&kn()}),g.on("keydown","#project-notes-input",l=>{l.key==="Escape"&&kn()}),g.on("click","[data-fav-toggle]",(l,c)=>{l.stopPropagation(),l.preventDefault();let u=c.dataset.favSessionMachine||f.machineId;u&&(f.machineId=u,localStorage.setItem("machineId",u)),mr(c.dataset.favSessionId,c.dataset.favSessionAgent||"claude",{machineId:u||null})}),g.on("click","[data-hide-toggle]",(l,c)=>{l.stopPropagation(),l.preventDefault();let u=c.dataset.hideSessionMachine||f.machineId;u&&(f.machineId=u,localStorage.setItem("machineId",u)),hr(c.dataset.hideSessionId,c.dataset.hideSessionAgent||"claude",{machineId:u||null})}),g.on("click","#btn-edit-session-notes, #session-notes-text",()=>{pr()}),g.on("click","#btn-cancel-session-notes",()=>Pe()),g.on("click","#btn-save-session-notes",async()=>{let l=i("session-notes-input")?.value?.trim()||"";if(!f.sessionId)return;let c=f.agent||I.peek()||"claude";await eo(f.sessionId,c,l)&&Pe()}),g.on("keydown","#session-notes-input",async l=>{if(l.key==="Escape"&&Pe(),l.key==="Enter"){let c=l.target.value.trim();if(!f.sessionId)return;let u=f.agent||I.peek()||"claude";await eo(f.sessionId,u,c)&&Pe()}}),g.on("click","#btn-fav-filter",()=>{let l=!Ae.peek();Ae.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"))}),g.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&&Ae.peek()&&(Ae.value=!1,localStorage.setItem("favoritesOnly","0"),i("btn-fav-filter")?.classList.remove("active"))}),_e(),Ce(()=>{A.value,j.value,f.token&&us()}),i("sel-permission").value=Ee.peek(),$s();let d=i("sel-density");d&&(d.value=Ve.peek()||"normal"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=$t.peek().includes(l.dataset.agentOption)}),i("filter-favorites")&&(i("filter-favorites").checked=Ae.peek()),i("filter-hidden")&&(i("filter-hidden").checked=je.peek()),document.querySelectorAll("[data-agent-filter]").forEach(l=>{l.classList.toggle("active",l.dataset.agentFilter===de.peek())}),i("btn-fav-filter")?.classList.toggle("active",Ae.peek()),i("btn-hidden-filter")?.classList.toggle("active",je.peek()),document.querySelectorAll("[data-view]").forEach(l=>{let c=l.dataset.view===Je.peek();l.classList.toggle("bg-primary/15",c),l.classList.toggle("text-primary",c),l.classList.toggle("font-medium",c),l.classList.toggle("text-base-content/50",!c)})}hn();R();B();ue();function ac(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 oc(e){let t=(e||"").split("/").pop()||"",n=t.lastIndexOf(".");return n>=0?t.slice(n+1).toLowerCase():""}function Er(e){let t=oc(e);return t==="docx"||t==="pptx"||t==="xlsx"||t==="pdf"?t:null}function ic(e){return e==null?"":e>1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function rc(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 mo=new Map;function Xs(e){if(mo.has(e))return mo.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 mo.set(e,t),t}function lc(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 cc(e){!e||typeof hljs>"u"||e.querySelectorAll("pre code.file-preview-code").forEach(t=>{try{delete t.dataset.highlighted,hljs.highlightElement(t)}catch{}})}function es(e,t,n){let s=ic(t);return`
1024
1024
  <div class="flex items-center gap-2 px-4 py-1.5 border-b border-base-300 flex-shrink-0 bg-base-200">
1025
1025
  <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>
1026
1026
  <button type="button" class="btn btn-ghost btn-xs" data-download-path="${p(e)}">\u2193 Download</button>
1027
- </div>`}function cc(e){return!Array.isArray(e)||!e.length?'<div class="p-4 text-xs text-base-content/40">Empty directory</div>':(e.sort((t,n)=>n.isDir-t.isDir||t.name.localeCompare(n.name)),e.map(t=>`
1027
+ </div>`}function dc(e){return!Array.isArray(e)||!e.length?'<div class="p-4 text-xs text-base-content/40">Empty directory</div>':(e.sort((t,n)=>n.isDir-t.isDir||t.name.localeCompare(n.name)),e.map(t=>`
1028
1028
  <div class="flex items-center gap-2 px-4 py-1.5 hover:bg-base-300 group"
1029
1029
  ${t.isDir?`data-dir-path="${p(t.path)}"`:`data-file-path="${p(t.path)}"`}>
1030
- <span class="cursor-pointer flex-shrink-0">${t.isDir?"\u{1F4C1}":sc(t.name)}</span>
1030
+ <span class="cursor-pointer flex-shrink-0">${t.isDir?"\u{1F4C1}":ac(t.name)}</span>
1031
1031
  <span class="text-sm flex-1 truncate cursor-pointer ${t.isDir?"text-primary":""}">${p(t.name)}</span>
1032
1032
  ${t.isDir?"":`
1033
1033
  <button type="button" class="file-row-action btn btn-ghost btn-xs px-1.5 text-base-content/50 hover:text-base-content"
1034
1034
  data-download-path="${p(t.path)}" title="Download" aria-label="Download">\u2193</button>
1035
1035
  <button type="button" class="file-row-action btn btn-ghost btn-xs px-1.5 text-error/60 hover:text-error"
1036
1036
  data-delete-path="${p(t.path)}" title="Delete" aria-label="Delete">\u2715</button>`}
1037
- </div>`).join(""))}function dc(e,t,n){let s=/[\x00-\x08\x0e-\x1f]/.test(t.slice(0,512)),a=rc(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 es(e,n,s?"binary":a||"text")+r}async function uc(e){if(await Xs("/vendor/mammoth.browser.min.js"),typeof mammoth>"u")throw new Error("mammoth failed to load");let t=await mammoth.convertToHtml({arrayBuffer:e});return`<div class="office-preview office-docx overflow-auto flex-1 p-4 md">${t.messages?.length?`<div class="office-warn text-xs text-warning/80 px-3 py-1">${t.messages.length} conversion note(s)</div>`:""}<div class="office-docx-body">${t.value||'<p class="text-base-content/40">Empty document</p>'}</div></div>`}async function pc(e){if(await Xs("/vendor/xlsx.full.min.js"),typeof XLSX>"u")throw new Error("SheetJS failed to load");let t=XLSX.read(new Uint8Array(e),{type:"array"}),n=t.SheetNames||[];if(!n.length)return'<div class="p-4 text-xs text-base-content/40">Empty workbook</div>';let s=n.map((o,r)=>`<button type="button" class="office-sheet-tab${r===0?" active":""}" data-sheet-idx="${r}">${p(o)}</button>`).join(""),a=n.map((o,r)=>{let d=t.Sheets[o],l;try{l=XLSX.utils.sheet_to_html(d,{id:`xlsx-sheet-${r}`,editable:!1})}catch{l='<p class="text-base-content/40 text-xs p-2">Unable to render this sheet</p>'}return`<div class="office-sheet-pane${r===0?"":" hidden"}" data-sheet-pane="${r}">${l}</div>`}).join("");return`
1037
+ </div>`).join(""))}function uc(e,t,n){let s=/[\x00-\x08\x0e-\x1f]/.test(t.slice(0,512)),a=lc(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 es(e,n,s?"binary":a||"text")+r}async function pc(e){if(await Xs("/vendor/mammoth.browser.min.js"),typeof mammoth>"u")throw new Error("mammoth failed to load");let t=await mammoth.convertToHtml({arrayBuffer:e});return`<div class="office-preview office-docx overflow-auto flex-1 p-4 md">${t.messages?.length?`<div class="office-warn text-xs text-warning/80 px-3 py-1">${t.messages.length} conversion note(s)</div>`:""}<div class="office-docx-body">${t.value||'<p class="text-base-content/40">Empty document</p>'}</div></div>`}async function fc(e){if(await Xs("/vendor/xlsx.full.min.js"),typeof XLSX>"u")throw new Error("SheetJS failed to load");let t=XLSX.read(new Uint8Array(e),{type:"array"}),n=t.SheetNames||[];if(!n.length)return'<div class="p-4 text-xs text-base-content/40">Empty workbook</div>';let s=n.map((o,r)=>`<button type="button" class="office-sheet-tab${r===0?" active":""}" data-sheet-idx="${r}">${p(o)}</button>`).join(""),a=n.map((o,r)=>{let d=t.Sheets[o],l;try{l=XLSX.utils.sheet_to_html(d,{id:`xlsx-sheet-${r}`,editable:!1})}catch{l='<p class="text-base-content/40 text-xs p-2">Unable to render this sheet</p>'}return`<div class="office-sheet-pane${r===0?"":" hidden"}" data-sheet-pane="${r}">${l}</div>`}).join("");return`
1038
1038
  <div class="office-preview office-xlsx flex flex-col flex-1 min-h-0 overflow-hidden">
1039
1039
  <div class="office-sheet-tabs flex gap-1 px-2 py-1.5 border-b border-base-300 overflow-x-auto flex-shrink-0 bg-base-200">${s}</div>
1040
1040
  <div class="office-sheet-body flex-1 overflow-auto p-2">${a}</div>
1041
- </div>`}function fc(e){let t=[],n=/<a:p[\s>][\s\S]*?<\/a:p>/g,s=/<a:t(?:\s[^>]*)?>([\s\S]*?)<\/a:t>/g,a,o=e.match(n)||[e];for(let r of o){let d=[];for(s.lastIndex=0;(a=s.exec(r))!==null;){let l=a[1].replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&quot;/g,'"').replace(/&apos;/g,"'");l&&d.push(l)}d.length&&t.push(d.join(""))}return t}async function mc(e){if(await Xs("/vendor/jszip.min.js"),typeof JSZip>"u")throw new Error("JSZip failed to load");let t=await JSZip.loadAsync(e),n=Object.keys(t.files).filter(a=>/^ppt\/slides\/slide\d+\.xml$/i.test(a)).sort((a,o)=>{let r=parseInt(a.match(/slide(\d+)/i)?.[1]||"0",10),d=parseInt(o.match(/slide(\d+)/i)?.[1]||"0",10);return r-d});if(!n.length)return'<div class="p-4 text-xs text-base-content/40">No slides found in this presentation</div>';let s=[];for(let a=0;a<n.length;a++){let o=await t.files[n[a]].async("string"),r=fc(o),d=r.length?r.map(l=>`<p>${p(l)}</p>`).join(""):'<p class="text-base-content/40 italic">\uFF08\u6B64\u9875\u65E0\u53EF\u63D0\u53D6\u6587\u672C / \u53EF\u80FD\u4EE5\u56FE\u7247\u4E3A\u4E3B\uFF09</p>';s.push(`
1041
+ </div>`}function mc(e){let t=[],n=/<a:p[\s>][\s\S]*?<\/a:p>/g,s=/<a:t(?:\s[^>]*)?>([\s\S]*?)<\/a:t>/g,a,o=e.match(n)||[e];for(let r of o){let d=[];for(s.lastIndex=0;(a=s.exec(r))!==null;){let l=a[1].replace(/&lt;/g,"<").replace(/&gt;/g,">").replace(/&amp;/g,"&").replace(/&quot;/g,'"').replace(/&apos;/g,"'");l&&d.push(l)}d.length&&t.push(d.join(""))}return t}async function hc(e){if(await Xs("/vendor/jszip.min.js"),typeof JSZip>"u")throw new Error("JSZip failed to load");let t=await JSZip.loadAsync(e),n=Object.keys(t.files).filter(a=>/^ppt\/slides\/slide\d+\.xml$/i.test(a)).sort((a,o)=>{let r=parseInt(a.match(/slide(\d+)/i)?.[1]||"0",10),d=parseInt(o.match(/slide(\d+)/i)?.[1]||"0",10);return r-d});if(!n.length)return'<div class="p-4 text-xs text-base-content/40">No slides found in this presentation</div>';let s=[];for(let a=0;a<n.length;a++){let o=await t.files[n[a]].async("string"),r=mc(o),d=r.length?r.map(l=>`<p>${p(l)}</p>`).join(""):'<p class="text-base-content/40 italic">\uFF08\u6B64\u9875\u65E0\u53EF\u63D0\u53D6\u6587\u672C / \u53EF\u80FD\u4EE5\u56FE\u7247\u4E3A\u4E3B\uFF09</p>';s.push(`
1042
1042
  <article class="office-slide-card">
1043
1043
  <header class="office-slide-num">Slide ${a+1}</header>
1044
1044
  <div class="office-slide-body">${d}</div>
@@ -1046,7 +1046,7 @@ ${t}`:"",n.length?n.join(`
1046
1046
  <div class="office-preview office-pptx overflow-auto flex-1 p-3 space-y-3">
1047
1047
  <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>
1048
1048
  ${s.join("")}
1049
- </div>`}async function hc(){if(await Xs("/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 bc(e){let n=await(await hc()).getDocument({data:e}).promise,s=n.numPages,a=Math.min(s,40),o=[];for(let d=1;d<=a;d++){let l=await n.getPage(d),c=l.getViewport({scale:1}),u=Math.min(1.5,820/c.width),h=l.getViewport({scale:u}),x=document.createElement("canvas");x.width=Math.floor(h.width),x.height=Math.floor(h.height),x.className="office-pdf-page",x.dataset.page=String(d),await l.render({canvasContext:x.getContext("2d"),viewport:h}).promise,o.push(`
1049
+ </div>`}async function bc(){if(await Xs("/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 gc(e){let n=await(await bc()).getDocument({data:e}).promise,s=n.numPages,a=Math.min(s,40),o=[];for(let d=1;d<=a;d++){let l=await n.getPage(d),c=l.getViewport({scale:1}),u=Math.min(1.5,820/c.width),h=l.getViewport({scale:u}),x=document.createElement("canvas");x.width=Math.floor(h.width),x.height=Math.floor(h.height),x.className="office-pdf-page",x.dataset.page=String(d),await l.render({canvasContext:x.getContext("2d"),viewport:h}).promise,o.push(`
1050
1050
  <figure class="office-pdf-figure">
1051
1051
  <figcaption class="office-pdf-cap">Page ${d} / ${s}</figcaption>
1052
1052
  ${x.outerHTML}
@@ -1055,12 +1055,12 @@ ${t}`:"",n.length?n.join(`
1055
1055
  <p class="text-xs text-base-content/50 px-1">PDF preview \xB7 ${s} page(s)</p>
1056
1056
  ${r}
1057
1057
  ${o.join("")}
1058
- </div>`}async function gc(e,t,n){let s=Lr(e),a={docx:"Word",pptx:"PowerPoint",xlsx:"Excel",pdf:"PDF"},o=ic(t),r;if(s==="docx")r=await uc(o);else if(s==="xlsx")r=await pc(o);else if(s==="pptx")r=await mc(o);else if(s==="pdf")r=await bc(o);else throw new Error("Unsupported office type");return es(e,n,a[s]||s)+r}function xc(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 vc(){let e=E.peek(),t=ce.peek()||e?.path;if(!t)return;let n=document.createElement("input");n.type="file",n.multiple=!0,n.addEventListener("change",async()=>{let s=z.peek(),a=e?.id||"_",o=[...n.files],r=!1;for(let d of o){let l=s?`${s}/${d.name}`:d.name,c=`/api/projects/${a}/file?root=${encodeURIComponent(t)}&path=${encodeURIComponent(l)}`;try{let u=await fetch(c,{method:"POST",headers:dt(),body:d,duplex:"half"});if(!u.ok){let h=await u.json().catch(()=>({}));throw new Error(h.error||`HTTP ${u.status}`)}}catch(u){alert(`Upload failed (${d.name}): ${u.message}`),r=!0;break}}if(!r){let d=z.peek();z.value=d+"\0",z.value=d}}),n.click()}async function yc(e,t){let n=ce.peek()||e?.path||"";if(!n){alert("No path selected \u2014 set root first");return}let s=e?.id||"_",a=(t||"").split("/").pop()||"download",o=new URLSearchParams({root:n,path:t,download:"true"}),r=`/api/projects/${s}/file?${o}`;try{let d=await fetch(r,{headers:dt(),credentials:"same-origin"});if(!d.ok){let h=await d.json().catch(()=>({}));throw new Error(h.error||`HTTP ${d.status}`)}let l=await d.blob(),c=URL.createObjectURL(l),u=document.createElement("a");u.href=c,u.download=a,u.rel="noopener",u.style.display="none",document.body.appendChild(u),u.click(),u.remove(),setTimeout(()=>URL.revokeObjectURL(c),6e4)}catch(d){try{let l=`/api/projects/${s}/file?${Ro({root:n,path:t,download:"true"})}`,c=document.createElement("a");c.href=l,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 wc(e,t){if(!confirm(`Delete "${t.split("/").pop()}"?`))return;let n=ce.peek()||e?.path||"",s=e?.id||"_";try{await y("DELETE",`/api/projects/${s}/file?root=${encodeURIComponent(n)}&path=${encodeURIComponent(t)}`),z.value=z.peek()+" ",z.value=z.peek().trimEnd()}catch(a){alert(`Delete failed: ${a.message}`)}}async function kc(e,t,n,s){let a=n.size??(typeof n.content=="string"?n.content.length:0),o=Lr(t);if(o&&n.encoding==="base64"){e.innerHTML=es(t,a,o)+`<div class="p-4 text-xs text-base-content/40">Parsing ${o.toUpperCase()}\u2026</div>`;try{let r=await gc(t,n.content,a);if(s.aborted)return;e.innerHTML=r}catch(r){if(s.aborted)return;e.innerHTML=es(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=es(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=dc(t,n.content||"",a),lc(e)}function Er(){Ce(()=>{let e=i("files-breadcrumb");if(!e)return;let t=re.value!==null;e.innerHTML=`
1059
- ${xc(re.value??z.value,t)}
1058
+ </div>`}async function xc(e,t,n){let s=Er(e),a={docx:"Word",pptx:"PowerPoint",xlsx:"Excel",pdf:"PDF"},o=rc(t),r;if(s==="docx")r=await pc(o);else if(s==="xlsx")r=await fc(o);else if(s==="pptx")r=await hc(o);else if(s==="pdf")r=await gc(o);else throw new Error("Unsupported office type");return es(e,n,a[s]||s)+r}function vc(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 yc(){let e=E.peek(),t=ce.peek()||e?.path;if(!t)return;let n=document.createElement("input");n.type="file",n.multiple=!0,n.addEventListener("change",async()=>{let s=z.peek(),a=e?.id||"_",o=[...n.files],r=!1;for(let d of o){let l=s?`${s}/${d.name}`:d.name,c=`/api/projects/${a}/file?root=${encodeURIComponent(t)}&path=${encodeURIComponent(l)}`;try{let u=await fetch(c,{method:"POST",headers:dt(),body:d,duplex:"half"});if(!u.ok){let h=await u.json().catch(()=>({}));throw new Error(h.error||`HTTP ${u.status}`)}}catch(u){alert(`Upload failed (${d.name}): ${u.message}`),r=!0;break}}if(!r){let d=z.peek();z.value=d+"\0",z.value=d}}),n.click()}async function wc(e,t){let n=ce.peek()||e?.path||"";if(!n){alert("No path selected \u2014 set root first");return}let s=e?.id||"_",a=(t||"").split("/").pop()||"download",o=new URLSearchParams({root:n,path:t,download:"true"}),r=`/api/projects/${s}/file?${o}`;try{let d=await fetch(r,{headers:dt(),credentials:"same-origin"});if(!d.ok){let h=await d.json().catch(()=>({}));throw new Error(h.error||`HTTP ${d.status}`)}let l=await d.blob(),c=URL.createObjectURL(l),u=document.createElement("a");u.href=c,u.download=a,u.rel="noopener",u.style.display="none",document.body.appendChild(u),u.click(),u.remove(),setTimeout(()=>URL.revokeObjectURL(c),6e4)}catch(d){try{let l=`/api/projects/${s}/file?${Ro({root:n,path:t,download:"true"})}`,c=document.createElement("a");c.href=l,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 kc(e,t){if(!confirm(`Delete "${t.split("/").pop()}"?`))return;let n=ce.peek()||e?.path||"",s=e?.id||"_";try{await y("DELETE",`/api/projects/${s}/file?root=${encodeURIComponent(n)}&path=${encodeURIComponent(t)}`),z.value=z.peek()+" ",z.value=z.peek().trimEnd()}catch(a){alert(`Delete failed: ${a.message}`)}}async function $c(e,t,n,s){let a=n.size??(typeof n.content=="string"?n.content.length:0),o=Er(t);if(o&&n.encoding==="base64"){e.innerHTML=es(t,a,o)+`<div class="p-4 text-xs text-base-content/40">Parsing ${o.toUpperCase()}\u2026</div>`;try{let r=await xc(t,n.content,a);if(s.aborted)return;e.innerHTML=r}catch(r){if(s.aborted)return;e.innerHTML=es(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=es(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=uc(t,n.content||"",a),cc(e)}function Tr(){Ce(()=>{let e=i("files-breadcrumb");if(!e)return;let t=re.value!==null;e.innerHTML=`
1059
+ ${vc(re.value??z.value,t)}
1060
1060
  <div class="flex-1"></div>
1061
- ${t?"":'<button id="btn-upload" class="btn btn-ghost btn-xs text-base-content/50 hover:text-base-content">\u2191 Upload</button>'}`}),Tn(async e=>{let t=U.value,n=E.value,s=(ce.value||n?.path||"").trim(),a=re.value,o=z.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=n?.id||"_";r.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{if(a!==null){let u=await y("GET",`/api/projects/${d}/file?root=${encodeURIComponent(s)}&path=${encodeURIComponent(a)}`,void 0,e);e.aborted||await kc(r,a,u,e);return}let l=await y("GET",`/api/projects/${d}/files?root=${encodeURIComponent(s)}&path=${encodeURIComponent(o)}`,void 0,e);if(e.aborted)return;let c=Array.isArray(l)?l:Array.isArray(l?.files)?l.files:null;if(!c){r.innerHTML=`<div class="p-4 text-xs text-error">${p(l?.error||"Invalid directory listing")}</div>`;return}r.innerHTML=cc(c)}catch(l){!e.aborted&&l?.name!=="AbortError"&&(r.innerHTML=`<div class="p-4 text-xs text-error">${p(l.message)}</div>`)}}),g.on("click","[data-dir-path]",(e,t)=>{re.value=null,z.value=t.dataset.dirPath}),g.on("click","[data-file-path]",(e,t)=>{re.value=t.dataset.filePath}),g.on("click","#btn-upload",()=>vc()),g.on("click","[data-download-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.downloadPath;n&&yc(E.peek(),n)}),g.on("click","[data-delete-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.deletePath;n&&wc(E.peek(),n)}),g.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)})})}R();B();ue();var Tr=$(!1);function $c(e){return e?e.split(`
1061
+ ${t?"":'<button id="btn-upload" class="btn btn-ghost btn-xs text-base-content/50 hover:text-base-content">\u2191 Upload</button>'}`}),Tn(async e=>{let t=U.value,n=E.value,s=(ce.value||n?.path||"").trim(),a=re.value,o=z.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=n?.id||"_";r.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{if(a!==null){let u=await y("GET",`/api/projects/${d}/file?root=${encodeURIComponent(s)}&path=${encodeURIComponent(a)}`,void 0,e);e.aborted||await $c(r,a,u,e);return}let l=await y("GET",`/api/projects/${d}/files?root=${encodeURIComponent(s)}&path=${encodeURIComponent(o)}`,void 0,e);if(e.aborted)return;let c=Array.isArray(l)?l:Array.isArray(l?.files)?l.files:null;if(!c){r.innerHTML=`<div class="p-4 text-xs text-error">${p(l?.error||"Invalid directory listing")}</div>`;return}r.innerHTML=dc(c)}catch(l){!e.aborted&&l?.name!=="AbortError"&&(r.innerHTML=`<div class="p-4 text-xs text-error">${p(l.message)}</div>`)}}),g.on("click","[data-dir-path]",(e,t)=>{re.value=null,z.value=t.dataset.dirPath}),g.on("click","[data-file-path]",(e,t)=>{re.value=t.dataset.filePath}),g.on("click","#btn-upload",()=>yc()),g.on("click","[data-download-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.downloadPath;n&&wc(E.peek(),n)}),g.on("click","[data-delete-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.deletePath;n&&kc(E.peek(),n)}),g.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)})})}R();B();ue();var Mr=$(!1);function Sc(e){return e?e.split(`
1062
1062
  `).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(`
1063
- `):'<span class="text-base-content/40">No commits</span>'}function Sc(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`
1063
+ `):'<span class="text-base-content/40">No commits</span>'}function Lc(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`
1064
1064
  <div class="px-4 py-2 text-xs text-base-content/50 border-b border-base-300">
1065
1065
  Branch: <span class="text-success font-semibold">${p(e.branch)}</span>
1066
1066
  </div>
@@ -1086,9 +1086,9 @@ ${t}`:"",n.length?n.join(`
1086
1086
  <span class="text-base-content/40">Loading\u2026</span>
1087
1087
  </div>
1088
1088
  </div>
1089
- </div>`}function Lc(e){return e.split(`
1089
+ </div>`}function Ec(e){return e.split(`
1090
1090
  `).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(`
1091
- `)}function Mr(){Tn(async e=>{let t=U.value,n=E.value,s=be.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=n?.id||"_";a.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let r=await y("GET",`/api/projects/${o}/git/status?root=${encodeURIComponent(s)}`,void 0,e);e.aborted||(a.innerHTML=Sc(r))}catch(r){!e.aborted&&r?.name!=="AbortError"&&(a.innerHTML=`<div class="p-4 text-xs text-error">${p(r?.message??String(r))}</div>`)}}),Tn(async e=>{let t=E.value,n=be.value||t?.path,s=Tr.value,a=i("diff-content");if(!a||!n)return;let o=t?.id||"_";try{let r=await y("GET",`/api/projects/${o}/git/diff?root=${encodeURIComponent(n)}${s?"&staged=true":""}`,void 0,e);e.aborted||(a.innerHTML=r?.diff?Lc(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>`)}}),g.on("click","#diff-unstaged, #diff-staged",(e,t)=>{let n=t.id==="diff-staged";Tr.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"}`}),g.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||Ec()})}function Ec(){let e=E.peek(),t=be.peek()||e?.path,n=i("git-graph-content");if(!t||!n)return;let s=e?.id||"_";n.innerHTML='<span class="text-base-content/40">Loading\u2026</span>',y("GET",`/api/projects/${s}/git/log?root=${encodeURIComponent(t)}`).then(a=>{n.innerHTML=a.graph?$c(a.graph):'<span class="text-base-content/40">No commits</span>'}).catch(a=>{n.innerHTML=`<span class="text-error">${p(a.message)}</span>`})}R();B();var we=null,H=null,ea=null,ss=!1,ta=null,jr=null,ts=0,ns=null,ho=!1,Ir=!1,Cr={"ctrl-c":"",escape:"\x1B",tab:" ",up:"\x1B[A",down:"\x1B[B",left:"\x1B[D",right:"\x1B[C"};function bo(e){we&&we.readyState===WebSocket.OPEN&&we.send(JSON.stringify({type:"input",data:e}))}function Tc(){return window.matchMedia("(max-width: 640px), (hover: none) and (pointer: coarse)").matches}function na(){if(Tc()){document.getElementById("term-mobile-input")?.focus({preventScroll:!0});return}H?.focus();let e=document.querySelector("#terminal-container .xterm-helper-textarea");e&&(e.focus({preventScroll:!0}),requestAnimationFrame(()=>e.focus({preventScroll:!0})))}function Dr(){if(H)return;let e=i("terminal-container");if(!e)return;if(typeof Terminal>"u"){setTimeout(Dr,100);return}H=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"&&(ea=new FitAddon.FitAddon,H.loadAddon(ea)),H.open(e),Zs(),H.onData(n=>{bo(n)}),e.addEventListener("pointerdown",()=>na(),{passive:!0}),e.addEventListener("touchend",()=>na(),{passive:!0}),window.addEventListener("resize",()=>{Zs(),sa()});let t=window.visualViewport;if(t){let n=0,s=()=>{n&&cancelAnimationFrame(n),n=requestAnimationFrame(()=>{n=0,U.peek()==="shell"&&(Zs(),sa())})};t.addEventListener("resize",s),t.addEventListener("scroll",s)}}function Zs(){try{ea&&H&&ea.fit()}catch{}}function sa(){we&&we.readyState===WebSocket.OPEN&&H&&we.send(JSON.stringify({type:"resize",cols:H.cols,rows:H.rows}))}function Nr(){return f.machineId||j.peek()||null}function aa(e){ns&&(clearTimeout(ns),ns=null),ho=!0;let t=++ts;if(we){try{we.close()}catch{}we=null}ss=!1;let n=location.protocol==="https:"?"wss":"ws",s=H?H.cols:80,a=H?H.rows:24,o=new URLSearchParams;f.token&&o.set("token",f.token),e&&o.set("cwd",e),o.set("cols",String(s)),o.set("rows",String(a));let r=Nr();A.peek()&&r&&o.set("machine",r),ta=e||null,jr=r,we=new WebSocket(`${n}://${location.host}/ws/shell?${o}`),we.addEventListener("open",()=>{t===ts&&(ss=!0,H?.write(`\x1B[32mConnected to interactive terminal\x1B[0m\r
1091
+ `)}function Ir(){Tn(async e=>{let t=U.value,n=E.value,s=be.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=n?.id||"_";a.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let r=await y("GET",`/api/projects/${o}/git/status?root=${encodeURIComponent(s)}`,void 0,e);e.aborted||(a.innerHTML=Lc(r))}catch(r){!e.aborted&&r?.name!=="AbortError"&&(a.innerHTML=`<div class="p-4 text-xs text-error">${p(r?.message??String(r))}</div>`)}}),Tn(async e=>{let t=E.value,n=be.value||t?.path,s=Mr.value,a=i("diff-content");if(!a||!n)return;let o=t?.id||"_";try{let r=await y("GET",`/api/projects/${o}/git/diff?root=${encodeURIComponent(n)}${s?"&staged=true":""}`,void 0,e);e.aborted||(a.innerHTML=r?.diff?Ec(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>`)}}),g.on("click","#diff-unstaged, #diff-staged",(e,t)=>{let n=t.id==="diff-staged";Mr.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"}`}),g.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||Tc()})}function Tc(){let e=E.peek(),t=be.peek()||e?.path,n=i("git-graph-content");if(!t||!n)return;let s=e?.id||"_";n.innerHTML='<span class="text-base-content/40">Loading\u2026</span>',y("GET",`/api/projects/${s}/git/log?root=${encodeURIComponent(t)}`).then(a=>{n.innerHTML=a.graph?Sc(a.graph):'<span class="text-base-content/40">No commits</span>'}).catch(a=>{n.innerHTML=`<span class="text-error">${p(a.message)}</span>`})}R();B();var we=null,H=null,ea=null,ss=!1,ta=null,Dr=null,ts=0,ns=null,ho=!1,Cr=!1,Ar={"ctrl-c":"",escape:"\x1B",tab:" ",up:"\x1B[A",down:"\x1B[B",left:"\x1B[D",right:"\x1B[C"};function bo(e){we&&we.readyState===WebSocket.OPEN&&we.send(JSON.stringify({type:"input",data:e}))}function Mc(){return window.matchMedia("(max-width: 640px), (hover: none) and (pointer: coarse)").matches}function na(){if(Mc()){document.getElementById("term-mobile-input")?.focus({preventScroll:!0});return}H?.focus();let e=document.querySelector("#terminal-container .xterm-helper-textarea");e&&(e.focus({preventScroll:!0}),requestAnimationFrame(()=>e.focus({preventScroll:!0})))}function Nr(){if(H)return;let e=i("terminal-container");if(!e)return;if(typeof Terminal>"u"){setTimeout(Nr,100);return}H=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"&&(ea=new FitAddon.FitAddon,H.loadAddon(ea)),H.open(e),Zs(),H.onData(n=>{bo(n)}),e.addEventListener("pointerdown",()=>na(),{passive:!0}),e.addEventListener("touchend",()=>na(),{passive:!0}),window.addEventListener("resize",()=>{Zs(),sa()});let t=window.visualViewport;if(t){let n=0,s=()=>{n&&cancelAnimationFrame(n),n=requestAnimationFrame(()=>{n=0,U.peek()==="shell"&&(Zs(),sa())})};t.addEventListener("resize",s),t.addEventListener("scroll",s)}}function Zs(){try{ea&&H&&ea.fit()}catch{}}function sa(){we&&we.readyState===WebSocket.OPEN&&H&&we.send(JSON.stringify({type:"resize",cols:H.cols,rows:H.rows}))}function _r(){return f.machineId||j.peek()||null}function aa(e){ns&&(clearTimeout(ns),ns=null),ho=!0;let t=++ts;if(we){try{we.close()}catch{}we=null}ss=!1;let n=location.protocol==="https:"?"wss":"ws",s=H?H.cols:80,a=H?H.rows:24,o=new URLSearchParams;f.token&&o.set("token",f.token),e&&o.set("cwd",e),o.set("cols",String(s)),o.set("rows",String(a));let r=_r();A.peek()&&r&&o.set("machine",r),ta=e||null,Dr=r,we=new WebSocket(`${n}://${location.host}/ws/shell?${o}`),we.addEventListener("open",()=>{t===ts&&(ss=!0,H?.write(`\x1B[32mConnected to interactive terminal\x1B[0m\r
1092
1092
  `),sa())}),we.addEventListener("message",d=>{if(t!==ts)return;let l;try{l=JSON.parse(d.data)}catch{return}l.type==="output"?H?.write(l.data):l.type==="exit"?H?.write(`\r
1093
1093
  \x1B[33m[process exited: ${l.code}]\x1B[0m\r
1094
1094
  `):l.type==="error"&&H?.write(`\r
@@ -1098,4 +1098,4 @@ ${t}`:"",n.length?n.join(`
1098
1098
  `),!(!ho||U.peek()!=="shell")&&(H?.write(`\x1B[33m[reconnecting\u2026]\x1B[0m\r
1099
1099
  `),ns=setTimeout(()=>{ns=null,aa(ta)},1500)))}),we.addEventListener("error",()=>{t===ts&&H?.write(`\r
1100
1100
  \x1B[31m[WebSocket error]\x1B[0m\r
1101
- `)})}function Ar(){let e=E.peek()?.path,t=i("term-cwd");t&&(t.textContent=e||"~"),H||Dr(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{Zs();let n=Nr();!ss||ta!==(e||null)||jr!==n?(H?.clear(),aa(e)):sa()})})}function _r(){Ir||(Ir=!0,document.getElementById("term-keyboard")?.addEventListener("click",na),document.getElementById("term-mobile-composer")?.addEventListener("submit",e=>{e.preventDefault();let t=document.getElementById("term-mobile-input");t&&(bo(`${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||!Cr[t]||(bo(Cr[t]),na())})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(U.peek()!=="shell"||!ho||ss||aa(ta))}),Le(U,e=>{e==="shell"&&Ar()}),document.addEventListener("shell-tab-shown",()=>{U.peek()==="shell"&&Ar()}),document.getElementById("term-reconnect")?.addEventListener("click",()=>{H?.clear(),aa(E.peek()?.path)})}hn();Kn();Ss();en();function go(){let e=document.documentElement;e.classList.add("boot-ready"),e.classList.remove("boot-pending")}function oa(){document.documentElement.classList.remove("boot-restore")}var xo=_a(location.hash.slice(1)||"/"),Pr=fo()||!!(f.token&&xo?.id);Sr({restoreSession:Pr});Uo();yi();Er();Mr();Mi();_r();xi();Ui();ki(Pe,it);(async()=>{let e=Yt();if(f.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")),Pr){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 Ys({hub:s,deepLink:xo}),xo?.id||($i(),(location.hash||"").startsWith("#/session/")||oa()),requestAnimationFrame(()=>{requestAnimationFrame(go)})}catch(t){console.error("[boot]",t),f.token=null,localStorage.removeItem("token"),oa(),await po(),go()}else{oa();try{await po()}catch(t){console.error("[boot auth]",t)}finally{go()}}})();document.addEventListener("router:home",()=>{oa()});qo();
1101
+ `)})}function jr(){let e=E.peek()?.path,t=i("term-cwd");t&&(t.textContent=e||"~"),H||Nr(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{Zs();let n=_r();!ss||ta!==(e||null)||Dr!==n?(H?.clear(),aa(e)):sa()})})}function Pr(){Cr||(Cr=!0,document.getElementById("term-keyboard")?.addEventListener("click",na),document.getElementById("term-mobile-composer")?.addEventListener("submit",e=>{e.preventDefault();let t=document.getElementById("term-mobile-input");t&&(bo(`${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||!Ar[t]||(bo(Ar[t]),na())})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(U.peek()!=="shell"||!ho||ss||aa(ta))}),Le(U,e=>{e==="shell"&&jr()}),document.addEventListener("shell-tab-shown",()=>{U.peek()==="shell"&&jr()}),document.getElementById("term-reconnect")?.addEventListener("click",()=>{H?.clear(),aa(E.peek()?.path)})}hn();Kn();Ss();en();function go(){let e=document.documentElement;e.classList.add("boot-ready"),e.classList.remove("boot-pending")}function oa(){document.documentElement.classList.remove("boot-restore")}var xo=_a(location.hash.slice(1)||"/"),Hr=fo()||!!(f.token&&xo?.id);Lr({restoreSession:Hr});Uo();yi();Tr();Ir();Mi();Pr();xi();Ui();ki(He,it);(async()=>{let e=Yt();if(f.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")),Hr){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 Ys({hub:s,deepLink:xo}),xo?.id||($i(),(location.hash||"").startsWith("#/session/")||oa()),requestAnimationFrame(()=>{requestAnimationFrame(go)})}catch(t){console.error("[boot]",t),f.token=null,localStorage.removeItem("token"),oa(),await po(),go()}else{oa();try{await po()}catch(t){console.error("[boot auth]",t)}finally{go()}}})();document.addEventListener("router:home",()=>{oa()});qo();