claude-simple 0.2.30 → 0.2.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
var wd=Object.defineProperty;var U=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(s){throw n=[s],s}};var ls=(e,t)=>{for(var n in t)wd(e,n,{get:t[n],enumerable:!0})};function $d(){Ho||(Ho=!0,queueMicrotask(()=>{Ho=!1,Bo()}))}function yi(e){for(let t of e)(t._isComputed?En:In).add(t);Ro>0||na||(kd==="microtask"?$d():Bo())}function ki(e,t,n,s){let a=new Set(n);for(let r of n)r._subs.delete(t);n.clear(),s?.forEach(r=>r?.()),s?.splice(0);let o=[Gt,us,No];[Gt,us,No]=[t,n,s];try{return e()}catch(r){for(let d of a)d._subs.add(t),n.add(d);throw r}finally{[Gt,us,No]=o}}var Gt,us,Ro,No,En,In,na,cs,Po,kd,Ho,Bo,wi,I,Oo,je,xe,De,Tn,Sd,p,b,$i,i,qo,Ld,ot,ds,Ed,sa,Id,Hf,aa,qf,Rf,Si,Li=U(()=>{Gt=null,us=null,Ro=0,No=null,En=new Set,In=new Set,na=!1,cs=1e4,Po={flushes:0,runs:0,lastFlushRuns:0},kd="sync",Ho=!1;Bo=()=>{if(na)return;na=!0;let e=0;Po.flushes++;try{for(;En.size||In.size;){for(;En.size;){let t=En.values().next().value;if(En.delete(t),++e>cs)throw new Error(`mini-react: reactive update loop exceeded ${cs} runs`);t()}if(In.size){let t=In.values().next().value;if(In.delete(t),++e>cs)throw new Error(`mini-react: reactive update loop exceeded ${cs} runs`);t()}}}finally{Po.runs+=e,Po.lastFlushRuns=e,e>cs&&(En.clear(),In.clear()),na=!1}};wi=class{constructor(e,t){this._v=e,this._subs=new Set,this._eq=t??((n,s)=>n===s)}get value(){return Gt&&(this._subs.add(Gt),us?.add(this)),this._v}set value(e){this._eq(e,this._v)||(this._v=e,yi(this._subs))}peek(){return this._v}},I=(e,{equals:t}={})=>new wi(e,t);Oo=e=>{let t=new wi(void 0),n=new Set,s=!0,a=!1,o=u=>{if(!s||a)return t._v;s=!1;try{let l=ki(e,r,n,null),f=l!==t._v;f&&(t._v=l),f&&u&&yi(t._subs)}catch(l){s=!0,console.error("[computed]",l)}return t._v},r=()=>{s||a||(s=!0,t._subs.size&&o(!0))};r._isComputed=!0;let d=()=>o(!1);return Object.defineProperty(t,"value",{get(){return Gt&&(t._subs.add(Gt),us?.add(t)),d()},set(){throw new TypeError("Cannot assign to a computed signal")}}),t.dispose=()=>{if(!a){a=!0;for(let u of n)u._subs.delete(r);n.clear()}},t},je=e=>{let t=new Set,n=[],s=()=>{try{let a=ki(e,s,t,n);typeof a=="function"&&n.push(a)}catch(a){console.error("[effect]",a)}};return s(),()=>{for(let a of t)a._subs.delete(s);t.clear(),n.forEach(a=>a?.()),n.splice(0)}},xe=e=>{Ro++;try{e()}finally{--Ro===0&&Bo()}},De=(e,t)=>{let n=e.peek(),s=!1;return je(()=>{let a=e.value;s&&t(a,n),s=!0,n=a})},Tn=e=>je(()=>{let t=new AbortController;return Promise.resolve(e(t.signal)).catch(n=>{n?.name!=="AbortError"&&console.error("[asyncEffect]",n)}),()=>t.abort()}),Sd={"&":"&","<":"<",">":">",'"':"""},p=e=>String(e??"").replace(/[&<>"]/g,t=>Sd[t]),b=(()=>{let e=new Map,t=n=>{e.has(n)||(e.set(n,[]),document.addEventListener(n,s=>{xe(()=>{for(let[a,o]of e.get(n)){let r=s.target.closest(a);r&&o(s,r)}})},{capture:!0}))};return{on:(n,s,a)=>{t(n);let o=[s,a];return e.get(n).push(o),()=>e.set(n,e.get(n).filter(r=>r!==o))},off:(n,s)=>{e.has(n)&&e.set(n,e.get(n).filter(([a])=>a!==s))}}})(),$i=(e,{keepAlive:t=!1}={})=>{let n=I(location.hash.slice(1)||"/"),s=!1,a=()=>{n.value=location.hash.slice(1)||"/"};window.addEventListener("hashchange",a);let o=t?new Map:null,r=(l,f)=>{if(!t)return f();if(o.has(l))return o.get(l);let m=f();return o.set(l,m),m},d=I(void 0),u=je(()=>{let l=n.value;for(let[f,m]of Object.entries(e)){if(f==="*")continue;let g=new RegExp("^"+f.replace(/:\w+/g,"([^/]+)")+"$"),w=l.match(g);if(w){let y=w.slice(1);d.value=typeof m=="function"?r(`${f}|${y.join("/")}`,()=>m(...y)):m;return}}if(e["*"]){let f=e["*"];d.value=typeof f=="function"?r("*",f):f;return}d.value=null});return{current:n,route:d,navigate:l=>{s||(location.hash=l)},match:l=>{let f=n.value.match(new RegExp("^"+l.replace(/:\w+/g,"([^/]+)")+"$"));return f?f.slice(1):null},invalidate:l=>{if(o){if(l===void 0){o.clear();return}for(let f of[...o.keys()])(f===l||f.startsWith(`${l}|`))&&o.delete(f)}},dispose:()=>{s||(s=!0,window.removeEventListener("hashchange",a),u(),o?.clear())}}},i=e=>document.getElementById(e),qo=()=>typeof navigator>"u"||navigator.onLine!==!1,Ld=e=>new Promise(t=>setTimeout(t,e)),ot=e=>e===void 0?"undefined":e===null||typeof e!="object"?JSON.stringify(e):e instanceof Date?`Date(${e.toJSON()})`:Array.isArray(e)?`[${e.map(ot).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ot(e[t])}`).join(",")}}`,ds=(e,t)=>{if(!t)return!0;if(typeof t=="function")return t(e);if(t.queryKey){let n=ot(t.queryKey);if(t.exact?e.hash!==n:!e.hash.startsWith(n.slice(0,-1)))return!1}return!t.tags||t.tags.some(n=>e.tags.has(n))},Ed=e=>{try{return JSON.stringify(e),!0}catch{return!1}},sa=(e,t)=>{if(Object.is(e,t))return e;if(!e||!t||typeof e!="object"||typeof t!="object")return t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return t;let a=t.map((o,r)=>sa(e[r],o));return a.every((o,r)=>o===e[r])?e:a}if(Array.isArray(e)||Array.isArray(t)||Object.getPrototypeOf(e)!==Object.prototype||Object.getPrototypeOf(t)!==Object.prototype)return t;let n=Object.keys(t);if(n.length!==Object.keys(e).length)return t;let s={};for(let a of n){if(!(a in e))return t;s[a]=sa(e[a],t[a])}return n.every(a=>s[a]===e[a])?e:s},Id=({staleTime:e=3e4,gcTime:t=3e5,retry:n=2,retryDelay:s=1e3,refetchOnWindowFocus:a=!1,refetchOnReconnect:o=!0}={})=>{let r=new Map,d=new Set,u=new Map,l=null,f=!1,m=h=>{for(let v of d)v(h)},g=h=>h.state,w=h=>!h.invalidated&&Date.now()-h.state.updatedAt.peek()<h.options.staleTime,y=h=>{h.invalidated=!0,h.state.isStale.value=!0},H=h=>{h.gcTimer&&clearTimeout(h.gcTimer),h.gcTimer=null},me=h=>{H(h),!h.observers&&Number.isFinite(h.options.gcTime)&&(h.gcTimer=setTimeout(()=>{!h.observers&&!h.promise&&(r.delete(h.hash),m({type:"gc",key:h.key}))},h.options.gcTime))},z=h=>{h.pollTimer&&clearTimeout(h.pollTimer),h.pollTimer=null},ue=h=>{z(h);let v=typeof h.options.refetchInterval=="function"?h.options.refetchInterval(h):h.options.refetchInterval;h.observers&&Number.isFinite(v)&&v>0&&(h.pollTimer=setTimeout(async()=>{qo()&&await he(h,{force:!0}).catch(()=>{}),ue(h)},v))},q=(h,v=ot(h.queryKey))=>{let $={staleTime:e,gcTime:t,retry:n,retryDelay:s,...h},k={hash:v,key:h.queryKey,queryFn:h.queryFn,options:$,tags:new Set(h.tags??[]),observers:0,invalidated:!0,promise:null,ctrl:null,version:0,gcTimer:null,pollTimer:null,state:{data:I(h.initialData),error:I(null),status:I(h.initialData===void 0?"idle":"success"),fetchStatus:I("idle"),updatedAt:I(h.initialData===void 0?0:Date.now()),isStale:I(!0)}};return r.set(v,k),k},J=h=>{if(!h?.queryKey)throw new TypeError("query: queryKey is required");let v=ot(h.queryKey),$=r.get(v)??q(h,v);h.queryFn&&($.queryFn=h.queryFn),$.options={...$.options,...h};for(let k of h.tags??[])$.tags.add(k);return $},he=(h,{force:v=!1}={})=>{if(!h.queryFn)return Promise.reject(new TypeError(`query ${h.hash} has no queryFn`));if(!v&&w(h))return Promise.resolve(h.state.data.peek());if(h.promise)return h.promise;if(!qo())return h.state.fetchStatus.value="paused",Promise.reject(new Error("Query paused while offline"));H(h);let $=++h.version,k=new AbortController;h.ctrl=k,xe(()=>{h.state.data.peek()===void 0&&(h.state.status.value="pending"),h.state.fetchStatus.value="fetching",h.state.error.value=null}),m({type:"fetch",key:h.key});let R=async(N,Q)=>{try{return await h.queryFn({queryKey:h.key,signal:k.signal,meta:h.options.meta})}catch(B){if(k.signal.aborted||B?.name==="AbortError"||N<=0||h.options.retry===!1)throw B;return await Ld(typeof Q=="function"?Q(N,B):Q),R(N-1,typeof Q=="number"?Q*2:Q)}},Z=R(h.options.retry??n,h.options.retryDelay??s).then(N=>(h.version===$&&!k.signal.aborted&&xe(()=>{h.state.data.value=h.options.structuralSharing===!1?N:sa(h.state.data.peek(),N),h.state.status.value="success",h.state.fetchStatus.value="idle",h.state.updatedAt.value=Date.now(),h.state.isStale.value=!1,h.invalidated=!1}),m({type:"success",key:h.key}),N)).catch(N=>{throw h.version===$&&!k.signal.aborted&&xe(()=>{h.state.error.value=N,h.state.status.value=h.state.data.peek()===void 0?"error":"success",h.state.fetchStatus.value="idle"}),k.signal.aborted||m({type:"error",key:h.key,error:N}),N}).finally(()=>{h.promise===Z&&(h.promise=null,h.ctrl=null,me(h))});return h.promise=Z,Z},Ae=h=>Promise.all([...r.values()].filter(v=>ds(v,h)&&v.observers).map(v=>he(v,{force:!0}).catch(()=>{}))),L={query(h){let v=J(h);v.observers++,H(v),ue(v),h.enabled!==!1&&(!w(v)||h.refetchOnMount)&&he(v).catch(()=>{});let $=()=>{v.observers=Math.max(0,v.observers-1),me(v),ue(v)};return[g(v),{refetch:()=>he(v,{force:!0}),invalidate:()=>L.invalidateQueries({queryKey:v.key,exact:!0}),setData:k=>L.setQueryData(v.key,k),cancel:()=>L.cancelQueries({queryKey:v.key,exact:!0}),dispose:$}]},prefetchQuery(h){let v=J(h);return he(v)},fetchQuery(h){let v=J(h);return he(v)},getQueryData(h){return r.get(ot(h))?.state.data.peek()},getQueryState(h){let v=r.get(ot(h));return v&&g(v)},setQueryData(h,v,{tags:$}={}){let k=r.get(ot(h))??J({queryKey:h,tags:$}),R=typeof v=="function"?v(k.state.data.peek()):v,Z=k.options.structuralSharing===!1?R:sa(k.state.data.peek(),R);xe(()=>{k.state.data.value=Z,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 N of $??[])k.tags.add(N);return m({type:"set",key:k.key}),l&&l.postMessage({type:"invalidate",hash:k.hash}),Z},invalidateQueries(h){for(let v of r.values())ds(v,h)&&y(v);return m({type:"invalidate",filter:h}),l&&l.postMessage({type:"invalidate",filter:h}),Ae(h)},cancelQueries(h){for(let v of r.values())ds(v,h)&&v.ctrl?.abort()},removeQueries(h){for(let v of[...r.values()])ds(v,h)&&(v.ctrl?.abort(),H(v),z(v),r.delete(v.hash))},mutate({mutationFn:h,variables:v,optimistic:$,invalidate:k,onMutate:R,onSuccess:Z,onError:N,networkMode:Q="online"}={}){if(typeof h!="function")return Promise.reject(new TypeError("mutate: mutationFn is required"));let B=[],ve=A=>(Array.isArray(A)?A:[A]).filter(Boolean).forEach(ce=>{let Wt=L.getQueryData(ce.queryKey);B.push([ce.queryKey,Wt]),L.setQueryData(ce.queryKey,Ln=>ce.updater(Ln))}),Ke=async()=>{let A=await R?.(v,{client:L});$&&ve(typeof $=="function"?$(v):$);try{let ce=await h(v);return await Z?.(ce,v,A),k&&await L.invalidateQueries(k),m({type:"mutation-success"}),ce}catch(ce){for(let[Wt,Ln]of B)L.setQueryData(Wt,Ln);throw await N?.(ce,v,A),m({type:"mutation-error",error:ce}),ce}};return!qo()&&Q==="offlineFirst"?(ge.push(Ke),m({type:"mutation-queued"}),Promise.resolve({queued:!0})):Ke()},infiniteQuery({queryKey:h,queryFn:v,initialPageParam:$=0,getNextPageParam:k,...R}){let[Z,N]=L.query({queryKey:h,...R,queryFn:async Q=>({pages:[await v({...Q,pageParam:$})],pageParams:[$]})});return[Z,{...N,fetchNextPage:async()=>{let Q=Z.data.peek()??{pages:[],pageParams:[]},B=k?.(Q.pages.at(-1),Q.pages);if(B==null)return;let ve=await v({queryKey:h,pageParam:B,signal:new AbortController().signal});return L.setQueryData(h,{pages:[...Q.pages,ve],pageParams:[...Q.pageParams,B]}),ve}}]},dehydrate({shouldDehydrate:h=$=>$.state.status.peek()==="success",version:v=1}={}){return{version:v,timestamp:Date.now(),queries:[...r.values()].filter(h).filter($=>Ed($.state.data.peek())).map($=>({key:$.key,data:$.state.data.peek(),updatedAt:$.state.updatedAt.peek(),staleTime:$.options.staleTime,tags:[...$.tags]}))}},hydrate(h,{version:v=1}={}){if(!h||h.version!==v||!Array.isArray(h.queries))return!1;for(let $ of h.queries){let k=r.get(ot($.key))??J({queryKey:$.key,staleTime:$.staleTime,tags:$.tags});xe(()=>{k.state.data.value=$.data,k.state.status.value="success",k.state.updatedAt.value=$.updatedAt,k.state.isStale.value=Date.now()-$.updatedAt>=k.options.staleTime}),k.invalidated=k.state.isStale.peek()}return m({type:"hydrate"}),!0},persist({storage:h=typeof localStorage>"u"?null:localStorage,key:v="mini-react-query",version:$=1}={}){if(!h)throw new Error("persist: a storage adapter is required");let k=!1,R=async()=>{let N=JSON.stringify(L.dehydrate({version:$}));return h.set?h.set(v,N):h.setItem(v,N)},Z=L.subscribe(()=>{k||(k=!0,queueMicrotask(()=>{k=!1,R().catch(()=>{})}))});return{restore:async()=>{let N=await(h.get?h.get(v):h.getItem(v));return N?L.hydrate(JSON.parse(N),{version:$}):!1},save:R,dispose:Z}},sync(h="mini-react-query"){return typeof BroadcastChannel>"u"?()=>{}:(l?.close(),l=new BroadcastChannel(h),l.onmessage=v=>{if(v.data?.type!=="invalidate")return;let $=v.data.hash?k=>k.hash===v.data.hash:v.data.filter;for(let k of r.values())ds(k,$)&&y(k);Ae($)},()=>{l?.close(),l=null})},subscribe(h){return d.add(h),()=>d.delete(h)},getDebugSnapshot(){return[...r.values()].map(h=>({key:h.key,observers:h.observers,status:h.state.status.peek(),fetchStatus:h.state.fetchStatus.peek(),updatedAt:h.state.updatedAt.peek(),stale:h.state.isStale.peek(),tags:[...h.tags]}))},async fetchJSON(h,v={},{queryKey:$=["GET",h,v.body??null],...k}={}){let R=ot($);return L.fetchQuery({queryKey:$,...k,queryFn:async({signal:Z})=>{let N=new Headers(v.headers),Q=u.get(R);Q?.etag&&N.set("If-None-Match",Q.etag);let B=await fetch(h,{...v,headers:N,signal:Z});if(B.status===304&&Q)return L.getQueryData($);if(!B.ok)throw new Error(`HTTP ${B.status}`);let ve=B.headers.get("cache-control")?.match(/max-age=(\d+)/)?.[1];if(ve){let Ke=r.get(R);Ke&&(Ke.options.staleTime=Number(ve)*1e3)}return u.set(R,{etag:B.headers.get("etag")}),B.json()}})},destroy(){f=!0;for(let h of r.values())h.ctrl?.abort(),H(h),z(h);l?.close(),d.clear()}},ge=[],be=()=>{a&&Ae()},ae=()=>{for(o&&Ae();ge.length;)ge.shift()().catch(()=>{})};typeof window<"u"&&(window.addEventListener("focus",be),window.addEventListener("online",ae));let Ft=L.destroy;return L.destroy=()=>{f||(typeof window<"u"&&(window.removeEventListener("focus",be),window.removeEventListener("online",ae)),Ft())},L},Hf=Id(),aa=({cache:e=!0,ttl:t=3e4,retry:n=2,retryDelay:s=1e3,store:a=null,dedupe:o=!0}={})=>{let r=new Map,d=new Map,u=new Map,l=(m,g)=>{if(a)return a.get(m);let w=r.get(m);return w&&Date.now()-w.ts<g?w.data:void 0},f=async(m,g,w)=>{if(a)return a.set(m,g,{ttl:w});r.set(m,{data:g,ts:Date.now()})};return{get:(m,g,w={})=>{let y=w.ttl??t,H=e&&w.cache!==!1&&y!==0,me=w.dedupe??o;if(me&&d.has(m))return d.get(m);let z=()=>{let q=u.get(m)??0,J=(he,Ae)=>Promise.resolve(g()).then(async L=>(H&&(u.get(m)??0)===q&&await f(m,L,y),L)).catch(L=>{if(he>0&&L?.name!=="AbortError")return new Promise(ge=>setTimeout(ge,Ae)).then(()=>J(he-1,Ae*2));throw L});return J(w.retry??n,s)},ue=q=>(me&&(d.set(m,q),q.finally(()=>{d.get(m)===q&&d.delete(m)}).catch(()=>{})),q);if(!H)return ue(z());if(!a){let q=l(m,y);return q!==void 0?Promise.resolve(q):ue(z())}return ue(Promise.resolve(l(m,y)).then(q=>q!==void 0?q:z()))},invalidate:m=>{if(m!==void 0)u.set(m,(u.get(m)??0)+1);else{for(let g of r.keys())u.set(g,(u.get(g)??0)+1);for(let g of d.keys())u.set(g,(u.get(g)??0)+1)}if(a)return m===void 0?a.clear():a.delete(m);m===void 0?r.clear():r.delete(m)}}},qf=new TextEncoder,Rf=new TextDecoder,Si=(e,t="kv")=>{let n=null,s=()=>n?Promise.resolve(n):new Promise((o,r)=>{let d=indexedDB.open(e,1);d.onupgradeneeded=u=>u.target.result.createObjectStore(t),d.onsuccess=u=>{n=u.target.result,o(n)},d.onerror=u=>r(u.target.error)}),a=async(o,r)=>{let d=await s();return new Promise((u,l)=>{let f=d.transaction(t,o),m=r(f.objectStore(t));m.onsuccess=()=>u(m.result),m.onerror=()=>l(m.error)})};return{async get(o){let r=await a("readonly",d=>d.get(o));if(r){if(r.expires&&Date.now()>r.expires){this.delete(o);return}return r.val}},async set(o,r,{ttl:d}={}){await a("readwrite",u=>u.put({val:r,expires:d?Date.now()+d:null},o))},delete:o=>a("readwrite",r=>r.delete(o)),clear:()=>a("readwrite",o=>o.clear()),keys:()=>a("readonly",o=>o.getAllKeys())}}});var W=U(()=>{Li()});var _i={};ls(_i,{AGENT_DEFAULT_MODEL:()=>Ai,AGENT_LABELS:()=>X,AGENT_MODELS:()=>Uo,LOW_TURN_THRESHOLD:()=>Wo,activityHits:()=>rt,activityLoading:()=>gt,addCustomModel:()=>Jt,agentFilter:()=>ye,agentFilters:()=>zt,agentsMeta:()=>Kt,chatDensity:()=>_e,collapsedFolders:()=>Mn,ctx:()=>c,currentAgent:()=>S,currentEffort:()=>te,currentModel:()=>_,currentPermission:()=>de,currentProject:()=>E,currentTab:()=>Y,expandedFolders:()=>Cn,favoritesOnly:()=>ze,filesPath:()=>V,filesRoot:()=>re,filteredSessions:()=>Dt,getCustomModels:()=>ra,getDefaultEffort:()=>Qe,getDefaultModel:()=>Oe,getEffortsForModel:()=>Qt,getModelsForAgent:()=>Be,getSavedModel:()=>Mi,getSessionMeta:()=>An,gitRoot:()=>Se,hubMachineReady:()=>it,hubMode:()=>M,isProcessing:()=>D,machinesList:()=>ie,metaKey:()=>K,projectGroups:()=>Vt,removeCustomModel:()=>zo,selectedMachineId:()=>j,sessionDisplayTitle:()=>bt,sessionFilter:()=>ke,sessionMetaMap:()=>T,sessionSearch:()=>$e,sessionSort:()=>Ei,sessionsData:()=>ne,setAgent:()=>Ne,setChatDensity:()=>Go,setCurrentModel:()=>se,setSelectedMachine:()=>Le,showHiddenOnly:()=>Je,sidebarView:()=>ht,timeRange:()=>oa,viewingFile:()=>oe,workspacesData:()=>pe,wsStatus:()=>fe});function Ti(){try{let e=JSON.parse(localStorage.getItem(Ii)||"{}");return e&&typeof e=="object"?e:{}}catch{return{}}}function Ci(e,t=c.sessionId,n=c.machineId){if(!t)return"";let s=(e||"claude").toLowerCase();return`${n||""}:${s}:${t}`}function Mi(e,t=c.sessionId,n=c.machineId){let s=Ci(e,t,n);if(!s)return null;let a=Ti()[s];return typeof a=="string"&&a.trim()?a:null}function se(e,t=S.peek(),n=c.sessionId,s=c.machineId){let a=String(e||"").trim();if(!a)return;let o=Ci(t,n,s);if(o){let r=Ti();r[o]=a,localStorage.setItem(Ii,JSON.stringify(r))}_.value=a}function Le(e){let t=e||null;j.value=t,c.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function K(e,t,n){let s=`${e||"claude"}:${t}`;return n||c?.machineId?`${n||c.machineId}:${s}`:s}function An(e,t,n){return T.peek()?.[K(e,t,n)]||{favorite:!1,notes:"",title:"",hidden:!1,branch:null}}function bt(e,{preferSnippet:t=!1}={}){if(!e)return"Session";if(t&&e.snippet)return e.snippet;let s=(An(e.agent,e.sessionId,e.machineId).title||"").trim();return s||e.display||e.sessionId?.slice(0,8)||"Session"}function Go(e){let t=["clean","normal","full"].includes(e)?e:"normal";_e.value=t,localStorage.setItem("chatDensity",t),document.getElementById("messages")?.setAttribute("data-density",t)}function Cd(e){return e?typeof e=="string"?{value:e,label:e}:e.value?{value:String(e.value),label:e.label||e.value,...Array.isArray(e.efforts)&&e.efforts.length?{efforts:e.efforts.map(String)}:{},...e.defaultEffort?{defaultEffort:String(e.defaultEffort)}:{}}:null:null}function Ko(){try{let e=localStorage.getItem(ji);if(!e)return{};let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function Di(e){localStorage.setItem(ji,JSON.stringify(e))}function ra(e){let t=(e||"claude").toLowerCase(),n=Ko()[t];return Array.isArray(n)?n.filter(Boolean).map(String):[]}function Jt(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim();if(!s)return!1;let a=Ko(),o=Array.isArray(a[n])?[...a[n]]:[];return o.includes(s)||o.push(s),a[n]=o,Di(a),!0}function zo(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim(),a=Ko(),o=Array.isArray(a[n])?a[n].filter(r=>r!==s):[];return a[n]=o,Di(a),!0}function Be(e){let t=(e||"claude").toLowerCase(),n=Kt.peek()?.defaults?.[t],s=n?.models?.length?n.models.map(Cd).filter(Boolean):(Uo[t]||Uo.claude).map(r=>({...r})),a=ra(t),o=new Set(s.map(r=>r.value));for(let r of a){if(o.has(r)){s=s.map(d=>{if(d.value!==r)return d;let u=String(d.label||d.value);return{...d,custom:!0,label:u.includes("\u2605")?u:`${u} \u2605`}});continue}o.add(r),s.push({value:r,label:`${r} \u2605`,custom:!0})}return s}function Oe(e){let t=(e||"claude").toLowerCase(),n=Kt.peek()?.defaults?.[t];return n?.model?String(n.model):Ai[t]||Be(t)[0]?.value||"sonnet"}function Qt(e,t){let s=Be(e).find(o=>o.value===t);if(s?.efforts?.length)return s.efforts;let a=Kt.peek()?.defaults?.[(e||"claude").toLowerCase()];return a?.efforts?.length?a.efforts.map(String):["low","medium","high","xhigh","max"]}function Qe(e,t){let n=(e||"claude").toLowerCase(),s=Kt.peek()?.defaults?.[n];if(s?.effortDefault)return String(s.effortDefault);let o=Be(n).find(r=>r.value===t);return o?.defaultEffort?String(o.defaultEffort):n==="grok"?"low":n==="gemini"&&String(t||"").match(/-(low|medium|high)$/i)?.[1]?.toLowerCase()||""}function Ne(e){let t=(e||"claude").toLowerCase();S.value=t,localStorage.setItem("agent",t),de.value="bypassPermissions";let n=typeof document>"u"?null:document.getElementById("sel-permission");n&&(n.value=de.peek());let s=Mi(t);s?_.value=s:se(Oe(t),t);let a=Qe(t,_.peek());a?te.value=a:t!=="grok"&&t!=="gemini"&&(te.value="")}function Md(e,t){return!t||t==="all"?!0:(e.agent||"claude")===t}function Ad(e,t){if(!t)return!0;let n=T.value?.[K(e.agent,e.sessionId,e.machineId)];return[e.display,e.cwd,e.projectName,e.agent,e.sessionId,e.snippet,e.machineId,n?.notes,n?.title].filter(Boolean).join(" ").toLowerCase().includes(t)}function Fo(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}var ne,pe,ke,$e,Ei,Cn,Mn,V,oe,E,Y,D,fe,Ii,Td,S,_,te,de,re,Se,Kt,ht,ye,zt,oa,rt,gt,T,ze,Je,Wo,_e,M,ie,j,it,c,X,Uo,Ai,ji,Dt,Vt,F=U(()=>{W();ne=I([]),pe=I([]),ke=I(null),$e=I(""),Ei=I("time"),Cn=I(new Set),Mn=I(new Set),V=I(""),oe=I(null),E=I(null),Y=I("chat"),D=I(!1),fe=I("idle"),Ii="modelBySession",Td=localStorage.getItem("agent")||"claude";S=I(Td),_=I("sonnet"),te=I(""),de=I("bypassPermissions"),re=I(""),Se=I(""),Kt=I(null),ht=I(localStorage.getItem("sidebarView")||"projects"),ye=I(localStorage.getItem("agentFilter")||"all"),zt=I((()=>{try{let e=JSON.parse(localStorage.getItem("agentFilters")||"[]");return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}})()),oa=I(localStorage.getItem("timeRange")||"14"),rt=I(null),gt=I(!1),T=I({}),ze=I(localStorage.getItem("favoritesOnly")==="1"),Je=I(localStorage.getItem("showHiddenOnly")==="1"),Wo=2,_e=I(localStorage.getItem("chatDensity")||"normal"),M=I(!1),ie=I([]),j=I(null),it=I(!1),c={token:localStorage.getItem("token"),sessionId:null,agent:null,machineId:null,ws:null,shellBubble:null,configDir:null,externalSessionReadOnly:!1,role:null,username:null,lock:{key:null,token:null,holder:null,held:!1,foreign:!1}};X={claude:"Claude",codex:"Codex",grok:"Grok",gemini:"Gemini",cursor:"Cursor"},Uo={claude:[{value:"fable",label:"fable"},{value:"opus",label:"opus"},{value:"sonnet",label:"sonnet"},{value:"haiku",label:"haiku"}],codex:[{value:"gpt-5.4",label:"gpt-5.4"},{value:"gpt-5.3",label:"gpt-5.3"},{value:"gpt-5.2",label:"gpt-5.2"},{value:"o3",label:"o3"},{value:"o4-mini",label:"o4-mini"},{value:"codex-mini-latest",label:"codex-mini"}],grok:[{value:"grok-4.5",label:"grok-4.5"},{value:"grok-4",label:"grok-4"},{value:"grok-3",label:"grok-3"},{value:"grok-3-mini",label:"grok-3-mini"}],gemini:[{value:"gemini-3.7-flash-high",label:"Gemini 3.7 Flash (High)"},{value:"gemini-3.7-flash-medium",label:"Gemini 3.7 Flash (Medium)"},{value:"gemini-3.7-flash-low",label:"Gemini 3.7 Flash (Low)"},{value:"gemini-3.6-flash-high",label:"Gemini 3.6 Flash (High)"},{value:"gemini-3.6-flash-medium",label:"Gemini 3.6 Flash (Medium)"},{value:"gemini-3.6-flash-low",label:"Gemini 3.6 Flash (Low)"},{value:"gemini-3.5-flash-high",label:"Gemini 3.5 Flash (High)"},{value:"gemini-3.5-flash-medium",label:"Gemini 3.5 Flash (Medium)"},{value:"gemini-3.5-flash-low",label:"Gemini 3.5 Flash (Low)"},{value:"gemini-3.1-pro-high",label:"Gemini 3.1 Pro (High)"},{value:"gemini-3.1-pro-low",label:"Gemini 3.1 Pro (Low)"}],cursor:[{value:"auto",label:"Auto"},{value:"gpt-5.3-codex",label:"GPT-5.3 Codex"},{value:"composer-2.5",label:"Composer 2.5"}]},Ai={claude:"sonnet",codex:"gpt-5.4",grok:"grok-4.5",gemini:"gemini-3.7-flash-high",cursor:"auto"};ji="customModelsByAgent";Dt=Oo(()=>{let e=$e.value.toLowerCase().trim(),t=Ei.value,n=ye.value,s=zt.value,a=ze.value,o=Je.value,r=T.value,d=rt.value,u=d?.results?.length&&e?Fo(d.results):Fo(ne.value),l=j.value;return M.value&&l&&(u=u.filter(f=>f&&(!f.machineId||f.machineId===l))),u=u.filter(f=>f&&(s.length?s.includes(f.agent||"claude"):Md(f,n))),o?u=u.filter(f=>f&&r?.[K(f.agent,f.sessionId,f.machineId)]?.hidden):u=u.filter(f=>f&&!r?.[K(f.agent,f.sessionId,f.machineId)]?.hidden),a&&(u=u.filter(f=>f&&r?.[K(f.agent,f.sessionId,f.machineId)]?.favorite)),e&&!(d?.results&&d.q===e)&&(u=u.filter(f=>f&&Ad(f,e))),u=[...u].sort((f,m)=>{let g=r?.[K(f.agent,f.sessionId,f.machineId)]?.favorite?1:0,w=r?.[K(m.agent,m.sessionId,m.machineId)]?.favorite?1:0;return g!==w?w-g:t==="project"&&(f.cwd||"").localeCompare(m.cwd||"")||m.updatedAt-f.updatedAt}),!e&&!a?u.slice(0,120):u}),Vt=Oo(()=>{let e=Fo(Dt.value),t=new Map;for(let n of e){if(!n)continue;let s=n.machineId?`${n.machineId}::${n.cwd||"(no path)"}`:n.cwd||"(no path)";t.has(s)||t.set(s,{cwd:n.cwd||null,machineId:n.machineId||null,projectName:n.projectName||(n.cwd?n.cwd.split("/").filter(Boolean).pop():"(no path)"),updatedAt:0,agents:{},sessions:[],latest:null});let a=t.get(s);a.sessions.push(n),a.agents[n.agent||"claude"]=(a.agents[n.agent||"claude"]||0)+1,(n.updatedAt||0)>a.updatedAt&&(a.updatedAt=n.updatedAt,a.latest=n)}return[...t.values()].sort((n,s)=>s.updatedAt-n.updatedAt)})});function ps(e={}){return e.machineId!==void 0?e.machineId:c.machineId||j.peek()||null}function _d(e){let t=e.split("?")[0];return t==="/api/hub"||t==="/api/machines"||t==="/api/notifications"||t==="/api/notifications/read"||t==="/api/notes"||t.startsWith("/api/notes/")||t==="/api/queue"||t.startsWith("/api/queue/")||t.startsWith("/api/ai/")||t.startsWith("/api/auth/")||t.startsWith("/api/collab/")}async function x(e,t,n,s,a={}){let o=a.hub?null:ps(a),r={"Content-Type":"application/json",...c.token?{Authorization:`Bearer ${c.token}`}:{}};!a.hub&&M.peek()&&o&&!_d(t)&&(r["X-Machine-Id"]=o),e.toUpperCase()!=="GET"&&e.toUpperCase()!=="HEAD"&&c.lock?.token&&c.lock?.key&&!String(t).startsWith("/api/collab/")&&(r["X-Lock-Token"]=c.lock.token,r["X-Lock-Key"]=c.lock.key);let u=a.etag===!0?`${c.token||""}:${o||""}:${t}`:a.etag||null;if(e.toUpperCase()==="GET"&&u){let m=Pi.get(u);m&&(r["If-None-Match"]=m)}let l=async()=>{let m=await fetch(t,{method:e,signal:s,headers:r,cache:a.cache||(e.toUpperCase()==="GET"?"no-store":"default"),...n!==void 0?{body:JSON.stringify(n)}:{}});if(m.status===304)return Dd;let g=await m.json().catch(()=>({}));if(!m.ok)throw new Error(g.error||`HTTP ${m.status}`);if(u){let w=m.headers.get("ETag");w&&Pi.set(u,w)}return g};if(e.toUpperCase()!=="GET"||s||a.dedupe===!1)return l();let f=`${c.token||""}:${o||""}:${t}`;return jd.get(f,l)}function lt(e){return c.ws?.readyState===WebSocket.OPEN?(c.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||ia.push(e),!1)}function la(){for(;ia.length&&c.ws?.readyState===WebSocket.OPEN;)c.ws.send(JSON.stringify(ia.shift()))}function ca(){ia.length=0}function Jo(e={}){let t=new URLSearchParams(e);c.token&&t.set("token",c.token);let n=ps();return M.peek()&&n&&t.set("machine",n),t.toString()}function ct(e={},t={}){let n={...e};c.token&&(n.Authorization=`Bearer ${c.token}`);let s=ps();return!t.hub&&M.peek()&&s&&(n["X-Machine-Id"]=s),n}async function da(){try{let e=await fetch("/api/hub");if(!e.ok)return M.value=!1,!1;let t=await e.json();if(t?.hub)return M.value=!0,t}catch{}return M.value=!1,!1}var jd,Pi,Dd,ia,le=U(()=>{F();W();jd=aa({cache:!1,dedupe:!0,retry:0}),Pi=new Map,Dd=Symbol("not-modified");ia=[]});function Yt(e,t){e&&(t?e.setAttribute("inert",""):e.removeAttribute("inert"))}function jn(e){return!e||e.classList.contains("hidden")?!0:e.style.display==="none"}function Ee(){let e=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,t=document.getElementById("sidebar");if(t){let s=!e||t.classList.contains("open");Yt(t,!s)}Yt(document.getElementById("welcome"),jn(document.getElementById("welcome"))),Yt(document.getElementById("auth-screen"),jn(document.getElementById("auth-screen"))),Yt(document.getElementById("chat-opts"),jn(document.getElementById("chat-opts"))),Yt(document.getElementById("machine-picker"),jn(document.getElementById("machine-picker")));for(let s of["files","git","shell","memory"]){let a=document.getElementById(`tab-${s}`);Yt(a,jn(a))}let n=document.getElementById("tab-chat");n&&Yt(n,jn(n))}function fs(){let e=window.visualViewport,t=document.documentElement;if(!e)return;let n=e.height<window.innerHeight-80;t.classList.toggle("vv-keyboard",n),t.style.setProperty("--vvh",`${Math.round(e.height)}px`),t.style.setProperty("--vv-top",`${Math.round(e.offsetTop)}px`)}function qi(){Ee(),fs();let e=window.visualViewport;e&&(e.addEventListener("resize",fs),e.addEventListener("scroll",fs)),window.addEventListener("resize",()=>{fs(),Ee()}),window.addEventListener("orientationchange",()=>{setTimeout(()=>{fs(),Ee()},250)})}var Dn=U(()=>{});function Xt(){try{let e=localStorage.getItem(Ri);return e?JSON.parse(e):null}catch{return null}}function Qo(e){try{let n={...Xt()||{},...e,updatedAt:Date.now()};localStorage.setItem(Ri,JSON.stringify(n))}catch{}}var Ri,pa=U(()=>{Ri="lastSessionContext"});function Nd(e){let t=String(e??"").trim();if(!t)return"";try{return decodeURIComponent(t)}catch{return t}}function Bi(e){return String(e||"").replace(/\\/g,"/")}function Pd(e){return e.replace(/:[0-9]+(?::[0-9]+)?$/,"")}function fa(e,t){let n=Nd(e);if(!n||/^(https?:|mailto:|tel:|javascript:|#)/i.test(n)||(n=Bi(n).split(/[?#]/)[0],n=n.replace(/^file:\/\//i,""),/^\/[A-Za-z]:\//.test(n)&&(n=n.slice(1)),!n||n==="."||n==="/")||/^\/(api|ws|session)\b/.test(n))return null;let s=n.endsWith("/"),a=Pd(n.replace(/\/+$/,"")),o=Bi(t).replace(/\/+$/,"");if((a.startsWith("/")||/^[A-Za-z]:\//.test(a))&&o){let d=a.toLowerCase(),u=o.toLowerCase();if(d===u)return{relative:"",isDir:!0,root:o};if(d.startsWith(`${u}/`))return{relative:a.slice(o.length+1),isDir:s,root:o};let l=a.split("/"),f=l.pop()||"",m=l.join("/")||(a.startsWith("/")?"/":"");return{relative:f,isDir:s,root:m}}if(a=a.replace(/^\.\//,""),a.startsWith("../")&&o){let d=o.split("/"),u=a.split("/");for(let f of u)f===".."?d.pop():f&&f!=="."&&d.push(f);let l=d.join("/")||"/";return fa(l,t)}return{relative:a,isDir:s,root:o||t}}var Vo=U(()=>{});function qd(){let e=document.getElementById("mermaid-zoom-overlay");if(e)return e;e=document.createElement("div"),e.id="mermaid-zoom-overlay",e.className="mermaid-zoom-overlay hidden",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-label","Mermaid diagram enlarged"),e.innerHTML='<button type="button" class="mermaid-zoom-close" aria-label="\u5173\u95ED\u653E\u5927\u56FE">\xD7</button><div class="mermaid-zoom-canvas"></div>',document.body.appendChild(e);let t=()=>e.classList.add("hidden");return e.addEventListener("click",n=>{(n.target===e||n.target.closest(".mermaid-zoom-close"))&&t()}),Ui||(Ui=!0,document.addEventListener("keydown",n=>{n.key==="Escape"&&t()})),e}function Fi(e){let t=e.querySelector("svg");if(!t)return;let n=qd(),s=n.querySelector(".mermaid-zoom-canvas");s.innerHTML=t.outerHTML;let a=s.querySelector("svg");a?.removeAttribute("width"),a?.removeAttribute("height"),n.classList.remove("hidden")}function Rd(){let e=globalThis.mermaid;return!e||Oi||(e.initialize({startOnLoad:!1,securityLevel:"strict",theme:document.documentElement.dataset.theme==="dark"?"dark":"default",flowchart:{htmlLabels:!1}}),Oi=!0),e}function Bd(e){let t=String(e||"").replace(/\r\n?/g,`
|
|
2
|
-
`).trim();return t=t.replace(/^```(?:mermaid)?\s*/i,"").replace(/\s*```$/,"").trim(),t=t.replace(/^mermaid\s*\n/i,""),t=t.replace(/^graph\s+(TD|TB|BT|RL|LR)\b/i,"flowchart $1"),t}function vt(e){let t=
|
|
3
|
-
`}function
|
|
4
|
-
`+n,t+3);return s===-1?{end:e.length}:{end:s+1+n.length}}if(e[t]==="`"){let n=1;for(;e[t+n]==="`";)n++;let s=t+n;for(;s<e.length;){if(e[s]==="`"){let a=0;for(;e[s+a]==="`";)a++;if(a===n)return{end:s+a};s+=a;continue}s++}return{end:t+n}}return null}function
|
|
1
|
+
var $d=Object.defineProperty;var F=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(t=e(e=0)),t}catch(s){throw n=[s],s}};var ls=(e,t)=>{for(var n in t)$d(e,n,{get:t[n],enumerable:!0})};function Ld(){Ho||(Ho=!0,queueMicrotask(()=>{Ho=!1,Oo()}))}function wi(e){for(let t of e)(t._isComputed?En:In).add(t);Ro>0||na||(Sd==="microtask"?Ld():Oo())}function $i(e,t,n,s){let a=new Set(n);for(let r of n)r._subs.delete(t);n.clear(),s?.forEach(r=>r?.()),s?.splice(0);let o=[Gt,us,No];[Gt,us,No]=[t,n,s];try{return e()}catch(r){for(let d of a)d._subs.add(t),n.add(d);throw r}finally{[Gt,us,No]=o}}var Gt,us,Ro,No,En,In,na,cs,Po,Sd,Ho,Oo,ki,I,Bo,je,xe,De,Tn,Ed,p,b,Si,i,qo,Id,ot,ds,Td,sa,Cd,Of,aa,Bf,Uf,Li,Ei=F(()=>{Gt=null,us=null,Ro=0,No=null,En=new Set,In=new Set,na=!1,cs=1e4,Po={flushes:0,runs:0,lastFlushRuns:0},Sd="sync",Ho=!1;Oo=()=>{if(na)return;na=!0;let e=0;Po.flushes++;try{for(;En.size||In.size;){for(;En.size;){let t=En.values().next().value;if(En.delete(t),++e>cs)throw new Error(`mini-react: reactive update loop exceeded ${cs} runs`);t()}if(In.size){let t=In.values().next().value;if(In.delete(t),++e>cs)throw new Error(`mini-react: reactive update loop exceeded ${cs} runs`);t()}}}finally{Po.runs+=e,Po.lastFlushRuns=e,e>cs&&(En.clear(),In.clear()),na=!1}};ki=class{constructor(e,t){this._v=e,this._subs=new Set,this._eq=t??((n,s)=>n===s)}get value(){return Gt&&(this._subs.add(Gt),us?.add(this)),this._v}set value(e){this._eq(e,this._v)||(this._v=e,wi(this._subs))}peek(){return this._v}},I=(e,{equals:t}={})=>new ki(e,t);Bo=e=>{let t=new ki(void 0),n=new Set,s=!0,a=!1,o=u=>{if(!s||a)return t._v;s=!1;try{let l=$i(e,r,n,null),f=l!==t._v;f&&(t._v=l),f&&u&&wi(t._subs)}catch(l){s=!0,console.error("[computed]",l)}return t._v},r=()=>{s||a||(s=!0,t._subs.size&&o(!0))};r._isComputed=!0;let d=()=>o(!1);return Object.defineProperty(t,"value",{get(){return Gt&&(t._subs.add(Gt),us?.add(t)),d()},set(){throw new TypeError("Cannot assign to a computed signal")}}),t.dispose=()=>{if(!a){a=!0;for(let u of n)u._subs.delete(r);n.clear()}},t},je=e=>{let t=new Set,n=[],s=()=>{try{let a=$i(e,s,t,n);typeof a=="function"&&n.push(a)}catch(a){console.error("[effect]",a)}};return s(),()=>{for(let a of t)a._subs.delete(s);t.clear(),n.forEach(a=>a?.()),n.splice(0)}},xe=e=>{Ro++;try{e()}finally{--Ro===0&&Oo()}},De=(e,t)=>{let n=e.peek(),s=!1;return je(()=>{let a=e.value;s&&t(a,n),s=!0,n=a})},Tn=e=>je(()=>{let t=new AbortController;return Promise.resolve(e(t.signal)).catch(n=>{n?.name!=="AbortError"&&console.error("[asyncEffect]",n)}),()=>t.abort()}),Ed={"&":"&","<":"<",">":">",'"':"""},p=e=>String(e??"").replace(/[&<>"]/g,t=>Ed[t]),b=(()=>{let e=new Map,t=n=>{e.has(n)||(e.set(n,[]),document.addEventListener(n,s=>{xe(()=>{for(let[a,o]of e.get(n)){let r=s.target.closest(a);r&&o(s,r)}})},{capture:!0}))};return{on:(n,s,a)=>{t(n);let o=[s,a];return e.get(n).push(o),()=>e.set(n,e.get(n).filter(r=>r!==o))},off:(n,s)=>{e.has(n)&&e.set(n,e.get(n).filter(([a])=>a!==s))}}})(),Si=(e,{keepAlive:t=!1}={})=>{let n=I(location.hash.slice(1)||"/"),s=!1,a=()=>{n.value=location.hash.slice(1)||"/"};window.addEventListener("hashchange",a);let o=t?new Map:null,r=(l,f)=>{if(!t)return f();if(o.has(l))return o.get(l);let m=f();return o.set(l,m),m},d=I(void 0),u=je(()=>{let l=n.value;for(let[f,m]of Object.entries(e)){if(f==="*")continue;let g=new RegExp("^"+f.replace(/:\w+/g,"([^/]+)")+"$"),w=l.match(g);if(w){let y=w.slice(1);d.value=typeof m=="function"?r(`${f}|${y.join("/")}`,()=>m(...y)):m;return}}if(e["*"]){let f=e["*"];d.value=typeof f=="function"?r("*",f):f;return}d.value=null});return{current:n,route:d,navigate:l=>{s||(location.hash=l)},match:l=>{let f=n.value.match(new RegExp("^"+l.replace(/:\w+/g,"([^/]+)")+"$"));return f?f.slice(1):null},invalidate:l=>{if(o){if(l===void 0){o.clear();return}for(let f of[...o.keys()])(f===l||f.startsWith(`${l}|`))&&o.delete(f)}},dispose:()=>{s||(s=!0,window.removeEventListener("hashchange",a),u(),o?.clear())}}},i=e=>document.getElementById(e),qo=()=>typeof navigator>"u"||navigator.onLine!==!1,Id=e=>new Promise(t=>setTimeout(t,e)),ot=e=>e===void 0?"undefined":e===null||typeof e!="object"?JSON.stringify(e):e instanceof Date?`Date(${e.toJSON()})`:Array.isArray(e)?`[${e.map(ot).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${ot(e[t])}`).join(",")}}`,ds=(e,t)=>{if(!t)return!0;if(typeof t=="function")return t(e);if(t.queryKey){let n=ot(t.queryKey);if(t.exact?e.hash!==n:!e.hash.startsWith(n.slice(0,-1)))return!1}return!t.tags||t.tags.some(n=>e.tags.has(n))},Td=e=>{try{return JSON.stringify(e),!0}catch{return!1}},sa=(e,t)=>{if(Object.is(e,t))return e;if(!e||!t||typeof e!="object"||typeof t!="object")return t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return t;let a=t.map((o,r)=>sa(e[r],o));return a.every((o,r)=>o===e[r])?e:a}if(Array.isArray(e)||Array.isArray(t)||Object.getPrototypeOf(e)!==Object.prototype||Object.getPrototypeOf(t)!==Object.prototype)return t;let n=Object.keys(t);if(n.length!==Object.keys(e).length)return t;let s={};for(let a of n){if(!(a in e))return t;s[a]=sa(e[a],t[a])}return n.every(a=>s[a]===e[a])?e:s},Cd=({staleTime:e=3e4,gcTime:t=3e5,retry:n=2,retryDelay:s=1e3,refetchOnWindowFocus:a=!1,refetchOnReconnect:o=!0}={})=>{let r=new Map,d=new Set,u=new Map,l=null,f=!1,m=h=>{for(let v of d)v(h)},g=h=>h.state,w=h=>!h.invalidated&&Date.now()-h.state.updatedAt.peek()<h.options.staleTime,y=h=>{h.invalidated=!0,h.state.isStale.value=!0},H=h=>{h.gcTimer&&clearTimeout(h.gcTimer),h.gcTimer=null},me=h=>{H(h),!h.observers&&Number.isFinite(h.options.gcTime)&&(h.gcTimer=setTimeout(()=>{!h.observers&&!h.promise&&(r.delete(h.hash),m({type:"gc",key:h.key}))},h.options.gcTime))},J=h=>{h.pollTimer&&clearTimeout(h.pollTimer),h.pollTimer=null},ue=h=>{J(h);let v=typeof h.options.refetchInterval=="function"?h.options.refetchInterval(h):h.options.refetchInterval;h.observers&&Number.isFinite(v)&&v>0&&(h.pollTimer=setTimeout(async()=>{qo()&&await he(h,{force:!0}).catch(()=>{}),ue(h)},v))},q=(h,v=ot(h.queryKey))=>{let k={staleTime:e,gcTime:t,retry:n,retryDelay:s,...h},S={hash:v,key:h.queryKey,queryFn:h.queryFn,options:k,tags:new Set(h.tags??[]),observers:0,invalidated:!0,promise:null,ctrl:null,version:0,gcTimer:null,pollTimer:null,state:{data:I(h.initialData),error:I(null),status:I(h.initialData===void 0?"idle":"success"),fetchStatus:I("idle"),updatedAt:I(h.initialData===void 0?0:Date.now()),isStale:I(!0)}};return r.set(v,S),S},Q=h=>{if(!h?.queryKey)throw new TypeError("query: queryKey is required");let v=ot(h.queryKey),k=r.get(v)??q(h,v);h.queryFn&&(k.queryFn=h.queryFn),k.options={...k.options,...h};for(let S of h.tags??[])k.tags.add(S);return k},he=(h,{force:v=!1}={})=>{if(!h.queryFn)return Promise.reject(new TypeError(`query ${h.hash} has no queryFn`));if(!v&&w(h))return Promise.resolve(h.state.data.peek());if(h.promise)return h.promise;if(!qo())return h.state.fetchStatus.value="paused",Promise.reject(new Error("Query paused while offline"));H(h);let k=++h.version,S=new AbortController;h.ctrl=S,xe(()=>{h.state.data.peek()===void 0&&(h.state.status.value="pending"),h.state.fetchStatus.value="fetching",h.state.error.value=null}),m({type:"fetch",key:h.key});let B=async(A,V)=>{try{return await h.queryFn({queryKey:h.key,signal:S.signal,meta:h.options.meta})}catch(R){if(S.signal.aborted||R?.name==="AbortError"||A<=0||h.options.retry===!1)throw R;return await Id(typeof V=="function"?V(A,R):V),B(A-1,typeof V=="number"?V*2:V)}},U=B(h.options.retry??n,h.options.retryDelay??s).then(A=>(h.version===k&&!S.signal.aborted&&xe(()=>{h.state.data.value=h.options.structuralSharing===!1?A:sa(h.state.data.peek(),A),h.state.status.value="success",h.state.fetchStatus.value="idle",h.state.updatedAt.value=Date.now(),h.state.isStale.value=!1,h.invalidated=!1}),m({type:"success",key:h.key}),A)).catch(A=>{throw h.version===k&&!S.signal.aborted&&xe(()=>{h.state.error.value=A,h.state.status.value=h.state.data.peek()===void 0?"error":"success",h.state.fetchStatus.value="idle"}),S.signal.aborted||m({type:"error",key:h.key,error:A}),A}).finally(()=>{h.promise===U&&(h.promise=null,h.ctrl=null,me(h))});return h.promise=U,U},Ae=h=>Promise.all([...r.values()].filter(v=>ds(v,h)&&v.observers).map(v=>he(v,{force:!0}).catch(()=>{}))),L={query(h){let v=Q(h);v.observers++,H(v),ue(v),h.enabled!==!1&&(!w(v)||h.refetchOnMount)&&he(v).catch(()=>{});let k=()=>{v.observers=Math.max(0,v.observers-1),me(v),ue(v)};return[g(v),{refetch:()=>he(v,{force:!0}),invalidate:()=>L.invalidateQueries({queryKey:v.key,exact:!0}),setData:S=>L.setQueryData(v.key,S),cancel:()=>L.cancelQueries({queryKey:v.key,exact:!0}),dispose:k}]},prefetchQuery(h){let v=Q(h);return he(v)},fetchQuery(h){let v=Q(h);return he(v)},getQueryData(h){return r.get(ot(h))?.state.data.peek()},getQueryState(h){let v=r.get(ot(h));return v&&g(v)},setQueryData(h,v,{tags:k}={}){let S=r.get(ot(h))??Q({queryKey:h,tags:k}),B=typeof v=="function"?v(S.state.data.peek()):v,U=S.options.structuralSharing===!1?B:sa(S.state.data.peek(),B);xe(()=>{S.state.data.value=U,S.state.status.value="success",S.state.error.value=null,S.state.updatedAt.value=Date.now(),S.state.isStale.value=!1}),S.invalidated=!1;for(let A of k??[])S.tags.add(A);return m({type:"set",key:S.key}),l&&l.postMessage({type:"invalidate",hash:S.hash}),U},invalidateQueries(h){for(let v of r.values())ds(v,h)&&y(v);return m({type:"invalidate",filter:h}),l&&l.postMessage({type:"invalidate",filter:h}),Ae(h)},cancelQueries(h){for(let v of r.values())ds(v,h)&&v.ctrl?.abort()},removeQueries(h){for(let v of[...r.values()])ds(v,h)&&(v.ctrl?.abort(),H(v),J(v),r.delete(v.hash))},mutate({mutationFn:h,variables:v,optimistic:k,invalidate:S,onMutate:B,onSuccess:U,onError:A,networkMode:V="online"}={}){if(typeof h!="function")return Promise.reject(new TypeError("mutate: mutationFn is required"));let R=[],ve=j=>(Array.isArray(j)?j:[j]).filter(Boolean).forEach(ce=>{let Wt=L.getQueryData(ce.queryKey);R.push([ce.queryKey,Wt]),L.setQueryData(ce.queryKey,Ln=>ce.updater(Ln))}),Ke=async()=>{let j=await B?.(v,{client:L});k&&ve(typeof k=="function"?k(v):k);try{let ce=await h(v);return await U?.(ce,v,j),S&&await L.invalidateQueries(S),m({type:"mutation-success"}),ce}catch(ce){for(let[Wt,Ln]of R)L.setQueryData(Wt,Ln);throw await A?.(ce,v,j),m({type:"mutation-error",error:ce}),ce}};return!qo()&&V==="offlineFirst"?(ge.push(Ke),m({type:"mutation-queued"}),Promise.resolve({queued:!0})):Ke()},infiniteQuery({queryKey:h,queryFn:v,initialPageParam:k=0,getNextPageParam:S,...B}){let[U,A]=L.query({queryKey:h,...B,queryFn:async V=>({pages:[await v({...V,pageParam:k})],pageParams:[k]})});return[U,{...A,fetchNextPage:async()=>{let V=U.data.peek()??{pages:[],pageParams:[]},R=S?.(V.pages.at(-1),V.pages);if(R==null)return;let ve=await v({queryKey:h,pageParam:R,signal:new AbortController().signal});return L.setQueryData(h,{pages:[...V.pages,ve],pageParams:[...V.pageParams,R]}),ve}}]},dehydrate({shouldDehydrate:h=k=>k.state.status.peek()==="success",version:v=1}={}){return{version:v,timestamp:Date.now(),queries:[...r.values()].filter(h).filter(k=>Td(k.state.data.peek())).map(k=>({key:k.key,data:k.state.data.peek(),updatedAt:k.state.updatedAt.peek(),staleTime:k.options.staleTime,tags:[...k.tags]}))}},hydrate(h,{version:v=1}={}){if(!h||h.version!==v||!Array.isArray(h.queries))return!1;for(let k of h.queries){let S=r.get(ot(k.key))??Q({queryKey:k.key,staleTime:k.staleTime,tags:k.tags});xe(()=>{S.state.data.value=k.data,S.state.status.value="success",S.state.updatedAt.value=k.updatedAt,S.state.isStale.value=Date.now()-k.updatedAt>=S.options.staleTime}),S.invalidated=S.state.isStale.peek()}return m({type:"hydrate"}),!0},persist({storage:h=typeof localStorage>"u"?null:localStorage,key:v="mini-react-query",version:k=1}={}){if(!h)throw new Error("persist: a storage adapter is required");let S=!1,B=async()=>{let A=JSON.stringify(L.dehydrate({version:k}));return h.set?h.set(v,A):h.setItem(v,A)},U=L.subscribe(()=>{S||(S=!0,queueMicrotask(()=>{S=!1,B().catch(()=>{})}))});return{restore:async()=>{let A=await(h.get?h.get(v):h.getItem(v));return A?L.hydrate(JSON.parse(A),{version:k}):!1},save:B,dispose:U}},sync(h="mini-react-query"){return typeof BroadcastChannel>"u"?()=>{}:(l?.close(),l=new BroadcastChannel(h),l.onmessage=v=>{if(v.data?.type!=="invalidate")return;let k=v.data.hash?S=>S.hash===v.data.hash:v.data.filter;for(let S of r.values())ds(S,k)&&y(S);Ae(k)},()=>{l?.close(),l=null})},subscribe(h){return d.add(h),()=>d.delete(h)},getDebugSnapshot(){return[...r.values()].map(h=>({key:h.key,observers:h.observers,status:h.state.status.peek(),fetchStatus:h.state.fetchStatus.peek(),updatedAt:h.state.updatedAt.peek(),stale:h.state.isStale.peek(),tags:[...h.tags]}))},async fetchJSON(h,v={},{queryKey:k=["GET",h,v.body??null],...S}={}){let B=ot(k);return L.fetchQuery({queryKey:k,...S,queryFn:async({signal:U})=>{let A=new Headers(v.headers),V=u.get(B);V?.etag&&A.set("If-None-Match",V.etag);let R=await fetch(h,{...v,headers:A,signal:U});if(R.status===304&&V)return L.getQueryData(k);if(!R.ok)throw new Error(`HTTP ${R.status}`);let ve=R.headers.get("cache-control")?.match(/max-age=(\d+)/)?.[1];if(ve){let Ke=r.get(B);Ke&&(Ke.options.staleTime=Number(ve)*1e3)}return u.set(B,{etag:R.headers.get("etag")}),R.json()}})},destroy(){f=!0;for(let h of r.values())h.ctrl?.abort(),H(h),J(h);l?.close(),d.clear()}},ge=[],be=()=>{a&&Ae()},ae=()=>{for(o&&Ae();ge.length;)ge.shift()().catch(()=>{})};typeof window<"u"&&(window.addEventListener("focus",be),window.addEventListener("online",ae));let Ft=L.destroy;return L.destroy=()=>{f||(typeof window<"u"&&(window.removeEventListener("focus",be),window.removeEventListener("online",ae)),Ft())},L},Of=Cd(),aa=({cache:e=!0,ttl:t=3e4,retry:n=2,retryDelay:s=1e3,store:a=null,dedupe:o=!0}={})=>{let r=new Map,d=new Map,u=new Map,l=(m,g)=>{if(a)return a.get(m);let w=r.get(m);return w&&Date.now()-w.ts<g?w.data:void 0},f=async(m,g,w)=>{if(a)return a.set(m,g,{ttl:w});r.set(m,{data:g,ts:Date.now()})};return{get:(m,g,w={})=>{let y=w.ttl??t,H=e&&w.cache!==!1&&y!==0,me=w.dedupe??o;if(me&&d.has(m))return d.get(m);let J=()=>{let q=u.get(m)??0,Q=(he,Ae)=>Promise.resolve(g()).then(async L=>(H&&(u.get(m)??0)===q&&await f(m,L,y),L)).catch(L=>{if(he>0&&L?.name!=="AbortError")return new Promise(ge=>setTimeout(ge,Ae)).then(()=>Q(he-1,Ae*2));throw L});return Q(w.retry??n,s)},ue=q=>(me&&(d.set(m,q),q.finally(()=>{d.get(m)===q&&d.delete(m)}).catch(()=>{})),q);if(!H)return ue(J());if(!a){let q=l(m,y);return q!==void 0?Promise.resolve(q):ue(J())}return ue(Promise.resolve(l(m,y)).then(q=>q!==void 0?q:J()))},invalidate:m=>{if(m!==void 0)u.set(m,(u.get(m)??0)+1);else{for(let g of r.keys())u.set(g,(u.get(g)??0)+1);for(let g of d.keys())u.set(g,(u.get(g)??0)+1)}if(a)return m===void 0?a.clear():a.delete(m);m===void 0?r.clear():r.delete(m)}}},Bf=new TextEncoder,Uf=new TextDecoder,Li=(e,t="kv")=>{let n=null,s=()=>n?Promise.resolve(n):new Promise((o,r)=>{let d=indexedDB.open(e,1);d.onupgradeneeded=u=>u.target.result.createObjectStore(t),d.onsuccess=u=>{n=u.target.result,o(n)},d.onerror=u=>r(u.target.error)}),a=async(o,r)=>{let d=await s();return new Promise((u,l)=>{let f=d.transaction(t,o),m=r(f.objectStore(t));m.onsuccess=()=>u(m.result),m.onerror=()=>l(m.error)})};return{async get(o){let r=await a("readonly",d=>d.get(o));if(r){if(r.expires&&Date.now()>r.expires){this.delete(o);return}return r.val}},async set(o,r,{ttl:d}={}){await a("readwrite",u=>u.put({val:r,expires:d?Date.now()+d:null},o))},delete:o=>a("readwrite",r=>r.delete(o)),clear:()=>a("readwrite",o=>o.clear()),keys:()=>a("readonly",o=>o.getAllKeys())}}});var G=F(()=>{Ei()});var Ni={};ls(Ni,{AGENT_DEFAULT_MODEL:()=>ji,AGENT_LABELS:()=>Z,AGENT_MODELS:()=>Uo,LOW_TURN_THRESHOLD:()=>Wo,activityHits:()=>rt,activityLoading:()=>gt,addCustomModel:()=>Jt,agentFilter:()=>ye,agentFilters:()=>zt,agentsMeta:()=>Kt,chatDensity:()=>_e,collapsedFolders:()=>Mn,ctx:()=>c,currentAgent:()=>$,currentEffort:()=>te,currentModel:()=>_,currentPermission:()=>de,currentProject:()=>E,currentTab:()=>X,expandedFolders:()=>Cn,favoritesOnly:()=>ze,filesPath:()=>Y,filesRoot:()=>re,filteredSessions:()=>Dt,getCustomModels:()=>ra,getDefaultEffort:()=>Qe,getDefaultModel:()=>Be,getEffortsForModel:()=>Qt,getModelsForAgent:()=>Oe,getSavedModel:()=>Ai,getSessionMeta:()=>An,gitRoot:()=>Se,hubMachineReady:()=>it,hubMode:()=>M,isProcessing:()=>N,machinesList:()=>ie,metaKey:()=>z,projectGroups:()=>Vt,removeCustomModel:()=>zo,selectedMachineId:()=>D,sessionDisplayTitle:()=>bt,sessionFilter:()=>ke,sessionMetaMap:()=>T,sessionSearch:()=>$e,sessionSort:()=>Ii,sessionsData:()=>ne,setAgent:()=>Ne,setChatDensity:()=>Go,setCurrentModel:()=>se,setSelectedMachine:()=>Le,showHiddenOnly:()=>Je,sidebarView:()=>ht,timeRange:()=>oa,viewingFile:()=>oe,workspacesData:()=>pe,wsStatus:()=>fe});function Ci(){try{let e=JSON.parse(localStorage.getItem(Ti)||"{}");return e&&typeof e=="object"?e:{}}catch{return{}}}function Mi(e,t=c.sessionId,n=c.machineId){if(!t)return"";let s=(e||"claude").toLowerCase();return`${n||""}:${s}:${t}`}function Ai(e,t=c.sessionId,n=c.machineId){let s=Mi(e,t,n);if(!s)return null;let a=Ci()[s];return typeof a=="string"&&a.trim()?a:null}function se(e,t=$.peek(),n=c.sessionId,s=c.machineId){let a=String(e||"").trim();if(!a)return;let o=Mi(t,n,s);if(o){let r=Ci();r[o]=a,localStorage.setItem(Ti,JSON.stringify(r))}_.value=a}function Le(e){let t=e||null;D.value=t,c.machineId=t,t?localStorage.setItem("machineId",t):localStorage.removeItem("machineId")}function z(e,t,n){let s=`${e||"claude"}:${t}`;return n||c?.machineId?`${n||c.machineId}:${s}`:s}function An(e,t,n){return T.peek()?.[z(e,t,n)]||{favorite:!1,notes:"",title:"",hidden:!1,branch:null}}function bt(e,{preferSnippet:t=!1}={}){if(!e)return"Session";if(t&&e.snippet)return e.snippet;let s=(An(e.agent,e.sessionId,e.machineId).title||"").trim();return s||e.display||e.sessionId?.slice(0,8)||"Session"}function Go(e){let t=["clean","normal","full"].includes(e)?e:"normal";_e.value=t,localStorage.setItem("chatDensity",t),document.getElementById("messages")?.setAttribute("data-density",t)}function Ad(e){return e?typeof e=="string"?{value:e,label:e}:e.value?{value:String(e.value),label:e.label||e.value,...Array.isArray(e.efforts)&&e.efforts.length?{efforts:e.efforts.map(String)}:{},...e.defaultEffort?{defaultEffort:String(e.defaultEffort)}:{}}:null:null}function Ko(){try{let e=localStorage.getItem(Di);if(!e)return{};let t=JSON.parse(e);return t&&typeof t=="object"?t:{}}catch{return{}}}function _i(e){localStorage.setItem(Di,JSON.stringify(e))}function ra(e){let t=(e||"claude").toLowerCase(),n=Ko()[t];return Array.isArray(n)?n.filter(Boolean).map(String):[]}function Jt(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim();if(!s)return!1;let a=Ko(),o=Array.isArray(a[n])?[...a[n]]:[];return o.includes(s)||o.push(s),a[n]=o,_i(a),!0}function zo(e,t){let n=(e||"claude").toLowerCase(),s=String(t||"").trim(),a=Ko(),o=Array.isArray(a[n])?a[n].filter(r=>r!==s):[];return a[n]=o,_i(a),!0}function Oe(e){let t=(e||"claude").toLowerCase(),n=Kt.peek()?.defaults?.[t],s=n?.models?.length?n.models.map(Ad).filter(Boolean):(Uo[t]||Uo.claude).map(r=>({...r})),a=ra(t),o=new Set(s.map(r=>r.value));for(let r of a){if(o.has(r)){s=s.map(d=>{if(d.value!==r)return d;let u=String(d.label||d.value);return{...d,custom:!0,label:u.includes("\u2605")?u:`${u} \u2605`}});continue}o.add(r),s.push({value:r,label:`${r} \u2605`,custom:!0})}return s}function Be(e){let t=(e||"claude").toLowerCase(),n=Kt.peek()?.defaults?.[t];return n?.model?String(n.model):ji[t]||Oe(t)[0]?.value||"sonnet"}function Qt(e,t){let s=Oe(e).find(o=>o.value===t);if(s?.efforts?.length)return s.efforts;let a=Kt.peek()?.defaults?.[(e||"claude").toLowerCase()];return a?.efforts?.length?a.efforts.map(String):["low","medium","high","xhigh","max"]}function Qe(e,t){let n=(e||"claude").toLowerCase(),s=Kt.peek()?.defaults?.[n];if(s?.effortDefault)return String(s.effortDefault);let o=Oe(n).find(r=>r.value===t);return o?.defaultEffort?String(o.defaultEffort):n==="grok"?"low":n==="gemini"&&String(t||"").match(/-(low|medium|high)$/i)?.[1]?.toLowerCase()||""}function Ne(e){let t=(e||"claude").toLowerCase();$.value=t,localStorage.setItem("agent",t),de.value="bypassPermissions";let n=typeof document>"u"?null:document.getElementById("sel-permission");n&&(n.value=de.peek());let s=Ai(t);s?_.value=s:se(Be(t),t);let a=Qe(t,_.peek());a?te.value=a:t!=="grok"&&t!=="gemini"&&(te.value="")}function jd(e,t){return!t||t==="all"?!0:(e.agent||"claude")===t}function Dd(e,t){if(!t)return!0;let n=T.value?.[z(e.agent,e.sessionId,e.machineId)];return[e.display,e.cwd,e.projectName,e.agent,e.sessionId,e.snippet,e.machineId,n?.notes,n?.title].filter(Boolean).join(" ").toLowerCase().includes(t)}function Fo(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}var ne,pe,ke,$e,Ii,Cn,Mn,Y,oe,E,X,N,fe,Ti,Md,$,_,te,de,re,Se,Kt,ht,ye,zt,oa,rt,gt,T,ze,Je,Wo,_e,M,ie,D,it,c,Z,Uo,ji,Di,Dt,Vt,W=F(()=>{G();ne=I([]),pe=I([]),ke=I(null),$e=I(""),Ii=I("time"),Cn=I(new Set),Mn=I(new Set),Y=I(""),oe=I(null),E=I(null),X=I("chat"),N=I(!1),fe=I("idle"),Ti="modelBySession",Md=localStorage.getItem("agent")||"claude";$=I(Md),_=I("sonnet"),te=I(""),de=I("bypassPermissions"),re=I(""),Se=I(""),Kt=I(null),ht=I(localStorage.getItem("sidebarView")||"projects"),ye=I(localStorage.getItem("agentFilter")||"all"),zt=I((()=>{try{let e=JSON.parse(localStorage.getItem("agentFilters")||"[]");return Array.isArray(e)?e.filter(Boolean):[]}catch{return[]}})()),oa=I(localStorage.getItem("timeRange")||"14"),rt=I(null),gt=I(!1),T=I({}),ze=I(localStorage.getItem("favoritesOnly")==="1"),Je=I(localStorage.getItem("showHiddenOnly")==="1"),Wo=2,_e=I(localStorage.getItem("chatDensity")||"normal"),M=I(!1),ie=I([]),D=I(null),it=I(!1),c={token:localStorage.getItem("token"),sessionId:null,agent:null,machineId:null,ws:null,shellBubble:null,configDir:null,externalSessionReadOnly:!1,role:null,username:null,lock:{key:null,token:null,holder:null,held:!1,foreign:!1}};Z={claude:"Claude",codex:"Codex",grok:"Grok",gemini:"Gemini",cursor:"Cursor"},Uo={claude:[{value:"fable",label:"fable"},{value:"opus",label:"opus"},{value:"sonnet",label:"sonnet"},{value:"haiku",label:"haiku"}],codex:[{value:"gpt-5.4",label:"gpt-5.4"},{value:"gpt-5.3",label:"gpt-5.3"},{value:"gpt-5.2",label:"gpt-5.2"},{value:"o3",label:"o3"},{value:"o4-mini",label:"o4-mini"},{value:"codex-mini-latest",label:"codex-mini"}],grok:[{value:"grok-4.5",label:"grok-4.5"},{value:"grok-4",label:"grok-4"},{value:"grok-3",label:"grok-3"},{value:"grok-3-mini",label:"grok-3-mini"}],gemini:[{value:"gemini-3.7-flash-high",label:"Gemini 3.7 Flash (High)"},{value:"gemini-3.7-flash-medium",label:"Gemini 3.7 Flash (Medium)"},{value:"gemini-3.7-flash-low",label:"Gemini 3.7 Flash (Low)"},{value:"gemini-3.6-flash-high",label:"Gemini 3.6 Flash (High)"},{value:"gemini-3.6-flash-medium",label:"Gemini 3.6 Flash (Medium)"},{value:"gemini-3.6-flash-low",label:"Gemini 3.6 Flash (Low)"},{value:"gemini-3.5-flash-high",label:"Gemini 3.5 Flash (High)"},{value:"gemini-3.5-flash-medium",label:"Gemini 3.5 Flash (Medium)"},{value:"gemini-3.5-flash-low",label:"Gemini 3.5 Flash (Low)"},{value:"gemini-3.1-pro-high",label:"Gemini 3.1 Pro (High)"},{value:"gemini-3.1-pro-low",label:"Gemini 3.1 Pro (Low)"}],cursor:[{value:"auto",label:"Auto"},{value:"gpt-5.3-codex",label:"GPT-5.3 Codex"},{value:"composer-2.5",label:"Composer 2.5"}]},ji={claude:"sonnet",codex:"gpt-5.4",grok:"grok-4.5",gemini:"gemini-3.7-flash-high",cursor:"auto"};Di="customModelsByAgent";Dt=Bo(()=>{let e=$e.value.toLowerCase().trim(),t=Ii.value,n=ye.value,s=zt.value,a=ze.value,o=Je.value,r=T.value,d=rt.value,u=d?.results?.length&&e?Fo(d.results):Fo(ne.value),l=D.value;return M.value&&l&&(u=u.filter(f=>f&&(!f.machineId||f.machineId===l))),u=u.filter(f=>f&&(s.length?s.includes(f.agent||"claude"):jd(f,n))),o?u=u.filter(f=>f&&r?.[z(f.agent,f.sessionId,f.machineId)]?.hidden):u=u.filter(f=>f&&!r?.[z(f.agent,f.sessionId,f.machineId)]?.hidden),a&&(u=u.filter(f=>f&&r?.[z(f.agent,f.sessionId,f.machineId)]?.favorite)),e&&!(d?.results&&d.q===e)&&(u=u.filter(f=>f&&Dd(f,e))),u=[...u].sort((f,m)=>{let g=r?.[z(f.agent,f.sessionId,f.machineId)]?.favorite?1:0,w=r?.[z(m.agent,m.sessionId,m.machineId)]?.favorite?1:0;return g!==w?w-g:t==="project"&&(f.cwd||"").localeCompare(m.cwd||"")||m.updatedAt-f.updatedAt}),!e&&!a?u.slice(0,120):u}),Vt=Bo(()=>{let e=Fo(Dt.value),t=new Map;for(let n of e){if(!n)continue;let s=n.machineId?`${n.machineId}::${n.cwd||"(no path)"}`:n.cwd||"(no path)";t.has(s)||t.set(s,{cwd:n.cwd||null,machineId:n.machineId||null,projectName:n.projectName||(n.cwd?n.cwd.split("/").filter(Boolean).pop():"(no path)"),updatedAt:0,agents:{},sessions:[],latest:null});let a=t.get(s);a.sessions.push(n),a.agents[n.agent||"claude"]=(a.agents[n.agent||"claude"]||0)+1,(n.updatedAt||0)>a.updatedAt&&(a.updatedAt=n.updatedAt,a.latest=n)}return[...t.values()].sort((n,s)=>s.updatedAt-n.updatedAt)})});function ps(e={}){return e.machineId!==void 0?e.machineId:c.machineId||D.peek()||null}function Pd(e){let t=e.split("?")[0];return t==="/api/hub"||t==="/api/machines"||t==="/api/notifications"||t==="/api/notifications/read"||t==="/api/notes"||t.startsWith("/api/notes/")||t==="/api/queue"||t.startsWith("/api/queue/")||t.startsWith("/api/ai/")||t.startsWith("/api/auth/")||t.startsWith("/api/collab/")}async function x(e,t,n,s,a={}){let o=a.hub?null:ps(a),r={"Content-Type":"application/json",...c.token?{Authorization:`Bearer ${c.token}`}:{}};!a.hub&&M.peek()&&o&&!Pd(t)&&(r["X-Machine-Id"]=o),e.toUpperCase()!=="GET"&&e.toUpperCase()!=="HEAD"&&c.lock?.token&&c.lock?.key&&!String(t).startsWith("/api/collab/")&&(r["X-Lock-Token"]=c.lock.token,r["X-Lock-Key"]=c.lock.key);let u=a.etag===!0?`${c.token||""}:${o||""}:${t}`:a.etag||null;if(e.toUpperCase()==="GET"&&u){let m=Hi.get(u);m&&(r["If-None-Match"]=m)}let l=async()=>{let m=await fetch(t,{method:e,signal:s,headers:r,cache:a.cache||(e.toUpperCase()==="GET"?"no-store":"default"),...n!==void 0?{body:JSON.stringify(n)}:{}});if(m.status===304)return Nd;let g=await m.json().catch(()=>({}));if(!m.ok)throw new Error(g.error||`HTTP ${m.status}`);if(u){let w=m.headers.get("ETag");w&&Hi.set(u,w)}return g};if(e.toUpperCase()!=="GET"||s||a.dedupe===!1)return l();let f=`${c.token||""}:${o||""}:${t}`;return _d.get(f,l)}function lt(e){return c.ws?.readyState===WebSocket.OPEN?(c.ws.send(JSON.stringify(e)),!0):(e?.type==="ping"||e?.type==="pong"||e?.type==="subscribe"||ia.push(e),!1)}function la(){for(;ia.length&&c.ws?.readyState===WebSocket.OPEN;)c.ws.send(JSON.stringify(ia.shift()))}function ca(){ia.length=0}function Jo(e={}){let t=new URLSearchParams(e);c.token&&t.set("token",c.token);let n=ps();return M.peek()&&n&&t.set("machine",n),t.toString()}function ct(e={},t={}){let n={...e};c.token&&(n.Authorization=`Bearer ${c.token}`);let s=ps();return!t.hub&&M.peek()&&s&&(n["X-Machine-Id"]=s),n}async function da(){try{let e=await fetch("/api/hub");if(!e.ok)return M.value=!1,!1;let t=await e.json();if(t?.hub)return M.value=!0,t}catch{}return M.value=!1,!1}var _d,Hi,Nd,ia,le=F(()=>{W();G();_d=aa({cache:!1,dedupe:!0,retry:0}),Hi=new Map,Nd=Symbol("not-modified");ia=[]});function Yt(e,t){e&&(t?e.setAttribute("inert",""):e.removeAttribute("inert"))}function jn(e){return!e||e.classList.contains("hidden")?!0:e.style.display==="none"}function Ee(){let e=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,t=document.getElementById("sidebar");if(t){let s=!e||t.classList.contains("open");Yt(t,!s)}Yt(document.getElementById("welcome"),jn(document.getElementById("welcome"))),Yt(document.getElementById("auth-screen"),jn(document.getElementById("auth-screen"))),Yt(document.getElementById("chat-opts"),jn(document.getElementById("chat-opts"))),Yt(document.getElementById("machine-picker"),jn(document.getElementById("machine-picker")));for(let s of["files","git","shell","memory"]){let a=document.getElementById(`tab-${s}`);Yt(a,jn(a))}let n=document.getElementById("tab-chat");n&&Yt(n,jn(n))}function fs(){let e=window.visualViewport,t=document.documentElement;if(!e)return;let n=e.height<window.innerHeight-80;t.classList.toggle("vv-keyboard",n),t.style.setProperty("--vvh",`${Math.round(e.height)}px`),t.style.setProperty("--vv-top",`${Math.round(e.offsetTop)}px`)}function Ri(){Ee(),fs();let e=window.visualViewport;e&&(e.addEventListener("resize",fs),e.addEventListener("scroll",fs)),window.addEventListener("resize",()=>{fs(),Ee()}),window.addEventListener("orientationchange",()=>{setTimeout(()=>{fs(),Ee()},250)})}var Dn=F(()=>{});function Xt(){try{let e=localStorage.getItem(Oi);return e?JSON.parse(e):null}catch{return null}}function Qo(e){try{let n={...Xt()||{},...e,updatedAt:Date.now()};localStorage.setItem(Oi,JSON.stringify(n))}catch{}}var Oi,pa=F(()=>{Oi="lastSessionContext"});function Hd(e){let t=String(e??"").trim();if(!t)return"";try{return decodeURIComponent(t)}catch{return t}}function Bi(e){return String(e||"").replace(/\\/g,"/")}function qd(e){return e.replace(/:[0-9]+(?::[0-9]+)?$/,"")}function fa(e,t){let n=Hd(e);if(!n||/^(https?:|mailto:|tel:|javascript:|#)/i.test(n)||(n=Bi(n).split(/[?#]/)[0],n=n.replace(/^file:\/\//i,""),/^\/[A-Za-z]:\//.test(n)&&(n=n.slice(1)),!n||n==="."||n==="/")||/^\/(api|ws|session)\b/.test(n))return null;let s=n.endsWith("/"),a=qd(n.replace(/\/+$/,"")),o=Bi(t).replace(/\/+$/,"");if((a.startsWith("/")||/^[A-Za-z]:\//.test(a))&&o){let d=a.toLowerCase(),u=o.toLowerCase();if(d===u)return{relative:"",isDir:!0,root:o};if(d.startsWith(`${u}/`))return{relative:a.slice(o.length+1),isDir:s,root:o};let l=a.split("/"),f=l.pop()||"",m=l.join("/")||(a.startsWith("/")?"/":"");return{relative:f,isDir:s,root:m}}if(a=a.replace(/^\.\//,""),a.startsWith("../")&&o){let d=o.split("/"),u=a.split("/");for(let f of u)f===".."?d.pop():f&&f!=="."&&d.push(f);let l=d.join("/")||"/";return fa(l,t)}return{relative:a,isDir:s,root:o||t}}var Vo=F(()=>{});function Od(){let e=document.getElementById("mermaid-zoom-overlay");if(e)return e;e=document.createElement("div"),e.id="mermaid-zoom-overlay",e.className="mermaid-zoom-overlay hidden",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-label","Mermaid diagram enlarged"),e.innerHTML='<button type="button" class="mermaid-zoom-close" aria-label="\u5173\u95ED\u653E\u5927\u56FE">\xD7</button><div class="mermaid-zoom-canvas"></div>',document.body.appendChild(e);let t=()=>e.classList.add("hidden");return e.addEventListener("click",n=>{(n.target===e||n.target.closest(".mermaid-zoom-close"))&&t()}),Fi||(Fi=!0,document.addEventListener("keydown",n=>{n.key==="Escape"&&t()})),e}function Wi(e){let t=e.querySelector("svg");if(!t)return;let n=Od(),s=n.querySelector(".mermaid-zoom-canvas");s.innerHTML=t.outerHTML;let a=s.querySelector("svg");a?.removeAttribute("width"),a?.removeAttribute("height"),n.classList.remove("hidden")}function Bd(){let e=globalThis.mermaid;return!e||Ui||(e.initialize({startOnLoad:!1,securityLevel:"strict",theme:document.documentElement.dataset.theme==="dark"?"dark":"default",flowchart:{htmlLabels:!1}}),Ui=!0),e}function Ud(e){let t=String(e||"").replace(/\r\n?/g,`
|
|
2
|
+
`).trim();return t=t.replace(/^```(?:mermaid)?\s*/i,"").replace(/\s*```$/,"").trim(),t=t.replace(/^mermaid\s*\n/i,""),t=t.replace(/^graph\s+(TD|TB|BT|RL|LR)\b/i,"flowchart $1"),t}function vt(e){let t=Bd();!t||!e||e.querySelectorAll("pre code.language-mermaid, pre code.lang-mermaid").forEach(n=>{if(n.dataset.mermaidHandled)return;let s=n.closest("pre"),a=Ud(n.textContent);if(!s||!a)return;n.dataset.mermaidHandled="1";let o=document.createElement("div");o.className="mermaid-diagram",o.setAttribute("role","img"),o.setAttribute("aria-label","Mermaid diagram"),s.replaceWith(o);let r=`mermaid-diagram-${++Rd}`;Promise.resolve(t.parse(a)).then(()=>t.render(r,a)).then(({svg:d,bindFunctions:u})=>{o.innerHTML=d,u?.(o),o.tabIndex=0,o.title="\u70B9\u51FB\u653E\u5927\u56FE\u8868",o.addEventListener("click",l=>{l.target.closest("a")||Wi(o)}),o.addEventListener("keydown",l=>{(l.key==="Enter"||l.key===" ")&&(l.preventDefault(),Wi(o))})}).catch(d=>{o.replaceWith(s),delete n.dataset.mermaidHandled,s.classList.add("mermaid-error"),s.title=`Mermaid render failed: ${d?.message||"invalid diagram"}`})})}var Ui,Rd,Fi,_n=F(()=>{Ui=!1,Rd=0,Fi=!1});function Xo(e){return Fd.test(String(e||""))}function Wd(e){return String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function Gi(e,t){return t===0||e[t-1]===`
|
|
3
|
+
`}function Gd(e,t){if(Gi(e,t)&&(e.startsWith("```",t)||e.startsWith("~~~",t))){let n=e.startsWith("```",t)?"```":"~~~",s=e.indexOf(`
|
|
4
|
+
`+n,t+3);return s===-1?{end:e.length}:{end:s+1+n.length}}if(e[t]==="`"){let n=1;for(;e[t+n]==="`";)n++;let s=t+n;for(;s<e.length;){if(e[s]==="`"){let a=0;for(;e[s+a]==="`";)a++;if(a===n)return{end:s+a};s+=a;continue}s++}return{end:t+n}}return null}function Kd(e,t){let n=e.slice(t);if(n.startsWith("$$")){let s=n.indexOf("$$",2);if(s>=2){let a=n.slice(2,s);if(a.trim())return{body:a,display:!0,end:t+s+2}}}if(n.startsWith("\\[")){let s=n.indexOf("\\]",2);if(s>=2){let a=n.slice(2,s);if(a.trim())return{body:a,display:!0,end:t+s+2}}}if(n.startsWith("\\(")){let s=n.indexOf("\\)",2);if(s>=2){let a=n.slice(2,s);if(a.trim())return{body:a,display:!1,end:t+s+2}}}if(n[0]==="$"&&n[1]!=="$"){let s=n.match(/^\$([^$\n]|\\\$)+?(?<!\s)\$/);if(s&&s[0][1]!==" "){let a=s[0].slice(1,-1);if(a.trim())return{body:a,display:!1,end:t+s[0].length}}}if(Gi(e,t)){let s=n.match(/^[ \t]*\[[ \t]*\n([\s\S]*?)\n[ \t]*\][ \t]*(?=\n|$)/);if(s&&Xo(s[1]))return{body:s[1],display:!0,end:t+s[0].length};let a=n.match(/^[ \t]*\[([^\]\n]+)\](?!\()/);if(a&&Xo(a[1]))return{body:a[1],display:!0,end:t+a[0].length}}return null}function Ki(e){let t=[],n=String(e??""),s="",a=0;for(;a<n.length;){let o=Gd(n,a);if(o){s+=n.slice(a,o.end),a=o.end;continue}let r=Kd(n,a);if(r){let d=t.length;t.push({body:r.body,display:r.display}),s+=`@@MATH${d}@@`,a=r.end;continue}s+=n[a],a++}return{text:s,slots:t}}function ma(e,t){return t?.length?String(e).replace(/@@MATH(\d+)@@/g,(n,s)=>{let a=t[Number(s)];if(!a)return n;let o=a.display?"\\[":"\\(",r=a.display?"\\]":"\\)";return Wd(`${o}${a.body}${r}`)}):e}function zd(e){return e.parentElement?.closest("pre, code, .mermaid-diagram, .katex, script, style")}function Yo(e,t){let n=[{re:/\\\[([\s\S]+?)\\\]/g,display:!0},{re:/\$\$([\s\S]+?)\$\$/g,display:!0},{re:/\\\(([\s\S]+?)\\\)/g,display:!1},{re:/(?<!\\)\$([^$\n]|\\\$)+?(?<!\s)(?<!\\)\$/g,display:!1},{re:/(?:^|\n)[ \t]*\[[ \t]*\n([\s\S]*?)\n[ \t]*\][ \t]*(?=\n|$)/g,display:!0,latex:!0},{re:/(?:^|\n)[ \t]*\[([^\]\n]+\\[a-zA-Z{}_^][^\]\n]*)\](?!\()/g,display:!0,latex:!0}],s=null;for(let a of n){a.re.lastIndex=t;let o=a.re.exec(e);if(!o||s&&o.index>=s.match.index)continue;let r=o[0],d;o[1]!=null&&(a.latex||r.startsWith("\\[")||r.startsWith("\\(")||r.startsWith("$$")||r.startsWith("$"))?d=o[1]:d=r.startsWith("\\[")||r.startsWith("\\(")||r.startsWith("$$")?r.slice(2,-2):r.slice(1,-1),d.trim()&&(a.latex&&!Xo(d)||(s={match:o,body:d,display:a.display}))}return s}function Jd(e){let t=e.nodeValue||"",n=0,s=Yo(t,n);if(!s||typeof globalThis.katex?.renderToString!="function")return;let a=document.createDocumentFragment();for(;s;){s.match.index>n&&a.append(document.createTextNode(t.slice(n,s.match.index)));let o;try{o=globalThis.katex.renderToString(s.body.trim(),{displayMode:s.display,throwOnError:!1,strict:"warn"})}catch{a.append(document.createTextNode(s.match[0])),n=s.match.index+s.match[0].length,s=Yo(t,n);continue}let r=document.createElement(s.display?"div":"span");r.className=s.display?"math-display":"math-inline",r.innerHTML=o,a.append(r),n=s.match.index+s.match[0].length,s=Yo(t,n)}n<t.length&&a.append(document.createTextNode(t.slice(n))),e.replaceWith(a)}function xt(e){if(!e||typeof globalThis.katex?.renderToString!="function")return;let t=document.createTreeWalker(e,NodeFilter.SHOW_TEXT),n=[];for(;t.nextNode();)zd(t.currentNode)||n.push(t.currentNode);n.forEach(Jd)}var Fd,Zt=F(()=>{Fd=/\\[a-zA-Z]+|[_^]\{|\\[,;!]|\\[{}()[\]]|\\leq\b|\\geq\b|\\neq\b|\\in\b|\\sum\b|\\int\b|\\frac\b|\\min\b|\\max\b|\\mathrm\b|\\text\b|\\left\b|\\right\b/});function Vd(e){return String(e??"").replace(Qd,(t,n)=>`
|
|
5
5
|
|
|
6
6
|
> \u26A0\uFE0F \u539F\u59CB\u8BB0\u5F55\u5DF2\u622A\u65AD\uFF08${n} bytes\uFF09
|
|
7
7
|
|
|
8
|
-
`)}function Ve(e,{fallback:t}={}){let{text:n,slots:s}=
|
|
8
|
+
`)}function Ve(e,{fallback:t}={}){let{text:n,slots:s}=Ki(Vd(e));if(typeof marked>"u"){let a=t?t(n):n;return ma(a,s)}try{return ma(marked.parse(n,{breaks:!0,gfm:!0}),s)}catch{let a=t?t(n):n;return ma(a,s)}}var Qd,en=F(()=>{Zt();Qd=/(?:<|\[)\s*(?:…\s*)?truncated\s+([\d,]+)\s+bytes\s*(?:>|\])/gi});function Zo(e,t){let n=fa(e,t||re.peek()||E.peek()?.path||"");if(!n)return!1;if(n.root&&(re.value=n.root),n.isDir)oe.value=null,Y.value=n.relative;else{let s=n.relative.split("/").filter(Boolean);Y.value=s.slice(0,-1).join("/"),oe.value=n.relative}return X.value="files",!0}var er=F(()=>{G();W();le();Vo();_n();Zt();en()});function Xd({sessionId:e=c.sessionId,agent:t=c.agent||$.peek()||"claude",machineId:n=c.machineId||D.peek()||"local"}={}){return e?`session:${n||"local"}:${t||"claude"}:${e}`:null}function tn(){return!((c.role||"editor")==="viewer"||c.lock?.foreign)}function Zd(){document.dispatchEvent(new CustomEvent("session-lock-changed",{detail:c.lock}))}function Nn(e){c.lock={key:null,token:null,holder:null,held:!1,foreign:!1,...e||{}},Zd()}async function yt(e={}){let t=Xd(e);return t?(c.role||"editor")==="viewer"?(Nn({key:t,held:!1,foreign:!0,holder:"viewer"}),{ok:!1,error:"viewers cannot take exclusive locks",code:403}):(c.lock?.key&&c.lock.key!==t&&await ga(),ms||(ms=(async()=>{try{let s={key:t,kind:"session",ttlSec:tr,exclusive:!0,...c.lock?.token&&c.lock?.key===t?{token:c.lock.token}:{}},a=await x("POST","/api/collab/locks",s,void 0,{hub:!0});return Nn({key:t,token:a.token,holder:a.holder,held:!0,foreign:!1,expiresAt:a.expiresAt,version:a.version}),tu(),{ok:!0,lock:a}}catch(s){let a=String(s.message||s);return/locked|HTTP 423|423/.test(a)?(Nn({key:t,held:!1,foreign:!0,holder:"another user"}),{ok:!1,code:423,error:a}):(Nn({key:t,held:!0,foreign:!1,unmanaged:!0}),{ok:!0,skipped:!0,error:a})}finally{ms=null}})(),ms)):(Nn({foreign:!1,held:!0,unmanaged:!0}),{ok:!0,skipped:!0})}async function eu(){let{key:e,token:t,held:n}=c.lock||{};if(!(!e||!t||!n))try{let s=await x("POST","/api/collab/lock-action",{key:e,action:"heartbeat",token:t,ttlSec:tr},void 0,{hub:!0});s?.token&&(c.lock.token=s.token),s?.expiresAt&&(c.lock.expiresAt=s.expiresAt)}catch(s){let a=String(s.message||s);/token mismatch|HTTP 409|409|no lock|HTTP 404|404/.test(a)&&((await yt()).ok||nr())}}function tu(){nr(),ha=setInterval(()=>{eu().catch(()=>{})},Yd)}function nr(){ha&&(clearInterval(ha),ha=null)}async function ga(){nr();let{key:e,token:t}=c.lock||{};if(Nn({held:!1,foreign:!1}),!!e)try{await x("POST","/api/collab/lock-action",{key:e,action:"release",token:t,ttlSec:tr},void 0,{hub:!0})}catch{}}async function zi(){try{let e=await x("GET","/api/collab/me",void 0,void 0,{hub:!0});return c.role=e?.role||c.role||"editor",c.username=e?.username||c.username||null,e}catch{return c.role||(c.role="editor"),null}}var tr,Yd,ha,ms,hs=F(()=>{W();le();tr=60,Yd=2e4,ha=null,ms=null});async function sr(){if(gs&&!(typeof navigator>"u"||!navigator.wakeLock?.request)&&document.visibilityState==="visible"&&!nn)try{nn=await navigator.wakeLock.request("screen"),nn.addEventListener("release",()=>{nn=null,gs&&document.visibilityState==="visible"&&setTimeout(()=>{sr().catch(()=>{})},500)})}catch{nn=null}}async function Ji(){let e=nn;if(nn=null,!!e)try{await e.release()}catch{}}function ba(e){gs=!!e,gs?sr().catch(()=>{}):Ji().catch(()=>{})}function ar(){typeof document>"u"||document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&gs?sr().catch(()=>{}):document.visibilityState==="hidden"&&Ji().catch(()=>{})})}var nn,gs,or=F(()=>{nn=null,gs=!1});function O(e){if(e==null||e==="")return null;if(typeof e=="number")return!Number.isFinite(e)||e<=0?null:e<1e12?Math.round(e*1e3):Math.round(e);if(typeof e=="string"){let t=e.trim();if(/^\d+(\.\d+)?$/.test(t))return O(Number(t));let n=Date.parse(t);return Number.isNaN(n)?null:n}return null}function Pn(e){let t=O(e);if(t==null)return"";let n=Date.now()-t;return n<0?new Date(t).toLocaleDateString():n<6e4?"just now":n<36e5?`${Math.floor(n/6e4)}m ago`:n<864e5?`${Math.floor(n/36e5)}h ago`:n<7*864e5?`${Math.floor(n/864e5)}d ago`:new Date(t).toLocaleDateString()}function Hn(e,t=!0){let n=e||"claude",a={claude:"bg-orange-500/15 text-orange-400",codex:"bg-emerald-500/15 text-emerald-400",grok:"bg-sky-500/15 text-sky-400",gemini:"bg-violet-500/15 text-violet-400",cursor:"bg-amber-500/15 text-amber-400"}[n]||"bg-base-300 text-base-content/50",o=t?n==="claude"?"CC":n==="codex"?"CX":n==="grok"?"GX":n==="gemini"?"GM":n==="cursor"?"CU":n.slice(0,2).toUpperCase():Z[n]||n;return`<span class="text-[9px] px-1 py-0.5 rounded font-mono font-semibold flex-shrink-0 ${a}" title="${p(Z[n]||n)}">${o}</span>`}function qn(e){if(!e)return"";let t="",n=e.split("/").filter(Boolean);return n.length<=3?e:"\u2026/"+n.slice(-2).join("/")}var _t=F(()=>{G();W()});function nu(e){let t=O(e);if(t==null)return"";let n=new Date(t);return Number.isNaN(n.getTime())?"":n.toLocaleString()}function Qi(){let e=i("notifications-badge");if(e){if(!sn){e.classList.add("hidden"),e.textContent="0";return}e.classList.remove("hidden"),e.textContent=sn>99?"99+":String(sn)}}function Xi(){let e=i("notifications-menu"),t=i("btn-notifications"),n=i("topbar");if(!e||!t||!n)return;let s=t.getBoundingClientRect(),a=n.getBoundingClientRect(),o=Math.min(416,window.innerWidth-16),r=Math.max(8,Math.min(window.innerWidth-o-8,s.right-o));e.style.top=`${Math.round(a.bottom+8)}px`,e.style.left=`${Math.round(r)}px`,e.style.width=`${Math.round(o)}px`}function bs(){let e=i("notifications-menu-list"),t=i("notifications-menu-empty");if(!(!e||!t)){if(!Pe.length){e.innerHTML="",t.classList.remove("hidden"),Qi();return}t.classList.add("hidden"),e.innerHTML=Pe.map(n=>`
|
|
9
9
|
<button type="button"
|
|
10
10
|
class="w-full text-left rounded-lg border px-3 py-2 transition-colors hover:bg-base-200/70 ${n.unread?"border-primary/35 bg-primary/5":"border-base-300 bg-base-100"}"
|
|
11
11
|
data-notification-id="${p(n.id)}"
|
|
@@ -24,47 +24,47 @@ var wd=Object.defineProperty;var U=(e,t,n)=>()=>{if(n)throw n[0];try{return e&&(
|
|
|
24
24
|
<div class="flex items-center gap-2 mt-1 text-[10px] text-base-content/35">
|
|
25
25
|
${n.projectName?`<span class="font-mono truncate">${p(n.projectName)}</span>`:""}
|
|
26
26
|
${n.machineId?`<span class="px-1 py-0.5 rounded bg-base-300 text-base-content/55 font-mono">${p(n.machineId)}</span>`:""}
|
|
27
|
-
<span>${p(
|
|
27
|
+
<span>${p(nu(n.createdAt))}</span>
|
|
28
28
|
</div>
|
|
29
29
|
</div>
|
|
30
30
|
</div>
|
|
31
|
-
</button>`).join(""),
|
|
31
|
+
</button>`).join(""),Qi()}}function an(){i("notifications-menu")?.classList.add("hidden"),i("notifications-backdrop")?.classList.add("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","false")}function su(){Xi(),i("notifications-menu")?.classList.remove("hidden"),i("notifications-backdrop")?.classList.remove("hidden"),i("btn-notifications")?.setAttribute("aria-expanded","true")}function Zi(){let e=i("notifications-menu");e&&(e.classList.contains("hidden")?su():an())}function Vi(e){let t=new Map;for(let n of e||[])n?.id&&t.set(String(n.id),n);Pe=[...t.values()].sort((n,s)=>(O(s.createdAt)||0)-(O(n.createdAt)||0)),sn=Pe.reduce((n,s)=>n+(s.unread?1:0),0),bs()}async function va(){try{let e=await x("GET","/api/notifications?limit=80");Pe=Array.isArray(e?.notifications)?e.notifications:[],sn=Number(e?.unreadCount)||Pe.reduce((t,n)=>t+(n.unread?1:0),0),bs()}catch{Pe=[],sn=0,bs()}}async function Yi(e=null){let t=await x("POST","/api/notifications/read",e?.length?{ids:e}:{});Pe=Array.isArray(t?.notifications)?t.notifications:Pe.map(n=>!e||e.includes(n.id)?{...n,unread:!1}:n),sn=Number(t?.unreadCount)||Pe.reduce((n,s)=>n+(s.unread?1:0),0),bs()}function au(e){if(!(typeof Notification>"u")&&document.visibilityState!=="visible"&&Notification.permission==="granted")try{let t=new Notification(e.title||"Session done",{body:e.body||e.projectName||e.sessionId||"",tag:e.id});t.onclick=()=>{window.focus(),t.close()}}catch{}}function xa(e){if(!e?.id)return;if(Pe.find(n=>n.id===e.id)){Vi([e,...Pe.filter(n=>n.id!==e.id)]);return}Vi([e,...Pe]),au(e)}function el(e={}){rr=typeof e.openSession=="function"?e.openSession:null,bs(),va(),typeof Notification<"u"&&Notification.permission==="default"&&document.addEventListener("click",()=>{try{Notification.requestPermission().catch(()=>{})}catch{}},{once:!0}),b.on("click","#notifications-backdrop",t=>{t.preventDefault(),t.stopPropagation(),an()}),b.on("click","#btn-notifications-read-all",async t=>{t.preventDefault(),t.stopPropagation(),await Yi()}),b.on("click","[data-notification-id]",async(t,n)=>{let s=n.dataset.notificationId;s&&(await Yi([s]),an(),!(!rr||!n.dataset.notificationSession)&&rr(n.dataset.notificationSession,n.dataset.notificationCwd||null,null,n.dataset.notificationAgent||"claude",n.dataset.notificationMachine||null))}),document.addEventListener("click",t=>{let n=i("notifications-menu"),s=i("btn-notifications"),a=t.target;!n||n.classList.contains("hidden")||n.contains(a)||s?.contains(a)||an()}),window.addEventListener("resize",()=>{i("notifications-menu")&&!i("notifications-menu").classList.contains("hidden")&&Xi()})}var Pe,sn,rr,ya=F(()=>{G();le();_t();Pe=[],sn=0,rr=null});function vs(e,t=80){return e?e.scrollHeight-e.scrollTop-e.clientHeight<t:!0}function ou(e,t){return e<0?!1:t}function ru({force:e=!1,following:t=!0,userScrolling:n=!1}={}){return e?!0:n?!1:t}function wa(e){let t=!0,n=!1,s=0,a=()=>{t=vs(e),n=!1},o=u=>{t=ou(u.deltaY,t),u.deltaY<0&&(n=!0)},r=u=>{s=u.touches?.[0]?.clientY||0},d=u=>{(u.touches?.[0]?.clientY||0)-s>8&&(t=!1,n=!0)};return e.addEventListener("scroll",a,{passive:!0}),e.addEventListener("wheel",o,{passive:!0}),e.addEventListener("touchstart",r,{passive:!0}),e.addEventListener("touchmove",d,{passive:!0}),{stick(u=!1){ru({force:u,following:t,userScrolling:n})&&(e.scrollTop=e.scrollHeight,t=!0)},setFollowing(u){t=!!u},isFollowing(){return t},destroy(){e.removeEventListener("scroll",a),e.removeEventListener("wheel",o),e.removeEventListener("touchstart",r),e.removeEventListener("touchmove",d)}}}var ir=F(()=>{});function iu(){return Z[$.peek()]||"Assistant"}function lu(e){let t=String(e||"").trim();return/remote compact task|error decoding response body/i.test(t)?"Codex \u4F1A\u8BDD\u538B\u7F29\u5931\u8D25\uFF08\u7F51\u7EDC\u4E2D\u65AD\uFF09\u3002\u518D\u53D1\u4E00\u6761\u6D88\u606F\u91CD\u8BD5\uFF0C\u6216\u5F00\u65B0\u4F1A\u8BDD\u3002":t||"\u53D1\u9001\u5931\u8D25"}function rl(e){return e?(on&&on.el===e||(on?.destroy?.(),on=wa(e),on.el=e),on):null}function He(e,t){if(!e||e.dataset.historyPainting==="1")return;rl(e).stick(!!t)}function ja(){try{Fe.length?sessionStorage.setItem(ur,JSON.stringify(Fe.slice(-30))):sessionStorage.removeItem(ur)}catch{}}function du(){let e=$t(),t=Fe.filter(n=>n.key===e).length;t&&!sl.has(e)&&(sl.add(e),C(`\u231B Restored ${t} queued prompt${t===1?"":"s"} in this browser tab`))}function il(e=c.sessionId,t=c.agent,n=c.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function uu(e={}){let t=il(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(dr)||"{}")[t])||0}catch{return 0}}function pu(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=il(e.sessionId||c.sessionId,e.agent||c.agent,c.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(dr)||"{}")||{}}catch{}let a=Number(s[n])||0;if(t<=a)return!1;s[n]=t;let o=Object.keys(s);o.length>500&&o.sort((r,d)=>Number(s[d])-Number(s[r])).slice(500).forEach(r=>delete s[r]);try{localStorage.setItem(dr,JSON.stringify(s))}catch{}return!0}function $t({sessionId:e=c.sessionId,agent:t=c.agent,machineId:n=c.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function Un(e){let t=$t(e),n=i("chat-input");!t||!n||(n.value?rn.set(t,n.value):rn.delete(t))}function Fn(e){let t=i("chat-input");t&&(t.value=rn.get($t(e))||"",Ss(t),$s(t.value))}function Wn(e){let t=$t(e);if(!t)return;let n=Fe.filter(a=>a.key===t);if(!n.length)return;Fe=Fe.filter(a=>a.key!==t),ja();let s=rn.get(t)||"";rn.set(t,[s,...n.map(a=>a.text)].filter(Boolean).join(`
|
|
32
32
|
|
|
33
|
-
`))}function Gn(){
|
|
33
|
+
`))}function Gn(){N.peek()&&(N.value=!1,ln())}function fu(){tl||(tl=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(ut=400,Rn({probe:!0}),c.ws?.readyState===WebSocket.OPEN&&c.sessionId))try{c.ws.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}}),window.addEventListener("online",()=>{ut=400,Rn({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?Rn({force:!0}):Rn({probe:!0})}),window.addEventListener("focus",()=>Rn({probe:!0})),navigator.connection?.addEventListener?.("change",()=>{ut=400,Rn({probe:!0})}))}function $a(){let e=i("conn-dot");if(!e)return;let t=fe.peek();e.classList.remove("bg-success","bg-warning","bg-error","bg-base-content/30","animate-pulse"),t==="open"?(e.classList.add("bg-success"),e.title="\u5DF2\u8FDE\u63A5"):t==="connecting"||t==="reconnecting"?(e.classList.add("bg-warning","animate-pulse"),e.title=t==="connecting"?"\u8FDE\u63A5\u4E2D\u2026":"\u91CD\u8FDE\u4E2D\u2026"):t==="offline"?(e.classList.add("bg-error"),e.title="\u79BB\u7EBF"):(e.classList.add("bg-base-content/30"),e.title="\u672A\u8FDE\u63A5")}function Rn(e={}){let t=c.ws?.readyState;if(e.force){ut=400,Pt({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&kt&&Date.now()-kt>45e3)try{c.ws.close()}catch{}else if(e.probe&&c.ws.readyState===WebSocket.OPEN)try{c.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(ut=Math.min(ut,800),Pt({quiet:!0}))}function mu(){On||(fe.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",$a(),On=setTimeout(()=>{On=null,Pt({quiet:!0})},ut),ut=Math.min(Math.round(ut*1.8),15e3))}function ll(){ka&&(clearInterval(ka),ka=null)}function hu(e,t){ll(),ka=setInterval(()=>{if(!(t!==ys||e.readyState!==WebSocket.OPEN)){if(kt&&Date.now()-kt>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&kt&&Date.now()-kt>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function ln(){let e=N.peek()||!!E.peek()&&fe.peek()==="open";ba(e)}function Ia(){return(c.role||"editor")==="viewer"?"\u53EA\u8BFB\u8D26\u53F7\uFF0C\u65E0\u6CD5\u8F93\u5165":c.lock?.foreign?`\u4F1A\u8BDD\u7531 ${c.lock.holder&&c.lock.holder!=="viewer"?c.lock.holder:"\u5176\u4ED6\u7528\u6237"} \u5360\u7528\uFF08\u9501\uFF09`:"\u5F53\u524D\u65E0\u6CD5\u8F93\u5165"}function Ta(){let e=tn();c.externalSessionReadOnly=!e;let t=i("chat-input"),n=i("send-btn"),s=i("btn-attach"),a=i("session-lock-banner");t&&(t.disabled=!e,t.readOnly=!e,e?N.peek()?t.placeholder="\u56DE\u590D\u4E2D\u2026 \u53EF\u5148\u5199\u597D\u4E0B\u4E00\u6761\uFF0C\u7ED3\u675F\u540E\u81EA\u52A8\u53D1\u9001 \xB7 \u6216\u70B9 \u25A0 \u505C\u6B62":$s(t.value||""):t.placeholder=Ia()),n&&(n.disabled=!e),s&&(s.disabled=!e),a&&(e?(a.classList.add("hidden"),a.textContent=""):(a.classList.remove("hidden"),a.textContent=Ia()))}function Da(e){Ta()}function Pt(e={}){fu(),On&&(clearTimeout(On),On=null),e.quiet&&(cr=!0);let t=c.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);nl!==t&&(ca(),nl=t);let n=++ys;try{c.ws?.close()}catch{}fe.value="connecting",$a();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;c.token&&a.set("token",c.token),t&&a.set("machine",t),c.sessionId&&a.set("sessionId",c.sessionId),c.agent&&a.set("agent",c.agent);let o=uu();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);c.ws=r,r.addEventListener("open",()=>{if(n===ys){if(ut=1e3,kt=Date.now(),fe.value="open",$a(),c.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}la(),du(),hu(r,n),ln(),lr&&!cr&&C(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),lr=!1,cr=!1}}),r.addEventListener("message",d=>{if(n!==ys)return;let u;try{u=JSON.parse(d.data)}catch{return}if(pu(u)){if(u.type==="pong"){kt=Date.now();return}if(u.type==="ping"){if(kt=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(u.type==="run-status"){u.running?N.value=!0:(N.peek()&&(N.value=!1),pr()),ln();return}dl(u)}}),r.addEventListener("close",()=>{n===ys&&(ll(),lr=!0,fe.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",$a(),mu())}),r.addEventListener("error",()=>{})}function pr(){if(!Fe.length||N.peek())return;let e=$t(),t=Fe.findIndex(a=>a.key===e);if(t<0)return;let[n]=Fe.splice(t,1);ja();let s=i("chat-input");s&&(s.value=n.text,Ss(s)),setTimeout(()=>{if(n.key!==$t()||N.peek()){rn.set(n.key,n.text);return}Ls()},0)}function ws(){N.value=!1,ln(),pr()}function mr(){return cl}function dl(e){if(!(e?.sessionId&&c.sessionId&&e.sessionId!==c.sessionId)){if(e&&typeof e.type=="string"&&(e.type==="note.added"||e.type==="note.updated"||e.type==="note.removed"||e.type==="queue.item.added"||e.type==="queue.item.updated"||e.type==="queue.item.removed"||e.type==="queue.item.moved"||e.type==="queue.item.sending")){window.dispatchEvent(new CustomEvent("hub-ws-message",{detail:e}));let t={"note.added":"hub:note-added","note.updated":"hub:note-updated","note.removed":"hub:note-removed"}[e.type];t&&window.dispatchEvent(new CustomEvent(t,{detail:e}))}if(e._hubReplay===!0){document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)dl(t);return}if(["assistant","assistant_stream_start","assistant_delta","thought_delta","tool_use"].includes(e.type)&&cl++,e.type==="session-created"){let t=_.peek();c.sessionId=e.sessionId,e.agent&&e.agent!==$.peek()&&Ne(e.agent),se(t,e.agent||$.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-sessions-changed"){document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-session-updated"){document.dispatchEvent(new CustomEvent("sessions-changed")),document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="notification"&&e.notification){xa(e.notification);return}if(e.type==="grok-queue-status"){Tu(e);return}if(e.type==="result"){ks(),xs(),pt();let t=e.usage;if(t){let n={input_tokens:t.inputTokens??t.input_tokens,output_tokens:t.outputTokens??t.output_tokens,cache_read_input_tokens:t.cacheReadInputTokens??t.cache_read_input_tokens,cache_creation_input_tokens:t.cacheCreationInputTokens??t.cache_creation_input_tokens,total_tokens:t.totalTokens??t.total_tokens,reasoning_tokens:t.reasoningTokens??t.reasoning_tokens,costUSD:t.costUSD??t.cost_usd};c.lastUsage=n,c.sessionId&&(c.lastUsageSessionId=c.sessionId),Bn(n)}e.is_error||C("\u2713 Done"),ws();return}if(e.type==="complete"){ks(),xs(),pt(),!e.aborted&&e.agent==="claude"?C("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?C("\u2713 Done"):e.aborted&&C("\u5DF2\u505C\u6B62")),ws();return}if(e.type==="error"){ks(),xs(),(e.code===423||/locked/i.test(String(e.message||"")))&&(c.lock={...c.lock||{},held:!1,foreign:!0,holder:e.lock?.holder||c.lock?.holder||"another user"},Ta()),Ht("error","Error",lu(e.message)),ws();return}if(e.type==="shell-start"){c.shellBubble=null;return}if(e.type==="shell-output"){c.shellBubble||(c.shellBubble=Mu(e.stream==="stderr"?"shell-err":"shell")),Au(c.shellBubble,e.data);return}if(e.type==="shell-exit"){c.shellBubble=null,C(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),ws();return}if(e.type==="assistant"){xs();for(let t of e.message?.content||[])t.type==="text"&&t.text?(pt(),Ht("assistant",iu(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&vr(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){N.peek()||(N.value=!0,ln()),ul(e.ts);return}if(e.type==="assistant_delta"){N.peek()||(N.value=!0,ln()),gu(e.data||"");return}if(e.type==="assistant_stream_end"){xs();return}if(e.type==="thought_stream_start"){pl();return}if(e.type==="thought_delta"){bu(e.data||"");return}if(e.type==="thought_stream_end"){ks();return}if(e.type==="status"){let t=i("stream-status");if(t)t.textContent=e.message||"";else{let n=i("messages");n&&e.message&&(n.insertAdjacentHTML("beforeend",`<div id="stream-status" class="text-center text-[10px] text-base-content/35 py-0.5">${p(e.message)}</div>`),He(n))}return}if(e.type==="permission_resolved"){let t=e.requestId||e.request_id;t&&i(`perm-${t}`)?.remove();return}(e.type==="permission_request"||e.request_id&&e.tool_name)&&_u(e)}}function ul(e){let t=i("messages");if(!t||(pt(),ks(),Xe&&t.contains(Xe)))return;let n=Ca(e||Date.now()),s=Ma(e||Date.now());t.insertAdjacentHTML("beforeend",`
|
|
34
34
|
<div class="msg-row assistant px-2 live-stream" data-ts="${p(s)}">
|
|
35
35
|
<div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-base-200 break-words md">
|
|
36
36
|
<div class="msg-stream-body whitespace-pre-wrap"></div>
|
|
37
37
|
</div>
|
|
38
38
|
${n?`<div class="msg-ts" title="${p(s)}">${p(n)}</div>`:""}
|
|
39
|
-
</div>`),Xe=t.lastElementChild,Ue=Xe.querySelector(".msg-stream-body"),i("stream-status")?.remove(),He(t)}function
|
|
39
|
+
</div>`),Xe=t.lastElementChild,Ue=Xe.querySelector(".msg-stream-body"),i("stream-status")?.remove(),He(t)}function gu(e){e&&(Ue||ul(Date.now()),Ue&&(Ue.textContent+=e,He(i("messages"))))}function xs(){if(!Xe||!Ue){Xe=null,Ue=null;return}let e=Ue.textContent||"";e.trim()?(Ue.classList.remove("whitespace-pre-wrap"),Ue.classList.add("md"),Ue.innerHTML=La(e),xl(Xe),bl(Xe,e)):Xe.remove(),Xe=null,Ue=null,i("stream-status")?.remove()}function pl(){let e=i("messages");e&&(Nt&&e.contains(Nt)||(e.insertAdjacentHTML("beforeend",`
|
|
40
40
|
<div class="msg-row assistant px-2 thought-stream">
|
|
41
41
|
<div class="max-w-[88%] rounded-lg border border-base-300/60 bg-base-200/50 px-2.5 py-1.5 text-[11px] text-base-content/45">
|
|
42
42
|
<div class="font-medium text-base-content/35 mb-0.5">thinking\u2026</div>
|
|
43
43
|
<div class="thought-body font-mono whitespace-pre-wrap max-h-24 overflow-y-auto opacity-80"></div>
|
|
44
44
|
</div>
|
|
45
|
-
</div>`),Nt=e.lastElementChild,dt=Nt.querySelector(".thought-body"),He(e)))}function
|
|
46
|
-
<div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}Nt=null,dt=null}function
|
|
47
|
-
Available: ${u}`:""}`),!0}let a=
|
|
45
|
+
</div>`),Nt=e.lastElementChild,dt=Nt.querySelector(".thought-body"),He(e)))}function bu(e){e&&(dt||pl(),dt&&(dt.textContent+=e,dt.scrollTop=dt.scrollHeight,He(i("messages"))))}function ks(){if(Nt&&dt){let e=(dt.textContent||"").length;Nt.innerHTML=`
|
|
46
|
+
<div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}Nt=null,dt=null}function xu(e){let[t,...n]=e.slice(1).trim().split(/\s+/),s=n.join(" ");switch(t.toLowerCase()){case"agent":{if(!s)return C(`Current agent: ${$.peek()} \xB7 agents: claude | codex | grok | gemini | cursor`),!0;let a=s.toLowerCase();return["claude","codex","grok","gemini","cursor"].includes(a)?(a!==$.peek()?(c.sessionId=null,Ne(a),se(Be(a)),document.dispatchEvent(new CustomEvent("agent-changed")),C(`Agent \u2192 ${Z[a]} \xB7 model ${_.peek()} \xB7 new session`)):C(`Agent already ${Z[a]}`),!0):(C(`Unknown agent "${s}" \xB7 valid: claude | codex | grok | gemini | cursor`),!0)}case"model":{if(!s){let d=$.peek(),u=Oe(d).map(l=>l.value).join(" | ");return C(`Current model: ${_.peek()} (${d})${u?`
|
|
47
|
+
Available: ${u}`:""}`),!0}let a=vu[s.toLowerCase()]||s,o=$.peek()||"claude",r=Oe(o).some(d=>d.value===a);return r||Jt(o,a),se(a),C(`Model set to ${a}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let a=Qt($.peek(),_.peek());return s?a.includes(s.toLowerCase())?(te.value=s.toLowerCase(),C(`Effort set to ${s.toLowerCase()}`),!0):(C(`Unknown effort level "${s}" \xB7 valid: ${a.join(" | ")}`),!0):(C(`Current effort: ${te.peek()||"(default)"} \xB7 levels: ${a.join(" | ")}`),!0)}case"clear":return zn(),c.sessionId=null,c.lastUsage=null,C("Cleared \xB7 new session"),!0;case"usage":return yu(),!0;case"help":return C(`Available slash commands:
|
|
48
48
|
/agent [claude|codex|grok|gemini|cursor]
|
|
49
49
|
/model [haiku|sonnet|opus|<model-id>]
|
|
50
50
|
/effort [low|medium|high|xhigh|max]
|
|
51
51
|
/usage
|
|
52
52
|
/clear
|
|
53
|
-
/help`),!0;default:return!1}}function Ie(e){if(e==null||Number.isNaN(Number(e)))return"\u2014";let t=Number(e);return t>=1e6?`${(t/1e6).toFixed(2)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(Math.round(t))}async function
|
|
54
|
-
`)),
|
|
55
|
-
`)),(r.tokensUsed!=null||r.windowTokens!=null)&&
|
|
53
|
+
/help`),!0;default:return!1}}function Ie(e){if(e==null||Number.isNaN(Number(e)))return"\u2014";let t=Number(e);return t>=1e6?`${(t/1e6).toFixed(2)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(Math.round(t))}async function yu(){let e=$.peek()||"claude",t=_.peek()||"\u2014",n=c.sessionId,s=[`Agent: ${Z[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(c.lastUsage&&(!n||c.lastUsageSessionId===n)){let a=c.lastUsage;s.push(`Last turn: \u2191${Ie(a.input_tokens)} \u2193${Ie(a.output_tokens)}`+(a.cache_read_input_tokens?` \xB7 ${Ie(a.cache_read_input_tokens)} cached`:"")+(a.reasoning_tokens?` \xB7 ${Ie(a.reasoning_tokens)} reason`:"")+(a.total_tokens?` \xB7 \u03A3${Ie(a.total_tokens)}`:"")+(a.costUSD!=null?` \xB7 $${Number(a.costUSD).toFixed(4)}`:""))}if(!n){C(s.join(`
|
|
54
|
+
`)),hr("\u25C8 /usage \xB7 no session yet");return}C("Loading usage\u2026");try{let a=new URLSearchParams({sessionId:n,agent:e}),r=(await x("GET",`/api/usage?${a}`)).context||{};if(r.model&&(s[1]=`Model: ${r.model}`),r.title&&s.push(`Title: ${r.title}`),r.tokensUsed!=null||r.windowTokens!=null||r.usagePercent!=null){let u=r.tokensUsed!=null?Ie(r.tokensUsed):"\u2014",l=r.windowTokens!=null?Ie(r.windowTokens):"\u2014",f=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";s.push(`Context window: ${u} / ${l} (${f})`)}if(r.turnCount!=null&&s.push(`Turns: ${r.turnCount}`),r.toolCallCount!=null&&s.push(`Tools: ${r.toolCallCount}`),r.sessionDurationSeconds!=null){let u=Math.floor(r.sessionDurationSeconds/60),l=Math.round(r.sessionDurationSeconds%60);s.push(`Duration: ${u}m ${l}s`)}if(r.sessionTotals){let u=r.sessionTotals;s.push(`Session totals: \u2191${Ie(u.input_tokens)} \u2193${Ie(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ie(u.cache_read_input_tokens)} cached`:"")+(u.total_tokens?` \xB7 \u03A3${Ie(u.total_tokens)}`:"")+(u.costUSD?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}if(r.lastTurn&&!c.lastUsage){let u=r.lastTurn;s.push(`Last completed turn: \u2191${Ie(u.input_tokens)} \u2193${Ie(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ie(u.cache_read_input_tokens)} cached`:"")+(u.costUSD!=null?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}r.note&&s.push(r.note);let d=i("messages");if(d){let u=[...d.children];for(let l=u.length-1;l>=0;l--)if(u[l].textContent==="Loading usage\u2026"){u[l].remove();break}}C(s.join(`
|
|
55
|
+
`)),(r.tokensUsed!=null||r.windowTokens!=null)&&gr({tokensUsed:r.tokensUsed,windowTokens:r.windowTokens,usagePercent:r.usagePercent,model:r.model||t,turnCount:r.turnCount,toolCallCount:r.toolCallCount}),r.sessionTotals?Bn(r.sessionTotals):r.lastTurn?Bn(r.lastTurn):c.lastUsage&&Bn(c.lastUsage)}catch(a){let o=i("messages");if(o){let r=[...o.children];for(let d=r.length-1;d>=0;d--)if(r[d].textContent==="Loading usage\u2026"){r[d].remove();break}}C(`${s.join(`
|
|
56
56
|
`)}
|
|
57
|
-
(usage fetch failed: ${a.message})`)}}function Ls(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(!tn()){C(Ia()),yt().then(()=>Ta()).catch(()=>{});return}if(c.sessionId&&!c.lock?.held&&!c.lock?.unmanaged){yt().then(s=>{if(!s?.ok&&!s?.skipped){Ta(),C(Ia());return}Ls()}).catch(()=>Ls());return}if(
|
|
57
|
+
(usage fetch failed: ${a.message})`)}}function Ls(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(!tn()){C(Ia()),yt().then(()=>Ta()).catch(()=>{});return}if(c.sessionId&&!c.lock?.held&&!c.lock?.unmanaged){yt().then(s=>{if(!s?.ok&&!s?.skipped){Ta(),C(Ia());return}Ls()}).catch(()=>Ls());return}if(N.peek()){if($.peek()==="grok"&&c.sessionId){let s="grok",a=te.peek()||Qe(s,_.peek())||"low",o=lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:_.peek(),lockToken:c.lock?.token||void 0,effort:a,...de.peek()&&{permissionMode:de.peek()},...de.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});gl(t),e.value="",Ss(e),$s(""),Sa(),C(o?"\u5DF2\u52A0\u5165 Grok \u670D\u52A1\u7AEF\u961F\u5217\uFF0C\u5237\u65B0\u9875\u9762\u4ECD\u4F1A\u663E\u793A":"\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5C06\u5728\u91CD\u8FDE\u540E\u53D1\u9001");return}Fe.push({key:$t(),text:t}),ja(),e.value="",Ss(e),$s(""),Sa(),C(`\u5DF2\u6392\u961F\u4E0B\u4E00\u6761\uFF0C\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u540E\u53D1\u9001\uFF1A${t.length>80?t.slice(0,80)+"\u2026":t}`);return}if(e.value="",rn.delete($t()),Ss(e),$s(""),Sa(),t.startsWith("/")&&xu(t))return;N.value=!0,ln();let n=Date.now();if(ml(t))Ht("shell","$ Shell",t.slice(1).trim(),{ts:n}),lt({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:E.peek().path})||C("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{pt(),Ht("user","You",t,{ts:n,forceStick:!0});let s=$.peek()||"claude",a=te.peek()||Qe(s,_.peek())||(s==="grok"?"low":""),o=de.peek();c.sessionId&&se(_.peek(),s,c.sessionId),lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:_.peek(),lockToken:c.lock?.token||void 0,...a&&{effort:a},...o&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||C("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function fl(){c.sessionId&<({type:"command",cmd:"turn.interrupt",sessionId:c.sessionId}),Fe=Fe.filter(e=>e.key!==$t()),ja(),Cu(),ws()}function $s(e){let t=ml(e),n=i("chat-input"),s=i("send-btn");if(!n||!s)return;n.classList.toggle("textarea-warning",t),n.style.fontFamily=t?"monospace":"",s.classList.toggle("btn-warning",t),s.classList.toggle("btn-primary",!t),s.textContent=t?"Run":"Send";let a=Z[$.peek()]||"agent",o=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches;t?n.placeholder=o?"Shell \u547D\u4EE4\u2026":"Shell command (without !)\u2026":n.placeholder=o?`\u95EE ${a}\u2026`:`Ask ${a}\u2026 or !cmd for shell`}function ml(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function wu(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function Ss(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,wu())+"px"}function Ca(e){let t=O(e);if(t==null)return"";let n=new Date(t);if(Number.isNaN(n.getTime()))return"";let s=new Date,a=n.toDateString()===s.toDateString(),o=n.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1});return a?o:`${n.toLocaleDateString(void 0,{month:"numeric",day:"numeric"})} ${o}`}function Ma(e){let t=O(e);return t==null?"":new Date(t).toISOString()}function Su(e,t,n){if(e==="system")return t;let s=Ca(n),a=Ma(n),o=s?`<div class="msg-ts" title="${p(a)}">${p(s)}</div>`:"";return`<div class="msg-row ${e==="user"?"user":e==="shell"||e==="shell-err"?"assistant":e} px-2" data-ts="${p(a)}">${t}${o}</div>`}function Lu(e,t,n){let s='<button class="msg-expand-btn text-[10px] text-primary/70 mt-1.5 block cursor-pointer hover:text-primary">\u25BC Show more</button>',a;switch(e){case"user":{let r=/!\[.*?\]\(.*?\)/.test(t)?La(t):null,d=t.length>ku,u=d?`<div class="msg-body">${r??p(t.trimEnd())}</div>${s}`:r??p(t.trimEnd());a=`<div class="max-w-[80%] rounded-2xl rounded-tr-sm px-3 py-2 text-sm bg-primary/15 border border-primary/20 text-base-content break-words${d?" msg-card":""}${r?" md":""}"${r?"":' style="white-space:pre-wrap"'}>${u}</div>`;break}case"assistant":{let o=t.length>$u,r=o?`<div class="msg-body">${La(t)}</div>${s}`:La(t);a=`<div class="msg-assistant-content max-w-[min(92%,52rem)] rounded-2xl rounded-tl-sm px-3.5 py-2.5 text-sm bg-base-200 border border-base-300/40 break-words md leading-relaxed${o?" msg-card":""}">${r}</div>`;break}case"error":a=`<div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-error/10 border border-error/20 text-error break-words" style="white-space:pre-wrap">${p(t)}</div>`;break;case"shell":case"shell-err":a=`<div class="w-full max-w-[96%] rounded-lg code-surface px-3 py-2 text-sm font-mono ${e==="shell-err"?"text-error":""} break-words" style="white-space:pre-wrap">${p(t)}</div>`;break;case"system":return`<div class="text-center text-[11px] text-base-content/30 py-0.5 select-none">${p(t)}</div>`;default:a=`<div class="rounded-lg px-3 py-2 text-sm bg-base-300 break-words" style="white-space:pre-wrap">${p(t)}</div>`}return Su(e,a,n)}function Ht(e,t,n,s={}){let a=i("messages");if(!a)return;let o=O(s.ts)??(e==="system"?null:Date.now());a.insertAdjacentHTML("beforeend",Lu(e,n,o)),xl(a.lastElementChild),e==="assistant"&&bl(a.lastElementChild,n,s),He(a,!!s.forceStick)}function C(e){Ht("system","",e)}function Sa(){for(let e of Aa)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}Aa.length=0,Eu()}function Kn(){Sa()}function Eu(){let e=i("chat-attach-bar");if(e){if(!Aa.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=Aa.map((t,n)=>`
|
|
58
58
|
<div class="chat-thumb relative" title="${p(t.ref||t.path)}">
|
|
59
59
|
${t.previewUrl?`<img src="${t.previewUrl}" alt="${p(t.label||"img")}">`:`<span class="chat-thumb-path">${p(t.label||t.name||"file")}</span>`}
|
|
60
60
|
<span class="chat-thumb-label">${p(t.label||t.kind||"")}</span>
|
|
61
61
|
<button type="button" class="chat-thumb-x" data-rm-attach="${n}" aria-label="remove">\u2715</button>
|
|
62
|
-
</div>`).join("")}}function wt(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function
|
|
62
|
+
</div>`).join("")}}function wt(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function hr(e){let t=i("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
|
|
63
63
|
<span class="token-bar-mark">\u25C8</span><span class="token-bar-text">${p(e)}</span>
|
|
64
|
-
</div>`),He(t))}function
|
|
65
|
-
${String(e||"")}`}function
|
|
64
|
+
</div>`),He(t))}function Bn(e){if(!e)return;let t=e.input_tokens??e.inputTokens??0,n=e.output_tokens??e.outputTokens??0,s=e.total_tokens??e.totalTokens??t+n,a=e.cache_read_input_tokens??e.cachedReadTokens?` \xB7 ${wt(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${wt(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${wt(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,u=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",l=s?` \xB7 \u03A3${wt(s)}`:"";hr(`\u2191${wt(t)} \u2193${wt(n)}${a}${o}${r}${l}${u}`)}function gr(e){if(!e)return;let t=e.tokensUsed??e.contextTokensUsed,n=e.windowTokens??e.contextWindowTokens,s=e.usagePercent??e.contextWindowUsage;if(t==null&&n==null&&s==null)return;let a=[];t!=null&&n!=null?a.push(`context ${wt(t)} / ${wt(n)}`):t!=null&&a.push(`context ${wt(t)}`),s!=null&&a.push(`${s}%`),e.model&&a.push(e.model),e.turnCount!=null&&a.push(`${e.turnCount} turns`),e.toolCallCount!=null&&a.push(`${e.toolCallCount} tools`),hr(`\u25A3 ${a.join(" \xB7 ")}`)}function hl(){let e=i("messages");e&&(e.dataset.historyPainting="1",e.innerHTML="",Ye=null,fr.clear())}function br(e=null){let t=i("messages");t&&(delete t.dataset.historyPainting,e==null?He(t,!0):(t.scrollTop=Math.max(0,e),rl(t).setFollowing(vs(t))))}function zn(){let e=i("messages"),t=i("permission-requests");e&&(e.innerHTML="",delete e.dataset.historyPainting),t&&(t.innerHTML=""),c.shellBubble=null,Ye=null,Xe=Ue=null,Nt=dt=null,fr.clear(),Ea.clear()}function Iu(e,t=c.sessionId){return`${t||""}
|
|
65
|
+
${String(e||"")}`}function gl(e,t=c.sessionId){let n=Iu(e,t);!e||Ea.has(n)||(Ea.add(n),Ht("user","You",e,{ts:Date.now(),forceStick:!0}),i("messages")?.lastElementChild?.classList.add("queued-user-msg"))}function Tu(e){if((e.sessionId||c.sessionId)!==c.sessionId)return;let t=Array.isArray(e.items)?e.items.filter(n=>typeof n=="string"&&n.trim()):[];for(let n of t)gl(n,e.sessionId||c.sessionId);t.length&&C(`\u231B Grok queue \xB7 ${t.length} prompt${t.length===1?"":"s"} waiting`)}function Cu(){let e=i("messages");e&&(e.querySelectorAll(".queued-user-msg").forEach(t=>{t.classList.remove("queued-user-msg"),t.classList.add("cancelled-queued-user-msg")}),Ea.clear())}function bl(e,t,n={}){if(!e||!t||e.querySelector(".msg-actions"))return;let s=`a${++cu}`;fr.set(s,{text:t,historyIndex:Number.isInteger(n.historyIndex)?n.historyIndex:null,sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null});let a=!["gemini","cursor"].includes(c.agent||$.peek()||"claude"),o=document.createElement("div");o.className="msg-actions",o.innerHTML=`
|
|
66
66
|
<button type="button" class="msg-action-btn" data-copy-message="${p(s)}" title="Copy answer">Copy</button>
|
|
67
|
-
${a?`<button type="button" class="msg-action-btn" data-fork-message="${p(s)}" title="Start a branch from this answer">Fork</button>`:""}`;let r=e.querySelector(".msg-ts");e.insertBefore(o,r||null)}function
|
|
67
|
+
${a?`<button type="button" class="msg-action-btn" data-fork-message="${p(s)}" title="Start a branch from this answer">Fork</button>`:""}`;let r=e.querySelector(".msg-ts");e.insertBefore(o,r||null)}function Mu(e){let t=i("messages");if(!t)return null;let n=e==="shell-err"?" text-error":"";return t.insertAdjacentHTML("beforeend",`<div class="mx-2 rounded-lg code-surface px-3 py-2 text-sm font-mono${n} whitespace-pre-wrap break-words"></div>`),He(t),t.lastElementChild}function Au(e,t){e&&(e.textContent+=t,He(e.closest("#messages")))}function ju(e){let t=typeof e.input=="object"?JSON.stringify(e.input,null,2):String(e.input||""),s=((typeof e.input=="object"?Object.values(e.input).find(a=>typeof a=="string"&&a.trim()):t)||"").replace(/\n/g," ").slice(0,_e.peek()==="full"?120:80);return{inputStr:t,preview:s}}function al(e,{inBatch:t=!1}={}){let{inputStr:n,preview:s}=ju(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
|
|
68
68
|
<div class="flex items-center gap-1.5 text-xs font-mono">
|
|
69
69
|
<span class="text-warning">\u26A1</span>
|
|
70
70
|
<span class="text-warning font-semibold">${p(e.name||"tool")}</span>
|
|
@@ -72,21 +72,21 @@ ${String(e||"")}`}function ml(e,t=c.sessionId){let n=Lu(e,t);!e||Ea.has(n)||(Ea.
|
|
|
72
72
|
<span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>
|
|
73
73
|
</div>
|
|
74
74
|
<div class="tool-detail">${p(n)}</div>
|
|
75
|
-
</div>`}function
|
|
75
|
+
</div>`}function Du(e){let t=[...new Set(e.names)],n=t.slice(0,4).join(", ")+(t.length>4?"\u2026":""),s=e.el.querySelector(".tool-batch-summary");s&&(s.innerHTML=`<span class="text-warning">\u26A1</span>
|
|
76
76
|
<span class="font-semibold text-base-content/70">${e.count} tool${e.count===1?"":"s"}</span>
|
|
77
77
|
<span class="text-base-content/40 truncate flex-1">${p(n)}</span>
|
|
78
|
-
<span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function pt(){Ye=null}function
|
|
78
|
+
<span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function pt(){Ye=null}function vr(e,t={}){let n=i("messages");if(!n)return;let s=_e.peek()||"normal",a=O(t.ts);if(s==="clean"){if(!Ye||!n.contains(Ye.el)){let u=Ca(a),l=Ma(a);n.insertAdjacentHTML("beforeend",`
|
|
79
79
|
<div class="msg-row assistant px-2" data-ts="${p(l)}">
|
|
80
80
|
<div class="tool-batch w-full max-w-[96%] px-2 py-1.5">
|
|
81
81
|
<div class="tool-batch-summary flex items-center gap-1.5 text-xs font-mono"></div>
|
|
82
82
|
<div class="tool-batch-list"></div>
|
|
83
83
|
</div>
|
|
84
84
|
${u?`<div class="msg-ts" title="${p(l)}">${p(u)}</div>`:""}
|
|
85
|
-
</div>`),Ye={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}Ye.names.push(e.name||"tool"),Ye.count++,Ye.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",
|
|
85
|
+
</div>`),Ye={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}Ye.names.push(e.name||"tool"),Ye.count++,Ye.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",al(e,{inBatch:!0})),Du(Ye),He(n);return}Ye=null;let o=Ca(a),r=Ma(a);n.insertAdjacentHTML("beforeend",`
|
|
86
86
|
<div class="msg-row assistant px-2" data-ts="${p(r)}">
|
|
87
|
-
<div class="w-full max-w-[96%]">${
|
|
87
|
+
<div class="w-full max-w-[96%]">${al(e)}</div>
|
|
88
88
|
${o?`<div class="msg-ts" title="${p(r)}">${p(o)}</div>`:""}
|
|
89
|
-
</div>`),He(n)}function
|
|
89
|
+
</div>`),He(n)}function vl(){let e=i("messages");e&&e.setAttribute("data-density",_e.peek()||"normal")}function _u(e){let t=e.request_id||e.requestId;if(!t||i(`perm-${t}`))return;let n=e.tool_input?JSON.stringify(e.tool_input).slice(0,200):"";i("permission-requests")?.insertAdjacentHTML("beforeend",`
|
|
90
90
|
<div id="perm-${t}" class="perm-banner mx-3 mb-2 rounded-lg border border-warning/25 bg-warning/8 p-3">
|
|
91
91
|
<div class="text-xs text-warning font-semibold mb-1">\u26A0\uFE0F Permission Required</div>
|
|
92
92
|
<div class="font-mono text-xs text-base-content/60 break-all mb-2">
|
|
@@ -96,13 +96,13 @@ ${String(e||"")}`}function ml(e,t=c.sessionId){let n=Lu(e,t);!e||Ea.has(n)||(Ea.
|
|
|
96
96
|
<button class="btn btn-success btn-xs" data-perm-id="${t}" data-perm-allow="1">Allow</button>
|
|
97
97
|
<button class="btn btn-error btn-xs" data-perm-id="${t}" data-perm-allow="0">Deny</button>
|
|
98
98
|
</div>
|
|
99
|
-
</div>`),He(i("messages"))}function
|
|
99
|
+
</div>`),He(i("messages"))}function Nu(){if(ol||typeof marked>"u")return;let e=s=>String(s??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),t=(s,a)=>{let o=String(a||"").trim().split(/\s+/)[0]||"",r=o||"text",d=o?`language-${p(o)}`:"";return`<div class="code-block">
|
|
100
100
|
<div class="code-block-header">
|
|
101
101
|
<span class="code-block-lang">${p(r)}</span>
|
|
102
102
|
<button type="button" class="code-copy" data-copy="1" title="Copy code">Copy</button>
|
|
103
103
|
</div>
|
|
104
104
|
<pre><code class="hljs ${d}">${e(s)}</code></pre>
|
|
105
|
-
</div>`},n={code(s,a){return s&&typeof s=="object"&&s.text!=null?t(s.text,s.lang||a):t(s,a)},table(s,a){return s&&typeof s=="object"&&!Array.isArray(s)&&s.header?!1:`<div class="table-wrap"><table><thead>${s}</thead><tbody>${a}</tbody></table></div>`},html(s){return e(s)}};try{if(typeof marked.use=="function")marked.use({gfm:!0,breaks:!0,renderer:n});else if(typeof marked.setOptions=="function"){let s=new marked.Renderer;s.code=n.code,s.table=n.table,marked.setOptions({gfm:!0,breaks:!0,renderer:s})}}catch(s){console.warn("[md] marked setup failed",s)}
|
|
105
|
+
</div>`},n={code(s,a){return s&&typeof s=="object"&&s.text!=null?t(s.text,s.lang||a):t(s,a)},table(s,a){return s&&typeof s=="object"&&!Array.isArray(s)&&s.header?!1:`<div class="table-wrap"><table><thead>${s}</thead><tbody>${a}</tbody></table></div>`},html(s){return e(s)}};try{if(typeof marked.use=="function")marked.use({gfm:!0,breaks:!0,renderer:n});else if(typeof marked.setOptions=="function"){let s=new marked.Renderer;s.code=n.code,s.table=n.table,marked.setOptions({gfm:!0,breaks:!0,renderer:s})}}catch(s){console.warn("[md] marked setup failed",s)}ol=!0}function La(e){if(typeof marked>"u")return p(e);try{return Nu(),Ve(e,{fallback:()=>p(e)})}catch{return p(e)}}function Pu(e){!e||typeof hljs>"u"||(e.querySelectorAll("pre code:not(.hljs)").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),e.querySelectorAll("pre code.hljs").forEach(t=>{t.classList.add("hljs")}))}function xl(e){Pu(e),xt(e),vt(e)}var on,ys,On,ut,kt,ka,tl,lr,nl,cr,dr,fr,cu,Ea,ur,Fe,sl,rn,cl,Xe,Ue,Nt,dt,vu,ku,$u,Aa,Ye,ol,_a=F(()=>{G();er();W();le();hs();or();ya();_n();Zt();en();ir();_t();_t();on=null;ys=0,On=null,ut=1e3,kt=0,ka=null,tl=!1,lr=!1,nl=null,cr=!1,dr="hubStreamCursors",fr=new Map,cu=0,Ea=new Set,ur="pendingUserTexts",Fe=(()=>{try{let e=JSON.parse(sessionStorage.getItem(ur)||"[]");return Array.isArray(e)?e.filter(t=>t?.key&&t?.text).slice(-30):[]}catch{return[]}})(),sl=new Set,rn=new Map;cl=0;Xe=null,Ue=null,Nt=null,dt=null;vu={haiku:"claude-haiku-4-5",sonnet:"claude-sonnet-4-6",opus:"claude-opus-4-5",sonnet4:"claude-sonnet-4-6",haiku4:"claude-haiku-4-5"};ku=200,$u=500;Aa=[];Ye=null;ol=!1});function wl(e,t){yl=e,xr=t,window.addEventListener("hashchange",()=>{if(yr){yr=!1;return}$l(location.hash.slice(1)||"/")}),De(X,n=>{c.sessionId&&Es()})}function wr(e){let[t,n=""]=String(e||"").split("?",2),s=t.match(/^\/session\/([^/]+)(?:\/([^/]+))?$/);if(!s)return null;let a=new URLSearchParams(n);try{return{id:decodeURIComponent(s[1]),tab:s[2]?decodeURIComponent(s[2]):null,machineId:a.get("machine")||null,agent:a.get("agent")||null}}catch{return null}}function kl(){$l(location.hash.slice(1)||"/")}function $l(e){let t=String(e||"").split("?")[0];if(t==="/settings"){document.dispatchEvent(new CustomEvent("router:settings"));return}if(t==="/notes"){document.dispatchEvent(new CustomEvent("router:notes"));return}let n=wr(e);if(!n){document.dispatchEvent(new CustomEvent("router:home"));return}let{id:s,tab:a,machineId:o,agent:r}=n;!yl||!xr||(s!==c.sessionId?document.dispatchEvent(new CustomEvent("router:session",{detail:{id:s,tab:a,machineId:o,agent:r}})):a&&a!==X.peek()&&xr(a))}function kr(e){yr=!0,location.hash=e}function Es(){if(!c.sessionId)return;let e=new URLSearchParams;c.machineId&&e.set("machine",c.machineId),c.agent&&e.set("agent",c.agent);let t=e.size?`?${e}`:"";kr(`/session/${encodeURIComponent(c.sessionId)}/${encodeURIComponent(X.peek())}${t}`)}function Sl(){if(!c.sessionId)return null;let e=new URL(location.href),t=new URLSearchParams;c.machineId&&t.set("machine",c.machineId),c.agent&&t.set("agent",c.agent);let n=t.size?`?${t}`:"";return e.hash=`/session/${encodeURIComponent(c.sessionId)}/${encodeURIComponent(X.peek())}${n}`,e.toString()}var zm,yl,xr,yr,Na=F(()=>{G();W();zm=Si({"/":()=>{},"/session/*":()=>{},"/session/*/*":()=>{},"*":()=>{}}),yl=null,xr=null,yr=!1});async function Pa(){try{return await Jn.get("sessions")??null}catch{return null}}async function Ll(e){try{await Jn.set("sessions",e,{ttl:Hu})}catch{}}async function El(){try{return await Jn.get("workspaces")??null}catch{return null}}async function Is(e){try{await Jn.set("workspaces",e,{ttl:3600*1e3})}catch{}}async function Il(e){try{return Ts(await Jn.get(`transcript:${e}`))}catch{return null}}async function Tl(e,t){try{await Jn.set(`transcript:${e}`,Ts(t),{ttl:1440*60*1e3})}catch{}}function Ts(e){if(!e?.msgs)return e??null;let t=Math.max(0,e.msgs.length-80);return{...e,msgs:e.msgs.slice(t),meta:{...e.meta,oldestIndex:(e.meta?.oldestIndex||0)+t,truncated:t>0||!!e.meta?.truncated}}}var Jn,Hu,Cs=F(()=>{G();Jn=Li("claude-ui"),Hu=300*1e3});var Mr={};ls(Mr,{closeNotes:()=>Pl,initNotes:()=>Cr,openNotes:()=>Ra});function Ra(){Hl();let e=document.getElementById("notes-page");if(!e)return;e.hidden=!1,document.getElementById("welcome")?.classList.add("hidden");let t=document.getElementById("project-view");t&&(t.classList.add("hidden"),t.style.display="none"),document.documentElement.classList.remove("notes-open"),(location.hash||"")!=="#/notes"&&(location.hash="/notes"),un({keepList:!0})}function Pl({restore:e=!0}={}){let t=document.getElementById("notes-page");if(!t)return;t.hidden=!0,document.documentElement.classList.remove("notes-open"),Ze=null,St=!1;let n=document.getElementById("notes-add-form");if(n&&(n.hidden=!0),!!e)if(c.sessionId){let s=document.getElementById("project-view");s&&(s.classList.remove("hidden"),s.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden")}else{let s=document.getElementById("welcome");s&&(s.classList.remove("hidden"),s.style.display="")}}function Hl(){if(Dl)return;Dl=!0,(document.getElementById("main")||document.getElementById("root")).insertAdjacentHTML("beforeend",zu()),document.addEventListener("router:notes",()=>Ra()),document.getElementById("notes-page").addEventListener("click",s=>{if(s.target.closest("[data-notes-close]")){Pl(),(location.hash||"")==="#/notes"&&history.back();return}let o=s.target.closest("[data-notes-add]");if(o){s.preventDefault(),St=!St;let m=document.getElementById("notes-add-form");m&&(m.hidden=!St),o.textContent=St?"\u6536\u8D77":"+ \u65B0\u589E",St&&document.getElementById("notes-add-text")?.focus();return}if(s.target.closest("[data-notes-submit]")){s.preventDefault(),_l();return}let d=s.target.closest("[data-notes-edit]");if(d){s.preventDefault(),Ju(d.dataset.notesEdit);return}if(s.target.closest("[data-notes-save]")){s.preventDefault(),Vu();return}if(s.target.closest("[data-notes-cancel]")){if(s.preventDefault(),Ze)Qu();else{St=!1;let m=document.getElementById("notes-add-form");m&&(m.hidden=!0);let g=document.querySelector("[data-notes-add]");g&&(g.textContent="+ \u65B0\u589E")}return}let f=s.target.closest("[data-notes-remove]");if(f){s.preventDefault();let m=f.dataset.notesRemove;confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u5F55?")&&ql(m)}});let n=document.getElementById("notes-add-text");n&&n.addEventListener("keydown",s=>{(s.metaKey||s.ctrlKey)&&s.key==="Enter"&&(s.preventDefault(),_l())})}function zu(){return`
|
|
106
106
|
<section id="notes-page" class="notes-page" hidden>
|
|
107
107
|
<header class="notes-header">
|
|
108
108
|
<div>
|
|
@@ -124,21 +124,21 @@ ${String(e||"")}`}function ml(e,t=c.sessionId){let n=Lu(e,t);!e||Ea.has(n)||(Ea.
|
|
|
124
124
|
<ul id="notes-list" class="notes-list">
|
|
125
125
|
<li class="notes-empty">\u52A0\u8F7D\u4E2D\u2026</li>
|
|
126
126
|
</ul>
|
|
127
|
-
</section>`}async function un({keepList:e=!1}={}){let t=document.getElementById("notes-list");if(t){(!e||!dn)&&(t.innerHTML='<li class="notes-empty">\u52A0\u8F7D\u4E2D\u2026</li>');try{dn=(await x("GET","/api/notes?limit=200",void 0,void 0,{hub:!0}))?.items||[],
|
|
128
|
-
<textarea class="notes-edit-text" rows="4">${
|
|
127
|
+
</section>`}async function un({keepList:e=!1}={}){let t=document.getElementById("notes-list");if(t){(!e||!dn)&&(t.innerHTML='<li class="notes-empty">\u52A0\u8F7D\u4E2D\u2026</li>');try{dn=(await x("GET","/api/notes?limit=200",void 0,void 0,{hub:!0}))?.items||[],Tr()}catch(n){t.innerHTML=`<li class="notes-empty notes-error">\u52A0\u8F7D\u5931\u8D25:${n?.message||n}</li>`}}}function Tr(){let e=document.getElementById("notes-list");if(!e)return;let t=document.getElementById("notes-count");t&&(t.textContent=dn?.length?`${dn.length} \u6761\u8BB0\u4E8B \xB7 \u591A\u7AEF\u5B9E\u65F6\u540C\u6B65`:"\u591A\u7AEF\u5B9E\u65F6\u540C\u6B65");let n=document.getElementById("notes-add-form");if(n&&(n.hidden=!St),!dn||dn.length===0){e.innerHTML='<li class="notes-empty">\u8FD8\u6CA1\u6709\u8BB0\u4E8B\u3002\u70B9\u4E0A\u9762\u7684\u300C\u65B0\u589E\u300D\uFF0C\u6216\u8005\u5728 Meta Agent \u91CC\u8F93\u5165\u300C\u8BB0: xxx\u300D</li>';return}e.innerHTML="";for(let s of dn){let a=document.createElement("li");a.className="notes-item",a.dataset.id=s.id,Ze===s.id?a.innerHTML=`
|
|
128
|
+
<textarea class="notes-edit-text" rows="4">${Nl(s.text)}</textarea>
|
|
129
129
|
<div class="notes-item-actions">
|
|
130
130
|
<button class="btn btn-sm btn-primary" data-notes-save>\u4FDD\u5B58</button>
|
|
131
131
|
<button class="btn btn-sm btn-ghost" data-notes-cancel>\u53D6\u6D88</button>
|
|
132
132
|
</div>`:a.innerHTML=`
|
|
133
|
-
<div class="notes-text">${
|
|
133
|
+
<div class="notes-text">${Nl(s.text)}</div>
|
|
134
134
|
<div class="notes-item-foot">
|
|
135
|
-
<span class="notes-meta">${
|
|
135
|
+
<span class="notes-meta">${Yu(s.createdAt)}</span>
|
|
136
136
|
<div class="notes-item-actions">
|
|
137
137
|
<button class="btn btn-ghost btn-xs" data-notes-edit="${s.id}" title="\u7F16\u8F91">\u7F16\u8F91</button>
|
|
138
138
|
<button class="btn btn-ghost btn-xs text-error" data-notes-remove="${s.id}" title="\u5220\u9664">\u5220\u9664</button>
|
|
139
139
|
</div>
|
|
140
|
-
</div>`,e.appendChild(a)}}function
|
|
141
|
-
`);d=m.pop()||"";for(let g of m)if(g.startsWith("event:"))u=g.slice(6).trim();else if(g.startsWith("data:")){let w=g.slice(5).trim();if(!w)continue;let y;try{y=JSON.parse(w)}catch{continue}n[u]?.(y),!n[u]&&n.tool&&(u==="tool_call"&&n.tool({name:y.name,args:y.args,id:y.callId,phase:"start"}),u==="tool_result"&&n.tool({id:y.callId,phase:y.ok===!1?"error":"done",result:y.ok===!1?y.error:y.result})),n.any?.(u,y),u="message"}else g.trim()===""&&(u="message")}}function
|
|
140
|
+
</div>`,e.appendChild(a)}}function Ju(e){Ze=e,Tr()}function Qu(){Ze=null,Tr()}async function Vu(){let e=document.getElementById("notes-list");if(!e)return;let t=e.querySelector(`li[data-id="${Xu(Ze)}"]`);if(!t)return;let n=t.querySelector(".notes-edit-text");if(!n)return;let s=(n.value||"").trim();if(!s){confirm("\u6587\u672C\u4E3A\u7A7A,\u5220\u9664\u8FD9\u6761\u8BB0\u5F55?")&&await ql(Ze);return}try{await x("PATCH",`/api/notes/${Ze}`,{text:s},void 0,{hub:!0}),Ze=null,await un({keepList:!0})}catch(a){alert("\u4FDD\u5B58\u5931\u8D25:"+(a?.message||a))}}async function _l(){let e=document.getElementById("notes-add-text");if(!e)return;let t=(e.value||"").trim();if(!t){e.focus();return}try{await x("POST","/api/notes",{text:t},void 0,{hub:!0}),e.value="",St=!1;let n=document.getElementById("notes-add-form");n&&(n.hidden=!0);let s=document.querySelector("[data-notes-add]");s&&(s.textContent="+ \u65B0\u589E"),await un({keepList:!0})}catch(n){alert("\u4FDD\u5B58\u5931\u8D25:"+(n?.message||n))}}async function ql(e){try{await x("DELETE",`/api/notes/${e}`,void 0,void 0,{hub:!0}),Ze===e&&(Ze=null),await un({keepList:!0})}catch(t){alert("\u5220\u9664\u5931\u8D25:"+(t?.message||t))}}function Yu(e){if(!e)return"";let t=new Date(e),n=s=>String(s).padStart(2,"0");return`${t.getFullYear()}-${n(t.getMonth()+1)}-${n(t.getDate())} ${n(t.getHours())}:${n(t.getMinutes())}`}function Xu(e){return typeof CSS<"u"&&CSS.escape?CSS.escape(e):String(e).replace(/[^a-zA-Z0-9_-]/g,t=>"\\"+t)}function Nl(e){return String(e??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}function Cr(){Hl()}var dn,Ze,Dl,St,As=F(()=>{le();W();dn=null,Ze=null,Dl=!1,St=!1;typeof window<"u"&&(window.addEventListener("hub:note-added",()=>{document.getElementById("notes-page")?.hidden||un()}),window.addEventListener("hub:note-updated",()=>{document.getElementById("notes-page")?.hidden||un()}),window.addEventListener("hub:note-removed",()=>{document.getElementById("notes-page")?.hidden||un()}))});function Yn(e){return Ve(e,{fallback:t=>p(t).replace(/\n/g,"<br>")})}function Xn(e){e&&(typeof hljs<"u"&&e.querySelectorAll("pre code").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),xt(e),vt(e))}async function Dr(e,t,n){let s=ct({"Content-Type":"application/json"},{hub:!0}),a=await fetch(e,{method:"POST",headers:s,body:JSON.stringify(t||{})});if(!a.ok){let l=await a.json().catch(()=>({}));throw new Error(l.error||`HTTP ${a.status}`)}let o=a.body.getReader(),r=new TextDecoder,d="",u="message";for(;;){let{done:l,value:f}=await o.read();if(l)break;d+=r.decode(f,{stream:!0});let m=d.split(`
|
|
141
|
+
`);d=m.pop()||"";for(let g of m)if(g.startsWith("event:"))u=g.slice(6).trim();else if(g.startsWith("data:")){let w=g.slice(5).trim();if(!w)continue;let y;try{y=JSON.parse(w)}catch{continue}n[u]?.(y),!n[u]&&n.tool&&(u==="tool_call"&&n.tool({name:y.name,args:y.args,id:y.callId,phase:"start"}),u==="tool_result"&&n.tool({id:y.callId,phase:y.ok===!1?"error":"done",result:y.ok===!1?y.error:y.result})),n.any?.(u,y),u="message"}else g.trim()===""&&(u="message")}}function Zu(){return`
|
|
142
142
|
<div id="meta-agent-panel" class="meta-agent-panel hidden" aria-hidden="true">
|
|
143
143
|
<div class="meta-agent-backdrop" data-ma-close="1"></div>
|
|
144
144
|
<div class="meta-agent-sheet">
|
|
@@ -318,37 +318,37 @@ ${String(e||"")}`}function ml(e,t=c.sessionId){let n=Lu(e,t);!e||Ea.has(n)||(Ea.
|
|
|
318
318
|
</div>
|
|
319
319
|
</div>
|
|
320
320
|
</div>
|
|
321
|
-
</div>`}function Te(e){qt=e;let t=i("ma-mode-chat"),n=i("ma-mode-history"),s=i("ma-mode-notes"),a=i("ma-mode-report"),o=i("ma-mode-config");for(let[d,u]of[[t,"chat"],[n,"history"],[s,"notes"],[a,"report"],[o,"config"]]){if(!d)continue;let l=e===u;d.classList.toggle("hidden",!l),d.classList.toggle("flex",l)}let r=(d,u)=>{let l=i(d);l&&(l.classList.toggle("border-primary/40",u),l.classList.toggle("text-primary",u))};r("ma-btn-chat",e==="chat"),r("ma-btn-history",e==="history"),r("ma-btn-notes",e==="notes"),r("ma-btn-report",e==="report"),e==="history"&&hn(),e==="notes"&&fn()}function Ds(){let e=i("ma-session-title"),t=i("ma-resume-bar"),n=i("ma-resume-text");if(!we){e&&(e.textContent="\u65B0\u5BF9\u8BDD"),t?.classList.add("hidden");return}let s=qe?.title||we.slice(0,8),a=Ga(qe?.updatedAt);if(e&&(e.textContent=a?`${s} \xB7 ${a}`:s),t&&n){t.classList.remove("hidden");let o=qe?.messageCount;n.textContent=o?`\u5DF2\u52A0\u8F7D\u5386\u53F2 \xB7 ${o} \u6761\u6D88\u606F \xB7 \u53D1\u9001\u5373\u53EF\u7EE7\u7EED`:"\u5DF2\u52A0\u8F7D\u5386\u53F2\u4F1A\u8BDD \xB7 \u53D1\u9001\u5373\u53EF\u7EE7\u7EED"}}function
|
|
321
|
+
</div>`}function Te(e){qt=e;let t=i("ma-mode-chat"),n=i("ma-mode-history"),s=i("ma-mode-notes"),a=i("ma-mode-report"),o=i("ma-mode-config");for(let[d,u]of[[t,"chat"],[n,"history"],[s,"notes"],[a,"report"],[o,"config"]]){if(!d)continue;let l=e===u;d.classList.toggle("hidden",!l),d.classList.toggle("flex",l)}let r=(d,u)=>{let l=i(d);l&&(l.classList.toggle("border-primary/40",u),l.classList.toggle("text-primary",u))};r("ma-btn-chat",e==="chat"),r("ma-btn-history",e==="history"),r("ma-btn-notes",e==="notes"),r("ma-btn-report",e==="report"),e==="history"&&hn(),e==="notes"&&fn()}function Ds(){let e=i("ma-session-title"),t=i("ma-resume-bar"),n=i("ma-resume-text");if(!we){e&&(e.textContent="\u65B0\u5BF9\u8BDD"),t?.classList.add("hidden");return}let s=qe?.title||we.slice(0,8),a=Ga(qe?.updatedAt);if(e&&(e.textContent=a?`${s} \xB7 ${a}`:s),t&&n){t.classList.remove("hidden");let o=qe?.messageCount;n.textContent=o?`\u5DF2\u52A0\u8F7D\u5386\u53F2 \xB7 ${o} \u6761\u6D88\u606F \xB7 \u53D1\u9001\u5373\u53EF\u7EE7\u7EED`:"\u5DF2\u52A0\u8F7D\u5386\u53F2\u4F1A\u8BDD \xB7 \u53D1\u9001\u5373\u53EF\u7EE7\u7EED"}}function _r(e="chat"){let t=i("meta-agent-panel");if(t){if(t.classList.remove("hidden"),t.setAttribute("aria-hidden","false"),Wa=!0,Te(e),e==="chat"){Lt();let n=localStorage.getItem(Rt);!we&&n?Et(n,{silent:!0}).catch(()=>{localStorage.removeItem(Rt)}):Ds()}e==="history"&&Lt().then(()=>hn()),e==="report"&&Vl(),e==="config"&&Yl(),setTimeout(()=>{qt==="chat"&&i("ma-input")?.focus(),qt==="history"&&i("ma-history-search")?.focus()},50)}}function Kl(){let e=i("meta-agent-panel");e&&(e.classList.add("hidden"),e.setAttribute("aria-hidden","true"),Wa=!1)}function zl(){Wa?Kl():_r(qt==="config"?"chat":qt)}function ee(e,t,n={}){let s=i("ma-messages");if(!s)return null;let a=document.createElement("div");return a.className=`ma-msg ma-msg-${e}`,e==="user"?a.innerHTML=`<div class="ma-bubble user">${p(t)}</div>`:e==="assistant"?(a.innerHTML=`<div class="ma-bubble assistant md">${Yn(t)}</div>`,Xn(a)):e==="reasoning"?(a.innerHTML='<details class="ma-reasoning" open><summary>\u601D\u8003\u8FC7\u7A0B</summary><pre style="white-space:pre-wrap"></pre></details>',a.querySelector("pre").textContent=t):e==="error"?a.innerHTML=`<div class="ma-bubble error">${p(t)}</div>`:e==="system"?a.innerHTML=`<div class="ma-sys">${p(t)}</div>`:e==="tool"&&(a.innerHTML=`<details class="ma-tool" data-tool-id="${p(n.id||"")}">
|
|
322
322
|
<summary><span class="ma-tool-name">${p(n.name||"tool")}</span>
|
|
323
323
|
<span class="ma-tool-phase">${p(n.phase||"")}</span></summary>
|
|
324
324
|
<pre class="ma-tool-args" style="white-space:pre-wrap">${p(JSON.stringify(n.args||{},null,2))}</pre>
|
|
325
|
-
</details>`),s.appendChild(a),s.scrollTop=s.scrollHeight,a}function
|
|
325
|
+
</details>`),s.appendChild(a),s.scrollTop=s.scrollHeight,a}function Ol(e,t){let n=e?.querySelector(".ma-bubble");n&&(n.innerHTML=Yn(t),Xn(n),i("ma-messages").scrollTop=i("ma-messages").scrollHeight)}function jr(e,t,n){let s=i("ma-messages");if(!s)return;let a=s.querySelector(`[data-tool-id="${CSS.escape(e)}"]`);if(!a)return;a.classList.toggle("done",t==="done"),a.classList.toggle("error",t==="error");let o=a.querySelector(".ma-tool-phase");if(o&&(o.textContent=t),n!==void 0&&t!=="start"){let r=a.querySelector(".ma-tool-result");r||(r=document.createElement("pre"),r.className="ma-tool-result",r.style.whiteSpace="pre-wrap",a.appendChild(r)),r.textContent=JSON.stringify(n,null,2)}}function ep(e){let t=i("ma-messages");if(!t)return;let n=document.createElement("div");n.className="ma-approval",n.dataset.approvalId=e.id;let s=e.args?.command??"";n.innerHTML=`
|
|
326
326
|
<div class="ma-approval-label">\u26A0 Agent \u60F3\u8981\u6267\u884C\u547D\u4EE4\uFF0C\u662F\u5426\u5141\u8BB8\uFF1F</div>
|
|
327
327
|
<pre class="ma-approval-cmd">${p(s)}</pre>
|
|
328
328
|
<div class="ma-approval-actions">
|
|
329
329
|
<button type="button" class="btn btn-xs btn-error" data-approve="0">\u62D2\u7EDD</button>
|
|
330
330
|
<button type="button" class="btn btn-xs btn-success" data-approve="1">\u5141\u8BB8\u6267\u884C</button>
|
|
331
|
-
</div>`,n.querySelectorAll("[data-approve]").forEach(a=>{a.addEventListener("click",async()=>{let o=a.dataset.approve==="1";n.querySelectorAll("button").forEach(r=>{r.disabled=!0}),n.querySelector(".ma-approval-label").textContent=o?"\u2713 \u5DF2\u5141\u8BB8\uFF0C\u6B63\u5728\u6267\u884C\u2026":"\u2717 \u5DF2\u62D2\u7EDD";try{await x("POST","/api/ai/approve",{id:e.id,approved:o})}catch(r){n.querySelector(".ma-approval-label").textContent=`\u786E\u8BA4\u5931\u8D25\uFF1A${r.message}`}})}),t.appendChild(n),t.scrollTop=t.scrollHeight}function
|
|
331
|
+
</div>`,n.querySelectorAll("[data-approve]").forEach(a=>{a.addEventListener("click",async()=>{let o=a.dataset.approve==="1";n.querySelectorAll("button").forEach(r=>{r.disabled=!0}),n.querySelector(".ma-approval-label").textContent=o?"\u2713 \u5DF2\u5141\u8BB8\uFF0C\u6B63\u5728\u6267\u884C\u2026":"\u2717 \u5DF2\u62D2\u7EDD";try{await x("POST","/api/ai/approve",{id:e.id,approved:o})}catch(r){n.querySelector(".ma-approval-label").textContent=`\u786E\u8BA4\u5931\u8D25\uFF1A${r.message}`}})}),t.appendChild(n),t.scrollTop=t.scrollHeight}function tp(){return Rl+=1,`img${Rl}`}function np(e,t){if(!e)return;let n=e.selectionStart??e.value.length,s=e.selectionEnd??e.value.length;e.value=e.value.slice(0,n)+t+e.value.slice(s),e.selectionStart=e.selectionEnd=n+t.length,e.dispatchEvent(new Event("input"))}async function Bl(e,t){let n=ct({"x-filename":t||`paste-${Date.now()}.png`},{hub:!0});delete n["Content-Type"];let s=await fetch("/api/upload-image",{method:"POST",headers:n,body:e});if(!s.ok){let l=await s.json().catch(()=>({}));throw new Error(l.error||`Upload failed: ${s.status}`)}let{path:a}=await s.json();if(!a)throw new Error("upload returned no path");let o=tp(),r=`[${o}](${a})`,d=i("ma-input");np(d,(d?.value&&!d.value.endsWith(`
|
|
332
332
|
`)&&d.value.length?`
|
|
333
333
|
`:"")+r+`
|
|
334
|
-
`);let u="";try{u=URL.createObjectURL(e)}catch{}return pn.push({path:a,previewUrl:u,label:o,ref:r}),
|
|
334
|
+
`);let u="";try{u=URL.createObjectURL(e)}catch{}return pn.push({path:a,previewUrl:u,label:o,ref:r}),Nr(),{path:a,ref:r,label:o}}function Nr(){let e=i("ma-attach-bar");if(e){if(!pn.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=pn.map((t,n)=>`
|
|
335
335
|
<div class="ma-thumb relative" title="${p(t.ref||t.path)}">
|
|
336
336
|
${t.previewUrl?`<img src="${t.previewUrl}" alt="${p(t.label||"img")}">`:`<span class="ma-thumb-path">${p(t.label||"img")}</span>`}
|
|
337
337
|
<span class="ma-thumb-label">${p(t.label||"")}</span>
|
|
338
338
|
<button type="button" class="ma-thumb-x" data-rm-img="${n}">\u2715</button>
|
|
339
339
|
</div>`).join(""),e.querySelectorAll("[data-rm-img]").forEach(t=>{t.addEventListener("click",()=>{let n=parseInt(t.dataset.rmImg,10),s=pn[n];if(s?.previewUrl)try{URL.revokeObjectURL(s.previewUrl)}catch{}let a=i("ma-input");a&&s?.ref&&(a.value=a.value.split(s.ref).join("").replace(/\n{3,}/g,`
|
|
340
340
|
|
|
341
|
-
`),a.dispatchEvent(new Event("input"))),pn.splice(n,1),
|
|
341
|
+
`),a.dispatchEvent(new Event("input"))),pn.splice(n,1),Nr()})})}}function Ga(e){if(!e)return"";let t=new Date(e);if(Number.isNaN(t.getTime()))return"";let n=String(t.getMonth()+1).padStart(2,"0"),s=String(t.getDate()).padStart(2,"0"),a=String(t.getHours()).padStart(2,"0"),o=String(t.getMinutes()).padStart(2,"0");return`${n}-${s} ${a}:${o}`}async function Lt(){try{Ua=(await x("GET","/api/ai/sessions")).sessions||[]}catch{Ua=[]}return Ua}function Jl(){let e=E.peek(),t=c.sessionId?`${c.agent||$.peek()||"claude"}:${c.sessionId.slice(0,8)}`:"";return{project:e?.path||"",sessionId:c.sessionId||"",agent:c.agent||$.peek()||"claude",summary:[e?.name?`\u9879\u76EE ${e.name}`:"",t?`\u4F1A\u8BDD ${t}`:""].filter(Boolean).join(" \xB7 ")}}function js(){mn=null,Gl=null,i("ma-note-title").value="",i("ma-note-content").value="",i("ma-note-pin").checked=!1,i("ma-note-link-project").checked=!!E.peek()?.path,i("ma-note-link-session").checked=!!c.sessionId,i("ma-note-status").textContent="\u65B0\u8BB0\u4E8B",i("ma-note-delete").disabled=!0,i("ma-note-links").textContent=Jl().summary||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function Ql(e){mn=e?.id||null,Gl=e||null,i("ma-note-title").value=e?.title||"",i("ma-note-content").value=e?.content||"",i("ma-note-pin").checked=!!e?.pinned,i("ma-note-link-project").checked=!!e?.cwd,i("ma-note-link-session").checked=!!e?.sessionId,i("ma-note-status").textContent=e?.updatedAt?`\u4E0A\u6B21\u66F4\u65B0 ${Ga(e.updatedAt)}`:"",i("ma-note-delete").disabled=!e?.id;let t=[];e?.cwd&&t.push(`\u9879\u76EE ${e.cwd.split("/").pop()}`),e?.sessionId&&t.push(`\u4F1A\u8BDD ${e.agent||"claude"}:${e.sessionId.slice(0,8)}`),i("ma-note-links").textContent=t.join(" \xB7 ")||"\u672A\u5173\u8054\u4E0A\u4E0B\u6587"}function sp(){let e=i("ma-note-title")?.value?.trim()||"",t=i("ma-note-content")?.value?.trim()||"";if(!e&&!t){i("ma-note-status").textContent="\u5148\u9009\u4E00\u6761\u8BB0\u4E8B\u6216\u8F93\u5165\u5185\u5BB9";return}let n=[];i("ma-note-link-project")?.checked&&E.peek()?.path&&n.push(`\u9879\u76EE\u8DEF\u5F84\uFF1A${E.peek().path}`),i("ma-note-link-session")?.checked&&c.sessionId&&n.push(`\u5173\u8054\u4F1A\u8BDD\uFF1A${c.agent||$.peek()||"claude"} / ${c.sessionId}`);let s=["\u57FA\u4E8E\u4E0B\u9762\u8FD9\u6761\u5DE5\u4F5C\u8BB0\u4E8B\u56DE\u7B54\uFF0C\u5E76\u7ED3\u5408\u76F8\u5173\u4F1A\u8BDD\u4E0E\u9879\u76EE\u4E0A\u4E0B\u6587\uFF1A",`\u6807\u9898\uFF1A${e||"\u672A\u547D\u540D"}`,t?`\u5185\u5BB9\uFF1A
|
|
342
342
|
${t}`:"",n.length?n.join(`
|
|
343
343
|
`):"","","\u8BF7\u5148\u603B\u7ED3\u8FD9\u6761\u8BB0\u4E8B\u7684\u6838\u5FC3\uFF0C\u518D\u7ED9\u51FA\u4E0B\u4E00\u6B65\u5EFA\u8BAE\u548C\u53EF\u80FD\u98CE\u9669\u3002"].filter(Boolean).join(`
|
|
344
|
-
`);Te("chat"),i("ma-input").value=s,i("ma-input").dispatchEvent(new Event("input")),i("ma-input").focus()}async function Vn(){let e=(
|
|
344
|
+
`);Te("chat"),i("ma-input").value=s,i("ma-input").dispatchEvent(new Event("input")),i("ma-input").focus()}async function Vn(){let e=(Wl||"").trim();return Fa=(await x("GET",`/api/ai/notes?limit=80${e?`&q=${encodeURIComponent(e)}`:""}`)).notes||[],Fa}function fn(){let e=i("ma-notes-list");if(e){if(!Fa.length){e.innerHTML='<div class="text-center text-xs text-base-content/40 py-10">\u8FD8\u6CA1\u6709\u8BB0\u4E8B\u3002</div>';return}e.innerHTML=Fa.map(t=>{let n=t.id===mn,s=[t.scope==="project"?"\u9879\u76EE":t.scope==="session"?"\u4F1A\u8BDD":"\u901A\u7528",t.pinned?"\u7F6E\u9876":""].filter(Boolean).join(" \xB7 ");return`
|
|
345
345
|
<button type="button" class="ma-note-item ${n?"active":""}" data-note-id="${p(t.id)}">
|
|
346
346
|
<div class="text-left">
|
|
347
347
|
<div class="font-medium text-xs truncate">${p(t.title||"\u672A\u547D\u540D")}</div>
|
|
348
348
|
<div class="text-[10px] text-base-content/45 mt-0.5 line-clamp-2">${p(t.content||"")}</div>
|
|
349
349
|
<div class="text-[10px] text-base-content/35 mt-1">${p(s)}${s?" \xB7 ":""}${p(Ga(t.updatedAt)||"")}</div>
|
|
350
350
|
</div>
|
|
351
|
-
</button>`}).join(""),e.querySelectorAll("[data-note-id]").forEach(t=>{t.addEventListener("click",async()=>{try{let n=await x("GET",`/api/ai/notes/${t.dataset.noteId}`);
|
|
351
|
+
</button>`}).join(""),e.querySelectorAll("[data-note-id]").forEach(t=>{t.addEventListener("click",async()=>{try{let n=await x("GET",`/api/ai/notes/${t.dataset.noteId}`);Ql(n),fn()}catch(n){i("ma-note-status").textContent=n.message}})})}}async function ap(){let e=i("ma-note-title")?.value?.trim()||"",t=i("ma-note-content")?.value?.trim()||"";if(!e||!t){i("ma-note-status").textContent="\u6807\u9898\u548C\u5185\u5BB9\u90FD\u4E0D\u80FD\u4E3A\u7A7A";return}let n=Jl(),s={id:mn||void 0,title:e,content:t,pinned:!!i("ma-note-pin")?.checked,cwd:i("ma-note-link-project")?.checked?n.project:"",sessionId:i("ma-note-link-session")?.checked?n.sessionId:"",agent:i("ma-note-link-session")?.checked?n.agent:""};i("ma-note-status").textContent="\u4FDD\u5B58\u4E2D\u2026";let a=await x("POST","/api/ai/notes",s);Ql(a),await Vn(),fn()}async function op(){if(!mn){js();return}confirm("\u5220\u9664\u8FD9\u6761\u8BB0\u4E8B\uFF1F\u4E0D\u53EF\u6062\u590D\u3002")&&(await x("DELETE",`/api/ai/notes/${mn}`),js(),await Vn(),fn())}function hn(){let e=i("ma-history-list");if(!e)return;let t=(Fl||"").trim().toLowerCase(),n=Ua;if(t&&(n=n.filter(s=>`${s.title||""} ${s.preview||""} ${s.id||""}`.toLowerCase().includes(t))),!n.length){e.innerHTML=`<div class="text-center text-xs text-base-content/40 py-10">
|
|
352
352
|
${t?"\u6CA1\u6709\u5339\u914D\u7684\u4F1A\u8BDD":"\u8FD8\u6CA1\u6709\u5386\u53F2\u5BF9\u8BDD\u3002\u53D1\u4E00\u6761\u6D88\u606F\u540E\u4F1A\u51FA\u73B0\u5728\u8FD9\u91CC\u3002"}
|
|
353
353
|
</div>`;return}e.innerHTML=n.map(s=>{let a=s.id===we,o=Ga(s.updatedAt)||"",r=s.messageCount||0;return`
|
|
354
354
|
<div class="ma-hist-item ${a?"active":""}" data-hist-id="${p(s.id)}">
|
|
@@ -363,23 +363,23 @@ ${t}`:"",n.length?n.join(`
|
|
|
363
363
|
<button type="button" class="btn btn-ghost btn-xs px-1 text-error" data-hist-del="${p(s.id)}" title="\u5220\u9664">\u2715</button>
|
|
364
364
|
</div>
|
|
365
365
|
</div>
|
|
366
|
-
</div>`}).join(""),e.querySelectorAll("[data-hist-open]").forEach(s=>{s.addEventListener("click",async()=>{await Et(s.dataset.histOpen),Te("chat"),i("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-resume]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation(),await Et(s.dataset.histResume),Te("chat"),i("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-del]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation();let o=s.dataset.histDel;if(confirm("\u5220\u9664\u8BE5\u5386\u53F2\u4F1A\u8BDD\uFF1F\u4E0D\u53EF\u6062\u590D\u3002"))try{await x("DELETE",`/api/ai/sessions/${o}`),we===o&&(we=null,qe=null,localStorage.removeItem(Rt),Et(null)),await Lt(),hn()}catch(r){alert(r.message)}})})}function
|
|
367
|
-
`)||"[\u2026]"}function
|
|
366
|
+
</div>`}).join(""),e.querySelectorAll("[data-hist-open]").forEach(s=>{s.addEventListener("click",async()=>{await Et(s.dataset.histOpen),Te("chat"),i("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-resume]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation(),await Et(s.dataset.histResume),Te("chat"),i("ma-input")?.focus()})}),e.querySelectorAll("[data-hist-del]").forEach(s=>{s.addEventListener("click",async a=>{a.stopPropagation();let o=s.dataset.histDel;if(confirm("\u5220\u9664\u8BE5\u5386\u53F2\u4F1A\u8BDD\uFF1F\u4E0D\u53EF\u6062\u590D\u3002"))try{await x("DELETE",`/api/ai/sessions/${o}`),we===o&&(we=null,qe=null,localStorage.removeItem(Rt),Et(null)),await Lt(),hn()}catch(r){alert(r.message)}})})}function Ul(e){return typeof e=="string"?e:Array.isArray(e)&&e.map(t=>typeof t=="string"?t:t?.type==="text"?t.text||"":t?.type==="image_url"?"[\u56FE\u7247]":"").filter(Boolean).join(`
|
|
367
|
+
`)||"[\u2026]"}function rp(e){let t=i("ma-messages");if(t){if(t.innerHTML="",!e?.length){ee("system","\u6B64\u4F1A\u8BDD\u6682\u65E0\u6D88\u606F\u3002");return}for(let n of e){if(n.role==="user"){ee("user",Ul(n.content));continue}if(n.role==="assistant"){if(n.reasoning&&(ee("reasoning",n.reasoning).querySelector("details").open=!1),n.content&&ee("assistant",typeof n.content=="string"?n.content:Ul(n.content)),n.tool_calls?.length)for(let s of n.tool_calls){let a=s.function?.name||s.name||"tool",o={};try{o=JSON.parse(s.function?.arguments||s.arguments||"{}")}catch{}ee("tool","",{name:a,args:o,phase:"history",id:s.id||a})}continue}if(n.role==="tool"){let s=n.content;try{s=JSON.parse(n.content)}catch{}let a=n.tool_call_id||"";if(a)jr(a,typeof s=="string"&&s.startsWith("error:")?"error":"done",s);else{ee("tool","",{name:"tool_result",args:{},phase:"done",id:`tr_${Math.random().toString(36).slice(2,8)}`});let o=t.querySelectorAll(".ma-tool"),r=o[o.length-1];if(r){r.classList.add("done");let d=r.querySelector(".ma-tool-result");d||(d=document.createElement("pre"),d.className="ma-tool-result",d.style.whiteSpace="pre-wrap",r.appendChild(d)),d.textContent=typeof s=="string"?s.slice(0,500):JSON.stringify(s,null,2)}}}}t.scrollTop=t.scrollHeight}}async function ip(){if(!we){await Et(null);return}if(confirm("\u5220\u9664\u5F53\u524D Meta Agent \u4F1A\u8BDD\uFF1F\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"))try{await x("DELETE",`/api/ai/sessions/${we}`),we=null,qe=null,localStorage.removeItem(Rt),await Lt(),await Et(null),qt==="history"&&hn()}catch(e){ee("error",e.message)}}async function Et(e,t={}){if(!e){we=null,qe=null,localStorage.removeItem(Rt);let n=i("ma-messages");return n&&(n.innerHTML=""),ee("system","\u65B0\u5BF9\u8BDD \u2014 \u8D34\u56FE \u2192 [imgN](\u8DEF\u5F84)\uFF1B\u9700\u8981\u770B\u56FE\u65F6\u8C03\u7528 VLM\u3002\u5386\u53F2\u5728\u300C\u5386\u53F2\u300D\u9875\uFF0C\u53EF\u968F\u65F6 resume\u3002"),Ds(),null}try{let n=await x("GET",`/api/ai/sessions/${e}`);return we=n.id,qe={id:n.id,title:n.title,updatedAt:n.updatedAt,messageCount:(n.messages||[]).length},localStorage.setItem(Rt,n.id),rp(n.messages||[]),t.silent||ee("system","\u2191 \u5386\u53F2\u5DF2\u52A0\u8F7D\u3002\u5728\u4E0B\u65B9\u7EE7\u7EED\u8F93\u5165\u5373\u53EF resume\uFF08\u670D\u52A1\u7AEF\u4FDD\u7559\u5B8C\u6574 tool / VLM \u4E0A\u4E0B\u6587\uFF09\u3002"),Ds(),qt==="history"&&hn(),n}catch(n){throw t.silent||ee("error",n.message),n}}async function Ba(){if(Qn)return;let e=i("ma-input"),t=(e?.value||"").trim();if(!t)return;Qn=!0,i("ma-send").disabled=!0,ee("user",t),e.value="",e.style.height="";for(let o of pn)if(o.previewUrl)try{URL.revokeObjectURL(o.previewUrl)}catch{}pn=[],Nr();let n=null,s="",a=null;try{await Dr("/api/ai/chat",{message:t,sessionId:we},{session:o=>{we=o.id,qe={...qe||{},id:o.id,title:o.title||qe?.title||t.slice(0,40),updatedAt:Date.now()},localStorage.setItem(Rt,o.id),Ds()},round_start:()=>{n=null,a&&(a.querySelector("details").open=!1),a=null},reasoning:o=>{a||(a=ee("reasoning","")),a.querySelector("pre").textContent=o.content||""},tool_call:o=>{ee("tool","",{name:o.name,args:o.args,phase:"\u6267\u884C\u4E2D",id:o.callId})},tool_result:o=>jr(o.callId,o.ok===!1?"error":"done",o.ok===!1?o.error:o.result),content:o=>{s=o.content||"",n||(n=ee("assistant","")),Ol(n,s)},tool:o=>{o.phase==="start"?ee("tool","",{name:o.name,args:o.args,phase:"start",id:o.id}):jr(o.id,o.phase,o.result)},approval:o=>ep(o),done:o=>{o.sessionId&&(we=o.sessionId,localStorage.setItem(Rt,o.sessionId)),(o.title||o.sessionId)&&(qe={id:we,title:o.title||qe?.title||"\u5BF9\u8BDD",updatedAt:Date.now(),messageCount:(qe?.messageCount||0)+2}),o.content&&(n||(n=ee("assistant","")),Ol(n,o.content)),a&&(a.querySelector("details").open=!1),Ds(),Lt()},error:o=>{ee("error",o.message||"error")}})}catch(o){ee("error",o.message)}finally{Qn=!1,i("ma-send").disabled=!1}}async function lp(){if(Qn)return;Qn=!0;let e=parseInt(i("ma-report-days")?.value||"1",10),t=i("ma-report-body");t.innerHTML=`<div class="text-sm text-base-content/50 py-6 text-center">\u6B63\u5728\u6C47\u603B\u8FD1 ${e} \u5929\u6D3B\u52A8\u2026</div>`,i("ma-gen-report").disabled=!0;let n="",s=document.createElement("div");s.className="ma-report-tools flex flex-col gap-1 mb-3";try{await Dr("/api/ai/report",{days:e},{content:a=>{n=a.content||"",t.innerHTML="",t.appendChild(s);let o=document.createElement("div");o.className="md ma-report-md",o.innerHTML=Yn(n),Xn(o),t.appendChild(o)},tool:a=>{if(a.phase==="start"){let o=document.createElement("div");o.className="ma-tool",o.dataset.toolId=a.id||a.name,o.innerHTML=`<span class="ma-tool-name">${p(a.name)}</span> <span class="ma-tool-phase">start</span>`,s.appendChild(o)}else{let o=s.querySelector(`[data-tool-id="${CSS.escape(a.id||a.name)}"]`);o&&(o.classList.add(a.phase==="error"?"error":"done"),o.querySelector(".ma-tool-phase").textContent=a.phase)}},done:a=>{if(a.content){t.innerHTML="",t.appendChild(s);let o=document.createElement("div");o.className="md ma-report-md",o.innerHTML=Yn(a.content),Xn(o),t.appendChild(o)}},error:a=>{t.innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}})}catch(a){t.innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}finally{Qn=!1,i("ma-gen-report").disabled=!1}}async function Vl(){try{let e=new Date,t=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`,n=await x("GET",`/api/ai/reports/${t}`);if(n?.markdown){let s=i("ma-report-body");s.innerHTML=`
|
|
368
368
|
<div class="text-[10px] text-base-content/40 mb-2">${p(n.title||t)} \xB7 ${p(n.generatedAt||"")}</div>
|
|
369
|
-
<div class="md ma-report-md">${Yn(n.markdown)}</div>`,Xn(s)}}catch{}}async function
|
|
369
|
+
<div class="md ma-report-md">${Yn(n.markdown)}</div>`,Xn(s)}}catch{}}async function cp(){let e=i("ma-report-list");try{let t=await x("GET","/api/ai/reports");e.classList.remove("hidden");let n=t.reports||[];if(!n.length){e.innerHTML='<div class="text-xs text-base-content/40 px-2 py-1">\u6682\u65E0\u5386\u53F2\u62A5\u544A</div>';return}e.innerHTML=n.map(s=>`
|
|
370
370
|
<button type="button" class="ma-report-item w-full text-left px-2 py-1 rounded hover:bg-base-200 text-xs"
|
|
371
371
|
data-day="${p(s.day)}">
|
|
372
372
|
<span class="font-semibold">${p(s.day)}</span>
|
|
373
373
|
<span class="text-base-content/45 ml-1">${p(s.title||"")}</span>
|
|
374
374
|
</button>`).join(""),e.querySelectorAll("[data-day]").forEach(s=>{s.addEventListener("click",async()=>{try{let a=await x("GET",`/api/ai/reports/${s.dataset.day}`),o=i("ma-report-body");o.innerHTML=`
|
|
375
375
|
<div class="text-[10px] text-base-content/40 mb-2">${p(a.title||a.day)} \xB7 ${p(a.generatedAt||"")}</div>
|
|
376
|
-
<div class="md ma-report-md">${Yn(a.markdown)}</div>`,Xn(o)}catch(a){i("ma-report-body").innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}})})}catch(t){e.classList.remove("hidden"),e.innerHTML=`<div class="text-xs text-error px-2">${p(t.message)}</div>`}}async function
|
|
377
|
-
<div class="aspect-square rounded-xl flex flex-col items-center justify-center p-2 relative transition-all min-h-[50px] md:min-h-[60px] ${
|
|
376
|
+
<div class="md ma-report-md">${Yn(a.markdown)}</div>`,Xn(o)}catch(a){i("ma-report-body").innerHTML=`<div class="alert alert-error text-sm">${p(a.message)}</div>`}})})}catch(t){e.classList.remove("hidden"),e.innerHTML=`<div class="text-xs text-error px-2">${p(t.message)}</div>`}}async function Yl(){try{let e=await x("GET","/api/ai/config");i("ma-cfg-url").value=e.url||"",i("ma-cfg-model").value=e.model||"",i("ma-cfg-key").placeholder=e.hasKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"API Key",i("ma-cfg-key").value="",i("ma-cfg-vlm-url").value=e.vlm_url||"",i("ma-cfg-vlm-model").value=e.vlm_model||"",i("ma-cfg-vlm-key").value="",i("ma-cfg-vlm-key").placeholder=e.hasVlmKey?"\u5DF2\u914D\u7F6E \xB7 \u7559\u7A7A\u4E0D\u4FEE\u6539":"\u53EF\u9009",i("ma-cfg-system").value=e.system||"",i("ma-auto-report")&&(i("ma-auto-report").checked=!!e.auto_report),i("ma-auto-hour")&&(i("ma-auto-hour").value=String(e.auto_report_hour??18)),_s(e)}catch(e){i("ma-cfg-status").textContent=e.message}}async function dp(){let e=i("ma-cfg-status");e.textContent="\u4FDD\u5B58\u4E2D\u2026";try{let t={url:i("ma-cfg-url").value.trim(),model:i("ma-cfg-model").value.trim(),vlm_url:i("ma-cfg-vlm-url").value.trim(),vlm_model:i("ma-cfg-vlm-model").value.trim(),system:i("ma-cfg-system").value,auto_report:!!i("ma-auto-report")?.checked,auto_report_hour:parseInt(i("ma-auto-hour")?.value||"18",10)},n=i("ma-cfg-key").value.trim(),s=i("ma-cfg-vlm-key").value.trim();n&&(t.key=n),s&&(t.vlm_key=s);let a=await x("PUT","/api/ai/config",t);e.textContent=a.hasKey?"\u5DF2\u4FDD\u5B58 \u2713":"\u5DF2\u4FDD\u5B58\uFF08\u672A\u8BBE\u7F6E Key\uFF09",i("ma-cfg-key").value="",i("ma-cfg-vlm-key").value="",_s(a)}catch(t){e.textContent=t.message}}function _s(e){if(Oa&&(clearInterval(Oa),Oa=null),!e?.auto_report)return;let t=e.auto_report_hour??18;Oa=setInterval(async()=>{if(!c.token)return;let n=new Date;if(n.getHours()!==t)return;let s=`${n.getFullYear()}-${String(n.getMonth()+1).padStart(2,"0")}-${String(n.getDate()).padStart(2,"0")}`;if(Ar!==s&&!(n.getMinutes()>10))try{Ar=s,localStorage.setItem("ai_last_auto_report",s),await Dr("/api/ai/report",{days:e.auto_report_days||1},{done:()=>{console.info("[meta-agent] auto report saved for",s)},error:a=>console.warn("[meta-agent] auto report",a.message)})}catch(a){console.warn("[meta-agent] auto report failed",a),Ar="",localStorage.removeItem("ai_last_auto_report")}},60*1e3)}function Xl(){i("meta-agent-panel")||(document.getElementById("root")?.insertAdjacentHTML("beforeend",Zu()),document.querySelectorAll("[data-ma-close]").forEach(e=>{e.addEventListener("click",Kl)}),i("ma-btn-chat")?.addEventListener("click",()=>Te("chat")),i("ma-btn-history")?.addEventListener("click",async()=>{await Lt(),Te("history")}),i("ma-btn-notes")?.addEventListener("click",async()=>{await Vn(),mn||js(),Te("notes")}),i("ma-open-history")?.addEventListener("click",async()=>{await Lt(),Te("history")}),i("ma-btn-report")?.addEventListener("click",()=>{Te("report"),Vl()}),i("ma-btn-config")?.addEventListener("click",()=>{Te("config"),Yl()}),i("ma-send")?.addEventListener("click",Ba),i("ma-input")?.addEventListener("keydown",e=>{(e.metaKey||e.ctrlKey)&&e.key==="Enter"&&(e.preventDefault(),Ba())}),i("ma-input")?.addEventListener("input",()=>{let e=i("ma-input");e.style.height="auto",e.style.height=Math.min(e.scrollHeight,120)+"px"}),i("ma-new-chat")?.addEventListener("click",()=>{Et(null),Te("chat")}),i("ma-del-session")?.addEventListener("click",ip),i("ma-resume-focus")?.addEventListener("click",()=>{i("ma-input")?.focus()}),i("ma-history-refresh")?.addEventListener("click",async()=>{await Lt(),hn()}),i("ma-history-new")?.addEventListener("click",()=>{Et(null),Te("chat")}),i("ma-history-search")?.addEventListener("input",e=>{Fl=e.target.value||"",hn()}),i("ma-quick-today")?.addEventListener("click",()=>{Te("chat"),i("ma-input").value="\u6839\u636E\u6211\u6700\u8FD1\u7684\u4F1A\u8BDD\uFF0C\u603B\u7ED3\u4ECA\u5929\u6211\u505A\u4E86\u4EC0\u4E48\uFF1F\u6309\u9879\u76EE\u5217\u51FA\u4EAE\u70B9\u4E0E\u672A\u5B8C\u6210\u4E8B\u9879\u3002",Ba()}),i("ma-quick-projects")?.addEventListener("click",()=>{Te("chat"),i("ma-input").value="\u5217\u51FA\u6700\u8FD1 14 \u5929\u6D3B\u8DC3\u7684\u9879\u76EE\uFF0C\u6BCF\u4E2A\u9879\u76EE\u4E00\u53E5\u8BDD\u8BF4\u660E\u6700\u8FD1\u5728\u505A\u4EC0\u4E48\u3002",Ba()}),i("ma-gen-report")?.addEventListener("click",lp),i("ma-load-reports")?.addEventListener("click",cp),i("ma-notes-refresh")?.addEventListener("click",async()=>{await Vn(),fn()}),i("ma-notes-new")?.addEventListener("click",()=>{js(),fn(),i("ma-note-title")?.focus()}),i("ma-notes-search")?.addEventListener("input",async e=>{Wl=e.target.value||"",await Vn(),fn()}),i("ma-note-save")?.addEventListener("click",async()=>{try{await ap()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-delete")?.addEventListener("click",async()=>{try{await op()}catch(e){i("ma-note-status").textContent=e.message}}),i("ma-note-ask")?.addEventListener("click",sp),i("ma-cfg-save")?.addEventListener("click",dp),i("ma-auto-report")?.addEventListener("change",async()=>{try{let e=await x("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report").checked,auto_report_hour:parseInt(i("ma-auto-hour")?.value||"18",10)});_s(e)}catch{}}),i("ma-auto-hour")?.addEventListener("change",async()=>{try{let e=await x("PUT","/api/ai/config",{auto_report:!!i("ma-auto-report")?.checked,auto_report_hour:parseInt(i("ma-auto-hour").value||"18",10)});_s(e)}catch{}}),i("ma-image-input")?.addEventListener("change",async e=>{let t=[...e.target.files||[]],n=i("ma-input");n&&(n.disabled=!0);try{for(let s of t)if(s.type.startsWith("image/")){if(s.size>12*1024*1024){ee("error",`${s.name} \u8FC7\u5927 (>12MB)`);continue}await Bl(s,s.name||`upload-${Date.now()}.png`)}}catch(s){ee("error",`\u56FE\u7247\u4E0A\u4F20\u5931\u8D25: ${s.message}`)}finally{e.target.value="",n&&(n.disabled=!1,n.focus())}}),document.addEventListener("paste",async e=>{if(!Wa||qt!=="chat")return;let t=i("ma-input"),n=i("meta-agent-panel"),s=document.activeElement;if(!n||!s||!n.contains(s))return;let o=[...e.clipboardData?.items||[]].filter(r=>r.type.startsWith("image/"));if(o.length){e.preventDefault(),t&&(t.disabled=!0);try{for(let r of o){let d=r.getAsFile();if(!d)continue;let u=(r.type.split("/")[1]||"png").replace(/[^a-z0-9]/gi,"")||"png";await Bl(d,`paste-${Date.now()}.${u}`)}}catch(r){ee("error",`\u7C98\u8D34\u56FE\u7247\u5931\u8D25: ${r.message}`)}finally{t&&(t.disabled=!1,t.focus())}}}),Et(null,{silent:!0}),js())}function Ns(){c.token&&(M.peek()&&!ps()||(Lt(),Vn().catch(()=>{}),x("GET","/api/ai/config").then(_s).catch(()=>{})))}var Wa,qt,Qn,we,qe,pn,Rl,Oa,Ar,Ua,Fl,Fa,Wl,mn,Gl,Rt,Ps=F(()=>{G();le();W();_n();en();Zt();Wa=!1,qt="chat",Qn=!1,we=null,qe=null,pn=[],Rl=0,Oa=null,Ar=localStorage.getItem("ai_last_auto_report")||"",Ua=[],Fl="",Fa=[],Wl="",mn=null,Gl=null,Rt="ma_last_session_id"});function Pr(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function bn(){let e=Pr(ne.peek()),t=D.peek();M.peek()&&t&&(e=e.filter(s=>s&&(!s.machineId||s.machineId===t)));let n=ye.peek();return n&&n!=="all"&&(e=e.filter(s=>s&&(s.agent||"claude")===n)),e}function tc(e){let t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0");return`${t}-${n}-${s}`}function up(e,t){let n=[],a=new Date(e,t,1).getDay(),r=new Date(e,t+1,0).getDate(),d=new Date(e,t,0).getDate();for(let l=a-1;l>=0;l--)n.push({date:new Date(e,t-1,d-l),isCurrentMonth:!1});for(let l=1;l<=r;l++)n.push({date:new Date(e,t,l),isCurrentMonth:!0});let u=7-n.length%7;if(u<7)for(let l=1;l<=u;l++)n.push({date:new Date(e,t+1,l),isCurrentMonth:!1});return n}function nc(e,t){let n=new Date(e.getFullYear(),e.getMonth(),e.getDate()).getTime(),s=n+1440*60*1e3;return t.filter(a=>{let o=O(a.updatedAt);return o!=null&&o>=n&&o<s})}function sc(e){return e==null||isNaN(e)?"0":e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${(e/1e3).toFixed(1)}K`:String(e)}function vn(e){let t=i("calendar-grid");if(!t)return;e=Pr(e??bn());let n=i("calendar-month-year");if(n){let f=new Date(Ka,gn,1);n.textContent=f.toLocaleDateString([],{month:"long",year:"numeric"})}let s=e.length,a=new Set(e.map(f=>f.cwd).filter(Boolean)).size,o=e.reduce((f,m)=>f+(Number(m.totalTokens)||0),0),r=i("stats-total-sessions"),d=i("stats-total-projects"),u=i("stats-total-tokens");r&&(r.textContent=String(s)),d&&(d.textContent=String(a)),u&&(u.textContent=sc(o));let l=up(Ka,gn);Hs||(Hs=tc(new Date)),t.innerHTML=l.map(f=>{let m=f.date,g=tc(m),y=nc(m,e).length,H=m.toDateString()===new Date().toDateString(),me=g===Hs,J="",ue="text-base-content/65",q="border border-transparent",Q="cursor-default",he=f.isCurrentMonth?"":"opacity-25";y>0?(Q="cursor-pointer",y<=2?(J="bg-primary/15",ue="text-primary font-bold",q="border border-primary/30"):y<=5?(J="bg-primary/30",ue="text-primary font-bold",q="border border-primary/50"):(J="bg-primary/60",ue="text-primary-content font-bold",q="border border-primary/80")):(J="bg-base-300/25",f.isCurrentMonth&&(Q="hover:bg-base-300/50")),H?q="border-2 border-primary":me&&(q="border-2 border-accent");let Ae=m.getDate()===1?`<span class="absolute top-0.5 left-1 text-[8px] opacity-60 uppercase">${m.toLocaleDateString([],{month:"short"})}</span>`:"";return`
|
|
377
|
+
<div class="aspect-square rounded-xl flex flex-col items-center justify-center p-2 relative transition-all min-h-[50px] md:min-h-[60px] ${J} ${ue} ${q} ${Q} ${he}"
|
|
378
378
|
data-cal-date="${g}" title="${m.toDateString()}: ${y} session(s)">
|
|
379
379
|
${Ae}
|
|
380
380
|
<span class="text-sm font-semibold">${m.getDate()}</span>
|
|
381
381
|
${y>0?`<span class="text-[10px] mt-0.5 opacity-80 font-medium whitespace-nowrap">${y}s</span>`:""}
|
|
382
|
-
</div>`}).join(""),
|
|
382
|
+
</div>`}).join(""),pp(e),qr()}function pp(e){let t=i("selected-day-title"),n=i("selected-day-sessions");if(!t||!n)return;let[s,a,o]=Hs.split("-").map(Number),r=new Date(s,a-1,o);t.textContent=`Activity on ${r.toLocaleDateString([],{weekday:"short",month:"short",day:"numeric",year:"numeric"})}`,e=Pr(e);let d=nc(r,e),u=d.reduce((f,m)=>f+(Number(m.totalTokens)||0),0),l=i("stats-selected-tokens");if(l&&(l.textContent=sc(u)),!d.length){n.innerHTML='<div class="text-center text-xs text-base-content/40 my-auto py-6">No sessions active on this day</div>';return}d.sort((f,m)=>(O(m.updatedAt)||0)-(O(f.updatedAt)||0)),n.innerHTML=d.map(f=>{let m=O(f.updatedAt),g=m!=null?new Date(m).toLocaleTimeString([],{hour:"2-digit",minute:"2-digit"}):"";return`
|
|
383
383
|
<div class="flex items-center gap-2.5 p-2.5 rounded-lg bg-base-300/40 hover:bg-base-300 border border-base-300/50 cursor-pointer text-left transition-all ${c.sessionId===f.sessionId?"border-primary bg-primary/5":""}"
|
|
384
384
|
data-session-id="${p(f.sessionId)}"
|
|
385
385
|
data-session-cwd="${p(f.cwd||"")}"
|
|
@@ -392,7 +392,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
392
392
|
<div class="text-[10px] text-base-content/40 truncate mt-0.5">${p(f.projectName||qn(f.cwd)||"No workspace")}</div>
|
|
393
393
|
</div>
|
|
394
394
|
<div class="text-[9px] text-base-content/45 font-mono whitespace-nowrap bg-base-300 px-1.5 py-0.5 rounded">${g}</div>
|
|
395
|
-
</div>`}).join("")}function za(e){return`${e.machineId||""}:${e.agent||"claude"}:${e.sessionId}`}function
|
|
395
|
+
</div>`}).join("")}function za(e){return`${e.machineId||""}:${e.agent||"claude"}:${e.sessionId}`}function Hr(){try{let e=JSON.parse(localStorage.getItem(oc)||"[]");return Array.isArray(e)?e.filter(t=>t&&t.sessionId):[]}catch{return[]}}function rc(e){try{localStorage.setItem(oc,JSON.stringify(e))}catch{}}function ic(e){if(!e?.sessionId)return;let t=za(e),n={...e,lastOpenedAt:Date.now()},s=Hr().filter(a=>za(a)!==t);s.unshift(n),rc(s.slice(0,ac)),qr(),Or()}function lc(e){if(!e?.sessionId)return;let t=za(e);rc(Hr().filter(n=>za(n)!==t)),qr(),Or()}function cc(e){return Hr().sort((t,n)=>(O(n.lastOpenedAt)||0)-(O(t.lastOpenedAt)||0)).slice(0,e)}function qr(){let e=i("recent-sessions-list");if(!e)return;let t=cc(6);if(!t.length){e.innerHTML='<div class="col-span-full text-center text-xs text-base-content/40 py-4">No recent sessions</div>';return}e.innerHTML=t.map(n=>{let s=Pn(n.updatedAt);return`
|
|
396
396
|
<div class="flex items-center gap-2.5 p-3 rounded-xl bg-base-200 hover:bg-base-300 border border-base-300/80 cursor-pointer text-left transition-all ${c.sessionId===n.sessionId?"border-primary bg-primary/5":""}"
|
|
397
397
|
data-session-id="${p(n.sessionId)}"
|
|
398
398
|
data-session-cwd="${p(n.cwd||"")}"
|
|
@@ -405,7 +405,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
405
405
|
<div class="text-[10px] text-base-content/40 truncate mt-1">${p(n.projectName||qn(n.cwd)||"No workspace")}</div>
|
|
406
406
|
</div>
|
|
407
407
|
<div class="text-[9px] text-base-content/40 whitespace-nowrap self-start mt-0.5">${s}</div>
|
|
408
|
-
</div>`}).join("")}function xn(){let e=i("recent-menu");e&&(e.classList.add("hidden"),e.classList.remove("recent-menu-open"),e.style.top="",e.style.left="",e.style.right="",e.style.width="",e.style.maxHeight=""),i("recent-menu-backdrop")?.classList.add("hidden")}function
|
|
408
|
+
</div>`}).join("")}function xn(){let e=i("recent-menu");e&&(e.classList.add("hidden"),e.classList.remove("recent-menu-open"),e.style.top="",e.style.left="",e.style.right="",e.style.width="",e.style.maxHeight=""),i("recent-menu-backdrop")?.classList.add("hidden")}function Rr(){let e=i("recent-menu"),t=i("topbar");if(!e||!t)return;let n=t.getBoundingClientRect(),a=Math.round(n.bottom+6),o=window.matchMedia("(max-width: 640px)").matches?8:null;if(e.style.top=`${a}px`,o!=null)e.style.left=`${o}px`,e.style.right=`${o}px`;else{let u=i("btn-recent-sessions")?.getBoundingClientRect();if(u){let l=Math.min(320,window.innerWidth-16),f=u.left;f+l>window.innerWidth-8&&(f=window.innerWidth-l-8),f<8&&(f=8),e.style.left=`${Math.round(f)}px`,e.style.right="auto",e.style.width=`${l}px`}}let r=Math.max(160,window.innerHeight-a-12);e.style.maxHeight=`${Math.min(r,Math.round(window.innerHeight*.7))}px`}function fp(){let e=i("recent-menu");e&&(Or(),e.classList.remove("hidden"),e.classList.add("recent-menu-open"),Rr(),i("recent-menu-backdrop")?.classList.remove("hidden"))}function dc(){let e=i("recent-menu");e&&(e.classList.contains("hidden")?fp():xn())}function Or(){let e=i("recent-menu-list"),t=i("recent-menu-empty"),n=i("recent-menu-count");if(!e)return;let s=cc(ac);if(n&&(n.textContent=s.length?`${s.length}`:""),!s.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=s.map(a=>{let o=Pn(a.updatedAt),r=c.sessionId===a.sessionId&&(!a.machineId||!c.machineId||a.machineId===c.machineId),d=a.machineId?`<span class="text-[9px] font-mono text-base-content/35 truncate max-w-[4.5rem]" title="${p(a.machineId)}">@${p(a.machineId)}</span>`:"";return`
|
|
409
409
|
<div class="recent-menu-item w-full text-left px-2 py-1.5 rounded-md flex items-start gap-2
|
|
410
410
|
${r?"bg-primary/15 text-primary":"hover:bg-base-200"}">
|
|
411
411
|
<button type="button" class="flex min-w-0 flex-1 items-start gap-2 text-left" aria-label="\u6253\u5F00 ${p(bt(a))}"
|
|
@@ -430,8 +430,8 @@ ${t}`:"",n.length?n.join(`
|
|
|
430
430
|
data-dismiss-recent-session="${p(a.sessionId)}"
|
|
431
431
|
data-dismiss-recent-agent="${p(a.agent||"claude")}"
|
|
432
432
|
data-dismiss-recent-machine="${p(a.machineId||"")}">\xD7</button>
|
|
433
|
-
</div>`}).join("")}function
|
|
434
|
-
(original: ${e.display||e.sessionId})`:e.display||"",
|
|
433
|
+
</div>`}).join("")}function uc(e){Hs=e}function Br(e){gn+=e,gn<0?(gn=11,Ka--):gn>11&&(gn=0,Ka++)}var Ka,gn,Hs,ac,oc,Ur=F(()=>{G();W();_t();Ka=new Date().getFullYear(),gn=new Date().getMonth(),Hs=null;ac=15,oc="recentSessionsV1"});var to={};ls(to,{loadAgentsMeta:()=>es,loadAllSessions:()=>We,loadMemoryTab:()=>eo,loadWorkspaces:()=>Zn,markActiveSessionRow:()=>mp,mdToHtml:()=>xc,openMemoryFile:()=>zr,promptCustomModel:()=>Ya,refreshEffortSelect:()=>Va,refreshModelSelect:()=>et,renderProjectGroups:()=>bc,renderSessionList:()=>Kr,renderTimeline:()=>vc,runActivitySearch:()=>Xa,scheduleActivitySearch:()=>Za,sessionItemHtml:()=>Gr,syncSidebarChrome:()=>qs});function pc(e){return!Array.isArray(e)||!e.length?"":e.map(t=>`${t.sessionId}:${t.updatedAt||0}:${t.turnCount||0}:${t.agent||""}`).join("|")}function mp(e,t){let n=t||"claude";document.querySelectorAll("#session-list .session-row").forEach(s=>{let a=s.dataset.sessionId===e&&(s.dataset.sessionAgent||"claude")===n;s.classList.toggle("border-primary",a),s.classList.toggle("bg-primary/5",a),s.classList.toggle("border-transparent",!a);let o=s.querySelector(".session-title-text");o&&(o.classList.toggle("text-primary",a),o.classList.toggle("font-medium",a),o.classList.toggle("text-base-content/85",!a))})}function fc(e){return Array.isArray(e)?e:e&&Array.isArray(e.results)?e.results:e&&Array.isArray(e.sessions)?e.sessions:[]}function hp(e,t){return e?.parentSessionId?z(e.parentAgent||t.agent,e.parentSessionId,e.parentMachineId??t.machineId):""}function gp(e){let t=Array.isArray(e)?e:[],n=new Map(t.map(u=>[z(u.agent,u.sessionId,u.machineId),u])),s=new Map,a=[];for(let u of t){let l=T.peek()?.[z(u.agent,u.sessionId,u.machineId)]?.branch,f=hp(l,u);if(f&&n.has(f)&&f!==z(u.agent,u.sessionId,u.machineId)){let m=s.get(f)||[];m.push(u),s.set(f,m)}else a.push(u)}let o=(u,l)=>(l.updatedAt||0)-(u.updatedAt||0);a.sort(o);for(let u of s.values())u.sort(o);let r=[],d=(u,l,f=new Set)=>{let m=z(u.agent,u.sessionId,u.machineId);if(!f.has(m)){f.add(m),r.push(l?{...u,_branchDepth:l}:u);for(let g of s.get(m)||[])d(g,l+1,f)}};for(let u of a)d(u,0);return r}async function bp(){if(!Fr){Fr=!0;try{Qa++,await We()}finally{Fr=!1}}}function vp({hubIndex:e=!1,offset:t=0}={}){let n=new URLSearchParams;n.set("limit",String(Ja)),t&&n.set("offset",String(t)),(M.peek()||e)&&n.set("index","1");let s=n.toString();return s?`/api/sessions?${s}`:"/api/sessions"}async function We({waitFresh:e=!0,hubIndex:t=!1}={}){let n=D.peek()||null;n!==mc&&(mc=n,Qa=1);let s=++hc,a=fc(await Pa()).slice(0,Ja*Qa);if(a.length){let r=D.peek();if(M.peek()&&r){let d=a.filter(u=>!u.machineId||u.machineId===r);ne.value=d.length?d:a}else ne.value=a}let o=async()=>{let r=[];for(let u=0;u<Qa;u++){let l=vp({hubIndex:t,offset:u*Ja}),f=await x("GET",l,void 0,void 0,{machineId:n||void 0});if(s!==hc)return ne.peek();let m=fc(f);if(r.push(...m),Wr=m.length===Ja,!Wr)break}let d=new Map(r.map(u=>[`${u.machineId||""}:${u.agent}:${u.sessionId}`,u]));return r.splice(0,r.length,...d.values()),pc(r)!==pc(ne.peek())&&(ne.value=r,Ll(r)),r};if(e||!a.length)try{await o()}catch(r){if(!a.length){let d=i("session-list");d&&(d.innerHTML=`<div class="px-3 py-3 text-xs text-error">${p(r.message)}</div>`)}}else o().catch(()=>{})}async function Zn({waitFresh:e=!0}={}){let t=await El();t&&(pe.value=t);let n=async()=>{let s=await x("GET","/api/workspaces");pe.value=s,Is(s)};if(e||!t)try{await n()}catch{}else n().catch(()=>{})}function Gr(e,{showProject:t=!1}={}){let n=c.sessionId===e.sessionId&&(c.agent||$.peek())===(e.agent||"claude"),s=T.peek()?.[z(e.agent,e.sessionId,e.machineId)]||{},a=!!(s.title&&String(s.title).trim()),o=e.snippet&&$e.peek()?e.snippet:bt(e),r=!!s.favorite,d=!!s.hidden,u=!!(s.notes&&String(s.notes).trim()),l=s.branch?.parentSessionId?s.branch:null,f=Math.max(0,Math.min(4,Number(e._branchDepth)||0)),m=Number(e.turnCount)||0,g=m>0&&m<=Wo,w=t?`<div class="text-[10px] text-base-content/40 font-mono truncate" title="${p(e.cwd||"")}">${p(e.projectName||qn(e.cwd)||"\u2014")}</div>`:"",y=[g?`<span class="session-thin-badge" title="Only ${m} turn${m===1?"":"s"}">thin\xB7${m}</span>`:"",a?`<span class="session-renamed-badge" title="Custom name (original: ${p(e.display||"")})">renamed</span>`:"",d?'<span class="session-hidden-badge" title="Hidden">hidden</span>':"",u?`<span class="session-note-dot" title="${p(s.notes)}">\u{1F4DD}</span>`:"",l?`<span class="session-branch-badge" title="Forked from ${p(l.parentAgent||e.agent)}:${p(l.parentSessionId)}">\u2387 fork</span>`:""].filter(Boolean).join(""),H=e.machineId?`<span class="text-[9px] px-1 py-0.5 rounded bg-base-300 text-base-content/50 font-mono flex-shrink-0" title="Machine">${p(e.machineId)}</span>`:"",me=a?`${o}
|
|
434
|
+
(original: ${e.display||e.sessionId})`:e.display||"",J=l?`<div class="session-branch-line" title="Forked from ${p(l.parentAgent||e.agent)} \xB7 ${p(l.parentSessionId)}">\u21B3 ${p(l.parentAgent||e.agent)} \xB7 ${p(l.parentSessionId.slice(0,8))}</div>`:"";return`<div class="session-row ${f?"session-branch":""} px-2.5 py-1.5 cursor-pointer hover:bg-base-300 border-l-2
|
|
435
435
|
${n?"border-primary bg-primary/5":"border-transparent"} ${r?"session-fav":""} ${d?"session-hidden-row":""} ${g?"session-thin":""}"
|
|
436
436
|
style="--branch-depth:${f}"
|
|
437
437
|
data-session-id="${p(e.sessionId)}"
|
|
@@ -467,12 +467,12 @@ ${t}`:"",n.length?n.join(`
|
|
|
467
467
|
title="${d?"Unhide session":"Hide session"}">${d?"\u{1F441}":"\u{1F648}"}</button>
|
|
468
468
|
</div>
|
|
469
469
|
${w}
|
|
470
|
-
${
|
|
470
|
+
${J}
|
|
471
471
|
${y||H?`<div class="flex items-center gap-1 mt-0.5 flex-wrap">${H}${y}</div>`:""}
|
|
472
472
|
</div>
|
|
473
473
|
<span class="text-[9px] text-base-content/30 flex-shrink-0 mt-0.5">${Pn(e.updatedAt)}</span>
|
|
474
474
|
</div>
|
|
475
|
-
</div>`}async function es(){try{let e=await x("GET","/api/agents");return Kt.value=e,et(),e}catch(e){return console.warn("[agents] failed to load model list",e),null}}function Va(){let e=i("sel-effort");if(!e)return;let t
|
|
475
|
+
</div>`}async function es(){try{let e=await x("GET","/api/agents");return Kt.value=e,et(),e}catch(e){return console.warn("[agents] failed to load model list",e),null}}function Va(){let e=i("sel-effort");if(!e)return;let t=$.peek()||"claude",n=_.peek(),s=Qt(t,n),a=te.peek()||"";if(!a){let r=Qe(t,n);r&&s.includes(r)&&(a=r,te.value=r)}let o=['<option value="">effort: off</option>'].concat(s.map(r=>`<option value="${p(r)}" ${r===a?"selected":""}>${p(r)}</option>`));if(e.innerHTML=o.join(""),a&&!s.includes(a)){let r=Qe(t,n);r&&s.includes(r)?(te.value=r,e.value=r):(te.value="",e.value="")}else e.value=a}function et(){let e=i("sel-model");if(!e)return;let t=$.peek()||"claude",n=Oe(t),s=_.peek();if(s&&!n.some(o=>o.value===s)&&(n=[{value:s,label:`${s} \u2605`,custom:!0},...n]),e.innerHTML=n.map(o=>`<option value="${p(o.value)}" ${o.value===s?"selected":""}>${p(o.label)}</option>`).join(""),n.some(o=>o.value===s))e.value=s;else{let o=Be(t)||n[0]?.value;se(o),e.value=o,s=o}let a=i("sel-agent");a&&(a.value=t),Va()}function Ya({editCurrent:e=!1}={}){let t=$.peek()||"claude",n=e&&_.peek()||"",s=e?`Edit model id for ${t}:`:`Add model id for ${t} (saved in this browser):`,a=window.prompt(s,n);if(a==null)return;let o=a.trim();o&&(e&&n&&n!==o&&ra(t).includes(n)&&zo(t,n),Jt(t,o),se(o),et())}function bc(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
|
|
476
476
|
No projects in this range.<br>
|
|
477
477
|
<span class="text-base-content/30">Try \u201CAll\u201D time or another agent.</span>
|
|
478
478
|
</div>`;let t=Cn.value,n=Mn.value,s=!!$e.value.trim(),a=e[0]?.cwd||"(no path)";return e.map(o=>{let r=o.cwd||"(no path)",d=!1;n.has(r)?d=!1:t.has(r)?d=!0:d=s||r===a||e.length<=3;let u=o.machineId?`<span class="text-[9px] font-mono text-base-content/40 flex-shrink-0">@${p(o.machineId)}</span>`:"",l=`
|
|
@@ -484,14 +484,14 @@ ${t}`:"",n.length?n.join(`
|
|
|
484
484
|
${u}
|
|
485
485
|
<span class="text-[9px] text-base-content/30 flex-shrink-0">${Pn(o.updatedAt)}</span>
|
|
486
486
|
</div>
|
|
487
|
-
</div>`,m=
|
|
487
|
+
</div>`,m=gp(o.sessions).slice(0,40),g=o.sessions.length>40?`<div class="px-3 py-1 text-[10px] text-base-content/30">+${o.sessions.length-40} more</div>`:"",w=d?`<div class="pb-1 border-b border-base-300/30">${m.map(y=>Gr(y)).join("")}${g}</div>`:"";return l+w}).join("")}function vc(e){if(!Array.isArray(e)||!e.length)return`<div class="px-3 py-6 text-center text-xs text-base-content/40">
|
|
488
488
|
No recent activity.<br>
|
|
489
489
|
<span class="text-base-content/30">Widen the time range or clear filters.</span>
|
|
490
490
|
</div>`;let t=new Map;for(let n of e){let a=(n.updatedAt?new Date(n.updatedAt):new Date).toLocaleDateString(void 0,{weekday:"short",month:"short",day:"numeric"});t.has(a)||t.set(a,[]),t.get(a).push(n)}return[...t.entries()].map(([n,s])=>`
|
|
491
491
|
<div class="px-2.5 pt-2.5 pb-1 text-[10px] uppercase tracking-wide text-base-content/35 font-medium sticky top-0 bg-base-200/95 backdrop-blur-sm z-[1]">${p(n)}</div>
|
|
492
|
-
${s.map(a=>
|
|
493
|
-
`).join("")}function
|
|
494
|
-
<div class="px-3 pb-4 flex flex-col gap-1">${a.map(o=>`<button type="button" class="memory-file text-left px-3 py-2 rounded-lg border border-base-300 hover:border-primary hover:bg-primary/5" data-memory-file="${p(o.id)}" data-memory-agent="${p(t)}"><span class="font-mono text-xs">${p(o.name)}</span><span class="ml-2 text-[10px] text-base-content/40">${p(o.scope||"")}</span></button>`).join("")}<div id="memory-file-content"></div></div>`}catch(t){e.innerHTML=`<div class="p-4 text-error text-xs">${p(t?.message??String(t))}</div>`}}}async function
|
|
492
|
+
${s.map(a=>Gr(a,{showProject:!0})).join("")}
|
|
493
|
+
`).join("")}function Kr(){let e=ht.value,t=Array.isArray(Dt.value)?Dt.value:[],n=Array.isArray(Vt.value)?Vt.value:[];return(e==="timeline"?vc(t):bc(n))+(Wr?'<button class="btn btn-sm btn-ghost w-full" data-load-more-sessions>\u52A0\u8F7D\u66F4\u591A\u4F1A\u8BDD</button>':"")}function qs(){document.querySelectorAll("[data-view]").forEach(o=>{let r=o.dataset.view===ht.peek();o.classList.toggle("bg-primary/15",r),o.classList.toggle("text-primary",r),o.classList.toggle("font-medium",r),o.classList.toggle("text-base-content/50",!r)}),document.querySelectorAll("[data-agent-filter]").forEach(o=>{o.classList.toggle("active",o.dataset.agentFilter===ye.peek())});let e=i("time-range");e&&e.value!==oa.peek()&&(e.value=oa.peek());let t=i("search-status");if(!t)return;let n=rt.peek(),s=Array.isArray(n?.results)?n.results:null,a=($e.peek()||"").trim();if(gt.peek())t.classList.remove("hidden"),t.textContent="Searching content\u2026";else if(a&&s)t.classList.remove("hidden"),t.textContent=`${s.length} hit${s.length===1?"":"s"}${n.deep===!1?"":" (incl. content)"}`;else if(a)t.classList.remove("hidden"),t.textContent="Local filter only \u2014 type to deep-search";else{let o=Dt.peek(),r=Vt.peek(),d=Array.isArray(o)?o.length:0,u=Array.isArray(r)?r.length:0;t.classList.remove("hidden"),t.textContent=ht.peek()==="projects"?`${u} project${u===1?"":"s"} \xB7 ${d} session${d===1?"":"s"}`:`${d} recent session${d===1?"":"s"}`}}async function Xa(e){let t=(e||"").trim();if(!t){rt.value=null,gt.value=!1;return}gt.value=!0;try{let n=new URLSearchParams({q:t,days:"0",limit:"50",deep:"1"});ye.peek()&&ye.peek()!=="all"&&n.set("agent",ye.peek());let s=await x("GET",`/api/activity?${n}`);$e.peek().trim()===t&&(rt.value={q:t.toLowerCase(),results:s.results||[],deep:!0})}catch(n){$e.peek().trim()===t&&(rt.value={q:t.toLowerCase(),results:[],error:n.message})}finally{gt.value=!1}}function Za(e){clearTimeout(gc);let t=(e||"").trim();if(!t){rt.value=null,gt.value=!1;return}gc=setTimeout(()=>Xa(t),350)}function xc(e){if(!e)return"";if(typeof marked>"u")return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`;try{return Ve(e,{fallback:t=>`<pre class="whitespace-pre-wrap text-xs">${p(t)}</pre>`})}catch{return`<pre class="whitespace-pre-wrap text-xs">${p(e)}</pre>`}}async function eo(){let e=i("memory-area");if(e){if(!c.sessionId){e.innerHTML='<div class="p-4 text-xs text-base-content/40">Open or resume a session to view its memory.</div>';return}e.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let t=c.agent||$.peek()||"claude",n=new URLSearchParams({agent:t}),a=(await x("GET",`/api/sessions/${c.sessionId}/memory?${n}`)).files||[];if(!a.length){e.innerHTML='<div class="p-4 text-base-content/40 text-xs">No memory files available for this agent/session.</div>';return}e.innerHTML=`<div class="p-3 text-[11px] text-base-content/45">${p(t)} \xB7 ${a.length} memory file${a.length===1?"":"s"} \xB7 click to open</div>
|
|
494
|
+
<div class="px-3 pb-4 flex flex-col gap-1">${a.map(o=>`<button type="button" class="memory-file text-left px-3 py-2 rounded-lg border border-base-300 hover:border-primary hover:bg-primary/5" data-memory-file="${p(o.id)}" data-memory-agent="${p(t)}"><span class="font-mono text-xs">${p(o.name)}</span><span class="ml-2 text-[10px] text-base-content/40">${p(o.scope||"")}</span></button>`).join("")}<div id="memory-file-content"></div></div>`}catch(t){e.innerHTML=`<div class="p-4 text-error text-xs">${p(t?.message??String(t))}</div>`}}}async function zr(e,t){let n=i("memory-file-content");if(!(!n||!c.sessionId||!e)){n.innerHTML='<div class="p-3 text-xs text-base-content/40">Loading file\u2026</div>';try{let s=new URLSearchParams({agent:t||c.agent||$.peek()||"claude",file:e}),a=await x("GET",`/api/sessions/${c.sessionId}/memory/file?${s}`);n.innerHTML=`<div class="mt-2 border border-base-300 rounded-lg overflow-hidden"><div class="px-3 py-1.5 bg-base-300/50 text-xs font-mono">${p(a.name)}</div><div class="px-3 py-2 md">${xc(a.content)}</div></div>`}catch(s){n.innerHTML=`<div class="mt-2 p-3 text-error text-xs">${p(s?.message??String(s))}</div>`}}}var Ja,Qa,mc,hc,Wr,Fr,gc,It=F(()=>{G();W();le();Cs();_t();en();Ja=200,Qa=1,mc=null,hc=0,Wr=!1,Fr=!1;document.addEventListener("click",e=>{e.target.closest?.("[data-load-more-sessions]")&&bp().catch(console.warn)});gc=null});function yc(e,t){no=e||"",so=t||""}async function wc(e){let t=i("project-notes-bar");if(t)try{let n=await x("GET",`/api/projects/notes?root=${encodeURIComponent(e)}`);no=n.goal||"",so=n.notes||"",ts(),t.style.display="flex"}catch(n){console.error("Error fetching project notes:",n),t.style.display="none"}}function ts(){let e=i("project-notes-bar");if(!e)return;let t=no||"No goal yet \u2014 click Edit",n=so||"";e.innerHTML=`
|
|
495
495
|
<div class="flex items-start gap-2 w-full">
|
|
496
496
|
<div class="flex-1 min-w-0">
|
|
497
497
|
<div class="truncate">
|
|
@@ -502,7 +502,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
502
502
|
</div>
|
|
503
503
|
<button id="btn-edit-project-notes" class="btn btn-ghost btn-xs px-1.5 hover:bg-base-300 flex-shrink-0">Edit</button>
|
|
504
504
|
</div>
|
|
505
|
-
`}function
|
|
505
|
+
`}function kc(){let e=i("project-notes-bar");e&&(e.innerHTML=`
|
|
506
506
|
<div class="flex flex-col gap-1.5 w-full">
|
|
507
507
|
<div class="flex items-center gap-2">
|
|
508
508
|
<span class="text-[10px] font-bold text-base-content/40 uppercase w-12 flex-shrink-0">Goal</span>
|
|
@@ -519,7 +519,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
519
519
|
<button id="btn-cancel-project-notes" class="btn btn-ghost btn-xs px-2">Cancel</button>
|
|
520
520
|
</div>
|
|
521
521
|
</div>
|
|
522
|
-
`,i("project-goal-input")?.focus())}async function Rs(){try{let e=await x("GET","/api/sessions/meta");T.value=e||{}}catch(e){console.warn("session meta load failed",e)}}function tt(){let e=i("session-notes-bar");if(!e)return;let t=c.sessionId,n=c.agent
|
|
522
|
+
`,i("project-goal-input")?.focus())}async function Rs(){try{let e=await x("GET","/api/sessions/meta");T.value=e||{}}catch(e){console.warn("session meta load failed",e)}}function tt(){let e=i("session-notes-bar");if(!e)return;let t=c.sessionId,n=c.agent||$.peek()||"claude";if(!t){e.style.display="none",e.innerHTML="";return}if(e.querySelector(".session-rename-input"))return;let s=An(n,t),a=(s.notes||"").trim(),o=!!s.favorite,r=!!s.hidden,d=s.branch?.parentSessionId?s.branch:null,l=(s.title||"").trim()||t.slice(0,8);e.style.display="flex",e.innerHTML=`
|
|
523
523
|
<div class="flex-1 min-w-0 flex items-center gap-2">
|
|
524
524
|
<button type="button" class="session-fav-btn ${o?"is-fav":""}" data-fav-toggle="1"
|
|
525
525
|
data-fav-session-id="${p(t)}" data-fav-session-agent="${p(n)}"
|
|
@@ -545,12 +545,12 @@ ${t}`:"",n.length?n.join(`
|
|
|
545
545
|
${d?`<span class="session-branch-current" title="Forked from ${p(d.parentAgent||n)} \xB7 ${p(d.parentSessionId)}">\u2387 from ${p(d.parentSessionId.slice(0,8))}</span>`:""}
|
|
546
546
|
</div>
|
|
547
547
|
<button id="btn-edit-session-notes" class="btn btn-ghost btn-xs px-1.5">Note</button>
|
|
548
|
-
`}function
|
|
548
|
+
`}function $c(){let e=i("session-notes-bar");if(!e||!c.sessionId)return;let t=c.agent||$.peek()||"claude",n=An(t,c.sessionId);e.innerHTML=`
|
|
549
549
|
<input id="session-notes-input" type="text" class="input input-xs input-bordered flex-1 text-xs"
|
|
550
550
|
placeholder="Note for this session\u2026" value="${p(n.notes||"")}">
|
|
551
551
|
<button id="btn-save-session-notes" class="btn btn-primary btn-xs px-2">Save</button>
|
|
552
552
|
<button id="btn-cancel-session-notes" class="btn btn-ghost btn-xs px-2">Cancel</button>
|
|
553
|
-
`;let s=i("session-notes-input");s?.focus(),s?.select()}function ao(){return{favorite:!1,notes:"",title:"",hidden:!1,branch:null}}function oo(e,t){return{favorite:t.favorite!==void 0?!!t.favorite:!!e.favorite,notes:t.notes!==void 0?String(t.notes||""):String(e.notes||""),title:t.title!==void 0?String(t.title||"").trim():String(e.title||"").trim(),hidden:t.hidden!==void 0?!!t.hidden:!!e.hidden,branch:t.branch!==void 0?t.branch||null:e.branch||null,updatedAt:Date.now()}}function
|
|
553
|
+
`;let s=i("session-notes-input");s?.focus(),s?.select()}function ao(){return{favorite:!1,notes:"",title:"",hidden:!1,branch:null}}function oo(e,t){return{favorite:t.favorite!==void 0?!!t.favorite:!!e.favorite,notes:t.notes!==void 0?String(t.notes||""):String(e.notes||""),title:t.title!==void 0?String(t.title||"").trim():String(e.title||"").trim(),hidden:t.hidden!==void 0?!!t.hidden:!!e.hidden,branch:t.branch!==void 0?t.branch||null:e.branch||null,updatedAt:Date.now()}}function Sc(e){return!e?.favorite&&!e?.hidden&&!(e?.notes||"").trim()&&!(e?.title||"").trim()&&!e?.branch}async function Lc(e,t,{machineId:n}={}){let s=n||c.machineId||null,a=z(t,e,s),o=T.peek()?.[a]||ao(),r=!o.favorite;T.value={...T.peek(),[a]:{...o,favorite:r,updatedAt:Date.now()}};try{let d=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,favorite:r,machineId:s||void 0},void 0,{machineId:s||void 0});T.value={...T.peek(),[a]:oo(o,{favorite:d.favorite??r,notes:d.notes,title:d.title,hidden:d.hidden})}}catch(d){T.value={...T.peek(),[a]:o},alert(`Favorite failed: ${d.message}`)}c.sessionId===e&&tt()}async function Ec(e,t,{machineId:n}={}){if(!e)return!1;let s=n||c.machineId||null,a=z(t,e,s),o=T.peek()?.[a]||ao(),r=!o.hidden;T.value={...T.peek(),[a]:{...o,hidden:r,updatedAt:Date.now()}};try{let d=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,hidden:r,machineId:s||void 0},void 0,{machineId:s||void 0}),u=oo(o,{favorite:d.favorite,notes:d.notes,title:d.title,hidden:d.hidden??r});if(Sc(u)){let l={...T.peek()};delete l[a],T.value=l}else T.value={...T.peek(),[a]:u}}catch(d){return T.value={...T.peek(),[a]:o},alert(`Hide failed: ${d.message}`),!1}return c.sessionId===e&&tt(),!0}async function Jr(e,t,n,{machineId:s}={}){let a=s||c.machineId||null,o=z(t,e,a),r=T.peek()?.[o]||ao();try{let d=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,notes:n,machineId:a||void 0},void 0,{machineId:a||void 0});T.value={...T.peek(),[o]:oo(r,{favorite:d.favorite,notes:d.notes??n,title:d.title,hidden:d.hidden})}}catch(d){return alert(`Save note failed: ${d.message}`),!1}return!0}async function xp(e,t,n,{machineId:s}={}){if(!e)return!1;let a=s||c.machineId||null,o=z(t,e,a),r=T.peek()?.[o]||ao(),d=String(n||"").trim().slice(0,200);T.value={...T.peek(),[o]:{...r,title:d,updatedAt:Date.now()}};try{let u=await x("PUT","/api/sessions/meta",{sessionId:e,agent:t,title:d,machineId:a||void 0},void 0,{machineId:a||void 0}),l=oo(r,{favorite:u.favorite,notes:u.notes,title:u.title!==void 0?u.title:d,hidden:u.hidden});if(Sc(l)){let f={...T.peek()};delete f[o],T.value=f}else T.value={...T.peek(),[o]:l}}catch(u){return T.value={...T.peek(),[o]:r},alert(`Rename failed: ${u.message}`),!1}return c.sessionId===e&&tt(),!0}function Qr({sessionId:e,agent:t="claude",machineId:n=null,fallbackDisplay:s="",mountEl:a}={}){if(!e||!a)return;document.querySelectorAll(".session-rename-input").forEach(g=>{g.dispatchEvent(new CustomEvent("session-rename-cancel",{bubbles:!0}))});let r=(An(t,e,n).title||"").trim()||s||e.slice(0,8),d=a.innerHTML,u=a.className;a.classList.add("session-rename-active"),a.innerHTML=`<input type="text" class="session-rename-input input input-xs input-bordered w-full min-w-0 text-xs font-mono"
|
|
554
554
|
value="${p(r)}"
|
|
555
555
|
placeholder="Session name (empty = original)"
|
|
556
556
|
maxlength="200"
|
|
@@ -558,7 +558,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
558
558
|
data-rename-session-id="${p(e)}"
|
|
559
559
|
data-rename-session-agent="${p(t)}"
|
|
560
560
|
data-rename-session-machine="${p(n||"")}"
|
|
561
|
-
autocomplete="off" spellcheck="false" />`;let l=a.querySelector(".session-rename-input");if(!l)return;let f=!1,m=async g=>{if(f)return;f=!0;let w=g?l.value:r;if(a.className=u,!g){a.innerHTML=d;return}await
|
|
561
|
+
autocomplete="off" spellcheck="false" />`;let l=a.querySelector(".session-rename-input");if(!l)return;let f=!1,m=async g=>{if(f)return;f=!0;let w=g?l.value:r;if(a.className=u,!g){a.innerHTML=d;return}await xp(e,t,w,{machineId:n}),document.querySelectorAll(".session-rename-input").forEach(y=>y.remove()),c.sessionId===e&&tt(),T.value={...T.peek()}};l.addEventListener("keydown",g=>{g.stopPropagation(),g.key==="Enter"?(g.preventDefault(),m(!0)):g.key==="Escape"&&(g.preventDefault(),m(!1))}),l.addEventListener("click",g=>g.stopPropagation()),l.addEventListener("mousedown",g=>g.stopPropagation()),l.addEventListener("session-rename-cancel",()=>m(!1)),l.addEventListener("blur",()=>{setTimeout(()=>m(!0),0)}),requestAnimationFrame(()=>{l.focus(),l.select()})}var no,so,Os=F(()=>{G();W();le();no="",so=""});var Cc={};ls(Cc,{closeMachineMenu:()=>kn,enterMachine:()=>Yr,hideMachinePicker:()=>io,refreshMachinesList:()=>yn,renderMachineMenuList:()=>Bs,renderMachinePickerList:()=>ro,showMachinePicker:()=>wn,startMachinePolling:()=>Vr,syncTopbarMachine:()=>Ot});async function yn(){try{let e=await x("GET","/api/machines");ie.value=Array.isArray(e)?e:[]}catch{try{let e=await da();e?.machines&&(ie.value=e.machines)}catch{}}return ie.peek()||[]}function ro(){let e=i("machine-picker-list"),t=i("machine-picker-empty");if(!e)return;let n=ie.peek()||[];if(!n.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=n.map(s=>{let a=s.online!==!1,o=[s.hostname,s.platform].filter(Boolean).join(" \xB7 ");return`
|
|
562
562
|
<button type="button" class="machine-pick-card w-full text-left px-4 py-3 rounded-xl border border-base-300
|
|
563
563
|
hover:border-primary hover:bg-primary/5 transition-colors ${a?"":"opacity-50"}"
|
|
564
564
|
data-pick-machine="${p(s.id)}" ${a?"":"disabled"}>
|
|
@@ -567,7 +567,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
567
567
|
<span class="font-semibold text-sm font-mono">${p(s.id)}</span>
|
|
568
568
|
</div>
|
|
569
569
|
${o?`<div class="text-xs text-base-content/45 mt-1 pl-4">${p(o)}</div>`:""}
|
|
570
|
-
</button>`}).join("")}function wn(){let e=i("machine-picker");if(!e)return;e.classList.remove("hidden"),Ee(),it.value=!1,ro();let t=i("machine-picker-status");if(t){let n=(ie.peek()||[]).filter(s=>s.online!==!1).length;t.textContent=`${n} online`}}function io(){i("machine-picker")?.classList.add("hidden"),Ee(),it.value=!0}function kn(){i("machine-menu")?.classList.add("hidden")}function
|
|
570
|
+
</button>`}).join("")}function wn(){let e=i("machine-picker");if(!e)return;e.classList.remove("hidden"),Ee(),it.value=!1,ro();let t=i("machine-picker-status");if(t){let n=(ie.peek()||[]).filter(s=>s.online!==!1).length;t.textContent=`${n} online`}}function io(){i("machine-picker")?.classList.add("hidden"),Ee(),it.value=!0}function kn(){i("machine-menu")?.classList.add("hidden")}function Bs(){let e=i("machine-menu-list"),t=i("machine-menu-empty");if(!e)return;let n=ie.peek()||[],s=D.peek()||"";if(!n.length){e.innerHTML="",t?.classList.remove("hidden");return}t?.classList.add("hidden"),e.innerHTML=n.map(a=>{let o=a.online!==!1,r=a.id===s,d=[a.hostname,a.platform].filter(Boolean).join(" \xB7 "),u=a.connectedAt?new Date(a.connectedAt).toLocaleTimeString():"";return`
|
|
571
571
|
<button type="button"
|
|
572
572
|
class="machine-menu-item w-full text-left px-2 py-1.5 rounded-md text-xs
|
|
573
573
|
${r?"bg-primary/15 text-primary":"hover:bg-base-200"}
|
|
@@ -581,8 +581,8 @@ ${t}`:"",n.length?n.join(`
|
|
|
581
581
|
<span class="text-[9px] ${o?"text-success":"text-error"}">${o?"online":"offline"}</span>
|
|
582
582
|
</div>
|
|
583
583
|
${d||u?`<div class="text-[10px] text-base-content/40 pl-3.5 mt-0.5 truncate">${p(d)}${u?" \xB7 "+p(u):""}</div>`:""}
|
|
584
|
-
</button>`}).join("")}function
|
|
585
|
-
`):String(
|
|
584
|
+
</button>`}).join("")}function Ot(){let e=i("machine-menu-wrap"),t=i("topbar-machine-label"),n=i("topbar-machine-dot");if(!M.peek()){e?.classList.add("hidden");return}e?.classList.remove("hidden");let s=D.peek()||"",o=(ie.peek()||[]).find(d=>d.id===s),r=o?o.online!==!1:!1;t&&(t.textContent=s||"\u9009\u62E9\u673A\u5668"),n&&(n.classList.toggle("bg-success",!!s&&r),n.classList.toggle("bg-warning",!!s&&!r),n.classList.toggle("bg-base-content/30",!s)),Bs()}function Vr(){Ic||(Ic=setInterval(async()=>{if(!M.peek()||!c.token)return;await yn(),Ot();let e=D.peek();if(e){let t=(ie.peek()||[]).find(n=>n.id===e);if(t&&t.online===!1){let n=i("topbar-machine-label");n&&(n.textContent=`${e} (offline)`)}}},15e3)),Tc||(Tc=setInterval(()=>{document.visibilityState!=="visible"||!M.peek()||!c.token||!D.peek()||We({waitFresh:!1,hubIndex:!0}).catch(()=>{})},2e3))}async function Yr(e,{forceReload:t=!1}={}){if(!e)return;let n=D.peek(),s=n&&n!==e;if(Le(e),io(),kn(),Ot(),s||t){try{c.ws?.close()}catch{}c.ws=null,c.sessionId=null,xe(()=>{E.value=null,ke.value=null,oe.value=null});try{let{filesRoot:o,gitRoot:r,filesPath:d}=await Promise.resolve().then(()=>(W(),Ni));o.value="",r.value="",d.value=""}catch{}if(s){let{goHome:o}=await Promise.resolve().then(()=>(ns(),Xr));o()}}let a=i("topbar-project");a&&!E.peek()&&(a.textContent=`Machine \xB7 ${e}`),Ns(),await Promise.all([We(),Zn(),Rs(),es().catch(()=>{})]),it.value=!0}var Ic,Tc,Us=F(()=>{G();W();le();It();Os();Ps();Dn();Ic=null,Tc=null});var Xr={};ls(Xr,{goHome:()=>po,openProject:()=>Zr,resumeSession:()=>nt,switchTab:()=>Tt});function uo(e){for(let t of["files-machine-hint","git-machine-hint"]){let n=i(t);n&&(e?(n.textContent=`@${e}`,n.classList.remove("hidden"),n.title=`Paths are on machine ${e}`):(n.textContent="",n.classList.add("hidden"),n.title=""))}}function Zr(e){Fs=null,ga(),Da(!1),Un(),Wn(),Kn(),Gn();let t=e?.path||"";xe(()=>{E.value=e,ke.value=t,t&&(re.value=t,Se.value=t,Y.value="",oe.value=null)}),c.sessionId=null,i("topbar-project").textContent=t||"Project";let n=i("files-root-input");n&&t&&(n.value=t);let s=i("git-root-input");s&&t&&(s.value=t),uo(e?.machineId||D.peek()||c.machineId),i("welcome").classList.add("hidden");let a=i("project-view");a.classList.remove("hidden"),a.style.display="flex",zn(),Fn({sessionId:null}),Pt(),Tt("chat")}function po(){Fs=null,ga(),Da(!1),Un(),Wn(),Kn(),Gn(),E.value=null,ke.value=null,re.value="",Se.value="",Y.value="",oe.value=null,c.sessionId=null,Fn({sessionId:null}),uo(null),document.documentElement.classList.remove("boot-restore");let e=i("topbar-project");e&&(e.textContent="Select a session"),Promise.resolve().then(()=>(As(),Mr)).then(({closeNotes:s})=>s({restore:!1})).catch(()=>{});let t=i("welcome");t&&(t.classList.remove("hidden"),t.style.display="",vn(bn()));let n=i("project-view");n&&(n.classList.add("hidden"),n.style.display="none"),kr("/")}async function nt(e,t,n,s,a,o={}){let r=o.tab&&["chat","files","git","shell","memory"].includes(o.tab)?o.tab:"chat",d=o.skipHistory??(r!=="chat"&&r!=="memory"),u=ne.peek().find(L=>L.sessionId===e&&(!a||L.machineId===a||!L.machineId)),l=Xt(),f=l?.sessionId===e?l:null,m=s||u?.agent||f?.agent||"claude",g=a||u?.machineId||f?.machineId||D.peek()||null,w=t||u?.cwd||f?.cwd||null,y=n||u?.configDir||f?.configDir||null;if(Promise.resolve().then(()=>(As(),Mr)).then(({closeNotes:L})=>L({restore:!1})).catch(()=>{}),Un(),Wn(),Kn(),Gn(),g&&g!==c.machineId){Le(g);try{c.ws?.close()}catch{}c.ws=null,Promise.resolve().then(()=>(Us(),Cc)).then(({syncTopbarMachine:L})=>L()).catch(()=>{}),Promise.resolve().then(()=>(It(),to)).then(({loadAllSessions:L})=>L()).catch(()=>{})}c.sessionId=e,Da(!1),yt({sessionId:e,agent:m,machineId:g}).catch(()=>{}),c.configDir=y,c.agent=m,Ne(m),et(),Fn({sessionId:e,agent:m,machineId:g});let H=w;Mc(H,g,e),H&&x("POST","/api/resolve-path",{path:H},void 0,{machineId:g||void 0}).then(L=>{c.sessionId!==e||!L?.path||L.path===H||(H=L.path,Mc(H,g,e),Qo({sessionId:e,cwd:H}))}).catch(()=>{}),zn(),Pt(),Tt(r),Promise.resolve().then(()=>(It(),to)).then(({markActiveSessionRow:L})=>{L(e,m)}).catch(()=>{}),Qo({sessionId:e,cwd:H||w,configDir:y,agent:m,machineId:g,tab:r}),ic({sessionId:e,cwd:H||w,configDir:y,agent:m,machineId:g,display:u?.display||f?.display||"",projectName:u?.projectName||f?.projectName||"",updatedAt:u?.updatedAt||f?.updatedAt||null});let me=Z[m]||m,J=`${c.token||""}:${g||""}:${m}:${e}`,ue=0,q=0,Q=null,he=(L,ge,be={},ae=!1)=>{if(c.sessionId!==e||c.agent!==m||(c.machineId||null)!==g)return;let Ft=++ue,h=i("messages"),v=!!h.querySelector(".msg-row"),k=h.scrollTop,S=h.scrollHeight,B=!v||h.scrollHeight-h.scrollTop-h.clientHeight<80;if(hl(),be.oldestIndex>0){let R=document.createElement("button");R.className="btn btn-sm btn-ghost",R.textContent="\u52A0\u8F7D\u66F4\u65E9\u7684\u6D88\u606F",R.onclick=async()=>{R.disabled=!0;try{let ve=new URLSearchParams({tail:"80",compact:"1",before:String(be.oldestIndex),agent:m});g&&ve.set("machine",g);let Ke=await x("GET",`/api/sessions/${e}/messages?${ve}`,void 0,void 0,{machineId:g||void 0});if(Ft!==ue||c.sessionId!==e)return;let j=[...Ke.messages,...L],ce={...be,oldestIndex:Ke.oldestIndex,truncated:Ke.oldestIndex>0};Q={msgs:j,context:ge,meta:ce},he(j,ge,ce,!0)}catch(ve){R.disabled=!1,R.textContent=`\u52A0\u8F7D\u5931\u8D25\uFF0C\u70B9\u51FB\u91CD\u8BD5 (${ve.message})`}},i("messages").appendChild(R)}if(be.stale&&C("\u5F53\u524D\u663E\u793A\u79BB\u7EBF\u7F13\u5B58\uFF0C\u6B63\u5728\u7B49\u5F85\u673A\u5668\u6062\u590D\u8FDE\u63A5"),!L.length){C(`${me} \xB7 ${e.slice(0,8)}\u2026 \u2014 no history`),br();return}pt();let U=40,A=0,V=()=>{if(c.sessionId!==e||Ft!==ue)return;let R=Math.min(A+U,L.length);for(;A<R;A++){let j=L[A],ce=O(j.ts??j.timestamp),Wt=j.type||(j.role?"text":null);if(Wt==="text"||j.role&&j.content!=null&&!j.name){(j.role==="assistant"||j.role==="user")&&pt();let Ln=typeof j.content=="string"?j.content:Array.isArray(j.content)?j.content.map(kd=>kd?.text||"").filter(Boolean).join(`
|
|
585
|
+
`):String(j.content??"");Ln&&Ht(j.role==="user"?"user":"assistant",j.role==="user"?"You":me,Ln,{ts:ce,historyIndex:(be.oldestIndex||0)+A})}else Wt==="tool_use"||j.name?vr({name:j.name||"tool",input:j.input??j.arguments??{}},{ts:ce}):(Wt==="token_usage"||j.usage)&&(pt(),Bn(j.usage||j))}if(A<L.length){requestAnimationFrame(V);return}pt(),ge&&gr(ge);let ve=L.filter(j=>j.type==="token_usage").length||L.filter(j=>j.role==="user").length,Ke=be.truncated?` (showing last ${L.length} of ${be.total||"?"})`:"";C(`\u2500\u2500 ${me} history \xB7 ${ve} turn${ve!==1?"s":""}${Ke} \u2500\u2500`),br(ae?k+h.scrollHeight-S:B?null:k)};V()},Ae=async({preferCache:L=!0}={})=>{let ge=++q,be=co.get(J)||(L?await Il(J):null);if(!(ge!==q||c.sessionId!==e)){if(L&&be&&be.msgs?.length){let ae=Ts(be);he(ae.msgs,ae.context,ae.meta)}be?.msgs?.length||C(`Loading ${me} history\u2026`);try{let ae=g||D.peek()||c.machineId||null;if(M.peek()&&!ae)throw new Error("\u672A\u9009\u62E9\u673A\u5668\uFF0C\u65E0\u6CD5\u52A0\u8F7D\u5386\u53F2");ae&&c.machineId!==ae&&Le(ae);let Ft=async U=>{let A=new URLSearchParams({tail:"80",compact:"1"});return U&&A.set("agent",U),ae&&A.set("machine",ae),x("GET",`/api/sessions/${e}/messages?${A}`,void 0,void 0,{machineId:ae||void 0,dedupe:!1,cache:"no-store"})},h=mr(),v=await Ft(m);if(ge!==q||c.sessionId!==e)return;let k=Array.isArray(v)?v:v?.messages||[];!k.length&&m&&(v=await Ft(null),k=Array.isArray(v)?v:v?.messages||[]);let S=Array.isArray(v)?null:v?.context||null;if(ge!==q||c.sessionId!==e)return;let B=Array.isArray(v)?{}:{truncated:v?.truncated,total:v?.total,oldestIndex:v?.oldestIndex||0,stale:v?.stale};if(Q&&B.oldestIndex>Q.meta.oldestIndex&&Q.meta.oldestIndex>0){let U=B.oldestIndex-Q.meta.oldestIndex;U<=Q.msgs.length&&(k=[...Q.msgs.slice(0,U),...k],B.oldestIndex=Q.meta.oldestIndex)}if(Q={msgs:k,context:S,meta:B},k.length&&!B.stale){let U={msgs:k,context:S,meta:B,at:Date.now()};co.set(J,Ts(U)),Tl(J,U).catch(()=>{})}else co.delete(J);if(h!==mr()||i("messages")?.querySelector(".live-stream"))return;he(k,S,B)}catch(ae){if(c.sessionId!==e||ge!==q)return;co.delete(J),C(`${me} \xB7 ${e.slice(0,8)}\u2026 (history unavailable: ${ae.message})`)}}};Fs={sessionId:e,agent:m,refresh:()=>Ae({preferCache:!1}).catch(()=>{})},d?Ae().catch(()=>{}):(await new Promise(L=>requestAnimationFrame(L)),Ae().catch(()=>{})),Es(),tt()}function Mc(e,t,n){if(e){let s=e.split("/").filter(Boolean).pop()||e;xe(()=>{E.value={id:s,name:s,path:e,machineId:t},ke.value=e,re.value=e,Se.value=e,Y.value="",oe.value=null}),i("topbar-project").textContent=t?`${e} @${t}`:e;let a=i("files-root-input");a&&(a.value=e);let o=i("git-root-input");o&&(o.value=e),uo(t),i("welcome")?.classList.add("hidden");let r=i("project-view");r&&(r.classList.remove("hidden"),r.style.display="flex",r.style.flexDirection="column",r.style.flex="1",r.style.minHeight="0",r.style.overflow="hidden")}else{i("welcome")?.classList.add("hidden");let s=i("project-view");s&&(s.classList.remove("hidden"),s.style.display="flex",s.style.flexDirection="column",s.style.flex="1",s.style.minHeight="0"),uo(t)}}function Tt(e){X.value=e}var Fs,lo,co,ns=F(()=>{G();W();le();Cs();pa();_a();hs();Na();It();Os();Ur();Fs=null,lo=null;document.addEventListener("external-session-updated",({detail:e})=>{let t=Fs;!t||!e||e.sessionId!==t.sessionId||e.agent&&t.agent&&e.agent!==t.agent||(lo&&clearTimeout(lo),lo=setTimeout(()=>{lo=null,Fs?.refresh()},140))});co=new Map});W();W();G();var Vf=aa({cache:!1,dedupe:!0,retry:0});async function Pi(){try{let e=await fetch("/api/hub");if(!e.ok)return M.value=!1,!1;let t=await e.json();if(t?.hub)return M.value=!0,t}catch{}return M.value=!1,!1}G();W();le();var ua=null;async function qi(){if(!ua)return!1;ua.prompt();let e=await ua.userChoice.catch(()=>null);return ua=null,document.getElementById("btn-pwa-install")?.classList.add("hidden"),e?.outcome==="accepted"}Dn();pa();_a();Na();G();le();W();Cs();var Lr=["ANTHROPIC_BASE_URL","ANTHROPIC_AUTH_TOKEN","ANTHROPIC_MODEL","ANTHROPIC_DEFAULT_OPUS_MODEL","ANTHROPIC_DEFAULT_SONNET_MODEL","ANTHROPIC_DEFAULT_HAIKU_MODEL","CLAUDE_CODE_SUBAGENT_MODEL","CLAUDE_CODE_EFFORT_LEVEL"],cn="claude";function Al(){document.getElementById("root").insertAdjacentHTML("beforeend",qu()),Ru()}function qu(){return`
|
|
586
586
|
<div id="settings-page" class="set-page" hidden>
|
|
587
587
|
<header class="set-island">
|
|
588
588
|
<button type="button" id="set-back" class="btn btn-ghost btn-sm px-2" aria-label="\u8FD4\u56DE">\u2190</button>
|
|
@@ -612,7 +612,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
612
612
|
<div class="label py-1"><span class="label-text text-xs uppercase tracking-wide">Profile</span></div>
|
|
613
613
|
<select id="ae-profile" class="select select-bordered select-sm"></select>
|
|
614
614
|
</label>
|
|
615
|
-
<div class="set-fields">${
|
|
615
|
+
<div class="set-fields">${Lr.map(t=>`<label class="form-control"><div class="label py-1"><span class="label-text text-xs font-mono">${p(t)}</span></div><input id="ae-${t}" class="input input-bordered input-sm font-mono text-xs" autocomplete="off" spellcheck="false"></label>`).join("")}</div>
|
|
616
616
|
<p id="claude-env-error" class="text-error text-xs mt-2 hidden"></p>
|
|
617
617
|
<button type="button" id="claude-env-save" class="btn btn-primary btn-sm mt-4">Save profile</button>
|
|
618
618
|
</section>
|
|
@@ -682,20 +682,20 @@ ${t}`:"",n.length?n.join(`
|
|
|
682
682
|
</section>
|
|
683
683
|
</div>
|
|
684
684
|
</div>
|
|
685
|
-
</div>`}function
|
|
685
|
+
</div>`}function Ru(){i("quota-refresh")?.addEventListener("click",Sr),i("quota-profile")?.addEventListener("change",Sr),i("set-back")?.addEventListener("click",Ml),document.querySelectorAll("[data-set-sec]").forEach(e=>{e.addEventListener("click",()=>Ha(e.dataset.setSec))}),i("ws-add-btn")?.addEventListener("click",$r),i("ws-new-name")?.addEventListener("keydown",e=>{e.key==="Enter"&&$r()}),i("ws-new-dir")?.addEventListener("keydown",e=>{e.key==="Enter"&&$r()}),i("mcp-token-generate")?.addEventListener("click",Gu),i("mcp-token-copy")?.addEventListener("click",Ku),i("claude-env-save")?.addEventListener("click",Uu),i("ae-profile")?.addEventListener("change",()=>{Ms()}),i("user-add-btn")?.addEventListener("click",Fu),i("pw-save")?.addEventListener("click",Wu),document.addEventListener("router:settings",()=>qa()),document.addEventListener("router:home",()=>{Ou()&&Ml()})}function Ha(e){cn=e||"claude",document.querySelectorAll("[data-set-sec]").forEach(t=>t.classList.toggle("is-on",t.dataset.setSec===cn)),document.querySelectorAll("[data-set-panel]").forEach(t=>{t.hidden=t.dataset.setPanel!==cn}),cn==="quota"&&Sr()}var Cl=0;async function Sr(){let e=++Cl,t=i("quota-list");if(!t)return;t.textContent="\u6B63\u5728\u8BFB\u53D6\u5F53\u524D\u673A\u5668\u7684\u989D\u5EA6\u2026";let n=D.peek(),s=i("quota-profile"),a=s?.value||"";if(s&&(s.innerHTML='<option value="">Claude \u9ED8\u8BA4\u8D26\u53F7</option>'+(pe.peek()||[]).map(r=>`<option value="${p(r.configDir)}">${p(r.name||r.configDir)}</option>`).join(""),s.value=a),M.peek()&&!n){t.textContent="\u8BF7\u5148\u9009\u62E9\u673A\u5668";return}let o=await Promise.all(["claude","grok","codex"].map(async r=>{let d=new URLSearchParams({agent:r});r==="claude"&&s?.value&&d.set("configDir",s.value);try{return await x("GET",`/api/agents/quota?${d}`,void 0,void 0,{machineId:n||void 0})}catch(u){return{agent:r,meters:[],message:u.message}}}));e!==Cl||n!==D.peek()||(t.innerHTML=o.map(r=>`<div class="border border-base-300 rounded-lg p-4 mb-3">
|
|
686
686
|
<h3 class="font-semibold">${p(r.agent)} ${p(r.plan||"")}</h3>
|
|
687
687
|
${(r.meters||[]).map(d=>`<div class="mt-3"><div class="text-sm">${p(d.label)} \xB7 \u5DF2\u7528 ${p(d.usedPercent)}% \xB7 \u5269\u4F59 ${p(d.remainingPercent)}%</div>
|
|
688
688
|
<progress class="progress progress-primary w-full" max="100" value="${Number(d.usedPercent)}"></progress>
|
|
689
689
|
${d.resetsAt?`<div class="text-xs opacity-60">\u91CD\u7F6E\uFF1A${p(new Date(d.resetsAt).toLocaleString())}</div>`:""}</div>`).join("")||`<p class="text-sm opacity-60 mt-2">${p(r.message||"\u6682\u65F6\u65E0\u6CD5\u8BFB\u53D6\u989D\u5EA6")}</p>`}
|
|
690
690
|
${r.fetchedAt?`<div class="text-xs opacity-50 mt-2">\u66F4\u65B0\u4E8E ${p(new Date(r.fetchedAt).toLocaleString())}</div>`:""}
|
|
691
|
-
</div>`).join(""))}function qa(e){let t=i("settings-page");if(!t)return;t.hidden=!1,document.documentElement.classList.add("settings-open"),Ha(e||cn||"claude"),
|
|
691
|
+
</div>`).join(""))}function qa(e){let t=i("settings-page");if(!t)return;t.hidden=!1,document.documentElement.classList.add("settings-open"),Ha(e||cn||"claude"),Er(),Ir(),Ms(),jl(),(i("mcp-token-settings")||document.querySelector('[data-set-panel="mcp"]'))&&!M.peek()&&document.querySelector('[data-set-sec="mcp"]')?.classList.add("hidden"),(location.hash||"")!=="#/settings"&&(location.hash="/settings")}function Ml(){let e=i("settings-page");e&&(e.hidden=!0),document.documentElement.classList.remove("settings-open"),(location.hash||"")==="#/settings"&&(location.hash="")}function Ou(){return!i("settings-page")?.hidden}function Er(){let e=i("ws-list");if(!e)return;let t=pe.peek()||[];if(!t.length){e.innerHTML='<div class="text-xs text-base-content/40">\u8FD8\u6CA1\u6709 workspace</div>';return}e.innerHTML=t.map((n,s)=>`
|
|
692
692
|
<div class="set-row" style="--index:${s}">
|
|
693
693
|
<div class="set-row-body">
|
|
694
694
|
<div class="text-sm font-medium">${p(n.name)}</div>
|
|
695
695
|
<div class="text-xs font-mono text-base-content/50">${p(n.configDir)}</div>
|
|
696
696
|
</div>
|
|
697
697
|
${t.length>1?`<button type="button" class="btn btn-ghost btn-xs" data-ws-delete="${p(n.id)}">Remove</button>`:'<span class="text-xs text-base-content/40">default</span>'}
|
|
698
|
-
</div>`).join(""),e.querySelectorAll("[data-ws-delete]").forEach(n=>{n.addEventListener("click",()=>
|
|
698
|
+
</div>`).join(""),e.querySelectorAll("[data-ws-delete]").forEach(n=>{n.addEventListener("click",()=>Bu(n.dataset.wsDelete))})}function Ir(e){let t=i("ae-profile");if(!t)return;let n=e??t.value,s=pe.peek()||[],a=[...new Set(s.map(o=>o.name).filter(Boolean))];t.innerHTML='<option value="">Default</option>'+a.map(o=>`<option value="${p(o)}">${p(o)}</option>`).join(""),[...t.options].some(o=>o.value===n)?t.value=n:t.value=""}async function $r(){let e=i("ws-new-name").value.trim(),t=i("ws-new-dir").value.trim(),n=i("ws-error");if(n.classList.add("hidden"),!e||!t){n.textContent="\u9700\u8981 name \u548C\u8DEF\u5F84",n.classList.remove("hidden");return}try{let s=await x("POST","/api/workspaces",{name:e,configDir:t}),a=[...(pe.peek()||[]).filter(o=>o.id!==s.id),s];pe.value=a,Is(a),i("ws-new-name").value="",i("ws-new-dir").value="",Er(),Ir(s.name),await Ms(),Ha("claude")}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}async function Bu(e){try{await x("DELETE",`/api/workspaces/${e}`);let t=(pe.peek()||[]).filter(n=>n.id!==e);pe.value=t,Is(t),Er(),Ir(""),await Ms()}catch(t){let n=i("ws-error");n&&(n.textContent=t.message,n.classList.remove("hidden"))}}async function Ms(){try{let e=i("ae-profile")?.value||"",t=e?`?name=${encodeURIComponent(e)}`:"",n=await x("GET",`/api/agent-env${t}`),s=n.env||{},a=e?{}:n.process||{};for(let o of Lr){let r=i(`ae-${o}`);if(!r)continue;let d=s[o]??a[o];d&&typeof d=="object"&&d.set?(r.placeholder=`saved ${d.preview||"\u2022\u2022\u2022\u2022"}`,r.value="",r.dataset.keep="1"):(r.value=typeof d=="string"?d:"",r.placeholder=o,r.dataset.keep="")}}catch{}}async function Uu(){let e=i("claude-env-error");e?.classList.add("hidden");let t={};for(let n of Lr){let s=i(`ae-${n}`);if(!s)continue;let a=s.value.trim();a?t[n]=a:s.dataset.keep==="1"?t[n]={set:!0}:t[n]=""}try{let n=i("ae-profile")?.value||"";await x("PUT","/api/agent-env",{name:n,env:t}),await Ms()}catch(n){e&&(e.textContent=n.message,e.classList.remove("hidden"))}}async function jl(){let e=i("set-nav-users"),t=document.querySelector('[data-set-panel="users"]');try{let n=await x("GET","/api/collab/me"),s=n.role==="admin"||n.role==="owner";if(e?.classList.toggle("hidden",!s),t&&(t.hidden=!s||cn!=="users"),!s){cn==="users"&&Ha("claude");return}let a=await x("GET","/api/collab/users"),o=i("users-list"),r=Array.isArray(a)?a:[];o.innerHTML=r.map(d=>`<div class="set-row"><div class="text-sm font-medium flex-1">${p(d.username)}</div><div class="text-xs text-base-content/50">${p(d.role||"")}</div></div>`).join("")||'<div class="text-xs text-base-content/40">\u8FD8\u6CA1\u6709\u5176\u4ED6\u7528\u6237</div>'}catch{e?.classList.add("hidden")}}async function Fu(){let e=i("users-error");e?.classList.add("hidden");let t=i("user-new-name")?.value.trim(),n=i("user-new-pass")?.value||"",s=i("user-new-role")?.value||"editor";if(!t||!n){e&&(e.textContent="\u9700\u8981\u7528\u6237\u540D\u548C\u5BC6\u7801",e.classList.remove("hidden"));return}try{await x("POST","/api/collab/users",{username:t,password:n,role:s}),i("user-new-name").value="",i("user-new-pass").value="",await jl()}catch(a){e&&(e.textContent=a.message,e.classList.remove("hidden"))}}async function Wu(){let e=i("pw-error");e?.classList.add("hidden");let t=i("pw-current")?.value||"",n=i("pw-next")?.value||"",s=i("pw-next2")?.value||"";if(n!==s){e&&(e.textContent="\u4E24\u6B21\u65B0\u5BC6\u7801\u4E0D\u4E00\u81F4",e.classList.remove("hidden"));return}try{await x("POST","/api/auth/password",{current:t,next:n}),i("pw-current").value="",i("pw-next").value="",i("pw-next2").value=""}catch(a){e&&(e.textContent=a.message,e.classList.remove("hidden"))}}async function Gu(){let e=i("mcp-token-result"),t=i("mcp-token-error");e?.classList.add("hidden"),t?.classList.add("hidden");let n=D.peek();if(!n){t.textContent="\u8BF7\u5148\u5728\u4E3B\u754C\u9762\u9009\u4E00\u53F0\u5728\u7EBF\u673A\u5668\u3002",t.classList.remove("hidden");return}try{let s=Number(i("mcp-token-expiry").value),a=await x("POST",`/api/mcp/tokens?machine=${encodeURIComponent(n)}`,{expiresInSeconds:s});i("mcp-token-value").value=a.token||"";let o=i("mcp-token-url");o&&(o.textContent=`${location.origin}/mcp`),e.classList.remove("hidden")}catch(s){t.textContent=s.message,t.classList.remove("hidden")}}async function Ku(){let e=i("mcp-token-value")?.value;if(e)try{await navigator.clipboard.writeText(e)}catch{i("mcp-token-value")?.select(),document.execCommand("copy")}}As();Ps();ya();W();var Zl=()=>`
|
|
699
699
|
<div id="auth-screen" class="${c.token?"hidden":""} flex items-center justify-center h-full p-4" ${c.token?'style="display:none"':""}>
|
|
700
700
|
<div class="card bg-base-200 border border-base-300 w-full max-w-sm shadow-xl">
|
|
701
701
|
<div class="card-body gap-3 p-8">
|
|
@@ -716,7 +716,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
716
716
|
<div id="auth-error" class="alert alert-error text-xs py-2 hidden"></div>
|
|
717
717
|
</div>
|
|
718
718
|
</div>
|
|
719
|
-
</div>`,
|
|
719
|
+
</div>`,ec=(e={})=>{let t=!!e.restoreSession,n=c.token?"":"hidden",s=c.token?"display:flex":"display:none";return`
|
|
720
720
|
<div id="sidebar-overlay" class="hidden fixed inset-0 bg-black/50 z-[9]" aria-hidden="true"></div>
|
|
721
721
|
<div id="app" class="${n} flex-col flex-1 overflow-hidden" style="${s}">
|
|
722
722
|
<div id="topbar" class="flex items-center gap-2 px-3 bg-base-200 border-b border-base-300 flex-shrink-0" style="height:44px">
|
|
@@ -1120,7 +1120,7 @@ ${t}`:"",n.length?n.join(`
|
|
|
1120
1120
|
</div>
|
|
1121
1121
|
</div>
|
|
1122
1122
|
<form method="dialog" class="modal-backdrop"><button>close</button></form>
|
|
1123
|
-
</dialog>`};
|
|
1123
|
+
</dialog>`};Ur();It();ns();G();W();le();hs();Cs();pa();It();Os();Ps();ns();Us();Dn();async function fo(e={}){i("auth-screen").style.display="none";let t=i("app");t.classList.remove("hidden"),t.style.display="flex",queueMicrotask(Ee),zi().catch(()=>{});let n=e.hub;n===void 0?n=await da():n?(M.value=!0,n.machines&&(ie.value=n.machines)):M.value=!1;let s=e.deepLink||null,a=Xt();if(!!(s?.id||(location.hash||"").startsWith("#/session/"))){let d=i("welcome");d&&(d.classList.add("hidden"),d.style.display="none");let u=i("project-view");u&&(u.classList.remove("hidden"),u.style.display="flex",u.style.flexDirection="column",u.style.flex="1",u.style.minHeight="0")}if(M.peek()){let d=localStorage.getItem("machineId")||a?.machineId||"";d&&(Le(d),io(),it.value=!0,Ns());let u=yn().then(m=>(Ot(),d&&!m.some(w=>w.id===d&&w.online!==!1)&&m.length&&(m.some(y=>y.id===d)||(Le(null),wn())),m));Vr(),Ot();let l=Promise.all([We({waitFresh:!1}),Zn({waitFresh:!1}),Rs().catch(()=>{}),es().catch(()=>{})]);if(s?.id){let m=ne.peek().find(g=>g.sessionId===s.id)||(a?.sessionId===s.id?a:null);await nt(s.id,m?.cwd||null,m?.configDir||null,s.agent||m?.agent||null,s.machineId||m?.machineId||d||null,{tab:s.tab||"chat"}),u.catch(()=>{}),l.catch(()=>{});return}if(!d){if(await u,!(ie.peek()||[]).length){wn(),l.catch(()=>{});return}wn(),l.catch(()=>{});return}await l;let f=i("topbar-project");f&&f.textContent==="Select a session"&&(f.textContent=`Machine \xB7 ${d}`);return}Ns();let r=Promise.all([We({waitFresh:!1}),Zn({waitFresh:!1}),Rs().catch(()=>{}),es().catch(()=>{})]);if(s?.id){await Pa().then(u=>{Array.isArray(u)?ne.value=u:u&&Array.isArray(u.sessions)&&(ne.value=u.sessions)}).catch(()=>{});let d=ne.peek().find(u=>u.sessionId===s.id)||(a?.sessionId===s.id?a:null);await nt(s.id,d?.cwd||null,d?.configDir||null,s.agent||d?.agent||null,null,{tab:s.tab||"chat"}),r.catch(()=>{});return}await r}Os();Us();G();W();le();_a();It();ns();Us();Dn();function Ac(){let e=i("sidebar");e&&(e.classList.add("open"),i("sidebar-overlay").classList.remove("hidden"),i("hamburger")?.setAttribute("aria-expanded","true"),Ee(),setTimeout(()=>i("session-search")?.focus({preventScroll:!0}),180))}function Ws(){let e=i("sidebar");e&&(e.classList.remove("open"),i("sidebar-overlay").classList.add("hidden"),i("hamburger")?.setAttribute("aria-expanded","false"),Ee(),i("hamburger")?.focus({preventScroll:!0}))}function jc(){window.innerWidth<=640&&Ws()}function Dc(){let e=i("sidebar-toggle"),t=i("sidebar");if(!e||!t)return;let n=localStorage.getItem("sidebarCollapsed")==="1",s=localStorage.getItem("sidebarWidth")||t.style.width||"280px",a=()=>{t.classList.toggle("desktop-collapsed",n),n?(t.style.width="0",t.style.minWidth="0",t.style.overflow="hidden"):(t.style.width=s,t.style.minWidth="",t.style.overflow=""),e.textContent=n?"\u25B6":"\u25C0",e.title=n?"\u5C55\u5F00\u4FA7\u680F":"\u6536\u8D77\u4FA7\u680F",e.setAttribute("aria-label",e.title),e.setAttribute("aria-expanded",n?"false":"true")};a(),e.addEventListener("click",()=>{n=!n,n&&(s=t.style.width||s),localStorage.setItem("sidebarCollapsed",n?"1":"0"),a()})}function _c(){let e=i("sidebar-resize"),t=i("sidebar"),n=!1;e.addEventListener("mousedown",s=>{n=!0,document.body.style.userSelect="none",document.body.style.cursor="col-resize",s.preventDefault()}),document.addEventListener("mousemove",s=>{if(!n)return;let a=Math.min(Math.max(s.clientX,160),520);t.style.width=a+"px",t.style.minWidth=""}),document.addEventListener("mouseup",()=>{if(!n)return;n=!1,document.body.style.userSelect="",document.body.style.cursor="";let s=Math.round(t.getBoundingClientRect().width);s>=160&&localStorage.setItem("sidebarWidth",`${s}px`)})}function ei(e){document.documentElement.setAttribute("data-theme",e),localStorage.setItem("theme",e);let t=i("btn-theme"),n=e==="dark"||e==="night"||e==="black"?"\u{1F319}":"\u2600\uFE0F";t&&(t.textContent=n),document.querySelectorAll('[data-sidebar-action="theme"]').forEach(a=>{a.textContent=n});let s=document.getElementById("hljs-theme");if(s||(s=document.querySelector('link[href*="highlight"][href*="styles"]'),s&&(s.id="hljs-theme")),s){let a=e==="dark"||e==="night"||e==="black";s.href="/vendor/highlight-dark.min.css"}}function ti(){let e=document.documentElement.getAttribute("data-theme")||"dark";ei(e==="dark"?"light":"dark")}function ni(){let e=i("new-session-agent");e&&(e.value=$.peek()||"claude");let t=i("new-session-workspace");if(t){let a=pe.peek();t.innerHTML=a.map(o=>`<option value="${p(o.configDir)}">${p(o.name)} \u2014 ${p(o.configDir)}</option>`).join(""),c.configDir&&(t.value=c.configDir)}let n=i("new-session-machine-wrap"),s=i("new-session-machine");if(n&&s)if(M.peek()){n.style.display="";let a=ie.peek()||[],o=D.peek()||"";s.innerHTML=a.length?a.map(r=>`<option value="${p(r.id)}">${p(r.id)}${r.hostname?" \u2014 "+p(r.hostname):""}</option>`).join(""):'<option value="">(no machines online)</option>',o&&(s.value=o),s.disabled=!0}else n.style.display="none",s&&(s.disabled=!1);si(),i("new-session-path").value=E.peek()?.path||"",i("new-session-error").classList.add("hidden"),i("modal-new-session").showModal(),setTimeout(()=>i("new-session-path").focus(),50)}function si(){let e=i("new-session-agent")?.value||"claude",t=i("new-session-ws-wrap");t&&(t.style.display=e==="claude"?"":"none")}async function ai(){let e=i("new-session-path").value.trim(),t=i("new-session-agent")?.value||"claude",n=t==="claude"?i("new-session-workspace").value:null,s=i("new-session-error");if(s.classList.add("hidden"),!e){s.textContent="Working directory is required",s.classList.remove("hidden");return}if(M.peek()){let a=D.peek()||i("new-session-machine")?.value||ie.peek()?.[0]?.id;if(!a){s.textContent="\u8BF7\u5148\u9009\u62E9\u4E00\u53F0\u673A\u5668",s.classList.remove("hidden"),wn();return}Le(a)}try{let a=await x("POST","/api/resolve-path",{path:e});if(!a.isDir)throw new Error("Path is not a directory");i("modal-new-session").close();let o=a.path.split("/").filter(Boolean).pop()||a.path;Un(),Wn(),Kn(),Gn(),c.sessionId=null,c.configDir=n||null,c.agent=t,Ne(t),se(Be(t)||_.peek()),et(),xe(()=>{E.value={id:o,name:o,path:a.path,machineId:D.peek()||c.machineId},ke.value=a.path,re.value=a.path,Se.value=a.path,Y.value="",oe.value=null}),i("topbar-project").textContent=a.path;let r=i("files-root-input");r&&(r.value=a.path);let d=i("git-root-input");d&&(d.value=a.path),i("welcome").classList.add("hidden");let u=i("project-view");u.classList.remove("hidden"),u.style.display="flex",zn(),Fn({sessionId:null}),Pt(),Tt("chat"),C(`New ${Z[t]||t} session \xB7 ${a.path}`)}catch(a){s.textContent=a.message,s.classList.remove("hidden")}}function yp(){let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1,t=/Android/i.test(navigator.userAgent),n;e?n=`<ol class="list-decimal pl-4 space-y-2 text-sm text-base-content/80">
|
|
1124
1124
|
<li>\u70B9\u5E95\u90E8\u5206\u4EAB\u6309\u94AE <strong>\u5206\u4EAB</strong>\uFF08\u65B9\u6846+\u5411\u4E0A\u7BAD\u5934\uFF09</li>
|
|
1125
1125
|
<li>\u4E0B\u6ED1\u627E\u5230\u5E76\u70B9 <strong>\u6DFB\u52A0\u5230\u4E3B\u5C4F\u5E55</strong></li>
|
|
1126
1126
|
<li>\u786E\u8BA4\u540D\u79F0\u540E\u70B9 <strong>\u6DFB\u52A0</strong></li>
|
|
@@ -1140,48 +1140,48 @@ ${t}`:"",n.length?n.join(`
|
|
|
1140
1140
|
<form method="dialog"><button class="btn btn-sm">\u77E5\u9053\u4E86</button></form>
|
|
1141
1141
|
</div>
|
|
1142
1142
|
</div>
|
|
1143
|
-
<form method="dialog" class="modal-backdrop"><button>close</button></form>`,s.showModal()}async function
|
|
1143
|
+
<form method="dialog" class="modal-backdrop"><button>close</button></form>`,s.showModal()}async function ri(){let e=i("auth-screen");e&&(e.classList.remove("hidden"),e.style.display="flex");let t=i("app");t&&(t.classList.add("hidden"),t.style.display="none");let n=i("auth-btn"),s,a=new AbortController,o=setTimeout(()=>a.abort(),8e3);try{s=await x("GET","/api/auth/status",void 0,a.signal)}catch(r){console.warn("[auth status]",r);let d=i("auth-error");d&&(d.textContent="\u65E0\u6CD5\u8FDE\u63A5\u670D\u52A1\u5668\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u670D\u52A1\u5730\u5740\u540E\u91CD\u8BD5\u3002",d.classList.remove("hidden")),n&&(n.dataset.mode="login");return}finally{clearTimeout(o)}s.needsSetup?(i("auth-subtitle").textContent="Create your account to get started",n.textContent="Create Account",n.dataset.mode="register"):n.dataset.mode="login"}async function oi(){let e=i("auth-username").value.trim(),t=i("auth-password").value,n=i("auth-error");n.classList.add("hidden");try{let s=await x("POST",`/api/auth/${i("auth-btn").dataset.mode||"login"}`,{username:e,password:t});c.token=s.token,localStorage.setItem("token",s.token),fo()}catch(s){n.textContent=s.message,n.classList.remove("hidden")}}function ii(){return c.token?/^#\/session\//.test(location.hash||""):!1}function Nc(e={}){if(ei(localStorage.getItem("theme")||"dark"),!document.getElementById("xterm-css")){let l=document.createElement("link");l.id="xterm-css",l.rel="stylesheet",l.href="/xterm.min.css",document.head.appendChild(l)}if(!document.getElementById("xterm-js")){let l=document.createElement("script");l.id="xterm-js",l.src="/xterm.min.js",document.head.appendChild(l)}if(!document.getElementById("xterm-fit-js")){let l=document.createElement("script");l.id="xterm-fit-js",l.src="/addon-fit.min.js",document.head.appendChild(l)}let t=e.restoreSession??ii(),n=document.getElementById("root");if(n.style.cssText="display:flex;flex-direction:column;flex:1;height:100%",n.innerHTML=Zl()+ec({restoreSession:t}),t){let l=i("session-list");l&&(l.innerHTML='<div class="px-3 py-3 text-[10px] text-base-content/35">Loading sessions\u2026</div>')}je(()=>{let l=pe.value,f=i("ws-tabs");if(!f)return;if(l.length<=1){f.innerHTML="";return}let m=ke.peek();f.innerHTML=[{id:null,name:"All"},...l].map(g=>`<button class="px-3 py-1.5 text-[11px] flex-shrink-0 border-b-2 whitespace-nowrap
|
|
1144
1144
|
${(g.id===null?!m:m===g.configDir)?"border-primary text-primary":"border-transparent text-base-content/50 hover:text-base-content"}"
|
|
1145
1145
|
data-ws-tab="${p(g.configDir||"")}">
|
|
1146
1146
|
${p(g.name)}
|
|
1147
|
-
</button>`).join("")}),je(()=>{Dt.value,Vt.value,ht.value,rt.value,T.value;let l=i("session-list");if(!l||l.querySelector(".session-rename-input"))return;let f=Gr();if(l._lastHtml===f){qs();return}let m=l.scrollTop;l.innerHTML=f,l._lastHtml=f,l.scrollTop=m,qs()}),je(()=>{gt.value,qs()}),je(()=>{ne.value,ye.value,j.value,M.value;let l=i("welcome");l&&(document.documentElement.classList.contains("boot-restore")||document.documentElement.classList.contains("boot-pending")||l.classList.contains("hidden")||l.style.display==="none"||vn())}),De(ke,l=>{let f=i("session-filter-badge");f&&(f.style.display=l?"inline":"none",f.title=l||"")}),je(()=>{let l=E.value;if(l&&l.path)xc(l.path);else{let f=i("project-notes-bar");f&&(f.style.display="none")}}),De(Y,l=>{document.querySelectorAll("[data-tab]").forEach(m=>{let g=m.dataset.tab===l;m.classList.toggle("text-primary",g),m.classList.toggle("border-primary",g),m.classList.toggle("text-base-content/50",!g),m.classList.toggle("border-transparent",!g)});let f=i("project-view");f&&!f.classList.contains("hidden")&&(f.style.display="flex",f.style.flexDirection="column",f.style.minHeight="0",f.style.flex="1"),["chat","files","git","shell","memory"].forEach(m=>{let g=i(`tab-${m}`);if(!g)return;let w=m===l;g.classList.toggle("hidden",!w),w?(g.style.display="flex",g.style.flexDirection="column",g.style.flex="1 1 0",g.style.minHeight="0",g.style.overflow="hidden"):g.style.display="none"}),l==="memory"&&eo(),l==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))}),Ee()}),jc(),Ac(),Zi({openSession:nt});let s=l=>{i("app")?.classList.toggle("chat-chrome-collapsed",l),i("btn-expand-chat-chrome")?.classList.toggle("hidden",!l),localStorage.setItem("chatChromeCollapsed",l?"1":"0")};s(localStorage.getItem("chatChromeCollapsed")==="1");let a=null;document.addEventListener("sessions-changed",()=>{a&&clearTimeout(a),a=setTimeout(()=>{a=null,We({waitFresh:!1})},1200)}),document.addEventListener("router:home",po),document.addEventListener("router:session",async({detail:{id:l,tab:f,machineId:m,agent:g}})=>{let w=ne.peek().find(H=>H.sessionId===l),y=Xt();await nt(l,w?.cwd||(y?.sessionId===l?y.cwd:null)||null,w?.configDir||(y?.sessionId===l?y.configDir:null)||null,g||w?.agent||(y?.sessionId===l?y.agent:null)||null,m||w?.machineId||(y?.sessionId===l?y.machineId:null)||null,{tab:f||"chat"})}),b.on("click","#btn-home",po),b.on("click","#btn-share-session, #btn-share-session-current",async(l,f)=>{let m=kl();if(m)try{await navigator.clipboard.writeText(m),f.classList.add("is-copied"),f.title="\u5DF2\u590D\u5236\u5206\u4EAB\u94FE\u63A5",setTimeout(()=>{f.classList.remove("is-copied"),f.title="\u590D\u5236\u5F53\u524D\u4F1A\u8BDD\u5206\u4EAB\u94FE\u63A5"},1400)}catch{window.prompt("\u590D\u5236\u4F1A\u8BDD\u94FE\u63A5\uFF1A",m)}}),b.on("click","#auth-btn",ai),b.on("submit","#auth-form",l=>{l.preventDefault(),ai()}),b.on("keydown","#auth-username, #auth-password",l=>{l.key==="Enter"&&ai()}),b.on("click","#hamburger",()=>i("sidebar").classList.contains("open")?Ws():Cc()),b.on("click","#sidebar-overlay",Ws),document.addEventListener("keydown",l=>{l.key==="Escape"&&window.innerWidth<=640&&i("sidebar")?.classList.contains("open")&&(l.preventDefault(),Ws())}),b.on("input","#session-search",(l,f)=>{$e.value=f.value,Za(f.value)}),b.on("click","#sidebar-filter-toggle",()=>{let l=i("sidebar-filter-menu");if(!l)return;let f=l.classList.toggle("hidden");i("sidebar-filter-toggle")?.setAttribute("aria-expanded",String(!f))}),b.on("change","[data-agent-option]",(l,f)=>{let m=new Set(zt.peek());f.checked?m.add(f.dataset.agentOption):m.delete(f.dataset.agentOption);let g=[...m];zt.value=g,localStorage.setItem("agentFilters",JSON.stringify(g)),ye.value=g.length===1?g[0]:"all"}),b.on("change","#filter-favorites",(l,f)=>{ze.value=f.checked,localStorage.setItem("favoritesOnly",f.checked?"1":"0")}),b.on("change","#filter-hidden",(l,f)=>{Je.value=f.checked,localStorage.setItem("showHiddenOnly",f.checked?"1":"0")}),b.on("click","#filter-clear",()=>{zt.value=[],ye.value="all",ze.value=!1,Je.value=!1,localStorage.setItem("agentFilters","[]"),localStorage.setItem("favoritesOnly","0"),localStorage.setItem("showHiddenOnly","0"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=!1}),i("filter-favorites")&&(i("filter-favorites").checked=!1),i("filter-hidden")&&(i("filter-hidden").checked=!1)}),b.on("click","#session-filter-badge",()=>{ke.value=null}),b.on("click","[data-ws-tab]",(l,f)=>{ke.value=f.dataset.wsTab||null}),b.on("click","#sidebar-refresh",()=>{We(),$e.peek().trim()&&Xa($e.peek())}),b.on("click","[data-view]",(l,f)=>{ht.value=f.dataset.view,localStorage.setItem("sidebarView",f.dataset.view)}),b.on("click","[data-agent-filter]",(l,f)=>{ye.value=f.dataset.agentFilter,localStorage.setItem("agentFilter",f.dataset.agentFilter),$e.peek().trim()&&Za($e.peek())}),b.on("dblclick","[data-project-cwd]",(l,f)=>{let m=f.dataset.projectCwd;if(!m)return;let g=m.split("/").filter(Boolean).pop()||m;Xr({id:g,name:g,path:m}),C(`Project \xB7 ${m}`)}),b.on("click","#btn-pwa-install",async()=>{await Hi()||vp()}),document.addEventListener("pwa-installable",()=>{document.getElementById("btn-pwa-install")?.classList.remove("hidden")}),b.on("click","#btn-settings",qa),b.on("click","#btn-notes",()=>Ra()),b.on("click","#btn-collapse-chat-chrome",()=>s(!0)),b.on("click","#btn-expand-chat-chrome",()=>s(!1)),b.on("click","#btn-meta-agent",()=>Gl()),b.on("click","#btn-meta-agent-welcome",()=>Dr("chat")),b.on("click","#btn-theme",ei),b.on("click","[data-sidebar-action]",(l,f)=>{let m=f.dataset.sidebarAction;m==="new"&&ti(),m==="theme"&&ei(),m==="settings"&&qa(),m==="logout"&&(c.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload())}),b.on("click","#btn-cal-prev",()=>{Br(-1),vn(bn())}),b.on("click","#btn-cal-next",()=>{Br(1),vn(bn())}),b.on("click","[data-cal-date]",(l,f)=>{cc(f.dataset.calDate),vn(bn())}),b.on("click","[data-session-id]",(l,f)=>{l.target.closest("[data-fav-toggle]")||l.target.closest("[data-hide-toggle]")||l.target.closest("[data-rename-session]")||l.target.closest(".session-rename-input")||l.target.closest(".session-title-wrap.session-rename-active")||(nt(f.dataset.sessionId,f.dataset.sessionCwd||null,f.dataset.sessionConfigDir||null,f.dataset.sessionAgent||"claude",f.dataset.sessionMachine||null),Mc())}),b.on("click","[data-rename-session]",(l,f)=>{l.preventDefault(),l.stopPropagation();let m=f.closest(".session-title-wrap")||f,g=m.dataset.renameSessionId||m.dataset.sessionId;g&&Jr({sessionId:g,agent:m.dataset.renameSessionAgent||"claude",machineId:m.dataset.renameSessionMachine||null,fallbackDisplay:m.dataset.renameSessionDisplay||"",mountEl:m})}),b.on("click","[data-rename-bar]",(l,f)=>{if(l.preventDefault(),l.stopPropagation(),!c.sessionId)return;let m=document.getElementById("session-title-display")||f;Jr({sessionId:c.sessionId,agent:c.agent||S.peek()||"claude",machineId:c.machineId||null,mountEl:m})}),b.on("click","[data-folder]",(l,f)=>{let m=f.dataset.folder,w=f.querySelector("span")?.textContent.trim()==="\u25BE",y=new Set(Cn.peek()),H=new Set(Mn.peek());w?(y.delete(m),H.add(m)):(y.add(m),H.delete(m)),xe(()=>{Cn.value=y,Mn.value=H})}),b.on("click","#memory-refresh",eo),b.on("click","[data-memory-file]",l=>Kr(l.dataset.memoryFile,l.dataset.memoryAgent)),b.on("click","[data-tab]",(l,f)=>Tt(f.dataset.tab));let o=async(l,f)=>{let m=i(l),g=m?.value.trim();if(!g){f.value="";return}try{let w=await x("POST","/api/resolve-path",{path:g});if(w.isDir===!1)throw new Error("Path is not a directory on the target machine");f.value=w.path,m.value=w.path;let y=E.peek();y&&(E.value={...y,path:w.path})}catch(w){m.style.color="oklch(var(--er))",m.title=w.message,setTimeout(()=>{m.style.color="",m.title=""},2e3)}};b.on("click","#files-root-btn",()=>o("files-root-input",re)),b.on("click","#git-root-btn",()=>o("git-root-input",Se)),b.on("keydown","#files-root-input",l=>{l.key==="Enter"&&o("files-root-input",re)}),b.on("keydown","#git-root-input",l=>{l.key==="Enter"&&o("git-root-input",Se)}),b.on("click","#btn-opts",()=>{i("chat-opts").classList.toggle("hidden"),Ee()}),b.on("change","#sel-agent",(l,f)=>{let m=S.peek(),g=f.value;m!==g&&(c.sessionId=null,Ne(g),se(Oe(g)||_.peek()),i("sel-permission").value=de.peek(),et(),C(`Agent \u2192 ${X[g]||g} \xB7 model ${_.peek()} \xB7 new session`))}),b.on("change","#sel-convert-agent",async(l,f)=>{let m=f.value;if(!m)return;let g=c.sessionId;if(!g){alert("No active session to convert."),f.value="";return}let w=c.agent||S.peek()||"claude";if(w===m){alert("Cannot convert to the same agent."),f.value="";return}f.disabled=!0,C(`Converting session ${g.slice(0,8)} from ${w} to ${m}...`);try{let y=await x("POST",`/api/sessions/${g}/convert`,{targetAgent:m,sourceAgent:w});y&&y.success?(C(`\u2713 Converted successfully. New session: ${y.targetSessionId.slice(0,8)}`),await We(),await nt(y.targetSessionId,E.peek()?.path||null,null,y.targetAgent),Es()):C("Failed to convert session.")}catch(y){C(`Error converting session: ${y.message}`),alert(`Error converting session: ${y.message}`)}finally{f.disabled=!1,f.value=""}}),b.on("change","#sel-model",(l,f)=>{se(f.value),Va()}),b.on("click","#btn-model-add",()=>Ya({editCurrent:!1})),b.on("click","#btn-model-edit",()=>Ya({editCurrent:!0})),b.on("change","#sel-effort",(l,f)=>{te.value=f.value}),b.on("change","#sel-permission",(l,f)=>{de.value=f.value}),b.on("change","#sel-density",(l,f)=>{Go(f.value),C(`Density \u2192 ${f.value} (applies to new tool calls; reload session to re-group history)`)}),document.addEventListener("agent-changed",et),b.on("click","#btn-new-session, #btn-new-session-current, #btn-new-session-welcome",ti),b.on("click","#new-session-cancel",()=>i("modal-new-session").close()),b.on("click","#new-session-start",si),b.on("change","#new-session-agent",ni),b.on("keydown","#new-session-path",l=>{l.key==="Enter"&&si()}),b.on("click","#send-btn",Ls),b.on("click","#stop-btn",ul),b.on("click","#btn-logout",()=>{c.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload()}),b.on("click","[data-pick-machine]",async(l,f)=>{let m=f.dataset.pickMachine;if(!m||m===j.peek()){kn();return}await Vr(m,{forceReload:!0}),va()});let r=async()=>{let l=i("machine-picker-status");if(l&&(l.textContent="\u5237\u65B0\u4E2D\u2026"),await yn(),ro(),Os(),Bt(),l){let f=(ie.peek()||[]).filter(m=>m.online!==!1).length;l.textContent=`${f} online`}};b.on("click","#btn-refresh-machines",r),b.on("click","#btn-refresh-machines-menu",async l=>{l.stopPropagation(),await r()}),b.on("click","#btn-machine-menu",async l=>{l.stopPropagation(),xn(),an();let f=i("machine-menu");f&&(f.classList.contains("hidden")?(await yn(),Os(),f.classList.remove("hidden")):f.classList.add("hidden"))}),b.on("click","#btn-recent-sessions",l=>{l.preventDefault(),l.stopPropagation(),kn(),an(),lc();let f=!i("recent-menu")?.classList.contains("hidden"),m=i("btn-recent-sessions");m&&m.setAttribute("aria-expanded",f?"true":"false")}),b.on("click","#recent-menu-backdrop",l=>{l.preventDefault(),l.stopPropagation(),xn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",l=>{let f=i("machine-menu-wrap");f&&!f.contains(l.target)&&kn();let m=i("recent-menu"),g=i("btn-recent-sessions"),w=l.target;if(m&&!m.classList.contains("hidden")){if(m.contains(w)||g?.contains(w))return;xn(),g?.setAttribute("aria-expanded","false")}}),b.on("click","#btn-notifications",l=>{l.preventDefault(),l.stopPropagation(),kn(),xn(),Xi()}),window.addEventListener("resize",()=>{i("recent-menu")&&!i("recent-menu").classList.contains("hidden")&&qr()}),b.on("click","#recent-menu [data-session-id]",()=>{xn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),b.on("click","[data-dismiss-recent-session]",(l,f)=>{l.preventDefault(),l.stopPropagation(),rc({sessionId:f.dataset.dismissRecentSession,agent:f.dataset.dismissRecentAgent||"claude",machineId:f.dataset.dismissRecentMachine||null})}),b.on("click","#btn-edit-project-notes, #project-goal-text, #project-notes-text",()=>{yc()}),b.on("click","#btn-cancel-project-notes",()=>{ts()});let d=async()=>{let l=i("project-goal-input")?.value?.trim()??"",f=i("project-notes-input")?.value?.trim()??"",m=E.peek();if(!(!m||!m.path))try{let g=await x("POST","/api/projects/notes",{root:m.path,goal:l,notes:f});vc(g.goal||"",g.notes||""),ts()}catch(g){alert(`Error saving project notes: ${g.message}`)}};b.on("click","#btn-save-project-notes",d),b.on("keydown","#project-goal-input",l=>{l.key==="Enter"&&d(),l.key==="Escape"&&ts()}),b.on("keydown","#project-notes-input",l=>{l.key==="Escape"&&ts()}),b.on("click","[data-fav-toggle]",(l,f)=>{l.stopPropagation(),l.preventDefault();let m=f.dataset.favSessionMachine||c.machineId;m&&(c.machineId=m,localStorage.setItem("machineId",m)),$c(f.dataset.favSessionId,f.dataset.favSessionAgent||"claude",{machineId:m||null})}),b.on("click","[data-hide-toggle]",(l,f)=>{l.stopPropagation(),l.preventDefault();let m=f.dataset.hideSessionMachine||c.machineId;m&&(c.machineId=m,localStorage.setItem("machineId",m)),Sc(f.dataset.hideSessionId,f.dataset.hideSessionAgent||"claude",{machineId:m||null})}),b.on("click","#btn-edit-session-notes, #session-notes-text",()=>{wc()}),b.on("click","#btn-cancel-session-notes",()=>tt()),b.on("click","#btn-save-session-notes",async()=>{let l=i("session-notes-input")?.value?.trim()||"";if(!c.sessionId)return;let f=c.agent||S.peek()||"claude";await zr(c.sessionId,f,l)&&tt()}),b.on("keydown","#session-notes-input",async l=>{if(l.key==="Escape"&&tt(),l.key==="Enter"){let f=l.target.value.trim();if(!c.sessionId)return;let m=c.agent||S.peek()||"claude";await zr(c.sessionId,m,f)&&tt()}}),b.on("click","#btn-fav-filter",()=>{let l=!ze.peek();ze.value=l,localStorage.setItem("favoritesOnly",l?"1":"0"),i("btn-fav-filter")?.classList.toggle("active",l),l&&Je.peek()&&(Je.value=!1,localStorage.setItem("showHiddenOnly","0"),i("btn-hidden-filter")?.classList.remove("active"))}),b.on("click","#btn-hidden-filter",()=>{let l=!Je.peek();Je.value=l,localStorage.setItem("showHiddenOnly",l?"1":"0"),i("btn-hidden-filter")?.classList.toggle("active",l),l&&ze.peek()&&(ze.value=!1,localStorage.setItem("favoritesOnly","0"),i("btn-fav-filter")?.classList.remove("active"))}),et(),je(()=>{M.value,j.value,c.token&&va()}),i("sel-permission").value=de.peek(),gl();let u=i("sel-density");u&&(u.value=_e.peek()||"normal"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=zt.peek().includes(l.dataset.agentOption)}),i("filter-favorites")&&(i("filter-favorites").checked=ze.peek()),i("filter-hidden")&&(i("filter-hidden").checked=Je.peek()),document.querySelectorAll("[data-agent-filter]").forEach(l=>{l.classList.toggle("active",l.dataset.agentFilter===ye.peek())}),i("btn-fav-filter")?.classList.toggle("active",ze.peek()),i("btn-hidden-filter")?.classList.toggle("active",Je.peek()),document.querySelectorAll("[data-view]").forEach(l=>{let f=l.dataset.view===ht.peek();l.classList.toggle("bg-primary/15",f),l.classList.toggle("text-primary",f),l.classList.toggle("font-medium",f),l.classList.toggle("text-base-content/50",!f)})}W();er();F();le();hs();or();ya();_n();Zt();en();ir();_t();_t();function xp(){return X[S.peek()]||"Assistant"}function yp(e){let t=String(e||"").trim();return/remote compact task|error decoding response body/i.test(t)?"Codex \u4F1A\u8BDD\u538B\u7F29\u5931\u8D25\uFF08\u7F51\u7EDC\u4E2D\u65AD\uFF09\u3002\u518D\u53D1\u4E00\u6761\u6D88\u606F\u91CD\u8BD5\uFF0C\u6216\u5F00\u65B0\u4F1A\u8BDD\u3002":t||"\u53D1\u9001\u5931\u8D25"}var $n=null;function wp(e){return vs(e)}function Oc(e){return e?($n&&$n.el===e||($n?.destroy?.(),$n=wa(e),$n.el=e),$n):null}function Re(e,t){if(!e||e.dataset.historyPainting==="1")return;Oc(e).stick(!!t)}var Ks=0,At=null,at=1e3,Mt=0,go=null,_c=!1,bo=!1,Nc=null,vo=!1,li="hubStreamCursors",Eo=new Map,kp=0,ci=new Set,di="pendingUserTexts",Sn=(()=>{try{let e=JSON.parse(sessionStorage.getItem(di)||"[]");return Array.isArray(e)?e.filter(t=>t?.key&&t?.text).slice(-30):[]}catch{return[]}})(),Pc=new Set,Uc=new Map;function Fc(){try{Sn.length?sessionStorage.setItem(di,JSON.stringify(Sn.slice(-30))):sessionStorage.removeItem(di)}catch{}}function $p(){let e=Ys(),t=Sn.filter(n=>n.key===e).length;t&&!Pc.has(e)&&(Pc.add(e),P(`\u231B Restored ${t} queued prompt${t===1?"":"s"} in this browser tab`))}function Wc(e=c.sessionId,t=c.agent,n=c.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function Sp(e={}){let t=Wc(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(li)||"{}")[t])||0}catch{return 0}}function Lp(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=Wc(e.sessionId||c.sessionId,e.agent||c.agent,c.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(li)||"{}")||{}}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(li,JSON.stringify(s))}catch{}return!0}function Ys({sessionId:e=c.sessionId,agent:t=c.agent,machineId:n=c.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function Ep(){_c||(_c=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(at=400,ss({probe:!0}),c.ws?.readyState===WebSocket.OPEN&&c.sessionId))try{c.ws.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}}),window.addEventListener("online",()=>{at=400,ss({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?ss({force:!0}):ss({probe:!0})}),window.addEventListener("focus",()=>ss({probe:!0})),navigator.connection?.addEventListener?.("change",()=>{at=400,ss({probe:!0})}))}function Js(){let e=i("conn-dot");if(!e)return;let t=fe.peek();e.classList.remove("bg-success","bg-warning","bg-error","bg-base-content/30","animate-pulse"),t==="open"?(e.classList.add("bg-success"),e.title="\u5DF2\u8FDE\u63A5"):t==="connecting"||t==="reconnecting"?(e.classList.add("bg-warning","animate-pulse"),e.title=t==="connecting"?"\u8FDE\u63A5\u4E2D\u2026":"\u91CD\u8FDE\u4E2D\u2026"):t==="offline"?(e.classList.add("bg-error"),e.title="\u79BB\u7EBF"):(e.classList.add("bg-base-content/30"),e.title="\u672A\u8FDE\u63A5")}function ss(e={}){let t=c.ws?.readyState;if(e.force){at=400,ko({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&Mt&&Date.now()-Mt>45e3)try{c.ws.close()}catch{}else if(e.probe&&c.ws.readyState===WebSocket.OPEN)try{c.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(at=Math.min(at,800),ko({quiet:!0}))}function Ip(){At||(fe.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Js(),At=setTimeout(()=>{At=null,ko({quiet:!0})},at),at=Math.min(Math.round(at*1.8),15e3))}function Gc(){go&&(clearInterval(go),go=null)}function Tp(e,t){Gc(),go=setInterval(()=>{if(!(t!==Ks||e.readyState!==WebSocket.OPEN)){if(Mt&&Date.now()-Mt>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&Mt&&Date.now()-Mt>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function jt(){let e=D.peek()||!!E.peek()&&fe.peek()==="open";ba(e)}function wo(){return(c.role||"editor")==="viewer"?"\u53EA\u8BFB\u8D26\u53F7\uFF0C\u65E0\u6CD5\u8F93\u5165":c.lock?.foreign?`\u4F1A\u8BDD\u7531 ${c.lock.holder&&c.lock.holder!=="viewer"?c.lock.holder:"\u5176\u4ED6\u7528\u6237"} \u5360\u7528\uFF08\u9501\uFF09`:"\u5F53\u524D\u65E0\u6CD5\u8F93\u5165"}function as(){let e=tn();c.externalSessionReadOnly=!e;let t=i("chat-input"),n=i("send-btn"),s=i("btn-attach"),a=i("session-lock-banner");t&&(t.disabled=!e,t.readOnly=!e,e?D.peek()?t.placeholder="\u56DE\u590D\u4E2D\u2026 \u53EF\u5148\u5199\u597D\u4E0B\u4E00\u6761\uFF0C\u7ED3\u675F\u540E\u81EA\u52A8\u53D1\u9001 \xB7 \u6216\u70B9 \u25A0 \u505C\u6B62":Qs(t.value||""):t.placeholder=wo()),n&&(n.disabled=!e),s&&(s.disabled=!e),a&&(e?(a.classList.add("hidden"),a.textContent=""):(a.classList.remove("hidden"),a.textContent=wo()))}function Cp(){at=400,At&&(clearTimeout(At),At=null),vo=!1;let e=c.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{c.ws?.close()}catch{}ko({quiet:!1}),P("\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65\u2026")}function ko(e={}){Ep(),At&&(clearTimeout(At),At=null),e.quiet&&(vo=!0);let t=c.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);Nc!==t&&(ca(),Nc=t);let n=++Ks;try{c.ws?.close()}catch{}fe.value="connecting",Js();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;c.token&&a.set("token",c.token),t&&a.set("machine",t),c.sessionId&&a.set("sessionId",c.sessionId),c.agent&&a.set("agent",c.agent);let o=Sp();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);c.ws=r,r.addEventListener("open",()=>{if(n===Ks){if(at=1e3,Mt=Date.now(),fe.value="open",Js(),c.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}la(),$p(),Tp(r,n),jt(),bo&&!vo&&P(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),bo=!1,vo=!1}}),r.addEventListener("message",d=>{if(n!==Ks)return;let u;try{u=JSON.parse(d.data)}catch{return}if(Lp(u)){if(u.type==="pong"){Mt=Date.now();return}if(u.type==="ping"){if(Mt=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(u.type==="run-status"){u.running?D.value=!0:(D.peek()&&(D.value=!1),ui()),jt();return}Kc(u)}}),r.addEventListener("close",()=>{n===Ks&&(Gc(),bo=!0,fe.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Js(),Ip())}),r.addEventListener("error",()=>{})}function ui(){if(!Sn.length||D.peek())return;let e=Ys(),t=Sn.findIndex(a=>a.key===e);if(t<0)return;let[n]=Sn.splice(t,1);Fc();let s=i("chat-input");s&&(s.value=n.text,Vs(s)),setTimeout(()=>{if(n.key!==Ys()||D.peek()){Uc.set(n.key,n.text);return}Xs()},0)}function mo(){D.value=!1,jt(),ui()}function Kc(e){if(!(e?.sessionId&&c.sessionId&&e.sessionId!==c.sessionId)){if(e&&typeof e.type=="string"&&(e.type==="note.added"||e.type==="note.updated"||e.type==="note.removed"||e.type==="queue.item.added"||e.type==="queue.item.updated"||e.type==="queue.item.removed"||e.type==="queue.item.moved"||e.type==="queue.item.sending")){window.dispatchEvent(new CustomEvent("hub-ws-message",{detail:e}));let t={"note.added":"hub:note-added","note.updated":"hub:note-updated","note.removed":"hub:note-removed"}[e.type];t&&window.dispatchEvent(new CustomEvent(t,{detail:e}))}if(e._hubReplay===!0){document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)Kc(t);return}if(e.type==="session-created"){let t=_.peek();c.sessionId=e.sessionId,e.agent&&e.agent!==S.peek()&&Ne(e.agent),se(t,e.agent||S.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-sessions-changed"){document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-session-updated"){document.dispatchEvent(new CustomEvent("sessions-changed")),document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="notification"&&e.notification){xa(e.notification);return}if(e.type==="grok-queue-status"){Qp(e);return}if(e.type==="result"){zs(),Gs(),os();let t=e.usage;if(t){let n={input_tokens:t.inputTokens??t.input_tokens,output_tokens:t.outputTokens??t.output_tokens,cache_read_input_tokens:t.cacheReadInputTokens??t.cache_read_input_tokens,cache_creation_input_tokens:t.cacheCreationInputTokens??t.cache_creation_input_tokens,total_tokens:t.totalTokens??t.total_tokens,reasoning_tokens:t.reasoningTokens??t.reasoning_tokens,costUSD:t.costUSD??t.cost_usd};c.lastUsage=n,c.sessionId&&(c.lastUsageSessionId=c.sessionId),xo(n)}e.is_error||P("\u2713 Done"),mo();return}if(e.type==="complete"){zs(),Gs(),os(),!e.aborted&&e.agent==="claude"?P("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?P("\u2713 Done"):e.aborted&&P("\u5DF2\u505C\u6B62")),mo();return}if(e.type==="error"){zs(),Gs(),(e.code===423||/locked/i.test(String(e.message||"")))&&(c.lock={...c.lock||{},held:!1,foreign:!0,holder:e.lock?.holder||c.lock?.holder||"another user"},as()),rs("error","Error",yp(e.message)),mo();return}if(e.type==="shell-start"){c.shellBubble=null;return}if(e.type==="shell-output"){c.shellBubble||(c.shellBubble=Xp(e.stream==="stderr"?"shell-err":"shell")),Zp(c.shellBubble,e.data);return}if(e.type==="shell-exit"){c.shellBubble=null,P(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),mo();return}if(e.type==="assistant"){Gs();for(let t of e.message?.content||[])t.type==="text"&&t.text?(os(),rs("assistant",xp(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&nf(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){D.peek()||(D.value=!0,jt()),zc(e.ts);return}if(e.type==="assistant_delta"){D.peek()||(D.value=!0,jt()),Mp(e.data||"");return}if(e.type==="assistant_stream_end"){Gs();return}if(e.type==="thought_stream_start"){Jc();return}if(e.type==="thought_delta"){Ap(e.data||"");return}if(e.type==="thought_stream_end"){zs();return}if(e.type==="status"){let t=i("stream-status");if(t)t.textContent=e.message||"";else{let n=i("messages");n&&e.message&&(n.insertAdjacentHTML("beforeend",`<div id="stream-status" class="text-center text-[10px] text-base-content/35 py-0.5">${p(e.message)}</div>`),Re(n))}return}if(e.type==="permission_resolved"){let t=e.requestId||e.request_id;t&&i(`perm-${t}`)?.remove();return}(e.type==="permission_request"||e.request_id&&e.tool_name)&&sf(e)}}var st=null,Ge=null,Ot=null,mt=null;function zc(e){let t=i("messages");if(!t||(os(),zs(),st&&t.contains(st)))return;let n=$o(e||Date.now()),s=So(e||Date.now());t.insertAdjacentHTML("beforeend",`
|
|
1147
|
+
</button>`).join("")}),je(()=>{Dt.value,Vt.value,ht.value,rt.value,T.value;let l=i("session-list");if(!l||l.querySelector(".session-rename-input"))return;let f=Kr();if(l._lastHtml===f){qs();return}let m=l.scrollTop;l.innerHTML=f,l._lastHtml=f,l.scrollTop=m,qs()}),je(()=>{gt.value,qs()}),je(()=>{ne.value,ye.value,D.value,M.value;let l=i("welcome");l&&(document.documentElement.classList.contains("boot-restore")||document.documentElement.classList.contains("boot-pending")||l.classList.contains("hidden")||l.style.display==="none"||vn())}),De(ke,l=>{let f=i("session-filter-badge");f&&(f.style.display=l?"inline":"none",f.title=l||"")}),je(()=>{let l=E.value;if(l&&l.path)wc(l.path);else{let f=i("project-notes-bar");f&&(f.style.display="none")}}),De(X,l=>{document.querySelectorAll("[data-tab]").forEach(m=>{let g=m.dataset.tab===l;m.classList.toggle("text-primary",g),m.classList.toggle("border-primary",g),m.classList.toggle("text-base-content/50",!g),m.classList.toggle("border-transparent",!g)});let f=i("project-view");f&&!f.classList.contains("hidden")&&(f.style.display="flex",f.style.flexDirection="column",f.style.minHeight="0",f.style.flex="1"),["chat","files","git","shell","memory"].forEach(m=>{let g=i(`tab-${m}`);if(!g)return;let w=m===l;g.classList.toggle("hidden",!w),w?(g.style.display="flex",g.style.flexDirection="column",g.style.flex="1 1 0",g.style.minHeight="0",g.style.overflow="hidden"):g.style.display="none"}),l==="memory"&&eo(),l==="shell"&&requestAnimationFrame(()=>{document.dispatchEvent(new CustomEvent("shell-tab-shown"))}),Ee()}),_c(),Dc(),el({openSession:nt});let s=l=>{i("app")?.classList.toggle("chat-chrome-collapsed",l),i("btn-expand-chat-chrome")?.classList.toggle("hidden",!l),localStorage.setItem("chatChromeCollapsed",l?"1":"0")};s(localStorage.getItem("chatChromeCollapsed")==="1");let a=null;document.addEventListener("sessions-changed",()=>{a&&clearTimeout(a),a=setTimeout(()=>{a=null,We({waitFresh:!1})},1200)}),document.addEventListener("router:home",po),document.addEventListener("router:session",async({detail:{id:l,tab:f,machineId:m,agent:g}})=>{let w=ne.peek().find(H=>H.sessionId===l),y=Xt();await nt(l,w?.cwd||(y?.sessionId===l?y.cwd:null)||null,w?.configDir||(y?.sessionId===l?y.configDir:null)||null,g||w?.agent||(y?.sessionId===l?y.agent:null)||null,m||w?.machineId||(y?.sessionId===l?y.machineId:null)||null,{tab:f||"chat"})}),b.on("click","#btn-home",po),b.on("click","#btn-share-session, #btn-share-session-current",async(l,f)=>{let m=Sl();if(m)try{await navigator.clipboard.writeText(m),f.classList.add("is-copied"),f.title="\u5DF2\u590D\u5236\u5206\u4EAB\u94FE\u63A5",setTimeout(()=>{f.classList.remove("is-copied"),f.title="\u590D\u5236\u5F53\u524D\u4F1A\u8BDD\u5206\u4EAB\u94FE\u63A5"},1400)}catch{window.prompt("\u590D\u5236\u4F1A\u8BDD\u94FE\u63A5\uFF1A",m)}}),b.on("click","#auth-btn",oi),b.on("submit","#auth-form",l=>{l.preventDefault(),oi()}),b.on("keydown","#auth-username, #auth-password",l=>{l.key==="Enter"&&oi()}),b.on("click","#hamburger",()=>i("sidebar").classList.contains("open")?Ws():Ac()),b.on("click","#sidebar-overlay",Ws),document.addEventListener("keydown",l=>{l.key==="Escape"&&window.innerWidth<=640&&i("sidebar")?.classList.contains("open")&&(l.preventDefault(),Ws())}),b.on("input","#session-search",(l,f)=>{$e.value=f.value,Za(f.value)}),b.on("click","#sidebar-filter-toggle",()=>{let l=i("sidebar-filter-menu");if(!l)return;let f=l.classList.toggle("hidden");i("sidebar-filter-toggle")?.setAttribute("aria-expanded",String(!f))}),b.on("change","[data-agent-option]",(l,f)=>{let m=new Set(zt.peek());f.checked?m.add(f.dataset.agentOption):m.delete(f.dataset.agentOption);let g=[...m];zt.value=g,localStorage.setItem("agentFilters",JSON.stringify(g)),ye.value=g.length===1?g[0]:"all"}),b.on("change","#filter-favorites",(l,f)=>{ze.value=f.checked,localStorage.setItem("favoritesOnly",f.checked?"1":"0")}),b.on("change","#filter-hidden",(l,f)=>{Je.value=f.checked,localStorage.setItem("showHiddenOnly",f.checked?"1":"0")}),b.on("click","#filter-clear",()=>{zt.value=[],ye.value="all",ze.value=!1,Je.value=!1,localStorage.setItem("agentFilters","[]"),localStorage.setItem("favoritesOnly","0"),localStorage.setItem("showHiddenOnly","0"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=!1}),i("filter-favorites")&&(i("filter-favorites").checked=!1),i("filter-hidden")&&(i("filter-hidden").checked=!1)}),b.on("click","#session-filter-badge",()=>{ke.value=null}),b.on("click","[data-ws-tab]",(l,f)=>{ke.value=f.dataset.wsTab||null}),b.on("click","#sidebar-refresh",()=>{We(),$e.peek().trim()&&Xa($e.peek())}),b.on("click","[data-view]",(l,f)=>{ht.value=f.dataset.view,localStorage.setItem("sidebarView",f.dataset.view)}),b.on("click","[data-agent-filter]",(l,f)=>{ye.value=f.dataset.agentFilter,localStorage.setItem("agentFilter",f.dataset.agentFilter),$e.peek().trim()&&Za($e.peek())}),b.on("dblclick","[data-project-cwd]",(l,f)=>{let m=f.dataset.projectCwd;if(!m)return;let g=m.split("/").filter(Boolean).pop()||m;Zr({id:g,name:g,path:m}),C(`Project \xB7 ${m}`)}),b.on("click","#btn-pwa-install",async()=>{await qi()||yp()}),document.addEventListener("pwa-installable",()=>{document.getElementById("btn-pwa-install")?.classList.remove("hidden")}),b.on("click","#btn-settings",qa),b.on("click","#btn-notes",()=>Ra()),b.on("click","#btn-collapse-chat-chrome",()=>s(!0)),b.on("click","#btn-expand-chat-chrome",()=>s(!1)),b.on("click","#btn-meta-agent",()=>zl()),b.on("click","#btn-meta-agent-welcome",()=>_r("chat")),b.on("click","#btn-theme",ti),b.on("click","[data-sidebar-action]",(l,f)=>{let m=f.dataset.sidebarAction;m==="new"&&ni(),m==="theme"&&ti(),m==="settings"&&qa(),m==="logout"&&(c.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload())}),b.on("click","#btn-cal-prev",()=>{Br(-1),vn(bn())}),b.on("click","#btn-cal-next",()=>{Br(1),vn(bn())}),b.on("click","[data-cal-date]",(l,f)=>{uc(f.dataset.calDate),vn(bn())}),b.on("click","[data-session-id]",(l,f)=>{l.target.closest("[data-fav-toggle]")||l.target.closest("[data-hide-toggle]")||l.target.closest("[data-rename-session]")||l.target.closest(".session-rename-input")||l.target.closest(".session-title-wrap.session-rename-active")||(nt(f.dataset.sessionId,f.dataset.sessionCwd||null,f.dataset.sessionConfigDir||null,f.dataset.sessionAgent||"claude",f.dataset.sessionMachine||null),jc())}),b.on("click","[data-rename-session]",(l,f)=>{l.preventDefault(),l.stopPropagation();let m=f.closest(".session-title-wrap")||f,g=m.dataset.renameSessionId||m.dataset.sessionId;g&&Qr({sessionId:g,agent:m.dataset.renameSessionAgent||"claude",machineId:m.dataset.renameSessionMachine||null,fallbackDisplay:m.dataset.renameSessionDisplay||"",mountEl:m})}),b.on("click","[data-rename-bar]",(l,f)=>{if(l.preventDefault(),l.stopPropagation(),!c.sessionId)return;let m=document.getElementById("session-title-display")||f;Qr({sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null,mountEl:m})}),b.on("click","[data-folder]",(l,f)=>{let m=f.dataset.folder,w=f.querySelector("span")?.textContent.trim()==="\u25BE",y=new Set(Cn.peek()),H=new Set(Mn.peek());w?(y.delete(m),H.add(m)):(y.add(m),H.delete(m)),xe(()=>{Cn.value=y,Mn.value=H})}),b.on("click","#memory-refresh",eo),b.on("click","[data-memory-file]",l=>zr(l.dataset.memoryFile,l.dataset.memoryAgent)),b.on("click","[data-tab]",(l,f)=>Tt(f.dataset.tab));let o=async(l,f)=>{let m=i(l),g=m?.value.trim();if(!g){f.value="";return}try{let w=await x("POST","/api/resolve-path",{path:g});if(w.isDir===!1)throw new Error("Path is not a directory on the target machine");f.value=w.path,m.value=w.path;let y=E.peek();y&&(E.value={...y,path:w.path})}catch(w){m.style.color="oklch(var(--er))",m.title=w.message,setTimeout(()=>{m.style.color="",m.title=""},2e3)}};b.on("click","#files-root-btn",()=>o("files-root-input",re)),b.on("click","#git-root-btn",()=>o("git-root-input",Se)),b.on("keydown","#files-root-input",l=>{l.key==="Enter"&&o("files-root-input",re)}),b.on("keydown","#git-root-input",l=>{l.key==="Enter"&&o("git-root-input",Se)}),b.on("click","#btn-opts",()=>{i("chat-opts").classList.toggle("hidden"),Ee()}),b.on("change","#sel-agent",(l,f)=>{let m=$.peek(),g=f.value;m!==g&&(c.sessionId=null,Ne(g),se(Be(g)||_.peek()),i("sel-permission").value=de.peek(),et(),C(`Agent \u2192 ${Z[g]||g} \xB7 model ${_.peek()} \xB7 new session`))}),b.on("change","#sel-convert-agent",async(l,f)=>{let m=f.value;if(!m)return;let g=c.sessionId;if(!g){alert("No active session to convert."),f.value="";return}let w=c.agent||$.peek()||"claude";if(w===m){alert("Cannot convert to the same agent."),f.value="";return}f.disabled=!0,C(`Converting session ${g.slice(0,8)} from ${w} to ${m}...`);try{let y=await x("POST",`/api/sessions/${g}/convert`,{targetAgent:m,sourceAgent:w});y&&y.success?(C(`\u2713 Converted successfully. New session: ${y.targetSessionId.slice(0,8)}`),await We(),await nt(y.targetSessionId,E.peek()?.path||null,null,y.targetAgent),Es()):C("Failed to convert session.")}catch(y){C(`Error converting session: ${y.message}`),alert(`Error converting session: ${y.message}`)}finally{f.disabled=!1,f.value=""}}),b.on("change","#sel-model",(l,f)=>{se(f.value),Va()}),b.on("click","#btn-model-add",()=>Ya({editCurrent:!1})),b.on("click","#btn-model-edit",()=>Ya({editCurrent:!0})),b.on("change","#sel-effort",(l,f)=>{te.value=f.value}),b.on("change","#sel-permission",(l,f)=>{de.value=f.value}),b.on("change","#sel-density",(l,f)=>{Go(f.value),C(`Density \u2192 ${f.value} (applies to new tool calls; reload session to re-group history)`)}),document.addEventListener("agent-changed",et),b.on("click","#btn-new-session, #btn-new-session-current, #btn-new-session-welcome",ni),b.on("click","#new-session-cancel",()=>i("modal-new-session").close()),b.on("click","#new-session-start",ai),b.on("change","#new-session-agent",si),b.on("keydown","#new-session-path",l=>{l.key==="Enter"&&ai()}),b.on("click","#send-btn",Ls),b.on("click","#stop-btn",fl),b.on("click","#btn-logout",()=>{c.token=null,localStorage.removeItem("token"),Le(null),it.value=!1,location.reload()}),b.on("click","[data-pick-machine]",async(l,f)=>{let m=f.dataset.pickMachine;if(!m||m===D.peek()){kn();return}await Yr(m,{forceReload:!0}),va()});let r=async()=>{let l=i("machine-picker-status");if(l&&(l.textContent="\u5237\u65B0\u4E2D\u2026"),await yn(),ro(),Bs(),Ot(),l){let f=(ie.peek()||[]).filter(m=>m.online!==!1).length;l.textContent=`${f} online`}};b.on("click","#btn-refresh-machines",r),b.on("click","#btn-refresh-machines-menu",async l=>{l.stopPropagation(),await r()}),b.on("click","#btn-machine-menu",async l=>{l.stopPropagation(),xn(),an();let f=i("machine-menu");f&&(f.classList.contains("hidden")?(await yn(),Bs(),f.classList.remove("hidden")):f.classList.add("hidden"))}),b.on("click","#btn-recent-sessions",l=>{l.preventDefault(),l.stopPropagation(),kn(),an(),dc();let f=!i("recent-menu")?.classList.contains("hidden"),m=i("btn-recent-sessions");m&&m.setAttribute("aria-expanded",f?"true":"false")}),b.on("click","#recent-menu-backdrop",l=>{l.preventDefault(),l.stopPropagation(),xn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),document.addEventListener("click",l=>{let f=i("machine-menu-wrap");f&&!f.contains(l.target)&&kn();let m=i("recent-menu"),g=i("btn-recent-sessions"),w=l.target;if(m&&!m.classList.contains("hidden")){if(m.contains(w)||g?.contains(w))return;xn(),g?.setAttribute("aria-expanded","false")}}),b.on("click","#btn-notifications",l=>{l.preventDefault(),l.stopPropagation(),kn(),xn(),Zi()}),window.addEventListener("resize",()=>{i("recent-menu")&&!i("recent-menu").classList.contains("hidden")&&Rr()}),b.on("click","#recent-menu [data-session-id]",()=>{xn(),i("btn-recent-sessions")?.setAttribute("aria-expanded","false")}),b.on("click","[data-dismiss-recent-session]",(l,f)=>{l.preventDefault(),l.stopPropagation(),lc({sessionId:f.dataset.dismissRecentSession,agent:f.dataset.dismissRecentAgent||"claude",machineId:f.dataset.dismissRecentMachine||null})}),b.on("click","#btn-edit-project-notes, #project-goal-text, #project-notes-text",()=>{kc()}),b.on("click","#btn-cancel-project-notes",()=>{ts()});let d=async()=>{let l=i("project-goal-input")?.value?.trim()??"",f=i("project-notes-input")?.value?.trim()??"",m=E.peek();if(!(!m||!m.path))try{let g=await x("POST","/api/projects/notes",{root:m.path,goal:l,notes:f});yc(g.goal||"",g.notes||""),ts()}catch(g){alert(`Error saving project notes: ${g.message}`)}};b.on("click","#btn-save-project-notes",d),b.on("keydown","#project-goal-input",l=>{l.key==="Enter"&&d(),l.key==="Escape"&&ts()}),b.on("keydown","#project-notes-input",l=>{l.key==="Escape"&&ts()}),b.on("click","[data-fav-toggle]",(l,f)=>{l.stopPropagation(),l.preventDefault();let m=f.dataset.favSessionMachine||c.machineId;m&&(c.machineId=m,localStorage.setItem("machineId",m)),Lc(f.dataset.favSessionId,f.dataset.favSessionAgent||"claude",{machineId:m||null})}),b.on("click","[data-hide-toggle]",(l,f)=>{l.stopPropagation(),l.preventDefault();let m=f.dataset.hideSessionMachine||c.machineId;m&&(c.machineId=m,localStorage.setItem("machineId",m)),Ec(f.dataset.hideSessionId,f.dataset.hideSessionAgent||"claude",{machineId:m||null})}),b.on("click","#btn-edit-session-notes, #session-notes-text",()=>{$c()}),b.on("click","#btn-cancel-session-notes",()=>tt()),b.on("click","#btn-save-session-notes",async()=>{let l=i("session-notes-input")?.value?.trim()||"";if(!c.sessionId)return;let f=c.agent||$.peek()||"claude";await Jr(c.sessionId,f,l)&&tt()}),b.on("keydown","#session-notes-input",async l=>{if(l.key==="Escape"&&tt(),l.key==="Enter"){let f=l.target.value.trim();if(!c.sessionId)return;let m=c.agent||$.peek()||"claude";await Jr(c.sessionId,m,f)&&tt()}}),b.on("click","#btn-fav-filter",()=>{let l=!ze.peek();ze.value=l,localStorage.setItem("favoritesOnly",l?"1":"0"),i("btn-fav-filter")?.classList.toggle("active",l),l&&Je.peek()&&(Je.value=!1,localStorage.setItem("showHiddenOnly","0"),i("btn-hidden-filter")?.classList.remove("active"))}),b.on("click","#btn-hidden-filter",()=>{let l=!Je.peek();Je.value=l,localStorage.setItem("showHiddenOnly",l?"1":"0"),i("btn-hidden-filter")?.classList.toggle("active",l),l&&ze.peek()&&(ze.value=!1,localStorage.setItem("favoritesOnly","0"),i("btn-fav-filter")?.classList.remove("active"))}),et(),je(()=>{M.value,D.value,c.token&&va()}),i("sel-permission").value=de.peek(),vl();let u=i("sel-density");u&&(u.value=_e.peek()||"normal"),document.querySelectorAll("[data-agent-option]").forEach(l=>{l.checked=zt.peek().includes(l.dataset.agentOption)}),i("filter-favorites")&&(i("filter-favorites").checked=ze.peek()),i("filter-hidden")&&(i("filter-hidden").checked=Je.peek()),document.querySelectorAll("[data-agent-filter]").forEach(l=>{l.classList.toggle("active",l.dataset.agentFilter===ye.peek())}),i("btn-fav-filter")?.classList.toggle("active",ze.peek()),i("btn-hidden-filter")?.classList.toggle("active",Je.peek()),document.querySelectorAll("[data-view]").forEach(l=>{let f=l.dataset.view===ht.peek();l.classList.toggle("bg-primary/15",f),l.classList.toggle("text-primary",f),l.classList.toggle("font-medium",f),l.classList.toggle("text-base-content/50",!f)})}G();er();W();le();hs();or();ya();_n();Zt();en();ir();_t();_t();function wp(){return Z[$.peek()]||"Assistant"}function kp(e){let t=String(e||"").trim();return/remote compact task|error decoding response body/i.test(t)?"Codex \u4F1A\u8BDD\u538B\u7F29\u5931\u8D25\uFF08\u7F51\u7EDC\u4E2D\u65AD\uFF09\u3002\u518D\u53D1\u4E00\u6761\u6D88\u606F\u91CD\u8BD5\uFF0C\u6216\u5F00\u65B0\u4F1A\u8BDD\u3002":t||"\u53D1\u9001\u5931\u8D25"}var $n=null;function $p(e){return vs(e)}function Fc(e){return e?($n&&$n.el===e||($n?.destroy?.(),$n=wa(e),$n.el=e),$n):null}function Re(e,t){if(!e||e.dataset.historyPainting==="1")return;Fc(e).stick(!!t)}var Ks=0,At=null,at=1e3,Mt=0,go=null,Pc=!1,bo=!1,Hc=null,vo=!1,ci="hubStreamCursors",Eo=new Map,Sp=0,di=new Set,ui="pendingUserTexts",Sn=(()=>{try{let e=JSON.parse(sessionStorage.getItem(ui)||"[]");return Array.isArray(e)?e.filter(t=>t?.key&&t?.text).slice(-30):[]}catch{return[]}})(),qc=new Set,Wc=new Map;function Gc(){try{Sn.length?sessionStorage.setItem(ui,JSON.stringify(Sn.slice(-30))):sessionStorage.removeItem(ui)}catch{}}function Lp(){let e=Ys(),t=Sn.filter(n=>n.key===e).length;t&&!qc.has(e)&&(qc.add(e),P(`\u231B Restored ${t} queued prompt${t===1?"":"s"} in this browser tab`))}function Kc(e=c.sessionId,t=c.agent,n=c.machineId){return e?`${n||""}:${t||"claude"}:${e}`:""}function Ep(e={}){let t=Kc(e.sessionId,e.agent,e.machineId);if(!t)return 0;try{return Number(JSON.parse(localStorage.getItem(ci)||"{}")[t])||0}catch{return 0}}function Ip(e){let t=Number(e?.hubSeq)||0;if(!t)return!0;let n=Kc(e.sessionId||c.sessionId,e.agent||c.agent,c.machineId);if(!n)return!0;let s={};try{s=JSON.parse(localStorage.getItem(ci)||"{}")||{}}catch{}let a=Number(s[n])||0;if(t<=a)return!1;s[n]=t;let o=Object.keys(s);o.length>500&&o.sort((r,d)=>Number(s[d])-Number(s[r])).slice(500).forEach(r=>delete s[r]);try{localStorage.setItem(ci,JSON.stringify(s))}catch{}return!0}function Ys({sessionId:e=c.sessionId,agent:t=c.agent,machineId:n=c.machineId}={}){return e?`${n||""}:${t||"claude"}:${e}`:null}function Tp(){Pc||(Pc=!0,document.addEventListener("visibilitychange",()=>{if(document.visibilityState==="visible"&&(at=400,ss({probe:!0}),c.ws?.readyState===WebSocket.OPEN&&c.sessionId))try{c.ws.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}}),window.addEventListener("online",()=>{at=400,ss({force:!0})}),window.addEventListener("pageshow",e=>{e.persisted?ss({force:!0}):ss({probe:!0})}),window.addEventListener("focus",()=>ss({probe:!0})),navigator.connection?.addEventListener?.("change",()=>{at=400,ss({probe:!0})}))}function Js(){let e=i("conn-dot");if(!e)return;let t=fe.peek();e.classList.remove("bg-success","bg-warning","bg-error","bg-base-content/30","animate-pulse"),t==="open"?(e.classList.add("bg-success"),e.title="\u5DF2\u8FDE\u63A5"):t==="connecting"||t==="reconnecting"?(e.classList.add("bg-warning","animate-pulse"),e.title=t==="connecting"?"\u8FDE\u63A5\u4E2D\u2026":"\u91CD\u8FDE\u4E2D\u2026"):t==="offline"?(e.classList.add("bg-error"),e.title="\u79BB\u7EBF"):(e.classList.add("bg-base-content/30"),e.title="\u672A\u8FDE\u63A5")}function ss(e={}){let t=c.ws?.readyState;if(e.force){at=400,ko({quiet:!0});return}if(t===WebSocket.OPEN){if(e.probe&&Mt&&Date.now()-Mt>45e3)try{c.ws.close()}catch{}else if(e.probe&&c.ws.readyState===WebSocket.OPEN)try{c.ws.send(JSON.stringify({type:"ping"}))}catch{}return}t!==WebSocket.CONNECTING&&(at=Math.min(at,800),ko({quiet:!0}))}function Cp(){At||(fe.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Js(),At=setTimeout(()=>{At=null,ko({quiet:!0})},at),at=Math.min(Math.round(at*1.8),15e3))}function zc(){go&&(clearInterval(go),go=null)}function Mp(e,t){zc(),go=setInterval(()=>{if(!(t!==Ks||e.readyState!==WebSocket.OPEN)){if(Mt&&Date.now()-Mt>7e4){try{e.close()}catch{}return}if(!(typeof document<"u"&&document.visibilityState==="hidden")&&Mt&&Date.now()-Mt>4e4)try{e.send(JSON.stringify({type:"ping"}))}catch{}}},3e4)}function jt(){let e=N.peek()||!!E.peek()&&fe.peek()==="open";ba(e)}function wo(){return(c.role||"editor")==="viewer"?"\u53EA\u8BFB\u8D26\u53F7\uFF0C\u65E0\u6CD5\u8F93\u5165":c.lock?.foreign?`\u4F1A\u8BDD\u7531 ${c.lock.holder&&c.lock.holder!=="viewer"?c.lock.holder:"\u5176\u4ED6\u7528\u6237"} \u5360\u7528\uFF08\u9501\uFF09`:"\u5F53\u524D\u65E0\u6CD5\u8F93\u5165"}function as(){let e=tn();c.externalSessionReadOnly=!e;let t=i("chat-input"),n=i("send-btn"),s=i("btn-attach"),a=i("session-lock-banner");t&&(t.disabled=!e,t.readOnly=!e,e?N.peek()?t.placeholder="\u56DE\u590D\u4E2D\u2026 \u53EF\u5148\u5199\u597D\u4E0B\u4E00\u6761\uFF0C\u7ED3\u675F\u540E\u81EA\u52A8\u53D1\u9001 \xB7 \u6216\u70B9 \u25A0 \u505C\u6B62":Qs(t.value||""):t.placeholder=wo()),n&&(n.disabled=!e),s&&(s.disabled=!e),a&&(e?(a.classList.add("hidden"),a.textContent=""):(a.classList.remove("hidden"),a.textContent=wo()))}function Ap(){at=400,At&&(clearTimeout(At),At=null),vo=!1;let e=c.ws?.readyState;if(e===WebSocket.OPEN||e===WebSocket.CONNECTING)try{c.ws?.close()}catch{}ko({quiet:!1}),P("\u6B63\u5728\u91CD\u65B0\u8FDE\u63A5\u5E76\u540C\u6B65\u2026")}function ko(e={}){Tp(),At&&(clearTimeout(At),At=null),e.quiet&&(vo=!0);let t=c.machineId||(typeof localStorage<"u"?localStorage.getItem("machineId"):null);Hc!==t&&(ca(),Hc=t);let n=++Ks;try{c.ws?.close()}catch{}fe.value="connecting",Js();let s=location.protocol==="https:"?"wss":"ws",a=new URLSearchParams;c.token&&a.set("token",c.token),t&&a.set("machine",t),c.sessionId&&a.set("sessionId",c.sessionId),c.agent&&a.set("agent",c.agent);let o=Ep();o&&a.set("lastSeq",String(o));let r=new WebSocket(`${s}://${location.host}/ws/chat?${a}`);c.ws=r,r.addEventListener("open",()=>{if(n===Ks){if(at=1e3,Mt=Date.now(),fe.value="open",Js(),c.sessionId)try{r.send(JSON.stringify({type:"subscribe",sessionId:c.sessionId,agent:c.agent}))}catch{}la(),Lp(),Mp(r,n),jt(),bo&&!vo&&P(t?`\u5DF2\u91CD\u8FDE \xB7 ${t}`:"\u5DF2\u91CD\u8FDE"),bo=!1,vo=!1}}),r.addEventListener("message",d=>{if(n!==Ks)return;let u;try{u=JSON.parse(d.data)}catch{return}if(Ip(u)){if(u.type==="pong"){Mt=Date.now();return}if(u.type==="ping"){if(Mt=Date.now(),r.readyState===WebSocket.OPEN)try{r.send(JSON.stringify({type:"pong"}))}catch{}return}if(u.type==="run-status"){u.running?N.value=!0:(N.peek()&&(N.value=!1),pi()),jt();return}Jc(u)}}),r.addEventListener("close",()=>{n===Ks&&(zc(),bo=!0,fe.value=typeof navigator<"u"&&navigator.onLine===!1?"offline":"reconnecting",Js(),Cp())}),r.addEventListener("error",()=>{})}function pi(){if(!Sn.length||N.peek())return;let e=Ys(),t=Sn.findIndex(a=>a.key===e);if(t<0)return;let[n]=Sn.splice(t,1);Gc();let s=i("chat-input");s&&(s.value=n.text,Vs(s)),setTimeout(()=>{if(n.key!==Ys()||N.peek()){Wc.set(n.key,n.text);return}Xs()},0)}function mo(){N.value=!1,jt(),pi()}var jp=0;function Jc(e){if(!(e?.sessionId&&c.sessionId&&e.sessionId!==c.sessionId)){if(e&&typeof e.type=="string"&&(e.type==="note.added"||e.type==="note.updated"||e.type==="note.removed"||e.type==="queue.item.added"||e.type==="queue.item.updated"||e.type==="queue.item.removed"||e.type==="queue.item.moved"||e.type==="queue.item.sending")){window.dispatchEvent(new CustomEvent("hub-ws-message",{detail:e}));let t={"note.added":"hub:note-added","note.updated":"hub:note-updated","note.removed":"hub:note-removed"}[e.type];t&&window.dispatchEvent(new CustomEvent(t,{detail:e}))}if(e._hubReplay===!0){document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="batch"&&Array.isArray(e.items)){for(let t of e.items)Jc(t);return}if(["assistant","assistant_stream_start","assistant_delta","thought_delta","tool_use"].includes(e.type)&&jp++,e.type==="session-created"){let t=_.peek();c.sessionId=e.sessionId,e.agent&&e.agent!==$.peek()&&Ne(e.agent),se(t,e.agent||$.peek(),e.sessionId),document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-sessions-changed"){document.dispatchEvent(new CustomEvent("sessions-changed"));return}if(e.type==="external-session-updated"){document.dispatchEvent(new CustomEvent("sessions-changed")),document.dispatchEvent(new CustomEvent("external-session-updated",{detail:e}));return}if(e.type==="notification"&&e.notification){xa(e.notification);return}if(e.type==="grok-queue-status"){Xp(e);return}if(e.type==="result"){zs(),Gs(),os();let t=e.usage;if(t){let n={input_tokens:t.inputTokens??t.input_tokens,output_tokens:t.outputTokens??t.output_tokens,cache_read_input_tokens:t.cacheReadInputTokens??t.cache_read_input_tokens,cache_creation_input_tokens:t.cacheCreationInputTokens??t.cache_creation_input_tokens,total_tokens:t.totalTokens??t.total_tokens,reasoning_tokens:t.reasoningTokens??t.reasoning_tokens,costUSD:t.costUSD??t.cost_usd};c.lastUsage=n,c.sessionId&&(c.lastUsageSessionId=c.sessionId),xo(n)}e.is_error||P("\u2713 Done"),mo();return}if(e.type==="complete"){zs(),Gs(),os(),!e.aborted&&e.agent==="claude"?P("\u2713 Done"):!e.aborted&&e.agent&&e.agent!=="claude"&&!e.error||(!e.aborted&&!e.agent?P("\u2713 Done"):e.aborted&&P("\u5DF2\u505C\u6B62")),mo();return}if(e.type==="error"){zs(),Gs(),(e.code===423||/locked/i.test(String(e.message||"")))&&(c.lock={...c.lock||{},held:!1,foreign:!0,holder:e.lock?.holder||c.lock?.holder||"another user"},as()),rs("error","Error",kp(e.message)),mo();return}if(e.type==="shell-start"){c.shellBubble=null;return}if(e.type==="shell-output"){c.shellBubble||(c.shellBubble=tf(e.stream==="stderr"?"shell-err":"shell")),nf(c.shellBubble,e.data);return}if(e.type==="shell-exit"){c.shellBubble=null,P(e.code===0?"\u2713 Exit 0":`\u2717 Exit ${e.code}${e.error?": "+e.error:""}`),mo();return}if(e.type==="assistant"){Gs();for(let t of e.message?.content||[])t.type==="text"&&t.text?(os(),rs("assistant",wp(),t.text,{ts:e.ts||Date.now()})):t.type==="tool_use"&&of(t,{ts:e.ts||Date.now()});return}if(e.type==="assistant_stream_start"){N.peek()||(N.value=!0,jt()),Qc(e.ts);return}if(e.type==="assistant_delta"){N.peek()||(N.value=!0,jt()),Dp(e.data||"");return}if(e.type==="assistant_stream_end"){Gs();return}if(e.type==="thought_stream_start"){Vc();return}if(e.type==="thought_delta"){_p(e.data||"");return}if(e.type==="thought_stream_end"){zs();return}if(e.type==="status"){let t=i("stream-status");if(t)t.textContent=e.message||"";else{let n=i("messages");n&&e.message&&(n.insertAdjacentHTML("beforeend",`<div id="stream-status" class="text-center text-[10px] text-base-content/35 py-0.5">${p(e.message)}</div>`),Re(n))}return}if(e.type==="permission_resolved"){let t=e.requestId||e.request_id;t&&i(`perm-${t}`)?.remove();return}(e.type==="permission_request"||e.request_id&&e.tool_name)&&rf(e)}}var st=null,Ge=null,Bt=null,mt=null;function Qc(e){let t=i("messages");if(!t||(os(),zs(),st&&t.contains(st)))return;let n=$o(e||Date.now()),s=So(e||Date.now());t.insertAdjacentHTML("beforeend",`
|
|
1148
1148
|
<div class="msg-row assistant px-2 live-stream" data-ts="${p(s)}">
|
|
1149
1149
|
<div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-base-200 break-words md">
|
|
1150
1150
|
<div class="msg-stream-body whitespace-pre-wrap"></div>
|
|
1151
1151
|
</div>
|
|
1152
1152
|
${n?`<div class="msg-ts" title="${p(s)}">${p(n)}</div>`:""}
|
|
1153
|
-
</div>`),st=t.lastElementChild,Ge=st.querySelector(".msg-stream-body"),i("stream-status")?.remove(),Re(t)}function
|
|
1153
|
+
</div>`),st=t.lastElementChild,Ge=st.querySelector(".msg-stream-body"),i("stream-status")?.remove(),Re(t)}function Dp(e){e&&(Ge||Qc(Date.now()),Ge&&(Ge.textContent+=e,Re(i("messages"))))}function Gs(){if(!st||!Ge){st=null,Ge=null;return}let e=Ge.textContent||"";e.trim()?(Ge.classList.remove("whitespace-pre-wrap"),Ge.classList.add("md"),Ge.innerHTML=yo(e),nd(st),td(st,e)):st.remove(),st=null,Ge=null,i("stream-status")?.remove()}function Vc(){let e=i("messages");e&&(Bt&&e.contains(Bt)||(e.insertAdjacentHTML("beforeend",`
|
|
1154
1154
|
<div class="msg-row assistant px-2 thought-stream">
|
|
1155
1155
|
<div class="max-w-[88%] rounded-lg border border-base-300/60 bg-base-200/50 px-2.5 py-1.5 text-[11px] text-base-content/45">
|
|
1156
1156
|
<div class="font-medium text-base-content/35 mb-0.5">thinking\u2026</div>
|
|
1157
1157
|
<div class="thought-body font-mono whitespace-pre-wrap max-h-24 overflow-y-auto opacity-80"></div>
|
|
1158
1158
|
</div>
|
|
1159
|
-
</div>`),
|
|
1160
|
-
<div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}
|
|
1161
|
-
Available: ${u}`:""}`),!0}let a=
|
|
1159
|
+
</div>`),Bt=e.lastElementChild,mt=Bt.querySelector(".thought-body"),Re(e)))}function _p(e){e&&(mt||Vc(),mt&&(mt.textContent+=e,mt.scrollTop=mt.scrollHeight,Re(i("messages"))))}function zs(){if(Bt&&mt){let e=(mt.textContent||"").length;Bt.innerHTML=`
|
|
1160
|
+
<div class="text-[10px] text-base-content/30 px-1 select-none">\u{1F4AD} thought ${e?`(${e} chars)`:""}</div>`}Bt=null,mt=null}var Np={haiku:"claude-haiku-4-5",sonnet:"claude-sonnet-4-6",opus:"claude-opus-4-5",sonnet4:"claude-sonnet-4-6",haiku4:"claude-haiku-4-5"};function Pp(e){let[t,...n]=e.slice(1).trim().split(/\s+/),s=n.join(" ");switch(t.toLowerCase()){case"agent":{if(!s)return P(`Current agent: ${$.peek()} \xB7 agents: claude | codex | grok | gemini | cursor`),!0;let a=s.toLowerCase();return["claude","codex","grok","gemini","cursor"].includes(a)?(a!==$.peek()?(c.sessionId=null,Ne(a),se(Be(a)),document.dispatchEvent(new CustomEvent("agent-changed")),P(`Agent \u2192 ${Z[a]} \xB7 model ${_.peek()} \xB7 new session`)):P(`Agent already ${Z[a]}`),!0):(P(`Unknown agent "${s}" \xB7 valid: claude | codex | grok | gemini | cursor`),!0)}case"model":{if(!s){let d=$.peek(),u=Oe(d).map(l=>l.value).join(" | ");return P(`Current model: ${_.peek()} (${d})${u?`
|
|
1161
|
+
Available: ${u}`:""}`),!0}let a=Np[s.toLowerCase()]||s,o=$.peek()||"claude",r=Oe(o).some(d=>d.value===a);return r||Jt(o,a),se(a),P(`Model set to ${a}${r?"":" (saved as custom \u2605)"}`),document.dispatchEvent(new CustomEvent("agent-changed")),!0}case"effort":{let a=Qt($.peek(),_.peek());return s?a.includes(s.toLowerCase())?(te.value=s.toLowerCase(),P(`Effort set to ${s.toLowerCase()}`),!0):(P(`Unknown effort level "${s}" \xB7 valid: ${a.join(" | ")}`),!0):(P(`Current effort: ${te.peek()||"(default)"} \xB7 levels: ${a.join(" | ")}`),!0)}case"clear":return Vp(),c.sessionId=null,c.lastUsage=null,P("Cleared \xB7 new session"),!0;case"usage":return Hp(),!0;case"help":return P(`Available slash commands:
|
|
1162
1162
|
/agent [claude|codex|grok|gemini|cursor]
|
|
1163
1163
|
/model [haiku|sonnet|opus|<model-id>]
|
|
1164
1164
|
/effort [low|medium|high|xhigh|max]
|
|
1165
1165
|
/usage
|
|
1166
1166
|
/clear
|
|
1167
|
-
/help`),!0;default:return!1}}function Ce(e){if(e==null||Number.isNaN(Number(e)))return"\u2014";let t=Number(e);return t>=1e6?`${(t/1e6).toFixed(2)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(Math.round(t))}async function
|
|
1168
|
-
`)),
|
|
1169
|
-
`)),(r.tokensUsed!=null||r.windowTokens!=null)&&
|
|
1167
|
+
/help`),!0;default:return!1}}function Ce(e){if(e==null||Number.isNaN(Number(e)))return"\u2014";let t=Number(e);return t>=1e6?`${(t/1e6).toFixed(2)}M`:t>=1e3?`${(t/1e3).toFixed(1)}k`:String(Math.round(t))}async function Hp(){let e=$.peek()||"claude",t=_.peek()||"\u2014",n=c.sessionId,s=[`Agent: ${Z[e]||e}`,`Model: ${t}`,`Session: ${n?n.slice(0,8)+"\u2026":"(new \u2014 send a message first)"}`];if(c.lastUsage&&(!n||c.lastUsageSessionId===n)){let a=c.lastUsage;s.push(`Last turn: \u2191${Ce(a.input_tokens)} \u2193${Ce(a.output_tokens)}`+(a.cache_read_input_tokens?` \xB7 ${Ce(a.cache_read_input_tokens)} cached`:"")+(a.reasoning_tokens?` \xB7 ${Ce(a.reasoning_tokens)} reason`:"")+(a.total_tokens?` \xB7 \u03A3${Ce(a.total_tokens)}`:"")+(a.costUSD!=null?` \xB7 $${Number(a.costUSD).toFixed(4)}`:""))}if(!n){P(s.join(`
|
|
1168
|
+
`)),hi("\u25C8 /usage \xB7 no session yet");return}P("Loading usage\u2026");try{let a=new URLSearchParams({sessionId:n,agent:e}),r=(await x("GET",`/api/usage?${a}`)).context||{};if(r.model&&(s[1]=`Model: ${r.model}`),r.title&&s.push(`Title: ${r.title}`),r.tokensUsed!=null||r.windowTokens!=null||r.usagePercent!=null){let u=r.tokensUsed!=null?Ce(r.tokensUsed):"\u2014",l=r.windowTokens!=null?Ce(r.windowTokens):"\u2014",f=r.usagePercent!=null?`${r.usagePercent}%`:"\u2014";s.push(`Context window: ${u} / ${l} (${f})`)}if(r.turnCount!=null&&s.push(`Turns: ${r.turnCount}`),r.toolCallCount!=null&&s.push(`Tools: ${r.toolCallCount}`),r.sessionDurationSeconds!=null){let u=Math.floor(r.sessionDurationSeconds/60),l=Math.round(r.sessionDurationSeconds%60);s.push(`Duration: ${u}m ${l}s`)}if(r.sessionTotals){let u=r.sessionTotals;s.push(`Session totals: \u2191${Ce(u.input_tokens)} \u2193${Ce(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ce(u.cache_read_input_tokens)} cached`:"")+(u.total_tokens?` \xB7 \u03A3${Ce(u.total_tokens)}`:"")+(u.costUSD?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}if(r.lastTurn&&!c.lastUsage){let u=r.lastTurn;s.push(`Last completed turn: \u2191${Ce(u.input_tokens)} \u2193${Ce(u.output_tokens)}`+(u.cache_read_input_tokens?` \xB7 ${Ce(u.cache_read_input_tokens)} cached`:"")+(u.costUSD!=null?` \xB7 $${Number(u.costUSD).toFixed(4)}`:""))}r.note&&s.push(r.note);let d=i("messages");if(d){let u=[...d.children];for(let l=u.length-1;l>=0;l--)if(u[l].textContent==="Loading usage\u2026"){u[l].remove();break}}P(s.join(`
|
|
1169
|
+
`)),(r.tokensUsed!=null||r.windowTokens!=null)&&Qp({tokensUsed:r.tokensUsed,windowTokens:r.windowTokens,usagePercent:r.usagePercent,model:r.model||t,turnCount:r.turnCount,toolCallCount:r.toolCallCount}),r.sessionTotals?xo(r.sessionTotals):r.lastTurn?xo(r.lastTurn):c.lastUsage&&xo(c.lastUsage)}catch(a){let o=i("messages");if(o){let r=[...o.children];for(let d=r.length-1;d>=0;d--)if(r[d].textContent==="Loading usage\u2026"){r[d].remove();break}}P(`${s.join(`
|
|
1170
1170
|
`)}
|
|
1171
|
-
(usage fetch failed: ${a.message})`)}}function Xs(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(!tn()){P(wo()),yt().then(()=>as()).catch(()=>{});return}if(c.sessionId&&!c.lock?.held&&!c.lock?.unmanaged){yt().then(s=>{if(!s?.ok&&!s?.skipped){as(),P(wo());return}Xs()}).catch(()=>Xs());return}if(
|
|
1171
|
+
(usage fetch failed: ${a.message})`)}}function Xs(){let e=i("chat-input"),t=e?.value.trim();if(!t||!E.peek())return;if(!tn()){P(wo()),yt().then(()=>as()).catch(()=>{});return}if(c.sessionId&&!c.lock?.held&&!c.lock?.unmanaged){yt().then(s=>{if(!s?.ok&&!s?.skipped){as(),P(wo());return}Xs()}).catch(()=>Xs());return}if(N.peek()){if($.peek()==="grok"&&c.sessionId){let s="grok",a=te.peek()||Qe(s,_.peek())||"low",o=lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:_.peek(),lockToken:c.lock?.token||void 0,effort:a,...de.peek()&&{permissionMode:de.peek()},...de.peek()==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}});ed(t),e.value="",Vs(e),Qs(""),li(),P(o?"\u5DF2\u52A0\u5165 Grok \u670D\u52A1\u7AEF\u961F\u5217\uFF0C\u5237\u65B0\u9875\u9762\u4ECD\u4F1A\u663E\u793A":"\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5C06\u5728\u91CD\u8FDE\u540E\u53D1\u9001");return}Sn.push({key:Ys(),text:t}),Gc(),e.value="",Vs(e),Qs(""),li(),P(`\u5DF2\u6392\u961F\u4E0B\u4E00\u6761\uFF0C\u5F53\u524D\u56DE\u590D\u7ED3\u675F\u540E\u53D1\u9001\uFF1A${t.length>80?t.slice(0,80)+"\u2026":t}`);return}if(e.value="",Wc.delete(Ys()),Vs(e),Qs(""),li(),t.startsWith("/")&&Pp(t))return;N.value=!0,jt();let n=Date.now();if(Yc(t))rs("shell","$ Shell",t.slice(1).trim(),{ts:n}),lt({type:"command",cmd:"shell.exec",command:t.slice(1).trim(),cwd:E.peek().path})||P("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u547D\u4EE4\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001");else{os(),rs("user","You",t,{ts:n,forceStick:!0});let s=$.peek()||"claude",a=te.peek()||Qe(s,_.peek())||(s==="grok"?"low":""),o=de.peek();c.sessionId&&se(_.peek(),s,c.sessionId),lt({type:"command",cmd:"turn.start",agent:s,command:t,sessionId:c.sessionId,lockToken:c.lock?.token||void 0,options:{agent:s,cwd:E.peek().path,sessionId:c.sessionId,configDir:c.configDir,model:_.peek(),lockToken:c.lock?.token||void 0,...a&&{effort:a},...o&&{permissionMode:o},...o==="bypassPermissions"&&{allowDangerouslySkipPermissions:!0}}})||P("\u8FDE\u63A5\u672A\u5C31\u7EEA\uFF0C\u6D88\u606F\u5DF2\u5165\u961F\uFF0C\u91CD\u8FDE\u540E\u53D1\u9001")}}function Qs(e){let t=Yc(e),n=i("chat-input"),s=i("send-btn");if(!n||!s)return;n.classList.toggle("textarea-warning",t),n.style.fontFamily=t?"monospace":"",s.classList.toggle("btn-warning",t),s.classList.toggle("btn-primary",!t),s.textContent=t?"Run":"Send";let a=Z[$.peek()]||"agent",o=typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches;t?n.placeholder=o?"Shell \u547D\u4EE4\u2026":"Shell command (without !)\u2026":n.placeholder=o?`\u95EE ${a}\u2026`:`Ask ${a}\u2026 or !cmd for shell`}function Yc(e){let t=String(e||"").trimStart();return t.startsWith("!")&&!/^!\[[^\]]*\]\([^)]+\)/.test(t)}function qp(){return typeof window<"u"&&window.matchMedia("(max-width: 640px)").matches,72}function Vs(e){e.style.height="auto",e.style.height=Math.min(e.scrollHeight,qp())+"px"}var Rp=200,Op=500;function $o(e){let t=O(e);if(t==null)return"";let n=new Date(t);if(Number.isNaN(n.getTime()))return"";let s=new Date,a=n.toDateString()===s.toDateString(),o=n.toLocaleTimeString(void 0,{hour:"2-digit",minute:"2-digit",second:"2-digit",hour12:!1});return a?o:`${n.toLocaleDateString(void 0,{month:"numeric",day:"numeric"})} ${o}`}function So(e){let t=O(e);return t==null?"":new Date(t).toISOString()}function Bp(e,t,n){if(e==="system")return t;let s=$o(n),a=So(n),o=s?`<div class="msg-ts" title="${p(a)}">${p(s)}</div>`:"";return`<div class="msg-row ${e==="user"?"user":e==="shell"||e==="shell-err"?"assistant":e} px-2" data-ts="${p(a)}">${t}${o}</div>`}function Up(e,t,n){let s='<button class="msg-expand-btn text-[10px] text-primary/70 mt-1.5 block cursor-pointer hover:text-primary">\u25BC Show more</button>',a;switch(e){case"user":{let r=/!\[.*?\]\(.*?\)/.test(t)?yo(t):null,d=t.length>Rp,u=d?`<div class="msg-body">${r??p(t.trimEnd())}</div>${s}`:r??p(t.trimEnd());a=`<div class="max-w-[80%] rounded-2xl rounded-tr-sm px-3 py-2 text-sm bg-primary/15 border border-primary/20 text-base-content break-words${d?" msg-card":""}${r?" md":""}"${r?"":' style="white-space:pre-wrap"'}>${u}</div>`;break}case"assistant":{let o=t.length>Op,r=o?`<div class="msg-body">${yo(t)}</div>${s}`:yo(t);a=`<div class="msg-assistant-content max-w-[min(92%,52rem)] rounded-2xl rounded-tl-sm px-3.5 py-2.5 text-sm bg-base-200 border border-base-300/40 break-words md leading-relaxed${o?" msg-card":""}">${r}</div>`;break}case"error":a=`<div class="max-w-[88%] rounded-2xl rounded-tl-sm px-3 py-2 text-sm bg-error/10 border border-error/20 text-error break-words" style="white-space:pre-wrap">${p(t)}</div>`;break;case"shell":case"shell-err":a=`<div class="w-full max-w-[96%] rounded-lg code-surface px-3 py-2 text-sm font-mono ${e==="shell-err"?"text-error":""} break-words" style="white-space:pre-wrap">${p(t)}</div>`;break;case"system":return`<div class="text-center text-[11px] text-base-content/30 py-0.5 select-none">${p(t)}</div>`;default:a=`<div class="rounded-lg px-3 py-2 text-sm bg-base-300 break-words" style="white-space:pre-wrap">${p(t)}</div>`}return Bp(e,a,n)}function rs(e,t,n,s={}){let a=i("messages");if(!a)return;let o=O(s.ts)??(e==="system"?null:Date.now());a.insertAdjacentHTML("beforeend",Up(e,n,o)),nd(a.lastElementChild),e==="assistant"&&td(a.lastElementChild,n,s),Re(a,!!s.forceStick)}function P(e){rs("system","",e)}var Ut=[],ho=0,Rc=!1;async function Fp(e,t){let n=t||`upload-${Date.now()}`,s=await Xc(e,n),a=ct({"x-filename":n});delete a["Content-Type"],s?.type&&!a["Content-Type"]&&!a["content-type"]&&(a["Content-Type"]=s.type);let o=await fetch("/api/upload-image",{method:"POST",headers:a,body:s});if(!o.ok){let d=await o.json().catch(()=>({}));throw new Error(d.error||`Upload failed: ${o.status}`)}let r=await o.json();if(!r?.path)throw new Error("upload returned no path");return r.path}function Wp(e,t){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=6&&String.fromCharCode(...e.slice(0,6))==="GIF87a"?"image/gif":e.length>=12&&String.fromCharCode(...e.slice(8,12))==="WEBP"?"image/webp":t||"image/png"}async function Xc(e,t){if(!e||!fi({type:e.type,name:t}))return e;let n;try{n=(await e.slice(0,80).text()).trim()}catch{return e}if(!/^(?:data:image\/[a-z0-9.+-]+;base64,|iVBORw0KGgo|\/9j\/|R0lGOD|UklGR)/i.test(n))return e;let s;try{s=(await e.text()).trim()}catch{return e}let o=/^data:image\/[a-z0-9.+-]+;base64,([a-z0-9+/=\s]+)$/i.exec(s)?.[1]||s;if(!o||!/^[a-z0-9+/=\s]+$/i.test(o)||o.length%4===1)return e;try{let r=atob(o.replace(/\s/g,"")),d=Uint8Array.from(r,f=>f.charCodeAt(0)),u=Wp(d,e.type);return u===(e.type||"image/png")&&!/^(image\/png|image\/jpeg|image\/gif|image\/webp)$/.test(u)?e:d.length>=3&&(d[0]===137&&d[1]===80&&d[2]===78||d[0]===255&&d[1]===216&&d[2]===255||String.fromCharCode(...d.slice(0,6))==="GIF87a"||String.fromCharCode(...d.slice(8,12))==="WEBP")?new Blob([d],{type:u}):e}catch{return e}}function Gp(e,t){if(!e)return;let n=e.selectionStart??e.value.length,s=e.selectionEnd??e.value.length,o=(n>0&&e.value[n-1]!==`
|
|
1172
1172
|
`?`
|
|
1173
1173
|
`:"")+t+`
|
|
1174
|
-
`;e.value=e.value.slice(0,n)+o+e.value.slice(s),e.selectionStart=e.selectionEnd=n+o.length,e.dispatchEvent(new Event("input"))}function
|
|
1174
|
+
`;e.value=e.value.slice(0,n)+o+e.value.slice(s),e.selectionStart=e.selectionEnd=n+o.length,e.dispatchEvent(new Event("input"))}function fi(e){return e?e.type&&e.type.startsWith("image/")?!0:/\.(png|jpe?g|gif|webp|bmp|svg|heic|heif|avif)$/i.test(e.name||""):!1}function Kp(e,t){let n=e?.name||t.split("/").pop()||"file";if(fi(e)){ho+=1;let a=`img${ho}`;return{ref:``,label:a,kind:"image"}}ho+=1;let s=`file${ho}`;return{ref:`[${s}](${t})`,label:s,kind:"file"}}function li(){for(let e of Ut)if(e.previewUrl)try{URL.revokeObjectURL(e.previewUrl)}catch{}Ut.length=0,mi()}function mi(){let e=i("chat-attach-bar");if(e){if(!Ut.length){e.classList.add("hidden"),e.innerHTML="";return}e.classList.remove("hidden"),e.innerHTML=Ut.map((t,n)=>`
|
|
1175
1175
|
<div class="chat-thumb relative" title="${p(t.ref||t.path)}">
|
|
1176
1176
|
${t.previewUrl?`<img src="${t.previewUrl}" alt="${p(t.label||"img")}">`:`<span class="chat-thumb-path">${p(t.label||t.name||"file")}</span>`}
|
|
1177
1177
|
<span class="chat-thumb-label">${p(t.label||t.kind||"")}</span>
|
|
1178
1178
|
<button type="button" class="chat-thumb-x" data-rm-attach="${n}" aria-label="remove">\u2715</button>
|
|
1179
|
-
</div>`).join("")}}async function
|
|
1179
|
+
</div>`).join("")}}async function zp(e){if(!e)return;let t=e.name||`upload-${Date.now()}`,n=await Xc(e,t),s=await Fp(n,t),{ref:a,label:o,kind:r}=Kp(e,s),d="";if(r==="image")try{d=URL.createObjectURL(n)}catch{}return Ut.push({path:s,ref:a,label:o,kind:r,name:t,previewUrl:d}),mi(),Gp(i("chat-input"),a),s}async function Lo(e){let t=[...e||[]].filter(Boolean);if(!t.length)return;let n=i("chat-input");n&&(n.disabled=!0);try{for(let s of t)try{await zp(s)}catch(a){P(`\u4E0A\u4F20\u5931\u8D25 ${s.name||"file"}: ${a.message}`)}}finally{n&&(n.disabled=!1,n.focus())}}function Jp(){let e=i("chat-file-input");if(e){e.value="",e.click();return}let t=document.createElement("input");t.type="file",t.accept="image/*,*/*",t.multiple=!0,t.addEventListener("change",()=>Lo(t.files)),t.click()}function Zc(){document.addEventListener("paste",async e=>{let t=i("chat-input");if(!t)return;let n=i("chat-composer");if(!(n&&(n.contains(document.activeElement)||document.activeElement===t))&&document.activeElement!==t)return;let a=[...e.clipboardData?.items||[]],o=[];for(let u of a)if(u.kind==="file"){let l=u.getAsFile();l&&o.push(l)}let r=o.filter(u=>fi(u)),d=r.length?r:o;d.length&&(e.preventDefault(),await Lo(d))}),!Rc&&(Rc=!0,document.addEventListener("dragover",e=>{let t=i("chat-composer");!t||!e.dataTransfer?.types?.includes("Files")||!t.contains(e.target)&&e.target!==t||(e.preventDefault(),t.classList.add("chat-drop-active"))}),document.addEventListener("dragleave",e=>{let t=i("chat-composer");t&&(e.target===t||t.contains(e.target))&&(t.contains(e.relatedTarget)||t.classList.remove("chat-drop-active"))}),document.addEventListener("drop",async e=>{let t=i("chat-composer");if(!t||(t.classList.remove("chat-drop-active"),!t.contains(e.target)&&e.target!==t))return;let n=[...e.dataTransfer?.files||[]];n.length&&(e.preventDefault(),await Lo(n))}))}function Ct(e){return e>=1e3?`${(e/1e3).toFixed(1)}k`:String(e)}function hi(e){let t=i("messages");t&&(t.insertAdjacentHTML("beforeend",`<div class="token-bar select-none">
|
|
1180
1180
|
<span class="token-bar-mark">\u25C8</span><span class="token-bar-text">${p(e)}</span>
|
|
1181
|
-
</div>`),Re(t))}function xo(e){if(!e)return;let t=e.input_tokens??e.inputTokens??0,n=e.output_tokens??e.outputTokens??0,s=e.total_tokens??e.totalTokens??t+n,a=e.cache_read_input_tokens??e.cachedReadTokens?` \xB7 ${Ct(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${Ct(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${Ct(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,u=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",l=s?` \xB7 \u03A3${Ct(s)}`:"";
|
|
1182
|
-
${String(e||"")}`}function
|
|
1181
|
+
</div>`),Re(t))}function xo(e){if(!e)return;let t=e.input_tokens??e.inputTokens??0,n=e.output_tokens??e.outputTokens??0,s=e.total_tokens??e.totalTokens??t+n,a=e.cache_read_input_tokens??e.cachedReadTokens?` \xB7 ${Ct(e.cache_read_input_tokens??e.cachedReadTokens)} cached`:"",o=e.cache_creation_input_tokens??e.cacheCreationInputTokens?` \xB7 ${Ct(e.cache_creation_input_tokens??e.cacheCreationInputTokens)} cache-write`:"",r=e.reasoning_tokens??e.reasoningTokens?` \xB7 ${Ct(e.reasoning_tokens??e.reasoningTokens)} reason`:"",d=e.costUSD??e.cost_usd,u=d!=null?` \xB7 $${Number(d).toFixed(4)}`:"",l=s?` \xB7 \u03A3${Ct(s)}`:"";hi(`\u2191${Ct(t)} \u2193${Ct(n)}${a}${o}${r}${l}${u}`)}function Qp(e){if(!e)return;let t=e.tokensUsed??e.contextTokensUsed,n=e.windowTokens??e.contextWindowTokens,s=e.usagePercent??e.contextWindowUsage;if(t==null&&n==null&&s==null)return;let a=[];t!=null&&n!=null?a.push(`context ${Ct(t)} / ${Ct(n)}`):t!=null&&a.push(`context ${Ct(t)}`),s!=null&&a.push(`${s}%`),e.model&&a.push(e.model),e.turnCount!=null&&a.push(`${e.turnCount} turns`),e.toolCallCount!=null&&a.push(`${e.toolCallCount} tools`),hi(`\u25A3 ${a.join(" \xB7 ")}`)}function Vp(){let e=i("messages"),t=i("permission-requests");e&&(e.innerHTML="",delete e.dataset.historyPainting),t&&(t.innerHTML=""),c.shellBubble=null,ft=null,st=Ge=null,Bt=mt=null,Eo.clear(),di.clear()}function Yp(e,t=c.sessionId){return`${t||""}
|
|
1182
|
+
${String(e||"")}`}function ed(e,t=c.sessionId){let n=Yp(e,t);!e||di.has(n)||(di.add(n),rs("user","You",e,{ts:Date.now(),forceStick:!0}),i("messages")?.lastElementChild?.classList.add("queued-user-msg"))}function Xp(e){if((e.sessionId||c.sessionId)!==c.sessionId)return;let t=Array.isArray(e.items)?e.items.filter(n=>typeof n=="string"&&n.trim()):[];for(let n of t)ed(n,e.sessionId||c.sessionId);t.length&&P(`\u231B Grok queue \xB7 ${t.length} prompt${t.length===1?"":"s"} waiting`)}function td(e,t,n={}){if(!e||!t||e.querySelector(".msg-actions"))return;let s=`a${++Sp}`;Eo.set(s,{text:t,historyIndex:Number.isInteger(n.historyIndex)?n.historyIndex:null,sessionId:c.sessionId,agent:c.agent||$.peek()||"claude",machineId:c.machineId||null});let a=!["gemini","cursor"].includes(c.agent||$.peek()||"claude"),o=document.createElement("div");o.className="msg-actions",o.innerHTML=`
|
|
1183
1183
|
<button type="button" class="msg-action-btn" data-copy-message="${p(s)}" title="Copy answer">Copy</button>
|
|
1184
|
-
${a?`<button type="button" class="msg-action-btn" data-fork-message="${p(s)}" title="Start a branch from this answer">Fork</button>`:""}`;let r=e.querySelector(".msg-ts");e.insertBefore(o,r||null)}async function
|
|
1184
|
+
${a?`<button type="button" class="msg-action-btn" data-fork-message="${p(s)}" title="Start a branch from this answer">Fork</button>`:""}`;let r=e.querySelector(".msg-ts");e.insertBefore(o,r||null)}async function Zp(e){let t=Eo.get(e.dataset.copyMessage||"");if(t){try{await navigator.clipboard.writeText(t.text),e.textContent="Copied"}catch{e.textContent="Failed"}setTimeout(()=>{e.textContent="Copy"},1300)}}async function ef(e){let t=Eo.get(e.dataset.forkMessage||"");if(!(!t||!t.sessionId||t.sessionId!==c.sessionId)){e.disabled=!0,e.textContent="Forking\u2026";try{let n=await x("POST",`/api/sessions/${encodeURIComponent(t.sessionId)}/fork`,{sourceAgent:t.agent,...t.historyIndex!=null?{upTo:t.historyIndex}:{},assistantText:t.text},void 0,{machineId:t.machineId||void 0});if(!n?.success||!n.targetSessionId)throw new Error("Fork did not create a session");let s={parentSessionId:t.sessionId,parentAgent:t.agent,parentMachineId:t.machineId,forkMessageIndex:Number.isInteger(n.forkMessageIndex)?n.forkMessageIndex:t.historyIndex,forkedAt:Date.now()},a=await x("PUT","/api/sessions/meta",{sessionId:n.targetSessionId,agent:n.targetAgent||t.agent,branch:s,machineId:t.machineId||void 0},void 0,{machineId:t.machineId||void 0}),o=z(n.targetAgent||t.agent,n.targetSessionId,t.machineId);T.value={...T.peek(),[o]:{favorite:!!a?.favorite,notes:a?.notes||"",title:a?.title||"",hidden:!!a?.hidden,branch:a?.branch||s,updatedAt:a?.updatedAt||Date.now()}};let[{loadAllSessions:r},{resumeSession:d}]=await Promise.all([Promise.resolve().then(()=>(It(),to)),Promise.resolve().then(()=>(ns(),Xr))]);await r({waitFresh:!0}),await d(n.targetSessionId,E.peek()?.path||null,c.configDir||null,n.targetAgent||t.agent,t.machineId||null),P("Fork created \u2014 this branch can now continue independently.")}catch(n){e.textContent="Fork failed",P(`Fork failed: ${n.message}`),setTimeout(()=>{e.textContent="Fork"},1800)}finally{e.disabled=!1,e.textContent==="Forking\u2026"&&(e.textContent="Fork")}}}function tf(e){let t=i("messages");if(!t)return null;let n=e==="shell-err"?" text-error":"";return t.insertAdjacentHTML("beforeend",`<div class="mx-2 rounded-lg code-surface px-3 py-2 text-sm font-mono${n} whitespace-pre-wrap break-words"></div>`),Re(t),t.lastElementChild}function nf(e,t){e&&(e.textContent+=t,Re(e.closest("#messages")))}var ft=null;function sf(e){let t=typeof e.input=="object"?JSON.stringify(e.input,null,2):String(e.input||""),s=((typeof e.input=="object"?Object.values(e.input).find(a=>typeof a=="string"&&a.trim()):t)||"").replace(/\n/g," ").slice(0,_e.peek()==="full"?120:80);return{inputStr:t,preview:s}}function Oc(e,{inBatch:t=!1}={}){let{inputStr:n,preview:s}=sf(e);return`<div class="tool-card${t?" tool-batch-item":""} cursor-pointer select-none px-2 py-1">
|
|
1185
1185
|
<div class="flex items-center gap-1.5 text-xs font-mono">
|
|
1186
1186
|
<span class="text-warning">\u26A1</span>
|
|
1187
1187
|
<span class="text-warning font-semibold">${p(e.name||"tool")}</span>
|
|
@@ -1189,21 +1189,21 @@ ${String(e||"")}`}function Xc(e,t=c.sessionId){let n=Jp(e,t);!e||ci.has(n)||(ci.
|
|
|
1189
1189
|
<span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>
|
|
1190
1190
|
</div>
|
|
1191
1191
|
<div class="tool-detail">${p(n)}</div>
|
|
1192
|
-
</div>`}function
|
|
1192
|
+
</div>`}function af(e){let t=[...new Set(e.names)],n=t.slice(0,4).join(", ")+(t.length>4?"\u2026":""),s=e.el.querySelector(".tool-batch-summary");s&&(s.innerHTML=`<span class="text-warning">\u26A1</span>
|
|
1193
1193
|
<span class="font-semibold text-base-content/70">${e.count} tool${e.count===1?"":"s"}</span>
|
|
1194
1194
|
<span class="text-base-content/40 truncate flex-1">${p(n)}</span>
|
|
1195
|
-
<span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function os(){ft=null}function
|
|
1195
|
+
<span class="tool-chevron text-[10px] text-base-content/40">\u25B6</span>`)}function os(){ft=null}function of(e,t={}){let n=i("messages");if(!n)return;let s=_e.peek()||"normal",a=O(t.ts);if(s==="clean"){if(!ft||!n.contains(ft.el)){let u=$o(a),l=So(a);n.insertAdjacentHTML("beforeend",`
|
|
1196
1196
|
<div class="msg-row assistant px-2" data-ts="${p(l)}">
|
|
1197
1197
|
<div class="tool-batch w-full max-w-[96%] px-2 py-1.5">
|
|
1198
1198
|
<div class="tool-batch-summary flex items-center gap-1.5 text-xs font-mono"></div>
|
|
1199
1199
|
<div class="tool-batch-list"></div>
|
|
1200
1200
|
</div>
|
|
1201
1201
|
${u?`<div class="msg-ts" title="${p(l)}">${p(u)}</div>`:""}
|
|
1202
|
-
</div>`),ft={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}ft.names.push(e.name||"tool"),ft.count++,ft.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",
|
|
1202
|
+
</div>`),ft={el:n.lastElementChild.querySelector(".tool-batch"),names:[],count:0}}ft.names.push(e.name||"tool"),ft.count++,ft.el.querySelector(".tool-batch-list")?.insertAdjacentHTML("beforeend",Oc(e,{inBatch:!0})),af(ft),Re(n);return}ft=null;let o=$o(a),r=So(a);n.insertAdjacentHTML("beforeend",`
|
|
1203
1203
|
<div class="msg-row assistant px-2" data-ts="${p(r)}">
|
|
1204
|
-
<div class="w-full max-w-[96%]">${
|
|
1204
|
+
<div class="w-full max-w-[96%]">${Oc(e)}</div>
|
|
1205
1205
|
${o?`<div class="msg-ts" title="${p(r)}">${p(o)}</div>`:""}
|
|
1206
|
-
</div>`),Re(n)}function
|
|
1206
|
+
</div>`),Re(n)}function Bc(){let e=i("messages");e&&e.setAttribute("data-density",_e.peek()||"normal")}function rf(e){let t=e.request_id||e.requestId;if(!t||i(`perm-${t}`))return;let n=e.tool_input?JSON.stringify(e.tool_input).slice(0,200):"";i("permission-requests")?.insertAdjacentHTML("beforeend",`
|
|
1207
1207
|
<div id="perm-${t}" class="perm-banner mx-3 mb-2 rounded-lg border border-warning/25 bg-warning/8 p-3">
|
|
1208
1208
|
<div class="text-xs text-warning font-semibold mb-1">\u26A0\uFE0F Permission Required</div>
|
|
1209
1209
|
<div class="font-mono text-xs text-base-content/60 break-all mb-2">
|
|
@@ -1213,39 +1213,39 @@ ${String(e||"")}`}function Xc(e,t=c.sessionId){let n=Jp(e,t);!e||ci.has(n)||(ci.
|
|
|
1213
1213
|
<button class="btn btn-success btn-xs" data-perm-id="${t}" data-perm-allow="1">Allow</button>
|
|
1214
1214
|
<button class="btn btn-error btn-xs" data-perm-id="${t}" data-perm-allow="0">Deny</button>
|
|
1215
1215
|
</div>
|
|
1216
|
-
</div>`),Re(i("messages"))}var
|
|
1216
|
+
</div>`),Re(i("messages"))}var Uc=!1;function lf(){if(Uc||typeof marked>"u")return;let e=s=>String(s??"").replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">"),t=(s,a)=>{let o=String(a||"").trim().split(/\s+/)[0]||"",r=o||"text",d=o?`language-${p(o)}`:"";return`<div class="code-block">
|
|
1217
1217
|
<div class="code-block-header">
|
|
1218
1218
|
<span class="code-block-lang">${p(r)}</span>
|
|
1219
1219
|
<button type="button" class="code-copy" data-copy="1" title="Copy code">Copy</button>
|
|
1220
1220
|
</div>
|
|
1221
1221
|
<pre><code class="hljs ${d}">${e(s)}</code></pre>
|
|
1222
|
-
</div>`},n={code(s,a){return s&&typeof s=="object"&&s.text!=null?t(s.text,s.lang||a):t(s,a)},table(s,a){return s&&typeof s=="object"&&!Array.isArray(s)&&s.header?!1:`<div class="table-wrap"><table><thead>${s}</thead><tbody>${a}</tbody></table></div>`},html(s){return e(s)}};try{if(typeof marked.use=="function")marked.use({gfm:!0,breaks:!0,renderer:n});else if(typeof marked.setOptions=="function"){let s=new marked.Renderer;s.code=n.code,s.table=n.table,marked.setOptions({gfm:!0,breaks:!0,renderer:s})}}catch(s){console.warn("[md] marked setup failed",s)}
|
|
1222
|
+
</div>`},n={code(s,a){return s&&typeof s=="object"&&s.text!=null?t(s.text,s.lang||a):t(s,a)},table(s,a){return s&&typeof s=="object"&&!Array.isArray(s)&&s.header?!1:`<div class="table-wrap"><table><thead>${s}</thead><tbody>${a}</tbody></table></div>`},html(s){return e(s)}};try{if(typeof marked.use=="function")marked.use({gfm:!0,breaks:!0,renderer:n});else if(typeof marked.setOptions=="function"){let s=new marked.Renderer;s.code=n.code,s.table=n.table,marked.setOptions({gfm:!0,breaks:!0,renderer:s})}}catch(s){console.warn("[md] marked setup failed",s)}Uc=!0}function yo(e){if(typeof marked>"u")return p(e);try{return lf(),Ve(e,{fallback:()=>p(e)})}catch{return p(e)}}function cf(e){!e||typeof hljs>"u"||(e.querySelectorAll("pre code:not(.hljs)").forEach(t=>{try{hljs.highlightElement(t)}catch{}}),e.querySelectorAll("pre code.hljs").forEach(t=>{t.classList.add("hljs")}))}function nd(e){cf(e),xt(e),vt(e)}function sd(){Bc(),ar(),De(fe,s=>{Js(),jt();let a=i("ws-banner"),o=i("ws-banner-text");if(!a)return;if(s==="open"||s==="idle"){a.classList.add("hidden"),o&&(o.textContent="");return}if(s==="connecting"&&!bo){a.classList.add("hidden");return}a.classList.remove("hidden");let r=s==="offline"?"\u7F51\u7EDC\u5DF2\u65AD\u5F00\uFF0C\u6062\u590D\u540E\u4F1A\u81EA\u52A8\u91CD\u8FDE":s==="connecting"?"\u6B63\u5728\u8FDE\u63A5\u2026":"\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u6B63\u5728\u91CD\u8FDE\u2026\uFF08\u7184\u5C4F\u6216\u5207\u7F51\u65F6\u5E38\u89C1\uFF09";o?o.textContent=r:a.textContent=r}),De(E,()=>jt()),b.on("click","#messages a, #chat-log a, .md-body a",(s,a)=>{let o=a.getAttribute("href")||"",r=E.peek()?.path||"";Zo(o,r)&&(s.preventDefault(),s.stopPropagation())}),b.on("click","#ws-banner-retry",s=>{s.preventDefault(),Ap()}),De(N,s=>{i("send-btn")?.classList.toggle("hidden",s),i("stop-btn")?.classList.toggle("hidden",!s),as(),s||i("send-btn")?.toggleAttribute("disabled",!tn());let a=i("messages");if(!a)return;let o=i("typing-indicator");s&&!o?(a.insertAdjacentHTML("beforeend",'<div id="typing-indicator" class="flex justify-start px-2"><div class="flex items-center gap-1.5 rounded-2xl rounded-tl-sm px-3 py-2 bg-base-200 text-xs text-base-content/40"><span class="dot"></span><span class="dot"></span><span class="dot"></span></div></div>'),Re(a)):s||(o?.remove(),os()),jt()}),De(_e,()=>Bc()),document.addEventListener("session-lock-changed",()=>as()),as(),b.on("keydown","#chat-input",s=>{if(s.key!=="Enter")return;let a=s.metaKey||s.ctrlKey,o=window.matchMedia("(max-width: 640px)").matches&&!s.shiftKey&&!a;(a||o)&&(s.preventDefault(),Xs())}),b.on("submit","#chat-form",s=>{s.preventDefault(),Xs()}),b.on("input","#chat-input",(s,a)=>{Vs(a),Qs(a.value)}),b.on("click","#btn-attach",s=>{s.preventDefault(),Jp()}),b.on("change","#chat-file-input",(s,a)=>{let o=a?.files;o?.length&&Lo(o),a&&(a.value="")}),b.on("click","[data-rm-attach]",(s,a)=>{s.preventDefault(),s.stopPropagation();let o=parseInt(a.dataset.rmAttach,10);if(Number.isNaN(o)||o<0||o>=Ut.length)return;let r=Ut[o];if(r?.previewUrl)try{URL.revokeObjectURL(r.previewUrl)}catch{}let d=i("chat-input");d&&r?.ref&&(d.value=d.value.split(r.ref).join("").replace(/\n{3,}/g,`
|
|
1223
1223
|
|
|
1224
|
-
`),d.dispatchEvent(new Event("input"))),Ut.splice(o,1),
|
|
1224
|
+
`),d.dispatchEvent(new Event("input"))),Ut.splice(o,1),mi()}),b.on("click","[data-perm-id]",(s,a)=>{lt({type:"command",cmd:"approval.respond",requestId:a.dataset.permId,allow:a.dataset.permAllow==="1",sessionId:c.sessionId}),a.closest(".perm-banner")?.remove()}),b.on("click",".tool-card",(s,a)=>{let o=a.closest(".tool-batch");if(o&&!o.classList.contains("open")&&!a.classList.contains("tool-batch-item"))return;s.stopPropagation();let r=i("messages"),d=a.getBoundingClientRect().top;if(a.classList.toggle("open"),r){let u=a.getBoundingClientRect().top;r.scrollTop+=u-d}}),b.on("click",".tool-batch",(s,a)=>{if(s.target.closest(".tool-card")&&a.classList.contains("open"))return;let o=i("messages"),r=a.getBoundingClientRect().top;if(a.classList.toggle("open"),o){let d=a.getBoundingClientRect().top;o.scrollTop+=d-r}});let e=i("messages"),t=i("scroll-top-btn"),n=i("scroll-bottom-btn");if(e&&t&&n){let s=()=>{let a=e.scrollHeight-e.clientHeight>200;t.classList.toggle("hidden",!a||e.scrollTop<200),n.classList.toggle("hidden",!a||$p(e))};e.addEventListener("scroll",s,{passive:!0}),new ResizeObserver(s).observe(e),new MutationObserver(s).observe(e,{childList:!0,subtree:!0}),t.addEventListener("click",()=>e.scrollTo({top:0,behavior:"smooth"})),n.addEventListener("click",()=>{Fc(e)?.setFollowing(!0),e.scrollTo({top:e.scrollHeight,behavior:"smooth"})}),s()}b.on("click",".msg-expand-btn",(s,a)=>{s.stopPropagation();let r=a.closest(".msg-card").classList.toggle("open");a.textContent=r?"\u25B2 Show less":"\u25BC Show more"}),b.on("click","[data-copy-message]",(s,a)=>{s.preventDefault(),s.stopPropagation(),Zp(a)}),b.on("click","[data-fork-message]",(s,a)=>{s.preventDefault(),s.stopPropagation(),ef(a)}),b.on("click",".code-copy",async(s,a)=>{s.preventDefault(),s.stopPropagation();let d=a.closest(".code-block")?.querySelector("pre code")?.textContent??"";try{await navigator.clipboard.writeText(d),a.textContent="Copied",a.classList.add("copied"),setTimeout(()=>{a.textContent="Copy",a.classList.remove("copied")},1400)}catch{a.textContent="Failed",setTimeout(()=>{a.textContent="Copy"},1400)}})}G();W();le();Vo();_n();Zt();en();function df(e){let t=e.split(".").pop()?.toLowerCase();return{js:"\u{1F4C4}",ts:"\u{1F4C4}",jsx:"\u{1F4C4}",tsx:"\u{1F4C4}",py:"\u{1F40D}",md:"\u{1F4DD}",json:"\u2699\uFE0F",html:"\u{1F310}",css:"\u{1F3A8}",sh:"\u26A1",env:"\u{1F511}",docx:"\u{1F4D8}",pptx:"\u{1F4D9}",xlsx:"\u{1F4D7}",pdf:"\u{1F4D5}"}[t]||"\u{1F4C4}"}function ad(e){let t=(e||"").split("/").pop()||"",n=t.lastIndexOf(".");return n>=0?t.slice(n+1).toLowerCase():""}function od(e){let t=ad(e);return t==="docx"||t==="pptx"||t==="xlsx"||t==="pdf"?t:null}function rd(e){let t=ad(e);return t==="md"||t==="markdown"||t==="mdx"}function uf(e){return e==null?"":e>1024*1024?`${(e/(1024*1024)).toFixed(1)} MB`:e>1024?`${(e/1024).toFixed(1)} KB`:`${e} B`}function pf(e){let t=atob(e),n=new Uint8Array(t.length);for(let s=0;s<t.length;s++)n[s]=t.charCodeAt(s);return n.buffer}var gi=new Map;function Io(e){if(gi.has(e))return gi.get(e);let t=new Promise((n,s)=>{let a=document.querySelector(`script[data-src="${e}"]`);if(a){if(a.dataset.loaded==="1")return n();a.addEventListener("load",()=>n()),a.addEventListener("error",()=>s(new Error(`Failed to load ${e}`)));return}let o=document.createElement("script");o.src=e,o.async=!0,o.dataset.src=e,o.onload=()=>{o.dataset.loaded="1",n()},o.onerror=()=>s(new Error(`Failed to load ${e}`)),document.head.appendChild(o)});return gi.set(e,t),t}function ff(e){let n=((e||"").split("/").pop()||"").toLowerCase(),s={dockerfile:"dockerfile",makefile:"makefile",gemfile:"ruby",rakefile:"ruby",procfile:"yaml","cmakelists.txt":"cmake"};if(s[n])return s[n];let a=n.includes(".")?n.split(".").pop():"";return{js:"javascript",mjs:"javascript",cjs:"javascript",jsx:"javascript",ts:"typescript",tsx:"typescript",mts:"typescript",cts:"typescript",py:"python",pyw:"python",pyi:"python",rb:"ruby",go:"go",rs:"rust",java:"java",kt:"kotlin",kts:"kotlin",c:"c",h:"c",cpp:"cpp",cc:"cpp",cxx:"cpp",hpp:"cpp",hh:"cpp",cs:"csharp",swift:"swift",php:"php",scala:"scala",sh:"bash",bash:"bash",zsh:"bash",fish:"bash",ps1:"powershell",psm1:"powershell",html:"xml",htm:"xml",xhtml:"xml",xml:"xml",svg:"xml",css:"css",scss:"scss",less:"less",json:"json",jsonc:"json",json5:"json",yml:"yaml",yaml:"yaml",toml:"ini",ini:"ini",conf:"ini",env:"bash",md:"markdown",mdx:"markdown",markdown:"markdown",sql:"sql",graphql:"graphql",gql:"graphql",vue:"xml",svelte:"xml",r:"r",lua:"lua",pl:"perl",pm:"perl",dart:"dart",ex:"elixir",exs:"elixir",erl:"erlang",zig:"zig",nim:"nim",clj:"clojure",cljs:"clojure",diff:"diff",patch:"diff",dockerfile:"dockerfile"}[a]||""}function mf(e){!e||typeof hljs>"u"||e.querySelectorAll("pre code.file-preview-code").forEach(t=>{try{delete t.dataset.highlighted,hljs.highlightElement(t)}catch{}})}function is(e,t,n){let s=uf(t);return`
|
|
1225
1225
|
<div class="flex items-center gap-2 px-4 py-1.5 border-b border-base-300 flex-shrink-0 bg-base-200">
|
|
1226
1226
|
<span class="text-xs text-base-content/40 flex-1 truncate">${p(e)} \xB7 ${p(s)}${n?` \xB7 <span class="text-primary/70">${p(n)}</span>`:""}</span>
|
|
1227
1227
|
<button type="button" class="btn btn-ghost btn-xs" data-download-path="${p(e)}">\u2193 Download</button>
|
|
1228
|
-
</div>`}function
|
|
1228
|
+
</div>`}function hf(e){return!Array.isArray(e)||!e.length?'<div class="p-4 text-xs text-base-content/40">Empty directory</div>':(e.sort((t,n)=>n.isDir-t.isDir||t.name.localeCompare(n.name)),e.map(t=>`
|
|
1229
1229
|
<div class="flex items-center gap-2 px-4 py-1.5 hover:bg-base-300 group"
|
|
1230
1230
|
${t.isDir?`data-dir-path="${p(t.path)}"`:`data-file-path="${p(t.path)}"`}>
|
|
1231
|
-
<span class="cursor-pointer flex-shrink-0">${t.isDir?"\u{1F4C1}":
|
|
1231
|
+
<span class="cursor-pointer flex-shrink-0">${t.isDir?"\u{1F4C1}":df(t.name)}</span>
|
|
1232
1232
|
<span class="text-sm flex-1 truncate cursor-pointer ${t.isDir?"text-primary":""}">${p(t.name)}</span>
|
|
1233
1233
|
${t.isDir?"":`
|
|
1234
1234
|
<button type="button" class="file-row-action btn btn-ghost btn-xs px-1.5 text-base-content/50 hover:text-base-content"
|
|
1235
1235
|
data-download-path="${p(t.path)}" title="Download" aria-label="Download">\u2193</button>
|
|
1236
1236
|
<button type="button" class="file-row-action btn btn-ghost btn-xs px-1.5 text-error/60 hover:text-error"
|
|
1237
1237
|
data-delete-path="${p(t.path)}" title="Delete" aria-label="Delete">\u2715</button>`}
|
|
1238
|
-
</div>`).join(""))}function
|
|
1238
|
+
</div>`).join(""))}function gf(e,t,n){let s=/[\x00-\x08\x0e-\x1f]/.test(t.slice(0,512));if(!s&&rd(e))return vf(e,t,n);let a=ff(e),o=a?`language-${p(a)}`:"",r=s?`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${p(e)}">Download</button></div>`:`<pre class="file-preview p-4 font-mono text-xs leading-relaxed overflow-auto flex-1 m-0"><code class="hljs file-preview-code ${o}">${p(t)}</code></pre>`;return is(e,n,s?"binary":a||"text")+r}function bf(e){return Ve(e,{fallback:t=>p(t).replace(/\n/g,"<br>")})}function vf(e,t,n){return is(e,n,"Markdown")+`
|
|
1239
1239
|
<div class="file-markdown-toolbar" role="group" aria-label="Markdown view">
|
|
1240
1240
|
<button type="button" class="file-markdown-mode active" data-file-render-mode="preview">Preview</button>
|
|
1241
1241
|
<button type="button" class="file-markdown-mode" data-file-render-mode="code">Code</button>
|
|
1242
1242
|
</div>
|
|
1243
|
-
<div class="file-markdown-preview md p-4 overflow-auto flex-1">${
|
|
1244
|
-
<pre class="file-markdown-code file-preview p-4 font-mono text-xs leading-relaxed overflow-auto flex-1 m-0 hidden"><code class="file-preview-code language-markdown">${p(t)}</code></pre>`}function
|
|
1243
|
+
<div class="file-markdown-preview md p-4 overflow-auto flex-1">${bf(t)}</div>
|
|
1244
|
+
<pre class="file-markdown-code file-preview p-4 font-mono text-xs leading-relaxed overflow-auto flex-1 m-0 hidden"><code class="file-preview-code language-markdown">${p(t)}</code></pre>`}function xf(e){let t=e?.querySelector(".file-markdown-preview");t&&(typeof hljs<"u"&&t.querySelectorAll("pre code:not(.hljs)").forEach(n=>{try{hljs.highlightElement(n)}catch{}}),xt(t),vt(t))}async function yf(e){if(await Io("/vendor/mammoth.browser.min.js"),typeof mammoth>"u")throw new Error("mammoth failed to load");let t=await mammoth.convertToHtml({arrayBuffer:e});return`<div class="office-preview office-docx overflow-auto flex-1 p-4 md">${t.messages?.length?`<div class="office-warn text-xs text-warning/80 px-3 py-1">${t.messages.length} conversion note(s)</div>`:""}<div class="office-docx-body">${t.value||'<p class="text-base-content/40">Empty document</p>'}</div></div>`}async function wf(e){if(await Io("/vendor/xlsx.full.min.js"),typeof XLSX>"u")throw new Error("SheetJS failed to load");let t=XLSX.read(new Uint8Array(e),{type:"array"}),n=t.SheetNames||[];if(!n.length)return'<div class="p-4 text-xs text-base-content/40">Empty workbook</div>';let s=n.map((o,r)=>`<button type="button" class="office-sheet-tab${r===0?" active":""}" data-sheet-idx="${r}">${p(o)}</button>`).join(""),a=n.map((o,r)=>{let d=t.Sheets[o],u;try{u=XLSX.utils.sheet_to_html(d,{id:`xlsx-sheet-${r}`,editable:!1})}catch{u='<p class="text-base-content/40 text-xs p-2">Unable to render this sheet</p>'}return`<div class="office-sheet-pane${r===0?"":" hidden"}" data-sheet-pane="${r}">${u}</div>`}).join("");return`
|
|
1245
1245
|
<div class="office-preview office-xlsx flex flex-col flex-1 min-h-0 overflow-hidden">
|
|
1246
1246
|
<div class="office-sheet-tabs flex gap-1 px-2 py-1.5 border-b border-base-300 overflow-x-auto flex-shrink-0 bg-base-200">${s}</div>
|
|
1247
1247
|
<div class="office-sheet-body flex-1 overflow-auto p-2">${a}</div>
|
|
1248
|
-
</div>`}function
|
|
1248
|
+
</div>`}function kf(e){let t=[],n=/<a:p[\s>][\s\S]*?<\/a:p>/g,s=/<a:t(?:\s[^>]*)?>([\s\S]*?)<\/a:t>/g,a,o=e.match(n)||[e];for(let r of o){let d=[];for(s.lastIndex=0;(a=s.exec(r))!==null;){let u=a[1].replace(/</g,"<").replace(/>/g,">").replace(/&/g,"&").replace(/"/g,'"').replace(/'/g,"'");u&&d.push(u)}d.length&&t.push(d.join(""))}return t}async function $f(e){if(await Io("/vendor/jszip.min.js"),typeof JSZip>"u")throw new Error("JSZip failed to load");let t=await JSZip.loadAsync(e),n=Object.keys(t.files).filter(a=>/^ppt\/slides\/slide\d+\.xml$/i.test(a)).sort((a,o)=>{let r=parseInt(a.match(/slide(\d+)/i)?.[1]||"0",10),d=parseInt(o.match(/slide(\d+)/i)?.[1]||"0",10);return r-d});if(!n.length)return'<div class="p-4 text-xs text-base-content/40">No slides found in this presentation</div>';let s=[];for(let a=0;a<n.length;a++){let o=await t.files[n[a]].async("string"),r=kf(o),d=r.length?r.map(u=>`<p>${p(u)}</p>`).join(""):'<p class="text-base-content/40 italic">\uFF08\u6B64\u9875\u65E0\u53EF\u63D0\u53D6\u6587\u672C / \u53EF\u80FD\u4EE5\u56FE\u7247\u4E3A\u4E3B\uFF09</p>';s.push(`
|
|
1249
1249
|
<article class="office-slide-card">
|
|
1250
1250
|
<header class="office-slide-num">Slide ${a+1}</header>
|
|
1251
1251
|
<div class="office-slide-body">${d}</div>
|
|
@@ -1253,7 +1253,7 @@ ${String(e||"")}`}function Xc(e,t=c.sessionId){let n=Jp(e,t);!e||ci.has(n)||(ci.
|
|
|
1253
1253
|
<div class="office-preview office-pptx overflow-auto flex-1 p-3 space-y-3">
|
|
1254
1254
|
<p class="text-xs text-base-content/50 px-1">\u6587\u672C\u9884\u89C8\uFF08\u7248\u5F0F/\u56FE\u7247\u4E0D\u8FD8\u539F\uFF09\xB7 ${n.length} slide(s)</p>
|
|
1255
1255
|
${s.join("")}
|
|
1256
|
-
</div>`}async function
|
|
1256
|
+
</div>`}async function Sf(){if(await Io("/vendor/pdf.min.js"),typeof pdfjsLib>"u")throw new Error("pdf.js failed to load");return pdfjsLib.GlobalWorkerOptions.workerSrc="/vendor/pdf.worker.min.js",pdfjsLib}async function Lf(e){let n=await(await Sf()).getDocument({data:e}).promise,s=n.numPages,a=Math.min(s,40),o=[];for(let d=1;d<=a;d++){let u=await n.getPage(d),l=u.getViewport({scale:1}),f=Math.min(1.5,820/l.width),m=u.getViewport({scale:f}),g=document.createElement("canvas");g.width=Math.floor(m.width),g.height=Math.floor(m.height),g.className="office-pdf-page",g.dataset.page=String(d),await u.render({canvasContext:g.getContext("2d"),viewport:m}).promise,o.push(`
|
|
1257
1257
|
<figure class="office-pdf-figure">
|
|
1258
1258
|
<figcaption class="office-pdf-cap">Page ${d} / ${s}</figcaption>
|
|
1259
1259
|
${g.outerHTML}
|
|
@@ -1262,12 +1262,12 @@ ${String(e||"")}`}function Xc(e,t=c.sessionId){let n=Jp(e,t);!e||ci.has(n)||(ci.
|
|
|
1262
1262
|
<p class="text-xs text-base-content/50 px-1">PDF preview \xB7 ${s} page(s)</p>
|
|
1263
1263
|
${r}
|
|
1264
1264
|
${o.join("")}
|
|
1265
|
-
</div>`}async function
|
|
1266
|
-
${
|
|
1265
|
+
</div>`}async function Ef(e,t,n){let s=od(e),a={docx:"Word",pptx:"PowerPoint",xlsx:"Excel",pdf:"PDF"},o=pf(t),r;if(s==="docx")r=await yf(o);else if(s==="xlsx")r=await wf(o);else if(s==="pptx")r=await $f(o);else if(s==="pdf")r=await Lf(o);else throw new Error("Unsupported office type");return is(e,n,a[s]||s)+r}function If(e,t){let n=e?e.split("/"):[],s=t?n.slice(0,-1):n,a='<span class="cursor-pointer text-primary hover:underline" data-dir-path="">root</span>',o="";for(let r of s)o=o?`${o}/${r}`:r,a+=` <span class="text-base-content/40">/</span> <span class="cursor-pointer text-primary hover:underline" data-dir-path="${p(o)}">${p(r)}</span>`;return t&&(a+=` <span class="text-base-content/40">/</span> <span>${p(n.at(-1))}</span>`),a}function Tf(){let e=E.peek(),t=re.peek()||e?.path;if(!t)return;let n=document.createElement("input");n.type="file",n.multiple=!0,n.addEventListener("change",async()=>{let s=Y.peek(),a="_",o=[...n.files],r=!1;for(let d of o){let u=s?`${s}/${d.name}`:d.name,l=`/api/projects/${a}/file?root=${encodeURIComponent(t)}&path=${encodeURIComponent(u)}`;try{let f=await fetch(l,{method:"POST",headers:ct(),body:d,duplex:"half"});if(!f.ok){let m=await f.json().catch(()=>({}));throw new Error(m.error||`HTTP ${f.status}`)}}catch(f){alert(`Upload failed (${d.name}): ${f.message}`),r=!0;break}}if(!r){let d=Y.peek();Y.value=d+"\0",Y.value=d}}),n.click()}async function Cf(e,t){let n=re.peek()||e?.path||"";if(!n){alert("No path selected \u2014 set root first");return}let s="_",a=(t||"").split("/").pop()||"download",o=new URLSearchParams({root:n,path:t,download:"true"}),r=`/api/projects/${s}/file?${o}`;try{let d=await fetch(r,{headers:ct(),credentials:"same-origin"});if(!d.ok){let m=await d.json().catch(()=>({}));throw new Error(m.error||`HTTP ${d.status}`)}let u=await d.blob(),l=URL.createObjectURL(u),f=document.createElement("a");f.href=l,f.download=a,f.rel="noopener",f.style.display="none",document.body.appendChild(f),f.click(),f.remove(),setTimeout(()=>URL.revokeObjectURL(l),6e4)}catch(d){try{let u=`/api/projects/${s}/file?${Jo({root:n,path:t,download:"true"})}`,l=document.createElement("a");l.href=u,l.download=a,l.rel="noopener",l.target="_blank",document.body.appendChild(l),l.click(),l.remove()}catch{alert(`Download failed: ${d.message}`)}}}async function Mf(e,t){if(!confirm(`Delete "${t.split("/").pop()}"?`))return;let n=re.peek()||e?.path||"",s="_";try{await x("DELETE",`/api/projects/${s}/file?root=${encodeURIComponent(n)}&path=${encodeURIComponent(t)}`),Y.value=Y.peek()+" ",Y.value=Y.peek().trimEnd()}catch(a){alert(`Delete failed: ${a.message}`)}}async function Af(e,t,n,s){let a=n.size??(typeof n.content=="string"?n.content.length:0),o=od(t);if(o&&n.encoding==="base64"){e.innerHTML=is(t,a,o)+`<div class="p-4 text-xs text-base-content/40">Parsing ${o.toUpperCase()}\u2026</div>`;try{let r=await Ef(t,n.content,a);if(s.aborted)return;e.innerHTML=r}catch(r){if(s.aborted)return;e.innerHTML=is(t,a,o)+`<div class="p-4 text-xs text-error">Preview failed: ${p(r.message)} \u2014 <button class="text-primary hover:underline" data-download-path="${p(t)}">Download</button></div>`}return}if(n.encoding==="base64"){e.innerHTML=is(t,a,"binary")+`<div class="p-4 text-xs text-base-content/40">Binary file \u2014 <button class="text-primary hover:underline" data-download-path="${p(t)}">Download</button></div>`;return}e.innerHTML=gf(t,n.content||"",a),mf(e),rd(t)&&xf(e)}function id(){je(()=>{let e=i("files-breadcrumb");if(!e)return;let t=oe.value!==null;e.innerHTML=`
|
|
1266
|
+
${If(oe.value??Y.value,t)}
|
|
1267
1267
|
<div class="flex-1"></div>
|
|
1268
|
-
${t?"":'<button id="btn-upload" class="btn btn-ghost btn-xs text-base-content/50 hover:text-base-content">\u2191 Upload</button>'}`}),Tn(async e=>{let t=
|
|
1268
|
+
${t?"":'<button id="btn-upload" class="btn btn-ghost btn-xs text-base-content/50 hover:text-base-content">\u2191 Upload</button>'}`}),Tn(async e=>{let t=X.value,n=E.value,s=(re.value||n?.path||"").trim(),a=oe.value,o=Y.value,r=i("files-area");if(!r||t!=="files")return;if(!s){r.innerHTML='<div class="p-4 text-xs text-base-content/40">No path yet \u2014 open a session (uses that machine's cwd) or type an absolute path and press Go.</div>';return}let d="_";r.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{if(a!==null){let f=await x("GET",`/api/projects/${d}/file?root=${encodeURIComponent(s)}&path=${encodeURIComponent(a)}`,void 0,e);e.aborted||await Af(r,a,f,e);return}let u=await x("GET",`/api/projects/${d}/files?root=${encodeURIComponent(s)}&path=${encodeURIComponent(o)}`,void 0,e);if(e.aborted)return;let l=Array.isArray(u)?u:Array.isArray(u?.files)?u.files:null;if(!l){r.innerHTML=`<div class="p-4 text-xs text-error">${p(u?.error||"Invalid directory listing")}</div>`;return}r.innerHTML=hf(l)}catch(u){!e.aborted&&u?.name!=="AbortError"&&(r.innerHTML=`<div class="p-4 text-xs text-error">${p(u.message)}</div>`)}}),b.on("click","[data-dir-path]",(e,t)=>{oe.value=null,Y.value=t.dataset.dirPath}),b.on("click","[data-file-path]",(e,t)=>{oe.value=t.dataset.filePath}),b.on("click","#btn-upload",()=>Tf()),b.on("click","[data-download-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.downloadPath;n&&Cf(E.peek(),n)}),b.on("click","[data-delete-path]",(e,t)=>{e.preventDefault(),e.stopPropagation();let n=t.dataset.deletePath;n&&Mf(E.peek(),n)}),b.on("click","[data-file-render-mode]",(e,t)=>{let n=t.closest("#files-area");if(!n)return;let s=t.dataset.fileRenderMode==="code";n.querySelector(".file-markdown-preview")?.classList.toggle("hidden",s),n.querySelector(".file-markdown-code")?.classList.toggle("hidden",!s),n.querySelectorAll("[data-file-render-mode]").forEach(a=>{a.classList.toggle("active",a===t)})}),b.on("click",".office-sheet-tab",(e,t)=>{let n=t.closest(".office-xlsx");if(!n)return;let s=t.dataset.sheetIdx;n.querySelectorAll(".office-sheet-tab").forEach(a=>a.classList.toggle("active",a===t)),n.querySelectorAll(".office-sheet-pane").forEach(a=>{a.classList.toggle("hidden",a.dataset.sheetPane!==s)})})}G();W();le();var ld=I(!1);function jf(e){return e?e.split(`
|
|
1269
1269
|
`).map(t=>p(t).replace(/\b([0-9a-f]{7})\b/,'<span class="gh">$1</span>').replace(/\(([^)]*)\)/,'<span style="color:oklch(var(--wa))">($1)</span>')).join(`
|
|
1270
|
-
`):'<span class="text-base-content/40">No commits</span>'}function
|
|
1270
|
+
`):'<span class="text-base-content/40">No commits</span>'}function Df(e){if(!e)return"";if(!e.isGit)return'<div class="p-4 text-sm text-base-content/50">Not a git repository</div>';let t={M:"text-warning",D:"text-error"};return`
|
|
1271
1271
|
<div class="px-4 py-2 text-xs text-base-content/50 border-b border-base-300">
|
|
1272
1272
|
Branch: <span class="text-success font-semibold">${p(e.branch)}</span>
|
|
1273
1273
|
</div>
|
|
@@ -1293,16 +1293,16 @@ ${String(e||"")}`}function Xc(e,t=c.sessionId){let n=Jp(e,t);!e||ci.has(n)||(ci.
|
|
|
1293
1293
|
<span class="text-base-content/40">Loading\u2026</span>
|
|
1294
1294
|
</div>
|
|
1295
1295
|
</div>
|
|
1296
|
-
</div>`}function
|
|
1296
|
+
</div>`}function _f(e){return e.split(`
|
|
1297
1297
|
`).map(t=>t.startsWith("+")&&!t.startsWith("+++")?`<span class="diff-add">${p(t)}</span>`:t.startsWith("-")&&!t.startsWith("---")?`<span class="diff-del">${p(t)}</span>`:t.startsWith("@@")?`<span class="diff-hunk">${p(t)}</span>`:/^(diff |index |---|[+]{3})/.test(t)?`<span class="diff-head">${p(t)}</span>`:`<span>${p(t)}</span>`).join(`
|
|
1298
|
-
`)}function
|
|
1299
|
-
`),jo())}),Me.addEventListener("message",d=>{if(t!==Zs)return;let u;try{u=JSON.parse(d.data)}catch{return}u.type==="output"?
|
|
1298
|
+
`)}function cd(){Tn(async e=>{let t=X.value,n=E.value,s=Se.value||n?.path,a=i("git-area");if(!a||t!=="git")return;if(!s){a.innerHTML='<div class="p-4 text-sm text-base-content/50">Enter a project root above, or open a session with a working directory.</div>';return}let o="_";a.innerHTML='<div class="p-4 text-xs text-base-content/40">Loading\u2026</div>';try{let r=await x("GET",`/api/projects/${o}/git/status?root=${encodeURIComponent(s)}`,void 0,e);e.aborted||(a.innerHTML=Df(r))}catch(r){!e.aborted&&r?.name!=="AbortError"&&(a.innerHTML=`<div class="p-4 text-xs text-error">${p(r?.message??String(r))}</div>`)}}),Tn(async e=>{let t=E.value,n=Se.value||t?.path,s=ld.value,a=i("diff-content");if(!a||!n)return;let o=t?.id||"_";try{let r=await x("GET",`/api/projects/${o}/git/diff?root=${encodeURIComponent(n)}${s?"&staged=true":""}`,void 0,e);e.aborted||(a.innerHTML=r?.diff?_f(r.diff):'<span class="text-base-content/40">No changes</span>')}catch(r){!e.aborted&&r?.name!=="AbortError"&&(a.innerHTML=`<span class="text-error">${p(r?.message??String(r))}</span>`)}}),b.on("click","#diff-unstaged, #diff-staged",(e,t)=>{let n=t.id==="diff-staged";ld.value=n,i("diff-unstaged").className=`cursor-pointer ${n?"text-base-content/50":"text-primary"}`,i("diff-staged").className=`cursor-pointer ${n?"text-primary":"text-base-content/50"}`}),b.on("click","#git-graph-toggle",()=>{let e=i("git-graph-panel"),t=i("git-graph-chevron"),n=e.classList.toggle("hidden");t.textContent=n?"\u25B6":"\u25BC",n||Nf()})}function Nf(){let e=E.peek(),t=Se.peek()||e?.path,n=i("git-graph-content");if(!t||!n)return;let s="_";n.innerHTML='<span class="text-base-content/40">Loading\u2026</span>',x("GET",`/api/projects/${s}/git/log?root=${encodeURIComponent(t)}`).then(a=>{n.innerHTML=a.graph?jf(a.graph):'<span class="text-base-content/40">No commits</span>'}).catch(a=>{n.innerHTML=`<span class="text-error">${p(a.message)}</span>`})}As();G();W();var Me=null,K=null,Co=null,ta=!1,Mo=null,fd=null,Zs=0,ea=null,bi=!1,dd=!1,ud={"ctrl-c":"",escape:"\x1B",tab:" ",up:"\x1B[A",down:"\x1B[B",left:"\x1B[D",right:"\x1B[C"};function vi(e){Me&&Me.readyState===WebSocket.OPEN&&Me.send(JSON.stringify({type:"input",data:e}))}function Pf(){return window.matchMedia("(max-width: 640px), (hover: none) and (pointer: coarse)").matches}function Ao(){if(Pf()){document.getElementById("term-mobile-input")?.focus({preventScroll:!0});return}K?.focus();let e=document.querySelector("#terminal-container .xterm-helper-textarea");e&&(e.focus({preventScroll:!0}),requestAnimationFrame(()=>e.focus({preventScroll:!0})))}function md(){if(K)return;let e=i("terminal-container");if(!e)return;if(typeof Terminal>"u"){setTimeout(md,100);return}K=new Terminal({cursorBlink:!0,fontFamily:"Fira Code, Courier New, monospace",fontSize:12,theme:{background:"#0d1117",foreground:"#c9d1d9",cursor:"#58a6ff",black:"#0d1117",red:"#ff7b72",green:"#3fb950",yellow:"#d29922",blue:"#58a6ff",magenta:"#bc8cff",cyan:"#39c5cf",white:"#b1bac4",brightBlack:"#484f58",brightRed:"#ffa198",brightGreen:"#56d364",brightYellow:"#e3b341",brightBlue:"#79c0ff",brightMagenta:"#d8b9ff",brightCyan:"#56d4dd",brightWhite:"#ffffff"}}),typeof FitAddon<"u"&&(Co=new FitAddon.FitAddon,K.loadAddon(Co)),K.open(e),To(),K.onData(n=>{vi(n)}),e.addEventListener("pointerdown",()=>Ao(),{passive:!0}),e.addEventListener("touchend",()=>Ao(),{passive:!0}),window.addEventListener("resize",()=>{To(),jo()});let t=window.visualViewport;if(t){let n=0,s=()=>{n&&cancelAnimationFrame(n),n=requestAnimationFrame(()=>{n=0,X.peek()==="shell"&&(To(),jo())})};t.addEventListener("resize",s),t.addEventListener("scroll",s)}}function To(){try{Co&&K&&Co.fit()}catch{}}function jo(){Me&&Me.readyState===WebSocket.OPEN&&K&&Me.send(JSON.stringify({type:"resize",cols:K.cols,rows:K.rows}))}function hd(){return c.machineId||D.peek()||null}function Do(e){ea&&(clearTimeout(ea),ea=null),bi=!0;let t=++Zs;if(Me){try{Me.close()}catch{}Me=null}ta=!1;let n=location.protocol==="https:"?"wss":"ws",s=K?K.cols:80,a=K?K.rows:24,o=new URLSearchParams;c.token&&o.set("token",c.token),e&&o.set("cwd",e),o.set("cols",String(s)),o.set("rows",String(a));let r=hd();M.peek()&&r&&o.set("machine",r),Mo=e||null,fd=r,Me=new WebSocket(`${n}://${location.host}/ws/shell?${o}`),Me.addEventListener("open",()=>{t===Zs&&(ta=!0,K?.write(`\x1B[32mConnected to interactive terminal\x1B[0m\r
|
|
1299
|
+
`),jo())}),Me.addEventListener("message",d=>{if(t!==Zs)return;let u;try{u=JSON.parse(d.data)}catch{return}u.type==="output"?K?.write(u.data):u.type==="exit"?K?.write(`\r
|
|
1300
1300
|
\x1B[33m[process exited: ${u.code}]\x1B[0m\r
|
|
1301
|
-
`):u.type==="error"&&
|
|
1301
|
+
`):u.type==="error"&&K?.write(`\r
|
|
1302
1302
|
\x1B[31m[error: ${u.data||u.message||""}]\x1B[0m\r
|
|
1303
|
-
`)}),Me.addEventListener("close",()=>{t===Zs&&(ta=!1,
|
|
1303
|
+
`)}),Me.addEventListener("close",()=>{t===Zs&&(ta=!1,K?.write(`\r
|
|
1304
1304
|
\x1B[33m[disconnected]\x1B[0m\r
|
|
1305
|
-
`),!(!
|
|
1306
|
-
`),ea=setTimeout(()=>{ea=null,Do(Mo)},1500)))}),Me.addEventListener("error",()=>{t===Zs&&
|
|
1305
|
+
`),!(!bi||X.peek()!=="shell")&&(K?.write(`\x1B[33m[reconnecting\u2026]\x1B[0m\r
|
|
1306
|
+
`),ea=setTimeout(()=>{ea=null,Do(Mo)},1500)))}),Me.addEventListener("error",()=>{t===Zs&&K?.write(`\r
|
|
1307
1307
|
\x1B[31m[WebSocket error]\x1B[0m\r
|
|
1308
|
-
`)})}function
|
|
1308
|
+
`)})}function pd(){let e=E.peek()?.path,t=i("term-cwd");t&&(t.textContent=e||"~"),K||md(),requestAnimationFrame(()=>{requestAnimationFrame(()=>{To();let n=hd();!ta||Mo!==(e||null)||fd!==n?(K?.clear(),Do(e)):jo()})})}function gd(){dd||(dd=!0,document.getElementById("term-keyboard")?.addEventListener("click",Ao),document.getElementById("term-mobile-composer")?.addEventListener("submit",e=>{e.preventDefault();let t=document.getElementById("term-mobile-input");t&&(vi(`${t.value}\r`),t.value="",t.focus({preventScroll:!0}))}),document.getElementById("term-mobile-keys")?.addEventListener("pointerdown",e=>{e.target.closest("[data-term-key]")&&e.preventDefault()}),document.getElementById("term-mobile-keys")?.addEventListener("click",e=>{let t=e.target.closest("[data-term-key]")?.dataset.termKey;!t||!ud[t]||(vi(ud[t]),Ao())})),document.addEventListener("visibilitychange",()=>{document.visibilityState==="visible"&&(X.peek()!=="shell"||!bi||ta||Do(Mo))}),De(X,e=>{e==="shell"&&pd()}),document.addEventListener("shell-tab-shown",()=>{X.peek()==="shell"&&pd()}),document.getElementById("term-reconnect")?.addEventListener("click",()=>{K?.clear(),Do(E.peek()?.path)})}Ps();Na();var bd=null;function vd(){return window.matchMedia("(display-mode: standalone)").matches||window.navigator.standalone===!0||document.referrer.includes("android-app://")}function Hf(e){let t=String(e||"").replace(/^\[|\]$/g,"");return!!(/^\d{1,3}(\.\d{1,3}){3}$/.test(t)||t.includes(":")&&/^[0-9a-f:]+$/i.test(t))}function qf(){if(!("serviceWorker"in navigator)||!window.isSecureContext)return!1;let e=location.hostname;return e==="localhost"||e==="127.0.0.1"||e==="::1"?!0:Hf(e)?!1:location.protocol==="https:"}function xd(){document.getElementById("btn-pwa-install")?.classList.remove("hidden")}function yd(){vd()&&document.documentElement.classList.add("pwa-standalone"),window.addEventListener("beforeinstallprompt",n=>{n.preventDefault(),bd=n,document.dispatchEvent(new CustomEvent("pwa-installable")),xd()}),window.addEventListener("appinstalled",()=>{bd=null,document.getElementById("btn-pwa-install")?.classList.add("hidden")});let e=/iPad|iPhone|iPod/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>1;if(!vd()&&(e||/Android/i.test(navigator.userAgent))&&requestAnimationFrame(()=>xd()),!qf()){"serviceWorker"in navigator&&navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{});return}let t=()=>{navigator.serviceWorker.register("/sw.js?v=33",{scope:"/"}).then(n=>{n.addEventListener("updatefound",()=>{let s=n.installing;s&&s.addEventListener("statechange",()=>{s.state==="installed"&&navigator.serviceWorker.controller&&console.info("[pwa] New version ready \u2014 reload to apply")})})}).catch(()=>{navigator.serviceWorker.getRegistrations().then(n=>n.forEach(s=>s.unregister())).catch(()=>{})})};document.readyState==="complete"?setTimeout(t,0):window.addEventListener("load",()=>setTimeout(t,0))}Dn();function xi(){let e=document.documentElement;e.classList.add("boot-ready"),e.classList.remove("boot-pending")}function _o(){document.documentElement.classList.remove("boot-restore")}var yi=wr(location.hash.slice(1)||"/"),wd=ii()||!!(c.token&&yi?.id);Nc({restoreSession:wd});Ri();sd();id();cd();Al();Cr();gd();Zc();Xl();wl(nt,Tt);(async()=>{let e=Pi();if(c.token)try{let t=document.getElementById("auth-screen"),n=document.getElementById("app");if(t&&(t.style.display="none",t.classList.add("hidden")),n&&(n.style.display="flex",n.classList.remove("hidden")),wd){document.documentElement.classList.add("boot-restore");let a=document.getElementById("welcome"),o=document.getElementById("project-view");a&&(a.classList.add("hidden"),a.style.display="none"),o&&(o.classList.remove("hidden"),o.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden")}let s=await e;await fo({hub:s,deepLink:yi}),yi?.id||(kl(),(location.hash||"").startsWith("#/session/")||_o()),requestAnimationFrame(()=>{requestAnimationFrame(xi)})}catch(t){console.error("[boot]",t),c.token=null,localStorage.removeItem("token"),_o(),await ri(),xi()}else{_o();try{await ri()}catch(t){console.error("[boot auth]",t)}finally{xi()}}})();document.addEventListener("router:home",()=>{_o()});yd();
|